@paraxe/design 1.0.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /* ==========================================================================
2
- @loba/design — components.css
2
+ — components.css
3
3
  Shared HTML/CSS component classes (framework-agnostic).
4
4
 
5
5
  These classes consume the canonical Loba tokens:
@@ -8,8 +8,8 @@
8
8
  - Personality → presets/*.css (--button-radius, etc.)
9
9
 
10
10
  They are the SINGLE source of truth for the framework-agnostic component
11
- layer. `@loba/ui` consumers use the Vue components instead (no duplicate
12
- class layer). Non-`@loba/ui` projects consume these classes directly.
11
+ layer. consumers use the Vue components instead (no duplicate
12
+ class layer). Non- projects consume these classes directly.
13
13
 
14
14
  ✅ DO put here:
15
15
  - Button classes (.btn, .btn-primary, .btn-secondary, etc.)
@@ -886,7 +886,6 @@
886
886
  display: inline-flex;
887
887
  align-items: center;
888
888
  gap: var(--tag-gap);
889
- width: fit-content;
890
889
 
891
890
  min-height: var(--tag-min-height);
892
891
  padding: var(--tag-padding-y) var(--tag-padding-x);
@@ -1542,6 +1541,12 @@
1542
1541
  .stack-full {
1543
1542
  width: 100%;
1544
1543
  }
1544
+ .badge,
1545
+ .tag,
1546
+ .btn {
1547
+ width: fit-content;
1548
+ }
1549
+
1545
1550
 
1546
1551
  .inline {
1547
1552
  display: flex;
@@ -3328,31 +3333,3753 @@ OVERLAYS
3328
3333
  VARIANTS
3329
3334
  -------------------------------------------------------------------------- */
3330
3335
 
3331
- .alert-info {
3332
- border-color: var(--alert-info-border);
3333
- background: var(--alert-info-background);
3334
- color: var(--alert-info-text);
3336
+ /* ==========================================================================
3337
+ @loba/design — components.css
3338
+ Shared HTML/CSS component classes (framework-agnostic).
3339
+
3340
+ These classes consume the canonical Loba tokens:
3341
+ - Structural tokens → tokens.css (--button-*, --card-*, etc.)
3342
+ - Color tokens → themes/*.css (--button-primary-bg, etc.)
3343
+ - Personality → presets/*.css (--button-radius, etc.)
3344
+
3345
+ They are the SINGLE source of truth for the framework-agnostic component
3346
+ layer. `@loba/ui` consumers use the Vue components instead (no duplicate
3347
+ class layer). Non-`@loba/ui` projects consume these classes directly.
3348
+
3349
+ ✅ DO put here:
3350
+ - Button classes (.btn, .btn-primary, .btn-secondary, etc.)
3351
+ - Card classes (.card, .card-hoverable)
3352
+ - Badge class (.badge)
3353
+ - Layout primitives (.container, .section, .stack, .inline, .grid)
3354
+ - Navbar classes (.navbar, .nav-link, .nav-link-active)
3355
+ - Form controls (.input, .textarea, .select)
3356
+ - Animation utility classes (.animate-fade-in, etc.)
3357
+
3358
+ ❌ DO NOT put here:
3359
+ - Token definitions (→ tokens.css / themes/*.css / presets/*.css)
3360
+ - Base element styles (→ @loba/ui base.css / project globals)
3361
+ - @keyframes definitions (→ project animations.css / typography.css)
3362
+ ========================================================================== */
3363
+
3364
+ /* ==========================================================================
3365
+ BUTTONS
3366
+ ========================================================================== */
3367
+
3368
+ .btn {
3369
+ display: inline-flex;
3370
+ align-items: center;
3371
+ justify-content: center;
3372
+ gap: var(--button-gap);
3373
+
3374
+ min-height: var(--button-min-height);
3375
+ padding: var(--button-padding-y) var(--button-padding-x);
3376
+
3377
+ border: 1px solid transparent;
3378
+ border-radius: var(--button-radius);
3379
+
3380
+ font-family: var(--font-family-body);
3381
+ font-size: var(--typography-button-size);
3382
+ font-weight: var(--typography-button-weight);
3383
+ line-height: var(--typography-button-lineheight);
3384
+
3385
+ text-decoration: none;
3386
+ white-space: nowrap;
3387
+ user-select: none;
3388
+ cursor: pointer;
3389
+
3390
+ transition:
3391
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
3392
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
3393
+ color var(--motion-duration-fast) var(--motion-ease-out),
3394
+ transform var(--motion-duration-fast) var(--motion-ease-out),
3395
+ box-shadow var(--motion-duration-fast) var(--motion-ease-out);
3335
3396
  }
3336
3397
 
3337
- .alert-success {
3338
- border-color: var(--alert-success-border);
3339
- background: var(--alert-success-background);
3340
- color: var(--alert-success-text);
3398
+ .btn:focus-visible {
3399
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
3400
+ outline-offset: var(--focus-ring-offset);
3341
3401
  }
3342
3402
 
3343
- .alert-warning {
3344
- border-color: var(--alert-warning-border);
3345
- background: var(--alert-warning-background);
3346
- color: var(--alert-warning-text);
3403
+ .btn:disabled {
3404
+ cursor: not-allowed;
3405
+ pointer-events: none;
3347
3406
  }
3348
3407
 
3349
- .alert-danger {
3350
- border-color: var(--alert-danger-border);
3351
- background: var(--alert-danger-background);
3352
- color: var(--alert-danger-text);
3408
+ /* --------------------------------------------------------------------------
3409
+ VARIANTS
3410
+ -------------------------------------------------------------------------- */
3411
+
3412
+ .btn-primary {
3413
+ background: var(--button-primary-bg);
3414
+ color: var(--button-primary-text);
3415
+ border-color: var(--button-primary-border);
3416
+ }
3417
+
3418
+ .btn-primary:hover {
3419
+ background: var(--button-primary-hover-bg);
3420
+ border-color: var(--button-primary-hover-border);
3421
+ }
3422
+
3423
+ .btn-primary:active {
3424
+ background: var(--button-primary-active-bg);
3425
+ }
3426
+
3427
+ .btn-primary:disabled {
3428
+ background: var(--button-primary-disabled-bg);
3429
+ color: var(--button-primary-disabled-text);
3430
+ border-color: var(--button-primary-disabled-border);
3431
+ }
3432
+
3433
+
3434
+ .btn-secondary {
3435
+ background: var(--button-secondary-bg);
3436
+ color: var(--button-secondary-text);
3437
+ border-color: var(--button-secondary-border);
3438
+ }
3439
+
3440
+ .btn-secondary:hover {
3441
+ background: var(--button-secondary-hover-bg);
3442
+ border-color: var(--button-secondary-hover-border);
3443
+ }
3444
+
3445
+ .btn-secondary:active {
3446
+ background: var(--button-secondary-active-bg);
3447
+ }
3448
+
3449
+ .btn-secondary:disabled {
3450
+ background: var(--button-secondary-disabled-bg);
3451
+ color: var(--button-secondary-disabled-text);
3452
+ border-color: var(--button-secondary-disabled-border);
3453
+ }
3454
+
3455
+
3456
+ .btn-destructive {
3457
+ background: var(--button-destructive-bg);
3458
+ color: var(--button-destructive-text);
3459
+ border-color: var(--button-destructive-border);
3460
+ }
3461
+
3462
+ .btn-destructive:hover {
3463
+ background: var(--button-destructive-hover-bg);
3464
+ border-color: var(--button-destructive-hover-border);
3465
+ }
3466
+
3467
+ .btn-destructive:active {
3468
+ background: var(--button-destructive-active-bg);
3469
+ }
3470
+
3471
+ .btn-destructive:disabled {
3472
+ background: var(--button-destructive-disabled-bg);
3473
+ color: var(--button-destructive-disabled-text);
3474
+ border-color: var(--button-destructive-disabled-border);
3475
+ }
3476
+
3477
+
3478
+ .btn-ghost {
3479
+ background: var(--button-ghost-bg);
3480
+ color: var(--button-ghost-text);
3481
+ border-color: var(--button-ghost-border);
3482
+ }
3483
+
3484
+ .btn-ghost:hover {
3485
+ background: var(--button-ghost-hover-bg);
3486
+ border-color: var(--button-ghost-hover-border);
3487
+ }
3488
+
3489
+ .btn-ghost:active {
3490
+ background: var(--button-ghost-active-bg);
3491
+ }
3492
+
3493
+ .btn-ghost:disabled {
3494
+ background: var(--button-ghost-disabled-bg);
3495
+ color: var(--button-ghost-disabled-text);
3496
+ border-color: var(--button-ghost-disabled-border);
3497
+ }
3498
+
3499
+
3500
+ /* --------------------------------------------------------------------------
3501
+ SIZES
3502
+ -------------------------------------------------------------------------- */
3503
+
3504
+ .btn-sm {
3505
+ min-height: var(--button-min-height-sm);
3506
+ padding: var(--button-padding-y-sm) var(--button-padding-x-sm);
3507
+ font-size: var(--font-size-xs);
3508
+ }
3509
+
3510
+ .btn-md {
3511
+ min-height: var(--button-min-height);
3512
+ padding: var(--button-padding-y) var(--button-padding-x);
3513
+ font-size: var(--typography-button-size);
3514
+ }
3515
+
3516
+ .btn-lg {
3517
+ min-height: var(--button-min-height-lg);
3518
+ padding: var(--button-padding-y-lg) var(--button-padding-x-lg);
3519
+ font-size: var(--font-size-base);
3520
+ }
3521
+
3522
+
3523
+ /* --------------------------------------------------------------------------
3524
+ WIDTH
3525
+ -------------------------------------------------------------------------- */
3526
+
3527
+ .btn-full {
3528
+ width: 100%;
3529
+ }
3530
+
3531
+
3532
+ /* --------------------------------------------------------------------------
3533
+ ICON-ONLY
3534
+ -------------------------------------------------------------------------- */
3535
+
3536
+ .btn-icon-only {
3537
+ aspect-ratio: 1;
3538
+ padding-inline: 0;
3539
+ }
3540
+
3541
+
3542
+ /* --------------------------------------------------------------------------
3543
+ LOADING
3544
+ -------------------------------------------------------------------------- */
3545
+
3546
+ .btn-loading {
3547
+ cursor: wait;
3548
+ pointer-events: none;
3549
+ }
3550
+
3551
+
3552
+ /* --------------------------------------------------------------------------
3553
+ REDUCED MOTION
3554
+ -------------------------------------------------------------------------- */
3555
+
3556
+ @media (prefers-reduced-motion: reduce) {
3557
+ .btn {
3558
+ transition: none;
3559
+ }
3560
+ }
3561
+
3562
+ /* ==========================================================================
3563
+ EDITORIAL & COMPOSITION
3564
+ Semantic composition primitives for marketing, editorial, and agency sites.
3565
+ These are framework-agnostic and consume canonical Loba tokens.
3566
+ ========================================================================== */
3567
+ /* --------------------------------------------------------------------------
3568
+ ACCORDION
3569
+ -------------------------------------------------------------------------- */
3570
+
3571
+ .accordion {
3572
+ width: 100%;
3353
3573
  }
3354
3574
 
3355
3575
 
3576
+ /* --------------------------------------------------------------------------
3577
+ ACCORDION ITEM
3578
+ -------------------------------------------------------------------------- */
3579
+
3580
+ .accordion-item {
3581
+ width: 100%;
3582
+ }
3583
+
3584
+
3585
+ /* --------------------------------------------------------------------------
3586
+ ACCORDION TRIGGER
3587
+ -------------------------------------------------------------------------- */
3588
+
3589
+ .accordion-trigger {
3590
+ width: 100%;
3591
+ display: flex;
3592
+ align-items: center;
3593
+ justify-content: space-between;
3594
+ gap: var(--space-4);
3595
+
3596
+ padding-block: var(--space-5);
3597
+
3598
+ background: none;
3599
+ border: 0;
3600
+ border-bottom: 1px solid var(--border-subtle);
3601
+
3602
+ color: var(--text-primary);
3603
+ font-family: var(--font-family-body);
3604
+ font-size: var(--font-size-base);
3605
+ font-weight: var(--font-weight-semibold);
3606
+ text-align: left;
3607
+
3608
+ cursor: pointer;
3609
+ transition: var(--transition-fast);
3610
+ }
3611
+
3612
+ .accordion-trigger:hover {
3613
+ color: var(--text-accent);
3614
+ }
3615
+
3616
+ .accordion-trigger:focus-visible {
3617
+ outline: var(--focus-ring-width) solid var(--form-border-focus);
3618
+ outline-offset: var(--focus-ring-offset);
3619
+ }
3620
+
3621
+ .accordion-trigger:disabled {
3622
+ color: var(--text-muted);
3623
+ cursor: not-allowed;
3624
+ }
3625
+
3626
+
3627
+ /* --------------------------------------------------------------------------
3628
+ ACCORDION CONTENT
3629
+ -------------------------------------------------------------------------- */
3630
+
3631
+ .accordion-content {
3632
+ padding-block: var(--space-5);
3633
+ color: var(--text-secondary);
3634
+ }
3635
+ /* -------------------------------------------------------------------------
3636
+ DIVIDER
3637
+ --------------------------------------------------------------------------- */
3638
+ .divider {
3639
+ width: 100%;
3640
+ border-top: 1px solid var(--border-subtle);
3641
+ }
3642
+ /* --------------------------------------------------------------------------
3643
+ EYEBROW
3644
+ -------------------------------------------------------------------------- */
3645
+
3646
+ .eyebrow {
3647
+ display: inline-flex;
3648
+ align-items: center;
3649
+ gap: var(--space-2);
3650
+ width: fit-content;
3651
+
3652
+ color: var(--text-accent);
3653
+ font-family: var(--font-family-body);
3654
+ font-size: var(--font-size-xs);
3655
+ font-weight: var(--font-weight-semibold);
3656
+ line-height: 1;
3657
+ letter-spacing: var(--letter-spacing-wider);
3658
+ text-transform: uppercase;
3659
+ }
3660
+
3661
+ .eyebrow::before {
3662
+ content: "";
3663
+
3664
+ width: 0.375rem;
3665
+ height: 0.375rem;
3666
+ flex: 0 0 auto;
3667
+
3668
+ border-radius: var(--radius-full);
3669
+ background: var(--brand-primary);
3670
+ }
3671
+
3672
+
3673
+ /* --------------------------------------------------------------------------
3674
+ LABEL
3675
+ -------------------------------------------------------------------------- */
3676
+
3677
+ .label {
3678
+ display: inline-block;
3679
+
3680
+ color: var(--text-muted);
3681
+ font-family: var(--font-family-body);
3682
+ font-size: var(--font-size-xs);
3683
+ font-weight: var(--font-weight-semibold);
3684
+ line-height: var(--line-height-snug);
3685
+ letter-spacing: var(--letter-spacing-wide);
3686
+ text-transform: uppercase;
3687
+ }
3688
+
3689
+
3690
+ /* --------------------------------------------------------------------------
3691
+ SECTION HEADER
3692
+ -------------------------------------------------------------------------- */
3693
+
3694
+ .section-header {
3695
+ display: flex;
3696
+ flex-direction: column;
3697
+ align-items: flex-start;
3698
+ gap: var(--stack-gap);
3699
+
3700
+ max-width: 45rem;
3701
+ margin-bottom: var(--space-12);
3702
+ }
3703
+
3704
+ .section-header--wide {
3705
+ max-width: 62.5rem;
3706
+ }
3707
+
3708
+ .section-header--center {
3709
+ align-items: center;
3710
+ margin-inline: auto;
3711
+ text-align: center;
3712
+ }
3713
+
3714
+ .section-header--center .section-description {
3715
+ margin-inline: auto;
3716
+ }
3717
+
3718
+
3719
+ /* --------------------------------------------------------------------------
3720
+ SECTION TITLE
3721
+ -------------------------------------------------------------------------- */
3722
+
3723
+ .section-title {
3724
+ margin: 0;
3725
+
3726
+ max-width: 18ch;
3727
+
3728
+ color: var(--text-primary);
3729
+ font-family: var(--font-family-display);
3730
+ font-size: clamp(
3731
+ var(--font-size-3xl),
3732
+ 4vw,
3733
+ var(--font-size-5xl)
3734
+ );
3735
+ font-weight: var(--font-weight-bold);
3736
+ line-height: var(--line-height-tight);
3737
+ letter-spacing: var(--letter-spacing-tight);
3738
+
3739
+ text-wrap: balance;
3740
+ }
3741
+
3742
+ .section-header--wide .section-title {
3743
+ max-width: 24ch;
3744
+ }
3745
+
3746
+
3747
+ /* --------------------------------------------------------------------------
3748
+ SECTION DESCRIPTION
3749
+ -------------------------------------------------------------------------- */
3750
+
3751
+ .section-description {
3752
+ max-width: var(--content-width-narrow);
3753
+ margin: 0;
3754
+
3755
+ color: var(--text-secondary);
3756
+ font-family: var(--font-family-body);
3757
+ font-size: var(--font-size-base);
3758
+ font-weight: var(--font-weight-regular);
3759
+ line-height: var(--line-height-relaxed);
3760
+
3761
+ text-wrap: pretty;
3762
+ }
3763
+
3764
+
3765
+ /* --------------------------------------------------------------------------
3766
+ LEAD / LARGE BODY
3767
+ -------------------------------------------------------------------------- */
3768
+
3769
+ .lead {
3770
+ max-width: 42rem;
3771
+ margin: 0;
3772
+
3773
+ color: var(--text-secondary);
3774
+ font-family: var(--font-family-body);
3775
+ font-size: clamp(
3776
+ var(--font-size-lg),
3777
+ 2vw,
3778
+ var(--font-size-xl)
3779
+ );
3780
+ font-weight: var(--font-weight-regular);
3781
+ line-height: var(--line-height-relaxed);
3782
+
3783
+ text-wrap: pretty;
3784
+ }
3785
+
3786
+ .body-large {
3787
+ color: var(--text-secondary);
3788
+ font-family: var(--font-family-body);
3789
+ font-size: var(--font-size-lg);
3790
+ line-height: var(--line-height-relaxed);
3791
+ }
3792
+
3793
+
3794
+ /* --------------------------------------------------------------------------
3795
+ BUTTON GROUP
3796
+ -------------------------------------------------------------------------- */
3797
+
3798
+ .button-group {
3799
+ display: flex;
3800
+ flex-wrap: wrap;
3801
+ align-items: center;
3802
+ gap: var(--inline-gap);
3803
+ }
3804
+
3805
+ .button-group--center {
3806
+ justify-content: center;
3807
+ }
3808
+
3809
+ .button-group--end {
3810
+ justify-content: flex-end;
3811
+ }
3812
+
3813
+ .button-group--stack {
3814
+ flex-direction: column;
3815
+ align-items: stretch;
3816
+ }
3817
+
3818
+
3819
+ /* --------------------------------------------------------------------------
3820
+ ARROW LINK
3821
+ -------------------------------------------------------------------------- */
3822
+
3823
+ .link-arrow {
3824
+ display: inline-flex;
3825
+ align-items: center;
3826
+ gap: var(--space-2);
3827
+
3828
+ width: fit-content;
3829
+
3830
+ color: var(--text-primary);
3831
+ font-family: var(--font-family-body);
3832
+ font-size: var(--font-size-sm);
3833
+ font-weight: var(--font-weight-semibold);
3834
+ line-height: 1;
3835
+ text-decoration: none;
3836
+
3837
+ transition:
3838
+ color var(--motion-duration-fast) var(--motion-ease-out),
3839
+ gap var(--motion-duration-fast) var(--motion-ease-out);
3840
+ }
3841
+
3842
+ .link-arrow::after {
3843
+ content: "→";
3844
+
3845
+ transition:
3846
+ transform var(--motion-duration-fast) var(--motion-ease-out);
3847
+ }
3848
+
3849
+ .link-arrow:hover {
3850
+ gap: var(--space-3);
3851
+ color: var(--text-accent);
3852
+ }
3853
+
3854
+ .link-arrow:hover::after {
3855
+ transform: translateX(0.1875rem);
3856
+ }
3857
+
3858
+ .link-arrow:focus-visible {
3859
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
3860
+ outline-offset: var(--focus-ring-offset);
3861
+ border-radius: var(--radius-sm);
3862
+ }
3863
+
3864
+
3865
+ .media {
3866
+ position: relative;
3867
+ overflow: hidden;
3868
+ }
3869
+
3870
+ .media img,
3871
+ .media video {
3872
+ display: block;
3873
+ width: 100%;
3874
+ height: 100%;
3875
+ object-fit: cover;
3876
+ border-radius: var(--media-radius);
3877
+ }
3878
+
3879
+ .media-square {
3880
+ aspect-ratio: 1 / 1;
3881
+ }
3882
+
3883
+ .media-video {
3884
+ aspect-ratio: 16 / 9;
3885
+ }
3886
+
3887
+ .media-portrait {
3888
+ aspect-ratio: 4 / 5;
3889
+ }
3890
+
3891
+ .media-wide {
3892
+ aspect-ratio: 21 / 9;
3893
+ }
3894
+
3895
+ .media-contain img,
3896
+ .media-contain video {
3897
+ object-fit: contain;
3898
+ }
3899
+
3900
+
3901
+ /* --------------------------------------------------------------------------
3902
+ PROSE
3903
+ -------------------------------------------------------------------------- */
3904
+
3905
+ .prose {
3906
+ max-width: var(--content-width-narrow);
3907
+
3908
+ color: var(--text-secondary);
3909
+ font-family: var(--font-family-body);
3910
+ font-size: var(--font-size-base);
3911
+ line-height: var(--line-height-relaxed);
3912
+ }
3913
+
3914
+ .prose > * + * {
3915
+ margin-top: var(--space-6);
3916
+ }
3917
+
3918
+ .prose h2,
3919
+ .prose h3,
3920
+ .prose h4 {
3921
+ color: var(--text-primary);
3922
+ font-family: var(--font-family-display);
3923
+ letter-spacing: var(--letter-spacing-tight);
3924
+ }
3925
+
3926
+ .prose h2 {
3927
+ font-size: var(--font-size-3xl);
3928
+ line-height: var(--line-height-tight);
3929
+ }
3930
+
3931
+ .prose h3 {
3932
+ font-size: var(--font-size-2xl);
3933
+ line-height: var(--line-height-tight);
3934
+ }
3935
+
3936
+ .prose h4 {
3937
+ font-size: var(--font-size-xl);
3938
+ line-height: var(--line-height-snug);
3939
+ }
3940
+
3941
+ .prose a {
3942
+ color: var(--text-link);
3943
+ text-decoration: underline;
3944
+ text-underline-offset: 0.2em;
3945
+ }
3946
+
3947
+ .prose a:hover {
3948
+ color: var(--text-link-hover);
3949
+ }
3950
+
3951
+ .prose ul,
3952
+ .prose ol {
3953
+ padding-left: var(--space-6);
3954
+ }
3955
+
3956
+ .prose li + li {
3957
+ margin-top: var(--space-2);
3958
+ }
3959
+
3960
+
3961
+ /* --------------------------------------------------------------------------
3962
+ RESPONSIVE
3963
+ -------------------------------------------------------------------------- */
3964
+
3965
+ @media (max-width: 768px) {
3966
+ .section-header {
3967
+ margin-bottom: var(--space-8);
3968
+ }
3969
+
3970
+ .section-title {
3971
+ max-width: 100%;
3972
+ font-size: var(--font-size-3xl);
3973
+ }
3974
+
3975
+ .section-header--wide .section-title {
3976
+ max-width: 100%;
3977
+ }
3978
+
3979
+ .button-group--stack-mobile {
3980
+ flex-direction: column;
3981
+ align-items: stretch;
3982
+ }
3983
+
3984
+ .button-group--stack-mobile > .btn {
3985
+ width: 100%;
3986
+ }
3987
+ }
3988
+
3989
+ /* ==========================================================================
3990
+ SURFACES
3991
+ Visual layering / treatment.
3992
+ Surface does not own content padding.
3993
+ ========================================================================== */
3994
+
3995
+ .surface {
3996
+ width: 100%;
3997
+ }
3998
+
3999
+ .surface-base {
4000
+ background: var(--surface-base);
4001
+ }
4002
+
4003
+ .surface-raised {
4004
+ background: var(--surface-raised);
4005
+ }
4006
+
4007
+ .surface-card {
4008
+ background: var(--surface-card);
4009
+ }
4010
+
4011
+ .surface-elevated-1 {
4012
+ background: var(--surface-elevated-1);
4013
+ }
4014
+
4015
+ .surface-elevated-2 {
4016
+ background: var(--surface-elevated-2);
4017
+ }
4018
+
4019
+ .surface-elevated-3 {
4020
+ background: var(--surface-elevated-3);
4021
+ }
4022
+
4023
+
4024
+ /* --------------------------------------------------------------------------
4025
+ SURFACE EFFECTS
4026
+ -------------------------------------------------------------------------- */
4027
+
4028
+ .surface-glass {
4029
+ background: var(--glass-background);
4030
+ border: 1px solid var(--glass-border);
4031
+
4032
+ backdrop-filter:
4033
+ blur(var(--glass-blur))
4034
+ saturate(var(--glass-saturate));
4035
+
4036
+ -webkit-backdrop-filter:
4037
+ blur(var(--glass-blur))
4038
+ saturate(var(--glass-saturate));
4039
+
4040
+ box-shadow:
4041
+ var(
4042
+ --card-highlight,
4043
+ inset 0 1px 0 0 rgb(255 255 255 / 0.08)
4044
+ );
4045
+ }
4046
+
4047
+ .surface-glass-strong {
4048
+ background: var(--surface-glass-strong);
4049
+ border: 1px solid var(--glass-border);
4050
+
4051
+ backdrop-filter:
4052
+ blur(var(--glass-blur))
4053
+ saturate(var(--glass-saturate));
4054
+
4055
+ -webkit-backdrop-filter:
4056
+ blur(var(--glass-blur))
4057
+ saturate(var(--glass-saturate));
4058
+
4059
+ box-shadow:
4060
+ var(
4061
+ --card-highlight,
4062
+ inset 0 1px 0 0 rgb(255 255 255 / 0.08)
4063
+ );
4064
+ }
4065
+
4066
+
4067
+ /* ==========================================================================
4068
+ CARDS
4069
+ Content container / grouping primitive.
4070
+ ========================================================================== */
4071
+
4072
+ .card {
4073
+ width: 100%;
4074
+ padding: var(--card-padding);
4075
+ border-radius: var(--card-radius);
4076
+
4077
+ background: var(--card-background);
4078
+ color: var(--text-primary);
4079
+ }
4080
+
4081
+
4082
+ /* --------------------------------------------------------------------------
4083
+ VARIANTS
4084
+ -------------------------------------------------------------------------- */
4085
+
4086
+ .card-default {
4087
+ border: 1px solid transparent;
4088
+ }
4089
+
4090
+ .card-outlined {
4091
+ border: 1px solid var(--card-border);
4092
+ }
4093
+
4094
+ .card-elevated {
4095
+ border: 1px solid var(--card-border);
4096
+ box-shadow: var(--shadow-elevation-medium);
4097
+ }
4098
+
4099
+ .card-interactive {
4100
+ border: 1px solid var(--card-border);
4101
+
4102
+ transition:
4103
+ border-color
4104
+ var(--motion-duration-normal)
4105
+ var(--motion-ease-out),
4106
+ box-shadow
4107
+ var(--motion-duration-normal)
4108
+ var(--motion-ease-out),
4109
+ transform
4110
+ var(--motion-duration-normal)
4111
+ var(--motion-ease-out);
4112
+ }
4113
+
4114
+ .card-interactive:hover {
4115
+ border-color: var(--card-border-hover);
4116
+ box-shadow: var(--shadow-elevation-medium);
4117
+ transform: translateY(var(--interaction-lift));
4118
+ }
4119
+
4120
+ .card-interactive:focus-visible {
4121
+ outline:
4122
+ var(--focus-ring-width)
4123
+ solid
4124
+ var(--focus-ring-color);
4125
+
4126
+ outline-offset: var(--focus-ring-offset);
4127
+ }
4128
+
4129
+ .card-selected {
4130
+ border: 1px solid var(--border-focus);
4131
+ box-shadow: var(--shadow-elevation-low);
4132
+ }
4133
+
4134
+
4135
+ /* --------------------------------------------------------------------------
4136
+ REDUCED MOTION
4137
+ -------------------------------------------------------------------------- */
4138
+
4139
+ @media (prefers-reduced-motion: reduce) {
4140
+ .card-interactive {
4141
+ transition: none;
4142
+ }
4143
+
4144
+ .card-interactive:hover {
4145
+ transform: none;
4146
+ }
4147
+ }
4148
+
4149
+
4150
+
4151
+ /* ==========================================================================
4152
+ BADGES
4153
+ ========================================================================== */
4154
+
4155
+ .badge {
4156
+ display: inline-flex;
4157
+ align-items: center;
4158
+ gap: var(--badge-gap);
4159
+ width: fit-content;
4160
+
4161
+ min-height: var(--badge-min-height);
4162
+ padding: var(--badge-padding-y) var(--badge-padding-x);
4163
+
4164
+ background: var(--badge-background);
4165
+ border: 1px solid var(--badge-border);
4166
+ border-radius: var(--badge-radius);
4167
+
4168
+ color: var(--badge-text);
4169
+ font-family: var(--font-family-body);
4170
+ font-size: var(--font-size-xs);
4171
+ font-weight: var(--font-weight-medium);
4172
+ line-height: 1;
4173
+
4174
+ white-space: nowrap;
4175
+ }
4176
+
4177
+
4178
+ /* --------------------------------------------------------------------------
4179
+ VARIANTS
4180
+ -------------------------------------------------------------------------- */
4181
+
4182
+ .badge-default {
4183
+ background: var(--badge-default-background);
4184
+ border-color: var(--badge-default-border);
4185
+ color: var(--badge-default-text);
4186
+ }
4187
+
4188
+ .badge-success {
4189
+ background: var(--badge-success-background);
4190
+ border-color: var(--badge-success-border);
4191
+ color: var(--badge-success-text);
4192
+ }
4193
+
4194
+ .badge-warning {
4195
+ background: var(--badge-warning-background);
4196
+ border-color: var(--badge-warning-border);
4197
+ color: var(--badge-warning-text);
4198
+ }
4199
+
4200
+ .badge-danger {
4201
+ background: var(--badge-danger-background);
4202
+ border-color: var(--badge-danger-border);
4203
+ color: var(--badge-danger-text);
4204
+ }
4205
+
4206
+ .badge-info {
4207
+ background: var(--badge-info-background);
4208
+ border-color: var(--badge-info-border);
4209
+ color: var(--badge-info-text);
4210
+ }
4211
+
4212
+ .badge-brand {
4213
+ background: var(--badge-brand-background);
4214
+ border-color: var(--badge-brand-border);
4215
+ color: var(--badge-brand-text);
4216
+ }
4217
+ /* ========================================================================
4218
+ TAGS
4219
+ ======================================================================== */
4220
+
4221
+ .tag {
4222
+ display: inline-flex;
4223
+ align-items: center;
4224
+ gap: var(--tag-gap);
4225
+ width: fit-content;
4226
+
4227
+ min-height: var(--tag-min-height);
4228
+ padding: var(--tag-padding-y) var(--tag-padding-x);
4229
+
4230
+ background: var(--tag-background);
4231
+ border: 1px solid var(--tag-border);
4232
+ border-radius: var(--tag-radius);
4233
+
4234
+ color: var(--tag-text);
4235
+ font-family: var(--font-family-body);
4236
+ font-size: var(--font-size-xs);
4237
+ font-weight: var(--font-weight-medium);
4238
+ line-height: 1;
4239
+
4240
+ white-space: nowrap;
4241
+ }
4242
+ /* ==========================================================================
4243
+ NAVBAR
4244
+ ========================================================================== */
4245
+
4246
+ .navbar {
4247
+ position: fixed;
4248
+ top: 0;
4249
+ left: 0;
4250
+ right: 0;
4251
+ height: var(--nav-height);
4252
+ background: var(--nav-background);
4253
+ border-bottom: 1px solid var(--nav-border);
4254
+ backdrop-filter: blur(var(--nav-blur));
4255
+ -webkit-backdrop-filter: blur(var(--nav-blur));
4256
+ z-index: var(--z-navbar);
4257
+ display: flex;
4258
+ align-items: center;
4259
+ padding-inline: var(--container-padding);
4260
+ }
4261
+
4262
+ .navbar-inner {
4263
+ display: flex;
4264
+ align-items: center;
4265
+ justify-content: space-between;
4266
+ width: 100%;
4267
+ max-width: var(--container-max-width);
4268
+ margin-inline: auto;
4269
+ }
4270
+
4271
+ .nav-link {
4272
+ color: var(--nav-link);
4273
+ text-decoration: none;
4274
+ font-size: var(--font-size-sm);
4275
+ font-weight: var(--font-weight-medium);
4276
+ transition: color var(--motion-duration-fast) ease;
4277
+ padding: 0.5rem 0.75rem;
4278
+ border-radius: var(--radius-md);
4279
+ }
4280
+
4281
+ .nav-link:hover {
4282
+ color: var(--nav-link-hover);
4283
+ }
4284
+
4285
+ .nav-link-active {
4286
+ color: var(--nav-link-active);
4287
+ }
4288
+ /* ==========================================================================
4289
+ SIDEBAR
4290
+ Premium application navigation
4291
+ ========================================================================== */
4292
+
4293
+ .sidebar {
4294
+ position: sticky;
4295
+ top: 0;
4296
+
4297
+ display: flex;
4298
+ flex-direction: column;
4299
+
4300
+ width: var(--sidebar-width, 16rem);
4301
+ height: 100vh;
4302
+
4303
+ flex: 0 0 auto;
4304
+
4305
+ background: var(--surface-raised);
4306
+ border-right: 1px solid var(--border-subtle);
4307
+
4308
+ color: var(--text-primary);
4309
+ }
4310
+
4311
+ .sidebar--collapsed {
4312
+ width: var(--sidebar-width-collapsed, 4.5rem);
4313
+ }
4314
+
4315
+
4316
+ /* ==========================================================================
4317
+ SIDEBAR REGIONS
4318
+ ========================================================================== */
4319
+
4320
+ .sidebar-header {
4321
+ flex: 0 0 auto;
4322
+
4323
+ padding: var(--space-5);
4324
+ }
4325
+
4326
+ .sidebar-navigation {
4327
+ display: flex;
4328
+ flex-direction: column;
4329
+ gap: var(--space-2);
4330
+
4331
+ flex: 1 1 auto;
4332
+ min-height: 0;
4333
+
4334
+ padding: var(--space-3) var(--space-3);
4335
+
4336
+ overflow-y: auto;
4337
+ overflow-x: hidden;
4338
+
4339
+ scrollbar-width: thin;
4340
+ scrollbar-color:
4341
+ var(--border-default)
4342
+ transparent;
4343
+ }
4344
+
4345
+ .sidebar-footer {
4346
+ flex: 0 0 auto;
4347
+
4348
+ padding: var(--space-3);
4349
+
4350
+ border-top: 1px solid var(--border-subtle);
4351
+ }
4352
+
4353
+
4354
+ /* ==========================================================================
4355
+ SIDEBAR GROUP
4356
+ ========================================================================== */
4357
+
4358
+ .sidebar-group {
4359
+ display: flex;
4360
+ flex-direction: column;
4361
+
4362
+ width: 100%;
4363
+ }
4364
+
4365
+ .sidebar-group + .sidebar-group {
4366
+ margin-top: var(--space-4);
4367
+ }
4368
+
4369
+ .sidebar-group-label {
4370
+ padding:
4371
+ var(--space-2)
4372
+ var(--space-3)
4373
+ var(--space-2);
4374
+
4375
+ color: var(--text-muted);
4376
+
4377
+ font-family: var(--font-family-body);
4378
+ font-size: var(--font-size-xs);
4379
+ font-weight: var(--font-weight-semibold);
4380
+ line-height: var(--line-height-normal);
4381
+ letter-spacing: var(--letter-spacing-wide);
4382
+
4383
+ text-transform: uppercase;
4384
+ }
4385
+
4386
+ .sidebar-group-items {
4387
+ display: flex;
4388
+ flex-direction: column;
4389
+ gap: var(--space-1);
4390
+ }
4391
+
4392
+
4393
+ /* ==========================================================================
4394
+ SIDEBAR ITEM
4395
+ ========================================================================== */
4396
+
4397
+ .sidebar-item-wrapper {
4398
+ display: flex;
4399
+ flex-direction: column;
4400
+
4401
+ width: 100%;
4402
+ }
4403
+
4404
+ .sidebar-item {
4405
+ position: relative;
4406
+
4407
+ display: flex;
4408
+ align-items: center;
4409
+
4410
+ width: 100%;
4411
+ min-height: 2.625rem;
4412
+
4413
+ padding:
4414
+ var(--space-2)
4415
+ var(--space-3);
4416
+
4417
+ border: 1px solid transparent;
4418
+ border-radius: var(--radius-md);
4419
+
4420
+ background: transparent;
4421
+ color: var(--text-secondary);
4422
+
4423
+ font-family: var(--font-family-body);
4424
+ font-size: var(--font-size-sm);
4425
+ font-weight: var(--font-weight-medium);
4426
+ line-height: var(--line-height-normal);
4427
+
4428
+ text-align: left;
4429
+ text-decoration: none;
4430
+
4431
+ cursor: pointer;
4432
+
4433
+ transition:
4434
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
4435
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
4436
+ color var(--motion-duration-fast) var(--motion-ease-out),
4437
+ transform var(--motion-duration-fast) var(--motion-ease-out);
4438
+ }
4439
+
4440
+ .sidebar-item:hover {
4441
+ background: var(--surface-hover);
4442
+ color: var(--text-primary);
4443
+ }
4444
+
4445
+ .sidebar-item:focus-visible {
4446
+ outline:
4447
+ var(--focus-ring-width)
4448
+ solid
4449
+ var(--focus-ring-color);
4450
+
4451
+ outline-offset: var(--focus-ring-offset);
4452
+ }
4453
+
4454
+ .sidebar-item--active {
4455
+ background: var(--surface-card);
4456
+ border-color: var(--border-subtle);
4457
+
4458
+ color: var(--text-primary);
4459
+ }
4460
+
4461
+ .sidebar-item--active::before {
4462
+ content: "";
4463
+
4464
+ position: absolute;
4465
+ top: 50%;
4466
+ left: 0;
4467
+
4468
+ width: 0.1875rem;
4469
+ height: 1.35rem;
4470
+
4471
+ border-radius: var(--radius-full);
4472
+
4473
+ background: var(--brand-primary);
4474
+
4475
+ transform: translateY(-50%);
4476
+ }
4477
+
4478
+ .sidebar-item--active:hover {
4479
+ background: var(--surface-hover);
4480
+ }
4481
+
4482
+ .sidebar-item--disabled {
4483
+ opacity: var(--interaction-opacity-disabled);
4484
+ cursor: not-allowed;
4485
+ pointer-events: none;
4486
+ }
4487
+
4488
+
4489
+ /* ==========================================================================
4490
+ ITEM CONTENT
4491
+ ========================================================================== */
4492
+
4493
+ .sidebar-item-icon {
4494
+ display: inline-flex;
4495
+ align-items: center;
4496
+ justify-content: center;
4497
+
4498
+ width: 1.25rem;
4499
+ height: 1.25rem;
4500
+
4501
+ flex: 0 0 auto;
4502
+
4503
+ color: currentColor;
4504
+ }
4505
+
4506
+ .sidebar-item-label {
4507
+ min-width: 0;
4508
+
4509
+ flex: 1 1 auto;
4510
+
4511
+ overflow: hidden;
4512
+
4513
+ white-space: nowrap;
4514
+ text-overflow: ellipsis;
4515
+ }
4516
+
4517
+ .sidebar-item-chevron {
4518
+ display: inline-flex;
4519
+ align-items: center;
4520
+ justify-content: center;
4521
+
4522
+ width: 1.25rem;
4523
+ height: 1.25rem;
4524
+
4525
+ flex: 0 0 auto;
4526
+
4527
+ margin-left: var(--space-2);
4528
+
4529
+ color: var(--text-muted);
4530
+ }
4531
+
4532
+ .sidebar-item-chevron > span {
4533
+ display: inline-flex;
4534
+
4535
+ font-size: var(--font-size-lg);
4536
+ line-height: 1;
4537
+
4538
+ transform: rotate(0deg);
4539
+
4540
+ transition:
4541
+ transform var(--motion-duration-fast) var(--motion-ease-out),
4542
+ color var(--motion-duration-fast) var(--motion-ease-out);
4543
+ }
4544
+
4545
+ .sidebar-item:hover .sidebar-item-chevron {
4546
+ color: var(--text-primary);
4547
+ }
4548
+
4549
+ .sidebar-item-chevron--expanded {
4550
+ transform: rotate(90deg);
4551
+ }
4552
+
4553
+
4554
+ /* ==========================================================================
4555
+ NESTED ITEMS
4556
+ ========================================================================== */
4557
+
4558
+ .sidebar-item-children {
4559
+ display: flex;
4560
+ flex-direction: column;
4561
+
4562
+ gap: var(--space-1);
4563
+
4564
+ margin-top: var(--space-1);
4565
+ margin-left: var(--space-3);
4566
+
4567
+ padding-left: var(--space-3);
4568
+
4569
+ border-left: 1px solid var(--border-subtle);
4570
+ }
4571
+
4572
+ .sidebar-item-children .sidebar-item {
4573
+ min-height: 2.375rem;
4574
+
4575
+ padding:
4576
+ var(--space-2)
4577
+ var(--space-3);
4578
+
4579
+ font-size: var(--font-size-sm);
4580
+ }
4581
+
4582
+
4583
+ /* ==========================================================================
4584
+ COLLAPSED SIDEBAR
4585
+ ========================================================================== */
4586
+
4587
+ .sidebar--collapsed .sidebar-header {
4588
+ padding-inline: var(--space-3);
4589
+ }
4590
+
4591
+ .sidebar--collapsed .sidebar-navigation {
4592
+ padding-inline: var(--space-2);
4593
+ }
4594
+
4595
+ .sidebar--collapsed .sidebar-footer {
4596
+ padding-inline: var(--space-2);
4597
+ }
4598
+
4599
+ .sidebar--collapsed .sidebar-group-label {
4600
+ display: none;
4601
+ }
4602
+
4603
+ .sidebar--collapsed .sidebar-item {
4604
+ justify-content: center;
4605
+
4606
+ padding-inline: var(--space-2);
4607
+ }
4608
+
4609
+ .sidebar--collapsed .sidebar-item-label,
4610
+ .sidebar--collapsed .sidebar-item-chevron {
4611
+ display: none;
4612
+ }
4613
+
4614
+ .sidebar--collapsed .sidebar-item-icon {
4615
+ width: 1.5rem;
4616
+ height: 1.5rem;
4617
+ }
4618
+
4619
+ .sidebar--collapsed .sidebar-item-children {
4620
+ display: none;
4621
+ }
4622
+
4623
+
4624
+ /* ==========================================================================
4625
+ SCROLLBAR
4626
+ ========================================================================== */
4627
+
4628
+ .sidebar-navigation::-webkit-scrollbar {
4629
+ width: 0.35rem;
4630
+ }
4631
+
4632
+ .sidebar-navigation::-webkit-scrollbar-track {
4633
+ background: transparent;
4634
+ }
4635
+
4636
+ .sidebar-navigation::-webkit-scrollbar-thumb {
4637
+ background: var(--border-default);
4638
+ border-radius: var(--radius-full);
4639
+ }
4640
+
4641
+ .sidebar-navigation::-webkit-scrollbar-thumb:hover {
4642
+ background: var(--border-strong);
4643
+ }
4644
+
4645
+
4646
+ /* ==========================================================================
4647
+ REDUCED MOTION
4648
+ ========================================================================== */
4649
+
4650
+ @media (prefers-reduced-motion: reduce) {
4651
+ .sidebar-item,
4652
+ .sidebar-item-chevron > span {
4653
+ transition: none;
4654
+ }
4655
+ }
4656
+ /* ==========================================================================
4657
+ TABS
4658
+ ========================================================================== */
4659
+
4660
+ .tabs {
4661
+ width: 100%;
4662
+ }
4663
+
4664
+ .tabs-list {
4665
+ display: flex;
4666
+ align-items: center;
4667
+ gap: var(--space-1);
4668
+
4669
+ width: 100%;
4670
+
4671
+ border-bottom: 1px solid var(--border-subtle);
4672
+
4673
+ overflow-x: auto;
4674
+ scrollbar-width: none;
4675
+ }
4676
+
4677
+ .tabs-list::-webkit-scrollbar {
4678
+ display: none;
4679
+ }
4680
+
4681
+ .tab {
4682
+ position: relative;
4683
+
4684
+ display: inline-flex;
4685
+ align-items: center;
4686
+ justify-content: center;
4687
+
4688
+ min-height: 2.75rem;
4689
+ padding: var(--space-2) var(--space-3);
4690
+
4691
+ border: 0;
4692
+ border-bottom: 2px solid transparent;
4693
+
4694
+ background: transparent;
4695
+ color: var(--text-muted);
4696
+
4697
+ font-family: var(--font-family-body);
4698
+ font-size: var(--font-size-sm);
4699
+ font-weight: var(--font-weight-medium);
4700
+ line-height: var(--line-height-normal);
4701
+
4702
+ white-space: nowrap;
4703
+
4704
+ cursor: pointer;
4705
+
4706
+ transition:
4707
+ color var(--motion-duration-fast) var(--motion-ease-out),
4708
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
4709
+ background-color var(--motion-duration-fast) var(--motion-ease-out);
4710
+ }
4711
+
4712
+ .tab:hover {
4713
+ color: var(--text-primary);
4714
+ background: var(--surface-hover);
4715
+ }
4716
+
4717
+ .tab:focus-visible {
4718
+ outline:
4719
+ var(--focus-ring-width)
4720
+ solid
4721
+ var(--focus-ring-color);
4722
+
4723
+ outline-offset: calc(var(--focus-ring-offset) * -1);
4724
+ }
4725
+
4726
+ .tab--active {
4727
+ color: var(--text-primary);
4728
+ border-bottom-color: var(--brand-primary);
4729
+ }
4730
+
4731
+ .tab--disabled {
4732
+ color: var(--text-muted);
4733
+ opacity: var(--interaction-opacity-disabled);
4734
+ cursor: not-allowed;
4735
+ pointer-events: none;
4736
+ }
4737
+
4738
+ .tab-panels {
4739
+ width: 100%;
4740
+ }
4741
+
4742
+ .tab-panel {
4743
+ width: 100%;
4744
+ }
4745
+
4746
+ @media (prefers-reduced-motion: reduce) {
4747
+ .tab {
4748
+ transition: none;
4749
+ }
4750
+ }
4751
+ /* ==========================================================================
4752
+ BREADCRUMBS
4753
+ ========================================================================== */
4754
+
4755
+ .breadcrumbs {
4756
+ display: flex;
4757
+ align-items: center;
4758
+
4759
+ width: 100%;
4760
+
4761
+ color: var(--text-muted);
4762
+
4763
+ font-family: var(--font-family-body);
4764
+ font-size: var(--font-size-sm);
4765
+ line-height: var(--line-height-normal);
4766
+
4767
+ overflow-x: auto;
4768
+ white-space: nowrap;
4769
+
4770
+ scrollbar-width: none;
4771
+ }
4772
+
4773
+ .breadcrumbs::-webkit-scrollbar {
4774
+ display: none;
4775
+ }
4776
+
4777
+ .breadcrumbs-list {
4778
+ display: inline-flex;
4779
+ align-items: center;
4780
+ gap: var(--space-2);
4781
+
4782
+ min-width: max-content;
4783
+ }
4784
+
4785
+ .breadcrumbs-item {
4786
+ display: inline-flex;
4787
+ align-items: center;
4788
+ gap: var(--space-2);
4789
+ }
4790
+
4791
+ .breadcrumbs-link {
4792
+ color: var(--text-muted);
4793
+ text-decoration: none;
4794
+
4795
+ transition:
4796
+ color var(--motion-duration-fast) var(--motion-ease-out);
4797
+ }
4798
+
4799
+ .breadcrumbs-link:hover {
4800
+ color: var(--text-primary);
4801
+ text-decoration: underline;
4802
+ text-underline-offset: 0.2em;
4803
+ }
4804
+
4805
+ .breadcrumbs-link:focus-visible {
4806
+ outline:
4807
+ var(--focus-ring-width)
4808
+ solid
4809
+ var(--focus-ring-color);
4810
+
4811
+ outline-offset: var(--focus-ring-offset);
4812
+ border-radius: var(--radius-sm);
4813
+ }
4814
+
4815
+ .breadcrumbs-separator {
4816
+ display: inline-flex;
4817
+ align-items: center;
4818
+ justify-content: center;
4819
+
4820
+ color: var(--text-muted);
4821
+
4822
+ user-select: none;
4823
+ }
4824
+
4825
+ .breadcrumbs-current {
4826
+ color: var(--text-primary);
4827
+ font-weight: var(--font-weight-medium);
4828
+
4829
+ overflow: hidden;
4830
+ text-overflow: ellipsis;
4831
+ }
4832
+
4833
+ .breadcrumbs-item:last-child .breadcrumbs-separator {
4834
+ display: none;
4835
+ }
4836
+ /* ==========================================================================
4837
+ LAYOUT PRIMITIVES
4838
+ Spacing system classes — use these instead of ad-hoc padding/margin/gap.
4839
+ ========================================================================== */
4840
+
4841
+ .container {
4842
+ max-width: var(--container-max-width);
4843
+ margin-inline: auto;
4844
+ padding-inline: var(--container-padding);
4845
+ }
4846
+
4847
+ .container-narrow {
4848
+ max-width: var(--container-narrow);
4849
+ margin-inline: auto;
4850
+ padding-inline: var(--container-padding);
4851
+ }
4852
+
4853
+ .section {
4854
+ padding-block: var(--section-spacing);
4855
+ }
4856
+
4857
+ .stack {
4858
+ display: flex;
4859
+ flex-direction: column;
4860
+ align-items: stretch;
4861
+ gap: var(--stack-gap);
4862
+ }
4863
+
4864
+ .stack-sm {
4865
+ display: flex;
4866
+ flex-direction: column;
4867
+ align-items: stretch;
4868
+ gap: var(--stack-gap-sm);
4869
+ }
4870
+
4871
+ .stack-lg {
4872
+ display: flex;
4873
+ flex-direction: column;
4874
+ align-items: stretch;
4875
+ gap: var(--stack-gap-lg);
4876
+ }
4877
+
4878
+ .stack-full {
4879
+ width: 100%;
4880
+ }
4881
+
4882
+ .inline {
4883
+ display: flex;
4884
+ flex-wrap: wrap;
4885
+ gap: var(--inline-gap);
4886
+ }
4887
+
4888
+ .inline-sm {
4889
+ display: flex;
4890
+ flex-wrap: wrap;
4891
+ gap: var(--inline-gap-sm);
4892
+ }
4893
+
4894
+ .inline-lg {
4895
+ display: flex;
4896
+ flex-wrap: wrap;
4897
+ gap: var(--inline-gap-lg);
4898
+ }
4899
+
4900
+ .grid {
4901
+ display: grid;
4902
+ gap: var(--grid-gap);
4903
+ }
4904
+
4905
+ .grid-sm {
4906
+ display: grid;
4907
+ gap: var(--grid-gap-sm);
4908
+ }
4909
+
4910
+ .grid-lg {
4911
+ display: grid;
4912
+ gap: var(--grid-gap-lg);
4913
+ }
4914
+
4915
+ .grid-cols-1 {
4916
+ grid-template-columns: repeat(1, minmax(0, 1fr));
4917
+ }
4918
+
4919
+ .grid-cols-2 {
4920
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4921
+ }
4922
+
4923
+ .grid-cols-3 {
4924
+ grid-template-columns: repeat(3, minmax(0, 1fr));
4925
+ }
4926
+
4927
+ .grid-cols-4 {
4928
+ grid-template-columns: repeat(4, minmax(0, 1fr));
4929
+ }
4930
+
4931
+ .grid-cols-5 {
4932
+ grid-template-columns: repeat(5, minmax(0, 1fr));
4933
+ }
4934
+
4935
+ .grid-cols-6 {
4936
+ grid-template-columns: repeat(6, minmax(0, 1fr));
4937
+ }
4938
+
4939
+ .grid-rows-1 {
4940
+ grid-template-rows: repeat(1, minmax(0, 1fr));
4941
+ }
4942
+
4943
+ .grid-rows-2 {
4944
+ grid-template-rows: repeat(2, minmax(0, 1fr));
4945
+ }
4946
+
4947
+ .grid-rows-3 {
4948
+ grid-template-rows: repeat(3, minmax(0, 1fr));
4949
+ }
4950
+
4951
+ .grid-rows-4 {
4952
+ grid-template-rows: repeat(4, minmax(0, 1fr));
4953
+ }
4954
+
4955
+ .grid-rows-5 {
4956
+ grid-template-rows: repeat(5, minmax(0, 1fr));
4957
+ }
4958
+
4959
+ .grid-rows-6 {
4960
+ grid-template-rows: repeat(6, minmax(0, 1fr));
4961
+ }
4962
+
4963
+ /* ==========================================================================
4964
+ SPACING UTILITIES
4965
+ Gap + padding helpers for custom composition. Use these to elevate
4966
+ layouts without writing ad-hoc inline styles — matching the gap/padding
4967
+ ergonomics of hand-rolled HTML/CSS.
4968
+ ========================================================================== */
4969
+
4970
+ /* ---- Gap (flex / grid) ---- */
4971
+ .gap-0 { gap: 0; }
4972
+ .gap-1 { gap: var(--space-1); }
4973
+ .gap-2 { gap: var(--space-2); }
4974
+ .gap-3 { gap: var(--space-3); }
4975
+ .gap-4 { gap: var(--space-4); }
4976
+ .gap-5 { gap: var(--space-5); }
4977
+ .gap-6 { gap: var(--space-6); }
4978
+ .gap-8 { gap: var(--space-8); }
4979
+ .gap-10 { gap: var(--space-10); }
4980
+ .gap-12 { gap: var(--space-12); }
4981
+ .gap-16 { gap: var(--space-16); }
4982
+
4983
+ .gap-x-2 { column-gap: var(--space-2); }
4984
+ .gap-x-4 { column-gap: var(--space-4); }
4985
+ .gap-x-6 { column-gap: var(--space-6); }
4986
+ .gap-x-8 { column-gap: var(--space-8); }
4987
+
4988
+ .gap-y-2 { row-gap: var(--space-2); }
4989
+ .gap-y-4 { row-gap: var(--space-4); }
4990
+ .gap-y-6 { row-gap: var(--space-6); }
4991
+ .gap-y-8 { row-gap: var(--space-8); }
4992
+
4993
+ /* ---- Padding (all sides) ---- */
4994
+ .p-0 { padding: 0; }
4995
+ .p-1 { padding: var(--space-1); }
4996
+ .p-2 { padding: var(--space-2); }
4997
+ .p-3 { padding: var(--space-3); }
4998
+ .p-4 { padding: var(--space-4); }
4999
+ .p-5 { padding: var(--space-5); }
5000
+ .p-6 { padding: var(--space-6); }
5001
+ .p-8 { padding: var(--space-8); }
5002
+ .p-10 { padding: var(--space-10); }
5003
+ .p-12 { padding: var(--space-12); }
5004
+
5005
+ /* ---- Padding (block axis) ---- */
5006
+ .py-0 { padding-block: 0; }
5007
+ .py-1 { padding-block: var(--space-1); }
5008
+ .py-2 { padding-block: var(--space-2); }
5009
+ .py-3 { padding-block: var(--space-3); }
5010
+ .py-4 { padding-block: var(--space-4); }
5011
+ .py-5 { padding-block: var(--space-5); }
5012
+ .py-6 { padding-block: var(--space-6); }
5013
+ .py-8 { padding-block: var(--space-8); }
5014
+ .py-10 { padding-block: var(--space-10); }
5015
+ .py-12 { padding-block: var(--space-12); }
5016
+ .py-16 { padding-block: var(--space-16); }
5017
+ .py-20 { padding-block: var(--space-20); }
5018
+ .py-24 { padding-block: var(--space-24); }
5019
+
5020
+ /* ---- Padding (inline axis) ---- */
5021
+ .px-0 { padding-inline: 0; }
5022
+ .px-1 { padding-inline: var(--space-1); }
5023
+ .px-2 { padding-inline: var(--space-2); }
5024
+ .px-3 { padding-inline: var(--space-3); }
5025
+ .px-4 { padding-inline: var(--space-4); }
5026
+ .px-5 { padding-inline: var(--space-5); }
5027
+ .px-6 { padding-inline: var(--space-6); }
5028
+ .px-8 { padding-inline: var(--space-8); }
5029
+ .px-10 { padding-inline: var(--space-10); }
5030
+ .px-12 { padding-inline: var(--space-12); }
5031
+
5032
+
5033
+ /* ==========================================================================
5034
+ TYPOGRAPHY UTILITIES
5035
+ A composable text vocabulary so every consumer (plain HTML/CSS or Vue
5036
+ composition) can make type breathe. Each class consumes the canonical
5037
+ @loba/design tokens directly — no new tokens, just exposes the scale.
5038
+ ========================================================================== */
5039
+
5040
+ /* ---- Body text sizes (each step carries tuned line-height) ---- */
5041
+ .text-xs { font-size: var(--font-size-xs); line-height: var(--line-height-snug); }
5042
+ .text-sm { font-size: var(--font-size-sm); line-height: var(--line-height-snug); }
5043
+ .text-md { font-size: var(--font-size-base); line-height: var(--line-height-normal); }
5044
+ .text-base { font-size: var(--font-size-base); line-height: var(--line-height-normal); }
5045
+ .text-lg { font-size: var(--font-size-lg); line-height: var(--line-height-relaxed); }
5046
+ .text-xl { font-size: var(--font-size-xl); line-height: var(--line-height-relaxed); }
5047
+ .text-2xl { font-size: var(--font-size-2xl); line-height: var(--line-height-snug); }
5048
+ .text-3xl { font-size: var(--font-size-3xl); line-height: var(--line-height-tight); }
5049
+ .text-4xl { font-size: var(--font-size-4xl); line-height: var(--line-height-tight); }
5050
+ .text-5xl { font-size: var(--font-size-5xl); line-height: var(--line-height-tight); }
5051
+ .text-6xl { font-size: var(--font-size-6xl); line-height: 1.05; }
5052
+
5053
+ /* ---- Display / heading scale (mirrors the Heading component) ---- */
5054
+ .heading-xs {
5055
+ font-family: var(--font-family-display);
5056
+ font-size: var(--font-size-lg);
5057
+ font-weight: var(--font-weight-semibold);
5058
+ line-height: var(--line-height-tight);
5059
+ letter-spacing: var(--letter-spacing-tight);
5060
+ color: var(--text-primary);
5061
+ }
5062
+ .heading-sm {
5063
+ font-family: var(--font-family-display);
5064
+ font-size: var(--font-size-xl);
5065
+ font-weight: var(--font-weight-bold);
5066
+ line-height: var(--line-height-tight);
5067
+ letter-spacing: var(--letter-spacing-tight);
5068
+ color: var(--text-primary);
5069
+ }
5070
+ .heading-md {
5071
+ font-family: var(--font-family-display);
5072
+ font-size: clamp(var(--font-size-xl), 3vw, var(--font-size-2xl));
5073
+ font-weight: var(--font-weight-bold);
5074
+ line-height: var(--line-height-tight);
5075
+ letter-spacing: var(--letter-spacing-tight);
5076
+ color: var(--text-primary);
5077
+ }
5078
+ .heading-lg {
5079
+ font-family: var(--font-family-display);
5080
+ font-size: clamp(var(--font-size-2xl), 4vw, var(--font-size-4xl));
5081
+ font-weight: var(--font-weight-bold);
5082
+ line-height: var(--line-height-tight);
5083
+ letter-spacing: var(--letter-spacing-tight);
5084
+ color: var(--text-primary);
5085
+ }
5086
+ .heading-xl {
5087
+ font-family: var(--font-family-display);
5088
+ font-size: clamp(var(--font-size-4xl), 6vw, var(--font-size-6xl));
5089
+ font-weight: var(--font-weight-bold);
5090
+ line-height: 1.05;
5091
+ letter-spacing: var(--letter-spacing-tight);
5092
+ color: var(--text-primary);
5093
+ }
5094
+
5095
+ /* ---- Text tone / color ---- */
5096
+ .text-primary { color: var(--text-primary); }
5097
+ .text-secondary { color: var(--text-secondary); }
5098
+ .text-muted { color: var(--text-muted); }
5099
+ .text-accent { color: var(--text-accent); }
5100
+ .text-inverse { color: var(--text-inverse); }
5101
+ .text-brand { color: var(--brand-primary); }
5102
+
5103
+ /* ---- Text wrap ---- */
5104
+ .text-balance { text-wrap: balance; }
5105
+ .text-pretty { text-wrap: pretty; }
5106
+
5107
+ /* ---- Leading (line-height) ---- */
5108
+ .leading-tight { line-height: var(--line-height-tight); }
5109
+ .leading-snug { line-height: var(--line-height-snug); }
5110
+ .leading-normal { line-height: var(--line-height-normal); }
5111
+ .leading-relaxed { line-height: var(--line-height-relaxed); }
5112
+ .leading-loose { line-height: var(--line-height-loose); }
5113
+
5114
+ /* ---- Tracking (letter-spacing) ---- */
5115
+ .tracking-tight { letter-spacing: var(--letter-spacing-tight); }
5116
+ .tracking-normal { letter-spacing: var(--letter-spacing-normal); }
5117
+ .tracking-wide { letter-spacing: var(--letter-spacing-wide); }
5118
+ .tracking-wider { letter-spacing: var(--letter-spacing-wider); }
5119
+ .tracking-widest { letter-spacing: var(--letter-spacing-widest); }
5120
+
5121
+ /* ---- Weight ---- */
5122
+ .font-light { font-weight: var(--font-weight-light); }
5123
+ .font-regular { font-weight: var(--font-weight-regular); }
5124
+ .font-medium { font-weight: var(--font-weight-medium); }
5125
+ .font-semibold { font-weight: var(--font-weight-semibold); }
5126
+ .font-bold { font-weight: var(--font-weight-bold); }
5127
+ .font-extrabold { font-weight: var(--font-weight-extrabold); }
5128
+
5129
+ /* ---- Case & style ---- */
5130
+ .uppercase { text-transform: uppercase; }
5131
+ .lowercase { text-transform: lowercase; }
5132
+ .capitalize { text-transform: capitalize; }
5133
+ .italic { font-style: italic; }
5134
+
5135
+
5136
+ /* ==========================================================================
5137
+ FORMS
5138
+ ========================================================================== */
5139
+ .form-field {
5140
+ width: 100%;
5141
+ display: flex;
5142
+ flex-direction: column;
5143
+ gap: var(--stack-gap-sm);
5144
+ }
5145
+
5146
+ /* ==========================================================================
5147
+ CHECKBOXES
5148
+ ========================================================================== */
5149
+
5150
+ .checkbox {
5151
+ display: inline-flex;
5152
+ align-items: center;
5153
+ gap: var(--space-2);
5154
+
5155
+ width: fit-content;
5156
+
5157
+ color: var(--form-text);
5158
+
5159
+ font-family: var(--font-family-body);
5160
+ font-size: var(--font-size-sm);
5161
+ line-height: var(--line-height-normal);
5162
+
5163
+ cursor: pointer;
5164
+ user-select: none;
5165
+ }
5166
+
5167
+ .checkbox-control {
5168
+ position: relative;
5169
+
5170
+ display: inline-flex;
5171
+ align-items: center;
5172
+ justify-content: center;
5173
+
5174
+ width: var(--icon-button-size-sm);
5175
+ height: var(--icon-button-size-sm);
5176
+
5177
+ flex: 0 0 auto;
5178
+
5179
+ border: 1px solid var(--form-border);
5180
+ border-radius: var(--radius-sm);
5181
+
5182
+ background: var(--form-background);
5183
+ color: var(--text-on-brand);
5184
+
5185
+ transition: var(--transition-fast);
5186
+ }
5187
+
5188
+ .checkbox-control::after {
5189
+ content: "✓";
5190
+
5191
+ font-size: var(--font-size-xs);
5192
+ font-weight: var(--font-weight-bold);
5193
+
5194
+ opacity: 0;
5195
+ transform: scale(0.7);
5196
+
5197
+ transition: var(--transition-fast);
5198
+ }
5199
+
5200
+ .checkbox:hover .checkbox-control {
5201
+ border-color: var(--form-border-hover);
5202
+ }
5203
+
5204
+ .checkbox--checked .checkbox-control {
5205
+ background: var(--brand-primary);
5206
+ border-color: var(--brand-primary);
5207
+ }
5208
+
5209
+ .checkbox--checked .checkbox-control::after {
5210
+ opacity: 1;
5211
+ transform: scale(1);
5212
+ }
5213
+
5214
+ .checkbox--disabled {
5215
+ opacity: var(--interaction-opacity-disabled);
5216
+ cursor: not-allowed;
5217
+ }
5218
+
5219
+ .checkbox:focus-within .checkbox-control {
5220
+ outline:
5221
+ var(--focus-ring-width)
5222
+ solid
5223
+ var(--focus-ring-color);
5224
+
5225
+ outline-offset: var(--focus-ring-offset);
5226
+ }
5227
+
5228
+
5229
+ /* ==========================================================================
5230
+ RADIO
5231
+ ========================================================================== */
5232
+
5233
+ .radio {
5234
+ display: inline-flex;
5235
+ align-items: center;
5236
+ gap: var(--space-2);
5237
+
5238
+ width: fit-content;
5239
+
5240
+ color: var(--form-text);
5241
+
5242
+ font-family: var(--font-family-body);
5243
+ font-size: var(--font-size-sm);
5244
+ line-height: var(--line-height-normal);
5245
+
5246
+ cursor: pointer;
5247
+ user-select: none;
5248
+ }
5249
+
5250
+ .radio-control {
5251
+ position: relative;
5252
+
5253
+ display: inline-flex;
5254
+ align-items: center;
5255
+ justify-content: center;
5256
+
5257
+ width: var(--icon-button-size-sm);
5258
+ height: var(--icon-button-size-sm);
5259
+
5260
+ flex: 0 0 auto;
5261
+
5262
+ border: 1px solid var(--form-border);
5263
+ border-radius: var(--radius-full);
5264
+
5265
+ background: var(--form-background);
5266
+
5267
+ transition: var(--transition-fast);
5268
+ }
5269
+
5270
+ .radio-control::after {
5271
+ content: "";
5272
+
5273
+ width: 0.5rem;
5274
+ height: 0.5rem;
5275
+
5276
+ border-radius: var(--radius-full);
5277
+
5278
+ background: var(--brand-primary);
5279
+
5280
+ opacity: 0;
5281
+ transform: scale(0.5);
5282
+
5283
+ transition: var(--transition-fast);
5284
+ }
5285
+
5286
+ .radio:hover .radio-control {
5287
+ border-color: var(--form-border-hover);
5288
+ }
5289
+
5290
+ .radio--checked .radio-control {
5291
+ border-color: var(--brand-primary);
5292
+ }
5293
+
5294
+ .radio--checked .radio-control::after {
5295
+ opacity: 1;
5296
+ transform: scale(1);
5297
+ }
5298
+
5299
+ .radio--disabled {
5300
+ opacity: var(--interaction-opacity-disabled);
5301
+ cursor: not-allowed;
5302
+ }
5303
+
5304
+ .radio:focus-within .radio-control {
5305
+ outline:
5306
+ var(--focus-ring-width)
5307
+ solid
5308
+ var(--focus-ring-color);
5309
+
5310
+ outline-offset: var(--focus-ring-offset);
5311
+ }
5312
+
5313
+
5314
+ /* ==========================================================================
5315
+ SWITCH
5316
+ ========================================================================== */
5317
+
5318
+ .switch {
5319
+ display: inline-flex;
5320
+ align-items: center;
5321
+ gap: var(--space-3);
5322
+
5323
+ width: fit-content;
5324
+
5325
+ color: var(--form-text);
5326
+
5327
+ font-family: var(--font-family-body);
5328
+ font-size: var(--font-size-sm);
5329
+ line-height: var(--line-height-normal);
5330
+
5331
+ cursor: pointer;
5332
+ user-select: none;
5333
+ }
5334
+
5335
+ .switch-control {
5336
+ position: relative;
5337
+
5338
+ width: 2.75rem;
5339
+ height: 1.5rem;
5340
+
5341
+ flex: 0 0 auto;
5342
+
5343
+ border: 1px solid var(--form-border);
5344
+ border-radius: var(--radius-full);
5345
+
5346
+ background: var(--form-background);
5347
+
5348
+ transition: var(--transition-fast);
5349
+ }
5350
+
5351
+ .switch-control::after {
5352
+ content: "";
5353
+
5354
+ position: absolute;
5355
+ top: 50%;
5356
+ left: 0.2rem;
5357
+
5358
+ width: 1rem;
5359
+ height: 1rem;
5360
+
5361
+ border-radius: var(--radius-full);
5362
+
5363
+ background: var(--text-muted);
5364
+
5365
+ transform: translateY(-50%);
5366
+
5367
+ transition:
5368
+ left var(--motion-duration-fast) var(--motion-ease-out),
5369
+ background-color var(--motion-duration-fast) var(--motion-ease-out);
5370
+ }
5371
+
5372
+ .switch:hover .switch-control {
5373
+ border-color: var(--form-border-hover);
5374
+ }
5375
+
5376
+ .switch--checked .switch-control {
5377
+ background: var(--brand-primary);
5378
+ border-color: var(--brand-primary);
5379
+ }
5380
+
5381
+ .switch--checked .switch-control::after {
5382
+ left: calc(100% - 1.2rem);
5383
+ background: var(--text-on-brand);
5384
+ }
5385
+
5386
+ .switch--disabled {
5387
+ opacity: var(--interaction-opacity-disabled);
5388
+ cursor: not-allowed;
5389
+ }
5390
+
5391
+ .switch:focus-within .switch-control {
5392
+ outline:
5393
+ var(--focus-ring-width)
5394
+ solid
5395
+ var(--focus-ring-color);
5396
+
5397
+ outline-offset: var(--focus-ring-offset);
5398
+ }
5399
+
5400
+
5401
+ /* ==========================================================================
5402
+ CHOICE GROUP
5403
+ ========================================================================== */
5404
+
5405
+ .choice-group {
5406
+ display: grid;
5407
+ gap: var(--space-2);
5408
+
5409
+ width: 100%;
5410
+ }
5411
+
5412
+ .choice {
5413
+ display: flex;
5414
+ align-items: center;
5415
+ justify-content: flex-start;
5416
+
5417
+ width: 100%;
5418
+ min-height: var(--button-min-height);
5419
+
5420
+ padding: var(--space-3) var(--space-4);
5421
+
5422
+ border: 1px solid var(--form-border);
5423
+ border-radius: var(--radius-md);
5424
+
5425
+ background: var(--form-background);
5426
+ color: var(--form-text);
5427
+
5428
+ font-family: var(--font-family-body);
5429
+ font-size: var(--font-size-sm);
5430
+ font-weight: var(--font-weight-medium);
5431
+
5432
+ text-align: left;
5433
+
5434
+ cursor: pointer;
5435
+ user-select: none;
5436
+
5437
+ transition:
5438
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
5439
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
5440
+ color var(--motion-duration-fast) var(--motion-ease-out),
5441
+ transform var(--motion-duration-fast) var(--motion-ease-out);
5442
+ }
5443
+
5444
+ .choice:hover {
5445
+ border-color: var(--form-border-hover);
5446
+ color: var(--text-primary);
5447
+ transform: translateY(var(--interaction-lift-sm));
5448
+ }
5449
+
5450
+ .choice--selected {
5451
+ background: var(--surface-raised);
5452
+ border-color: var(--brand-primary);
5453
+ color: var(--text-primary);
5454
+ }
5455
+
5456
+ .choice--disabled {
5457
+ opacity: var(--interaction-opacity-disabled);
5458
+ cursor: not-allowed;
5459
+ pointer-events: none;
5460
+ }
5461
+
5462
+ .choice:focus-visible {
5463
+ outline:
5464
+ var(--focus-ring-width)
5465
+ solid
5466
+ var(--focus-ring-color);
5467
+
5468
+ outline-offset: var(--focus-ring-offset);
5469
+ }
5470
+
5471
+ .choice-group--multiple .choice--selected {
5472
+ background: var(--brand-primary-muted);
5473
+ }
5474
+
5475
+
5476
+ /* --------------------------------------------------------------------------
5477
+ CHOICE GROUP LAYOUT
5478
+ -------------------------------------------------------------------------- */
5479
+
5480
+ .choice-group--grid-2 {
5481
+ grid-template-columns: repeat(2, minmax(0, 1fr));
5482
+ }
5483
+
5484
+ .choice-group--grid-3 {
5485
+ grid-template-columns: repeat(3, minmax(0, 1fr));
5486
+ }
5487
+
5488
+ .choice-group--grid-4 {
5489
+ grid-template-columns: repeat(4, minmax(0, 1fr));
5490
+ }
5491
+ /* ==========================================================================
5492
+ CUSTOM FORM CONTROL INPUTS
5493
+ Native inputs remain accessible but are visually hidden.
5494
+ ========================================================================== */
5495
+
5496
+ /* ==========================================================================
5497
+ CUSTOM FORM CONTROL INPUTS
5498
+ ========================================================================== */
5499
+
5500
+ .checkbox,
5501
+ .radio,
5502
+ .switch {
5503
+ position: relative;
5504
+ }
5505
+
5506
+ .checkbox > input,
5507
+ .radio > input,
5508
+ .switch > input {
5509
+ position: absolute;
5510
+
5511
+ width: 1px;
5512
+ height: 1px;
5513
+
5514
+ margin: 0;
5515
+ padding: 0;
5516
+
5517
+ opacity: 0;
5518
+
5519
+ appearance: none;
5520
+ -webkit-appearance: none;
5521
+
5522
+ pointer-events: none;
5523
+ }
5524
+ .checkbox,
5525
+ .radio,
5526
+ .switch {
5527
+ position: relative;
5528
+ }
5529
+
5530
+ .input,
5531
+ .textarea,
5532
+ .select {
5533
+ box-sizing: border-box;
5534
+ width: 100%;
5535
+ padding: var(--form-padding-y) var(--form-padding-x);
5536
+ background: var(--form-background);
5537
+ border: 1px solid var(--form-border);
5538
+ border-radius: var(--radius-md);
5539
+ color: var(--form-text);
5540
+ font-family: var(--font-family-body);
5541
+ font-size: var(--font-size-sm);
5542
+ line-height: 1.5;
5543
+ transition: var(--transition-fast);
5544
+ }
5545
+
5546
+ .input:hover,
5547
+ .textarea:hover,
5548
+ .select:hover {
5549
+ border-color: var(--form-border-hover);
5550
+ }
5551
+
5552
+ .input:focus,
5553
+ .textarea:focus,
5554
+ .select:focus {
5555
+ outline: var(--focus-ring-width) solid var(--form-border-focus);
5556
+ outline-offset: var(--focus-ring-offset);;
5557
+ border-color: var(--form-border-focus);
5558
+ }
5559
+
5560
+ .input::placeholder,
5561
+ .textarea::placeholder {
5562
+ color: var(--form-placeholder);
5563
+ }
5564
+
5565
+ .input:disabled,
5566
+ .textarea:disabled,
5567
+ .select:disabled {
5568
+ background: var(--form-bg-disabled);
5569
+ border-color: var(--form-border-disabled);
5570
+ color: var(--form-text-disabled);
5571
+ cursor: not-allowed;
5572
+ }
5573
+
5574
+ .textarea {
5575
+ min-height: 120px;
5576
+ resize: vertical;
5577
+ }
5578
+ /* Error */
5579
+ .input-error {
5580
+ border-color: var(--form-border-error);
5581
+ }
5582
+
5583
+ .input-error:hover {
5584
+ border-color: var(--form-border-error);
5585
+ }
5586
+
5587
+ .input-error:focus {
5588
+ outline: none;
5589
+ border-color: var(--form-border-error);
5590
+ box-shadow:
5591
+ 0 0 0 3px
5592
+ color-mix(
5593
+ in srgb,
5594
+ var(--form-border-error) 25%,
5595
+ transparent
5596
+ );
5597
+ }
5598
+
5599
+ /* Success */
5600
+ .input-success {
5601
+ border-color: var(--form-border-success);
5602
+ }
5603
+
5604
+ .input-success:hover {
5605
+ border-color: var(--form-border-success);
5606
+ }
5607
+
5608
+ .input-success:focus {
5609
+ outline: none;
5610
+ border-color: var(--form-border-success);
5611
+ box-shadow:
5612
+ 0 0 0 3px
5613
+ color-mix(
5614
+ in srgb,
5615
+ var(--form-border-success) 25%,
5616
+ transparent
5617
+ );
5618
+ }
5619
+ /* ==========================================================================
5620
+ DATA UI
5621
+ Application-oriented collection, list, pagination, and table patterns.
5622
+ Framework-agnostic. Consumes canonical Loba tokens.
5623
+ ========================================================================== */
5624
+
5625
+
5626
+ /* ==========================================================================
5627
+ EMPTY STATE
5628
+ ========================================================================== */
5629
+
5630
+ .empty-state {
5631
+ width: 100%;
5632
+ display: flex;
5633
+ flex-direction: column;
5634
+ align-items: center;
5635
+ justify-content: center;
5636
+
5637
+ gap: var(--stack-gap);
5638
+
5639
+ padding: var(--space-12);
5640
+ text-align: center;
5641
+ }
5642
+
5643
+ .empty-state-icon {
5644
+ display: flex;
5645
+ align-items: center;
5646
+ justify-content: center;
5647
+
5648
+ width: 3rem;
5649
+ height: 3rem;
5650
+
5651
+ color: var(--text-muted);
5652
+ }
5653
+
5654
+ .empty-state-content {
5655
+ display: flex;
5656
+ flex-direction: column;
5657
+ align-items: center;
5658
+ gap: var(--stack-gap-sm);
5659
+
5660
+ max-width: var(--text-max-width-sm);
5661
+ }
5662
+
5663
+ .empty-state-actions {
5664
+ display: flex;
5665
+ flex-wrap: wrap;
5666
+ align-items: center;
5667
+ justify-content: center;
5668
+ gap: var(--inline-gap);
5669
+
5670
+ margin-top: var(--space-2);
5671
+ }
5672
+
5673
+
5674
+ /* ==========================================================================
5675
+ LIST
5676
+ ========================================================================== */
5677
+
5678
+ .list {
5679
+ width: 100%;
5680
+ display: flex;
5681
+ flex-direction: column;
5682
+
5683
+ border-top: 1px solid var(--border-subtle);
5684
+ }
5685
+
5686
+ .list-item {
5687
+ position: relative;
5688
+
5689
+ display: flex;
5690
+ align-items: center;
5691
+
5692
+ width: 100%;
5693
+
5694
+ padding: var(--space-4) var(--space-5);
5695
+
5696
+ border-bottom: 1px solid var(--border-subtle);
5697
+
5698
+ background: transparent;
5699
+ color: var(--text-primary);
5700
+
5701
+ text-align: left;
5702
+
5703
+ transition:
5704
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
5705
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
5706
+ color var(--motion-duration-fast) var(--motion-ease-out);
5707
+ }
5708
+
5709
+
5710
+ /* --------------------------------------------------------------------------
5711
+ INTERACTIVE LIST ITEMS
5712
+ -------------------------------------------------------------------------- */
5713
+
5714
+ .list-item--selectable {
5715
+ cursor: pointer;
5716
+ }
5717
+
5718
+ .list-item--selectable:hover {
5719
+ background: var(--surface-hover);
5720
+ }
5721
+
5722
+ .list-item--selected {
5723
+ background: var(--surface-card);
5724
+ border-color: var(--border-default);
5725
+ }
5726
+
5727
+ .list-item--selected:hover {
5728
+ background: var(--surface-hover);
5729
+ }
5730
+
5731
+ .list-item--disabled {
5732
+ color: var(--text-muted);
5733
+ cursor: not-allowed;
5734
+ opacity: var(--interaction-opacity-disabled);
5735
+ }
5736
+
5737
+ .list-item--disabled:hover {
5738
+ background: transparent;
5739
+ }
5740
+
5741
+
5742
+ /* --------------------------------------------------------------------------
5743
+ LIST ITEM FOCUS
5744
+ -------------------------------------------------------------------------- */
5745
+
5746
+ .list-item--selectable:focus-visible {
5747
+ outline:
5748
+ var(--focus-ring-width)
5749
+ solid
5750
+ var(--focus-ring-color);
5751
+
5752
+ outline-offset: calc(var(--focus-ring-offset) * -1);
5753
+ z-index: 1;
5754
+ }
5755
+
5756
+
5757
+ /* ==========================================================================
5758
+ PAGINATION
5759
+ ========================================================================== */
5760
+
5761
+ .pagination {
5762
+ display: flex;
5763
+ align-items: center;
5764
+ gap: var(--space-4);
5765
+
5766
+ width: 100%;
5767
+ }
5768
+
5769
+ .pagination-controls {
5770
+ display: flex;
5771
+ align-items: center;
5772
+ gap: var(--space-1);
5773
+
5774
+ flex: 0 0 auto;
5775
+ }
5776
+
5777
+ .pagination-pages {
5778
+ display: flex;
5779
+ align-items: center;
5780
+ justify-content: center;
5781
+ gap: var(--space-1);
5782
+
5783
+ flex: 1 1 auto;
5784
+ }
5785
+ .pagination-item {
5786
+ display: inline-flex;
5787
+ align-items: center;
5788
+ justify-content: center;
5789
+
5790
+ min-width: var(--button-min-height);
5791
+ height: var(--button-min-height);
5792
+
5793
+ padding-inline: var(--space-3);
5794
+
5795
+ border: 1px solid transparent;
5796
+ border-radius: var(--radius-md);
5797
+
5798
+ background: transparent;
5799
+ color: var(--text-secondary);
5800
+
5801
+ font-family: var(--font-family-body);
5802
+ font-size: var(--font-size-sm);
5803
+ font-weight: var(--font-weight-medium);
5804
+
5805
+ cursor: pointer;
5806
+
5807
+ transition:
5808
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
5809
+ border-color var(--motion-duration-fast) var(--motion-ease-out),
5810
+ color var(--motion-duration-fast) var(--motion-ease-out);
5811
+ }
5812
+
5813
+ .pagination-item:hover {
5814
+ background: var(--surface-hover);
5815
+ color: var(--text-primary);
5816
+ }
5817
+
5818
+ .pagination-item:focus-visible {
5819
+ outline:
5820
+ var(--focus-ring-width)
5821
+ solid
5822
+ var(--focus-ring-color);
5823
+
5824
+ outline-offset: var(--focus-ring-offset);
5825
+ }
5826
+
5827
+ .pagination-item--current {
5828
+ background: var(--surface-card);
5829
+ border-color: var(--border-default);
5830
+ color: var(--text-primary);
5831
+ }
5832
+
5833
+ .pagination-item--disabled {
5834
+ color: var(--text-muted);
5835
+ opacity: var(--interaction-opacity-disabled);
5836
+ cursor: not-allowed;
5837
+ pointer-events: none;
5838
+ }
5839
+
5840
+ .pagination-ellipsis {
5841
+ display: inline-flex;
5842
+ align-items: center;
5843
+ justify-content: center;
5844
+
5845
+ min-width: var(--button-min-height);
5846
+ height: var(--button-min-height);
5847
+
5848
+ color: var(--text-muted);
5849
+ user-select: none;
5850
+ }
5851
+
5852
+ .pagination-compact {
5853
+ gap: var(--space-2);
5854
+ }
5855
+
5856
+ .pagination-compact .pagination-item {
5857
+ min-width: var(--button-min-height-sm);
5858
+ height: var(--button-min-height-sm);
5859
+
5860
+ padding-inline: var(--space-2);
5861
+
5862
+ font-size: var(--font-size-xs);
5863
+ }
5864
+
5865
+
5866
+ /* ==========================================================================
5867
+ TABLE
5868
+ ========================================================================== */
5869
+
5870
+ .table {
5871
+ width: 100%;
5872
+ overflow-x: auto;
5873
+
5874
+ border: 1px solid var(--border-default);
5875
+ border-radius: var(--card-radius);
5876
+
5877
+ background: var(--surface-card);
5878
+ }
5879
+
5880
+ .table table {
5881
+ width: 100%;
5882
+ border-collapse: collapse;
5883
+
5884
+ color: var(--text-primary);
5885
+
5886
+ font-family: var(--font-family-body);
5887
+ font-size: var(--font-size-sm);
5888
+ }
5889
+
5890
+
5891
+ /* --------------------------------------------------------------------------
5892
+ TABLE HEADER
5893
+ -------------------------------------------------------------------------- */
5894
+
5895
+ .table th {
5896
+ padding: var(--space-4) var(--space-5);
5897
+
5898
+ border-bottom: 1px solid var(--border-default);
5899
+
5900
+ background: var(--surface-raised);
5901
+ color: var(--text-muted);
5902
+
5903
+ font-size: var(--font-size-xs);
5904
+ font-weight: var(--font-weight-semibold);
5905
+ line-height: var(--line-height-snug);
5906
+ letter-spacing: var(--letter-spacing-wide);
5907
+ text-align: left;
5908
+ text-transform: uppercase;
5909
+
5910
+ white-space: nowrap;
5911
+ }
5912
+
5913
+ .table th:first-child {
5914
+ border-top-left-radius: calc(var(--card-radius) - 1px);
5915
+ }
5916
+
5917
+ .table th:last-child {
5918
+ border-top-right-radius: calc(var(--card-radius) - 1px);
5919
+ }
5920
+
5921
+
5922
+ /* --------------------------------------------------------------------------
5923
+ SORTABLE HEADERS
5924
+ -------------------------------------------------------------------------- */
5925
+
5926
+ .table-header--sortable {
5927
+ cursor: pointer;
5928
+ user-select: none;
5929
+
5930
+ transition:
5931
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
5932
+ color var(--motion-duration-fast) var(--motion-ease-out);
5933
+ }
5934
+
5935
+ .table-header--sortable:hover {
5936
+ background: var(--surface-hover);
5937
+ color: var(--text-primary);
5938
+ }
5939
+
5940
+ .table-header--sorted {
5941
+ color: var(--text-primary);
5942
+ }
5943
+
5944
+ .table-header--sortable:focus-visible {
5945
+ outline:
5946
+ var(--focus-ring-width)
5947
+ solid
5948
+ var(--focus-ring-color);
5949
+
5950
+ outline-offset: calc(var(--focus-ring-offset) * -1);
5951
+ }
5952
+
5953
+
5954
+ /* --------------------------------------------------------------------------
5955
+ TABLE BODY
5956
+ -------------------------------------------------------------------------- */
5957
+
5958
+ .table td {
5959
+ padding: var(--space-4) var(--space-5);
5960
+
5961
+ border-bottom: 1px solid var(--border-subtle);
5962
+
5963
+ color: var(--text-secondary);
5964
+
5965
+ vertical-align: middle;
5966
+ }
5967
+
5968
+ .table tbody tr {
5969
+ transition:
5970
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
5971
+ color var(--motion-duration-fast) var(--motion-ease-out);
5972
+ }
5973
+
5974
+ .table tbody tr:hover {
5975
+ background: var(--surface-hover);
5976
+ }
5977
+
5978
+ .table tbody tr:last-child td {
5979
+ border-bottom: 0;
5980
+ }
5981
+
5982
+
5983
+ /* --------------------------------------------------------------------------
5984
+ TABLE SELECTED ROW
5985
+ -------------------------------------------------------------------------- */
5986
+
5987
+ .table-row--selected {
5988
+ background: var(--surface-raised);
5989
+ }
5990
+
5991
+ .table-row--selected:hover {
5992
+ background: var(--surface-hover);
5993
+ }
5994
+
5995
+
5996
+ /* --------------------------------------------------------------------------
5997
+ TABLE DISABLED ROW
5998
+ -------------------------------------------------------------------------- */
5999
+
6000
+ .table-row--disabled {
6001
+ opacity: var(--interaction-opacity-disabled);
6002
+ }
6003
+
6004
+ .table-row--disabled:hover {
6005
+ background: transparent;
6006
+ }
6007
+
6008
+
6009
+ /* --------------------------------------------------------------------------
6010
+ TABLE ALIGNMENT
6011
+ -------------------------------------------------------------------------- */
6012
+
6013
+ .table-cell--center {
6014
+ text-align: center;
6015
+ }
6016
+
6017
+ .table-cell--end {
6018
+ text-align: right;
6019
+ }
6020
+
6021
+
6022
+ /* --------------------------------------------------------------------------
6023
+ TABLE LOADING
6024
+ -------------------------------------------------------------------------- */
6025
+
6026
+ .table-loading {
6027
+ position: relative;
6028
+ min-height: 10rem;
6029
+ }
6030
+
6031
+ .table-loading::after {
6032
+ content: "";
6033
+
6034
+ position: absolute;
6035
+ inset: 0;
6036
+
6037
+ background: var(--surface-card);
6038
+
6039
+ opacity: 0.55;
6040
+
6041
+ pointer-events: none;
6042
+ }
6043
+
6044
+ /* --------------------------------------------------------------------------
6045
+ REDUCED MOTION
6046
+ -------------------------------------------------------------------------- */
6047
+
6048
+ @media (prefers-reduced-motion: reduce) {
6049
+ .list-item,
6050
+ .pagination-item,
6051
+ .table tbody tr,
6052
+ .table-header--sortable {
6053
+ transition: none;
6054
+ }
6055
+ }
6056
+ /* --------------------------------------------------------------------------
6057
+ OVERLAYS
6058
+ *---------------------------------------------------------------------------- */
6059
+ /* ==========================================================================
6060
+ DIALOG
6061
+ Focused task / decision overlay.
6062
+ ========================================================================== */
6063
+ .dialog {
6064
+ position: fixed;
6065
+ inset: 0;
6066
+ z-index: var(--z-modal);
6067
+
6068
+ display: flex;
6069
+ align-items: center;
6070
+ justify-content: center;
6071
+
6072
+ padding: var(--space-6);
6073
+
6074
+ pointer-events: none;
6075
+ }
6076
+
6077
+ .dialog-backdrop {
6078
+ position: absolute;
6079
+ inset: 0;
6080
+
6081
+ background: var(--overlay-scrim);
6082
+
6083
+ backdrop-filter: blur(3px);
6084
+ -webkit-backdrop-filter: blur(3px);
6085
+
6086
+ opacity: 0;
6087
+
6088
+ transition:
6089
+ opacity var(--motion-duration-normal)
6090
+ var(--motion-ease-out);
6091
+ }
6092
+
6093
+ .dialog--open {
6094
+ pointer-events: auto;
6095
+ }
6096
+
6097
+ .dialog--open .dialog-backdrop {
6098
+ opacity: 1;
6099
+ }
6100
+
6101
+ .dialog-content {
6102
+ position: relative;
6103
+ z-index: 1;
6104
+
6105
+ width: min(
6106
+ 100%,
6107
+ var(--dialog-width, 32rem)
6108
+ );
6109
+
6110
+ max-height: calc(100vh - var(--space-12));
6111
+
6112
+ overflow-y: auto;
6113
+
6114
+ padding: var(--card-padding);
6115
+
6116
+ border:
6117
+ 1px solid
6118
+ var(--card-border);
6119
+
6120
+ border-radius: var(--card-radius);
6121
+
6122
+ background: var(--card-background);
6123
+ color: var(--text-primary);
6124
+
6125
+ box-shadow: var(--shadow-elevation-high);
6126
+
6127
+ opacity: 0;
6128
+ transform: translateY(
6129
+ var(--space-2)
6130
+ ) scale(0.98);
6131
+
6132
+ transition:
6133
+ opacity var(--motion-duration-normal)
6134
+ var(--motion-ease-out),
6135
+ transform var(--motion-duration-normal)
6136
+ var(--motion-ease-out);
6137
+ }
6138
+
6139
+ .dialog--open .dialog-content {
6140
+ opacity: 1;
6141
+ transform: translateY(0) scale(1);
6142
+ }
6143
+
6144
+
6145
+ /* ==========================================================================
6146
+ DIALOG CLOSE
6147
+ ========================================================================== */
6148
+
6149
+ .dialog-close {
6150
+ position: absolute;
6151
+ top: var(--space-4);
6152
+ right: var(--space-4);
6153
+
6154
+ display: inline-flex;
6155
+ align-items: center;
6156
+ justify-content: center;
6157
+
6158
+ width: var(--button-min-height);
6159
+ height: var(--button-min-height);
6160
+
6161
+ padding: 0;
6162
+
6163
+ border: 0;
6164
+ border-radius: var(--radius-md);
6165
+
6166
+ background: transparent;
6167
+ color: var(--text-muted);
6168
+
6169
+ cursor: pointer;
6170
+
6171
+ transition:
6172
+ background-color var(--motion-duration-fast)
6173
+ var(--motion-ease-out),
6174
+ color var(--motion-duration-fast)
6175
+ var(--motion-ease-out);
6176
+ }
6177
+
6178
+ .dialog-close:hover {
6179
+ background: var(--surface-hover);
6180
+ color: var(--text-primary);
6181
+ }
6182
+
6183
+ .dialog-close:focus-visible {
6184
+ outline:
6185
+ var(--focus-ring-width)
6186
+ solid
6187
+ var(--focus-ring-color);
6188
+
6189
+ outline-offset: var(--focus-ring-offset);
6190
+ }
6191
+
6192
+
6193
+ /* ==========================================================================
6194
+ DIALOG RESPONSIVE
6195
+ ========================================================================== */
6196
+
6197
+ @media (max-width: 40rem) {
6198
+ .dialog {
6199
+ align-items: flex-end;
6200
+
6201
+ padding:
6202
+ var(--space-3);
6203
+ }
6204
+
6205
+ .dialog-content {
6206
+ width: 100%;
6207
+ max-height: calc(100vh - var(--space-6));
6208
+
6209
+ border-radius:
6210
+ var(--card-radius)
6211
+ var(--card-radius)
6212
+ 0
6213
+ 0;
6214
+
6215
+ transform: translateY(
6216
+ var(--space-4)
6217
+ );
6218
+ }
6219
+
6220
+ .dialog--open .dialog-content {
6221
+ transform: translateY(0);
6222
+ }
6223
+ }
6224
+
6225
+
6226
+ /* ==========================================================================
6227
+ REDUCED MOTION
6228
+ ========================================================================== */
6229
+
6230
+ @media (prefers-reduced-motion: reduce) {
6231
+ .dialog-backdrop,
6232
+ .dialog-content {
6233
+ transition: none;
6234
+ }
6235
+ }
6236
+ /* ==========================================================================
6237
+ DRAWER
6238
+ Large contextual workspace overlay.
6239
+ ========================================================================== */
6240
+
6241
+ .drawer {
6242
+ position: fixed;
6243
+ inset: 0;
6244
+ z-index: var(--z-overlay);
6245
+
6246
+ pointer-events: none;
6247
+ }
6248
+
6249
+ .drawer--open {
6250
+ pointer-events: auto;
6251
+ }
6252
+
6253
+
6254
+ /* ==========================================================================
6255
+ BACKDROP
6256
+ ========================================================================== */
6257
+
6258
+ .drawer-backdrop {
6259
+ position: absolute;
6260
+ inset: 0;
6261
+
6262
+ border: 0;
6263
+ padding: 0;
6264
+
6265
+ background: var(--overlay-scrim);
6266
+
6267
+ backdrop-filter: blur(3px);
6268
+ -webkit-backdrop-filter: blur(3px);
6269
+
6270
+ opacity: 0;
6271
+
6272
+ cursor: default;
6273
+
6274
+ transition:
6275
+ opacity var(--motion-duration-normal)
6276
+ var(--motion-ease-out);
6277
+ }
6278
+
6279
+ .drawer--open .drawer-backdrop {
6280
+ opacity: 1;
6281
+ }
6282
+
6283
+
6284
+ /* ==========================================================================
6285
+ PANEL
6286
+ ========================================================================== */
6287
+
6288
+ .drawer-panel {
6289
+ position: absolute;
6290
+ top: 0;
6291
+ bottom: 0;
6292
+
6293
+ display: flex;
6294
+ flex-direction: column;
6295
+
6296
+ width: min(
6297
+ var(--drawer-width, 28rem),
6298
+ 100vw
6299
+ );
6300
+
6301
+ background: var(--card-background);
6302
+ color: var(--text-primary);
6303
+
6304
+ border-color: var(--border-subtle);
6305
+ border-style: solid;
6306
+
6307
+ box-shadow: var(--shadow-elevation-high);
6308
+
6309
+ overflow: hidden;
6310
+
6311
+ transition:
6312
+ transform var(--motion-duration-normal)
6313
+ var(--motion-ease-out);
6314
+ }
6315
+
6316
+
6317
+ /* ==========================================================================
6318
+ SIDES
6319
+ ========================================================================== */
6320
+
6321
+ .drawer--right .drawer-panel {
6322
+ right: 0;
6323
+
6324
+ border-left-width: 1px;
6325
+
6326
+ transform: translateX(100%);
6327
+ }
6328
+
6329
+ .drawer--left .drawer-panel {
6330
+ left: 0;
6331
+
6332
+ border-right-width: 1px;
6333
+
6334
+ transform: translateX(-100%);
6335
+ }
6336
+
6337
+ .drawer--open .drawer-panel {
6338
+ transform: translateX(0);
6339
+ }
6340
+
6341
+
6342
+ /* ==========================================================================
6343
+ CONTENT
6344
+ ========================================================================== */
6345
+
6346
+ .drawer-content {
6347
+ flex: 1 1 auto;
6348
+ min-height: 0;
6349
+
6350
+ padding: var(--card-padding);
6351
+
6352
+ overflow-y: auto;
6353
+ }
6354
+
6355
+
6356
+ /* ==========================================================================
6357
+ CLOSE
6358
+ ========================================================================== */
6359
+
6360
+ .drawer-close {
6361
+ display: inline-flex;
6362
+ align-items: center;
6363
+ justify-content: center;
6364
+
6365
+ width: var(--button-min-height);
6366
+ height: var(--button-min-height);
6367
+
6368
+ flex: 0 0 auto;
6369
+
6370
+ padding: 0;
6371
+
6372
+ border: 0;
6373
+ border-radius: var(--radius-md);
6374
+
6375
+ background: transparent;
6376
+ color: var(--text-muted);
6377
+
6378
+ cursor: pointer;
6379
+
6380
+ transition:
6381
+ background-color var(--motion-duration-fast)
6382
+ var(--motion-ease-out),
6383
+ color var(--motion-duration-fast)
6384
+ var(--motion-ease-out);
6385
+ }
6386
+
6387
+ .drawer-close:hover {
6388
+ background: var(--surface-hover);
6389
+ color: var(--text-primary);
6390
+ }
6391
+
6392
+ .drawer-close:focus-visible {
6393
+ outline:
6394
+ var(--focus-ring-width)
6395
+ solid
6396
+ var(--focus-ring-color);
6397
+
6398
+ outline-offset: var(--focus-ring-offset);
6399
+ }
6400
+
6401
+
6402
+ /* ==========================================================================
6403
+ MOBILE
6404
+ ========================================================================== */
6405
+
6406
+ @media (max-width: 40rem) {
6407
+ .drawer-panel {
6408
+ width: 100%;
6409
+ }
6410
+ }
6411
+
6412
+
6413
+ /* ==========================================================================
6414
+ REDUCED MOTION
6415
+ ========================================================================== */
6416
+
6417
+ @media (prefers-reduced-motion: reduce) {
6418
+ .drawer-backdrop,
6419
+ .drawer-panel {
6420
+ transition: none;
6421
+ }
6422
+ }
6423
+ /* ==========================================================================
6424
+ POPOVER
6425
+ Contextual interactive content
6426
+ ========================================================================== */
6427
+
6428
+ .popover {
6429
+ position: relative;
6430
+ display: inline-block;
6431
+ }
6432
+
6433
+ .popover-trigger {
6434
+ display: inline-flex;
6435
+ }
6436
+
6437
+ .popover-content {
6438
+ position: absolute;
6439
+ z-index: var(--z-popover);
6440
+
6441
+ width: max-content;
6442
+ max-width: min(
6443
+ 22rem,
6444
+ calc(100vw - var(--space-8))
6445
+ );
6446
+
6447
+ padding: var(--space-4);
6448
+
6449
+ border: 1px solid var(--border-subtle);
6450
+ border-radius: var(--radius-md);
6451
+
6452
+ background: var(--surface-card);
6453
+ color: var(--text-primary);
6454
+
6455
+ box-shadow: var(--shadow-elevation-medium);
6456
+
6457
+ opacity: 0;
6458
+ visibility: hidden;
6459
+ transform: translateY(-0.25rem) scale(0.98);
6460
+
6461
+ transition:
6462
+ opacity var(--motion-duration-fast) var(--motion-ease-out),
6463
+ transform var(--motion-duration-fast) var(--motion-ease-out),
6464
+ visibility var(--motion-duration-fast) var(--motion-ease-out);
6465
+ }
6466
+
6467
+ .popover--open .popover-content {
6468
+ opacity: 1;
6469
+ visibility: visible;
6470
+ transform: translateY(0) scale(1);
6471
+ }
6472
+
6473
+ .popover--bottom .popover-content {
6474
+ top: calc(100% + var(--space-2));
6475
+ left: 0;
6476
+ }
6477
+
6478
+ .popover--top .popover-content {
6479
+ bottom: calc(100% + var(--space-2));
6480
+ left: 0;
6481
+
6482
+ transform: translateY(0.25rem) scale(0.98);
6483
+ }
6484
+
6485
+ .popover--top.popover--open .popover-content {
6486
+ transform: translateY(0) scale(1);
6487
+ }
6488
+
6489
+ .popover--right .popover-content {
6490
+ top: 0;
6491
+ left: calc(100% + var(--space-2));
6492
+ }
6493
+
6494
+ .popover--left .popover-content {
6495
+ top: 0;
6496
+ right: calc(100% + var(--space-2));
6497
+ }
6498
+
6499
+
6500
+ /* ==========================================================================
6501
+ TOOLTIP
6502
+ ========================================================================== */
6503
+
6504
+ .tooltip {
6505
+ position: relative;
6506
+ display: inline-flex;
6507
+ }
6508
+
6509
+ .tooltip-trigger {
6510
+ display: inline-flex;
6511
+ }
6512
+
6513
+ .tooltip-content {
6514
+ position: absolute;
6515
+ z-index: var(--z-tooltip);
6516
+
6517
+ width: max-content;
6518
+ max-width: 18rem;
6519
+
6520
+ padding:
6521
+ var(--space-2)
6522
+ var(--space-3);
6523
+
6524
+ border: 1px solid var(--border-subtle);
6525
+ border-radius: var(--radius-sm);
6526
+
6527
+ background: var(--surface-elevated-2);
6528
+ color: var(--text-primary);
6529
+
6530
+ font-family: var(--font-family-body);
6531
+ font-size: var(--font-size-xs);
6532
+ font-weight: var(--font-weight-medium);
6533
+ line-height: var(--line-height-normal);
6534
+
6535
+ box-shadow: var(--shadow-elevation-low);
6536
+
6537
+ white-space: normal;
6538
+ text-align: left;
6539
+
6540
+ pointer-events: none;
6541
+
6542
+ opacity: 0;
6543
+ visibility: hidden;
6544
+ transform: translateY(-0.2rem);
6545
+
6546
+ transition:
6547
+ opacity var(--motion-duration-fast) var(--motion-ease-out),
6548
+ transform var(--motion-duration-fast) var(--motion-ease-out),
6549
+ visibility var(--motion-duration-fast) var(--motion-ease-out);
6550
+ }
6551
+
6552
+ .tooltip--visible .tooltip-content {
6553
+ opacity: 1;
6554
+ visibility: visible;
6555
+ transform: translateY(0);
6556
+ }
6557
+
6558
+ .tooltip--bottom .tooltip-content {
6559
+ top: calc(100% + var(--space-2));
6560
+ left: 50%;
6561
+
6562
+ transform: translate(-50%, -0.2rem);
6563
+ }
6564
+
6565
+ .tooltip--bottom.tooltip--visible .tooltip-content {
6566
+ transform: translate(-50%, 0);
6567
+ }
6568
+
6569
+ .tooltip--top .tooltip-content {
6570
+ bottom: calc(100% + var(--space-2));
6571
+ left: 50%;
6572
+
6573
+ transform: translate(-50%, 0.2rem);
6574
+ }
6575
+
6576
+ .tooltip--top.tooltip--visible .tooltip-content {
6577
+ transform: translate(-50%, 0);
6578
+ }
6579
+
6580
+ .tooltip--right .tooltip-content {
6581
+ top: 50%;
6582
+ left: calc(100% + var(--space-2));
6583
+
6584
+ transform: translate(0.2rem, -50%);
6585
+ }
6586
+
6587
+ .tooltip--right.tooltip--visible .tooltip-content {
6588
+ transform: translate(0, -50%);
6589
+ }
6590
+
6591
+ .tooltip--left .tooltip-content {
6592
+ top: 50%;
6593
+ right: calc(100% + var(--space-2));
6594
+
6595
+ transform: translate(-0.2rem, -50%);
6596
+ }
6597
+
6598
+ .tooltip--left.tooltip--visible .tooltip-content {
6599
+ transform: translate(0, -50%);
6600
+ }
6601
+
6602
+
6603
+ /* ==========================================================================
6604
+ REDUCED MOTION
6605
+ ========================================================================== */
6606
+
6607
+ @media (prefers-reduced-motion: reduce) {
6608
+ .popover-content,
6609
+ .tooltip-content {
6610
+ transition: none;
6611
+ }
6612
+ }
6613
+ /* ==========================================================================
6614
+ ALERT
6615
+ Persistent in-flow feedback message.
6616
+ ========================================================================== */
6617
+
6618
+ .alert {
6619
+ display: flex;
6620
+ align-items: flex-start;
6621
+ gap: var(--space-3);
6622
+
6623
+ width: 100%;
6624
+
6625
+ padding: var(--space-4);
6626
+
6627
+ border: 1px solid transparent;
6628
+ border-radius: var(--radius-md);
6629
+
6630
+ background: var(--surface-card);
6631
+ color: var(--text-primary);
6632
+ }
6633
+
6634
+
6635
+ /* --------------------------------------------------------------------------
6636
+ CONTENT
6637
+ -------------------------------------------------------------------------- */
6638
+
6639
+ .alert-content {
6640
+ display: flex;
6641
+ flex-direction: column;
6642
+ gap: var(--space-1);
6643
+
6644
+ min-width: 0;
6645
+ flex: 1 1 auto;
6646
+ }
6647
+
6648
+ .alert-message {
6649
+ color: var(--text-secondary);
6650
+ line-height: var(--line-height-normal);
6651
+ }
6652
+
6653
+ .alert-actions {
6654
+ display: inline-flex;
6655
+ align-items: center;
6656
+
6657
+ flex: 0 0 auto;
6658
+
6659
+ margin-top: var(--space-3);
6660
+ }
6661
+
6662
+
6663
+ /* --------------------------------------------------------------------------
6664
+ VARIANTS
6665
+ -------------------------------------------------------------------------- */
6666
+
6667
+ .alert-info {
6668
+ border-color: var(--alert-info-border);
6669
+ background: var(--alert-info-background);
6670
+ color: var(--alert-info-text);
6671
+ }
6672
+
6673
+ .alert-success {
6674
+ border-color: var(--alert-success-border);
6675
+ background: var(--alert-success-background);
6676
+ color: var(--alert-success-text);
6677
+ }
6678
+
6679
+ .alert-warning {
6680
+ border-color: var(--alert-warning-border);
6681
+ background: var(--alert-warning-background);
6682
+ color: var(--alert-warning-text);
6683
+ }
6684
+
6685
+ .alert-danger {
6686
+ border-color: var(--alert-danger-border);
6687
+ background: var(--alert-danger-background);
6688
+ color: var(--alert-danger-text);
6689
+ }
6690
+
6691
+
6692
+ /* --------------------------------------------------------------------------
6693
+ DISMISS
6694
+ -------------------------------------------------------------------------- */
6695
+
6696
+ .alert-close {
6697
+ display: inline-flex;
6698
+ align-items: center;
6699
+ justify-content: center;
6700
+
6701
+ width: var(--button-min-height-sm);
6702
+ height: var(--button-min-height-sm);
6703
+
6704
+ flex: 0 0 auto;
6705
+
6706
+ padding: 0;
6707
+
6708
+ border: 0;
6709
+ border-radius: var(--radius-md);
6710
+
6711
+ background: transparent;
6712
+ color: var(--text-muted);
6713
+
6714
+ cursor: pointer;
6715
+
6716
+ transition:
6717
+ background-color var(--motion-duration-fast) var(--motion-ease-out),
6718
+ color var(--motion-duration-fast) var(--motion-ease-out);
6719
+ }
6720
+
6721
+ .alert-close:hover {
6722
+ background: var(--surface-hover);
6723
+ color: var(--text-primary);
6724
+ }
6725
+
6726
+ .alert-close:focus-visible {
6727
+ outline:
6728
+ var(--focus-ring-width)
6729
+ solid
6730
+ var(--focus-ring-color);
6731
+
6732
+ outline-offset: var(--focus-ring-offset);
6733
+ }
6734
+
6735
+
6736
+ /* --------------------------------------------------------------------------
6737
+ REDUCED MOTION
6738
+ -------------------------------------------------------------------------- */
6739
+
6740
+ @media (prefers-reduced-motion: reduce) {
6741
+ .alert-close {
6742
+ transition: none;
6743
+ }
6744
+ }
6745
+ /* ==========================================================================
6746
+ PROGRESS
6747
+ Shows completion of an operation.
6748
+ ========================================================================== */
6749
+
6750
+ .progress {
6751
+ display: flex;
6752
+ flex-direction: column;
6753
+ gap: var(--space-2);
6754
+
6755
+ width: 100%;
6756
+ }
6757
+
6758
+ .progress-track {
6759
+ position: relative;
6760
+
6761
+ width: 100%;
6762
+ height: 0.5rem;
6763
+
6764
+ overflow: hidden;
6765
+
6766
+ border-radius: var(--radius-full);
6767
+
6768
+ background: var(--surface-raised);
6769
+ }
6770
+
6771
+ .progress-value {
6772
+ height: 100%;
6773
+ width: 0;
6774
+
6775
+ border-radius: inherit;
6776
+
6777
+ background: var(--brand-primary);
6778
+
6779
+ transition:
6780
+ width var(--motion-duration-normal)
6781
+ var(--motion-ease-out);
6782
+ }
6783
+
6784
+ .progress--success .progress-value {
6785
+ background: var(--color-success);
6786
+ }
6787
+
6788
+ .progress--warning .progress-value {
6789
+ background: var(--color-warning);
6790
+ }
6791
+
6792
+ .progress--danger .progress-value {
6793
+ background: var(--color-danger);
6794
+ }
6795
+
6796
+ .progress--indeterminate .progress-value {
6797
+ width: 40%;
6798
+
6799
+ animation:
6800
+ progress-indeterminate
6801
+ 1.4s
6802
+ var(--motion-ease-in-out)
6803
+ infinite;
6804
+ }
6805
+
6806
+ .progress-label {
6807
+ display: flex;
6808
+ align-items: center;
6809
+ justify-content: space-between;
6810
+ gap: var(--space-3);
6811
+
6812
+ color: var(--text-secondary);
6813
+
6814
+ font-size: var(--font-size-sm);
6815
+ line-height: var(--line-height-normal);
6816
+ }
6817
+
6818
+ @keyframes progress-indeterminate {
6819
+ 0% {
6820
+ transform: translateX(-100%);
6821
+ }
6822
+
6823
+ 50% {
6824
+ transform: translateX(150%);
6825
+ }
6826
+
6827
+ 100% {
6828
+ transform: translateX(300%);
6829
+ }
6830
+ }
6831
+
6832
+
6833
+ /* ==========================================================================
6834
+ SKELETON
6835
+ Placeholder for loading content.
6836
+ ========================================================================== */
6837
+
6838
+ .skeleton {
6839
+ display: block;
6840
+
6841
+ width: 100%;
6842
+ min-height: 1rem;
6843
+
6844
+ border-radius: var(--radius-md);
6845
+
6846
+ background:
6847
+ linear-gradient(
6848
+ 90deg,
6849
+ var(--surface-raised) 25%,
6850
+ var(--surface-hover) 50%,
6851
+ var(--surface-raised) 75%
6852
+ );
6853
+
6854
+ background-size: 200% 100%;
6855
+
6856
+ animation:
6857
+ skeleton-shimmer
6858
+ 1.6s
6859
+ var(--motion-ease-in-out)
6860
+ infinite;
6861
+ }
6862
+
6863
+ .skeleton--text {
6864
+ height: 1rem;
6865
+ min-height: 1rem;
6866
+ }
6867
+
6868
+ .skeleton--heading {
6869
+ height: 2rem;
6870
+ min-height: 2rem;
6871
+
6872
+ max-width: 70%;
6873
+ }
6874
+
6875
+ .skeleton--avatar {
6876
+ width: 2.75rem;
6877
+ min-width: 2.75rem;
6878
+
6879
+ height: 2.75rem;
6880
+ min-height: 2.75rem;
6881
+
6882
+ border-radius: var(--radius-full);
6883
+ }
6884
+
6885
+ .skeleton--circle {
6886
+ border-radius: var(--radius-full);
6887
+ }
6888
+
6889
+ .skeleton--button {
6890
+ width: 7rem;
6891
+ min-height: var(--button-min-height);
6892
+
6893
+ border-radius: var(--button-radius);
6894
+ }
6895
+
6896
+ @keyframes skeleton-shimmer {
6897
+ 0% {
6898
+ background-position: 200% 0;
6899
+ }
6900
+
6901
+ 100% {
6902
+ background-position: -200% 0;
6903
+ }
6904
+ }
6905
+
6906
+
6907
+ /* ==========================================================================
6908
+ TOAST
6909
+ Temporary floating feedback.
6910
+ ========================================================================== */
6911
+
6912
+ .toast {
6913
+ position: fixed;
6914
+ right: var(--space-6);
6915
+ bottom: var(--space-6);
6916
+
6917
+ z-index: var(--z-tooltip);
6918
+
6919
+ display: flex;
6920
+ align-items: flex-start;
6921
+ gap: var(--space-3);
6922
+
6923
+ width: min(
6924
+ 24rem,
6925
+ calc(100vw - var(--space-8))
6926
+ );
6927
+
6928
+ padding: var(--space-4);
6929
+
6930
+ border: 1px solid var(--border-default);
6931
+ border-radius: var(--radius-md);
6932
+
6933
+ background: var(--surface-card);
6934
+ color: var(--text-primary);
6935
+
6936
+ box-shadow: var(--shadow-elevation-high);
6937
+
6938
+ transform: translateY(var(--space-3));
6939
+ opacity: 0;
6940
+
6941
+ transition:
6942
+ opacity var(--motion-duration-normal)
6943
+ var(--motion-ease-out),
6944
+ transform var(--motion-duration-normal)
6945
+ var(--motion-ease-out);
6946
+ }
6947
+
6948
+ .toast--visible {
6949
+ opacity: 1;
6950
+ transform: translateY(0);
6951
+ }
6952
+
6953
+ .toast-info {
6954
+ border-color: var(--alert-info-border);
6955
+ }
6956
+
6957
+ .toast-success {
6958
+ border-color: var(--alert-success-border);
6959
+ }
6960
+
6961
+ .toast-warning {
6962
+ border-color: var(--alert-warning-border);
6963
+ }
6964
+
6965
+ .toast-danger {
6966
+ border-color: var(--alert-danger-border);
6967
+ }
6968
+
6969
+ .toast-content {
6970
+ display: flex;
6971
+ flex-direction: column;
6972
+ gap: var(--space-1);
6973
+
6974
+ min-width: 0;
6975
+
6976
+ flex: 1 1 auto;
6977
+ }
6978
+
6979
+ .toast-title {
6980
+ color: var(--text-primary);
6981
+ font-weight: var(--font-weight-semibold);
6982
+ }
6983
+
6984
+ .toast-message {
6985
+ color: var(--text-secondary);
6986
+ line-height: var(--line-height-normal);
6987
+ }
6988
+
6989
+ .toast-close {
6990
+ display: inline-flex;
6991
+ align-items: center;
6992
+ justify-content: center;
6993
+
6994
+ width: var(--button-min-height-sm);
6995
+ height: var(--button-min-height-sm);
6996
+
6997
+ flex: 0 0 auto;
6998
+
6999
+ padding: 0;
7000
+
7001
+ border: 0;
7002
+ border-radius: var(--radius-md);
7003
+
7004
+ background: transparent;
7005
+ color: var(--text-muted);
7006
+
7007
+ cursor: pointer;
7008
+
7009
+ transition:
7010
+ background-color var(--motion-duration-fast)
7011
+ var(--motion-ease-out),
7012
+ color var(--motion-duration-fast)
7013
+ var(--motion-ease-out);
7014
+ }
7015
+
7016
+ .toast-close:hover {
7017
+ background: var(--surface-hover);
7018
+ color: var(--text-primary);
7019
+ }
7020
+
7021
+ .toast-close:focus-visible {
7022
+ outline:
7023
+ var(--focus-ring-width)
7024
+ solid
7025
+ var(--focus-ring-color);
7026
+
7027
+ outline-offset: var(--focus-ring-offset);
7028
+ }
7029
+
7030
+ @media (max-width: 40rem) {
7031
+ .toast {
7032
+ right: var(--space-3);
7033
+ bottom: var(--space-3);
7034
+
7035
+ width: calc(100vw - var(--space-6));
7036
+ }
7037
+ }
7038
+
7039
+
7040
+ /* ==========================================================================
7041
+ REDUCED MOTION
7042
+ ========================================================================== */
7043
+
7044
+ @media (prefers-reduced-motion: reduce) {
7045
+ .progress-value,
7046
+ .skeleton,
7047
+ .toast {
7048
+ animation: none;
7049
+ transition: none;
7050
+ }
7051
+
7052
+ .toast {
7053
+ transform: none;
7054
+ }
7055
+ }
7056
+ /* ==========================================================================
7057
+ ANIMATION UTILITY CLASSES
7058
+ Consume @keyframes from the project's animations.css / typography.css.
7059
+ ========================================================================== */
7060
+
7061
+ .animate-fade-in {
7062
+ animation: fade-in var(--motion-duration-normal) var(--motion-ease-smooth) forwards;
7063
+ }
7064
+
7065
+ .animate-fade-in-up {
7066
+ animation: fade-in-up var(--motion-duration-normal) var(--motion-ease-smooth) forwards;
7067
+ }
7068
+
7069
+ .animate-slide-in-left {
7070
+ animation: slide-in-left var(--motion-duration-slow) var(--motion-ease-smooth) forwards;
7071
+ }
7072
+
7073
+ .animate-slide-in-right {
7074
+ animation: slide-in-right var(--motion-duration-slow) var(--motion-ease-smooth) forwards;
7075
+ }
7076
+
7077
+ .animate-scale-in {
7078
+ animation: scale-in var(--motion-duration-fast) var(--motion-ease-spring) forwards;
7079
+ }
7080
+
7081
+
7082
+
3356
7083
  /* --------------------------------------------------------------------------
3357
7084
  DISMISS
3358
7085
  -------------------------------------------------------------------------- */