@paraxe/design 1.0.0 → 1.3.0

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