profileShare

rasmusjy / splitapp-frontend-vue

Read-only snapshot

No repository description.

main default branch 96 files Expires Sep 13, 2026, 9:06 AM
splitapp-design.css 36,702 bytes
1 /* ============================================================
2 SplitApp Design System
3 A premium travel app design layer on top of Bootstrap 5
4 Ported from MVC backend for Vue frontend
5 ============================================================ */
6
7 /* ---------- CSS Custom Properties ---------- */
8 :root {
9 /* Primary: Coral-to-Rose */
10 --sa-primary: #e8604c;
11 --sa-primary-light: #ff7e6b;
12 --sa-primary-dark: #c94535;
13 --sa-primary-gradient: linear-gradient(135deg, #e8604c 0%, #d4456a 100%);
14
15 /* Secondary: Ocean Teal */
16 --sa-secondary: #1a9e8f;
17 --sa-secondary-light: #2ec4b6;
18 --sa-secondary-dark: #147a6e;
19 --sa-secondary-gradient: linear-gradient(135deg, #1a9e8f 0%, #2176ae 100%);
20
21 /* Accent: Golden Amber */
22 --sa-accent: #f4a623;
23 --sa-accent-light: #ffc857;
24 --sa-accent-dark: #d48e15;
25
26 /* Neutrals: Warm Grays */
27 --sa-gray-50: #faf9f7;
28 --sa-gray-100: #f3f1ed;
29 --sa-gray-200: #e8e5df;
30 --sa-gray-300: #d4d0c8;
31 --sa-gray-400: #a8a29e;
32 --sa-gray-500: #78716c;
33 --sa-gray-600: #57534e;
34 --sa-gray-700: #44403c;
35 --sa-gray-800: #292524;
36 --sa-gray-900: #1c1917;
37
38 /* Semantic */
39 --sa-success: #22c55e;
40 --sa-success-light: #dcfce7;
41 --sa-warning: #f59e0b;
42 --sa-warning-light: #fef3c7;
43 --sa-danger: #ef4444;
44 --sa-danger-light: #fee2e2;
45 --sa-info: #3b82f6;
46 --sa-info-light: #dbeafe;
47
48 /* Spacing (4px base) */
49 --sa-space-1: 4px;
50 --sa-space-2: 8px;
51 --sa-space-3: 12px;
52 --sa-space-4: 16px;
53 --sa-space-5: 20px;
54 --sa-space-6: 24px;
55 --sa-space-8: 32px;
56 --sa-space-10: 40px;
57 --sa-space-12: 48px;
58 --sa-space-16: 64px;
59
60 /* Border Radius */
61 --sa-radius-sm: 6px;
62 --sa-radius-md: 12px;
63 --sa-radius-lg: 16px;
64 --sa-radius-xl: 24px;
65 --sa-radius-full: 9999px;
66
67 /* Shadows (warm-tinted with coral accent) */
68 --sa-shadow-sm: 0 1px 3px rgba(28, 25, 23, 0.06), 0 1px 2px rgba(28, 25, 23, 0.04);
69 --sa-shadow-md: 0 4px 12px rgba(28, 25, 23, 0.08), 0 2px 4px rgba(28, 25, 23, 0.04);
70 --sa-shadow-lg: 0 12px 32px rgba(28, 25, 23, 0.1), 0 4px 8px rgba(28, 25, 23, 0.06);
71 --sa-shadow-xl: 0 20px 48px rgba(28, 25, 23, 0.14), 0 8px 16px rgba(28, 25, 23, 0.06);
72 --sa-shadow-glass: 0 8px 32px rgba(232, 96, 76, 0.08), 0 2px 8px rgba(28, 25, 23, 0.06);
73
74 /* Transitions */
75 --sa-transition-fast: 150ms ease;
76 --sa-transition-normal: 250ms ease;
77 --sa-transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
78
79 /* Typography */
80 --sa-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
81 --sa-font-mono: 'JetBrains Mono', 'Fira Code', monospace;
82 }
83
84 /* ---------- Base Overrides ---------- */
85 html {
86 scroll-behavior: smooth;
87 }
88
89 body {
90 font-family: var(--sa-font-sans);
91 background: var(--sa-gray-50);
92 background-image: radial-gradient(at 20% 0%, rgba(232, 96, 76, 0.04) 0%, transparent 60%),
93 radial-gradient(at 80% 100%, rgba(26, 158, 143, 0.04) 0%, transparent 60%);
94 color: var(--sa-gray-800);
95 font-size: 15px;
96 -webkit-font-smoothing: antialiased;
97 -moz-osx-font-smoothing: grayscale;
98 margin-bottom: 0;
99 min-height: 100vh;
100 }
101
102 h1, h2, h3, h4, h5, h6 {
103 color: var(--sa-gray-900);
104 letter-spacing: -0.02em;
105 }
106
107 h1 { font-size: 1.875rem; font-weight: 800; }
108 h2 { font-size: 1.5rem; font-weight: 700; }
109 h3 { font-size: 1.25rem; font-weight: 600; }
110
111 a {
112 color: var(--sa-secondary);
113 text-decoration: none;
114 transition: color var(--sa-transition-fast);
115 }
116
117 a:hover {
118 color: var(--sa-secondary-dark);
119 }
120
121 /* Focus rings */
122 :focus-visible {
123 outline: 2px solid var(--sa-secondary);
124 outline-offset: 2px;
125 box-shadow: none;
126 }
127
128 .btn:focus-visible, .form-control:focus-visible, .form-select:focus-visible, .form-check-input:focus-visible {
129 box-shadow: 0 0 0 3px rgba(26, 158, 143, 0.25);
130 border-color: var(--sa-secondary);
131 }
132
133 /* ---------- Form Enhancements ---------- */
134 .form-control, .form-select {
135 border-radius: var(--sa-radius-sm);
136 border: 1.5px solid var(--sa-gray-200);
137 padding: 10px 14px;
138 font-size: 0.938rem;
139 transition: border-color var(--sa-transition-fast), box-shadow var(--sa-transition-fast);
140 background-color: #fff;
141 }
142
143 .form-control:focus, .form-select:focus {
144 border-color: var(--sa-secondary);
145 box-shadow: 0 0 0 3px rgba(26, 158, 143, 0.15);
146 }
147
148 .form-label {
149 font-weight: 600;
150 font-size: 0.85rem;
151 color: var(--sa-gray-600);
152 text-transform: uppercase;
153 letter-spacing: 0.04em;
154 margin-bottom: 6px;
155 }
156
157 .form-check-input:checked {
158 background-color: var(--sa-secondary);
159 border-color: var(--sa-secondary);
160 }
161
162 /* ---------- sa-card ---------- */
163 .sa-card {
164 background: rgba(255, 255, 255, 0.72);
165 backdrop-filter: blur(16px);
166 -webkit-backdrop-filter: blur(16px);
167 border-radius: var(--sa-radius-lg);
168 box-shadow: var(--sa-shadow-glass);
169 border: 1px solid rgba(255, 255, 255, 0.3);
170 overflow: hidden;
171 transition: transform var(--sa-transition-normal), box-shadow var(--sa-transition-normal);
172 }
173
174 .sa-card:hover {
175 transform: translateY(-2px);
176 box-shadow: var(--sa-shadow-lg);
177 }
178
179 .sa-card-static {
180 background: rgba(255, 255, 255, 0.72);
181 backdrop-filter: blur(16px);
182 -webkit-backdrop-filter: blur(16px);
183 border-radius: var(--sa-radius-lg);
184 box-shadow: var(--sa-shadow-glass);
185 border: 1px solid rgba(255, 255, 255, 0.3);
186 overflow: hidden;
187 }
188
189 .sa-card-body {
190 padding: var(--sa-space-6);
191 }
192
193 .sa-card-header {
194 padding: var(--sa-space-5) var(--sa-space-6);
195 border-bottom: 1px solid var(--sa-gray-100);
196 font-weight: 600;
197 }
198
199 .sa-card-footer {
200 padding: var(--sa-space-4) var(--sa-space-6);
201 border-top: 1px solid var(--sa-gray-100);
202 background: var(--sa-gray-50);
203 }
204
205 .sa-card-accent {
206 border-top: 3px solid;
207 }
208
209 .sa-card-accent-primary { border-top-color: var(--sa-primary); }
210 .sa-card-accent-secondary { border-top-color: var(--sa-secondary); }
211 .sa-card-accent-accent { border-top-color: var(--sa-accent); }
212 .sa-card-accent-danger { border-top-color: var(--sa-danger); }
213
214 /* Colored gradient strip on top */
215 .sa-card-gradient-strip {
216 height: 4px;
217 background: var(--sa-primary-gradient);
218 }
219
220 .sa-card-gradient-strip-teal {
221 background: var(--sa-secondary-gradient);
222 }
223
224 .sa-card-gradient-strip-amber {
225 background: linear-gradient(135deg, var(--sa-accent) 0%, var(--sa-primary) 100%);
226 }
227
228 /* ---------- Buttons ---------- */
229 .sa-btn {
230 display: inline-flex;
231 align-items: center;
232 justify-content: center;
233 gap: 8px;
234 padding: 10px 20px;
235 font-weight: 600;
236 font-size: 0.938rem;
237 border-radius: 12px;
238 border: none;
239 cursor: pointer;
240 transition: all 0.2s ease;
241 text-decoration: none;
242 line-height: 1.4;
243 }
244
245 .sa-btn:hover {
246 transform: translateY(-1px);
247 text-decoration: none;
248 }
249
250 .sa-btn:active {
251 transform: translateY(0);
252 }
253
254 .sa-btn-primary {
255 background: var(--sa-primary-gradient);
256 color: #fff;
257 box-shadow: 0 2px 8px rgba(232, 96, 76, 0.3);
258 }
259
260 .sa-btn-primary:hover {
261 background: linear-gradient(135deg, #f07060 0%, #de5578 100%);
262 box-shadow: 0 6px 20px rgba(232, 96, 76, 0.45);
263 transform: translateY(-1px);
264 color: #fff;
265 }
266
267 .sa-btn-secondary {
268 background: var(--sa-secondary-gradient);
269 color: #fff;
270 box-shadow: 0 2px 8px rgba(26, 158, 143, 0.3);
271 }
272
273 .sa-btn-secondary:hover {
274 background: linear-gradient(135deg, #20b0a0 0%, #2986be 100%);
275 box-shadow: 0 6px 20px rgba(26, 158, 143, 0.45);
276 transform: translateY(-1px);
277 color: #fff;
278 }
279
280 .sa-btn-accent {
281 background: linear-gradient(135deg, var(--sa-accent) 0%, var(--sa-accent-dark) 100%);
282 color: #fff;
283 box-shadow: 0 2px 8px rgba(244, 166, 35, 0.3);
284 }
285
286 .sa-btn-ghost {
287 background: transparent;
288 color: var(--sa-gray-700);
289 border: 1.5px solid var(--sa-gray-300);
290 }
291
292 .sa-btn-ghost:hover {
293 background: var(--sa-gray-100);
294 color: var(--sa-gray-900);
295 border-color: var(--sa-gray-400);
296 }
297
298 .sa-btn-danger {
299 background: linear-gradient(135deg, var(--sa-danger) 0%, #dc2626 100%);
300 color: #fff;
301 }
302
303 .sa-btn-success {
304 background: linear-gradient(135deg, var(--sa-success) 0%, #16a34a 100%);
305 color: #fff;
306 }
307
308 .sa-btn-sm {
309 padding: 6px 14px;
310 font-size: 0.813rem;
311 }
312
313 .sa-btn-lg {
314 padding: 14px 28px;
315 font-size: 1.063rem;
316 }
317
318 .sa-btn-pill {
319 border-radius: var(--sa-radius-full);
320 }
321
322 .sa-btn-icon {
323 width: 40px;
324 height: 40px;
325 padding: 0;
326 border-radius: var(--sa-radius-full);
327 font-size: 1.1rem;
328 }
329
330 .sa-btn-icon.sa-btn-sm {
331 width: 32px;
332 height: 32px;
333 font-size: 0.9rem;
334 }
335
336 /* Loading state */
337 .sa-btn-loading {
338 position: relative;
339 pointer-events: none;
340 opacity: 0.75;
341 }
342
343 .sa-btn-loading::after {
344 content: '';
345 position: absolute;
346 width: 16px;
347 height: 16px;
348 border: 2px solid transparent;
349 border-top-color: currentColor;
350 border-radius: 50%;
351 animation: sa-spin 0.6s linear infinite;
352 }
353
354 /* ---------- Badges ---------- */
355 .sa-badge {
356 display: inline-flex;
357 align-items: center;
358 gap: 4px;
359 padding: 3px 10px;
360 font-size: 0.75rem;
361 font-weight: 600;
362 border-radius: var(--sa-radius-full);
363 letter-spacing: 0.02em;
364 }
365
366 .sa-badge-primary { background: rgba(232, 96, 76, 0.12); color: var(--sa-primary-dark); }
367 .sa-badge-secondary { background: rgba(26, 158, 143, 0.12); color: var(--sa-secondary-dark); }
368 .sa-badge-accent { background: rgba(244, 166, 35, 0.12); color: var(--sa-accent-dark); }
369 .sa-badge-success { background: var(--sa-success-light); color: #15803d; }
370 .sa-badge-warning { background: var(--sa-warning-light); color: #92400e; }
371 .sa-badge-danger { background: var(--sa-danger-light); color: #dc2626; }
372 .sa-badge-info { background: var(--sa-info-light); color: #1d4ed8; }
373 .sa-badge-neutral { background: var(--sa-gray-100); color: var(--sa-gray-600); }
374
375 .sa-badge-solid-success { background: var(--sa-success); color: #fff; }
376 .sa-badge-solid-warning { background: var(--sa-warning); color: #fff; }
377 .sa-badge-solid-danger { background: var(--sa-danger); color: #fff; }
378 .sa-badge-solid-info { background: var(--sa-info); color: #fff; }
379 .sa-badge-solid-secondary { background: var(--sa-secondary); color: #fff; }
380 .sa-badge-solid-neutral { background: var(--sa-gray-400); color: #fff; }
381
382 /* ---------- Progress Bar ---------- */
383 .sa-progress {
384 height: 10px;
385 background: var(--sa-gray-100);
386 border-radius: var(--sa-radius-full);
387 overflow: hidden;
388 }
389
390 .sa-progress-bar {
391 height: 100%;
392 border-radius: var(--sa-radius-full);
393 transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
394 background: var(--sa-secondary-gradient);
395 }
396
397 .sa-progress-bar-success { background: linear-gradient(90deg, #22c55e 0%, #16a34a 100%); }
398 .sa-progress-bar-warning { background: linear-gradient(90deg, #f59e0b 0%, #d97706 100%); }
399 .sa-progress-bar-danger { background: linear-gradient(90deg, #ef4444 0%, #dc2626 100%); }
400 .sa-progress-bar-primary { background: var(--sa-primary-gradient); }
401
402 .sa-progress-lg { height: 16px; }
403 .sa-progress-sm { height: 6px; }
404
405 /* ---------- Avatar ---------- */
406 .sa-avatar {
407 display: inline-flex;
408 align-items: center;
409 justify-content: center;
410 width: 40px;
411 height: 40px;
412 border-radius: 50%;
413 font-weight: 700;
414 font-size: 0.875rem;
415 color: #fff;
416 text-transform: uppercase;
417 flex-shrink: 0;
418 border: 2px solid #fff;
419 box-shadow: 0 1px 3px rgba(0,0,0,0.1);
420 }
421
422 .sa-avatar-sm { width: 32px; height: 32px; font-size: 0.75rem; }
423 .sa-avatar-lg { width: 52px; height: 52px; font-size: 1.1rem; }
424 .sa-avatar-xl { width: 64px; height: 64px; font-size: 1.3rem; }
425
426 /* Avatar color palette */
427 .sa-avatar-1 { background: #e8604c; }
428 .sa-avatar-2 { background: #1a9e8f; }
429 .sa-avatar-3 { background: #6366f1; }
430 .sa-avatar-4 { background: #f59e0b; }
431 .sa-avatar-5 { background: #ec4899; }
432 .sa-avatar-6 { background: #14b8a6; }
433 .sa-avatar-7 { background: #8b5cf6; }
434 .sa-avatar-8 { background: #f97316; }
435
436 /* Avatar stack (overlapping) */
437 .sa-avatar-stack {
438 display: flex;
439 }
440
441 .sa-avatar-stack .sa-avatar {
442 margin-left: -10px;
443 }
444
445 .sa-avatar-stack .sa-avatar:first-child {
446 margin-left: 0;
447 }
448
449 .sa-avatar-overflow {
450 background: var(--sa-gray-200);
451 color: var(--sa-gray-600);
452 font-size: 0.7rem;
453 }
454
455 /* ---------- Stats ---------- */
456 .sa-stat {
457 text-align: center;
458 padding: var(--sa-space-5);
459 }
460
461 .sa-stat-value {
462 font-size: 1.75rem;
463 font-weight: 800;
464 line-height: 1.2;
465 color: var(--sa-gray-900);
466 letter-spacing: -0.03em;
467 animation: sa-counter 0.6s ease-out both;
468 }
469
470 .sa-stat-label {
471 font-size: 0.8rem;
472 font-weight: 500;
473 color: var(--sa-gray-500);
474 text-transform: uppercase;
475 letter-spacing: 0.06em;
476 margin-top: 4px;
477 }
478
479 .sa-stat-icon {
480 font-size: 1.5rem;
481 margin-bottom: 8px;
482 opacity: 0.8;
483 }
484
485 /* ---------- Empty State ---------- */
486 .sa-empty {
487 text-align: center;
488 padding: var(--sa-space-16) var(--sa-space-6);
489 }
490
491 .sa-empty-icon {
492 font-size: 3.5rem;
493 color: var(--sa-gray-300);
494 margin-bottom: var(--sa-space-4);
495 }
496
497 .sa-empty-title {
498 font-size: 1.25rem;
499 font-weight: 700;
500 color: var(--sa-gray-700);
501 margin-bottom: var(--sa-space-2);
502 }
503
504 .sa-empty-text {
505 font-size: 0.938rem;
506 color: var(--sa-gray-500);
507 margin-bottom: var(--sa-space-6);
508 max-width: 360px;
509 margin-left: auto;
510 margin-right: auto;
511 }
512
513 /* ---------- Gradient Header ---------- */
514 .sa-gradient-header {
515 background: linear-gradient(135deg, #e8604c 0%, #d4456a 40%, #1a9e8f 100%);
516 color: #fff;
517 padding: 32px 28px;
518 margin: -1rem -0.75rem var(--sa-space-8);
519 border-radius: var(--sa-radius-lg);
520 text-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
521 }
522
523 .sa-gradient-header-coral {
524 background: var(--sa-primary-gradient);
525 }
526
527 .sa-gradient-header-green {
528 background: linear-gradient(135deg, #22c55e 0%, #1a9e8f 100%);
529 }
530
531 .sa-gradient-header-purple {
532 background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
533 }
534
535 .sa-gradient-header-blue {
536 background: linear-gradient(135deg, #3b82f6 0%, #2176ae 100%);
537 }
538
539 .sa-gradient-header-accent {
540 background: linear-gradient(135deg, var(--sa-accent) 0%, #f97316 100%);
541 }
542
543 .sa-gradient-header h1,
544 .sa-gradient-header h2,
545 .sa-gradient-header h3,
546 .sa-gradient-header h4 {
547 color: #fff;
548 }
549
550 .sa-gradient-header .sa-badge {
551 background: rgba(255,255,255,0.2);
552 color: #fff;
553 }
554
555 .sa-gradient-header .text-muted {
556 color: rgba(255,255,255,0.8) !important;
557 }
558
559 /* ---------- Navigation Card ---------- */
560 .sa-nav-card {
561 display: flex;
562 flex-direction: column;
563 align-items: center;
564 gap: 8px;
565 padding: var(--sa-space-5) var(--sa-space-4);
566 background: rgba(255, 255, 255, 0.72);
567 backdrop-filter: blur(16px);
568 -webkit-backdrop-filter: blur(16px);
569 border-radius: var(--sa-radius-lg);
570 box-shadow: var(--sa-shadow-glass);
571 border: 1px solid rgba(255, 255, 255, 0.3);
572 text-decoration: none;
573 color: var(--sa-gray-700);
574 transition: all var(--sa-transition-normal);
575 text-align: center;
576 cursor: pointer;
577 }
578
579 .sa-nav-card:hover {
580 transform: translateY(-3px);
581 box-shadow: var(--sa-shadow-md);
582 color: var(--sa-gray-900);
583 text-decoration: none;
584 }
585
586 .sa-nav-card-icon {
587 width: 48px;
588 height: 48px;
589 border-radius: var(--sa-radius-md);
590 display: flex;
591 align-items: center;
592 justify-content: center;
593 font-size: 1.4rem;
594 }
595
596 .sa-nav-card-label {
597 font-weight: 600;
598 font-size: 0.875rem;
599 }
600
601 .sa-nav-card-count {
602 font-size: 0.75rem;
603 color: var(--sa-gray-500);
604 }
605
606 /* Nav card icon themes */
607 .sa-nav-icon-expenses { background: rgba(232, 96, 76, 0.1); color: var(--sa-primary); }
608 .sa-nav-icon-members { background: rgba(99, 102, 241, 0.1); color: #6366f1; }
609 .sa-nav-icon-budget { background: rgba(34, 197, 94, 0.1); color: var(--sa-success); }
610 .sa-nav-icon-wishlist { background: rgba(244, 166, 35, 0.1); color: var(--sa-accent); }
611 .sa-nav-icon-polls { background: rgba(59, 130, 246, 0.1); color: var(--sa-info); }
612 .sa-nav-icon-settlement { background: rgba(26, 158, 143, 0.1); color: var(--sa-secondary); }
613
614 /* ---------- Floating Action Button ---------- */
615 .sa-fab {
616 position: fixed;
617 bottom: 24px;
618 right: 24px;
619 width: 56px;
620 height: 56px;
621 border-radius: 50%;
622 background: var(--sa-primary-gradient);
623 color: #fff;
624 display: flex;
625 align-items: center;
626 justify-content: center;
627 font-size: 1.5rem;
628 border: none;
629 cursor: pointer;
630 box-shadow: 0 4px 16px rgba(232, 96, 76, 0.4);
631 transition: all var(--sa-transition-normal);
632 z-index: 1000;
633 text-decoration: none;
634 }
635
636 .sa-fab:hover {
637 transform: scale(1.1);
638 box-shadow: 0 6px 24px rgba(232, 96, 76, 0.5);
639 color: #fff;
640 }
641
642 @media (min-width: 768px) {
643 .sa-fab {
644 display: none;
645 }
646 }
647
648 /* ---------- Amount Display ---------- */
649 .sa-amount {
650 font-variant-numeric: tabular-nums;
651 font-weight: 700;
652 }
653
654 .sa-amount-lg {
655 font-size: 2rem;
656 letter-spacing: -0.02em;
657 }
658
659 .sa-amount-positive { color: var(--sa-success); }
660 .sa-amount-negative { color: var(--sa-danger); }
661
662 /* ---------- Balance Bar ---------- */
663 .sa-balance-bar-container {
664 display: flex;
665 align-items: center;
666 gap: 8px;
667 height: 28px;
668 }
669
670 .sa-balance-bar-track {
671 flex: 1;
672 display: flex;
673 align-items: center;
674 justify-content: center;
675 position: relative;
676 height: 8px;
677 background: var(--sa-gray-100);
678 border-radius: var(--sa-radius-full);
679 }
680
681 .sa-balance-bar-fill {
682 position: absolute;
683 height: 100%;
684 border-radius: var(--sa-radius-full);
685 transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
686 }
687
688 .sa-balance-bar-positive {
689 right: 50%;
690 left: auto;
691 background: var(--sa-success);
692 }
693
694 .sa-balance-bar-negative {
695 left: 50%;
696 right: auto;
697 background: var(--sa-danger);
698 }
699
700 .sa-balance-bar-center {
701 position: absolute;
702 width: 2px;
703 height: 16px;
704 background: var(--sa-gray-400);
705 left: 50%;
706 transform: translateX(-50%);
707 }
708
709 /* ---------- Settlement Flow Card ---------- */
710 .sa-settlement-card {
711 display: flex;
712 align-items: center;
713 gap: var(--sa-space-4);
714 padding: var(--sa-space-4) var(--sa-space-5);
715 background: rgba(255, 255, 255, 0.72);
716 backdrop-filter: blur(16px);
717 -webkit-backdrop-filter: blur(16px);
718 border-radius: var(--sa-radius-lg);
719 box-shadow: var(--sa-shadow-glass);
720 border: 1px solid rgba(255, 255, 255, 0.3);
721 }
722
723 .sa-settlement-arrow {
724 color: var(--sa-gray-400);
725 font-size: 1.2rem;
726 flex-shrink: 0;
727 }
728
729 .sa-settlement-amount {
730 font-size: 1.1rem;
731 font-weight: 700;
732 color: var(--sa-gray-900);
733 flex-shrink: 0;
734 }
735
736 /* Status dots */
737 .sa-status-dot {
738 width: 10px;
739 height: 10px;
740 border-radius: 50%;
741 display: inline-block;
742 }
743
744 .sa-status-dot-pending { background: var(--sa-gray-300); }
745 .sa-status-dot-active { background: var(--sa-success); }
746 .sa-status-dot-warning { background: var(--sa-warning); }
747 .sa-status-dot-pulse {
748 animation: sa-pulse 2s ease-in-out infinite;
749 }
750
751 /* ---------- Toggle Switch ---------- */
752 .sa-toggle {
753 position: relative;
754 width: 44px;
755 height: 24px;
756 appearance: none;
757 -webkit-appearance: none;
758 background: var(--sa-gray-300);
759 border-radius: var(--sa-radius-full);
760 outline: none;
761 cursor: pointer;
762 transition: background var(--sa-transition-fast);
763 }
764
765 .sa-toggle:checked {
766 background: var(--sa-secondary);
767 }
768
769 .sa-toggle::before {
770 content: '';
771 position: absolute;
772 top: 2px;
773 left: 2px;
774 width: 20px;
775 height: 20px;
776 border-radius: 50%;
777 background: #fff;
778 box-shadow: 0 1px 3px rgba(0,0,0,0.2);
779 transition: transform var(--sa-transition-fast);
780 }
781
782 .sa-toggle:checked::before {
783 transform: translateX(20px);
784 }
785
786 /* ---------- Toast ---------- */
787 .sa-toast-container {
788 position: fixed;
789 top: 20px;
790 right: 20px;
791 z-index: 9999;
792 display: flex;
793 flex-direction: column;
794 gap: 8px;
795 pointer-events: none;
796 }
797
798 .sa-toast {
799 display: flex;
800 align-items: center;
801 gap: 10px;
802 padding: 12px 20px;
803 background: #fff;
804 border-radius: var(--sa-radius-md);
805 box-shadow: var(--sa-shadow-lg);
806 border-left: 4px solid var(--sa-secondary);
807 font-size: 0.875rem;
808 font-weight: 500;
809 pointer-events: auto;
810 animation: sa-slide-in-right 0.3s ease-out;
811 max-width: 380px;
812 }
813
814 .sa-toast-success { border-left-color: var(--sa-success); }
815 .sa-toast-error { border-left-color: var(--sa-danger); }
816 .sa-toast-warning { border-left-color: var(--sa-warning); }
817
818 .sa-toast-dismiss {
819 animation: sa-fade-out 0.3s ease-in forwards;
820 }
821
822 /* ---------- Expense List Item ---------- */
823 .sa-expense-item {
824 display: flex;
825 align-items: center;
826 gap: var(--sa-space-4);
827 padding: var(--sa-space-4) var(--sa-space-5);
828 border-bottom: 1px solid var(--sa-gray-100);
829 transition: background var(--sa-transition-fast);
830 }
831
832 .sa-expense-item:last-child {
833 border-bottom: none;
834 }
835
836 .sa-expense-item:hover {
837 background: var(--sa-gray-50);
838 }
839
840 .sa-expense-icon {
841 width: 40px;
842 height: 40px;
843 border-radius: var(--sa-radius-sm);
844 display: flex;
845 align-items: center;
846 justify-content: center;
847 font-size: 1rem;
848 flex-shrink: 0;
849 }
850
851 .sa-expense-details {
852 flex: 1;
853 min-width: 0;
854 }
855
856 .sa-expense-desc {
857 font-weight: 600;
858 font-size: 0.938rem;
859 color: var(--sa-gray-800);
860 white-space: nowrap;
861 overflow: hidden;
862 text-overflow: ellipsis;
863 }
864
865 .sa-expense-meta {
866 font-size: 0.8rem;
867 color: var(--sa-gray-500);
868 margin-top: 2px;
869 }
870
871 .sa-expense-amount {
872 font-weight: 700;
873 font-size: 1rem;
874 color: var(--sa-gray-900);
875 text-align: right;
876 flex-shrink: 0;
877 }
878
879 .sa-expense-actions {
880 display: flex;
881 gap: 4px;
882 min-width: 72px;
883 justify-content: flex-end;
884 opacity: 0;
885 transition: opacity var(--sa-transition-fast);
886 }
887
888 .sa-expense-item:hover .sa-expense-actions {
889 opacity: 1;
890 }
891
892 @media (max-width: 767px) {
893 .sa-expense-actions {
894 opacity: 1;
895 }
896 }
897
898 /* ---------- Split Method Cards ---------- */
899 .sa-split-methods {
900 display: grid;
901 grid-template-columns: repeat(2, 1fr);
902 gap: 8px;
903 }
904
905 @media (min-width: 576px) {
906 .sa-split-methods {
907 grid-template-columns: repeat(4, 1fr);
908 }
909 }
910
911 .sa-split-option {
912 position: relative;
913 cursor: pointer;
914 }
915
916 .sa-split-option input {
917 position: absolute;
918 opacity: 0;
919 width: 0;
920 height: 0;
921 }
922
923 .sa-split-option-label {
924 display: flex;
925 flex-direction: column;
926 align-items: center;
927 gap: 6px;
928 padding: var(--sa-space-4) var(--sa-space-3);
929 border: 2px solid var(--sa-gray-200);
930 border-radius: var(--sa-radius-md);
931 text-align: center;
932 transition: all var(--sa-transition-fast);
933 background: #fff;
934 }
935
936 .sa-split-option input:checked + .sa-split-option-label {
937 border-color: var(--sa-secondary);
938 background: rgba(26, 158, 143, 0.06);
939 box-shadow: 0 0 0 1px var(--sa-secondary);
940 }
941
942 .sa-split-option-icon {
943 font-size: 1.4rem;
944 color: var(--sa-gray-500);
945 }
946
947 .sa-split-option input:checked + .sa-split-option-label .sa-split-option-icon {
948 color: var(--sa-secondary);
949 }
950
951 .sa-split-option-text {
952 font-size: 0.75rem;
953 font-weight: 600;
954 color: var(--sa-gray-600);
955 }
956
957 /* ---------- Poll Option Card ---------- */
958 .sa-poll-option {
959 border: 2px solid var(--sa-gray-200);
960 border-radius: var(--sa-radius-md);
961 padding: var(--sa-space-4) var(--sa-space-5);
962 margin-bottom: var(--sa-space-3);
963 transition: all var(--sa-transition-fast);
964 background: #fff;
965 }
966
967 .sa-poll-option-voted {
968 border-color: var(--sa-secondary);
969 background: rgba(26, 158, 143, 0.03);
970 }
971
972 .sa-poll-option-winner {
973 border-color: var(--sa-accent);
974 background: rgba(244, 166, 35, 0.05);
975 }
976
977 /* ---------- Wishlist Vote Button ---------- */
978 .sa-vote-btn {
979 display: inline-flex;
980 align-items: center;
981 gap: 6px;
982 padding: 6px 14px;
983 border: 1.5px solid var(--sa-gray-300);
984 border-radius: var(--sa-radius-full);
985 background: #fff;
986 color: var(--sa-gray-600);
987 font-size: 0.85rem;
988 font-weight: 600;
989 cursor: pointer;
990 transition: all var(--sa-transition-fast);
991 }
992
993 .sa-vote-btn:hover {
994 border-color: var(--sa-primary);
995 color: var(--sa-primary);
996 }
997
998 .sa-vote-btn-active {
999 border-color: var(--sa-primary);
1000 background: rgba(232, 96, 76, 0.08);
1001 color: var(--sa-primary);
1002 }
1003
1004 /* ---------- Navbar ---------- */
1005 .sa-navbar {
1006 position: sticky;
1007 top: 0;
1008 z-index: 1050;
1009 background: rgba(255, 255, 255, 0.85);
1010 backdrop-filter: blur(12px);
1011 -webkit-backdrop-filter: blur(12px);
1012 border-bottom: 1px solid rgba(0, 0, 0, 0.06);
1013 padding: 0 var(--sa-space-4);
1014 }
1015
1016 .sa-navbar-brand {
1017 font-weight: 800;
1018 font-size: 1.25rem;
1019 color: var(--sa-primary) !important;
1020 display: flex;
1021 align-items: center;
1022 gap: 8px;
1023 text-decoration: none;
1024 }
1025
1026 .sa-navbar-brand:hover {
1027 color: var(--sa-primary-dark) !important;
1028 }
1029
1030 .sa-navbar .nav-link {
1031 font-weight: 500;
1032 color: var(--sa-gray-600) !important;
1033 padding: 8px 16px !important;
1034 border-radius: var(--sa-radius-sm);
1035 transition: all var(--sa-transition-fast);
1036 }
1037
1038 .sa-navbar .nav-link:hover,
1039 .sa-navbar .nav-link.active {
1040 color: var(--sa-gray-900) !important;
1041 background: var(--sa-gray-100);
1042 }
1043
1044 .sa-nav-avatar-btn {
1045 display: flex;
1046 align-items: center;
1047 gap: 8px;
1048 padding: 4px 12px 4px 4px;
1049 background: var(--sa-gray-100);
1050 border-radius: var(--sa-radius-full);
1051 border: none;
1052 cursor: pointer;
1053 font-size: 0.875rem;
1054 font-weight: 500;
1055 color: var(--sa-gray-700);
1056 transition: background var(--sa-transition-fast);
1057 }
1058
1059 .sa-nav-avatar-btn:hover {
1060 background: var(--sa-gray-200);
1061 }
1062
1063 .sa-navbar-auth-btns {
1064 display: flex;
1065 gap: 8px;
1066 align-items: center;
1067 }
1068
1069 /* ---------- Hero Section ---------- */
1070 .sa-hero {
1071 text-align: center;
1072 padding: var(--sa-space-16) var(--sa-space-4);
1073 background: var(--sa-primary-gradient);
1074 color: #fff;
1075 margin: -1rem -0.75rem var(--sa-space-12);
1076 border-radius: 0 0 var(--sa-radius-lg) var(--sa-radius-lg);
1077 }
1078
1079 .sa-hero h1 {
1080 color: #fff;
1081 font-size: 2.75rem;
1082 font-weight: 800;
1083 letter-spacing: -0.03em;
1084 margin-bottom: var(--sa-space-4);
1085 }
1086
1087 .sa-hero p {
1088 font-size: 1.2rem;
1089 opacity: 0.9;
1090 max-width: 540px;
1091 margin: 0 auto var(--sa-space-8);
1092 }
1093
1094 .sa-hero-btns {
1095 display: flex;
1096 gap: 12px;
1097 justify-content: center;
1098 flex-wrap: wrap;
1099 }
1100
1101 .sa-hero-btn-white {
1102 background: #fff;
1103 color: var(--sa-primary);
1104 font-weight: 700;
1105 padding: 12px 28px;
1106 border-radius: var(--sa-radius-full);
1107 border: none;
1108 font-size: 1rem;
1109 transition: all var(--sa-transition-fast);
1110 text-decoration: none;
1111 display: inline-flex;
1112 align-items: center;
1113 gap: 8px;
1114 }
1115
1116 .sa-hero-btn-white:hover {
1117 transform: translateY(-2px);
1118 box-shadow: 0 4px 16px rgba(0,0,0,0.15);
1119 color: var(--sa-primary);
1120 }
1121
1122 .sa-hero-btn-outline {
1123 background: transparent;
1124 color: #fff;
1125 font-weight: 600;
1126 padding: 12px 28px;
1127 border-radius: var(--sa-radius-full);
1128 border: 2px solid rgba(255,255,255,0.4);
1129 font-size: 1rem;
1130 transition: all var(--sa-transition-fast);
1131 text-decoration: none;
1132 display: inline-flex;
1133 align-items: center;
1134 gap: 8px;
1135 }
1136
1137 .sa-hero-btn-outline:hover {
1138 background: rgba(255,255,255,0.15);
1139 border-color: rgba(255,255,255,0.7);
1140 color: #fff;
1141 }
1142
1143 @media (max-width: 767px) {
1144 .sa-hero h1 { font-size: 2rem; }
1145 .sa-hero { padding-top: var(--sa-space-10); padding-bottom: var(--sa-space-10); }
1146 }
1147
1148 /* ---------- Feature Cards ---------- */
1149 .sa-feature-card {
1150 text-align: center;
1151 padding: var(--sa-space-8) var(--sa-space-6);
1152 }
1153
1154 .sa-feature-icon {
1155 width: 64px;
1156 height: 64px;
1157 border-radius: var(--sa-radius-lg);
1158 display: flex;
1159 align-items: center;
1160 justify-content: center;
1161 font-size: 1.75rem;
1162 margin: 0 auto var(--sa-space-4);
1163 }
1164
1165 .sa-feature-title {
1166 font-size: 1.1rem;
1167 font-weight: 700;
1168 margin-bottom: var(--sa-space-2);
1169 }
1170
1171 .sa-feature-text {
1172 font-size: 0.938rem;
1173 color: var(--sa-gray-500);
1174 line-height: 1.6;
1175 }
1176
1177 /* ---------- Confirmation Card ---------- */
1178 .sa-confirm-card {
1179 max-width: 480px;
1180 margin: var(--sa-space-8) auto;
1181 }
1182
1183 .sa-confirm-icon {
1184 width: 64px;
1185 height: 64px;
1186 border-radius: 50%;
1187 display: flex;
1188 align-items: center;
1189 justify-content: center;
1190 font-size: 1.75rem;
1191 margin: 0 auto var(--sa-space-4);
1192 }
1193
1194 .sa-confirm-icon-danger { background: var(--sa-danger-light); color: var(--sa-danger); }
1195 .sa-confirm-icon-success { background: var(--sa-success-light); color: var(--sa-success); }
1196 .sa-confirm-icon-warning { background: var(--sa-warning-light); color: var(--sa-warning); }
1197
1198 /* ---------- Big Amount Input ---------- */
1199 .sa-amount-input {
1200 font-size: 2.5rem;
1201 font-weight: 800;
1202 text-align: center;
1203 border: none;
1204 border-bottom: 3px solid var(--sa-gray-200);
1205 border-radius: 0;
1206 padding: var(--sa-space-4);
1207 background: transparent;
1208 letter-spacing: -0.02em;
1209 }
1210
1211 .sa-amount-input:focus {
1212 border-color: var(--sa-secondary);
1213 box-shadow: none;
1214 outline: none;
1215 }
1216
1217 .sa-amount-input::placeholder {
1218 color: var(--sa-gray-300);
1219 }
1220
1221 /* ---------- Animations ---------- */
1222 @keyframes sa-fade-in {
1223 from { opacity: 0; transform: translateY(8px); }
1224 to { opacity: 1; transform: translateY(0); }
1225 }
1226
1227 @keyframes sa-slide-up {
1228 from { opacity: 0; transform: translateY(8px); }
1229 to { opacity: 1; transform: translateY(0); }
1230 }
1231
1232 @keyframes sa-counter {
1233 from { opacity: 0; transform: translateY(10px); }
1234 to { opacity: 1; transform: translateY(0); }
1235 }
1236
1237 @keyframes sa-slide-in-right {
1238 from { opacity: 0; transform: translateX(100px); }
1239 to { opacity: 1; transform: translateX(0); }
1240 }
1241
1242 @keyframes sa-fade-out {
1243 from { opacity: 1; transform: translateX(0); }
1244 to { opacity: 0; transform: translateX(100px); }
1245 }
1246
1247 @keyframes sa-scale-in {
1248 from { opacity: 0; transform: scale(0.9); }
1249 to { opacity: 1; transform: scale(1); }
1250 }
1251
1252 @keyframes sa-spin {
1253 to { transform: rotate(360deg); }
1254 }
1255
1256 @keyframes sa-pulse {
1257 0%, 100% { opacity: 1; }
1258 50% { opacity: 0.5; }
1259 }
1260
1261 @keyframes sa-bounce-in {
1262 0% { transform: scale(0); }
1263 50% { transform: scale(1.15); }
1264 100% { transform: scale(1); }
1265 }
1266
1267 @keyframes sa-progress-fill {
1268 from { width: 0; }
1269 }
1270
1271 .sa-animate-fade-in { animation: sa-fade-in 0.5s ease-out both; }
1272 .sa-animate-slide-up { animation: sa-slide-up 0.5s ease-out both; }
1273 .sa-animate-scale-in { animation: sa-scale-in 0.4s ease-out both; }
1274 .sa-animate-bounce-in { animation: sa-bounce-in 0.5s ease-out both; }
1275 .sa-animate-counter { animation: sa-counter 0.6s ease-out both; }
1276
1277 /* Hover lift effect */
1278 .sa-hover-lift {
1279 transition: transform 0.2s ease, box-shadow 0.2s ease;
1280 }
1281
1282 .sa-hover-lift:hover {
1283 transform: translateY(-2px);
1284 box-shadow: var(--sa-shadow-lg);
1285 }
1286
1287 /* Stagger delays */
1288 .sa-stagger-1 { animation-delay: 0.05s; }
1289 .sa-stagger-2 { animation-delay: 0.1s; }
1290 .sa-stagger-3 { animation-delay: 0.15s; }
1291 .sa-stagger-4 { animation-delay: 0.2s; }
1292 .sa-stagger-5 { animation-delay: 0.25s; }
1293 .sa-stagger-6 { animation-delay: 0.3s; }
1294
1295 /* Scroll-triggered */
1296 .sa-animate-on-scroll {
1297 opacity: 0;
1298 transform: translateY(20px);
1299 transition: opacity 0.6s ease-out, transform 0.6s ease-out;
1300 }
1301
1302 .sa-animate-on-scroll.sa-visible {
1303 opacity: 1;
1304 transform: translateY(0);
1305 }
1306
1307 /* ---------- Utility Classes ---------- */
1308 .sa-text-gradient {
1309 background: var(--sa-primary-gradient);
1310 -webkit-background-clip: text;
1311 -webkit-text-fill-color: transparent;
1312 background-clip: text;
1313 }
1314
1315 .sa-text-primary { color: var(--sa-primary); }
1316 .sa-text-secondary { color: var(--sa-secondary); }
1317 .sa-text-accent { color: var(--sa-accent); }
1318 .sa-text-muted { color: var(--sa-gray-500); }
1319
1320 .sa-bg-soft-primary { background: rgba(232, 96, 76, 0.08); }
1321 .sa-bg-soft-secondary { background: rgba(26, 158, 143, 0.08); }
1322 .sa-bg-soft-success { background: var(--sa-success-light); }
1323 .sa-bg-soft-danger { background: var(--sa-danger-light); }
1324 .sa-bg-soft-warning { background: var(--sa-warning-light); }
1325
1326 .sa-rounded { border-radius: var(--sa-radius-md); }
1327 .sa-rounded-lg { border-radius: var(--sa-radius-lg); }
1328
1329 .sa-shadow { box-shadow: var(--sa-shadow-md); }
1330 .sa-shadow-lg { box-shadow: var(--sa-shadow-lg); }
1331
1332 .sa-divider {
1333 height: 1px;
1334 background: var(--sa-gray-100);
1335 margin: var(--sa-space-4) 0;
1336 }
1337
1338 .sa-truncate {
1339 white-space: nowrap;
1340 overflow: hidden;
1341 text-overflow: ellipsis;
1342 }
1343
1344 /* ---------- Category Colors ---------- */
1345 .sa-category-food { background: #fee2e2; color: #dc2626; }
1346 .sa-category-accommodation { background: #dbeafe; color: #2563eb; }
1347 .sa-category-transport { background: #fef3c7; color: #d97706; }
1348 .sa-category-activities { background: #dcfce7; color: #16a34a; }
1349 .sa-category-shopping { background: #f3e8ff; color: #7c3aed; }
1350 .sa-category-default { background: var(--sa-gray-100); color: var(--sa-gray-600); }
1351
1352 /* ---------- Responsive Helpers ---------- */
1353 @media (max-width: 575px) {
1354 .sa-hide-mobile { display: none !important; }
1355 .sa-gradient-header {
1356 padding-top: var(--sa-space-6);
1357 padding-bottom: var(--sa-space-6);
1358 }
1359 h1 { font-size: 1.5rem; }
1360 .sa-stat-value { font-size: 1.4rem; }
1361 }
1362
1363 @media (min-width: 576px) {
1364 .sa-hide-desktop { display: none !important; }
1365 }
1366
1367 /* ---------- Dropdown override ---------- */
1368 .dropdown-menu {
1369 border: 1px solid var(--sa-gray-100);
1370 border-radius: var(--sa-radius-md);
1371 box-shadow: var(--sa-shadow-lg);
1372 padding: 6px;
1373 }
1374
1375 .dropdown-item {
1376 border-radius: var(--sa-radius-sm);
1377 padding: 8px 14px;
1378 font-size: 0.875rem;
1379 font-weight: 500;
1380 transition: background var(--sa-transition-fast);
1381 }
1382
1383 .dropdown-item:hover {
1384 background: var(--sa-gray-100);
1385 }
1386
1387 /* ---------- Table Override ---------- */
1388 .sa-table {
1389 width: 100%;
1390 border-collapse: separate;
1391 border-spacing: 0;
1392 }
1393
1394 .sa-table thead th {
1395 font-size: 0.75rem;
1396 font-weight: 600;
1397 text-transform: uppercase;
1398 letter-spacing: 0.06em;
1399 color: var(--sa-gray-500);
1400 border-bottom: 2px solid var(--sa-gray-100);
1401 padding: var(--sa-space-3) var(--sa-space-4);
1402 }
1403
1404 .sa-table tbody td {
1405 padding: var(--sa-space-3) var(--sa-space-4);
1406 border-bottom: 1px solid var(--sa-gray-100);
1407 font-size: 0.938rem;
1408 }
1409
1410 .sa-table tbody tr:hover {
1411 background: var(--sa-gray-50);
1412 }
1413
1414 .sa-table tbody tr:last-child td {
1415 border-bottom: none;
1416 }
1417
1418 /* ---------- Trip Card ---------- */
1419 .sa-trip-card {
1420 overflow: hidden;
1421 }
1422
1423 .sa-trip-card-gradient {
1424 height: 6px;
1425 }
1426
1427 /* Generate variety with nth-child */
1428 .sa-trip-card:nth-child(6n+1) .sa-trip-card-gradient { background: var(--sa-primary-gradient); }
1429 .sa-trip-card:nth-child(6n+2) .sa-trip-card-gradient { background: var(--sa-secondary-gradient); }
1430 .sa-trip-card:nth-child(6n+3) .sa-trip-card-gradient { background: linear-gradient(135deg, #6366f1, #8b5cf6); }
1431 .sa-trip-card:nth-child(6n+4) .sa-trip-card-gradient { background: linear-gradient(135deg, var(--sa-accent), #f97316); }
1432 .sa-trip-card:nth-child(6n+5) .sa-trip-card-gradient { background: linear-gradient(135deg, #ec4899, #f43f5e); }
1433 .sa-trip-card:nth-child(6n+6) .sa-trip-card-gradient { background: linear-gradient(135deg, #14b8a6, #06b6d4); }
1434
1435 /* ---------- Invitation / Accept page ---------- */
1436 .sa-invite-page {
1437 min-height: 80vh;
1438 display: flex;
1439 align-items: center;
1440 justify-content: center;
1441 }
1442
1443 .sa-invite-card {
1444 max-width: 440px;
1445 width: 100%;
1446 text-align: center;
1447 }
1448
1449 .sa-invite-icon {
1450 font-size: 3rem;
1451 margin-bottom: var(--sa-space-4);
1452 }
1453
1454 /* Copy link input */
1455 .sa-copy-group {
1456 display: flex;
1457 gap: 0;
1458 }
1459
1460 .sa-copy-input {
1461 flex: 1;
1462 border-radius: var(--sa-radius-sm) 0 0 var(--sa-radius-sm);
1463 font-family: var(--sa-font-mono);
1464 font-size: 0.85rem;
1465 }
1466
1467 .sa-copy-btn {
1468 border-radius: 0 var(--sa-radius-sm) var(--sa-radius-sm) 0;
1469 white-space: nowrap;
1470 }
1471
1472 /* ---------- Participant Chip ---------- */
1473 .sa-participant-chip {
1474 display: inline-flex;
1475 align-items: center;
1476 gap: 8px;
1477 padding: 4px 12px 4px 4px;
1478 background: var(--sa-gray-100);
1479 border-radius: var(--sa-radius-full);
1480 font-size: 0.85rem;
1481 font-weight: 500;
1482 cursor: pointer;
1483 transition: all var(--sa-transition-fast);
1484 border: 2px solid transparent;
1485 }
1486
1487 .sa-participant-chip.active {
1488 border-color: var(--sa-secondary);
1489 background: rgba(26, 158, 143, 0.08);
1490 }
1491
1492 .sa-participant-chip:hover {
1493 background: var(--sa-gray-200);
1494 }
1495
1496 /* ---------- Auth Pages ---------- */
1497 .sa-auth-page {
1498 min-height: 80vh;
1499 display: flex;
1500 align-items: center;
1501 justify-content: center;
1502 }
1503
1504 .sa-auth-card {
1505 max-width: 420px;
1506 width: 100%;
1507 }
1508
1509 .sa-auth-brand {
1510 text-align: center;
1511 margin-bottom: var(--sa-space-8);
1512 }
1513
1514 .sa-auth-brand h1 {
1515 font-weight: 800;
1516 font-size: 2rem;
1517 color: var(--sa-primary);
1518 }
1519
1520 .sa-auth-brand p {
1521 color: var(--sa-gray-500);
1522 font-size: 0.938rem;
1523 }
1524
1525 /* ---------- Mobile Premium Overrides (< 768px) ---------- */
1526 @media (max-width: 767px) {
1527 .sa-card {
1528 width: 100%;
1529 border-radius: 12px;
1530 }
1531
1532 .sa-nav-card {
1533 display: grid;
1534 grid-template-columns: repeat(2, 1fr);
1535 }
1536
1537 .sa-btn,
1538 .sa-btn-primary,
1539 .sa-btn-secondary,
1540 .sa-btn-ghost,
1541 .sa-btn-danger,
1542 .sa-btn-success,
1543 .sa-btn-accent {
1544 min-height: 44px;
1545 min-width: 44px;
1546 }
1547
1548 .sa-form-sticky-submit {
1549 position: sticky;
1550 bottom: 0;
1551 background: rgba(255, 255, 255, 0.92);
1552 backdrop-filter: blur(12px);
1553 -webkit-backdrop-filter: blur(12px);
1554 padding: var(--sa-space-4);
1555 margin: 0 calc(-1 * var(--sa-space-4));
1556 border-top: 1px solid var(--sa-gray-100);
1557 z-index: 10;
1558 }
1559 }
1560
1561 /* ---------- Print ---------- */
1562 @media print {
1563 .sa-navbar, .sa-footer, .sa-fab, .sa-toast-container { display: none !important; }
1564 .sa-card, .sa-card-static { box-shadow: none; border: 1px solid #ddd; }
1565 body { background: #fff; }
1566 }
1567