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