profileShare

rasmusjy / splitapp-backend-microservices

Read-only snapshot

No repository description.

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