@revikornmann/muka-ui 0.27.0 → 0.27.2

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.
Files changed (36) hide show
  1. package/dist/cjs/components/Avatar/Avatar.css +15 -4
  2. package/dist/cjs/components/Avatar/Avatar.js +23 -1
  3. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  4. package/dist/cjs/components/Avatar/AvatarGroup.js +4 -2
  5. package/dist/cjs/components/Avatar/AvatarGroup.js.map +1 -1
  6. package/dist/cjs/components/Tabs/Tabs.js +6 -3
  7. package/dist/cjs/components/Tabs/Tabs.js.map +1 -1
  8. package/dist/esm/components/Avatar/Avatar.css +15 -4
  9. package/dist/esm/components/Avatar/Avatar.js +24 -2
  10. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  11. package/dist/esm/components/Avatar/AvatarGroup.js +4 -2
  12. package/dist/esm/components/Avatar/AvatarGroup.js.map +1 -1
  13. package/dist/esm/components/Tabs/Tabs.js +6 -3
  14. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  15. package/dist/styles/components/Avatar.css +15 -4
  16. package/dist/styles/index.css +483 -471
  17. package/dist/styles/muka-dark.css +483 -471
  18. package/dist/styles/muka-light.css +483 -471
  19. package/dist/styles/tokens-bouwplan-dark.css +7 -6
  20. package/dist/styles/tokens-bouwplan-light.css +7 -6
  21. package/dist/styles/tokens-fscl-dark.css +7 -6
  22. package/dist/styles/tokens-fscl-light.css +7 -6
  23. package/dist/styles/tokens-grip-dark.css +7 -6
  24. package/dist/styles/tokens-grip-light.css +7 -6
  25. package/dist/styles/tokens-muka-dark.css +7 -6
  26. package/dist/styles/tokens-muka-light.css +7 -6
  27. package/dist/styles/tokens-wireframe-dark.css +7 -6
  28. package/dist/styles/tokens-wireframe-light.css +7 -6
  29. package/dist/styles/wireframe-dark.css +483 -471
  30. package/dist/styles/wireframe-light.css +483 -471
  31. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  32. package/dist/types/components/Avatar/AvatarGroup.d.ts +8 -0
  33. package/dist/types/components/Avatar/AvatarGroup.d.ts.map +1 -1
  34. package/dist/types/components/Tabs/Tabs.d.ts.map +1 -1
  35. package/package.json +1 -1
  36. package/tokens/t4-components/avatar.json +13 -7
@@ -2079,15 +2079,16 @@ body {
2079
2079
  --avatar-status-size-xl: 1.5rem;
2080
2080
  --avatar-group-ring-width: 0.125rem;
2081
2081
  --avatar-group-ring-color: #fdfcfd;
2082
- --avatar-group-overlap-tight-sm: 2rem;
2083
- --avatar-group-overlap-tight-2xs: 1.25rem;
2082
+ --avatar-group-overlap-tight-xs: 1.75rem;
2083
+ --avatar-group-overlap-tight-2xs: 1.5rem;
2084
2084
  --avatar-group-overlap-tight-3xs: 1rem;
2085
- --avatar-group-overlap-compact-sm: 1.5rem;
2086
- --avatar-group-overlap-compact-2xs: 1rem;
2087
- --avatar-group-overlap-compact-3xs: 0.75rem;
2088
- --avatar-group-overlap-spacious-sm: 1rem;
2085
+ --avatar-group-overlap-compact-xs: 1.5rem;
2086
+ --avatar-group-overlap-compact-2xs: 1.125rem;
2087
+ --avatar-group-overlap-compact-3xs: 0.875rem;
2088
+ --avatar-group-overlap-spacious-xs: 1rem;
2089
2089
  --avatar-group-overlap-spacious-2xs: 0.75rem;
2090
2090
  --avatar-group-overlap-spacious-3xs: 0.5rem;
2091
+ --avatar-group-badge-offset: 0.25rem;
2091
2092
  --toast-color-info-background: #211f26;
2092
2093
  --toast-color-info-foreground: #fdfcfd;
2093
2094
  --toast-color-info-accent: #edf2fe;
@@ -2493,6 +2494,116 @@ body {
2493
2494
  }
2494
2495
 
2495
2496
 
2497
+ /* View */
2498
+ /* View Component Styles */
2499
+
2500
+ /* ─── Base layout ─────────────────────────────────────── */
2501
+
2502
+ .muka-view {
2503
+ display: flex;
2504
+ flex-direction: column;
2505
+ height: 100dvh;
2506
+ background-color: var(--view-color-background);
2507
+ position: relative;
2508
+ isolation: isolate;
2509
+ box-sizing: border-box;
2510
+
2511
+ /* Width reserved for the footer nav once it becomes a left sidebar at the
2512
+ large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2513
+ --view-sidebar-width: 240px;
2514
+ }
2515
+
2516
+ /* ─── Surface level variants ─────────────────────────── */
2517
+
2518
+ .muka-view--surface-3 {
2519
+ background-color: var(--color-surface-level3);
2520
+ }
2521
+
2522
+ /* ─── Large screens: make room for the left sidebar ──────────
2523
+ A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2524
+ ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2525
+ actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2526
+ the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2527
+ for a sidebar that hasn't rendered yet. */
2528
+ @media (min-width: 1024px) {
2529
+ .muka-view:has(.muka-bottombar--desktop-sidebar) {
2530
+ padding-left: var(--view-sidebar-width);
2531
+ }
2532
+ }
2533
+
2534
+ /* ─── TopBar elevation ────────────────────────────────── */
2535
+
2536
+ .muka-view .muka-topbar {
2537
+ flex-shrink: 0;
2538
+ z-index: 3;
2539
+ box-shadow: var(--shadow-level2);
2540
+ }
2541
+
2542
+ /* ─── Scrollable body ─────────────────────────────────── */
2543
+
2544
+ .muka-view__body {
2545
+ flex: 1 1 0%;
2546
+ min-height: 0;
2547
+ overflow-y: auto;
2548
+ overflow-x: clip;
2549
+ z-index: 1;
2550
+
2551
+ /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2552
+ content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2553
+ reveal the content underneath. */
2554
+ display: flex;
2555
+ flex-direction: column;
2556
+ }
2557
+
2558
+ /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2559
+ using the alias-layer section/container tokens, while the body scrolls full
2560
+ width. Full-bleed below large. */
2561
+ .muka-view__body-inner {
2562
+ width: 100%;
2563
+ /* Grow on short content so the sticky footer is pushed to the bottom rather
2564
+ than floating mid-screen. */
2565
+ flex: 1 0 auto;
2566
+ }
2567
+
2568
+ @media (min-width: 1024px) {
2569
+ .muka-view:not([data-size]) .muka-view__body-inner {
2570
+ max-width: var(--container-max-width-xl);
2571
+ margin-inline: auto;
2572
+ padding-inline: var(--section-padding-horizontal-default);
2573
+ }
2574
+ }
2575
+
2576
+ .muka-view[data-size='lg'] .muka-view__body-inner {
2577
+ max-width: var(--container-max-width-xl);
2578
+ margin-inline: auto;
2579
+ padding-inline: var(--section-padding-horizontal-default);
2580
+ }
2581
+
2582
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2583
+
2584
+ .muka-view__footer {
2585
+ position: sticky;
2586
+ bottom: 0;
2587
+ flex-shrink: 0;
2588
+ z-index: 2;
2589
+ }
2590
+
2591
+ /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2592
+ navigation at the large tier, so hide a footer that holds a navigation bar.
2593
+ Scoped to `.muka-app-shell` so bare Views (and the standalone
2594
+ desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2595
+ (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2596
+ @media (min-width: 1024px) {
2597
+ .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2598
+ display: none;
2599
+ }
2600
+ }
2601
+
2602
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2603
+ display: none;
2604
+ }
2605
+
2606
+
2496
2607
  /* Typography */
2497
2608
  .muka-typography-catalog {
2498
2609
  display: flex;
@@ -2843,122 +2954,175 @@ body {
2843
2954
  }
2844
2955
 
2845
2956
 
2846
- /* View */
2847
- /* View Component Styles */
2848
-
2849
- /* ─── Base layout ─────────────────────────────────────── */
2957
+ /* Toggle */
2958
+ /* Toggle Component Styles - Using Muka Design Tokens */
2850
2959
 
2851
- .muka-view {
2960
+ /* Wrapper container */
2961
+ .muka-toggle {
2852
2962
  display: flex;
2853
- flex-direction: column;
2854
- height: 100dvh;
2855
- background-color: var(--view-color-background);
2963
+ align-items: center;
2964
+ gap: var(--spacing-2);
2856
2965
  position: relative;
2857
- isolation: isolate;
2858
- box-sizing: border-box;
2859
-
2860
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2861
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2862
- --view-sidebar-width: 240px;
2966
+ padding: var(--spacing-4) 0;
2863
2967
  }
2864
2968
 
2865
- /* ─── Surface level variants ─────────────────────────── */
2866
-
2867
- .muka-view--surface-3 {
2868
- background-color: var(--color-surface-level3);
2969
+ .muka-toggle--with-caption {
2970
+ padding: var(--spacing-5) 0;
2869
2971
  }
2870
2972
 
2871
- /* ─── Large screens: make room for the left sidebar ──────────
2872
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2873
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2874
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2875
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2876
- for a sidebar that hasn't rendered yet. */
2877
- @media (min-width: 1024px) {
2878
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2879
- padding-left: var(--view-sidebar-width);
2880
- }
2973
+ .muka-toggle--disabled {
2974
+ opacity: 0.6;
2881
2975
  }
2882
2976
 
2883
- /* ─── TopBar elevation ────────────────────────────────── */
2884
-
2885
- .muka-view .muka-topbar {
2977
+ /* Icon */
2978
+ .muka-toggle__icon {
2979
+ display: flex;
2980
+ align-items: center;
2981
+ justify-content: center;
2886
2982
  flex-shrink: 0;
2887
- z-index: 3;
2888
- box-shadow: var(--shadow-level2);
2983
+ width: var(--icon-size-default);
2984
+ height: var(--icon-size-default);
2985
+ color: var(--color-text-default-default);
2889
2986
  }
2890
2987
 
2891
- /* ─── Scrollable body ─────────────────────────────────── */
2892
-
2893
- .muka-view__body {
2894
- flex: 1 1 0%;
2895
- min-height: 0;
2896
- overflow-y: auto;
2897
- overflow-x: clip;
2898
- z-index: 1;
2988
+ .muka-toggle__icon svg {
2989
+ width: 100%;
2990
+ height: 100%;
2991
+ }
2899
2992
 
2900
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2901
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2902
- reveal the content underneath. */
2993
+ /* Content area (label + caption) */
2994
+ .muka-toggle__content {
2903
2995
  display: flex;
2904
2996
  flex-direction: column;
2997
+ flex: 1;
2998
+ min-width: 0;
2999
+ gap: var(--spacing-1);
2905
3000
  }
2906
3001
 
2907
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2908
- using the alias-layer section/container tokens, while the body scrolls full
2909
- width. Full-bleed below large. */
2910
- .muka-view__body-inner {
2911
- width: 100%;
2912
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2913
- than floating mid-screen. */
2914
- flex: 1 0 auto;
3002
+ /* Label */
3003
+ .muka-toggle__label {
3004
+ font-family: var(--text-label-lg-regular-fontFamily);
3005
+ font-weight: var(--text-label-lg-regular-fontWeight);
3006
+ font-size: var(--text-label-lg-regular-fontSize);
3007
+ line-height: var(--text-label-lg-regular-lineHeight);
3008
+ color: var(--color-text-default-default);
3009
+ cursor: pointer;
2915
3010
  }
2916
3011
 
2917
- @media (min-width: 1024px) {
2918
- .muka-view:not([data-size]) .muka-view__body-inner {
2919
- max-width: var(--container-max-width-xl);
2920
- margin-inline: auto;
2921
- padding-inline: var(--section-padding-horizontal-default);
2922
- }
3012
+ .muka-toggle--with-caption .muka-toggle__label {
3013
+ font-family: var(--text-label-lg-semibold-fontFamily);
3014
+ font-weight: var(--text-label-lg-semibold-fontWeight);
3015
+ font-size: var(--text-label-lg-semibold-fontSize);
3016
+ line-height: var(--text-label-lg-semibold-lineHeight);
2923
3017
  }
2924
3018
 
2925
- .muka-view[data-size='lg'] .muka-view__body-inner {
2926
- max-width: var(--container-max-width-xl);
2927
- margin-inline: auto;
2928
- padding-inline: var(--section-padding-horizontal-default);
3019
+ .muka-toggle--disabled .muka-toggle__label {
3020
+ color: var(--color-text-subtle-default);
3021
+ cursor: not-allowed;
2929
3022
  }
2930
3023
 
2931
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2932
-
2933
- .muka-view__footer {
2934
- position: sticky;
2935
- bottom: 0;
2936
- flex-shrink: 0;
2937
- z-index: 2;
3024
+ /* Caption */
3025
+ .muka-toggle__caption {
3026
+ font-family: var(--text-body-base-regular-fontFamily);
3027
+ font-weight: var(--text-body-base-regular-fontWeight);
3028
+ font-size: var(--text-body-base-regular-fontSize);
3029
+ line-height: var(--text-body-base-regular-lineHeight);
3030
+ color: var(--color-text-subtle-default);
2938
3031
  }
2939
3032
 
2940
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2941
- navigation at the large tier, so hide a footer that holds a navigation bar.
2942
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2943
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2944
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2945
- @media (min-width: 1024px) {
2946
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2947
- display: none;
2948
- }
3033
+ /* Switch container */
3034
+ .muka-toggle__switch {
3035
+ position: relative;
3036
+ display: inline-flex;
3037
+ flex-shrink: 0;
3038
+ cursor: pointer;
2949
3039
  }
2950
3040
 
2951
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2952
- display: none;
3041
+ .muka-toggle--disabled .muka-toggle__switch {
3042
+ cursor: not-allowed;
2953
3043
  }
2954
3044
 
2955
-
2956
- /* Toast */
2957
- /* Toast Component Styles - Using Muka Design Tokens */
2958
-
2959
- .muka-toast {
2960
- display: flex;
2961
- align-items: flex-start;
3045
+ /* Hidden native input */
3046
+ .muka-toggle__input {
3047
+ position: absolute;
3048
+ width: 1px;
3049
+ height: 1px;
3050
+ padding: 0;
3051
+ margin: -1px;
3052
+ overflow: hidden;
3053
+ clip: rect(0, 0, 0, 0);
3054
+ white-space: nowrap;
3055
+ border: 0;
3056
+ }
3057
+
3058
+ /* Track (background pill) */
3059
+ .muka-toggle__track {
3060
+ display: flex;
3061
+ align-items: center;
3062
+ width: var(--toggle-track-width);
3063
+ height: var(--toggle-track-height);
3064
+ border-radius: var(--toggle-track-radius);
3065
+ background-color: var(--toggle-track-color-off);
3066
+ transition: background-color 0.2s ease;
3067
+ box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3068
+ position: relative;
3069
+ }
3070
+
3071
+ /* Knob (sliding circle) */
3072
+ .muka-toggle__knob {
3073
+ position: absolute;
3074
+ width: var(--toggle-knob-size);
3075
+ height: var(--toggle-knob-size);
3076
+ border-radius: var(--border-radius-full);
3077
+ background-color: var(--toggle-knob-color-default);
3078
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3079
+ left: var(--toggle-knob-offset);
3080
+ transition: left 0.2s ease, transform 0.2s ease;
3081
+ }
3082
+
3083
+ /* Focus state */
3084
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3085
+ outline: 2px solid var(--color-border-focus);
3086
+ outline-offset: 2px;
3087
+ }
3088
+
3089
+ /* Checked (on) state */
3090
+ .muka-toggle__input:checked + .muka-toggle__track {
3091
+ background-color: var(--toggle-track-color-on);
3092
+ }
3093
+
3094
+ .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3095
+ left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3096
+ }
3097
+
3098
+ /* Disabled state */
3099
+ .muka-toggle--disabled .muka-toggle__track {
3100
+ background-color: var(--toggle-track-color-disabled);
3101
+ box-shadow: none;
3102
+ }
3103
+
3104
+ .muka-toggle--disabled .muka-toggle__knob {
3105
+ background-color: var(--toggle-knob-color-disabled);
3106
+ box-shadow: none;
3107
+ }
3108
+
3109
+ /* Divider */
3110
+ .muka-toggle__divider {
3111
+ position: absolute;
3112
+ bottom: 0;
3113
+ left: 0;
3114
+ right: 0;
3115
+ height: 1px;
3116
+ background-color: var(--color-border-muted);
3117
+ }
3118
+
3119
+
3120
+ /* Toast */
3121
+ /* Toast Component Styles - Using Muka Design Tokens */
3122
+
3123
+ .muka-toast {
3124
+ display: flex;
3125
+ align-items: flex-start;
2962
3126
  gap: var(--toast-gap);
2963
3127
  padding: var(--toast-padding-y) var(--toast-padding-x);
2964
3128
  border-radius: var(--toast-radius);
@@ -3648,388 +3812,35 @@ body {
3648
3812
  border-color var(--motion-duration-micro) var(--motion-easing-enter);
3649
3813
  }
3650
3814
 
3651
- .muka-thumbnail__remove:hover {
3652
- color: var(--button-color-tertiary-foreground-hover);
3653
- background-color: var(--button-color-tertiary-background-hover);
3654
- border-color: var(--button-color-tertiary-border-hover);
3655
- }
3656
-
3657
- .muka-thumbnail__remove:active {
3658
- color: var(--button-color-tertiary-foreground-pressed);
3659
- background-color: var(--button-color-tertiary-background-pressed);
3660
- border-color: var(--button-color-tertiary-border-pressed);
3661
- }
3662
-
3663
- .muka-thumbnail__remove:focus-visible {
3664
- outline: 2px solid var(--color-border-focus);
3665
- outline-offset: 2px;
3666
- }
3667
-
3668
- /* ─── Reduced motion ──────────────────────────────────── */
3669
- @media (prefers-reduced-motion: reduce) {
3670
- .muka-thumbnail__image,
3671
- .muka-thumbnail__remove {
3672
- transition: none;
3673
- }
3674
-
3675
- .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3676
- transform: none;
3677
- }
3678
- }
3679
-
3680
-
3681
- /* Toggle */
3682
- /* Toggle Component Styles - Using Muka Design Tokens */
3683
-
3684
- /* Wrapper container */
3685
- .muka-toggle {
3686
- display: flex;
3687
- align-items: center;
3688
- gap: var(--spacing-2);
3689
- position: relative;
3690
- padding: var(--spacing-4) 0;
3691
- }
3692
-
3693
- .muka-toggle--with-caption {
3694
- padding: var(--spacing-5) 0;
3695
- }
3696
-
3697
- .muka-toggle--disabled {
3698
- opacity: 0.6;
3699
- }
3700
-
3701
- /* Icon */
3702
- .muka-toggle__icon {
3703
- display: flex;
3704
- align-items: center;
3705
- justify-content: center;
3706
- flex-shrink: 0;
3707
- width: var(--icon-size-default);
3708
- height: var(--icon-size-default);
3709
- color: var(--color-text-default-default);
3710
- }
3711
-
3712
- .muka-toggle__icon svg {
3713
- width: 100%;
3714
- height: 100%;
3715
- }
3716
-
3717
- /* Content area (label + caption) */
3718
- .muka-toggle__content {
3719
- display: flex;
3720
- flex-direction: column;
3721
- flex: 1;
3722
- min-width: 0;
3723
- gap: var(--spacing-1);
3724
- }
3725
-
3726
- /* Label */
3727
- .muka-toggle__label {
3728
- font-family: var(--text-label-lg-regular-fontFamily);
3729
- font-weight: var(--text-label-lg-regular-fontWeight);
3730
- font-size: var(--text-label-lg-regular-fontSize);
3731
- line-height: var(--text-label-lg-regular-lineHeight);
3732
- color: var(--color-text-default-default);
3733
- cursor: pointer;
3734
- }
3735
-
3736
- .muka-toggle--with-caption .muka-toggle__label {
3737
- font-family: var(--text-label-lg-semibold-fontFamily);
3738
- font-weight: var(--text-label-lg-semibold-fontWeight);
3739
- font-size: var(--text-label-lg-semibold-fontSize);
3740
- line-height: var(--text-label-lg-semibold-lineHeight);
3741
- }
3742
-
3743
- .muka-toggle--disabled .muka-toggle__label {
3744
- color: var(--color-text-subtle-default);
3745
- cursor: not-allowed;
3746
- }
3747
-
3748
- /* Caption */
3749
- .muka-toggle__caption {
3750
- font-family: var(--text-body-base-regular-fontFamily);
3751
- font-weight: var(--text-body-base-regular-fontWeight);
3752
- font-size: var(--text-body-base-regular-fontSize);
3753
- line-height: var(--text-body-base-regular-lineHeight);
3754
- color: var(--color-text-subtle-default);
3755
- }
3756
-
3757
- /* Switch container */
3758
- .muka-toggle__switch {
3759
- position: relative;
3760
- display: inline-flex;
3761
- flex-shrink: 0;
3762
- cursor: pointer;
3763
- }
3764
-
3765
- .muka-toggle--disabled .muka-toggle__switch {
3766
- cursor: not-allowed;
3767
- }
3768
-
3769
- /* Hidden native input */
3770
- .muka-toggle__input {
3771
- position: absolute;
3772
- width: 1px;
3773
- height: 1px;
3774
- padding: 0;
3775
- margin: -1px;
3776
- overflow: hidden;
3777
- clip: rect(0, 0, 0, 0);
3778
- white-space: nowrap;
3779
- border: 0;
3780
- }
3781
-
3782
- /* Track (background pill) */
3783
- .muka-toggle__track {
3784
- display: flex;
3785
- align-items: center;
3786
- width: var(--toggle-track-width);
3787
- height: var(--toggle-track-height);
3788
- border-radius: var(--toggle-track-radius);
3789
- background-color: var(--toggle-track-color-off);
3790
- transition: background-color 0.2s ease;
3791
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3792
- position: relative;
3793
- }
3794
-
3795
- /* Knob (sliding circle) */
3796
- .muka-toggle__knob {
3797
- position: absolute;
3798
- width: var(--toggle-knob-size);
3799
- height: var(--toggle-knob-size);
3800
- border-radius: var(--border-radius-full);
3801
- background-color: var(--toggle-knob-color-default);
3802
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3803
- left: var(--toggle-knob-offset);
3804
- transition: left 0.2s ease, transform 0.2s ease;
3805
- }
3806
-
3807
- /* Focus state */
3808
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3809
- outline: 2px solid var(--color-border-focus);
3810
- outline-offset: 2px;
3811
- }
3812
-
3813
- /* Checked (on) state */
3814
- .muka-toggle__input:checked + .muka-toggle__track {
3815
- background-color: var(--toggle-track-color-on);
3816
- }
3817
-
3818
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3819
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3820
- }
3821
-
3822
- /* Disabled state */
3823
- .muka-toggle--disabled .muka-toggle__track {
3824
- background-color: var(--toggle-track-color-disabled);
3825
- box-shadow: none;
3826
- }
3827
-
3828
- .muka-toggle--disabled .muka-toggle__knob {
3829
- background-color: var(--toggle-knob-color-disabled);
3830
- box-shadow: none;
3831
- }
3832
-
3833
- /* Divider */
3834
- .muka-toggle__divider {
3835
- position: absolute;
3836
- bottom: 0;
3837
- left: 0;
3838
- right: 0;
3839
- height: 1px;
3840
- background-color: var(--color-border-muted);
3841
- }
3842
-
3843
-
3844
- /* Tabs */
3845
- /* Tabs Component Styles - Clean underline style tabs matching Figma */
3846
-
3847
- .muka-tabs {
3848
- display: flex;
3849
- flex-direction: column;
3850
- }
3851
-
3852
- /* Alignment Variants */
3853
- .muka-tabs--align-left .muka-tabs__list {
3854
- justify-content: flex-start;
3855
- }
3856
- .muka-tabs--align-center .muka-tabs__list {
3857
- justify-content: center;
3858
- }
3859
- .muka-tabs--align-fill .muka-tabs__list {
3860
- justify-content: space-between;
3861
- }
3862
- .muka-tabs--align-fill .muka-tabs__trigger {
3863
- flex: 1;
3864
- }
3865
-
3866
- /* Tab List — strip container */
3867
- .muka-tabs__list {
3868
- display: flex;
3869
- align-items: center;
3870
- position: relative;
3871
- z-index: 2;
3872
- border-bottom: 1px solid var(--tabs-trigger-color-default-border);
3873
- }
3874
-
3875
- /* Padding: inset the tabs; the divider (border) still spans the full width */
3876
- .muka-tabs--padding-default .muka-tabs__list {
3877
- padding-inline: var(--tabs-list-padding-x);
3878
- }
3879
-
3880
- /* Tab Trigger — clean underline style */
3881
- .muka-tabs__trigger {
3882
- display: inline-flex;
3883
- align-items: center;
3884
- justify-content: center;
3885
- gap: var(--spacing-1);
3886
- background: transparent;
3887
- border: none;
3888
- cursor: pointer;
3889
- user-select: none;
3890
- transition: background-color 0.2s ease, color 0.2s ease;
3891
- outline: none;
3892
- white-space: nowrap;
3893
- position: relative;
3894
- z-index: 2;
3895
- color: var(--tabs-trigger-color-default-foreground);
3896
-
3897
- /* Default MD size values */
3898
- min-height: var(--tabs-trigger-min-height-md);
3899
- padding: var(--spacing-3);
3900
- font-family: var(--text-label-md-regular-fontFamily);
3901
- font-weight: var(--text-label-md-regular-fontWeight);
3902
- font-size: var(--text-label-md-regular-fontSize);
3903
- line-height: var(--text-label-md-regular-lineHeight);
3904
- }
3905
-
3906
- /* Size Variants */
3907
- .muka-tabs--size-sm .muka-tabs__trigger {
3908
- min-height: var(--tabs-trigger-min-height-sm);
3909
- padding: 0 var(--spacing-2);
3910
- font-family: var(--text-label-sm-regular-fontFamily);
3911
- font-weight: var(--text-label-sm-regular-fontWeight);
3912
- font-size: var(--text-label-sm-regular-fontSize);
3913
- line-height: var(--text-label-sm-regular-lineHeight);
3914
- }
3915
-
3916
- .muka-tabs--size-lg .muka-tabs__trigger {
3917
- min-height: var(--tabs-trigger-min-height-lg);
3918
- padding: var(--spacing-4);
3919
- font-family: var(--text-label-lg-regular-fontFamily);
3920
- font-weight: var(--text-label-lg-regular-fontWeight);
3921
- font-size: var(--text-label-lg-regular-fontSize);
3922
- line-height: var(--text-label-lg-regular-lineHeight);
3923
- }
3924
-
3925
- /* Hover state */
3926
- .muka-tabs__trigger:hover:not(:disabled):not(.muka-tabs__trigger--current) {
3927
- color: var(--tabs-trigger-color-hover-foreground);
3928
- }
3929
-
3930
- /* Current tab */
3931
- .muka-tabs__trigger--current {
3932
- color: var(--tabs-trigger-color-current-foreground);
3933
- }
3934
-
3935
- /* Active bottom border (underline) */
3936
- .muka-tabs__trigger--current::after {
3937
- content: '';
3938
- position: absolute;
3939
- bottom: -1px; /* Overlap the 1px border */
3940
- left: 0;
3941
- right: 0;
3942
- height: var(--tabs-indicator-height-md);
3943
- background-color: var(--tabs-indicator-color);
3944
- border-bottom-left-radius: 1px;
3945
- border-bottom-right-radius: 1px;
3946
- border-top-left-radius: 3px;
3947
- border-top-right-radius: 3px;
3948
- z-index: 3;
3949
- }
3950
-
3951
- .muka-tabs--size-sm .muka-tabs__trigger--current::after {
3952
- height: var(--tabs-indicator-height-sm);
3953
- }
3954
- .muka-tabs--size-lg .muka-tabs__trigger--current::after {
3955
- height: var(--tabs-indicator-height-lg);
3956
- }
3957
-
3958
- .muka-tabs__trigger--disabled {
3959
- color: var(--tabs-trigger-color-disabled-foreground);
3960
- cursor: not-allowed;
3961
- }
3962
-
3963
- .muka-tabs__trigger:focus-visible {
3964
- outline: 2px solid var(--color-border-focus);
3965
- outline-offset: -2px;
3966
- }
3967
-
3968
- /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
3969
- item sits 12px from the text */
3970
- .muka-tabs__label {
3971
- padding: 0 var(--spacing-2);
3972
- }
3973
-
3974
- /* Leading item: icon, avatar, avatar group or data pie chart */
3975
- .muka-tabs__leading {
3976
- display: flex;
3977
- align-items: center;
3978
- justify-content: center;
3979
- flex-shrink: 0;
3980
- }
3981
- .muka-tabs__trigger .muka-icon {
3982
- color: inherit;
3983
- }
3984
- /* Icon sizes only: avatars and pie charts are sized through their size prop */
3985
- .muka-tabs--size-sm .muka-tabs__leading > svg,
3986
- .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
3987
- .muka-tabs--size-md .muka-tabs__leading > svg,
3988
- .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
3989
- .muka-tabs--size-lg .muka-tabs__leading > svg,
3990
- .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
3991
-
3992
- /* Responsive Scroll behavior on small screens */
3993
- @media (max-width: 768px) {
3994
- .muka-tabs__list {
3995
- /* Make scrollable */
3996
- overflow-x: auto;
3997
- overflow-y: hidden;
3998
- /* Force left alignment on mobile to prevent clipping when scrolling */
3999
- justify-content: flex-start !important;
4000
- max-width: 100vw;
4001
- -webkit-overflow-scrolling: touch;
4002
- /* Hide scrollbar for cleaner look */
4003
- scrollbar-width: none;
4004
- }
4005
- .muka-tabs__list::-webkit-scrollbar {
4006
- display: none;
4007
- }
4008
- /* Remove flex: 1 behavior for Fill tabs on mobile so they map correctly */
4009
- .muka-tabs--align-fill .muka-tabs__trigger {
4010
- flex: 0 0 auto;
4011
- }
3815
+ .muka-thumbnail__remove:hover {
3816
+ color: var(--button-color-tertiary-foreground-hover);
3817
+ background-color: var(--button-color-tertiary-background-hover);
3818
+ border-color: var(--button-color-tertiary-border-hover);
4012
3819
  }
4013
3820
 
4014
- /* Tab Panel — content area */
4015
- .muka-tabs__panel {
4016
- background-color: var(--tabs-panel-background);
4017
- /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4018
- border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4019
- padding: var(--spacing-4);
4020
- position: relative;
4021
- z-index: 1;
4022
- font-family: var(--text-body-base-regular-fontFamily);
4023
- font-weight: var(--text-body-base-regular-fontWeight);
4024
- font-size: var(--text-body-base-regular-fontSize);
4025
- line-height: var(--text-body-base-regular-lineHeight);
3821
+ .muka-thumbnail__remove:active {
3822
+ color: var(--button-color-tertiary-foreground-pressed);
3823
+ background-color: var(--button-color-tertiary-background-pressed);
3824
+ border-color: var(--button-color-tertiary-border-pressed);
4026
3825
  }
4027
3826
 
4028
- .muka-tabs__panel:focus-visible {
3827
+ .muka-thumbnail__remove:focus-visible {
4029
3828
  outline: 2px solid var(--color-border-focus);
4030
3829
  outline-offset: 2px;
4031
3830
  }
4032
3831
 
3832
+ /* ─── Reduced motion ──────────────────────────────────── */
3833
+ @media (prefers-reduced-motion: reduce) {
3834
+ .muka-thumbnail__image,
3835
+ .muka-thumbnail__remove {
3836
+ transition: none;
3837
+ }
3838
+
3839
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3840
+ transform: none;
3841
+ }
3842
+ }
3843
+
4033
3844
 
4034
3845
  /* Textarea */
4035
3846
  /* Textarea Component Styles - Using Muka Design Tokens */
@@ -4277,6 +4088,196 @@ body {
4277
4088
  }
4278
4089
 
4279
4090
 
4091
+ /* Tabs */
4092
+ /* Tabs Component Styles - Clean underline style tabs matching Figma */
4093
+
4094
+ .muka-tabs {
4095
+ display: flex;
4096
+ flex-direction: column;
4097
+ }
4098
+
4099
+ /* Alignment Variants */
4100
+ .muka-tabs--align-left .muka-tabs__list {
4101
+ justify-content: flex-start;
4102
+ }
4103
+ .muka-tabs--align-center .muka-tabs__list {
4104
+ justify-content: center;
4105
+ }
4106
+ .muka-tabs--align-fill .muka-tabs__list {
4107
+ justify-content: space-between;
4108
+ }
4109
+ .muka-tabs--align-fill .muka-tabs__trigger {
4110
+ flex: 1;
4111
+ }
4112
+
4113
+ /* Tab List — strip container */
4114
+ .muka-tabs__list {
4115
+ display: flex;
4116
+ align-items: center;
4117
+ position: relative;
4118
+ z-index: 2;
4119
+ border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4120
+ }
4121
+
4122
+ /* Padding: inset the tabs; the divider (border) still spans the full width */
4123
+ .muka-tabs--padding-default .muka-tabs__list {
4124
+ padding-inline: var(--tabs-list-padding-x);
4125
+ }
4126
+
4127
+ /* Tab Trigger — clean underline style */
4128
+ .muka-tabs__trigger {
4129
+ display: inline-flex;
4130
+ align-items: center;
4131
+ justify-content: center;
4132
+ gap: var(--spacing-1);
4133
+ background: transparent;
4134
+ border: none;
4135
+ cursor: pointer;
4136
+ user-select: none;
4137
+ transition: background-color 0.2s ease, color 0.2s ease;
4138
+ outline: none;
4139
+ white-space: nowrap;
4140
+ position: relative;
4141
+ z-index: 2;
4142
+ color: var(--tabs-trigger-color-default-foreground);
4143
+
4144
+ /* Default MD size values */
4145
+ min-height: var(--tabs-trigger-min-height-md);
4146
+ padding: var(--spacing-3);
4147
+ font-family: var(--text-label-md-regular-fontFamily);
4148
+ font-weight: var(--text-label-md-regular-fontWeight);
4149
+ font-size: var(--text-label-md-regular-fontSize);
4150
+ line-height: var(--text-label-md-regular-lineHeight);
4151
+ }
4152
+
4153
+ /* Size Variants */
4154
+ .muka-tabs--size-sm .muka-tabs__trigger {
4155
+ min-height: var(--tabs-trigger-min-height-sm);
4156
+ padding: 0 var(--spacing-2);
4157
+ font-family: var(--text-label-sm-regular-fontFamily);
4158
+ font-weight: var(--text-label-sm-regular-fontWeight);
4159
+ font-size: var(--text-label-sm-regular-fontSize);
4160
+ line-height: var(--text-label-sm-regular-lineHeight);
4161
+ }
4162
+
4163
+ .muka-tabs--size-lg .muka-tabs__trigger {
4164
+ min-height: var(--tabs-trigger-min-height-lg);
4165
+ padding: var(--spacing-4);
4166
+ font-family: var(--text-label-lg-regular-fontFamily);
4167
+ font-weight: var(--text-label-lg-regular-fontWeight);
4168
+ font-size: var(--text-label-lg-regular-fontSize);
4169
+ line-height: var(--text-label-lg-regular-lineHeight);
4170
+ }
4171
+
4172
+ /* Hover state */
4173
+ .muka-tabs__trigger:hover:not(:disabled):not(.muka-tabs__trigger--current) {
4174
+ color: var(--tabs-trigger-color-hover-foreground);
4175
+ }
4176
+
4177
+ /* Current tab */
4178
+ .muka-tabs__trigger--current {
4179
+ color: var(--tabs-trigger-color-current-foreground);
4180
+ }
4181
+
4182
+ /* Active bottom border (underline) */
4183
+ .muka-tabs__trigger--current::after {
4184
+ content: '';
4185
+ position: absolute;
4186
+ bottom: -1px; /* Overlap the 1px border */
4187
+ left: 0;
4188
+ right: 0;
4189
+ height: var(--tabs-indicator-height-md);
4190
+ background-color: var(--tabs-indicator-color);
4191
+ border-bottom-left-radius: 1px;
4192
+ border-bottom-right-radius: 1px;
4193
+ border-top-left-radius: 3px;
4194
+ border-top-right-radius: 3px;
4195
+ z-index: 3;
4196
+ }
4197
+
4198
+ .muka-tabs--size-sm .muka-tabs__trigger--current::after {
4199
+ height: var(--tabs-indicator-height-sm);
4200
+ }
4201
+ .muka-tabs--size-lg .muka-tabs__trigger--current::after {
4202
+ height: var(--tabs-indicator-height-lg);
4203
+ }
4204
+
4205
+ .muka-tabs__trigger--disabled {
4206
+ color: var(--tabs-trigger-color-disabled-foreground);
4207
+ cursor: not-allowed;
4208
+ }
4209
+
4210
+ .muka-tabs__trigger:focus-visible {
4211
+ outline: 2px solid var(--color-border-focus);
4212
+ outline-offset: -2px;
4213
+ }
4214
+
4215
+ /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
4216
+ item sits 12px from the text */
4217
+ .muka-tabs__label {
4218
+ padding: 0 var(--spacing-2);
4219
+ }
4220
+
4221
+ /* Leading item: icon, avatar, avatar group or data pie chart */
4222
+ .muka-tabs__leading {
4223
+ display: flex;
4224
+ align-items: center;
4225
+ justify-content: center;
4226
+ flex-shrink: 0;
4227
+ }
4228
+ .muka-tabs__trigger .muka-icon {
4229
+ color: inherit;
4230
+ }
4231
+ /* Icon sizes only: avatars and pie charts are sized through their size prop */
4232
+ .muka-tabs--size-sm .muka-tabs__leading > svg,
4233
+ .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
4234
+ .muka-tabs--size-md .muka-tabs__leading > svg,
4235
+ .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
4236
+ .muka-tabs--size-lg .muka-tabs__leading > svg,
4237
+ .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
4238
+
4239
+ /* Responsive Scroll behavior on small screens */
4240
+ @media (max-width: 768px) {
4241
+ .muka-tabs__list {
4242
+ /* Make scrollable */
4243
+ overflow-x: auto;
4244
+ overflow-y: hidden;
4245
+ /* Force left alignment on mobile to prevent clipping when scrolling */
4246
+ justify-content: flex-start !important;
4247
+ max-width: 100vw;
4248
+ -webkit-overflow-scrolling: touch;
4249
+ /* Hide scrollbar for cleaner look */
4250
+ scrollbar-width: none;
4251
+ }
4252
+ .muka-tabs__list::-webkit-scrollbar {
4253
+ display: none;
4254
+ }
4255
+ /* Remove flex: 1 behavior for Fill tabs on mobile so they map correctly */
4256
+ .muka-tabs--align-fill .muka-tabs__trigger {
4257
+ flex: 0 0 auto;
4258
+ }
4259
+ }
4260
+
4261
+ /* Tab Panel — content area */
4262
+ .muka-tabs__panel {
4263
+ background-color: var(--tabs-panel-background);
4264
+ /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4265
+ border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4266
+ padding: var(--spacing-4);
4267
+ position: relative;
4268
+ z-index: 1;
4269
+ font-family: var(--text-body-base-regular-fontFamily);
4270
+ font-weight: var(--text-body-base-regular-fontWeight);
4271
+ font-size: var(--text-body-base-regular-fontSize);
4272
+ line-height: var(--text-body-base-regular-lineHeight);
4273
+ }
4274
+
4275
+ .muka-tabs__panel:focus-visible {
4276
+ outline: 2px solid var(--color-border-focus);
4277
+ outline-offset: 2px;
4278
+ }
4279
+
4280
+
4280
4281
  /* Table */
4281
4282
  /* Table Component Styles - Using Muka Design Tokens */
4282
4283
 
@@ -14878,9 +14879,12 @@ button.muka-chat-photo-grid__tile:focus-visible {
14878
14879
 
14879
14880
  /* Avatar Group (Figma "Avatar Stack") */
14880
14881
  .muka-avatar-group {
14882
+ position: relative;
14881
14883
  display: inline-flex;
14882
14884
  align-items: center;
14883
14885
  flex-direction: row;
14886
+ /* Never stretch to a grid cell or column, so the badge stays on the last avatar */
14887
+ width: fit-content;
14884
14888
  }
14885
14889
 
14886
14890
  /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
@@ -14900,7 +14904,7 @@ button.muka-chat-photo-grid__tile:focus-visible {
14900
14904
  box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14901
14905
  }
14902
14906
 
14903
- /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14907
+ /* Overlap. Figma specifies exact values for 40 / 32 / 24px avatars (xs / 2xs / 3xs);
14904
14908
  other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14905
14909
  .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14906
14910
  .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
@@ -14915,13 +14919,13 @@ button.muka-chat-photo-grid__tile:focus-visible {
14915
14919
  .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14916
14920
  .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14917
14921
 
14918
- .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14922
+ .muka-avatar-group--tight.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-xs); }
14919
14923
  .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14920
14924
  .muka-avatar-group--tight.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-3xs); }
14921
- .muka-avatar-group--compact.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-sm); }
14925
+ .muka-avatar-group--compact.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-xs); }
14922
14926
  .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14923
14927
  .muka-avatar-group--compact.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-3xs); }
14924
- .muka-avatar-group--spacious.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-sm); }
14928
+ .muka-avatar-group--spacious.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-xs); }
14925
14929
  .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14926
14930
  .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14927
14931
 
@@ -14929,6 +14933,14 @@ button.muka-chat-photo-grid__tile:focus-visible {
14929
14933
  margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14930
14934
  }
14931
14935
 
14936
+ /* Badge: a BadgeNumber on the top-right corner of the stack, above every avatar */
14937
+ .muka-avatar-group__badge {
14938
+ position: absolute;
14939
+ top: calc(-1 * var(--avatar-group-badge-offset));
14940
+ right: calc(-1 * var(--avatar-group-badge-offset));
14941
+ z-index: 20;
14942
+ }
14943
+
14932
14944
  /* Overflow avatar styling */
14933
14945
  .muka-avatar--overflow {
14934
14946
  background-color: var(--avatar-color-background-default);