@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
@@ -2047,15 +2047,16 @@ body {
2047
2047
  --avatar-status-size-xl: 1.5rem;
2048
2048
  --avatar-group-ring-width: 0.125rem;
2049
2049
  --avatar-group-ring-color: #fcfcfc;
2050
- --avatar-group-overlap-tight-sm: 2rem;
2051
- --avatar-group-overlap-tight-2xs: 1.25rem;
2050
+ --avatar-group-overlap-tight-xs: 1.75rem;
2051
+ --avatar-group-overlap-tight-2xs: 1.5rem;
2052
2052
  --avatar-group-overlap-tight-3xs: 1rem;
2053
- --avatar-group-overlap-compact-sm: 1.5rem;
2054
- --avatar-group-overlap-compact-2xs: 1rem;
2055
- --avatar-group-overlap-compact-3xs: 0.75rem;
2056
- --avatar-group-overlap-spacious-sm: 1rem;
2053
+ --avatar-group-overlap-compact-xs: 1.5rem;
2054
+ --avatar-group-overlap-compact-2xs: 1.125rem;
2055
+ --avatar-group-overlap-compact-3xs: 0.875rem;
2056
+ --avatar-group-overlap-spacious-xs: 1rem;
2057
2057
  --avatar-group-overlap-spacious-2xs: 0.75rem;
2058
2058
  --avatar-group-overlap-spacious-3xs: 0.5rem;
2059
+ --avatar-group-badge-offset: 0.25rem;
2059
2060
  --toast-color-info-background: #202020;
2060
2061
  --toast-color-info-foreground: #fcfcfc;
2061
2062
  --toast-color-info-accent: #edf6ff;
@@ -2461,6 +2462,116 @@ body {
2461
2462
  }
2462
2463
 
2463
2464
 
2465
+ /* View */
2466
+ /* View Component Styles */
2467
+
2468
+ /* ─── Base layout ─────────────────────────────────────── */
2469
+
2470
+ .muka-view {
2471
+ display: flex;
2472
+ flex-direction: column;
2473
+ height: 100dvh;
2474
+ background-color: var(--view-color-background);
2475
+ position: relative;
2476
+ isolation: isolate;
2477
+ box-sizing: border-box;
2478
+
2479
+ /* Width reserved for the footer nav once it becomes a left sidebar at the
2480
+ large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2481
+ --view-sidebar-width: 240px;
2482
+ }
2483
+
2484
+ /* ─── Surface level variants ─────────────────────────── */
2485
+
2486
+ .muka-view--surface-3 {
2487
+ background-color: var(--color-surface-level3);
2488
+ }
2489
+
2490
+ /* ─── Large screens: make room for the left sidebar ──────────
2491
+ A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2492
+ ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2493
+ actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2494
+ the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2495
+ for a sidebar that hasn't rendered yet. */
2496
+ @media (min-width: 1024px) {
2497
+ .muka-view:has(.muka-bottombar--desktop-sidebar) {
2498
+ padding-left: var(--view-sidebar-width);
2499
+ }
2500
+ }
2501
+
2502
+ /* ─── TopBar elevation ────────────────────────────────── */
2503
+
2504
+ .muka-view .muka-topbar {
2505
+ flex-shrink: 0;
2506
+ z-index: 3;
2507
+ box-shadow: var(--shadow-level2);
2508
+ }
2509
+
2510
+ /* ─── Scrollable body ─────────────────────────────────── */
2511
+
2512
+ .muka-view__body {
2513
+ flex: 1 1 0%;
2514
+ min-height: 0;
2515
+ overflow-y: auto;
2516
+ overflow-x: clip;
2517
+ z-index: 1;
2518
+
2519
+ /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2520
+ content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2521
+ reveal the content underneath. */
2522
+ display: flex;
2523
+ flex-direction: column;
2524
+ }
2525
+
2526
+ /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2527
+ using the alias-layer section/container tokens, while the body scrolls full
2528
+ width. Full-bleed below large. */
2529
+ .muka-view__body-inner {
2530
+ width: 100%;
2531
+ /* Grow on short content so the sticky footer is pushed to the bottom rather
2532
+ than floating mid-screen. */
2533
+ flex: 1 0 auto;
2534
+ }
2535
+
2536
+ @media (min-width: 1024px) {
2537
+ .muka-view:not([data-size]) .muka-view__body-inner {
2538
+ max-width: var(--container-max-width-xl);
2539
+ margin-inline: auto;
2540
+ padding-inline: var(--section-padding-horizontal-default);
2541
+ }
2542
+ }
2543
+
2544
+ .muka-view[data-size='lg'] .muka-view__body-inner {
2545
+ max-width: var(--container-max-width-xl);
2546
+ margin-inline: auto;
2547
+ padding-inline: var(--section-padding-horizontal-default);
2548
+ }
2549
+
2550
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2551
+
2552
+ .muka-view__footer {
2553
+ position: sticky;
2554
+ bottom: 0;
2555
+ flex-shrink: 0;
2556
+ z-index: 2;
2557
+ }
2558
+
2559
+ /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2560
+ navigation at the large tier, so hide a footer that holds a navigation bar.
2561
+ Scoped to `.muka-app-shell` so bare Views (and the standalone
2562
+ desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2563
+ (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2564
+ @media (min-width: 1024px) {
2565
+ .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2566
+ display: none;
2567
+ }
2568
+ }
2569
+
2570
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2571
+ display: none;
2572
+ }
2573
+
2574
+
2464
2575
  /* Typography */
2465
2576
  .muka-typography-catalog {
2466
2577
  display: flex;
@@ -2811,122 +2922,175 @@ body {
2811
2922
  }
2812
2923
 
2813
2924
 
2814
- /* View */
2815
- /* View Component Styles */
2816
-
2817
- /* ─── Base layout ─────────────────────────────────────── */
2925
+ /* Toggle */
2926
+ /* Toggle Component Styles - Using Muka Design Tokens */
2818
2927
 
2819
- .muka-view {
2928
+ /* Wrapper container */
2929
+ .muka-toggle {
2820
2930
  display: flex;
2821
- flex-direction: column;
2822
- height: 100dvh;
2823
- background-color: var(--view-color-background);
2931
+ align-items: center;
2932
+ gap: var(--spacing-2);
2824
2933
  position: relative;
2825
- isolation: isolate;
2826
- box-sizing: border-box;
2827
-
2828
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2829
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2830
- --view-sidebar-width: 240px;
2934
+ padding: var(--spacing-4) 0;
2831
2935
  }
2832
2936
 
2833
- /* ─── Surface level variants ─────────────────────────── */
2834
-
2835
- .muka-view--surface-3 {
2836
- background-color: var(--color-surface-level3);
2937
+ .muka-toggle--with-caption {
2938
+ padding: var(--spacing-5) 0;
2837
2939
  }
2838
2940
 
2839
- /* ─── Large screens: make room for the left sidebar ──────────
2840
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2841
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2842
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2843
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2844
- for a sidebar that hasn't rendered yet. */
2845
- @media (min-width: 1024px) {
2846
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2847
- padding-left: var(--view-sidebar-width);
2848
- }
2941
+ .muka-toggle--disabled {
2942
+ opacity: 0.6;
2849
2943
  }
2850
2944
 
2851
- /* ─── TopBar elevation ────────────────────────────────── */
2852
-
2853
- .muka-view .muka-topbar {
2945
+ /* Icon */
2946
+ .muka-toggle__icon {
2947
+ display: flex;
2948
+ align-items: center;
2949
+ justify-content: center;
2854
2950
  flex-shrink: 0;
2855
- z-index: 3;
2856
- box-shadow: var(--shadow-level2);
2951
+ width: var(--icon-size-default);
2952
+ height: var(--icon-size-default);
2953
+ color: var(--color-text-default-default);
2857
2954
  }
2858
2955
 
2859
- /* ─── Scrollable body ─────────────────────────────────── */
2860
-
2861
- .muka-view__body {
2862
- flex: 1 1 0%;
2863
- min-height: 0;
2864
- overflow-y: auto;
2865
- overflow-x: clip;
2866
- z-index: 1;
2956
+ .muka-toggle__icon svg {
2957
+ width: 100%;
2958
+ height: 100%;
2959
+ }
2867
2960
 
2868
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2869
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2870
- reveal the content underneath. */
2961
+ /* Content area (label + caption) */
2962
+ .muka-toggle__content {
2871
2963
  display: flex;
2872
2964
  flex-direction: column;
2965
+ flex: 1;
2966
+ min-width: 0;
2967
+ gap: var(--spacing-1);
2873
2968
  }
2874
2969
 
2875
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2876
- using the alias-layer section/container tokens, while the body scrolls full
2877
- width. Full-bleed below large. */
2878
- .muka-view__body-inner {
2879
- width: 100%;
2880
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2881
- than floating mid-screen. */
2882
- flex: 1 0 auto;
2970
+ /* Label */
2971
+ .muka-toggle__label {
2972
+ font-family: var(--text-label-lg-regular-fontFamily);
2973
+ font-weight: var(--text-label-lg-regular-fontWeight);
2974
+ font-size: var(--text-label-lg-regular-fontSize);
2975
+ line-height: var(--text-label-lg-regular-lineHeight);
2976
+ color: var(--color-text-default-default);
2977
+ cursor: pointer;
2883
2978
  }
2884
2979
 
2885
- @media (min-width: 1024px) {
2886
- .muka-view:not([data-size]) .muka-view__body-inner {
2887
- max-width: var(--container-max-width-xl);
2888
- margin-inline: auto;
2889
- padding-inline: var(--section-padding-horizontal-default);
2890
- }
2980
+ .muka-toggle--with-caption .muka-toggle__label {
2981
+ font-family: var(--text-label-lg-semibold-fontFamily);
2982
+ font-weight: var(--text-label-lg-semibold-fontWeight);
2983
+ font-size: var(--text-label-lg-semibold-fontSize);
2984
+ line-height: var(--text-label-lg-semibold-lineHeight);
2891
2985
  }
2892
2986
 
2893
- .muka-view[data-size='lg'] .muka-view__body-inner {
2894
- max-width: var(--container-max-width-xl);
2895
- margin-inline: auto;
2896
- padding-inline: var(--section-padding-horizontal-default);
2987
+ .muka-toggle--disabled .muka-toggle__label {
2988
+ color: var(--color-text-subtle-default);
2989
+ cursor: not-allowed;
2897
2990
  }
2898
2991
 
2899
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2900
-
2901
- .muka-view__footer {
2902
- position: sticky;
2903
- bottom: 0;
2904
- flex-shrink: 0;
2905
- z-index: 2;
2992
+ /* Caption */
2993
+ .muka-toggle__caption {
2994
+ font-family: var(--text-body-base-regular-fontFamily);
2995
+ font-weight: var(--text-body-base-regular-fontWeight);
2996
+ font-size: var(--text-body-base-regular-fontSize);
2997
+ line-height: var(--text-body-base-regular-lineHeight);
2998
+ color: var(--color-text-subtle-default);
2906
2999
  }
2907
3000
 
2908
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2909
- navigation at the large tier, so hide a footer that holds a navigation bar.
2910
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2911
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2912
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2913
- @media (min-width: 1024px) {
2914
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2915
- display: none;
2916
- }
3001
+ /* Switch container */
3002
+ .muka-toggle__switch {
3003
+ position: relative;
3004
+ display: inline-flex;
3005
+ flex-shrink: 0;
3006
+ cursor: pointer;
2917
3007
  }
2918
3008
 
2919
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2920
- display: none;
3009
+ .muka-toggle--disabled .muka-toggle__switch {
3010
+ cursor: not-allowed;
2921
3011
  }
2922
3012
 
2923
-
2924
- /* Toast */
2925
- /* Toast Component Styles - Using Muka Design Tokens */
2926
-
2927
- .muka-toast {
2928
- display: flex;
2929
- align-items: flex-start;
3013
+ /* Hidden native input */
3014
+ .muka-toggle__input {
3015
+ position: absolute;
3016
+ width: 1px;
3017
+ height: 1px;
3018
+ padding: 0;
3019
+ margin: -1px;
3020
+ overflow: hidden;
3021
+ clip: rect(0, 0, 0, 0);
3022
+ white-space: nowrap;
3023
+ border: 0;
3024
+ }
3025
+
3026
+ /* Track (background pill) */
3027
+ .muka-toggle__track {
3028
+ display: flex;
3029
+ align-items: center;
3030
+ width: var(--toggle-track-width);
3031
+ height: var(--toggle-track-height);
3032
+ border-radius: var(--toggle-track-radius);
3033
+ background-color: var(--toggle-track-color-off);
3034
+ transition: background-color 0.2s ease;
3035
+ box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3036
+ position: relative;
3037
+ }
3038
+
3039
+ /* Knob (sliding circle) */
3040
+ .muka-toggle__knob {
3041
+ position: absolute;
3042
+ width: var(--toggle-knob-size);
3043
+ height: var(--toggle-knob-size);
3044
+ border-radius: var(--border-radius-full);
3045
+ background-color: var(--toggle-knob-color-default);
3046
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3047
+ left: var(--toggle-knob-offset);
3048
+ transition: left 0.2s ease, transform 0.2s ease;
3049
+ }
3050
+
3051
+ /* Focus state */
3052
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3053
+ outline: 2px solid var(--color-border-focus);
3054
+ outline-offset: 2px;
3055
+ }
3056
+
3057
+ /* Checked (on) state */
3058
+ .muka-toggle__input:checked + .muka-toggle__track {
3059
+ background-color: var(--toggle-track-color-on);
3060
+ }
3061
+
3062
+ .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3063
+ left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3064
+ }
3065
+
3066
+ /* Disabled state */
3067
+ .muka-toggle--disabled .muka-toggle__track {
3068
+ background-color: var(--toggle-track-color-disabled);
3069
+ box-shadow: none;
3070
+ }
3071
+
3072
+ .muka-toggle--disabled .muka-toggle__knob {
3073
+ background-color: var(--toggle-knob-color-disabled);
3074
+ box-shadow: none;
3075
+ }
3076
+
3077
+ /* Divider */
3078
+ .muka-toggle__divider {
3079
+ position: absolute;
3080
+ bottom: 0;
3081
+ left: 0;
3082
+ right: 0;
3083
+ height: 1px;
3084
+ background-color: var(--color-border-muted);
3085
+ }
3086
+
3087
+
3088
+ /* Toast */
3089
+ /* Toast Component Styles - Using Muka Design Tokens */
3090
+
3091
+ .muka-toast {
3092
+ display: flex;
3093
+ align-items: flex-start;
2930
3094
  gap: var(--toast-gap);
2931
3095
  padding: var(--toast-padding-y) var(--toast-padding-x);
2932
3096
  border-radius: var(--toast-radius);
@@ -3616,388 +3780,35 @@ body {
3616
3780
  border-color var(--motion-duration-micro) var(--motion-easing-enter);
3617
3781
  }
3618
3782
 
3619
- .muka-thumbnail__remove:hover {
3620
- color: var(--button-color-tertiary-foreground-hover);
3621
- background-color: var(--button-color-tertiary-background-hover);
3622
- border-color: var(--button-color-tertiary-border-hover);
3623
- }
3624
-
3625
- .muka-thumbnail__remove:active {
3626
- color: var(--button-color-tertiary-foreground-pressed);
3627
- background-color: var(--button-color-tertiary-background-pressed);
3628
- border-color: var(--button-color-tertiary-border-pressed);
3629
- }
3630
-
3631
- .muka-thumbnail__remove:focus-visible {
3632
- outline: 2px solid var(--color-border-focus);
3633
- outline-offset: 2px;
3634
- }
3635
-
3636
- /* ─── Reduced motion ──────────────────────────────────── */
3637
- @media (prefers-reduced-motion: reduce) {
3638
- .muka-thumbnail__image,
3639
- .muka-thumbnail__remove {
3640
- transition: none;
3641
- }
3642
-
3643
- .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3644
- transform: none;
3645
- }
3646
- }
3647
-
3648
-
3649
- /* Toggle */
3650
- /* Toggle Component Styles - Using Muka Design Tokens */
3651
-
3652
- /* Wrapper container */
3653
- .muka-toggle {
3654
- display: flex;
3655
- align-items: center;
3656
- gap: var(--spacing-2);
3657
- position: relative;
3658
- padding: var(--spacing-4) 0;
3659
- }
3660
-
3661
- .muka-toggle--with-caption {
3662
- padding: var(--spacing-5) 0;
3663
- }
3664
-
3665
- .muka-toggle--disabled {
3666
- opacity: 0.6;
3667
- }
3668
-
3669
- /* Icon */
3670
- .muka-toggle__icon {
3671
- display: flex;
3672
- align-items: center;
3673
- justify-content: center;
3674
- flex-shrink: 0;
3675
- width: var(--icon-size-default);
3676
- height: var(--icon-size-default);
3677
- color: var(--color-text-default-default);
3678
- }
3679
-
3680
- .muka-toggle__icon svg {
3681
- width: 100%;
3682
- height: 100%;
3683
- }
3684
-
3685
- /* Content area (label + caption) */
3686
- .muka-toggle__content {
3687
- display: flex;
3688
- flex-direction: column;
3689
- flex: 1;
3690
- min-width: 0;
3691
- gap: var(--spacing-1);
3692
- }
3693
-
3694
- /* Label */
3695
- .muka-toggle__label {
3696
- font-family: var(--text-label-lg-regular-fontFamily);
3697
- font-weight: var(--text-label-lg-regular-fontWeight);
3698
- font-size: var(--text-label-lg-regular-fontSize);
3699
- line-height: var(--text-label-lg-regular-lineHeight);
3700
- color: var(--color-text-default-default);
3701
- cursor: pointer;
3702
- }
3703
-
3704
- .muka-toggle--with-caption .muka-toggle__label {
3705
- font-family: var(--text-label-lg-semibold-fontFamily);
3706
- font-weight: var(--text-label-lg-semibold-fontWeight);
3707
- font-size: var(--text-label-lg-semibold-fontSize);
3708
- line-height: var(--text-label-lg-semibold-lineHeight);
3709
- }
3710
-
3711
- .muka-toggle--disabled .muka-toggle__label {
3712
- color: var(--color-text-subtle-default);
3713
- cursor: not-allowed;
3714
- }
3715
-
3716
- /* Caption */
3717
- .muka-toggle__caption {
3718
- font-family: var(--text-body-base-regular-fontFamily);
3719
- font-weight: var(--text-body-base-regular-fontWeight);
3720
- font-size: var(--text-body-base-regular-fontSize);
3721
- line-height: var(--text-body-base-regular-lineHeight);
3722
- color: var(--color-text-subtle-default);
3723
- }
3724
-
3725
- /* Switch container */
3726
- .muka-toggle__switch {
3727
- position: relative;
3728
- display: inline-flex;
3729
- flex-shrink: 0;
3730
- cursor: pointer;
3731
- }
3732
-
3733
- .muka-toggle--disabled .muka-toggle__switch {
3734
- cursor: not-allowed;
3735
- }
3736
-
3737
- /* Hidden native input */
3738
- .muka-toggle__input {
3739
- position: absolute;
3740
- width: 1px;
3741
- height: 1px;
3742
- padding: 0;
3743
- margin: -1px;
3744
- overflow: hidden;
3745
- clip: rect(0, 0, 0, 0);
3746
- white-space: nowrap;
3747
- border: 0;
3748
- }
3749
-
3750
- /* Track (background pill) */
3751
- .muka-toggle__track {
3752
- display: flex;
3753
- align-items: center;
3754
- width: var(--toggle-track-width);
3755
- height: var(--toggle-track-height);
3756
- border-radius: var(--toggle-track-radius);
3757
- background-color: var(--toggle-track-color-off);
3758
- transition: background-color 0.2s ease;
3759
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3760
- position: relative;
3761
- }
3762
-
3763
- /* Knob (sliding circle) */
3764
- .muka-toggle__knob {
3765
- position: absolute;
3766
- width: var(--toggle-knob-size);
3767
- height: var(--toggle-knob-size);
3768
- border-radius: var(--border-radius-full);
3769
- background-color: var(--toggle-knob-color-default);
3770
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3771
- left: var(--toggle-knob-offset);
3772
- transition: left 0.2s ease, transform 0.2s ease;
3773
- }
3774
-
3775
- /* Focus state */
3776
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3777
- outline: 2px solid var(--color-border-focus);
3778
- outline-offset: 2px;
3779
- }
3780
-
3781
- /* Checked (on) state */
3782
- .muka-toggle__input:checked + .muka-toggle__track {
3783
- background-color: var(--toggle-track-color-on);
3784
- }
3785
-
3786
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3787
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3788
- }
3789
-
3790
- /* Disabled state */
3791
- .muka-toggle--disabled .muka-toggle__track {
3792
- background-color: var(--toggle-track-color-disabled);
3793
- box-shadow: none;
3794
- }
3795
-
3796
- .muka-toggle--disabled .muka-toggle__knob {
3797
- background-color: var(--toggle-knob-color-disabled);
3798
- box-shadow: none;
3799
- }
3800
-
3801
- /* Divider */
3802
- .muka-toggle__divider {
3803
- position: absolute;
3804
- bottom: 0;
3805
- left: 0;
3806
- right: 0;
3807
- height: 1px;
3808
- background-color: var(--color-border-muted);
3809
- }
3810
-
3811
-
3812
- /* Tabs */
3813
- /* Tabs Component Styles - Clean underline style tabs matching Figma */
3814
-
3815
- .muka-tabs {
3816
- display: flex;
3817
- flex-direction: column;
3818
- }
3819
-
3820
- /* Alignment Variants */
3821
- .muka-tabs--align-left .muka-tabs__list {
3822
- justify-content: flex-start;
3823
- }
3824
- .muka-tabs--align-center .muka-tabs__list {
3825
- justify-content: center;
3826
- }
3827
- .muka-tabs--align-fill .muka-tabs__list {
3828
- justify-content: space-between;
3829
- }
3830
- .muka-tabs--align-fill .muka-tabs__trigger {
3831
- flex: 1;
3832
- }
3833
-
3834
- /* Tab List — strip container */
3835
- .muka-tabs__list {
3836
- display: flex;
3837
- align-items: center;
3838
- position: relative;
3839
- z-index: 2;
3840
- border-bottom: 1px solid var(--tabs-trigger-color-default-border);
3841
- }
3842
-
3843
- /* Padding: inset the tabs; the divider (border) still spans the full width */
3844
- .muka-tabs--padding-default .muka-tabs__list {
3845
- padding-inline: var(--tabs-list-padding-x);
3846
- }
3847
-
3848
- /* Tab Trigger — clean underline style */
3849
- .muka-tabs__trigger {
3850
- display: inline-flex;
3851
- align-items: center;
3852
- justify-content: center;
3853
- gap: var(--spacing-1);
3854
- background: transparent;
3855
- border: none;
3856
- cursor: pointer;
3857
- user-select: none;
3858
- transition: background-color 0.2s ease, color 0.2s ease;
3859
- outline: none;
3860
- white-space: nowrap;
3861
- position: relative;
3862
- z-index: 2;
3863
- color: var(--tabs-trigger-color-default-foreground);
3864
-
3865
- /* Default MD size values */
3866
- min-height: var(--tabs-trigger-min-height-md);
3867
- padding: var(--spacing-3);
3868
- font-family: var(--text-label-md-regular-fontFamily);
3869
- font-weight: var(--text-label-md-regular-fontWeight);
3870
- font-size: var(--text-label-md-regular-fontSize);
3871
- line-height: var(--text-label-md-regular-lineHeight);
3872
- }
3873
-
3874
- /* Size Variants */
3875
- .muka-tabs--size-sm .muka-tabs__trigger {
3876
- min-height: var(--tabs-trigger-min-height-sm);
3877
- padding: 0 var(--spacing-2);
3878
- font-family: var(--text-label-sm-regular-fontFamily);
3879
- font-weight: var(--text-label-sm-regular-fontWeight);
3880
- font-size: var(--text-label-sm-regular-fontSize);
3881
- line-height: var(--text-label-sm-regular-lineHeight);
3882
- }
3883
-
3884
- .muka-tabs--size-lg .muka-tabs__trigger {
3885
- min-height: var(--tabs-trigger-min-height-lg);
3886
- padding: var(--spacing-4);
3887
- font-family: var(--text-label-lg-regular-fontFamily);
3888
- font-weight: var(--text-label-lg-regular-fontWeight);
3889
- font-size: var(--text-label-lg-regular-fontSize);
3890
- line-height: var(--text-label-lg-regular-lineHeight);
3891
- }
3892
-
3893
- /* Hover state */
3894
- .muka-tabs__trigger:hover:not(:disabled):not(.muka-tabs__trigger--current) {
3895
- color: var(--tabs-trigger-color-hover-foreground);
3896
- }
3897
-
3898
- /* Current tab */
3899
- .muka-tabs__trigger--current {
3900
- color: var(--tabs-trigger-color-current-foreground);
3901
- }
3902
-
3903
- /* Active bottom border (underline) */
3904
- .muka-tabs__trigger--current::after {
3905
- content: '';
3906
- position: absolute;
3907
- bottom: -1px; /* Overlap the 1px border */
3908
- left: 0;
3909
- right: 0;
3910
- height: var(--tabs-indicator-height-md);
3911
- background-color: var(--tabs-indicator-color);
3912
- border-bottom-left-radius: 1px;
3913
- border-bottom-right-radius: 1px;
3914
- border-top-left-radius: 3px;
3915
- border-top-right-radius: 3px;
3916
- z-index: 3;
3917
- }
3918
-
3919
- .muka-tabs--size-sm .muka-tabs__trigger--current::after {
3920
- height: var(--tabs-indicator-height-sm);
3921
- }
3922
- .muka-tabs--size-lg .muka-tabs__trigger--current::after {
3923
- height: var(--tabs-indicator-height-lg);
3924
- }
3925
-
3926
- .muka-tabs__trigger--disabled {
3927
- color: var(--tabs-trigger-color-disabled-foreground);
3928
- cursor: not-allowed;
3929
- }
3930
-
3931
- .muka-tabs__trigger:focus-visible {
3932
- outline: 2px solid var(--color-border-focus);
3933
- outline-offset: -2px;
3934
- }
3935
-
3936
- /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
3937
- item sits 12px from the text */
3938
- .muka-tabs__label {
3939
- padding: 0 var(--spacing-2);
3940
- }
3941
-
3942
- /* Leading item: icon, avatar, avatar group or data pie chart */
3943
- .muka-tabs__leading {
3944
- display: flex;
3945
- align-items: center;
3946
- justify-content: center;
3947
- flex-shrink: 0;
3948
- }
3949
- .muka-tabs__trigger .muka-icon {
3950
- color: inherit;
3951
- }
3952
- /* Icon sizes only: avatars and pie charts are sized through their size prop */
3953
- .muka-tabs--size-sm .muka-tabs__leading > svg,
3954
- .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
3955
- .muka-tabs--size-md .muka-tabs__leading > svg,
3956
- .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
3957
- .muka-tabs--size-lg .muka-tabs__leading > svg,
3958
- .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
3959
-
3960
- /* Responsive Scroll behavior on small screens */
3961
- @media (max-width: 768px) {
3962
- .muka-tabs__list {
3963
- /* Make scrollable */
3964
- overflow-x: auto;
3965
- overflow-y: hidden;
3966
- /* Force left alignment on mobile to prevent clipping when scrolling */
3967
- justify-content: flex-start !important;
3968
- max-width: 100vw;
3969
- -webkit-overflow-scrolling: touch;
3970
- /* Hide scrollbar for cleaner look */
3971
- scrollbar-width: none;
3972
- }
3973
- .muka-tabs__list::-webkit-scrollbar {
3974
- display: none;
3975
- }
3976
- /* Remove flex: 1 behavior for Fill tabs on mobile so they map correctly */
3977
- .muka-tabs--align-fill .muka-tabs__trigger {
3978
- flex: 0 0 auto;
3979
- }
3783
+ .muka-thumbnail__remove:hover {
3784
+ color: var(--button-color-tertiary-foreground-hover);
3785
+ background-color: var(--button-color-tertiary-background-hover);
3786
+ border-color: var(--button-color-tertiary-border-hover);
3980
3787
  }
3981
3788
 
3982
- /* Tab Panel — content area */
3983
- .muka-tabs__panel {
3984
- background-color: var(--tabs-panel-background);
3985
- /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
3986
- border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
3987
- padding: var(--spacing-4);
3988
- position: relative;
3989
- z-index: 1;
3990
- font-family: var(--text-body-base-regular-fontFamily);
3991
- font-weight: var(--text-body-base-regular-fontWeight);
3992
- font-size: var(--text-body-base-regular-fontSize);
3993
- line-height: var(--text-body-base-regular-lineHeight);
3789
+ .muka-thumbnail__remove:active {
3790
+ color: var(--button-color-tertiary-foreground-pressed);
3791
+ background-color: var(--button-color-tertiary-background-pressed);
3792
+ border-color: var(--button-color-tertiary-border-pressed);
3994
3793
  }
3995
3794
 
3996
- .muka-tabs__panel:focus-visible {
3795
+ .muka-thumbnail__remove:focus-visible {
3997
3796
  outline: 2px solid var(--color-border-focus);
3998
3797
  outline-offset: 2px;
3999
3798
  }
4000
3799
 
3800
+ /* ─── Reduced motion ──────────────────────────────────── */
3801
+ @media (prefers-reduced-motion: reduce) {
3802
+ .muka-thumbnail__image,
3803
+ .muka-thumbnail__remove {
3804
+ transition: none;
3805
+ }
3806
+
3807
+ .muka-thumbnail--interactive:hover .muka-thumbnail__image {
3808
+ transform: none;
3809
+ }
3810
+ }
3811
+
4001
3812
 
4002
3813
  /* Textarea */
4003
3814
  /* Textarea Component Styles - Using Muka Design Tokens */
@@ -4245,6 +4056,196 @@ body {
4245
4056
  }
4246
4057
 
4247
4058
 
4059
+ /* Tabs */
4060
+ /* Tabs Component Styles - Clean underline style tabs matching Figma */
4061
+
4062
+ .muka-tabs {
4063
+ display: flex;
4064
+ flex-direction: column;
4065
+ }
4066
+
4067
+ /* Alignment Variants */
4068
+ .muka-tabs--align-left .muka-tabs__list {
4069
+ justify-content: flex-start;
4070
+ }
4071
+ .muka-tabs--align-center .muka-tabs__list {
4072
+ justify-content: center;
4073
+ }
4074
+ .muka-tabs--align-fill .muka-tabs__list {
4075
+ justify-content: space-between;
4076
+ }
4077
+ .muka-tabs--align-fill .muka-tabs__trigger {
4078
+ flex: 1;
4079
+ }
4080
+
4081
+ /* Tab List — strip container */
4082
+ .muka-tabs__list {
4083
+ display: flex;
4084
+ align-items: center;
4085
+ position: relative;
4086
+ z-index: 2;
4087
+ border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4088
+ }
4089
+
4090
+ /* Padding: inset the tabs; the divider (border) still spans the full width */
4091
+ .muka-tabs--padding-default .muka-tabs__list {
4092
+ padding-inline: var(--tabs-list-padding-x);
4093
+ }
4094
+
4095
+ /* Tab Trigger — clean underline style */
4096
+ .muka-tabs__trigger {
4097
+ display: inline-flex;
4098
+ align-items: center;
4099
+ justify-content: center;
4100
+ gap: var(--spacing-1);
4101
+ background: transparent;
4102
+ border: none;
4103
+ cursor: pointer;
4104
+ user-select: none;
4105
+ transition: background-color 0.2s ease, color 0.2s ease;
4106
+ outline: none;
4107
+ white-space: nowrap;
4108
+ position: relative;
4109
+ z-index: 2;
4110
+ color: var(--tabs-trigger-color-default-foreground);
4111
+
4112
+ /* Default MD size values */
4113
+ min-height: var(--tabs-trigger-min-height-md);
4114
+ padding: var(--spacing-3);
4115
+ font-family: var(--text-label-md-regular-fontFamily);
4116
+ font-weight: var(--text-label-md-regular-fontWeight);
4117
+ font-size: var(--text-label-md-regular-fontSize);
4118
+ line-height: var(--text-label-md-regular-lineHeight);
4119
+ }
4120
+
4121
+ /* Size Variants */
4122
+ .muka-tabs--size-sm .muka-tabs__trigger {
4123
+ min-height: var(--tabs-trigger-min-height-sm);
4124
+ padding: 0 var(--spacing-2);
4125
+ font-family: var(--text-label-sm-regular-fontFamily);
4126
+ font-weight: var(--text-label-sm-regular-fontWeight);
4127
+ font-size: var(--text-label-sm-regular-fontSize);
4128
+ line-height: var(--text-label-sm-regular-lineHeight);
4129
+ }
4130
+
4131
+ .muka-tabs--size-lg .muka-tabs__trigger {
4132
+ min-height: var(--tabs-trigger-min-height-lg);
4133
+ padding: var(--spacing-4);
4134
+ font-family: var(--text-label-lg-regular-fontFamily);
4135
+ font-weight: var(--text-label-lg-regular-fontWeight);
4136
+ font-size: var(--text-label-lg-regular-fontSize);
4137
+ line-height: var(--text-label-lg-regular-lineHeight);
4138
+ }
4139
+
4140
+ /* Hover state */
4141
+ .muka-tabs__trigger:hover:not(:disabled):not(.muka-tabs__trigger--current) {
4142
+ color: var(--tabs-trigger-color-hover-foreground);
4143
+ }
4144
+
4145
+ /* Current tab */
4146
+ .muka-tabs__trigger--current {
4147
+ color: var(--tabs-trigger-color-current-foreground);
4148
+ }
4149
+
4150
+ /* Active bottom border (underline) */
4151
+ .muka-tabs__trigger--current::after {
4152
+ content: '';
4153
+ position: absolute;
4154
+ bottom: -1px; /* Overlap the 1px border */
4155
+ left: 0;
4156
+ right: 0;
4157
+ height: var(--tabs-indicator-height-md);
4158
+ background-color: var(--tabs-indicator-color);
4159
+ border-bottom-left-radius: 1px;
4160
+ border-bottom-right-radius: 1px;
4161
+ border-top-left-radius: 3px;
4162
+ border-top-right-radius: 3px;
4163
+ z-index: 3;
4164
+ }
4165
+
4166
+ .muka-tabs--size-sm .muka-tabs__trigger--current::after {
4167
+ height: var(--tabs-indicator-height-sm);
4168
+ }
4169
+ .muka-tabs--size-lg .muka-tabs__trigger--current::after {
4170
+ height: var(--tabs-indicator-height-lg);
4171
+ }
4172
+
4173
+ .muka-tabs__trigger--disabled {
4174
+ color: var(--tabs-trigger-color-disabled-foreground);
4175
+ cursor: not-allowed;
4176
+ }
4177
+
4178
+ .muka-tabs__trigger:focus-visible {
4179
+ outline: 2px solid var(--color-border-focus);
4180
+ outline-offset: -2px;
4181
+ }
4182
+
4183
+ /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
4184
+ item sits 12px from the text */
4185
+ .muka-tabs__label {
4186
+ padding: 0 var(--spacing-2);
4187
+ }
4188
+
4189
+ /* Leading item: icon, avatar, avatar group or data pie chart */
4190
+ .muka-tabs__leading {
4191
+ display: flex;
4192
+ align-items: center;
4193
+ justify-content: center;
4194
+ flex-shrink: 0;
4195
+ }
4196
+ .muka-tabs__trigger .muka-icon {
4197
+ color: inherit;
4198
+ }
4199
+ /* Icon sizes only: avatars and pie charts are sized through their size prop */
4200
+ .muka-tabs--size-sm .muka-tabs__leading > svg,
4201
+ .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
4202
+ .muka-tabs--size-md .muka-tabs__leading > svg,
4203
+ .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
4204
+ .muka-tabs--size-lg .muka-tabs__leading > svg,
4205
+ .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
4206
+
4207
+ /* Responsive Scroll behavior on small screens */
4208
+ @media (max-width: 768px) {
4209
+ .muka-tabs__list {
4210
+ /* Make scrollable */
4211
+ overflow-x: auto;
4212
+ overflow-y: hidden;
4213
+ /* Force left alignment on mobile to prevent clipping when scrolling */
4214
+ justify-content: flex-start !important;
4215
+ max-width: 100vw;
4216
+ -webkit-overflow-scrolling: touch;
4217
+ /* Hide scrollbar for cleaner look */
4218
+ scrollbar-width: none;
4219
+ }
4220
+ .muka-tabs__list::-webkit-scrollbar {
4221
+ display: none;
4222
+ }
4223
+ /* Remove flex: 1 behavior for Fill tabs on mobile so they map correctly */
4224
+ .muka-tabs--align-fill .muka-tabs__trigger {
4225
+ flex: 0 0 auto;
4226
+ }
4227
+ }
4228
+
4229
+ /* Tab Panel — content area */
4230
+ .muka-tabs__panel {
4231
+ background-color: var(--tabs-panel-background);
4232
+ /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4233
+ border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4234
+ padding: var(--spacing-4);
4235
+ position: relative;
4236
+ z-index: 1;
4237
+ font-family: var(--text-body-base-regular-fontFamily);
4238
+ font-weight: var(--text-body-base-regular-fontWeight);
4239
+ font-size: var(--text-body-base-regular-fontSize);
4240
+ line-height: var(--text-body-base-regular-lineHeight);
4241
+ }
4242
+
4243
+ .muka-tabs__panel:focus-visible {
4244
+ outline: 2px solid var(--color-border-focus);
4245
+ outline-offset: 2px;
4246
+ }
4247
+
4248
+
4248
4249
  /* Table */
4249
4250
  /* Table Component Styles - Using Muka Design Tokens */
4250
4251
 
@@ -14846,9 +14847,12 @@ button.muka-chat-photo-grid__tile:focus-visible {
14846
14847
 
14847
14848
  /* Avatar Group (Figma "Avatar Stack") */
14848
14849
  .muka-avatar-group {
14850
+ position: relative;
14849
14851
  display: inline-flex;
14850
14852
  align-items: center;
14851
14853
  flex-direction: row;
14854
+ /* Never stretch to a grid cell or column, so the badge stays on the last avatar */
14855
+ width: fit-content;
14852
14856
  }
14853
14857
 
14854
14858
  /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
@@ -14868,7 +14872,7 @@ button.muka-chat-photo-grid__tile:focus-visible {
14868
14872
  box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14869
14873
  }
14870
14874
 
14871
- /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14875
+ /* Overlap. Figma specifies exact values for 40 / 32 / 24px avatars (xs / 2xs / 3xs);
14872
14876
  other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14873
14877
  .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14874
14878
  .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
@@ -14883,13 +14887,13 @@ button.muka-chat-photo-grid__tile:focus-visible {
14883
14887
  .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14884
14888
  .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14885
14889
 
14886
- .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14890
+ .muka-avatar-group--tight.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-xs); }
14887
14891
  .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14888
14892
  .muka-avatar-group--tight.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-3xs); }
14889
- .muka-avatar-group--compact.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-sm); }
14893
+ .muka-avatar-group--compact.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-xs); }
14890
14894
  .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14891
14895
  .muka-avatar-group--compact.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-3xs); }
14892
- .muka-avatar-group--spacious.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-sm); }
14896
+ .muka-avatar-group--spacious.muka-avatar-group--xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-xs); }
14893
14897
  .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14894
14898
  .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14895
14899
 
@@ -14897,6 +14901,14 @@ button.muka-chat-photo-grid__tile:focus-visible {
14897
14901
  margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14898
14902
  }
14899
14903
 
14904
+ /* Badge: a BadgeNumber on the top-right corner of the stack, above every avatar */
14905
+ .muka-avatar-group__badge {
14906
+ position: absolute;
14907
+ top: calc(-1 * var(--avatar-group-badge-offset));
14908
+ right: calc(-1 * var(--avatar-group-badge-offset));
14909
+ z-index: 20;
14910
+ }
14911
+
14900
14912
  /* Overflow avatar styling */
14901
14913
  .muka-avatar--overflow {
14902
14914
  background-color: var(--avatar-color-background-default);