@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
@@ -377,6 +377,8 @@ body {
377
377
  --color-red-10: #dc3d43;
378
378
  --color-red-11: #cd2b31;
379
379
  --color-red-12: #381316;
380
+ --color-redStrong-1: #bd1524;
381
+ --color-redStrong-2: #ab001a;
380
382
  --color-ruby-1: #fffcfd;
381
383
  --color-ruby-2: #fff7f8;
382
384
  --color-ruby-3: #ffeef1;
@@ -1175,6 +1177,9 @@ body {
1175
1177
  --color-state-error-default: #e54d4e;
1176
1178
  --color-state-error-contrast: #fea6a6;
1177
1179
  --color-state-error-background: #3d181e;
1180
+ --color-state-error-solid-default: #e54d4e;
1181
+ --color-state-error-solid-hover: #f56565;
1182
+ --color-state-error-solid-pressed: #f56565;
1178
1183
  --color-state-info-default: #0090ff;
1179
1184
  --color-state-info-contrast: #70b8ff;
1180
1185
  --color-state-info-background: #0d2847;
@@ -1275,6 +1280,9 @@ body {
1275
1280
  --alias-color-state-error-contrast: #fea6a6;
1276
1281
  --alias-color-state-error-default: #e54d4e;
1277
1282
  --alias-color-state-error-muted: #3d181e;
1283
+ --alias-color-state-error-solid-default: #e54d4e;
1284
+ --alias-color-state-error-solid-hover: #f56565;
1285
+ --alias-color-state-error-solid-pressed: #f56565;
1278
1286
  --alias-color-state-error-surface-level0: #2c1419;
1279
1287
  --alias-color-state-error-surface-level1: #3d181e;
1280
1288
  --alias-color-state-error-surface-level2: #4a1a22;
@@ -1571,6 +1579,18 @@ body {
1571
1579
  --button-color-primary-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1572
1580
  --button-color-primary-shadow-pressed: none;
1573
1581
  --button-color-primary-shadow-disabled: none;
1582
+ --button-color-destructive-background-default: #e54d4e;
1583
+ --button-color-destructive-background-hover: #f56565;
1584
+ --button-color-destructive-background-pressed: #f56565;
1585
+ --button-color-destructive-background-disabled: #313131;
1586
+ --button-color-destructive-foreground-default: #111111;
1587
+ --button-color-destructive-foreground-hover: #111111;
1588
+ --button-color-destructive-foreground-pressed: #111111;
1589
+ --button-color-destructive-foreground-disabled: #606060;
1590
+ --button-color-destructive-shadow-default: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1591
+ --button-color-destructive-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1592
+ --button-color-destructive-shadow-pressed: none;
1593
+ --button-color-destructive-shadow-disabled: none;
1574
1594
  --button-color-secondary-background-default: #2a2a2a;
1575
1595
  --button-color-secondary-background-hover: #2a2a2a;
1576
1596
  --button-color-secondary-background-pressed: #313131;
@@ -1935,7 +1955,7 @@ body {
1935
1955
  --contextmenu-trigger-outline-color: #b4b4b4;
1936
1956
  --contextmenu-trigger-outline-offset: 0.25rem;
1937
1957
  --tabs-trigger-color-default-background: #2a2a2a;
1938
- --tabs-trigger-color-default-foreground: #eeeeee;
1958
+ --tabs-trigger-color-default-foreground: #7b7b7b;
1939
1959
  --tabs-trigger-color-default-border: #606060;
1940
1960
  --tabs-trigger-color-hover-background: #2a2a2a;
1941
1961
  --tabs-trigger-color-hover-foreground: #eeeeee;
@@ -1950,8 +1970,16 @@ body {
1950
1970
  --tabs-trigger-padding-y: 0.5rem;
1951
1971
  --tabs-trigger-height: 3rem;
1952
1972
  --tabs-trigger-radius: 0px;
1973
+ --tabs-trigger-min-height-sm: 2.5rem;
1974
+ --tabs-trigger-min-height-md: 3.5rem;
1975
+ --tabs-trigger-min-height-lg: 5rem;
1953
1976
  --tabs-panel-background: #111111;
1954
1977
  --tabs-panel-border: #606060;
1978
+ --tabs-indicator-color: #b4b4b4;
1979
+ --tabs-indicator-height-sm: 2px;
1980
+ --tabs-indicator-height-md: 3px;
1981
+ --tabs-indicator-height-lg: 4px;
1982
+ --tabs-list-padding-x: 1rem;
1955
1983
  --separator-color-default: #313131;
1956
1984
  --separator-color-contrast: #606060;
1957
1985
  --separator-width: 0.0625rem;
@@ -1984,6 +2012,9 @@ body {
1984
2012
  --progress-size-circle-strokeWidth-sm: 0.25rem;
1985
2013
  --progress-size-circle-strokeWidth-md: 0.5rem;
1986
2014
  --progress-size-circle-strokeWidth-lg: 0.75rem;
2015
+ --avatar-size-4xs: 1rem;
2016
+ --avatar-size-3xs: 1.5rem;
2017
+ --avatar-size-2xs: 2rem;
1987
2018
  --avatar-size-xs: 2.5rem;
1988
2019
  --avatar-size-sm: 3rem;
1989
2020
  --avatar-size-md: 4rem;
@@ -1993,26 +2024,38 @@ body {
1993
2024
  --avatar-color-background-loading: #313131;
1994
2025
  --avatar-color-foreground-default: #eeeeee;
1995
2026
  --avatar-color-foreground-muted: #606060;
1996
- --avatar-color-border-default: #313131;
1997
2027
  --avatar-color-status-online: #30a46c;
1998
2028
  --avatar-color-status-offline: #606060;
1999
2029
  --avatar-color-status-busy: #e54d4e;
2000
2030
  --avatar-color-status-away: #ffc53d;
2001
2031
  --avatar-radius-circle: 999rem;
2002
2032
  --avatar-radius-square: 0px;
2033
+ --avatar-radius-square-sm: 0px;
2034
+ --avatar-font-size-3xs: 0.75rem;
2035
+ --avatar-font-size-2xs: 0.75rem;
2003
2036
  --avatar-font-size-xs: 0.75rem;
2004
2037
  --avatar-font-size-sm: 0.875rem;
2005
2038
  --avatar-font-size-md: 1.125rem;
2006
2039
  --avatar-font-size-lg: 1.25rem;
2007
2040
  --avatar-font-size-xl: 1.5rem;
2041
+ --avatar-status-size-3xs: 0.5rem;
2042
+ --avatar-status-size-2xs: 0.5rem;
2008
2043
  --avatar-status-size-xs: 0.5rem;
2009
2044
  --avatar-status-size-sm: 0.75rem;
2010
2045
  --avatar-status-size-md: 1rem;
2011
2046
  --avatar-status-size-lg: 1.25rem;
2012
2047
  --avatar-status-size-xl: 1.5rem;
2013
- --avatar-border-width: 1px;
2014
- --avatar-group-spacing-tight: -0.5rem;
2015
- --avatar-group-spacing-normal: -0.25rem;
2048
+ --avatar-group-ring-width: 0.125rem;
2049
+ --avatar-group-ring-color: #111111;
2050
+ --avatar-group-overlap-tight-sm: 2rem;
2051
+ --avatar-group-overlap-tight-2xs: 1.25rem;
2052
+ --avatar-group-overlap-tight-3xs: 1rem;
2053
+ --avatar-group-overlap-compact-sm: 1.5rem;
2054
+ --avatar-group-overlap-compact-2xs: 1rem;
2055
+ --avatar-group-overlap-compact-3xs: 0.75rem;
2056
+ --avatar-group-overlap-spacious-sm: 1rem;
2057
+ --avatar-group-overlap-spacious-2xs: 0.75rem;
2058
+ --avatar-group-overlap-spacious-3xs: 0.5rem;
2016
2059
  --toast-color-info-background: #eeeeee;
2017
2060
  --toast-color-info-foreground: #111111;
2018
2061
  --toast-color-info-accent: #0d2847;
@@ -2418,116 +2461,6 @@ body {
2418
2461
  }
2419
2462
 
2420
2463
 
2421
- /* View */
2422
- /* View Component Styles */
2423
-
2424
- /* ─── Base layout ─────────────────────────────────────── */
2425
-
2426
- .muka-view {
2427
- display: flex;
2428
- flex-direction: column;
2429
- height: 100dvh;
2430
- background-color: var(--view-color-background);
2431
- position: relative;
2432
- isolation: isolate;
2433
- box-sizing: border-box;
2434
-
2435
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2436
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2437
- --view-sidebar-width: 240px;
2438
- }
2439
-
2440
- /* ─── Surface level variants ─────────────────────────── */
2441
-
2442
- .muka-view--surface-3 {
2443
- background-color: var(--color-surface-level3);
2444
- }
2445
-
2446
- /* ─── Large screens: make room for the left sidebar ──────────
2447
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2448
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2449
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2450
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2451
- for a sidebar that hasn't rendered yet. */
2452
- @media (min-width: 1024px) {
2453
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2454
- padding-left: var(--view-sidebar-width);
2455
- }
2456
- }
2457
-
2458
- /* ─── TopBar elevation ────────────────────────────────── */
2459
-
2460
- .muka-view .muka-topbar {
2461
- flex-shrink: 0;
2462
- z-index: 3;
2463
- box-shadow: var(--shadow-level2);
2464
- }
2465
-
2466
- /* ─── Scrollable body ─────────────────────────────────── */
2467
-
2468
- .muka-view__body {
2469
- flex: 1 1 0%;
2470
- min-height: 0;
2471
- overflow-y: auto;
2472
- overflow-x: clip;
2473
- z-index: 1;
2474
-
2475
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2476
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2477
- reveal the content underneath. */
2478
- display: flex;
2479
- flex-direction: column;
2480
- }
2481
-
2482
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2483
- using the alias-layer section/container tokens, while the body scrolls full
2484
- width. Full-bleed below large. */
2485
- .muka-view__body-inner {
2486
- width: 100%;
2487
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2488
- than floating mid-screen. */
2489
- flex: 1 0 auto;
2490
- }
2491
-
2492
- @media (min-width: 1024px) {
2493
- .muka-view:not([data-size]) .muka-view__body-inner {
2494
- max-width: var(--container-max-width-xl);
2495
- margin-inline: auto;
2496
- padding-inline: var(--section-padding-horizontal-default);
2497
- }
2498
- }
2499
-
2500
- .muka-view[data-size='lg'] .muka-view__body-inner {
2501
- max-width: var(--container-max-width-xl);
2502
- margin-inline: auto;
2503
- padding-inline: var(--section-padding-horizontal-default);
2504
- }
2505
-
2506
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2507
-
2508
- .muka-view__footer {
2509
- position: sticky;
2510
- bottom: 0;
2511
- flex-shrink: 0;
2512
- z-index: 2;
2513
- }
2514
-
2515
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2516
- navigation at the large tier, so hide a footer that holds a navigation bar.
2517
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2518
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2519
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2520
- @media (min-width: 1024px) {
2521
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2522
- display: none;
2523
- }
2524
- }
2525
-
2526
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2527
- display: none;
2528
- }
2529
-
2530
-
2531
2464
  /* Typography */
2532
2465
  .muka-typography-catalog {
2533
2466
  display: flex;
@@ -2878,166 +2811,113 @@ body {
2878
2811
  }
2879
2812
 
2880
2813
 
2881
- /* Toggle */
2882
- /* Toggle Component Styles - Using Muka Design Tokens */
2814
+ /* View */
2815
+ /* View Component Styles */
2883
2816
 
2884
- /* Wrapper container */
2885
- .muka-toggle {
2817
+ /* ─── Base layout ─────────────────────────────────────── */
2818
+
2819
+ .muka-view {
2886
2820
  display: flex;
2887
- align-items: center;
2888
- gap: var(--spacing-2);
2821
+ flex-direction: column;
2822
+ height: 100dvh;
2823
+ background-color: var(--view-color-background);
2889
2824
  position: relative;
2890
- padding: var(--spacing-4) 0;
2825
+ isolation: isolate;
2826
+ box-sizing: border-box;
2827
+
2828
+ /* Width reserved for the footer nav once it becomes a left sidebar at the
2829
+ large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2830
+ --view-sidebar-width: 240px;
2891
2831
  }
2892
2832
 
2893
- .muka-toggle--with-caption {
2894
- padding: var(--spacing-5) 0;
2833
+ /* ─── Surface level variants ─────────────────────────── */
2834
+
2835
+ .muka-view--surface-3 {
2836
+ background-color: var(--color-surface-level3);
2895
2837
  }
2896
2838
 
2897
- .muka-toggle--disabled {
2898
- opacity: 0.6;
2839
+ /* ─── Large screens: make room for the left sidebar ──────────
2840
+ A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2841
+ ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2842
+ actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2843
+ the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2844
+ for a sidebar that hasn't rendered yet. */
2845
+ @media (min-width: 1024px) {
2846
+ .muka-view:has(.muka-bottombar--desktop-sidebar) {
2847
+ padding-left: var(--view-sidebar-width);
2848
+ }
2899
2849
  }
2900
2850
 
2901
- /* Icon */
2902
- .muka-toggle__icon {
2903
- display: flex;
2904
- align-items: center;
2905
- justify-content: center;
2851
+ /* ─── TopBar elevation ────────────────────────────────── */
2852
+
2853
+ .muka-view .muka-topbar {
2906
2854
  flex-shrink: 0;
2907
- width: var(--icon-size-default);
2908
- height: var(--icon-size-default);
2909
- color: var(--color-text-default-default);
2855
+ z-index: 3;
2856
+ box-shadow: var(--shadow-level2);
2910
2857
  }
2911
2858
 
2912
- .muka-toggle__icon svg {
2913
- width: 100%;
2914
- height: 100%;
2915
- }
2859
+ /* ─── Scrollable body ─────────────────────────────────── */
2916
2860
 
2917
- /* Content area (label + caption) */
2918
- .muka-toggle__content {
2861
+ .muka-view__body {
2862
+ flex: 1 1 0%;
2863
+ min-height: 0;
2864
+ overflow-y: auto;
2865
+ overflow-x: clip;
2866
+ z-index: 1;
2867
+
2868
+ /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2869
+ content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2870
+ reveal the content underneath. */
2919
2871
  display: flex;
2920
2872
  flex-direction: column;
2921
- flex: 1;
2922
- min-width: 0;
2923
- gap: var(--spacing-1);
2924
2873
  }
2925
2874
 
2926
- /* Label */
2927
- .muka-toggle__label {
2928
- font-family: var(--text-label-lg-regular-fontFamily);
2929
- font-weight: var(--text-label-lg-regular-fontWeight);
2930
- font-size: var(--text-label-lg-regular-fontSize);
2931
- line-height: var(--text-label-lg-regular-lineHeight);
2932
- color: var(--color-text-default-default);
2933
- cursor: pointer;
2875
+ /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2876
+ using the alias-layer section/container tokens, while the body scrolls full
2877
+ width. Full-bleed below large. */
2878
+ .muka-view__body-inner {
2879
+ width: 100%;
2880
+ /* Grow on short content so the sticky footer is pushed to the bottom rather
2881
+ than floating mid-screen. */
2882
+ flex: 1 0 auto;
2934
2883
  }
2935
2884
 
2936
- .muka-toggle--with-caption .muka-toggle__label {
2937
- font-family: var(--text-label-lg-semibold-fontFamily);
2938
- font-weight: var(--text-label-lg-semibold-fontWeight);
2939
- font-size: var(--text-label-lg-semibold-fontSize);
2940
- line-height: var(--text-label-lg-semibold-lineHeight);
2885
+ @media (min-width: 1024px) {
2886
+ .muka-view:not([data-size]) .muka-view__body-inner {
2887
+ max-width: var(--container-max-width-xl);
2888
+ margin-inline: auto;
2889
+ padding-inline: var(--section-padding-horizontal-default);
2890
+ }
2941
2891
  }
2942
2892
 
2943
- .muka-toggle--disabled .muka-toggle__label {
2944
- color: var(--color-text-subtle-default);
2945
- cursor: not-allowed;
2893
+ .muka-view[data-size='lg'] .muka-view__body-inner {
2894
+ max-width: var(--container-max-width-xl);
2895
+ margin-inline: auto;
2896
+ padding-inline: var(--section-padding-horizontal-default);
2946
2897
  }
2947
2898
 
2948
- /* Caption */
2949
- .muka-toggle__caption {
2950
- font-family: var(--text-body-base-regular-fontFamily);
2951
- font-weight: var(--text-body-base-regular-fontWeight);
2952
- font-size: var(--text-body-base-regular-fontSize);
2953
- line-height: var(--text-body-base-regular-lineHeight);
2954
- color: var(--color-text-subtle-default);
2955
- }
2899
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2956
2900
 
2957
- /* Switch container */
2958
- .muka-toggle__switch {
2959
- position: relative;
2960
- display: inline-flex;
2901
+ .muka-view__footer {
2902
+ position: sticky;
2903
+ bottom: 0;
2961
2904
  flex-shrink: 0;
2962
- cursor: pointer;
2905
+ z-index: 2;
2963
2906
  }
2964
2907
 
2965
- .muka-toggle--disabled .muka-toggle__switch {
2966
- cursor: not-allowed;
2908
+ /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2909
+ navigation at the large tier, so hide a footer that holds a navigation bar.
2910
+ Scoped to `.muka-app-shell` so bare Views (and the standalone
2911
+ desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2912
+ (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2913
+ @media (min-width: 1024px) {
2914
+ .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2915
+ display: none;
2916
+ }
2967
2917
  }
2968
2918
 
2969
- /* Hidden native input */
2970
- .muka-toggle__input {
2971
- position: absolute;
2972
- width: 1px;
2973
- height: 1px;
2974
- padding: 0;
2975
- margin: -1px;
2976
- overflow: hidden;
2977
- clip: rect(0, 0, 0, 0);
2978
- white-space: nowrap;
2979
- border: 0;
2980
- }
2981
-
2982
- /* Track (background pill) */
2983
- .muka-toggle__track {
2984
- display: flex;
2985
- align-items: center;
2986
- width: var(--toggle-track-width);
2987
- height: var(--toggle-track-height);
2988
- border-radius: var(--toggle-track-radius);
2989
- background-color: var(--toggle-track-color-off);
2990
- transition: background-color 0.2s ease;
2991
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
2992
- position: relative;
2993
- }
2994
-
2995
- /* Knob (sliding circle) */
2996
- .muka-toggle__knob {
2997
- position: absolute;
2998
- width: var(--toggle-knob-size);
2999
- height: var(--toggle-knob-size);
3000
- border-radius: var(--border-radius-full);
3001
- background-color: var(--toggle-knob-color-default);
3002
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3003
- left: var(--toggle-knob-offset);
3004
- transition: left 0.2s ease, transform 0.2s ease;
3005
- }
3006
-
3007
- /* Focus state */
3008
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3009
- outline: 2px solid var(--color-border-focus);
3010
- outline-offset: 2px;
3011
- }
3012
-
3013
- /* Checked (on) state */
3014
- .muka-toggle__input:checked + .muka-toggle__track {
3015
- background-color: var(--toggle-track-color-on);
3016
- }
3017
-
3018
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3019
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3020
- }
3021
-
3022
- /* Disabled state */
3023
- .muka-toggle--disabled .muka-toggle__track {
3024
- background-color: var(--toggle-track-color-disabled);
3025
- box-shadow: none;
3026
- }
3027
-
3028
- .muka-toggle--disabled .muka-toggle__knob {
3029
- background-color: var(--toggle-knob-color-disabled);
3030
- box-shadow: none;
3031
- }
3032
-
3033
- /* Divider */
3034
- .muka-toggle__divider {
3035
- position: absolute;
3036
- bottom: 0;
3037
- left: 0;
3038
- right: 0;
3039
- height: 1px;
3040
- background-color: var(--color-border-muted);
2919
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2920
+ display: none;
3041
2921
  }
3042
2922
 
3043
2923
 
@@ -3766,249 +3646,166 @@ body {
3766
3646
  }
3767
3647
 
3768
3648
 
3769
- /* TextLink */
3770
- /* TextLink Component Styles - Using Muka Design Tokens */
3771
-
3772
- .muka-text-link {
3773
- display: inline;
3774
- cursor: pointer;
3775
- text-decoration: underline;
3776
- /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3777
- text-underline-offset: 0.2em;
3778
- text-decoration-thickness: from-font;
3779
- /* Rounds the focus ring's corners; the link itself has no visible box. */
3780
- border-radius: var(--border-radius-sm);
3781
- transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3782
- }
3783
-
3784
- /* ─── Sizes ───────────────────────────────────────────────
3785
- Mirrors the body text scale so a link matches the copy it sits in. */
3786
- .muka-text-link--sm {
3787
- font-family: var(--text-body-sm-regular-fontFamily);
3788
- font-weight: var(--text-body-sm-regular-fontWeight);
3789
- font-size: var(--text-body-sm-regular-fontSize);
3790
- line-height: var(--text-body-sm-regular-lineHeight);
3791
- }
3792
-
3793
- .muka-text-link--base {
3794
- font-family: var(--text-body-base-regular-fontFamily);
3795
- font-weight: var(--text-body-base-regular-fontWeight);
3796
- font-size: var(--text-body-base-regular-fontSize);
3797
- line-height: var(--text-body-base-regular-lineHeight);
3798
- }
3799
-
3800
- .muka-text-link--lg {
3801
- font-family: var(--text-body-lg-regular-fontFamily);
3802
- font-weight: var(--text-body-lg-regular-fontWeight);
3803
- font-size: var(--text-body-lg-regular-fontSize);
3804
- line-height: var(--text-body-lg-regular-lineHeight);
3805
- }
3806
-
3807
- /* ─── Variant: default (accent) ───────────────────────────
3808
- Visited repeats the default colour on purpose: the design treats visited and
3809
- default the same, and pinning it stops the browser's purple from showing. */
3810
- .muka-text-link--default,
3811
- .muka-text-link--default:visited {
3812
- color: var(--color-text-action-default);
3813
- }
3649
+ /* Toggle */
3650
+ /* Toggle Component Styles - Using Muka Design Tokens */
3814
3651
 
3815
- .muka-text-link--default:hover,
3816
- .muka-text-link--default:focus-visible {
3817
- color: var(--color-text-action-hover);
3652
+ /* Wrapper container */
3653
+ .muka-toggle {
3654
+ display: flex;
3655
+ align-items: center;
3656
+ gap: var(--spacing-2);
3657
+ position: relative;
3658
+ padding: var(--spacing-4) 0;
3818
3659
  }
3819
3660
 
3820
- .muka-text-link--default:active {
3821
- color: var(--color-text-action-pressed);
3661
+ .muka-toggle--with-caption {
3662
+ padding: var(--spacing-5) 0;
3822
3663
  }
3823
3664
 
3824
- /* ─── Variant: subtle (neutral) ───────────────────────────
3825
- Hover, focus and pressed all darken to the default text colour. */
3826
- .muka-text-link--subtle,
3827
- .muka-text-link--subtle:visited {
3828
- color: var(--color-text-subtle-default);
3665
+ .muka-toggle--disabled {
3666
+ opacity: 0.6;
3829
3667
  }
3830
3668
 
3831
- .muka-text-link--subtle:hover,
3832
- .muka-text-link--subtle:focus-visible,
3833
- .muka-text-link--subtle:active {
3669
+ /* Icon */
3670
+ .muka-toggle__icon {
3671
+ display: flex;
3672
+ align-items: center;
3673
+ justify-content: center;
3674
+ flex-shrink: 0;
3675
+ width: var(--icon-size-default);
3676
+ height: var(--icon-size-default);
3834
3677
  color: var(--color-text-default-default);
3835
3678
  }
3836
3679
 
3837
- /* ─── Focus ───────────────────────────────────────────────
3838
- Same ring as every other focusable Muka component. */
3839
- .muka-text-link:focus-visible {
3840
- outline: 2px solid var(--color-border-focus);
3841
- outline-offset: 2px;
3842
- }
3843
-
3844
- @media (prefers-reduced-motion: reduce) {
3845
- .muka-text-link {
3846
- transition: none;
3847
- }
3680
+ .muka-toggle__icon svg {
3681
+ width: 100%;
3682
+ height: 100%;
3848
3683
  }
3849
3684
 
3850
-
3851
- /* Textarea */
3852
- /* Textarea Component Styles - Using Muka Design Tokens */
3853
-
3854
- .muka-textarea {
3855
- display: inline-flex;
3685
+ /* Content area (label + caption) */
3686
+ .muka-toggle__content {
3687
+ display: flex;
3856
3688
  flex-direction: column;
3857
- gap: var(--spacing-2);
3689
+ flex: 1;
3690
+ min-width: 0;
3691
+ gap: var(--spacing-1);
3858
3692
  }
3859
3693
 
3860
3694
  /* Label */
3861
- .muka-textarea__label {
3695
+ .muka-toggle__label {
3696
+ font-family: var(--text-label-lg-regular-fontFamily);
3697
+ font-weight: var(--text-label-lg-regular-fontWeight);
3698
+ font-size: var(--text-label-lg-regular-fontSize);
3699
+ line-height: var(--text-label-lg-regular-lineHeight);
3862
3700
  color: var(--color-text-default-default);
3863
3701
  cursor: pointer;
3864
3702
  }
3865
3703
 
3866
- .muka-textarea__label--sm {
3867
- font-family: var(--text-label-sm-semibold-fontFamily);
3868
- font-weight: var(--text-label-sm-semibold-fontWeight);
3869
- font-size: var(--text-label-sm-semibold-fontSize);
3870
- line-height: var(--text-label-sm-semibold-lineHeight);
3871
- }
3872
-
3873
- .muka-textarea__label--md {
3874
- font-family: var(--text-label-md-semibold-fontFamily);
3875
- font-weight: var(--text-label-md-semibold-fontWeight);
3876
- font-size: var(--text-label-md-semibold-fontSize);
3877
- line-height: var(--text-label-md-semibold-lineHeight);
3878
- }
3879
-
3880
- .muka-textarea__label--lg {
3704
+ .muka-toggle--with-caption .muka-toggle__label {
3881
3705
  font-family: var(--text-label-lg-semibold-fontFamily);
3882
3706
  font-weight: var(--text-label-lg-semibold-fontWeight);
3883
3707
  font-size: var(--text-label-lg-semibold-fontSize);
3884
3708
  line-height: var(--text-label-lg-semibold-lineHeight);
3885
3709
  }
3886
3710
 
3887
- .muka-textarea__required {
3888
- color: var(--color-state-error-default);
3889
- }
3890
-
3891
- /* Field container */
3892
- .muka-textarea__field {
3893
- display: flex;
3894
- background-color: var(--input-field-color-default-background);
3895
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
3896
- border-radius: var(--input-field-radius-md);
3897
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
3898
- transition: border-color 0.2s ease, background-color 0.2s ease;
3899
- box-sizing: border-box;
3900
- }
3901
-
3902
- .muka-textarea__field--sm {
3903
- min-height: var(--input-textarea-height-sm);
3904
- border-radius: var(--input-field-radius-sm);
3711
+ .muka-toggle--disabled .muka-toggle__label {
3712
+ color: var(--color-text-subtle-default);
3713
+ cursor: not-allowed;
3905
3714
  }
3906
3715
 
3907
- .muka-textarea__field--md {
3908
- min-height: var(--input-textarea-height-default);
3909
- border-radius: var(--input-field-radius-md);
3716
+ /* Caption */
3717
+ .muka-toggle__caption {
3718
+ font-family: var(--text-body-base-regular-fontFamily);
3719
+ font-weight: var(--text-body-base-regular-fontWeight);
3720
+ font-size: var(--text-body-base-regular-fontSize);
3721
+ line-height: var(--text-body-base-regular-lineHeight);
3722
+ color: var(--color-text-subtle-default);
3910
3723
  }
3911
3724
 
3912
- .muka-textarea__field--lg {
3913
- min-height: var(--input-textarea-height-lg);
3914
- border-radius: var(--input-field-radius-lg);
3725
+ /* Switch container */
3726
+ .muka-toggle__switch {
3727
+ position: relative;
3728
+ display: inline-flex;
3729
+ flex-shrink: 0;
3730
+ cursor: pointer;
3915
3731
  }
3916
3732
 
3917
- /* Focus state */
3918
- .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
3919
- border-width: var(--border-width-bold);
3920
- border-color: var(--input-field-color-focus-border);
3921
- background-color: var(--input-field-color-focus-background);
3922
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3733
+ .muka-toggle--disabled .muka-toggle__switch {
3734
+ cursor: not-allowed;
3923
3735
  }
3924
3736
 
3925
- /* Error state */
3926
- .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
3927
- border-width: var(--border-width-bold);
3928
- border-color: var(--input-field-color-error-border);
3929
- background-color: var(--input-field-color-error-background);
3930
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3737
+ /* Hidden native input */
3738
+ .muka-toggle__input {
3739
+ position: absolute;
3740
+ width: 1px;
3741
+ height: 1px;
3742
+ padding: 0;
3743
+ margin: -1px;
3744
+ overflow: hidden;
3745
+ clip: rect(0, 0, 0, 0);
3746
+ white-space: nowrap;
3747
+ border: 0;
3931
3748
  }
3932
3749
 
3933
- /* Disabled state */
3934
- .muka-textarea__field--disabled {
3935
- background-color: var(--input-field-color-disabled-background);
3936
- border-color: var(--input-field-color-disabled-border);
3937
- cursor: not-allowed;
3938
- }
3939
-
3940
- /* Native textarea */
3941
- .muka-textarea__native {
3942
- flex: 1;
3943
- border: none;
3944
- outline: none;
3945
- background: transparent;
3946
- color: var(--input-field-color-default-foreground);
3947
- font-family: var(--text-input-md-fontFamily);
3948
- font-weight: var(--text-input-md-fontWeight);
3949
- font-size: var(--text-input-md-fontSize);
3950
- line-height: var(--text-input-md-lineHeight);
3951
- padding: 0;
3952
- width: 100%;
3953
- min-width: 0;
3954
- }
3955
-
3956
- .muka-textarea__field--sm .muka-textarea__native {
3957
- font-family: var(--text-input-sm-fontFamily);
3958
- font-weight: var(--text-input-sm-fontWeight);
3959
- font-size: var(--text-input-sm-fontSize);
3960
- line-height: var(--text-input-sm-lineHeight);
3750
+ /* Track (background pill) */
3751
+ .muka-toggle__track {
3752
+ display: flex;
3753
+ align-items: center;
3754
+ width: var(--toggle-track-width);
3755
+ height: var(--toggle-track-height);
3756
+ border-radius: var(--toggle-track-radius);
3757
+ background-color: var(--toggle-track-color-off);
3758
+ transition: background-color 0.2s ease;
3759
+ box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3760
+ position: relative;
3961
3761
  }
3962
3762
 
3963
- .muka-textarea__field--lg .muka-textarea__native {
3964
- font-family: var(--text-input-lg-fontFamily);
3965
- font-weight: var(--text-input-lg-fontWeight);
3966
- font-size: var(--text-input-lg-fontSize);
3967
- line-height: var(--text-input-lg-lineHeight);
3763
+ /* Knob (sliding circle) */
3764
+ .muka-toggle__knob {
3765
+ position: absolute;
3766
+ width: var(--toggle-knob-size);
3767
+ height: var(--toggle-knob-size);
3768
+ border-radius: var(--border-radius-full);
3769
+ background-color: var(--toggle-knob-color-default);
3770
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3771
+ left: var(--toggle-knob-offset);
3772
+ transition: left 0.2s ease, transform 0.2s ease;
3968
3773
  }
3969
3774
 
3970
- .muka-textarea__native::placeholder {
3971
- color: var(--color-text-subtle-default);
3775
+ /* Focus state */
3776
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3777
+ outline: 2px solid var(--color-border-focus);
3778
+ outline-offset: 2px;
3972
3779
  }
3973
3780
 
3974
- .muka-textarea__field--disabled .muka-textarea__native {
3975
- color: var(--input-field-color-disabled-foreground);
3976
- cursor: not-allowed;
3781
+ /* Checked (on) state */
3782
+ .muka-toggle__input:checked + .muka-toggle__track {
3783
+ background-color: var(--toggle-track-color-on);
3977
3784
  }
3978
3785
 
3979
- /* Footer (helper/error + count) */
3980
- .muka-textarea__footer {
3981
- display: flex;
3982
- justify-content: space-between;
3983
- align-items: flex-start;
3984
- gap: var(--spacing-2);
3786
+ .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3787
+ left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3985
3788
  }
3986
3789
 
3987
- .muka-textarea__helper {
3988
- font-family: var(--text-label-sm-regular-fontFamily);
3989
- font-weight: var(--text-label-sm-regular-fontWeight);
3990
- font-size: var(--text-label-sm-regular-fontSize);
3991
- line-height: var(--text-label-sm-regular-lineHeight);
3992
- color: var(--color-text-subtle-default);
3993
- margin: 0;
3790
+ /* Disabled state */
3791
+ .muka-toggle--disabled .muka-toggle__track {
3792
+ background-color: var(--toggle-track-color-disabled);
3793
+ box-shadow: none;
3994
3794
  }
3995
3795
 
3996
- .muka-textarea__error {
3997
- font-family: var(--text-label-sm-regular-fontFamily);
3998
- font-weight: var(--text-label-sm-regular-fontWeight);
3999
- font-size: var(--text-label-sm-regular-fontSize);
4000
- line-height: var(--text-label-sm-regular-lineHeight);
4001
- color: var(--color-state-error-default);
4002
- margin: 0;
3796
+ .muka-toggle--disabled .muka-toggle__knob {
3797
+ background-color: var(--toggle-knob-color-disabled);
3798
+ box-shadow: none;
4003
3799
  }
4004
3800
 
4005
- .muka-textarea__count {
4006
- font-family: var(--text-label-sm-regular-fontFamily);
4007
- font-weight: var(--text-label-sm-regular-fontWeight);
4008
- font-size: var(--text-label-sm-regular-fontSize);
4009
- line-height: var(--text-label-sm-regular-lineHeight);
4010
- color: var(--color-text-subtle-default);
4011
- margin-left: auto;
3801
+ /* Divider */
3802
+ .muka-toggle__divider {
3803
+ position: absolute;
3804
+ bottom: 0;
3805
+ left: 0;
3806
+ right: 0;
3807
+ height: 1px;
3808
+ background-color: var(--color-border-muted);
4012
3809
  }
4013
3810
 
4014
3811
 
@@ -4043,12 +3840,17 @@ body {
4043
3840
  border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4044
3841
  }
4045
3842
 
3843
+ /* Padding: inset the tabs; the divider (border) still spans the full width */
3844
+ .muka-tabs--padding-default .muka-tabs__list {
3845
+ padding-inline: var(--tabs-list-padding-x);
3846
+ }
3847
+
4046
3848
  /* Tab Trigger — clean underline style */
4047
3849
  .muka-tabs__trigger {
4048
3850
  display: inline-flex;
4049
3851
  align-items: center;
4050
3852
  justify-content: center;
4051
- gap: var(--spacing-2, 8px);
3853
+ gap: var(--spacing-1);
4052
3854
  background: transparent;
4053
3855
  border: none;
4054
3856
  cursor: pointer;
@@ -4061,8 +3863,8 @@ body {
4061
3863
  color: var(--tabs-trigger-color-default-foreground);
4062
3864
 
4063
3865
  /* Default MD size values */
4064
- height: 48px;
4065
- padding: 0 var(--spacing-3, 12px);
3866
+ min-height: var(--tabs-trigger-min-height-md);
3867
+ padding: var(--spacing-3);
4066
3868
  font-family: var(--text-label-md-regular-fontFamily);
4067
3869
  font-weight: var(--text-label-md-regular-fontWeight);
4068
3870
  font-size: var(--text-label-md-regular-fontSize);
@@ -4071,8 +3873,8 @@ body {
4071
3873
 
4072
3874
  /* Size Variants */
4073
3875
  .muka-tabs--size-sm .muka-tabs__trigger {
4074
- height: 36px;
4075
- padding: 0 var(--spacing-2, 8px);
3876
+ min-height: var(--tabs-trigger-min-height-sm);
3877
+ padding: 0 var(--spacing-2);
4076
3878
  font-family: var(--text-label-sm-regular-fontFamily);
4077
3879
  font-weight: var(--text-label-sm-regular-fontWeight);
4078
3880
  font-size: var(--text-label-sm-regular-fontSize);
@@ -4080,8 +3882,8 @@ body {
4080
3882
  }
4081
3883
 
4082
3884
  .muka-tabs--size-lg .muka-tabs__trigger {
4083
- height: 56px;
4084
- padding: 0 var(--spacing-4, 16px);
3885
+ min-height: var(--tabs-trigger-min-height-lg);
3886
+ padding: var(--spacing-4);
4085
3887
  font-family: var(--text-label-lg-regular-fontFamily);
4086
3888
  font-weight: var(--text-label-lg-regular-fontWeight);
4087
3889
  font-size: var(--text-label-lg-regular-fontSize);
@@ -4105,8 +3907,8 @@ body {
4105
3907
  bottom: -1px; /* Overlap the 1px border */
4106
3908
  left: 0;
4107
3909
  right: 0;
4108
- height: 3px;
4109
- background-color: var(--tabs-trigger-color-current-foreground);
3910
+ height: var(--tabs-indicator-height-md);
3911
+ background-color: var(--tabs-indicator-color);
4110
3912
  border-bottom-left-radius: 1px;
4111
3913
  border-bottom-right-radius: 1px;
4112
3914
  border-top-left-radius: 3px;
@@ -4114,6 +3916,13 @@ body {
4114
3916
  z-index: 3;
4115
3917
  }
4116
3918
 
3919
+ .muka-tabs--size-sm .muka-tabs__trigger--current::after {
3920
+ height: var(--tabs-indicator-height-sm);
3921
+ }
3922
+ .muka-tabs--size-lg .muka-tabs__trigger--current::after {
3923
+ height: var(--tabs-indicator-height-lg);
3924
+ }
3925
+
4117
3926
  .muka-tabs__trigger--disabled {
4118
3927
  color: var(--tabs-trigger-color-disabled-foreground);
4119
3928
  cursor: not-allowed;
@@ -4124,18 +3933,29 @@ body {
4124
3933
  outline-offset: -2px;
4125
3934
  }
4126
3935
 
4127
- /* Icons */
4128
- .muka-tabs__icon {
3936
+ /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
3937
+ item sits 12px from the text */
3938
+ .muka-tabs__label {
3939
+ padding: 0 var(--spacing-2);
3940
+ }
3941
+
3942
+ /* Leading item: icon, avatar, avatar group or data pie chart */
3943
+ .muka-tabs__leading {
4129
3944
  display: flex;
4130
3945
  align-items: center;
4131
3946
  justify-content: center;
3947
+ flex-shrink: 0;
4132
3948
  }
4133
3949
  .muka-tabs__trigger .muka-icon {
4134
3950
  color: inherit;
4135
3951
  }
4136
- .muka-tabs--size-sm .muka-tabs__icon svg { width: 16px; height: 16px; }
4137
- .muka-tabs--size-md .muka-tabs__icon svg { width: 20px; height: 20px; }
4138
- .muka-tabs--size-lg .muka-tabs__icon svg { width: 24px; height: 24px; }
3952
+ /* Icon sizes only: avatars and pie charts are sized through their size prop */
3953
+ .muka-tabs--size-sm .muka-tabs__leading > svg,
3954
+ .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
3955
+ .muka-tabs--size-md .muka-tabs__leading > svg,
3956
+ .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
3957
+ .muka-tabs--size-lg .muka-tabs__leading > svg,
3958
+ .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
4139
3959
 
4140
3960
  /* Responsive Scroll behavior on small screens */
4141
3961
  @media (max-width: 768px) {
@@ -4179,6 +3999,252 @@ body {
4179
3999
  }
4180
4000
 
4181
4001
 
4002
+ /* Textarea */
4003
+ /* Textarea Component Styles - Using Muka Design Tokens */
4004
+
4005
+ .muka-textarea {
4006
+ display: inline-flex;
4007
+ flex-direction: column;
4008
+ gap: var(--spacing-2);
4009
+ }
4010
+
4011
+ /* Label */
4012
+ .muka-textarea__label {
4013
+ color: var(--color-text-default-default);
4014
+ cursor: pointer;
4015
+ }
4016
+
4017
+ .muka-textarea__label--sm {
4018
+ font-family: var(--text-label-sm-semibold-fontFamily);
4019
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4020
+ font-size: var(--text-label-sm-semibold-fontSize);
4021
+ line-height: var(--text-label-sm-semibold-lineHeight);
4022
+ }
4023
+
4024
+ .muka-textarea__label--md {
4025
+ font-family: var(--text-label-md-semibold-fontFamily);
4026
+ font-weight: var(--text-label-md-semibold-fontWeight);
4027
+ font-size: var(--text-label-md-semibold-fontSize);
4028
+ line-height: var(--text-label-md-semibold-lineHeight);
4029
+ }
4030
+
4031
+ .muka-textarea__label--lg {
4032
+ font-family: var(--text-label-lg-semibold-fontFamily);
4033
+ font-weight: var(--text-label-lg-semibold-fontWeight);
4034
+ font-size: var(--text-label-lg-semibold-fontSize);
4035
+ line-height: var(--text-label-lg-semibold-lineHeight);
4036
+ }
4037
+
4038
+ .muka-textarea__required {
4039
+ color: var(--color-state-error-default);
4040
+ }
4041
+
4042
+ /* Field container */
4043
+ .muka-textarea__field {
4044
+ display: flex;
4045
+ background-color: var(--input-field-color-default-background);
4046
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
4047
+ border-radius: var(--input-field-radius-md);
4048
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
4049
+ transition: border-color 0.2s ease, background-color 0.2s ease;
4050
+ box-sizing: border-box;
4051
+ }
4052
+
4053
+ .muka-textarea__field--sm {
4054
+ min-height: var(--input-textarea-height-sm);
4055
+ border-radius: var(--input-field-radius-sm);
4056
+ }
4057
+
4058
+ .muka-textarea__field--md {
4059
+ min-height: var(--input-textarea-height-default);
4060
+ border-radius: var(--input-field-radius-md);
4061
+ }
4062
+
4063
+ .muka-textarea__field--lg {
4064
+ min-height: var(--input-textarea-height-lg);
4065
+ border-radius: var(--input-field-radius-lg);
4066
+ }
4067
+
4068
+ /* Focus state */
4069
+ .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
4070
+ border-width: var(--border-width-bold);
4071
+ border-color: var(--input-field-color-focus-border);
4072
+ background-color: var(--input-field-color-focus-background);
4073
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4074
+ }
4075
+
4076
+ /* Error state */
4077
+ .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
4078
+ border-width: var(--border-width-bold);
4079
+ border-color: var(--input-field-color-error-border);
4080
+ background-color: var(--input-field-color-error-background);
4081
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4082
+ }
4083
+
4084
+ /* Disabled state */
4085
+ .muka-textarea__field--disabled {
4086
+ background-color: var(--input-field-color-disabled-background);
4087
+ border-color: var(--input-field-color-disabled-border);
4088
+ cursor: not-allowed;
4089
+ }
4090
+
4091
+ /* Native textarea */
4092
+ .muka-textarea__native {
4093
+ flex: 1;
4094
+ border: none;
4095
+ outline: none;
4096
+ background: transparent;
4097
+ color: var(--input-field-color-default-foreground);
4098
+ font-family: var(--text-input-md-fontFamily);
4099
+ font-weight: var(--text-input-md-fontWeight);
4100
+ font-size: var(--text-input-md-fontSize);
4101
+ line-height: var(--text-input-md-lineHeight);
4102
+ padding: 0;
4103
+ width: 100%;
4104
+ min-width: 0;
4105
+ }
4106
+
4107
+ .muka-textarea__field--sm .muka-textarea__native {
4108
+ font-family: var(--text-input-sm-fontFamily);
4109
+ font-weight: var(--text-input-sm-fontWeight);
4110
+ font-size: var(--text-input-sm-fontSize);
4111
+ line-height: var(--text-input-sm-lineHeight);
4112
+ }
4113
+
4114
+ .muka-textarea__field--lg .muka-textarea__native {
4115
+ font-family: var(--text-input-lg-fontFamily);
4116
+ font-weight: var(--text-input-lg-fontWeight);
4117
+ font-size: var(--text-input-lg-fontSize);
4118
+ line-height: var(--text-input-lg-lineHeight);
4119
+ }
4120
+
4121
+ .muka-textarea__native::placeholder {
4122
+ color: var(--color-text-subtle-default);
4123
+ }
4124
+
4125
+ .muka-textarea__field--disabled .muka-textarea__native {
4126
+ color: var(--input-field-color-disabled-foreground);
4127
+ cursor: not-allowed;
4128
+ }
4129
+
4130
+ /* Footer (helper/error + count) */
4131
+ .muka-textarea__footer {
4132
+ display: flex;
4133
+ justify-content: space-between;
4134
+ align-items: flex-start;
4135
+ gap: var(--spacing-2);
4136
+ }
4137
+
4138
+ .muka-textarea__helper {
4139
+ font-family: var(--text-label-sm-regular-fontFamily);
4140
+ font-weight: var(--text-label-sm-regular-fontWeight);
4141
+ font-size: var(--text-label-sm-regular-fontSize);
4142
+ line-height: var(--text-label-sm-regular-lineHeight);
4143
+ color: var(--color-text-subtle-default);
4144
+ margin: 0;
4145
+ }
4146
+
4147
+ .muka-textarea__error {
4148
+ font-family: var(--text-label-sm-regular-fontFamily);
4149
+ font-weight: var(--text-label-sm-regular-fontWeight);
4150
+ font-size: var(--text-label-sm-regular-fontSize);
4151
+ line-height: var(--text-label-sm-regular-lineHeight);
4152
+ color: var(--color-state-error-default);
4153
+ margin: 0;
4154
+ }
4155
+
4156
+ .muka-textarea__count {
4157
+ font-family: var(--text-label-sm-regular-fontFamily);
4158
+ font-weight: var(--text-label-sm-regular-fontWeight);
4159
+ font-size: var(--text-label-sm-regular-fontSize);
4160
+ line-height: var(--text-label-sm-regular-lineHeight);
4161
+ color: var(--color-text-subtle-default);
4162
+ margin-left: auto;
4163
+ }
4164
+
4165
+
4166
+ /* TextLink */
4167
+ /* TextLink Component Styles - Using Muka Design Tokens */
4168
+
4169
+ .muka-text-link {
4170
+ display: inline;
4171
+ cursor: pointer;
4172
+ text-decoration: underline;
4173
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
4174
+ text-underline-offset: 0.2em;
4175
+ text-decoration-thickness: from-font;
4176
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
4177
+ border-radius: var(--border-radius-sm);
4178
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
4179
+ }
4180
+
4181
+ /* ─── Sizes ───────────────────────────────────────────────
4182
+ Mirrors the body text scale so a link matches the copy it sits in. */
4183
+ .muka-text-link--sm {
4184
+ font-family: var(--text-body-sm-regular-fontFamily);
4185
+ font-weight: var(--text-body-sm-regular-fontWeight);
4186
+ font-size: var(--text-body-sm-regular-fontSize);
4187
+ line-height: var(--text-body-sm-regular-lineHeight);
4188
+ }
4189
+
4190
+ .muka-text-link--base {
4191
+ font-family: var(--text-body-base-regular-fontFamily);
4192
+ font-weight: var(--text-body-base-regular-fontWeight);
4193
+ font-size: var(--text-body-base-regular-fontSize);
4194
+ line-height: var(--text-body-base-regular-lineHeight);
4195
+ }
4196
+
4197
+ .muka-text-link--lg {
4198
+ font-family: var(--text-body-lg-regular-fontFamily);
4199
+ font-weight: var(--text-body-lg-regular-fontWeight);
4200
+ font-size: var(--text-body-lg-regular-fontSize);
4201
+ line-height: var(--text-body-lg-regular-lineHeight);
4202
+ }
4203
+
4204
+ /* ─── Variant: default (accent) ───────────────────────────
4205
+ Visited repeats the default colour on purpose: the design treats visited and
4206
+ default the same, and pinning it stops the browser's purple from showing. */
4207
+ .muka-text-link--default,
4208
+ .muka-text-link--default:visited {
4209
+ color: var(--color-text-action-default);
4210
+ }
4211
+
4212
+ .muka-text-link--default:hover,
4213
+ .muka-text-link--default:focus-visible {
4214
+ color: var(--color-text-action-hover);
4215
+ }
4216
+
4217
+ .muka-text-link--default:active {
4218
+ color: var(--color-text-action-pressed);
4219
+ }
4220
+
4221
+ /* ─── Variant: subtle (neutral) ───────────────────────────
4222
+ Hover, focus and pressed all darken to the default text colour. */
4223
+ .muka-text-link--subtle,
4224
+ .muka-text-link--subtle:visited {
4225
+ color: var(--color-text-subtle-default);
4226
+ }
4227
+
4228
+ .muka-text-link--subtle:hover,
4229
+ .muka-text-link--subtle:focus-visible,
4230
+ .muka-text-link--subtle:active {
4231
+ color: var(--color-text-default-default);
4232
+ }
4233
+
4234
+ /* ─── Focus ───────────────────────────────────────────────
4235
+ Same ring as every other focusable Muka component. */
4236
+ .muka-text-link:focus-visible {
4237
+ outline: 2px solid var(--color-border-focus);
4238
+ outline-offset: 2px;
4239
+ }
4240
+
4241
+ @media (prefers-reduced-motion: reduce) {
4242
+ .muka-text-link {
4243
+ transition: none;
4244
+ }
4245
+ }
4246
+
4247
+
4182
4248
  /* Table */
4183
4249
  /* Table Component Styles - Using Muka Design Tokens */
4184
4250
 
@@ -4444,198 +4510,90 @@ body {
4444
4510
  .muka-table__header-cell {
4445
4511
  vertical-align: middle;
4446
4512
  }
4447
-
4448
- /* Size: Small */
4449
- .muka-table--sm .muka-table__cell,
4450
- .muka-table--sm .muka-table__header-cell {
4451
- padding: var(--table-cell-padding-y-sm) var(--table-cell-padding-x-sm);
4452
- }
4453
-
4454
- /* Size: Medium */
4455
- .muka-table--md .muka-table__cell,
4456
- .muka-table--md .muka-table__header-cell {
4457
- padding: var(--table-cell-padding-y-md) var(--table-cell-padding-x-md);
4458
- }
4459
-
4460
- /* Size: Large */
4461
- .muka-table--lg .muka-table__cell,
4462
- .muka-table--lg .muka-table__header-cell {
4463
- padding: var(--table-cell-padding-y-lg) var(--table-cell-padding-x-lg);
4464
- }
4465
-
4466
- /* Alignment */
4467
- .muka-table__cell--left,
4468
- .muka-table__header-cell--left {
4469
- text-align: left;
4470
- }
4471
-
4472
- .muka-table__cell--center,
4473
- .muka-table__header-cell--center {
4474
- text-align: center;
4475
- }
4476
-
4477
- .muka-table__cell--right,
4478
- .muka-table__header-cell--right {
4479
- text-align: right;
4480
- }
4481
-
4482
- /* ========================================
4483
- HEADER CELLS
4484
- ======================================== */
4485
-
4486
- .muka-table__header-cell {
4487
- font-family: var(--text-body-base-bold-fontFamily);
4488
- font-weight: var(--text-body-base-bold-fontWeight);
4489
- font-size: var(--text-body-base-bold-fontSize);
4490
- line-height: var(--text-body-base-bold-lineHeight);
4491
- color: var(--color-text-default-default);
4492
- white-space: nowrap;
4493
- }
4494
-
4495
- .muka-table__header-content {
4496
- display: inline-flex;
4497
- align-items: center;
4498
- gap: var(--spacing-1);
4499
- }
4500
-
4501
- /* Sortable */
4502
- .muka-table__header-cell--sortable {
4503
- cursor: pointer;
4504
- user-select: none;
4505
- }
4506
-
4507
- .muka-table__header-cell--sortable:hover {
4508
- color: var(--color-text-default-default);
4509
- }
4510
-
4511
- .muka-table__header-cell--sortable:focus-visible {
4512
- outline: 2px solid var(--color-action-default);
4513
- outline-offset: -2px;
4514
- }
4515
-
4516
- /* Sort icon */
4517
- .muka-table__sort-icon {
4518
- width: 1em;
4519
- height: 1em;
4520
- opacity: 0.4;
4521
- transition: opacity 0.2s, transform 0.2s;
4522
- }
4523
-
4524
- .muka-table__header-cell--sortable:hover .muka-table__sort-icon {
4525
- opacity: 0.7;
4526
- }
4527
-
4528
- .muka-table__sort-icon--asc,
4529
- .muka-table__sort-icon--desc {
4530
- opacity: 1;
4531
- }
4532
-
4533
-
4534
- /* SwipeActions */
4535
- /* SwipeActions Component Styles */
4536
-
4537
- .muka-swipe-actions {
4538
- position: relative;
4539
- overflow: hidden;
4540
- touch-action: pan-y;
4541
- -webkit-user-select: none;
4542
- user-select: none;
4543
- background-color: var(--color-surface-level3);
4544
- }
4545
-
4546
- .muka-swipe-actions--disabled {
4547
- touch-action: auto;
4548
- }
4549
-
4550
- /* ─── Row that holds the actual content ────────────────── */
4551
-
4552
- .muka-swipe-actions__row {
4553
- position: relative;
4554
- z-index: 1;
4555
- background-color: inherit;
4556
- will-change: transform;
4557
- }
4558
-
4559
- /* ─── Action panels — sit beneath the row ──────────────── */
4560
-
4561
- .muka-swipe-actions__panel {
4562
- position: absolute;
4563
- top: 0;
4564
- bottom: 0;
4565
- display: flex;
4566
- align-items: stretch;
4567
- z-index: 0;
4513
+
4514
+ /* Size: Small */
4515
+ .muka-table--sm .muka-table__cell,
4516
+ .muka-table--sm .muka-table__header-cell {
4517
+ padding: var(--table-cell-padding-y-sm) var(--table-cell-padding-x-sm);
4568
4518
  }
4569
4519
 
4570
- .muka-swipe-actions__panel--left {
4571
- left: 0;
4520
+ /* Size: Medium */
4521
+ .muka-table--md .muka-table__cell,
4522
+ .muka-table--md .muka-table__header-cell {
4523
+ padding: var(--table-cell-padding-y-md) var(--table-cell-padding-x-md);
4572
4524
  }
4573
4525
 
4574
- .muka-swipe-actions__panel--right {
4575
- right: 0;
4526
+ /* Size: Large */
4527
+ .muka-table--lg .muka-table__cell,
4528
+ .muka-table--lg .muka-table__header-cell {
4529
+ padding: var(--table-cell-padding-y-lg) var(--table-cell-padding-x-lg);
4576
4530
  }
4577
4531
 
4578
- /* ─── Single action button ─────────────────────────────── */
4532
+ /* Alignment */
4533
+ .muka-table__cell--left,
4534
+ .muka-table__header-cell--left {
4535
+ text-align: left;
4536
+ }
4579
4537
 
4580
- .muka-swipe-actions__button {
4581
- display: flex;
4582
- flex-direction: column;
4583
- align-items: center;
4584
- justify-content: center;
4585
- gap: var(--spacing-1);
4586
- border: none;
4587
- cursor: pointer;
4588
- padding: var(--spacing-2);
4589
- background-color: var(--color-surface-level2);
4590
- color: var(--color-text-default-default);
4591
- font-family: var(--text-label-sm-semibold-fontFamily);
4592
- font-weight: var(--text-label-sm-semibold-fontWeight);
4593
- font-size: var(--text-label-sm-semibold-fontSize);
4594
- line-height: var(--text-label-sm-semibold-lineHeight);
4595
- -webkit-tap-highlight-color: transparent;
4596
- transition: filter 0.12s ease;
4538
+ .muka-table__cell--center,
4539
+ .muka-table__header-cell--center {
4540
+ text-align: center;
4597
4541
  }
4598
4542
 
4599
- .muka-swipe-actions__button:hover {
4600
- filter: brightness(0.95);
4543
+ .muka-table__cell--right,
4544
+ .muka-table__header-cell--right {
4545
+ text-align: right;
4601
4546
  }
4602
4547
 
4603
- .muka-swipe-actions__button:focus-visible {
4604
- outline: 2px solid var(--color-action-default);
4605
- outline-offset: -2px;
4548
+ /* ========================================
4549
+ HEADER CELLS
4550
+ ======================================== */
4551
+
4552
+ .muka-table__header-cell {
4553
+ font-family: var(--text-body-base-bold-fontFamily);
4554
+ font-weight: var(--text-body-base-bold-fontWeight);
4555
+ font-size: var(--text-body-base-bold-fontSize);
4556
+ line-height: var(--text-body-base-bold-lineHeight);
4557
+ color: var(--color-text-default-default);
4558
+ white-space: nowrap;
4606
4559
  }
4607
4560
 
4608
- .muka-swipe-actions__button-icon {
4561
+ .muka-table__header-content {
4609
4562
  display: inline-flex;
4610
4563
  align-items: center;
4611
- justify-content: center;
4564
+ gap: var(--spacing-1);
4612
4565
  }
4613
4566
 
4614
- /* ─── Color variants ───────────────────────────────────── */
4567
+ /* Sortable */
4568
+ .muka-table__header-cell--sortable {
4569
+ cursor: pointer;
4570
+ user-select: none;
4571
+ }
4615
4572
 
4616
- .muka-swipe-actions__button--neutral {
4617
- background-color: var(--color-surface-level2);
4573
+ .muka-table__header-cell--sortable:hover {
4618
4574
  color: var(--color-text-default-default);
4619
4575
  }
4620
4576
 
4621
- .muka-swipe-actions__button--primary {
4622
- background-color: var(--color-action-default);
4623
- color: var(--color-text-default-inverse);
4577
+ .muka-table__header-cell--sortable:focus-visible {
4578
+ outline: 2px solid var(--color-action-default);
4579
+ outline-offset: -2px;
4624
4580
  }
4625
4581
 
4626
- .muka-swipe-actions__button--success {
4627
- background-color: var(--color-state-success-default);
4628
- color: var(--color-text-default-inverse);
4582
+ /* Sort icon */
4583
+ .muka-table__sort-icon {
4584
+ width: 1em;
4585
+ height: 1em;
4586
+ opacity: 0.4;
4587
+ transition: opacity 0.2s, transform 0.2s;
4629
4588
  }
4630
4589
 
4631
- .muka-swipe-actions__button--warning {
4632
- background-color: var(--color-state-warning-default);
4633
- color: var(--color-text-default-default);
4590
+ .muka-table__header-cell--sortable:hover .muka-table__sort-icon {
4591
+ opacity: 0.7;
4634
4592
  }
4635
4593
 
4636
- .muka-swipe-actions__button--destructive {
4637
- background-color: var(--color-state-error-default);
4638
- color: var(--color-text-default-inverse);
4594
+ .muka-table__sort-icon--asc,
4595
+ .muka-table__sort-icon--desc {
4596
+ opacity: 1;
4639
4597
  }
4640
4598
 
4641
4599
 
@@ -4802,6 +4760,114 @@ body {
4802
4760
  }
4803
4761
 
4804
4762
 
4763
+ /* SwipeActions */
4764
+ /* SwipeActions Component Styles */
4765
+
4766
+ .muka-swipe-actions {
4767
+ position: relative;
4768
+ overflow: hidden;
4769
+ touch-action: pan-y;
4770
+ -webkit-user-select: none;
4771
+ user-select: none;
4772
+ background-color: var(--color-surface-level3);
4773
+ }
4774
+
4775
+ .muka-swipe-actions--disabled {
4776
+ touch-action: auto;
4777
+ }
4778
+
4779
+ /* ─── Row that holds the actual content ────────────────── */
4780
+
4781
+ .muka-swipe-actions__row {
4782
+ position: relative;
4783
+ z-index: 1;
4784
+ background-color: inherit;
4785
+ will-change: transform;
4786
+ }
4787
+
4788
+ /* ─── Action panels — sit beneath the row ──────────────── */
4789
+
4790
+ .muka-swipe-actions__panel {
4791
+ position: absolute;
4792
+ top: 0;
4793
+ bottom: 0;
4794
+ display: flex;
4795
+ align-items: stretch;
4796
+ z-index: 0;
4797
+ }
4798
+
4799
+ .muka-swipe-actions__panel--left {
4800
+ left: 0;
4801
+ }
4802
+
4803
+ .muka-swipe-actions__panel--right {
4804
+ right: 0;
4805
+ }
4806
+
4807
+ /* ─── Single action button ─────────────────────────────── */
4808
+
4809
+ .muka-swipe-actions__button {
4810
+ display: flex;
4811
+ flex-direction: column;
4812
+ align-items: center;
4813
+ justify-content: center;
4814
+ gap: var(--spacing-1);
4815
+ border: none;
4816
+ cursor: pointer;
4817
+ padding: var(--spacing-2);
4818
+ background-color: var(--color-surface-level2);
4819
+ color: var(--color-text-default-default);
4820
+ font-family: var(--text-label-sm-semibold-fontFamily);
4821
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4822
+ font-size: var(--text-label-sm-semibold-fontSize);
4823
+ line-height: var(--text-label-sm-semibold-lineHeight);
4824
+ -webkit-tap-highlight-color: transparent;
4825
+ transition: filter 0.12s ease;
4826
+ }
4827
+
4828
+ .muka-swipe-actions__button:hover {
4829
+ filter: brightness(0.95);
4830
+ }
4831
+
4832
+ .muka-swipe-actions__button:focus-visible {
4833
+ outline: 2px solid var(--color-action-default);
4834
+ outline-offset: -2px;
4835
+ }
4836
+
4837
+ .muka-swipe-actions__button-icon {
4838
+ display: inline-flex;
4839
+ align-items: center;
4840
+ justify-content: center;
4841
+ }
4842
+
4843
+ /* ─── Color variants ───────────────────────────────────── */
4844
+
4845
+ .muka-swipe-actions__button--neutral {
4846
+ background-color: var(--color-surface-level2);
4847
+ color: var(--color-text-default-default);
4848
+ }
4849
+
4850
+ .muka-swipe-actions__button--primary {
4851
+ background-color: var(--color-action-default);
4852
+ color: var(--color-text-default-inverse);
4853
+ }
4854
+
4855
+ .muka-swipe-actions__button--success {
4856
+ background-color: var(--color-state-success-default);
4857
+ color: var(--color-text-default-inverse);
4858
+ }
4859
+
4860
+ .muka-swipe-actions__button--warning {
4861
+ background-color: var(--color-state-warning-default);
4862
+ color: var(--color-text-default-default);
4863
+ }
4864
+
4865
+ .muka-swipe-actions__button--destructive {
4866
+ background-color: var(--color-state-error-default);
4867
+ color: var(--color-text-default-inverse);
4868
+ }
4869
+
4870
+
4805
4871
  /* SocialSignInButton */
4806
4872
  /*
4807
4873
  * SocialSignInButton lockup colors are provider-mandated (Apple HIG /
@@ -13570,6 +13636,39 @@ button.muka-chat-photo-grid__tile:focus-visible {
13570
13636
  opacity: 1; /* Remove opacity since we have proper disabled tokens */
13571
13637
  }
13572
13638
 
13639
+ /* Destructive variant - primary's structure on the solid error fill, for
13640
+ irreversible actions. Hover and pressed step away from the label color, so
13641
+ contrast never drops (darker in light themes, lighter in dark themes).
13642
+ Disabled is neutral grey rather than primary's brand-tinted fill. */
13643
+ .muka-button--destructive {
13644
+ background-color: var(--button-color-destructive-background-default);
13645
+ color: var(--button-color-destructive-foreground-default);
13646
+ box-shadow: var(--button-color-destructive-shadow-default);
13647
+ }
13648
+
13649
+ .muka-button--destructive:hover:not(:disabled) {
13650
+ background-color: var(--button-color-destructive-background-hover);
13651
+ color: var(--button-color-destructive-foreground-hover);
13652
+ box-shadow: var(--button-color-destructive-shadow-hover);
13653
+ }
13654
+
13655
+ .muka-button--destructive:active:not(:disabled),
13656
+ .muka-button--destructive.muka-button--pressed:not(:disabled),
13657
+ .muka-button--destructive[data-state="open"]:not(:disabled),
13658
+ .muka-button--destructive[aria-pressed="true"]:not(:disabled) {
13659
+ background-color: var(--button-color-destructive-background-pressed);
13660
+ color: var(--button-color-destructive-foreground-pressed);
13661
+ box-shadow: var(--button-color-destructive-shadow-pressed);
13662
+ }
13663
+
13664
+ .muka-button--destructive:disabled {
13665
+ background-color: var(--button-color-destructive-background-disabled);
13666
+ color: var(--button-color-destructive-foreground-disabled);
13667
+ box-shadow: var(--button-color-destructive-shadow-disabled);
13668
+ cursor: not-allowed;
13669
+ opacity: 1;
13670
+ }
13671
+
13573
13672
  /* Secondary variant - supporting actions, no border, only bottom inner shadow */
13574
13673
  .muka-button--secondary {
13575
13674
  background-color: var(--button-color-secondary-background-default);
@@ -14503,12 +14602,29 @@ button.muka-chat-photo-grid__tile:focus-visible {
14503
14602
  vertical-align: middle;
14504
14603
  background-color: var(--avatar-color-background-default);
14505
14604
  color: var(--avatar-color-foreground-default);
14506
- border: var(--avatar-border-width) solid var(--avatar-color-border-default);
14507
14605
  font-family: var(--alias-font-brand-family);
14508
14606
  font-weight: var(--alias-font-brand-weight-semibold);
14509
14607
  }
14510
14608
 
14511
14609
  /* Size variants */
14610
+ .muka-avatar--4xs {
14611
+ width: var(--avatar-size-4xs);
14612
+ height: var(--avatar-size-4xs);
14613
+ font-size: var(--avatar-font-size-3xs); /* only used by an AvatarGroup "+N" */
14614
+ }
14615
+
14616
+ .muka-avatar--3xs {
14617
+ width: var(--avatar-size-3xs);
14618
+ height: var(--avatar-size-3xs);
14619
+ font-size: var(--avatar-font-size-3xs);
14620
+ }
14621
+
14622
+ .muka-avatar--2xs {
14623
+ width: var(--avatar-size-2xs);
14624
+ height: var(--avatar-size-2xs);
14625
+ font-size: var(--avatar-font-size-2xs);
14626
+ }
14627
+
14512
14628
  .muka-avatar--xs {
14513
14629
  width: var(--avatar-size-xs);
14514
14630
  height: var(--avatar-size-xs);
@@ -14548,6 +14664,20 @@ button.muka-chat-photo-grid__tile:focus-visible {
14548
14664
  border-radius: var(--avatar-radius-square);
14549
14665
  }
14550
14666
 
14667
+ .muka-avatar--square.muka-avatar--4xs,
14668
+ .muka-avatar--square.muka-avatar--3xs,
14669
+ .muka-avatar--square.muka-avatar--2xs {
14670
+ border-radius: var(--avatar-radius-square-sm);
14671
+ }
14672
+
14673
+ /* 4xs is too small for initials, the fallback icon or a status dot:
14674
+ it shows the picture, or the plain background */
14675
+ .muka-avatar--4xs .muka-avatar__initials,
14676
+ .muka-avatar--4xs .muka-avatar__fallback,
14677
+ .muka-avatar--4xs .muka-avatar__status {
14678
+ display: none;
14679
+ }
14680
+
14551
14681
  /* Clickable state */
14552
14682
  .muka-avatar--clickable {
14553
14683
  cursor: pointer;
@@ -14651,6 +14781,16 @@ button.muka-chat-photo-grid__tile:focus-visible {
14651
14781
  box-sizing: border-box;
14652
14782
  }
14653
14783
 
14784
+ .muka-avatar--3xs .muka-avatar__status {
14785
+ width: var(--avatar-status-size-3xs);
14786
+ height: var(--avatar-status-size-3xs);
14787
+ }
14788
+
14789
+ .muka-avatar--2xs .muka-avatar__status {
14790
+ width: var(--avatar-status-size-2xs);
14791
+ height: var(--avatar-status-size-2xs);
14792
+ }
14793
+
14654
14794
  .muka-avatar--xs .muka-avatar__status {
14655
14795
  width: var(--avatar-status-size-xs);
14656
14796
  height: var(--avatar-status-size-xs);
@@ -14704,44 +14844,17 @@ button.muka-chat-photo-grid__tile:focus-visible {
14704
14844
  background-color: var(--avatar-color-status-away);
14705
14845
  }
14706
14846
 
14707
- /* Avatar Group */
14847
+ /* Avatar Group (Figma "Avatar Stack") */
14708
14848
  .muka-avatar-group {
14709
14849
  display: inline-flex;
14710
14850
  align-items: center;
14711
14851
  flex-direction: row;
14712
14852
  }
14713
14853
 
14854
+ /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
14714
14855
  .muka-avatar-group__item {
14715
14856
  position: relative;
14716
14857
  display: inline-flex;
14717
- border: 2px solid var(--color-surface-level1);
14718
- border-radius: inherit;
14719
- }
14720
-
14721
- /* Add border radius to match avatar shape */
14722
- .muka-avatar-group__item .muka-avatar--circle {
14723
- border-radius: var(--avatar-radius-circle);
14724
- }
14725
-
14726
- .muka-avatar-group__item .muka-avatar--square {
14727
- border-radius: var(--avatar-radius-square);
14728
- }
14729
-
14730
- .muka-avatar-group__item .muka-avatar {
14731
- border: none;
14732
- }
14733
-
14734
- /* Spacing variants for avatar group */
14735
- .muka-avatar-group--tight .muka-avatar-group__item:not(:first-child) {
14736
- margin-left: calc(var(--avatar-group-spacing-tight));
14737
- }
14738
-
14739
- .muka-avatar-group--normal .muka-avatar-group__item:not(:first-child) {
14740
- margin-left: calc(var(--avatar-group-spacing-normal));
14741
- }
14742
-
14743
- /* Z-index stacking for overlap effect */
14744
- .muka-avatar-group__item {
14745
14858
  z-index: 0;
14746
14859
  }
14747
14860
 
@@ -14749,6 +14862,41 @@ button.muka-chat-photo-grid__tile:focus-visible {
14749
14862
  z-index: 10;
14750
14863
  }
14751
14864
 
14865
+ /* Grouped avatars get a ring outside their edge, drawn as a shadow so it
14866
+ does not change the avatar's size or the overlap */
14867
+ .muka-avatar-group__item .muka-avatar {
14868
+ box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14869
+ }
14870
+
14871
+ /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14872
+ other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14873
+ .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14874
+ .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
14875
+ .muka-avatar-group--2xs { --muka-avatar-group-size: var(--avatar-size-2xs); }
14876
+ .muka-avatar-group--xs { --muka-avatar-group-size: var(--avatar-size-xs); }
14877
+ .muka-avatar-group--sm { --muka-avatar-group-size: var(--avatar-size-sm); }
14878
+ .muka-avatar-group--md { --muka-avatar-group-size: var(--avatar-size-md); }
14879
+ .muka-avatar-group--lg { --muka-avatar-group-size: var(--avatar-size-lg); }
14880
+ .muka-avatar-group--xl { --muka-avatar-group-size: var(--avatar-size-xl); }
14881
+
14882
+ .muka-avatar-group--tight { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) * 2 / 3); }
14883
+ .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14884
+ .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14885
+
14886
+ .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14887
+ .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14888
+ .muka-avatar-group--tight.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-3xs); }
14889
+ .muka-avatar-group--compact.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-sm); }
14890
+ .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14891
+ .muka-avatar-group--compact.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-3xs); }
14892
+ .muka-avatar-group--spacious.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-sm); }
14893
+ .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14894
+ .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14895
+
14896
+ .muka-avatar-group__item:not(:first-child) {
14897
+ margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14898
+ }
14899
+
14752
14900
  /* Overflow avatar styling */
14753
14901
  .muka-avatar--overflow {
14754
14902
  background-color: var(--avatar-color-background-default);