@revikornmann/muka-ui 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/cjs/components/Avatar/Avatar.css +79 -30
  2. package/dist/cjs/components/Avatar/Avatar.js +1 -1
  3. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  4. package/dist/cjs/components/Avatar/AvatarGroup.js +4 -3
  5. package/dist/cjs/components/Avatar/AvatarGroup.js.map +1 -1
  6. package/dist/cjs/components/Button/Button.css +33 -0
  7. package/dist/cjs/components/Button/Button.js +2 -2
  8. package/dist/cjs/components/DataPieChart/DataPieChart.js +5 -2
  9. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  10. package/dist/cjs/components/DataPieChart/index.js.map +1 -1
  11. package/dist/cjs/components/Tabs/Tabs.css +37 -14
  12. package/dist/cjs/components/Tabs/Tabs.js +30 -10
  13. package/dist/cjs/components/Tabs/Tabs.js.map +1 -1
  14. package/dist/cjs/components/index.js.map +1 -1
  15. package/dist/esm/components/Avatar/Avatar.css +79 -30
  16. package/dist/esm/components/Avatar/Avatar.js +1 -1
  17. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  18. package/dist/esm/components/Avatar/AvatarGroup.js +4 -3
  19. package/dist/esm/components/Avatar/AvatarGroup.js.map +1 -1
  20. package/dist/esm/components/Button/Button.css +33 -0
  21. package/dist/esm/components/Button/Button.js +2 -2
  22. package/dist/esm/components/DataPieChart/DataPieChart.js +4 -1
  23. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  24. package/dist/esm/components/DataPieChart/index.js.map +1 -1
  25. package/dist/esm/components/Tabs/Tabs.css +37 -14
  26. package/dist/esm/components/Tabs/Tabs.js +30 -10
  27. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  28. package/dist/esm/components/index.js.map +1 -1
  29. package/dist/styles/components/Avatar.css +79 -30
  30. package/dist/styles/components/Button.css +33 -0
  31. package/dist/styles/components/Tabs.css +37 -14
  32. package/dist/styles/index.css +796 -648
  33. package/dist/styles/muka-dark.css +796 -648
  34. package/dist/styles/muka-light.css +796 -648
  35. package/dist/styles/tokens-bouwplan-dark.css +48 -5
  36. package/dist/styles/tokens-bouwplan-light.css +48 -5
  37. package/dist/styles/tokens-fscl-dark.css +48 -5
  38. package/dist/styles/tokens-fscl-light.css +48 -5
  39. package/dist/styles/tokens-grip-dark.css +48 -5
  40. package/dist/styles/tokens-grip-light.css +48 -5
  41. package/dist/styles/tokens-muka-dark.css +48 -5
  42. package/dist/styles/tokens-muka-light.css +48 -5
  43. package/dist/styles/tokens-wireframe-dark.css +48 -5
  44. package/dist/styles/tokens-wireframe-light.css +48 -5
  45. package/dist/styles/wireframe-dark.css +796 -648
  46. package/dist/styles/wireframe-light.css +796 -648
  47. package/dist/types/components/Avatar/Avatar.d.ts +8 -3
  48. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  49. package/dist/types/components/Avatar/AvatarGroup.d.ts +10 -5
  50. package/dist/types/components/Avatar/AvatarGroup.d.ts.map +1 -1
  51. package/dist/types/components/Avatar/index.d.ts +1 -1
  52. package/dist/types/components/Avatar/index.d.ts.map +1 -1
  53. package/dist/types/components/Button/Button.d.ts +3 -3
  54. package/dist/types/components/Button/Button.d.ts.map +1 -1
  55. package/dist/types/components/DataPieChart/DataPieChart.d.ts +13 -2
  56. package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
  57. package/dist/types/components/DataPieChart/index.d.ts +1 -1
  58. package/dist/types/components/DataPieChart/index.d.ts.map +1 -1
  59. package/dist/types/components/Tabs/Tabs.d.ts +17 -2
  60. package/dist/types/components/Tabs/Tabs.d.ts.map +1 -1
  61. package/dist/types/components/index.d.ts +2 -2
  62. package/dist/types/components/index.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. package/tokens/t1-primitives/color.json +10 -0
  65. package/tokens/t2-alias/base.json +14 -0
  66. package/tokens/t2-alias/brand/bouwplan/dark.json +5 -0
  67. package/tokens/t2-alias/brand/bouwplan/light.json +5 -0
  68. package/tokens/t2-alias/brand/fscl/dark.json +5 -0
  69. package/tokens/t2-alias/brand/fscl/light.json +5 -0
  70. package/tokens/t2-alias/brand/grip/dark.json +14 -0
  71. package/tokens/t2-alias/brand/grip/light.json +14 -0
  72. package/tokens/t2-alias/brand/muka/dark.json +14 -0
  73. package/tokens/t2-alias/brand/muka/light.json +14 -0
  74. package/tokens/t2-alias/brand/wireframe/dark.json +14 -0
  75. package/tokens/t2-alias/brand/wireframe/light.json +14 -0
  76. package/tokens/t3-semantics/ui.json +49 -2
  77. package/tokens/t4-components/avatar.json +82 -18
  78. package/tokens/t4-components/button.json +56 -0
  79. package/tokens/t4-components/tabs.json +41 -1
@@ -410,6 +410,8 @@ body {
410
410
  --color-red-10: #dc3d43;
411
411
  --color-red-11: #cd2b31;
412
412
  --color-red-12: #381316;
413
+ --color-redStrong-1: #bd1524;
414
+ --color-redStrong-2: #ab001a;
413
415
  --color-ruby-1: #fffcfd;
414
416
  --color-ruby-2: #fff7f8;
415
417
  --color-ruby-3: #ffeef1;
@@ -1208,6 +1210,9 @@ body {
1208
1210
  --color-state-error-default: #e5484d;
1209
1211
  --color-state-error-contrast: #cd2b31;
1210
1212
  --color-state-error-background: #ffefef;
1213
+ --color-state-error-solid-default: #cd2b31;
1214
+ --color-state-error-solid-hover: #bd1524;
1215
+ --color-state-error-solid-pressed: #ab001a;
1211
1216
  --color-state-info-default: #3e63dd;
1212
1217
  --color-state-info-contrast: #3a5ccc;
1213
1218
  --color-state-info-background: #edf2fe;
@@ -1308,6 +1313,9 @@ body {
1308
1313
  --alias-color-state-error-contrast: #cd2b31;
1309
1314
  --alias-color-state-error-default: #e5484d;
1310
1315
  --alias-color-state-error-muted: #ffefef;
1316
+ --alias-color-state-error-solid-default: #cd2b31;
1317
+ --alias-color-state-error-solid-hover: #bd1524;
1318
+ --alias-color-state-error-solid-pressed: #ab001a;
1311
1319
  --alias-color-state-error-surface-level0: #fff8f8;
1312
1320
  --alias-color-state-error-surface-level1: #ffefef;
1313
1321
  --alias-color-state-error-surface-level2: #ffe5e5;
@@ -1604,6 +1612,18 @@ body {
1604
1612
  --button-color-primary-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1605
1613
  --button-color-primary-shadow-pressed: none;
1606
1614
  --button-color-primary-shadow-disabled: none;
1615
+ --button-color-destructive-background-default: #cd2b31;
1616
+ --button-color-destructive-background-hover: #bd1524;
1617
+ --button-color-destructive-background-pressed: #ab001a;
1618
+ --button-color-destructive-background-disabled: #eae7ec;
1619
+ --button-color-destructive-foreground-default: #fdfcfd;
1620
+ --button-color-destructive-foreground-hover: #fdfcfd;
1621
+ --button-color-destructive-foreground-pressed: #fdfcfd;
1622
+ --button-color-destructive-foreground-disabled: #d0cdd7;
1623
+ --button-color-destructive-shadow-default: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1624
+ --button-color-destructive-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1625
+ --button-color-destructive-shadow-pressed: none;
1626
+ --button-color-destructive-shadow-disabled: none;
1607
1627
  --button-color-secondary-background-default: #f2eff3;
1608
1628
  --button-color-secondary-background-hover: #f2eff3;
1609
1629
  --button-color-secondary-background-pressed: #eae7ec;
@@ -1968,7 +1988,7 @@ body {
1968
1988
  --contextmenu-trigger-outline-color: #3e63dd;
1969
1989
  --contextmenu-trigger-outline-offset: 0.25rem;
1970
1990
  --tabs-trigger-color-default-background: #f2eff3;
1971
- --tabs-trigger-color-default-foreground: #211f26;
1991
+ --tabs-trigger-color-default-foreground: #8e8c99;
1972
1992
  --tabs-trigger-color-default-border: #d0cdd7;
1973
1993
  --tabs-trigger-color-hover-background: #f2eff3;
1974
1994
  --tabs-trigger-color-hover-foreground: #211f26;
@@ -1983,8 +2003,16 @@ body {
1983
2003
  --tabs-trigger-padding-y: 0.5rem;
1984
2004
  --tabs-trigger-height: 3rem;
1985
2005
  --tabs-trigger-radius: 0.75rem;
2006
+ --tabs-trigger-min-height-sm: 2.5rem;
2007
+ --tabs-trigger-min-height-md: 3.5rem;
2008
+ --tabs-trigger-min-height-lg: 5rem;
1986
2009
  --tabs-panel-background: #fdfcfd;
1987
2010
  --tabs-panel-border: #d0cdd7;
2011
+ --tabs-indicator-color: #3e63dd;
2012
+ --tabs-indicator-height-sm: 2px;
2013
+ --tabs-indicator-height-md: 3px;
2014
+ --tabs-indicator-height-lg: 4px;
2015
+ --tabs-list-padding-x: 1rem;
1988
2016
  --separator-color-default: #eae7ec;
1989
2017
  --separator-color-contrast: #d0cdd7;
1990
2018
  --separator-width: 0.0625rem;
@@ -2017,6 +2045,9 @@ body {
2017
2045
  --progress-size-circle-strokeWidth-sm: 0.25rem;
2018
2046
  --progress-size-circle-strokeWidth-md: 0.5rem;
2019
2047
  --progress-size-circle-strokeWidth-lg: 0.75rem;
2048
+ --avatar-size-4xs: 1rem;
2049
+ --avatar-size-3xs: 1.5rem;
2050
+ --avatar-size-2xs: 2rem;
2020
2051
  --avatar-size-xs: 2.5rem;
2021
2052
  --avatar-size-sm: 3rem;
2022
2053
  --avatar-size-md: 4rem;
@@ -2026,26 +2057,38 @@ body {
2026
2057
  --avatar-color-background-loading: #eae7ec;
2027
2058
  --avatar-color-foreground-default: #211f26;
2028
2059
  --avatar-color-foreground-muted: #d0cdd7;
2029
- --avatar-color-border-default: #eae7ec;
2030
2060
  --avatar-color-status-online: #027864;
2031
2061
  --avatar-color-status-offline: #d0cdd7;
2032
2062
  --avatar-color-status-busy: #e5484d;
2033
2063
  --avatar-color-status-away: #ffc53d;
2034
2064
  --avatar-radius-circle: 999rem;
2035
2065
  --avatar-radius-square: 0.75rem;
2066
+ --avatar-radius-square-sm: 0.375rem;
2067
+ --avatar-font-size-3xs: 0.75rem;
2068
+ --avatar-font-size-2xs: 0.75rem;
2036
2069
  --avatar-font-size-xs: 0.75rem;
2037
2070
  --avatar-font-size-sm: 0.875rem;
2038
2071
  --avatar-font-size-md: 1.125rem;
2039
2072
  --avatar-font-size-lg: 1.25rem;
2040
2073
  --avatar-font-size-xl: 1.5rem;
2074
+ --avatar-status-size-3xs: 0.5rem;
2075
+ --avatar-status-size-2xs: 0.5rem;
2041
2076
  --avatar-status-size-xs: 0.5rem;
2042
2077
  --avatar-status-size-sm: 0.75rem;
2043
2078
  --avatar-status-size-md: 1rem;
2044
2079
  --avatar-status-size-lg: 1.25rem;
2045
2080
  --avatar-status-size-xl: 1.5rem;
2046
- --avatar-border-width: 1px;
2047
- --avatar-group-spacing-tight: -0.5rem;
2048
- --avatar-group-spacing-normal: -0.25rem;
2081
+ --avatar-group-ring-width: 0.125rem;
2082
+ --avatar-group-ring-color: #fdfcfd;
2083
+ --avatar-group-overlap-tight-sm: 2rem;
2084
+ --avatar-group-overlap-tight-2xs: 1.25rem;
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;
2090
+ --avatar-group-overlap-spacious-2xs: 0.75rem;
2091
+ --avatar-group-overlap-spacious-3xs: 0.5rem;
2049
2092
  --toast-color-info-background: #211f26;
2050
2093
  --toast-color-info-foreground: #fdfcfd;
2051
2094
  --toast-color-info-accent: #edf2fe;
@@ -2451,116 +2494,6 @@ body {
2451
2494
  }
2452
2495
 
2453
2496
 
2454
- /* View */
2455
- /* View Component Styles */
2456
-
2457
- /* ─── Base layout ─────────────────────────────────────── */
2458
-
2459
- .muka-view {
2460
- display: flex;
2461
- flex-direction: column;
2462
- height: 100dvh;
2463
- background-color: var(--view-color-background);
2464
- position: relative;
2465
- isolation: isolate;
2466
- box-sizing: border-box;
2467
-
2468
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2469
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2470
- --view-sidebar-width: 240px;
2471
- }
2472
-
2473
- /* ─── Surface level variants ─────────────────────────── */
2474
-
2475
- .muka-view--surface-3 {
2476
- background-color: var(--color-surface-level3);
2477
- }
2478
-
2479
- /* ─── Large screens: make room for the left sidebar ──────────
2480
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2481
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2482
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2483
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2484
- for a sidebar that hasn't rendered yet. */
2485
- @media (min-width: 1024px) {
2486
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2487
- padding-left: var(--view-sidebar-width);
2488
- }
2489
- }
2490
-
2491
- /* ─── TopBar elevation ────────────────────────────────── */
2492
-
2493
- .muka-view .muka-topbar {
2494
- flex-shrink: 0;
2495
- z-index: 3;
2496
- box-shadow: var(--shadow-level2);
2497
- }
2498
-
2499
- /* ─── Scrollable body ─────────────────────────────────── */
2500
-
2501
- .muka-view__body {
2502
- flex: 1 1 0%;
2503
- min-height: 0;
2504
- overflow-y: auto;
2505
- overflow-x: clip;
2506
- z-index: 1;
2507
-
2508
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2509
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2510
- reveal the content underneath. */
2511
- display: flex;
2512
- flex-direction: column;
2513
- }
2514
-
2515
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2516
- using the alias-layer section/container tokens, while the body scrolls full
2517
- width. Full-bleed below large. */
2518
- .muka-view__body-inner {
2519
- width: 100%;
2520
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2521
- than floating mid-screen. */
2522
- flex: 1 0 auto;
2523
- }
2524
-
2525
- @media (min-width: 1024px) {
2526
- .muka-view:not([data-size]) .muka-view__body-inner {
2527
- max-width: var(--container-max-width-xl);
2528
- margin-inline: auto;
2529
- padding-inline: var(--section-padding-horizontal-default);
2530
- }
2531
- }
2532
-
2533
- .muka-view[data-size='lg'] .muka-view__body-inner {
2534
- max-width: var(--container-max-width-xl);
2535
- margin-inline: auto;
2536
- padding-inline: var(--section-padding-horizontal-default);
2537
- }
2538
-
2539
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2540
-
2541
- .muka-view__footer {
2542
- position: sticky;
2543
- bottom: 0;
2544
- flex-shrink: 0;
2545
- z-index: 2;
2546
- }
2547
-
2548
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2549
- navigation at the large tier, so hide a footer that holds a navigation bar.
2550
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2551
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2552
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2553
- @media (min-width: 1024px) {
2554
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2555
- display: none;
2556
- }
2557
- }
2558
-
2559
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2560
- display: none;
2561
- }
2562
-
2563
-
2564
2497
  /* Typography */
2565
2498
  .muka-typography-catalog {
2566
2499
  display: flex;
@@ -2911,166 +2844,113 @@ body {
2911
2844
  }
2912
2845
 
2913
2846
 
2914
- /* Toggle */
2915
- /* Toggle Component Styles - Using Muka Design Tokens */
2847
+ /* View */
2848
+ /* View Component Styles */
2916
2849
 
2917
- /* Wrapper container */
2918
- .muka-toggle {
2850
+ /* ─── Base layout ─────────────────────────────────────── */
2851
+
2852
+ .muka-view {
2919
2853
  display: flex;
2920
- align-items: center;
2921
- gap: var(--spacing-2);
2854
+ flex-direction: column;
2855
+ height: 100dvh;
2856
+ background-color: var(--view-color-background);
2922
2857
  position: relative;
2923
- padding: var(--spacing-4) 0;
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;
2924
2864
  }
2925
2865
 
2926
- .muka-toggle--with-caption {
2927
- padding: var(--spacing-5) 0;
2866
+ /* ─── Surface level variants ─────────────────────────── */
2867
+
2868
+ .muka-view--surface-3 {
2869
+ background-color: var(--color-surface-level3);
2928
2870
  }
2929
2871
 
2930
- .muka-toggle--disabled {
2931
- opacity: 0.6;
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
+ }
2932
2882
  }
2933
2883
 
2934
- /* Icon */
2935
- .muka-toggle__icon {
2936
- display: flex;
2937
- align-items: center;
2938
- justify-content: center;
2884
+ /* ─── TopBar elevation ────────────────────────────────── */
2885
+
2886
+ .muka-view .muka-topbar {
2939
2887
  flex-shrink: 0;
2940
- width: var(--icon-size-default);
2941
- height: var(--icon-size-default);
2942
- color: var(--color-text-default-default);
2888
+ z-index: 3;
2889
+ box-shadow: var(--shadow-level2);
2943
2890
  }
2944
2891
 
2945
- .muka-toggle__icon svg {
2946
- width: 100%;
2947
- height: 100%;
2948
- }
2892
+ /* ─── Scrollable body ─────────────────────────────────── */
2949
2893
 
2950
- /* Content area (label + caption) */
2951
- .muka-toggle__content {
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;
2900
+
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. */
2952
2904
  display: flex;
2953
2905
  flex-direction: column;
2954
- flex: 1;
2955
- min-width: 0;
2956
- gap: var(--spacing-1);
2957
2906
  }
2958
2907
 
2959
- /* Label */
2960
- .muka-toggle__label {
2961
- font-family: var(--text-label-lg-regular-fontFamily);
2962
- font-weight: var(--text-label-lg-regular-fontWeight);
2963
- font-size: var(--text-label-lg-regular-fontSize);
2964
- line-height: var(--text-label-lg-regular-lineHeight);
2965
- color: var(--color-text-default-default);
2966
- cursor: pointer;
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;
2967
2916
  }
2968
2917
 
2969
- .muka-toggle--with-caption .muka-toggle__label {
2970
- font-family: var(--text-label-lg-semibold-fontFamily);
2971
- font-weight: var(--text-label-lg-semibold-fontWeight);
2972
- font-size: var(--text-label-lg-semibold-fontSize);
2973
- line-height: var(--text-label-lg-semibold-lineHeight);
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
+ }
2974
2924
  }
2975
2925
 
2976
- .muka-toggle--disabled .muka-toggle__label {
2977
- color: var(--color-text-subtle-default);
2978
- cursor: not-allowed;
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);
2979
2930
  }
2980
2931
 
2981
- /* Caption */
2982
- .muka-toggle__caption {
2983
- font-family: var(--text-body-base-regular-fontFamily);
2984
- font-weight: var(--text-body-base-regular-fontWeight);
2985
- font-size: var(--text-body-base-regular-fontSize);
2986
- line-height: var(--text-body-base-regular-lineHeight);
2987
- color: var(--color-text-subtle-default);
2988
- }
2932
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2989
2933
 
2990
- /* Switch container */
2991
- .muka-toggle__switch {
2992
- position: relative;
2993
- display: inline-flex;
2934
+ .muka-view__footer {
2935
+ position: sticky;
2936
+ bottom: 0;
2994
2937
  flex-shrink: 0;
2995
- cursor: pointer;
2938
+ z-index: 2;
2996
2939
  }
2997
2940
 
2998
- .muka-toggle--disabled .muka-toggle__switch {
2999
- cursor: not-allowed;
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
+ }
3000
2950
  }
3001
2951
 
3002
- /* Hidden native input */
3003
- .muka-toggle__input {
3004
- position: absolute;
3005
- width: 1px;
3006
- height: 1px;
3007
- padding: 0;
3008
- margin: -1px;
3009
- overflow: hidden;
3010
- clip: rect(0, 0, 0, 0);
3011
- white-space: nowrap;
3012
- border: 0;
3013
- }
3014
-
3015
- /* Track (background pill) */
3016
- .muka-toggle__track {
3017
- display: flex;
3018
- align-items: center;
3019
- width: var(--toggle-track-width);
3020
- height: var(--toggle-track-height);
3021
- border-radius: var(--toggle-track-radius);
3022
- background-color: var(--toggle-track-color-off);
3023
- transition: background-color 0.2s ease;
3024
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3025
- position: relative;
3026
- }
3027
-
3028
- /* Knob (sliding circle) */
3029
- .muka-toggle__knob {
3030
- position: absolute;
3031
- width: var(--toggle-knob-size);
3032
- height: var(--toggle-knob-size);
3033
- border-radius: var(--border-radius-full);
3034
- background-color: var(--toggle-knob-color-default);
3035
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3036
- left: var(--toggle-knob-offset);
3037
- transition: left 0.2s ease, transform 0.2s ease;
3038
- }
3039
-
3040
- /* Focus state */
3041
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3042
- outline: 2px solid var(--color-border-focus);
3043
- outline-offset: 2px;
3044
- }
3045
-
3046
- /* Checked (on) state */
3047
- .muka-toggle__input:checked + .muka-toggle__track {
3048
- background-color: var(--toggle-track-color-on);
3049
- }
3050
-
3051
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3052
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3053
- }
3054
-
3055
- /* Disabled state */
3056
- .muka-toggle--disabled .muka-toggle__track {
3057
- background-color: var(--toggle-track-color-disabled);
3058
- box-shadow: none;
3059
- }
3060
-
3061
- .muka-toggle--disabled .muka-toggle__knob {
3062
- background-color: var(--toggle-knob-color-disabled);
3063
- box-shadow: none;
3064
- }
3065
-
3066
- /* Divider */
3067
- .muka-toggle__divider {
3068
- position: absolute;
3069
- bottom: 0;
3070
- left: 0;
3071
- right: 0;
3072
- height: 1px;
3073
- background-color: var(--color-border-muted);
2952
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2953
+ display: none;
3074
2954
  }
3075
2955
 
3076
2956
 
@@ -3799,249 +3679,166 @@ body {
3799
3679
  }
3800
3680
 
3801
3681
 
3802
- /* TextLink */
3803
- /* TextLink Component Styles - Using Muka Design Tokens */
3804
-
3805
- .muka-text-link {
3806
- display: inline;
3807
- cursor: pointer;
3808
- text-decoration: underline;
3809
- /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3810
- text-underline-offset: 0.2em;
3811
- text-decoration-thickness: from-font;
3812
- /* Rounds the focus ring's corners; the link itself has no visible box. */
3813
- border-radius: var(--border-radius-sm);
3814
- transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3815
- }
3816
-
3817
- /* ─── Sizes ───────────────────────────────────────────────
3818
- Mirrors the body text scale so a link matches the copy it sits in. */
3819
- .muka-text-link--sm {
3820
- font-family: var(--text-body-sm-regular-fontFamily);
3821
- font-weight: var(--text-body-sm-regular-fontWeight);
3822
- font-size: var(--text-body-sm-regular-fontSize);
3823
- line-height: var(--text-body-sm-regular-lineHeight);
3824
- }
3825
-
3826
- .muka-text-link--base {
3827
- font-family: var(--text-body-base-regular-fontFamily);
3828
- font-weight: var(--text-body-base-regular-fontWeight);
3829
- font-size: var(--text-body-base-regular-fontSize);
3830
- line-height: var(--text-body-base-regular-lineHeight);
3831
- }
3832
-
3833
- .muka-text-link--lg {
3834
- font-family: var(--text-body-lg-regular-fontFamily);
3835
- font-weight: var(--text-body-lg-regular-fontWeight);
3836
- font-size: var(--text-body-lg-regular-fontSize);
3837
- line-height: var(--text-body-lg-regular-lineHeight);
3838
- }
3839
-
3840
- /* ─── Variant: default (accent) ───────────────────────────
3841
- Visited repeats the default colour on purpose: the design treats visited and
3842
- default the same, and pinning it stops the browser's purple from showing. */
3843
- .muka-text-link--default,
3844
- .muka-text-link--default:visited {
3845
- color: var(--color-text-action-default);
3846
- }
3682
+ /* Toggle */
3683
+ /* Toggle Component Styles - Using Muka Design Tokens */
3847
3684
 
3848
- .muka-text-link--default:hover,
3849
- .muka-text-link--default:focus-visible {
3850
- color: var(--color-text-action-hover);
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;
3851
3692
  }
3852
3693
 
3853
- .muka-text-link--default:active {
3854
- color: var(--color-text-action-pressed);
3694
+ .muka-toggle--with-caption {
3695
+ padding: var(--spacing-5) 0;
3855
3696
  }
3856
3697
 
3857
- /* ─── Variant: subtle (neutral) ───────────────────────────
3858
- Hover, focus and pressed all darken to the default text colour. */
3859
- .muka-text-link--subtle,
3860
- .muka-text-link--subtle:visited {
3861
- color: var(--color-text-subtle-default);
3698
+ .muka-toggle--disabled {
3699
+ opacity: 0.6;
3862
3700
  }
3863
3701
 
3864
- .muka-text-link--subtle:hover,
3865
- .muka-text-link--subtle:focus-visible,
3866
- .muka-text-link--subtle:active {
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);
3867
3710
  color: var(--color-text-default-default);
3868
3711
  }
3869
3712
 
3870
- /* ─── Focus ───────────────────────────────────────────────
3871
- Same ring as every other focusable Muka component. */
3872
- .muka-text-link:focus-visible {
3873
- outline: 2px solid var(--color-border-focus);
3874
- outline-offset: 2px;
3875
- }
3876
-
3877
- @media (prefers-reduced-motion: reduce) {
3878
- .muka-text-link {
3879
- transition: none;
3880
- }
3713
+ .muka-toggle__icon svg {
3714
+ width: 100%;
3715
+ height: 100%;
3881
3716
  }
3882
3717
 
3883
-
3884
- /* Textarea */
3885
- /* Textarea Component Styles - Using Muka Design Tokens */
3886
-
3887
- .muka-textarea {
3888
- display: inline-flex;
3718
+ /* Content area (label + caption) */
3719
+ .muka-toggle__content {
3720
+ display: flex;
3889
3721
  flex-direction: column;
3890
- gap: var(--spacing-2);
3722
+ flex: 1;
3723
+ min-width: 0;
3724
+ gap: var(--spacing-1);
3891
3725
  }
3892
3726
 
3893
3727
  /* Label */
3894
- .muka-textarea__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);
3895
3733
  color: var(--color-text-default-default);
3896
3734
  cursor: pointer;
3897
3735
  }
3898
3736
 
3899
- .muka-textarea__label--sm {
3900
- font-family: var(--text-label-sm-semibold-fontFamily);
3901
- font-weight: var(--text-label-sm-semibold-fontWeight);
3902
- font-size: var(--text-label-sm-semibold-fontSize);
3903
- line-height: var(--text-label-sm-semibold-lineHeight);
3904
- }
3905
-
3906
- .muka-textarea__label--md {
3907
- font-family: var(--text-label-md-semibold-fontFamily);
3908
- font-weight: var(--text-label-md-semibold-fontWeight);
3909
- font-size: var(--text-label-md-semibold-fontSize);
3910
- line-height: var(--text-label-md-semibold-lineHeight);
3911
- }
3912
-
3913
- .muka-textarea__label--lg {
3737
+ .muka-toggle--with-caption .muka-toggle__label {
3914
3738
  font-family: var(--text-label-lg-semibold-fontFamily);
3915
3739
  font-weight: var(--text-label-lg-semibold-fontWeight);
3916
3740
  font-size: var(--text-label-lg-semibold-fontSize);
3917
3741
  line-height: var(--text-label-lg-semibold-lineHeight);
3918
3742
  }
3919
3743
 
3920
- .muka-textarea__required {
3921
- color: var(--color-state-error-default);
3922
- }
3923
-
3924
- /* Field container */
3925
- .muka-textarea__field {
3926
- display: flex;
3927
- background-color: var(--input-field-color-default-background);
3928
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
3929
- border-radius: var(--input-field-radius-md);
3930
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
3931
- transition: border-color 0.2s ease, background-color 0.2s ease;
3932
- box-sizing: border-box;
3933
- }
3934
-
3935
- .muka-textarea__field--sm {
3936
- min-height: var(--input-textarea-height-sm);
3937
- border-radius: var(--input-field-radius-sm);
3744
+ .muka-toggle--disabled .muka-toggle__label {
3745
+ color: var(--color-text-subtle-default);
3746
+ cursor: not-allowed;
3938
3747
  }
3939
3748
 
3940
- .muka-textarea__field--md {
3941
- min-height: var(--input-textarea-height-default);
3942
- border-radius: var(--input-field-radius-md);
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);
3943
3756
  }
3944
3757
 
3945
- .muka-textarea__field--lg {
3946
- min-height: var(--input-textarea-height-lg);
3947
- border-radius: var(--input-field-radius-lg);
3758
+ /* Switch container */
3759
+ .muka-toggle__switch {
3760
+ position: relative;
3761
+ display: inline-flex;
3762
+ flex-shrink: 0;
3763
+ cursor: pointer;
3948
3764
  }
3949
3765
 
3950
- /* Focus state */
3951
- .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
3952
- border-width: var(--border-width-bold);
3953
- border-color: var(--input-field-color-focus-border);
3954
- background-color: var(--input-field-color-focus-background);
3955
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3766
+ .muka-toggle--disabled .muka-toggle__switch {
3767
+ cursor: not-allowed;
3956
3768
  }
3957
3769
 
3958
- /* Error state */
3959
- .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
3960
- border-width: var(--border-width-bold);
3961
- border-color: var(--input-field-color-error-border);
3962
- background-color: var(--input-field-color-error-background);
3963
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
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;
3964
3781
  }
3965
3782
 
3966
- /* Disabled state */
3967
- .muka-textarea__field--disabled {
3968
- background-color: var(--input-field-color-disabled-background);
3969
- border-color: var(--input-field-color-disabled-border);
3970
- cursor: not-allowed;
3971
- }
3972
-
3973
- /* Native textarea */
3974
- .muka-textarea__native {
3975
- flex: 1;
3976
- border: none;
3977
- outline: none;
3978
- background: transparent;
3979
- color: var(--input-field-color-default-foreground);
3980
- font-family: var(--text-input-md-fontFamily);
3981
- font-weight: var(--text-input-md-fontWeight);
3982
- font-size: var(--text-input-md-fontSize);
3983
- line-height: var(--text-input-md-lineHeight);
3984
- padding: 0;
3985
- width: 100%;
3986
- min-width: 0;
3987
- }
3988
-
3989
- .muka-textarea__field--sm .muka-textarea__native {
3990
- font-family: var(--text-input-sm-fontFamily);
3991
- font-weight: var(--text-input-sm-fontWeight);
3992
- font-size: var(--text-input-sm-fontSize);
3993
- line-height: var(--text-input-sm-lineHeight);
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;
3994
3794
  }
3995
3795
 
3996
- .muka-textarea__field--lg .muka-textarea__native {
3997
- font-family: var(--text-input-lg-fontFamily);
3998
- font-weight: var(--text-input-lg-fontWeight);
3999
- font-size: var(--text-input-lg-fontSize);
4000
- line-height: var(--text-input-lg-lineHeight);
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;
4001
3806
  }
4002
3807
 
4003
- .muka-textarea__native::placeholder {
4004
- color: var(--color-text-subtle-default);
3808
+ /* Focus state */
3809
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3810
+ outline: 2px solid var(--color-border-focus);
3811
+ outline-offset: 2px;
4005
3812
  }
4006
3813
 
4007
- .muka-textarea__field--disabled .muka-textarea__native {
4008
- color: var(--input-field-color-disabled-foreground);
4009
- cursor: not-allowed;
3814
+ /* Checked (on) state */
3815
+ .muka-toggle__input:checked + .muka-toggle__track {
3816
+ background-color: var(--toggle-track-color-on);
4010
3817
  }
4011
3818
 
4012
- /* Footer (helper/error + count) */
4013
- .muka-textarea__footer {
4014
- display: flex;
4015
- justify-content: space-between;
4016
- align-items: flex-start;
4017
- gap: var(--spacing-2);
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));
4018
3821
  }
4019
3822
 
4020
- .muka-textarea__helper {
4021
- font-family: var(--text-label-sm-regular-fontFamily);
4022
- font-weight: var(--text-label-sm-regular-fontWeight);
4023
- font-size: var(--text-label-sm-regular-fontSize);
4024
- line-height: var(--text-label-sm-regular-lineHeight);
4025
- color: var(--color-text-subtle-default);
4026
- margin: 0;
3823
+ /* Disabled state */
3824
+ .muka-toggle--disabled .muka-toggle__track {
3825
+ background-color: var(--toggle-track-color-disabled);
3826
+ box-shadow: none;
4027
3827
  }
4028
3828
 
4029
- .muka-textarea__error {
4030
- font-family: var(--text-label-sm-regular-fontFamily);
4031
- font-weight: var(--text-label-sm-regular-fontWeight);
4032
- font-size: var(--text-label-sm-regular-fontSize);
4033
- line-height: var(--text-label-sm-regular-lineHeight);
4034
- color: var(--color-state-error-default);
4035
- margin: 0;
3829
+ .muka-toggle--disabled .muka-toggle__knob {
3830
+ background-color: var(--toggle-knob-color-disabled);
3831
+ box-shadow: none;
4036
3832
  }
4037
3833
 
4038
- .muka-textarea__count {
4039
- font-family: var(--text-label-sm-regular-fontFamily);
4040
- font-weight: var(--text-label-sm-regular-fontWeight);
4041
- font-size: var(--text-label-sm-regular-fontSize);
4042
- line-height: var(--text-label-sm-regular-lineHeight);
4043
- color: var(--color-text-subtle-default);
4044
- margin-left: auto;
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);
4045
3842
  }
4046
3843
 
4047
3844
 
@@ -4076,12 +3873,17 @@ body {
4076
3873
  border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4077
3874
  }
4078
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
+
4079
3881
  /* Tab Trigger — clean underline style */
4080
3882
  .muka-tabs__trigger {
4081
3883
  display: inline-flex;
4082
3884
  align-items: center;
4083
3885
  justify-content: center;
4084
- gap: var(--spacing-2, 8px);
3886
+ gap: var(--spacing-1);
4085
3887
  background: transparent;
4086
3888
  border: none;
4087
3889
  cursor: pointer;
@@ -4094,8 +3896,8 @@ body {
4094
3896
  color: var(--tabs-trigger-color-default-foreground);
4095
3897
 
4096
3898
  /* Default MD size values */
4097
- height: 48px;
4098
- padding: 0 var(--spacing-3, 12px);
3899
+ min-height: var(--tabs-trigger-min-height-md);
3900
+ padding: var(--spacing-3);
4099
3901
  font-family: var(--text-label-md-regular-fontFamily);
4100
3902
  font-weight: var(--text-label-md-regular-fontWeight);
4101
3903
  font-size: var(--text-label-md-regular-fontSize);
@@ -4104,8 +3906,8 @@ body {
4104
3906
 
4105
3907
  /* Size Variants */
4106
3908
  .muka-tabs--size-sm .muka-tabs__trigger {
4107
- height: 36px;
4108
- padding: 0 var(--spacing-2, 8px);
3909
+ min-height: var(--tabs-trigger-min-height-sm);
3910
+ padding: 0 var(--spacing-2);
4109
3911
  font-family: var(--text-label-sm-regular-fontFamily);
4110
3912
  font-weight: var(--text-label-sm-regular-fontWeight);
4111
3913
  font-size: var(--text-label-sm-regular-fontSize);
@@ -4113,8 +3915,8 @@ body {
4113
3915
  }
4114
3916
 
4115
3917
  .muka-tabs--size-lg .muka-tabs__trigger {
4116
- height: 56px;
4117
- padding: 0 var(--spacing-4, 16px);
3918
+ min-height: var(--tabs-trigger-min-height-lg);
3919
+ padding: var(--spacing-4);
4118
3920
  font-family: var(--text-label-lg-regular-fontFamily);
4119
3921
  font-weight: var(--text-label-lg-regular-fontWeight);
4120
3922
  font-size: var(--text-label-lg-regular-fontSize);
@@ -4138,8 +3940,8 @@ body {
4138
3940
  bottom: -1px; /* Overlap the 1px border */
4139
3941
  left: 0;
4140
3942
  right: 0;
4141
- height: 3px;
4142
- background-color: var(--tabs-trigger-color-current-foreground);
3943
+ height: var(--tabs-indicator-height-md);
3944
+ background-color: var(--tabs-indicator-color);
4143
3945
  border-bottom-left-radius: 1px;
4144
3946
  border-bottom-right-radius: 1px;
4145
3947
  border-top-left-radius: 3px;
@@ -4147,6 +3949,13 @@ body {
4147
3949
  z-index: 3;
4148
3950
  }
4149
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
+
4150
3959
  .muka-tabs__trigger--disabled {
4151
3960
  color: var(--tabs-trigger-color-disabled-foreground);
4152
3961
  cursor: not-allowed;
@@ -4157,18 +3966,29 @@ body {
4157
3966
  outline-offset: -2px;
4158
3967
  }
4159
3968
 
4160
- /* Icons */
4161
- .muka-tabs__icon {
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 {
4162
3977
  display: flex;
4163
3978
  align-items: center;
4164
3979
  justify-content: center;
3980
+ flex-shrink: 0;
4165
3981
  }
4166
3982
  .muka-tabs__trigger .muka-icon {
4167
3983
  color: inherit;
4168
3984
  }
4169
- .muka-tabs--size-sm .muka-tabs__icon svg { width: 16px; height: 16px; }
4170
- .muka-tabs--size-md .muka-tabs__icon svg { width: 20px; height: 20px; }
4171
- .muka-tabs--size-lg .muka-tabs__icon svg { width: 24px; height: 24px; }
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; }
4172
3992
 
4173
3993
  /* Responsive Scroll behavior on small screens */
4174
3994
  @media (max-width: 768px) {
@@ -4212,6 +4032,252 @@ body {
4212
4032
  }
4213
4033
 
4214
4034
 
4035
+ /* Textarea */
4036
+ /* Textarea Component Styles - Using Muka Design Tokens */
4037
+
4038
+ .muka-textarea {
4039
+ display: inline-flex;
4040
+ flex-direction: column;
4041
+ gap: var(--spacing-2);
4042
+ }
4043
+
4044
+ /* Label */
4045
+ .muka-textarea__label {
4046
+ color: var(--color-text-default-default);
4047
+ cursor: pointer;
4048
+ }
4049
+
4050
+ .muka-textarea__label--sm {
4051
+ font-family: var(--text-label-sm-semibold-fontFamily);
4052
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4053
+ font-size: var(--text-label-sm-semibold-fontSize);
4054
+ line-height: var(--text-label-sm-semibold-lineHeight);
4055
+ }
4056
+
4057
+ .muka-textarea__label--md {
4058
+ font-family: var(--text-label-md-semibold-fontFamily);
4059
+ font-weight: var(--text-label-md-semibold-fontWeight);
4060
+ font-size: var(--text-label-md-semibold-fontSize);
4061
+ line-height: var(--text-label-md-semibold-lineHeight);
4062
+ }
4063
+
4064
+ .muka-textarea__label--lg {
4065
+ font-family: var(--text-label-lg-semibold-fontFamily);
4066
+ font-weight: var(--text-label-lg-semibold-fontWeight);
4067
+ font-size: var(--text-label-lg-semibold-fontSize);
4068
+ line-height: var(--text-label-lg-semibold-lineHeight);
4069
+ }
4070
+
4071
+ .muka-textarea__required {
4072
+ color: var(--color-state-error-default);
4073
+ }
4074
+
4075
+ /* Field container */
4076
+ .muka-textarea__field {
4077
+ display: flex;
4078
+ background-color: var(--input-field-color-default-background);
4079
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
4080
+ border-radius: var(--input-field-radius-md);
4081
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
4082
+ transition: border-color 0.2s ease, background-color 0.2s ease;
4083
+ box-sizing: border-box;
4084
+ }
4085
+
4086
+ .muka-textarea__field--sm {
4087
+ min-height: var(--input-textarea-height-sm);
4088
+ border-radius: var(--input-field-radius-sm);
4089
+ }
4090
+
4091
+ .muka-textarea__field--md {
4092
+ min-height: var(--input-textarea-height-default);
4093
+ border-radius: var(--input-field-radius-md);
4094
+ }
4095
+
4096
+ .muka-textarea__field--lg {
4097
+ min-height: var(--input-textarea-height-lg);
4098
+ border-radius: var(--input-field-radius-lg);
4099
+ }
4100
+
4101
+ /* Focus state */
4102
+ .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
4103
+ border-width: var(--border-width-bold);
4104
+ border-color: var(--input-field-color-focus-border);
4105
+ background-color: var(--input-field-color-focus-background);
4106
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4107
+ }
4108
+
4109
+ /* Error state */
4110
+ .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
4111
+ border-width: var(--border-width-bold);
4112
+ border-color: var(--input-field-color-error-border);
4113
+ background-color: var(--input-field-color-error-background);
4114
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4115
+ }
4116
+
4117
+ /* Disabled state */
4118
+ .muka-textarea__field--disabled {
4119
+ background-color: var(--input-field-color-disabled-background);
4120
+ border-color: var(--input-field-color-disabled-border);
4121
+ cursor: not-allowed;
4122
+ }
4123
+
4124
+ /* Native textarea */
4125
+ .muka-textarea__native {
4126
+ flex: 1;
4127
+ border: none;
4128
+ outline: none;
4129
+ background: transparent;
4130
+ color: var(--input-field-color-default-foreground);
4131
+ font-family: var(--text-input-md-fontFamily);
4132
+ font-weight: var(--text-input-md-fontWeight);
4133
+ font-size: var(--text-input-md-fontSize);
4134
+ line-height: var(--text-input-md-lineHeight);
4135
+ padding: 0;
4136
+ width: 100%;
4137
+ min-width: 0;
4138
+ }
4139
+
4140
+ .muka-textarea__field--sm .muka-textarea__native {
4141
+ font-family: var(--text-input-sm-fontFamily);
4142
+ font-weight: var(--text-input-sm-fontWeight);
4143
+ font-size: var(--text-input-sm-fontSize);
4144
+ line-height: var(--text-input-sm-lineHeight);
4145
+ }
4146
+
4147
+ .muka-textarea__field--lg .muka-textarea__native {
4148
+ font-family: var(--text-input-lg-fontFamily);
4149
+ font-weight: var(--text-input-lg-fontWeight);
4150
+ font-size: var(--text-input-lg-fontSize);
4151
+ line-height: var(--text-input-lg-lineHeight);
4152
+ }
4153
+
4154
+ .muka-textarea__native::placeholder {
4155
+ color: var(--color-text-subtle-default);
4156
+ }
4157
+
4158
+ .muka-textarea__field--disabled .muka-textarea__native {
4159
+ color: var(--input-field-color-disabled-foreground);
4160
+ cursor: not-allowed;
4161
+ }
4162
+
4163
+ /* Footer (helper/error + count) */
4164
+ .muka-textarea__footer {
4165
+ display: flex;
4166
+ justify-content: space-between;
4167
+ align-items: flex-start;
4168
+ gap: var(--spacing-2);
4169
+ }
4170
+
4171
+ .muka-textarea__helper {
4172
+ font-family: var(--text-label-sm-regular-fontFamily);
4173
+ font-weight: var(--text-label-sm-regular-fontWeight);
4174
+ font-size: var(--text-label-sm-regular-fontSize);
4175
+ line-height: var(--text-label-sm-regular-lineHeight);
4176
+ color: var(--color-text-subtle-default);
4177
+ margin: 0;
4178
+ }
4179
+
4180
+ .muka-textarea__error {
4181
+ font-family: var(--text-label-sm-regular-fontFamily);
4182
+ font-weight: var(--text-label-sm-regular-fontWeight);
4183
+ font-size: var(--text-label-sm-regular-fontSize);
4184
+ line-height: var(--text-label-sm-regular-lineHeight);
4185
+ color: var(--color-state-error-default);
4186
+ margin: 0;
4187
+ }
4188
+
4189
+ .muka-textarea__count {
4190
+ font-family: var(--text-label-sm-regular-fontFamily);
4191
+ font-weight: var(--text-label-sm-regular-fontWeight);
4192
+ font-size: var(--text-label-sm-regular-fontSize);
4193
+ line-height: var(--text-label-sm-regular-lineHeight);
4194
+ color: var(--color-text-subtle-default);
4195
+ margin-left: auto;
4196
+ }
4197
+
4198
+
4199
+ /* TextLink */
4200
+ /* TextLink Component Styles - Using Muka Design Tokens */
4201
+
4202
+ .muka-text-link {
4203
+ display: inline;
4204
+ cursor: pointer;
4205
+ text-decoration: underline;
4206
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
4207
+ text-underline-offset: 0.2em;
4208
+ text-decoration-thickness: from-font;
4209
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
4210
+ border-radius: var(--border-radius-sm);
4211
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
4212
+ }
4213
+
4214
+ /* ─── Sizes ───────────────────────────────────────────────
4215
+ Mirrors the body text scale so a link matches the copy it sits in. */
4216
+ .muka-text-link--sm {
4217
+ font-family: var(--text-body-sm-regular-fontFamily);
4218
+ font-weight: var(--text-body-sm-regular-fontWeight);
4219
+ font-size: var(--text-body-sm-regular-fontSize);
4220
+ line-height: var(--text-body-sm-regular-lineHeight);
4221
+ }
4222
+
4223
+ .muka-text-link--base {
4224
+ font-family: var(--text-body-base-regular-fontFamily);
4225
+ font-weight: var(--text-body-base-regular-fontWeight);
4226
+ font-size: var(--text-body-base-regular-fontSize);
4227
+ line-height: var(--text-body-base-regular-lineHeight);
4228
+ }
4229
+
4230
+ .muka-text-link--lg {
4231
+ font-family: var(--text-body-lg-regular-fontFamily);
4232
+ font-weight: var(--text-body-lg-regular-fontWeight);
4233
+ font-size: var(--text-body-lg-regular-fontSize);
4234
+ line-height: var(--text-body-lg-regular-lineHeight);
4235
+ }
4236
+
4237
+ /* ─── Variant: default (accent) ───────────────────────────
4238
+ Visited repeats the default colour on purpose: the design treats visited and
4239
+ default the same, and pinning it stops the browser's purple from showing. */
4240
+ .muka-text-link--default,
4241
+ .muka-text-link--default:visited {
4242
+ color: var(--color-text-action-default);
4243
+ }
4244
+
4245
+ .muka-text-link--default:hover,
4246
+ .muka-text-link--default:focus-visible {
4247
+ color: var(--color-text-action-hover);
4248
+ }
4249
+
4250
+ .muka-text-link--default:active {
4251
+ color: var(--color-text-action-pressed);
4252
+ }
4253
+
4254
+ /* ─── Variant: subtle (neutral) ───────────────────────────
4255
+ Hover, focus and pressed all darken to the default text colour. */
4256
+ .muka-text-link--subtle,
4257
+ .muka-text-link--subtle:visited {
4258
+ color: var(--color-text-subtle-default);
4259
+ }
4260
+
4261
+ .muka-text-link--subtle:hover,
4262
+ .muka-text-link--subtle:focus-visible,
4263
+ .muka-text-link--subtle:active {
4264
+ color: var(--color-text-default-default);
4265
+ }
4266
+
4267
+ /* ─── Focus ───────────────────────────────────────────────
4268
+ Same ring as every other focusable Muka component. */
4269
+ .muka-text-link:focus-visible {
4270
+ outline: 2px solid var(--color-border-focus);
4271
+ outline-offset: 2px;
4272
+ }
4273
+
4274
+ @media (prefers-reduced-motion: reduce) {
4275
+ .muka-text-link {
4276
+ transition: none;
4277
+ }
4278
+ }
4279
+
4280
+
4215
4281
  /* Table */
4216
4282
  /* Table Component Styles - Using Muka Design Tokens */
4217
4283
 
@@ -4477,198 +4543,90 @@ body {
4477
4543
  .muka-table__header-cell {
4478
4544
  vertical-align: middle;
4479
4545
  }
4480
-
4481
- /* Size: Small */
4482
- .muka-table--sm .muka-table__cell,
4483
- .muka-table--sm .muka-table__header-cell {
4484
- padding: var(--table-cell-padding-y-sm) var(--table-cell-padding-x-sm);
4485
- }
4486
-
4487
- /* Size: Medium */
4488
- .muka-table--md .muka-table__cell,
4489
- .muka-table--md .muka-table__header-cell {
4490
- padding: var(--table-cell-padding-y-md) var(--table-cell-padding-x-md);
4491
- }
4492
-
4493
- /* Size: Large */
4494
- .muka-table--lg .muka-table__cell,
4495
- .muka-table--lg .muka-table__header-cell {
4496
- padding: var(--table-cell-padding-y-lg) var(--table-cell-padding-x-lg);
4497
- }
4498
-
4499
- /* Alignment */
4500
- .muka-table__cell--left,
4501
- .muka-table__header-cell--left {
4502
- text-align: left;
4503
- }
4504
-
4505
- .muka-table__cell--center,
4506
- .muka-table__header-cell--center {
4507
- text-align: center;
4508
- }
4509
-
4510
- .muka-table__cell--right,
4511
- .muka-table__header-cell--right {
4512
- text-align: right;
4513
- }
4514
-
4515
- /* ========================================
4516
- HEADER CELLS
4517
- ======================================== */
4518
-
4519
- .muka-table__header-cell {
4520
- font-family: var(--text-body-base-bold-fontFamily);
4521
- font-weight: var(--text-body-base-bold-fontWeight);
4522
- font-size: var(--text-body-base-bold-fontSize);
4523
- line-height: var(--text-body-base-bold-lineHeight);
4524
- color: var(--color-text-default-default);
4525
- white-space: nowrap;
4526
- }
4527
-
4528
- .muka-table__header-content {
4529
- display: inline-flex;
4530
- align-items: center;
4531
- gap: var(--spacing-1);
4532
- }
4533
-
4534
- /* Sortable */
4535
- .muka-table__header-cell--sortable {
4536
- cursor: pointer;
4537
- user-select: none;
4538
- }
4539
-
4540
- .muka-table__header-cell--sortable:hover {
4541
- color: var(--color-text-default-default);
4542
- }
4543
-
4544
- .muka-table__header-cell--sortable:focus-visible {
4545
- outline: 2px solid var(--color-action-default);
4546
- outline-offset: -2px;
4547
- }
4548
-
4549
- /* Sort icon */
4550
- .muka-table__sort-icon {
4551
- width: 1em;
4552
- height: 1em;
4553
- opacity: 0.4;
4554
- transition: opacity 0.2s, transform 0.2s;
4555
- }
4556
-
4557
- .muka-table__header-cell--sortable:hover .muka-table__sort-icon {
4558
- opacity: 0.7;
4559
- }
4560
-
4561
- .muka-table__sort-icon--asc,
4562
- .muka-table__sort-icon--desc {
4563
- opacity: 1;
4564
- }
4565
-
4566
-
4567
- /* SwipeActions */
4568
- /* SwipeActions Component Styles */
4569
-
4570
- .muka-swipe-actions {
4571
- position: relative;
4572
- overflow: hidden;
4573
- touch-action: pan-y;
4574
- -webkit-user-select: none;
4575
- user-select: none;
4576
- background-color: var(--color-surface-level3);
4577
- }
4578
-
4579
- .muka-swipe-actions--disabled {
4580
- touch-action: auto;
4581
- }
4582
-
4583
- /* ─── Row that holds the actual content ────────────────── */
4584
-
4585
- .muka-swipe-actions__row {
4586
- position: relative;
4587
- z-index: 1;
4588
- background-color: inherit;
4589
- will-change: transform;
4590
- }
4591
-
4592
- /* ─── Action panels — sit beneath the row ──────────────── */
4593
-
4594
- .muka-swipe-actions__panel {
4595
- position: absolute;
4596
- top: 0;
4597
- bottom: 0;
4598
- display: flex;
4599
- align-items: stretch;
4600
- z-index: 0;
4546
+
4547
+ /* Size: Small */
4548
+ .muka-table--sm .muka-table__cell,
4549
+ .muka-table--sm .muka-table__header-cell {
4550
+ padding: var(--table-cell-padding-y-sm) var(--table-cell-padding-x-sm);
4601
4551
  }
4602
4552
 
4603
- .muka-swipe-actions__panel--left {
4604
- left: 0;
4553
+ /* Size: Medium */
4554
+ .muka-table--md .muka-table__cell,
4555
+ .muka-table--md .muka-table__header-cell {
4556
+ padding: var(--table-cell-padding-y-md) var(--table-cell-padding-x-md);
4605
4557
  }
4606
4558
 
4607
- .muka-swipe-actions__panel--right {
4608
- right: 0;
4559
+ /* Size: Large */
4560
+ .muka-table--lg .muka-table__cell,
4561
+ .muka-table--lg .muka-table__header-cell {
4562
+ padding: var(--table-cell-padding-y-lg) var(--table-cell-padding-x-lg);
4609
4563
  }
4610
4564
 
4611
- /* ─── Single action button ─────────────────────────────── */
4565
+ /* Alignment */
4566
+ .muka-table__cell--left,
4567
+ .muka-table__header-cell--left {
4568
+ text-align: left;
4569
+ }
4612
4570
 
4613
- .muka-swipe-actions__button {
4614
- display: flex;
4615
- flex-direction: column;
4616
- align-items: center;
4617
- justify-content: center;
4618
- gap: var(--spacing-1);
4619
- border: none;
4620
- cursor: pointer;
4621
- padding: var(--spacing-2);
4622
- background-color: var(--color-surface-level2);
4623
- color: var(--color-text-default-default);
4624
- font-family: var(--text-label-sm-semibold-fontFamily);
4625
- font-weight: var(--text-label-sm-semibold-fontWeight);
4626
- font-size: var(--text-label-sm-semibold-fontSize);
4627
- line-height: var(--text-label-sm-semibold-lineHeight);
4628
- -webkit-tap-highlight-color: transparent;
4629
- transition: filter 0.12s ease;
4571
+ .muka-table__cell--center,
4572
+ .muka-table__header-cell--center {
4573
+ text-align: center;
4630
4574
  }
4631
4575
 
4632
- .muka-swipe-actions__button:hover {
4633
- filter: brightness(0.95);
4576
+ .muka-table__cell--right,
4577
+ .muka-table__header-cell--right {
4578
+ text-align: right;
4634
4579
  }
4635
4580
 
4636
- .muka-swipe-actions__button:focus-visible {
4637
- outline: 2px solid var(--color-action-default);
4638
- outline-offset: -2px;
4581
+ /* ========================================
4582
+ HEADER CELLS
4583
+ ======================================== */
4584
+
4585
+ .muka-table__header-cell {
4586
+ font-family: var(--text-body-base-bold-fontFamily);
4587
+ font-weight: var(--text-body-base-bold-fontWeight);
4588
+ font-size: var(--text-body-base-bold-fontSize);
4589
+ line-height: var(--text-body-base-bold-lineHeight);
4590
+ color: var(--color-text-default-default);
4591
+ white-space: nowrap;
4639
4592
  }
4640
4593
 
4641
- .muka-swipe-actions__button-icon {
4594
+ .muka-table__header-content {
4642
4595
  display: inline-flex;
4643
4596
  align-items: center;
4644
- justify-content: center;
4597
+ gap: var(--spacing-1);
4645
4598
  }
4646
4599
 
4647
- /* ─── Color variants ───────────────────────────────────── */
4600
+ /* Sortable */
4601
+ .muka-table__header-cell--sortable {
4602
+ cursor: pointer;
4603
+ user-select: none;
4604
+ }
4648
4605
 
4649
- .muka-swipe-actions__button--neutral {
4650
- background-color: var(--color-surface-level2);
4606
+ .muka-table__header-cell--sortable:hover {
4651
4607
  color: var(--color-text-default-default);
4652
4608
  }
4653
4609
 
4654
- .muka-swipe-actions__button--primary {
4655
- background-color: var(--color-action-default);
4656
- color: var(--color-text-default-inverse);
4610
+ .muka-table__header-cell--sortable:focus-visible {
4611
+ outline: 2px solid var(--color-action-default);
4612
+ outline-offset: -2px;
4657
4613
  }
4658
4614
 
4659
- .muka-swipe-actions__button--success {
4660
- background-color: var(--color-state-success-default);
4661
- color: var(--color-text-default-inverse);
4615
+ /* Sort icon */
4616
+ .muka-table__sort-icon {
4617
+ width: 1em;
4618
+ height: 1em;
4619
+ opacity: 0.4;
4620
+ transition: opacity 0.2s, transform 0.2s;
4662
4621
  }
4663
4622
 
4664
- .muka-swipe-actions__button--warning {
4665
- background-color: var(--color-state-warning-default);
4666
- color: var(--color-text-default-default);
4623
+ .muka-table__header-cell--sortable:hover .muka-table__sort-icon {
4624
+ opacity: 0.7;
4667
4625
  }
4668
4626
 
4669
- .muka-swipe-actions__button--destructive {
4670
- background-color: var(--color-state-error-default);
4671
- color: var(--color-text-default-inverse);
4627
+ .muka-table__sort-icon--asc,
4628
+ .muka-table__sort-icon--desc {
4629
+ opacity: 1;
4672
4630
  }
4673
4631
 
4674
4632
 
@@ -4835,6 +4793,114 @@ body {
4835
4793
  }
4836
4794
 
4837
4795
 
4796
+ /* SwipeActions */
4797
+ /* SwipeActions Component Styles */
4798
+
4799
+ .muka-swipe-actions {
4800
+ position: relative;
4801
+ overflow: hidden;
4802
+ touch-action: pan-y;
4803
+ -webkit-user-select: none;
4804
+ user-select: none;
4805
+ background-color: var(--color-surface-level3);
4806
+ }
4807
+
4808
+ .muka-swipe-actions--disabled {
4809
+ touch-action: auto;
4810
+ }
4811
+
4812
+ /* ─── Row that holds the actual content ────────────────── */
4813
+
4814
+ .muka-swipe-actions__row {
4815
+ position: relative;
4816
+ z-index: 1;
4817
+ background-color: inherit;
4818
+ will-change: transform;
4819
+ }
4820
+
4821
+ /* ─── Action panels — sit beneath the row ──────────────── */
4822
+
4823
+ .muka-swipe-actions__panel {
4824
+ position: absolute;
4825
+ top: 0;
4826
+ bottom: 0;
4827
+ display: flex;
4828
+ align-items: stretch;
4829
+ z-index: 0;
4830
+ }
4831
+
4832
+ .muka-swipe-actions__panel--left {
4833
+ left: 0;
4834
+ }
4835
+
4836
+ .muka-swipe-actions__panel--right {
4837
+ right: 0;
4838
+ }
4839
+
4840
+ /* ─── Single action button ─────────────────────────────── */
4841
+
4842
+ .muka-swipe-actions__button {
4843
+ display: flex;
4844
+ flex-direction: column;
4845
+ align-items: center;
4846
+ justify-content: center;
4847
+ gap: var(--spacing-1);
4848
+ border: none;
4849
+ cursor: pointer;
4850
+ padding: var(--spacing-2);
4851
+ background-color: var(--color-surface-level2);
4852
+ color: var(--color-text-default-default);
4853
+ font-family: var(--text-label-sm-semibold-fontFamily);
4854
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4855
+ font-size: var(--text-label-sm-semibold-fontSize);
4856
+ line-height: var(--text-label-sm-semibold-lineHeight);
4857
+ -webkit-tap-highlight-color: transparent;
4858
+ transition: filter 0.12s ease;
4859
+ }
4860
+
4861
+ .muka-swipe-actions__button:hover {
4862
+ filter: brightness(0.95);
4863
+ }
4864
+
4865
+ .muka-swipe-actions__button:focus-visible {
4866
+ outline: 2px solid var(--color-action-default);
4867
+ outline-offset: -2px;
4868
+ }
4869
+
4870
+ .muka-swipe-actions__button-icon {
4871
+ display: inline-flex;
4872
+ align-items: center;
4873
+ justify-content: center;
4874
+ }
4875
+
4876
+ /* ─── Color variants ───────────────────────────────────── */
4877
+
4878
+ .muka-swipe-actions__button--neutral {
4879
+ background-color: var(--color-surface-level2);
4880
+ color: var(--color-text-default-default);
4881
+ }
4882
+
4883
+ .muka-swipe-actions__button--primary {
4884
+ background-color: var(--color-action-default);
4885
+ color: var(--color-text-default-inverse);
4886
+ }
4887
+
4888
+ .muka-swipe-actions__button--success {
4889
+ background-color: var(--color-state-success-default);
4890
+ color: var(--color-text-default-inverse);
4891
+ }
4892
+
4893
+ .muka-swipe-actions__button--warning {
4894
+ background-color: var(--color-state-warning-default);
4895
+ color: var(--color-text-default-default);
4896
+ }
4897
+
4898
+ .muka-swipe-actions__button--destructive {
4899
+ background-color: var(--color-state-error-default);
4900
+ color: var(--color-text-default-inverse);
4901
+ }
4902
+
4903
+
4838
4904
  /* SocialSignInButton */
4839
4905
  /*
4840
4906
  * SocialSignInButton lockup colors are provider-mandated (Apple HIG /
@@ -13603,6 +13669,39 @@ button.muka-chat-photo-grid__tile:focus-visible {
13603
13669
  opacity: 1; /* Remove opacity since we have proper disabled tokens */
13604
13670
  }
13605
13671
 
13672
+ /* Destructive variant - primary's structure on the solid error fill, for
13673
+ irreversible actions. Hover and pressed step away from the label color, so
13674
+ contrast never drops (darker in light themes, lighter in dark themes).
13675
+ Disabled is neutral grey rather than primary's brand-tinted fill. */
13676
+ .muka-button--destructive {
13677
+ background-color: var(--button-color-destructive-background-default);
13678
+ color: var(--button-color-destructive-foreground-default);
13679
+ box-shadow: var(--button-color-destructive-shadow-default);
13680
+ }
13681
+
13682
+ .muka-button--destructive:hover:not(:disabled) {
13683
+ background-color: var(--button-color-destructive-background-hover);
13684
+ color: var(--button-color-destructive-foreground-hover);
13685
+ box-shadow: var(--button-color-destructive-shadow-hover);
13686
+ }
13687
+
13688
+ .muka-button--destructive:active:not(:disabled),
13689
+ .muka-button--destructive.muka-button--pressed:not(:disabled),
13690
+ .muka-button--destructive[data-state="open"]:not(:disabled),
13691
+ .muka-button--destructive[aria-pressed="true"]:not(:disabled) {
13692
+ background-color: var(--button-color-destructive-background-pressed);
13693
+ color: var(--button-color-destructive-foreground-pressed);
13694
+ box-shadow: var(--button-color-destructive-shadow-pressed);
13695
+ }
13696
+
13697
+ .muka-button--destructive:disabled {
13698
+ background-color: var(--button-color-destructive-background-disabled);
13699
+ color: var(--button-color-destructive-foreground-disabled);
13700
+ box-shadow: var(--button-color-destructive-shadow-disabled);
13701
+ cursor: not-allowed;
13702
+ opacity: 1;
13703
+ }
13704
+
13606
13705
  /* Secondary variant - supporting actions, no border, only bottom inner shadow */
13607
13706
  .muka-button--secondary {
13608
13707
  background-color: var(--button-color-secondary-background-default);
@@ -14536,12 +14635,29 @@ button.muka-chat-photo-grid__tile:focus-visible {
14536
14635
  vertical-align: middle;
14537
14636
  background-color: var(--avatar-color-background-default);
14538
14637
  color: var(--avatar-color-foreground-default);
14539
- border: var(--avatar-border-width) solid var(--avatar-color-border-default);
14540
14638
  font-family: var(--alias-font-brand-family);
14541
14639
  font-weight: var(--alias-font-brand-weight-semibold);
14542
14640
  }
14543
14641
 
14544
14642
  /* Size variants */
14643
+ .muka-avatar--4xs {
14644
+ width: var(--avatar-size-4xs);
14645
+ height: var(--avatar-size-4xs);
14646
+ font-size: var(--avatar-font-size-3xs); /* only used by an AvatarGroup "+N" */
14647
+ }
14648
+
14649
+ .muka-avatar--3xs {
14650
+ width: var(--avatar-size-3xs);
14651
+ height: var(--avatar-size-3xs);
14652
+ font-size: var(--avatar-font-size-3xs);
14653
+ }
14654
+
14655
+ .muka-avatar--2xs {
14656
+ width: var(--avatar-size-2xs);
14657
+ height: var(--avatar-size-2xs);
14658
+ font-size: var(--avatar-font-size-2xs);
14659
+ }
14660
+
14545
14661
  .muka-avatar--xs {
14546
14662
  width: var(--avatar-size-xs);
14547
14663
  height: var(--avatar-size-xs);
@@ -14581,6 +14697,20 @@ button.muka-chat-photo-grid__tile:focus-visible {
14581
14697
  border-radius: var(--avatar-radius-square);
14582
14698
  }
14583
14699
 
14700
+ .muka-avatar--square.muka-avatar--4xs,
14701
+ .muka-avatar--square.muka-avatar--3xs,
14702
+ .muka-avatar--square.muka-avatar--2xs {
14703
+ border-radius: var(--avatar-radius-square-sm);
14704
+ }
14705
+
14706
+ /* 4xs is too small for initials, the fallback icon or a status dot:
14707
+ it shows the picture, or the plain background */
14708
+ .muka-avatar--4xs .muka-avatar__initials,
14709
+ .muka-avatar--4xs .muka-avatar__fallback,
14710
+ .muka-avatar--4xs .muka-avatar__status {
14711
+ display: none;
14712
+ }
14713
+
14584
14714
  /* Clickable state */
14585
14715
  .muka-avatar--clickable {
14586
14716
  cursor: pointer;
@@ -14684,6 +14814,16 @@ button.muka-chat-photo-grid__tile:focus-visible {
14684
14814
  box-sizing: border-box;
14685
14815
  }
14686
14816
 
14817
+ .muka-avatar--3xs .muka-avatar__status {
14818
+ width: var(--avatar-status-size-3xs);
14819
+ height: var(--avatar-status-size-3xs);
14820
+ }
14821
+
14822
+ .muka-avatar--2xs .muka-avatar__status {
14823
+ width: var(--avatar-status-size-2xs);
14824
+ height: var(--avatar-status-size-2xs);
14825
+ }
14826
+
14687
14827
  .muka-avatar--xs .muka-avatar__status {
14688
14828
  width: var(--avatar-status-size-xs);
14689
14829
  height: var(--avatar-status-size-xs);
@@ -14737,44 +14877,17 @@ button.muka-chat-photo-grid__tile:focus-visible {
14737
14877
  background-color: var(--avatar-color-status-away);
14738
14878
  }
14739
14879
 
14740
- /* Avatar Group */
14880
+ /* Avatar Group (Figma "Avatar Stack") */
14741
14881
  .muka-avatar-group {
14742
14882
  display: inline-flex;
14743
14883
  align-items: center;
14744
14884
  flex-direction: row;
14745
14885
  }
14746
14886
 
14887
+ /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
14747
14888
  .muka-avatar-group__item {
14748
14889
  position: relative;
14749
14890
  display: inline-flex;
14750
- border: 2px solid var(--color-surface-level1);
14751
- border-radius: inherit;
14752
- }
14753
-
14754
- /* Add border radius to match avatar shape */
14755
- .muka-avatar-group__item .muka-avatar--circle {
14756
- border-radius: var(--avatar-radius-circle);
14757
- }
14758
-
14759
- .muka-avatar-group__item .muka-avatar--square {
14760
- border-radius: var(--avatar-radius-square);
14761
- }
14762
-
14763
- .muka-avatar-group__item .muka-avatar {
14764
- border: none;
14765
- }
14766
-
14767
- /* Spacing variants for avatar group */
14768
- .muka-avatar-group--tight .muka-avatar-group__item:not(:first-child) {
14769
- margin-left: calc(var(--avatar-group-spacing-tight));
14770
- }
14771
-
14772
- .muka-avatar-group--normal .muka-avatar-group__item:not(:first-child) {
14773
- margin-left: calc(var(--avatar-group-spacing-normal));
14774
- }
14775
-
14776
- /* Z-index stacking for overlap effect */
14777
- .muka-avatar-group__item {
14778
14891
  z-index: 0;
14779
14892
  }
14780
14893
 
@@ -14782,6 +14895,41 @@ button.muka-chat-photo-grid__tile:focus-visible {
14782
14895
  z-index: 10;
14783
14896
  }
14784
14897
 
14898
+ /* Grouped avatars get a ring outside their edge, drawn as a shadow so it
14899
+ does not change the avatar's size or the overlap */
14900
+ .muka-avatar-group__item .muka-avatar {
14901
+ box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14902
+ }
14903
+
14904
+ /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14905
+ other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14906
+ .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14907
+ .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
14908
+ .muka-avatar-group--2xs { --muka-avatar-group-size: var(--avatar-size-2xs); }
14909
+ .muka-avatar-group--xs { --muka-avatar-group-size: var(--avatar-size-xs); }
14910
+ .muka-avatar-group--sm { --muka-avatar-group-size: var(--avatar-size-sm); }
14911
+ .muka-avatar-group--md { --muka-avatar-group-size: var(--avatar-size-md); }
14912
+ .muka-avatar-group--lg { --muka-avatar-group-size: var(--avatar-size-lg); }
14913
+ .muka-avatar-group--xl { --muka-avatar-group-size: var(--avatar-size-xl); }
14914
+
14915
+ .muka-avatar-group--tight { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) * 2 / 3); }
14916
+ .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14917
+ .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14918
+
14919
+ .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14920
+ .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14921
+ .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); }
14923
+ .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14924
+ .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); }
14926
+ .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14927
+ .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14928
+
14929
+ .muka-avatar-group__item:not(:first-child) {
14930
+ margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14931
+ }
14932
+
14785
14933
  /* Overflow avatar styling */
14786
14934
  .muka-avatar--overflow {
14787
14935
  background-color: var(--avatar-color-background-default);