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