Ezmary commited on
Commit
d495ba5
·
verified ·
1 Parent(s): 96cc076

Update src/App.scss

Browse files
Files changed (1) hide show
  1. src/App.scss +146 -172
src/App.scss CHANGED
@@ -3,13 +3,13 @@
3
  @import 'tailwindcss/components';
4
  @import 'tailwindcss/utilities';
5
 
6
- // 2. Define CSS Variables (same as your provided HTML)
7
  :root {
8
  --radius: 0.625rem; /* 10px */
9
  --radius-md: 0.5rem; /* 8px */
10
  --background: oklch(1 0 0);
11
  --foreground: oklch(0.145 0 0);
12
- --popover: oklch(1 0 0); /* For notification popover */
13
  --popover-foreground: oklch(0.145 0 0);
14
  --border: oklch(0.922 0 0);
15
  }
@@ -26,7 +26,7 @@
26
  @layer base {
27
  * {
28
  border-color: var(--border);
29
- outline-color: var(--foreground); // Or your ring color
30
  box-sizing: border-box;
31
  }
32
  body {
@@ -37,82 +37,35 @@
37
  -moz-osx-font-smoothing: grayscale;
38
  margin: 0;
39
  padding: 0;
40
- min-height: 100vh; /* Ensure body takes full viewport height */
41
- display: flex; /* For centering content if app-container doesn't fill height */
42
- flex-direction: column; /* For centering content */
43
  }
44
  html {
45
  margin: 0;
46
  padding: 0;
47
  overflow-x: hidden;
48
- height: 100%;
49
  }
50
  }
51
 
52
- // App container and wrapper for overall structure
53
- .app-container {
54
- width: 100%;
55
- flex-grow: 1; /* Allows it to grow and fill space if body is flex */
56
- display: flex;
57
- flex-direction: column;
58
- align-items: center;
59
- justify-content: center;
60
- // min-height: 100vh; // Or set on body
61
- text-rendering: optimizeLegibility; // antialiased equivalent
62
- }
63
-
64
- .app-content-wrapper {
65
- max-width: 42rem; // max-w-3xl equivalent, adjust as needed
66
- width: 100%;
67
- height: 100%; // Or specific height like 90dvh if desired
68
  display: flex;
69
  flex-direction: column;
70
- align-items: center;
71
- justify-content: space-between; // Pushes footer to bottom
72
- position: relative; // For absolute positioning of children like header/footer
73
  }
74
-
75
- // Media Area (Video Feed and Large Logo)
76
  .media-area {
77
- width: 100%;
78
- flex-grow: 1; // Takes up available space between header and footer
79
- position: relative; // For absolute positioning of video and large-logo
80
- display: flex; // For centering large-logo
81
- align-items: center; // For centering large-logo
82
- justify-content: center; // For centering large-logo
83
- background-color: var(--background); // Ensure it has a background
84
- }
85
-
86
- .video-feed {
87
- position: absolute;
88
- top: 0;
89
- left: 0;
90
- width: 100%;
91
- height: 100%;
92
- object-fit: cover;
93
- transform: scaleX(-1); // Mirrors the video
94
- &.hidden {
95
- display: none;
96
- }
97
  }
98
 
99
- .large-logo-container {
100
- // This is shown when mic is active and cam is not.
101
- // Positioned by flex on .media-area
102
- // createLogoFunction(false, ...) will be rendered here.
103
- // No specific positioning needed here if .media-area handles centering.
104
- z-index: 1; // Above video if it ever overlaps (though usually one is hidden)
105
- }
106
 
 
107
 
108
- // Notification Popover (Styles from your HTML, slightly adjusted for React context)
109
  .notification-popover-wrapper {
110
  position: fixed;
111
  top: 1rem;
112
  left: 50%;
113
  transform: translateX(-50%);
114
  z-index: 100;
115
- width: calc(100% - 2rem); // Your HTML uses 2rem
116
  max-width: 28rem;
117
  display: flex;
118
  justify-content: center;
@@ -128,13 +81,10 @@
128
  color: var(--popover-foreground);
129
  box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
130
  outline: none;
131
- // Animation classes will be applied by React
132
- // Initial state for animation:
133
  opacity: 0;
134
  transform: translateY(-100%) scale(0.9);
135
  pointer-events: none;
136
- transition: opacity 0.3s ease-out, transform 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55);
137
-
138
 
139
  &.open {
140
  opacity: 1;
@@ -142,16 +92,12 @@
142
  pointer-events: auto;
143
  }
144
  }
145
- // Keyframes from your HTML for popover (already provided in previous correct answer)
146
- @keyframes popover-drop-in { /* ... */ }
147
- @keyframes popover-lift-out { /* ... */ }
148
- .animate-popover-open-top-center { animation: popover-drop-in 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55) forwards; }
149
- .animate-popover-close-top-center { animation: popover-lift-out 0.3s ease-in forwards; }
150
-
151
 
152
  .notification-popover-text-content {
153
- background-color: #eff6ff; /* bg-blue-50 */
154
- font-size: 0.875rem; line-height: 1.5rem; direction: rtl;
 
 
155
  padding: 1rem;
156
  border-radius: var(--radius-md, 0.5rem);
157
  color: oklch(0.145 0 0);
@@ -161,82 +107,110 @@
161
  color: oklch(0.95 0.01 230);
162
  }
163
 
164
- /* Header controls */
 
165
  .header-controls {
166
  display: flex;
167
- // padding: 1rem; // Your HTML
168
- padding: 0.75rem 0.5rem; // Reduced for mobile
169
  justify-content: space-between;
170
  align-items: center;
171
  width: 100%;
172
- position: absolute; // Kept from your previous working version
173
  top: 0;
174
  left: 0;
175
  z-index: 10;
176
  }
177
 
178
  .header-button {
179
- display: flex; align-items: center; justify-content: center;
 
 
180
  padding: 0.5rem;
181
  width: 40px;
182
  height: 40px;
183
- border-radius: var(--radius-lg, 0.625rem); // Your HTML var(--radius)
184
- background-color: #e5e7eb; /* bg-gray-200 */
185
  cursor: pointer;
186
  transition: background-color 0.2s, transform 0.1s ease-out;
187
 
188
  svg {
189
- opacity: 0.7; stroke: #374151 /* gray-700 */;
190
- width: 24px; height: 24px;
 
 
 
 
 
 
 
 
 
 
 
191
  }
192
- &:hover { background-color: #d1d5db; /* bg-gray-300 */ }
193
- &:active { background-color: #9ca3af; transform: scale(0.95); }
194
  }
 
195
  .dark .header-button {
196
  background-color: oklch(0.28 0 0);
197
- &:hover { background-color: oklch(0.35 0 0); }
198
- &:active { background-color: oklch(0.40 0 0); transform: scale(0.95); }
199
- svg { opacity: 0.8; stroke: oklch(0.85 0 0); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  }
201
 
202
- /* Footer and Control Buttons */
 
203
  .footer-controls {
204
  width: 100%;
205
  display: flex;
206
- align-items: center; // Vertically align items if they have different heights
207
- position: absolute; // Kept from previous working version
 
208
  bottom: 0;
209
- // padding: 2rem 3rem; // Your HTML padding
210
- padding: 0.75rem 0.5rem; // Reduced for mobile
211
- z-index: 20; // Ensure above media area content
212
-
213
- // Default layout: Cam (Left) --- Mic (Right)
214
- &.layout-default {
215
- justify-content: space-between;
216
- .small-logo-container { display: none; } // Ensure small logo is hidden
217
- }
218
 
219
- // Layout with small logo: Cam (Left) -- Logo (Center) -- Mic (Right)
220
- &.layout-with-small-logo {
221
- justify-content: space-between; // Still space-between for main buttons
222
- // The small-logo-container will be positioned absolutely or handled by flex order
223
- .small-logo-container {
224
- // Position the small logo in the center of the footer-controls
225
- // This requires the parent (.footer-controls) to be a positioning context if absolute
226
- // Or, manage with flex order and margins if using flexbox for all three items.
227
- // For simplicity with space-between on main buttons, absolute positioning is easier for the logo.
228
- position: absolute;
229
- left: 50%;
230
- transform: translateX(-50%);
231
- display: flex; // From your HTML
232
- align-items: center; // From your HTML
233
- justify-content: center; // From your HTML
234
- }
235
- }
 
236
  }
237
 
 
238
  .control-button {
239
- height: 70px; // Was 80px in your HTML, 70px from previous correction
240
  width: 70px;
241
  border-radius: 9999px;
242
  padding: 0;
@@ -248,13 +222,8 @@
248
  box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);
249
  cursor: pointer;
250
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
251
- flex-shrink: 0; // Prevent shrinking
252
- position: relative; // For switch camera button positioning
253
-
254
- svg { // Ensure SVGs inside scale if needed, but your user SVGs have fixed sizes
255
- max-width: 100%;
256
- max-height: 100%;
257
- }
258
 
259
  &:hover {
260
  transform: scale(1.05);
@@ -262,92 +231,97 @@
262
  }
263
  }
264
 
265
- // Cam button is on the LEFT in your HTML example
266
- .cam-button-wrapper { // Wrapper for cam button and switch button
267
- position: relative; // For switch camera button positioning
268
- display: flex; // To keep button and switch container together if needed
269
- justify-content: center; // Center if wrapper takes full space of its flex item
270
- }
271
- .cam-button-color { background-color: #E0ECFF; } // Blueish for Cam (HTML: Left)
272
- .mic-button-color { background-color: #fecdd3; } // Reddish for Mic (HTML: Right)
273
 
274
  .dark .cam-button-color { background-color: #223355; }
275
  .dark .mic-button-color { background-color: #5C2129; }
276
 
277
 
278
- /* Switch Camera Button Styles (from your HTML) */
279
  .switch-camera-button-container {
280
  position: absolute;
281
- bottom: calc(100% + 0.65rem);
282
- left: 50%; // Center relative to its parent (.cam-button-wrapper or .control-button)
283
- z-index: 5; // Above its parent button
 
284
  opacity: 0;
285
- transform: translateY(15px) scale(0.7) translateX(-50%);
286
  pointer-events: none;
287
  transition: opacity 0.35s cubic-bezier(0.68, -0.55, 0.27, 1.55), transform 0.35s cubic-bezier(0.68, -0.55, 0.27, 1.55);
288
  transform-origin: center bottom;
 
289
  &.visible {
290
  opacity: 1;
291
- transform: translateY(0) scale(1) translateX(-50%);
292
  pointer-events: auto;
293
  }
294
  }
295
 
296
  .switch-camera-button-content {
297
- width: 48px; height: 48px; // Your HTML
 
298
  background-color: var(--background);
299
  border: 1px solid var(--border);
300
  border-radius: 9999px;
301
- display: flex; align-items: center; justify-content: center;
 
 
302
  box-shadow: 0 5px 10px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.08);
303
  cursor: pointer;
304
  transform-origin: center;
305
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
306
- &:hover { transform: scale(1.12) rotate(-6deg); box-shadow: 0 7px 15px rgba(0,0,0,0.18), 0 3px 6px rgba(0,0,0,0.12); }
307
- &:active { transform: scale(1.03) rotate(0deg); }
308
 
309
- .switch-camera-svg { // Class added to SVG in ControlTray.tsx
310
- width: 22px; height: 22px; // Your HTML SVG size
 
 
 
 
 
 
 
 
 
311
  stroke: var(--foreground);
312
  transition: transform 0.3s ease-in-out;
313
  }
314
- &:hover .switch-camera-svg { transform: rotate(360deg); }
 
 
315
  }
316
 
317
-
318
- // Logo Animation Styles (from your HTML, adapted)
319
- .logo-animation-wrapper {
320
- position: relative; // Already applied inline in createLogoFunction
321
- display: flex;
322
- align-items: center;
323
- justify-content: center;
324
- }
325
- .logo-ping, .logo-outer, .logo-mid, .logo-inner {
326
- position: absolute;
327
- border-radius: 9999px; // fully rounded
328
- opacity: 0.5; // As per your HTML example's CSS (Tailwind opacity-50)
329
- }
330
- .logo-ping {
331
- // Tailwind animate-ping equivalent keyframes needed
332
- animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; // From your HTML
333
  }
334
- @keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } }
335
 
336
- .logo-icon-container {
337
- position: absolute;
338
- z-index: 10; // Ensure icon is on top of animation layers
339
- display: flex;
340
- align-items: center;
341
- justify-content: center;
342
- // Inset is applied inline via style in createLogoFunction
343
- svg { // Styles for the human icon SVG if needed, e.g., size
344
- // width and height are set on the SVG element itself
345
  }
346
  }
347
 
348
- // Small logo container in the footer
349
- .small-logo-container {
350
- // When cam is active, this will hold the small animated logo.
351
- // Positioning is handled by .footer-controls.layout-with-small-logo
352
- // createLogoFunction(true, ...) will be rendered here.
353
  }
 
3
  @import 'tailwindcss/components';
4
  @import 'tailwindcss/utilities';
5
 
6
+ // 2. Define CSS Variables
7
  :root {
8
  --radius: 0.625rem; /* 10px */
9
  --radius-md: 0.5rem; /* 8px */
10
  --background: oklch(1 0 0);
11
  --foreground: oklch(0.145 0 0);
12
+ --popover: oklch(1 0 0);
13
  --popover-foreground: oklch(0.145 0 0);
14
  --border: oklch(0.922 0 0);
15
  }
 
26
  @layer base {
27
  * {
28
  border-color: var(--border);
29
+ outline-color: var(--foreground);
30
  box-sizing: border-box;
31
  }
32
  body {
 
37
  -moz-osx-font-smoothing: grayscale;
38
  margin: 0;
39
  padding: 0;
 
 
 
40
  }
41
  html {
42
  margin: 0;
43
  padding: 0;
44
  overflow-x: hidden;
 
45
  }
46
  }
47
 
48
+ // Wrapper for the main content, to ensure footer doesn't overlap if content is short
49
+ .main-wrapper {
50
+ min-height: 100vh; // Or 100dvh for dynamic viewport height
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  display: flex;
52
  flex-direction: column;
 
 
 
53
  }
 
 
54
  .media-area {
55
+ flex-grow: 1; // Allows this area to take up available space
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
 
 
 
 
 
 
 
 
58
 
59
+ // 4. Styles for components
60
 
61
+ /* Notification Popover ... (بدون تغییر از نسخه قبل) ... */
62
  .notification-popover-wrapper {
63
  position: fixed;
64
  top: 1rem;
65
  left: 50%;
66
  transform: translateX(-50%);
67
  z-index: 100;
68
+ width: calc(100% - 1rem);
69
  max-width: 28rem;
70
  display: flex;
71
  justify-content: center;
 
81
  color: var(--popover-foreground);
82
  box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
83
  outline: none;
84
+ transition: opacity 0.3s ease-out, transform 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55);
 
85
  opacity: 0;
86
  transform: translateY(-100%) scale(0.9);
87
  pointer-events: none;
 
 
88
 
89
  &.open {
90
  opacity: 1;
 
92
  pointer-events: auto;
93
  }
94
  }
 
 
 
 
 
 
95
 
96
  .notification-popover-text-content {
97
+ background-color: #eff6ff;
98
+ font-size: 0.875rem;
99
+ line-height: 1.5rem;
100
+ direction: rtl;
101
  padding: 1rem;
102
  border-radius: var(--radius-md, 0.5rem);
103
  color: oklch(0.145 0 0);
 
107
  color: oklch(0.95 0.01 230);
108
  }
109
 
110
+
111
+ /* Header controls ... (بدون تغییر از نسخه قبل) ... */
112
  .header-controls {
113
  display: flex;
114
+ padding: 0.75rem 0.5rem;
 
115
  justify-content: space-between;
116
  align-items: center;
117
  width: 100%;
118
+ position: absolute;
119
  top: 0;
120
  left: 0;
121
  z-index: 10;
122
  }
123
 
124
  .header-button {
125
+ display: flex;
126
+ align-items: center;
127
+ justify-content: center;
128
  padding: 0.5rem;
129
  width: 40px;
130
  height: 40px;
131
+ border-radius: var(--radius-lg, 0.625rem);
132
+ background-color: #e5e7eb;
133
  cursor: pointer;
134
  transition: background-color 0.2s, transform 0.1s ease-out;
135
 
136
  svg {
137
+ opacity: 0.7;
138
+ stroke: #374151;
139
+ width: 24px;
140
+ height: 24px;
141
+ }
142
+
143
+ &:hover {
144
+ background-color: #d1d5db;
145
+ }
146
+
147
+ &:active {
148
+ background-color: #9ca3af;
149
+ transform: scale(0.95);
150
  }
 
 
151
  }
152
+
153
  .dark .header-button {
154
  background-color: oklch(0.28 0 0);
155
+ &:hover {
156
+ background-color: oklch(0.35 0 0);
157
+ }
158
+ &:active {
159
+ background-color: oklch(0.40 0 0);
160
+ transform: scale(0.95);
161
+ }
162
+ svg {
163
+ opacity: 0.8;
164
+ stroke: oklch(0.85 0 0);
165
+ }
166
+ }
167
+
168
+ /* Logo Animation Styling */
169
+ .logo-animation-wrapper {
170
+ position: relative; // Important for inner absolute positioning
171
+ display: flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ // &.for-footer will be handled by its container
175
  }
176
 
177
+
178
+ /* Footer and Control Buttons - REVISED FOR FIXED POSITIONS */
179
  .footer-controls {
180
  width: 100%;
181
  display: flex;
182
+ justify-content: space-between; /* Cam left, Mic right */
183
+ align-items: center; /* Vertically align items if they have different heights */
184
+ position: absolute;
185
  bottom: 0;
186
+ left: 0; // Ensure it spans full width for absolute positioning of children
187
+ padding: 0.75rem 0.5rem; // 12px top/bottom, 8px left/right - Keep this minimal
188
+ z-index: 20; // Above video/logo but below modals
189
+ }
 
 
 
 
 
190
 
191
+ // Wrapper for individual control buttons to manage their specific positioning if needed
192
+ .control-button-wrapper {
193
+ position: relative; /* For switch camera button positioning */
194
+ display: flex;
195
+ justify-content: center;
196
+ align-items: center;
197
+ }
198
+
199
+ /* Small logo specifically for the footer, positioned in the middle */
200
+ .small-logo-footer {
201
+ position: absolute;
202
+ left: 50%;
203
+ top: 50%; // Relative to footer's padding
204
+ transform: translate(-50%, -50%);
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ z-index: 1; // Below buttons if overlap is an issue, but should be fine
209
  }
210
 
211
+
212
  .control-button {
213
+ height: 70px;
214
  width: 70px;
215
  border-radius: 9999px;
216
  padding: 0;
 
222
  box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);
223
  cursor: pointer;
224
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
225
+ flex-shrink: 0;
226
+ z-index: 2; // Ensure buttons are clickable above the small logo if it ever overlaps
 
 
 
 
 
227
 
228
  &:hover {
229
  transform: scale(1.05);
 
231
  }
232
  }
233
 
234
+ // Cam button is on the left as per HTML example
235
+ .cam-button-color { background-color: #E0ECFF; } // Blueish
236
+ // Mic button is on the right
237
+ .mic-button-color { background-color: #fecdd3; } // Reddish
 
 
 
 
238
 
239
  .dark .cam-button-color { background-color: #223355; }
240
  .dark .mic-button-color { background-color: #5C2129; }
241
 
242
 
243
+ /* Switch Camera Button - positioned relative to cam-button-wrapper */
244
  .switch-camera-button-container {
245
  position: absolute;
246
+ bottom: calc(100% + 0.5rem); // Above the cam button
247
+ left: 50%; // Centered horizontally relative to its wrapper
248
+ transform: translateX(-50%) translateY(15px) scale(0.7); // Initial state for animation
249
+ z-index: 5; // Above the cam button
250
  opacity: 0;
 
251
  pointer-events: none;
252
  transition: opacity 0.35s cubic-bezier(0.68, -0.55, 0.27, 1.55), transform 0.35s cubic-bezier(0.68, -0.55, 0.27, 1.55);
253
  transform-origin: center bottom;
254
+
255
  &.visible {
256
  opacity: 1;
257
+ transform: translateX(-50%) translateY(0) scale(1); // Final state
258
  pointer-events: auto;
259
  }
260
  }
261
 
262
  .switch-camera-button-content {
263
+ width: 44px;
264
+ height: 44px;
265
  background-color: var(--background);
266
  border: 1px solid var(--border);
267
  border-radius: 9999px;
268
+ display: flex;
269
+ align-items: center;
270
+ justify-content: center;
271
  box-shadow: 0 5px 10px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.08);
272
  cursor: pointer;
273
  transform-origin: center;
274
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
 
 
275
 
276
+ &:hover {
277
+ transform: scale(1.12) rotate(-6deg);
278
+ box-shadow: 0 7px 15px rgba(0,0,0,0.18), 0 3px 6px rgba(0,0,0,0.12);
279
+ }
280
+ &:active {
281
+ transform: scale(1.03) rotate(0deg);
282
+ }
283
+
284
+ svg {
285
+ width: 20px;
286
+ height: 20px;
287
  stroke: var(--foreground);
288
  transition: transform 0.3s ease-in-out;
289
  }
290
+ &:hover svg {
291
+ transform: rotate(360deg);
292
+ }
293
  }
294
 
295
+ /* Keyframes for popover ... (بدون تغییر از نسخه قبل) ... */
296
+ @keyframes popover-drop-in {
297
+ 0% {
298
+ opacity: 0;
299
+ transform: translateY(-100%) scale(0.9);
300
+ }
301
+ 70% {
302
+ opacity: 1;
303
+ transform: translateY(5px) scale(1.02);
304
+ }
305
+ 100% {
306
+ opacity: 1;
307
+ transform: translateY(0) scale(1);
308
+ }
 
 
309
  }
 
310
 
311
+ @keyframes popover-lift-out {
312
+ 0% {
313
+ opacity: 1;
314
+ transform: translateY(0) scale(1);
315
+ }
316
+ 100% {
317
+ opacity: 0;
318
+ transform: translateY(-100%) scale(0.9);
 
319
  }
320
  }
321
 
322
+ .animate-popover-open-top-center {
323
+ animation: popover-drop-in 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55) forwards;
324
+ }
325
+ .animate-popover-close-top-center {
326
+ animation: popover-lift-out 0.3s ease-in forwards;
327
  }