Spaces:
Running
Running
Update src/App.scss
Browse files- 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 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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% -
|
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 |
-
|
|
|
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:
|
|
|
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 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
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;
|
123 |
|
124 |
svg {
|
125 |
-
opacity: 0.7;
|
126 |
-
|
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 |
-
|
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 |
-
|
162 |
-
position: absolute;
|
163 |
bottom: 0;
|
164 |
-
padding:
|
165 |
-
|
|
|
166 |
|
|
|
167 |
&.layout-default {
|
168 |
justify-content: space-between;
|
|
|
169 |
}
|
|
|
|
|
170 |
&.layout-with-small-logo {
|
171 |
-
justify-content: space-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
197 |
-
.
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
|
199 |
.dark .cam-button-color { background-color: #223355; }
|
200 |
.dark .mic-button-color { background-color: #5C2129; }
|
201 |
|
202 |
-
|
|
|
203 |
.switch-camera-button-container {
|
204 |
position: absolute;
|
205 |
-
bottom: calc(100% + 0.
|
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:
|
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 |
-
|
236 |
-
|
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 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
|
|
|
|
268 |
}
|
|
|
269 |
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
|
|
278 |
}
|
279 |
}
|
280 |
|
281 |
-
|
282 |
-
.
|
283 |
-
|
284 |
-
|
285 |
-
.
|
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 |
}
|