Ezmary commited on
Commit
e581f47
·
verified ·
1 Parent(s): 770d04a

Update src/App.scss

Browse files
Files changed (1) hide show
  1. src/App.scss +175 -109
src/App.scss CHANGED
@@ -3,13 +3,13 @@
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,7 +26,7 @@
26
  @layer base {
27
  * {
28
  border-color: var(--border);
29
- outline-color: var(--foreground);
30
  box-sizing: border-box;
31
  }
32
  body {
@@ -37,24 +37,82 @@
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
- // 4. Styles for components
 
 
 
 
 
 
 
 
 
 
49
 
50
- /* Notification Popover */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  .notification-popover-wrapper {
52
  position: fixed;
53
  top: 1rem;
54
  left: 50%;
55
  transform: translateX(-50%);
56
  z-index: 100;
57
- width: calc(100% - 1rem);
58
  max-width: 28rem;
59
  display: flex;
60
  justify-content: center;
@@ -70,10 +128,13 @@
70
  color: var(--popover-foreground);
71
  box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
72
  outline: none;
73
- transition: opacity 0.3s ease-out, transform 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55);
 
74
  opacity: 0;
75
  transform: translateY(-100%) scale(0.9);
76
  pointer-events: none;
 
 
77
 
78
  &.open {
79
  opacity: 1;
@@ -81,12 +142,16 @@
81
  pointer-events: auto;
82
  }
83
  }
 
 
 
 
 
 
84
 
85
  .notification-popover-text-content {
86
- background-color: #eff6ff;
87
- font-size: 0.875rem;
88
- line-height: 1.5rem;
89
- direction: rtl;
90
  padding: 1rem;
91
  border-radius: var(--radius-md, 0.5rem);
92
  color: oklch(0.145 0 0);
@@ -99,81 +164,79 @@
99
  /* Header controls */
100
  .header-controls {
101
  display: flex;
102
- padding: 0.75rem 0.5rem; // 12px top/bottom, 8px left/right
 
103
  justify-content: space-between;
104
  align-items: center;
105
  width: 100%;
106
- position: absolute;
107
  top: 0;
108
  left: 0;
109
  z-index: 10;
110
  }
111
 
112
  .header-button {
113
- display: flex;
114
- align-items: center;
115
- justify-content: center;
116
- padding: 0.5rem; // 8px padding around the SVG icon
117
- width: 40px; // Explicit width for consistent size
118
- height: 40px; // Explicit height for consistent size
119
- border-radius: var(--radius-lg, 0.625rem); // 10px, or var(--radius) for consistency
120
- background-color: #e5e7eb; // Tailwind gray-200
121
  cursor: pointer;
122
- transition: background-color 0.2s, transform 0.1s ease-out; // For hover and active states
123
 
124
  svg {
125
- opacity: 0.7;
126
- stroke: #374151; // Tailwind gray-700
127
- width: 24px; // Ensure SVGs inside are of consistent visual weight
128
- height: 24px;
129
- }
130
-
131
- &:hover {
132
- background-color: #d1d5db; // Tailwind gray-300
133
- }
134
-
135
- &:active {
136
- background-color: #9ca3af; // Tailwind gray-400 (or a bit darker like gray-500: #6b7280)
137
- transform: scale(0.95); // Click feedback: button scales down
138
  }
 
 
139
  }
140
-
141
  .dark .header-button {
142
  background-color: oklch(0.28 0 0);
143
- &:hover {
144
- background-color: oklch(0.35 0 0);
145
- }
146
- &:active {
147
- background-color: oklch(0.40 0 0); // Darker shade for active state in dark mode
148
- transform: scale(0.95);
149
- }
150
- svg {
151
- opacity: 0.8;
152
- stroke: oklch(0.85 0 0);
153
- }
154
  }
155
 
156
-
157
  /* Footer and Control Buttons */
158
  .footer-controls {
159
  width: 100%;
160
  display: flex;
161
- gap: 0.5rem; // 8px gap
162
- position: absolute;
163
  bottom: 0;
164
- padding: 0.75rem 0.5rem; // 12px top/bottom, 8px left/right
165
- align-items: center;
 
166
 
 
167
  &.layout-default {
168
  justify-content: space-between;
 
169
  }
 
 
170
  &.layout-with-small-logo {
171
- justify-content: space-around;
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  }
173
  }
174
 
175
  .control-button {
176
- height: 70px;
177
  width: 70px;
178
  border-radius: 9999px;
179
  padding: 0;
@@ -185,7 +248,13 @@
185
  box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);
186
  cursor: pointer;
187
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
188
- flex-shrink: 0;
 
 
 
 
 
 
189
 
190
  &:hover {
191
  transform: scale(1.05);
@@ -193,24 +262,30 @@
193
  }
194
  }
195
 
196
- .cam-button-color { background-color: #E0ECFF; }
197
- .mic-button-color { background-color: #fecdd3; }
 
 
 
 
 
 
198
 
199
  .dark .cam-button-color { background-color: #223355; }
200
  .dark .mic-button-color { background-color: #5C2129; }
201
 
202
- /* Switch Camera Button */
 
203
  .switch-camera-button-container {
204
  position: absolute;
205
- bottom: calc(100% + 0.5rem);
206
- left: 50%;
207
- z-index: 5;
208
  opacity: 0;
209
  transform: translateY(15px) scale(0.7) translateX(-50%);
210
  pointer-events: none;
211
  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);
212
  transform-origin: center bottom;
213
-
214
  &.visible {
215
  opacity: 1;
216
  transform: translateY(0) scale(1) translateX(-50%);
@@ -219,69 +294,60 @@
219
  }
220
 
221
  .switch-camera-button-content {
222
- width: 44px;
223
- height: 44px;
224
  background-color: var(--background);
225
  border: 1px solid var(--border);
226
  border-radius: 9999px;
227
- display: flex;
228
- align-items: center;
229
- justify-content: center;
230
  box-shadow: 0 5px 10px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.08);
231
  cursor: pointer;
232
  transform-origin: center;
233
  transition: transform 0.2s ease-out, box-shadow 0.2s ease-out;
 
 
234
 
235
- &:hover {
236
- transform: scale(1.12) rotate(-6deg);
237
- box-shadow: 0 7px 15px rgba(0,0,0,0.18), 0 3px 6px rgba(0,0,0,0.12);
238
- }
239
- &:active {
240
- transform: scale(1.03) rotate(0deg);
241
- }
242
-
243
- svg {
244
- width: 20px;
245
- height: 20px;
246
  stroke: var(--foreground);
247
  transition: transform 0.3s ease-in-out;
248
  }
249
- &:hover svg {
250
- transform: rotate(360deg);
251
- }
252
  }
253
 
254
- /* Keyframes for popover */
255
- @keyframes popover-drop-in {
256
- 0% {
257
- opacity: 0;
258
- transform: translateY(-100%) scale(0.9);
259
- }
260
- 70% {
261
- opacity: 1;
262
- transform: translateY(5px) scale(1.02); /* Slight overshoot */
263
- }
264
- 100% {
265
- opacity: 1;
266
- transform: translateY(0) scale(1);
267
- }
 
 
268
  }
 
269
 
270
- @keyframes popover-lift-out {
271
- 0% {
272
- opacity: 1;
273
- transform: translateY(0) scale(1);
274
- }
275
- 100% {
276
- opacity: 0;
277
- transform: translateY(-100%) scale(0.9);
 
278
  }
279
  }
280
 
281
- /* Classes that use these keyframes */
282
- .animate-popover-open-top-center {
283
- animation: popover-drop-in 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55) forwards;
284
- }
285
- .animate-popover-close-top-center {
286
- animation: popover-lift-out 0.3s ease-in forwards;
287
  }
 
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
  @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
  -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
  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
  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);
 
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
  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
  }
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%);
 
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
  }