@revikornmann/muka-ui 0.25.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 (165) hide show
  1. package/dist/cjs/components/Autocomplete/Autocomplete.css +63 -0
  2. package/dist/cjs/components/Autocomplete/Autocomplete.js +190 -0
  3. package/dist/cjs/components/Autocomplete/Autocomplete.js.map +1 -0
  4. package/dist/cjs/components/Autocomplete/index.js +6 -0
  5. package/dist/cjs/components/Autocomplete/index.js.map +1 -0
  6. package/dist/cjs/components/Avatar/Avatar.css +79 -30
  7. package/dist/cjs/components/Avatar/Avatar.js +1 -1
  8. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  9. package/dist/cjs/components/Avatar/AvatarGroup.js +4 -3
  10. package/dist/cjs/components/Avatar/AvatarGroup.js.map +1 -1
  11. package/dist/cjs/components/Button/Button.css +33 -0
  12. package/dist/cjs/components/Button/Button.js +2 -2
  13. package/dist/cjs/components/Combobox/Combobox.js +7 -23
  14. package/dist/cjs/components/Combobox/Combobox.js.map +1 -1
  15. package/dist/cjs/components/ContextSelect/ContextSelect.js +2 -2
  16. package/dist/cjs/components/ContextSelect/ContextSelect.js.map +1 -1
  17. package/dist/cjs/components/DataPieChart/DataPieChart.js +5 -2
  18. package/dist/cjs/components/DataPieChart/DataPieChart.js.map +1 -1
  19. package/dist/cjs/components/DataPieChart/index.js.map +1 -1
  20. package/dist/cjs/components/Dialog/Dialog.js +9 -1
  21. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  22. package/dist/cjs/components/DropdownSelect/DropdownSelect.js +2 -2
  23. package/dist/cjs/components/DropdownSelect/DropdownSelect.js.map +1 -1
  24. package/dist/cjs/components/InputCounter/InputCounter.css +175 -0
  25. package/dist/cjs/components/InputCounter/InputCounter.js +196 -0
  26. package/dist/cjs/components/InputCounter/InputCounter.js.map +1 -0
  27. package/dist/cjs/components/InputCounter/index.js +11 -0
  28. package/dist/cjs/components/InputCounter/index.js.map +1 -0
  29. package/dist/cjs/components/Menu/Menu.js +26 -11
  30. package/dist/cjs/components/Menu/Menu.js.map +1 -1
  31. package/dist/cjs/components/Popover/Popover.js +10 -8
  32. package/dist/cjs/components/Popover/Popover.js.map +1 -1
  33. package/dist/cjs/components/Tabs/Tabs.css +37 -14
  34. package/dist/cjs/components/Tabs/Tabs.js +30 -10
  35. package/dist/cjs/components/Tabs/Tabs.js.map +1 -1
  36. package/dist/cjs/components/Tooltip/Tooltip.js +7 -2
  37. package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
  38. package/dist/cjs/components/index.js +7 -3
  39. package/dist/cjs/components/index.js.map +1 -1
  40. package/dist/cjs/utils/suggestionList.js +27 -0
  41. package/dist/cjs/utils/suggestionList.js.map +1 -0
  42. package/dist/cjs/utils/usePortalContainer.js +33 -0
  43. package/dist/cjs/utils/usePortalContainer.js.map +1 -0
  44. package/dist/esm/components/Autocomplete/Autocomplete.css +63 -0
  45. package/dist/esm/components/Autocomplete/Autocomplete.js +187 -0
  46. package/dist/esm/components/Autocomplete/Autocomplete.js.map +1 -0
  47. package/dist/esm/components/Autocomplete/index.js +2 -0
  48. package/dist/esm/components/Autocomplete/index.js.map +1 -0
  49. package/dist/esm/components/Avatar/Avatar.css +79 -30
  50. package/dist/esm/components/Avatar/Avatar.js +1 -1
  51. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  52. package/dist/esm/components/Avatar/AvatarGroup.js +4 -3
  53. package/dist/esm/components/Avatar/AvatarGroup.js.map +1 -1
  54. package/dist/esm/components/Button/Button.css +33 -0
  55. package/dist/esm/components/Button/Button.js +2 -2
  56. package/dist/esm/components/Combobox/Combobox.js +5 -21
  57. package/dist/esm/components/Combobox/Combobox.js.map +1 -1
  58. package/dist/esm/components/ContextSelect/ContextSelect.js +2 -2
  59. package/dist/esm/components/ContextSelect/ContextSelect.js.map +1 -1
  60. package/dist/esm/components/DataPieChart/DataPieChart.js +4 -1
  61. package/dist/esm/components/DataPieChart/DataPieChart.js.map +1 -1
  62. package/dist/esm/components/DataPieChart/index.js.map +1 -1
  63. package/dist/esm/components/Dialog/Dialog.js +9 -1
  64. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  65. package/dist/esm/components/DropdownSelect/DropdownSelect.js +2 -2
  66. package/dist/esm/components/DropdownSelect/DropdownSelect.js.map +1 -1
  67. package/dist/esm/components/InputCounter/InputCounter.css +175 -0
  68. package/dist/esm/components/InputCounter/InputCounter.js +160 -0
  69. package/dist/esm/components/InputCounter/InputCounter.js.map +1 -0
  70. package/dist/esm/components/InputCounter/index.js +3 -0
  71. package/dist/esm/components/InputCounter/index.js.map +1 -0
  72. package/dist/esm/components/Menu/Menu.js +26 -11
  73. package/dist/esm/components/Menu/Menu.js.map +1 -1
  74. package/dist/esm/components/Popover/Popover.js +10 -5
  75. package/dist/esm/components/Popover/Popover.js.map +1 -1
  76. package/dist/esm/components/Tabs/Tabs.css +37 -14
  77. package/dist/esm/components/Tabs/Tabs.js +30 -10
  78. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  79. package/dist/esm/components/Tooltip/Tooltip.js +7 -2
  80. package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
  81. package/dist/esm/components/index.js +2 -0
  82. package/dist/esm/components/index.js.map +1 -1
  83. package/dist/esm/utils/suggestionList.js +22 -0
  84. package/dist/esm/utils/suggestionList.js.map +1 -0
  85. package/dist/esm/utils/usePortalContainer.js +29 -0
  86. package/dist/esm/utils/usePortalContainer.js.map +1 -0
  87. package/dist/styles/components/Autocomplete.css +63 -0
  88. package/dist/styles/components/Avatar.css +79 -30
  89. package/dist/styles/components/Button.css +33 -0
  90. package/dist/styles/components/InputCounter.css +175 -0
  91. package/dist/styles/components/Tabs.css +37 -14
  92. package/dist/styles/index.css +1150 -758
  93. package/dist/styles/muka-dark.css +1150 -758
  94. package/dist/styles/muka-light.css +1150 -758
  95. package/dist/styles/tokens-bouwplan-dark.css +48 -5
  96. package/dist/styles/tokens-bouwplan-light.css +48 -5
  97. package/dist/styles/tokens-fscl-dark.css +48 -5
  98. package/dist/styles/tokens-fscl-light.css +48 -5
  99. package/dist/styles/tokens-grip-dark.css +48 -5
  100. package/dist/styles/tokens-grip-light.css +48 -5
  101. package/dist/styles/tokens-muka-dark.css +48 -5
  102. package/dist/styles/tokens-muka-light.css +48 -5
  103. package/dist/styles/tokens-wireframe-dark.css +48 -5
  104. package/dist/styles/tokens-wireframe-light.css +48 -5
  105. package/dist/styles/wireframe-dark.css +1150 -758
  106. package/dist/styles/wireframe-light.css +1150 -758
  107. package/dist/types/components/Autocomplete/Autocomplete.d.ts +105 -0
  108. package/dist/types/components/Autocomplete/Autocomplete.d.ts.map +1 -0
  109. package/dist/types/components/Autocomplete/index.d.ts +2 -0
  110. package/dist/types/components/Autocomplete/index.d.ts.map +1 -0
  111. package/dist/types/components/Avatar/Avatar.d.ts +8 -3
  112. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  113. package/dist/types/components/Avatar/AvatarGroup.d.ts +10 -5
  114. package/dist/types/components/Avatar/AvatarGroup.d.ts.map +1 -1
  115. package/dist/types/components/Avatar/index.d.ts +1 -1
  116. package/dist/types/components/Avatar/index.d.ts.map +1 -1
  117. package/dist/types/components/Button/Button.d.ts +3 -3
  118. package/dist/types/components/Button/Button.d.ts.map +1 -1
  119. package/dist/types/components/Combobox/Combobox.d.ts +2 -2
  120. package/dist/types/components/Combobox/Combobox.d.ts.map +1 -1
  121. package/dist/types/components/ContextSelect/ContextSelect.d.ts +6 -0
  122. package/dist/types/components/ContextSelect/ContextSelect.d.ts.map +1 -1
  123. package/dist/types/components/DataPieChart/DataPieChart.d.ts +13 -2
  124. package/dist/types/components/DataPieChart/DataPieChart.d.ts.map +1 -1
  125. package/dist/types/components/DataPieChart/index.d.ts +1 -1
  126. package/dist/types/components/DataPieChart/index.d.ts.map +1 -1
  127. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -1
  128. package/dist/types/components/DropdownSelect/DropdownSelect.d.ts +6 -0
  129. package/dist/types/components/DropdownSelect/DropdownSelect.d.ts.map +1 -1
  130. package/dist/types/components/InputCounter/InputCounter.d.ts +79 -0
  131. package/dist/types/components/InputCounter/InputCounter.d.ts.map +1 -0
  132. package/dist/types/components/InputCounter/index.d.ts +3 -0
  133. package/dist/types/components/InputCounter/index.d.ts.map +1 -0
  134. package/dist/types/components/Menu/Menu.d.ts +4 -4
  135. package/dist/types/components/Menu/Menu.d.ts.map +1 -1
  136. package/dist/types/components/Popover/Popover.d.ts +12 -0
  137. package/dist/types/components/Popover/Popover.d.ts.map +1 -1
  138. package/dist/types/components/Tabs/Tabs.d.ts +17 -2
  139. package/dist/types/components/Tabs/Tabs.d.ts.map +1 -1
  140. package/dist/types/components/Tooltip/Tooltip.d.ts +6 -0
  141. package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -1
  142. package/dist/types/components/index.d.ts +4 -2
  143. package/dist/types/components/index.d.ts.map +1 -1
  144. package/dist/types/utils/suggestionList.d.ts +13 -0
  145. package/dist/types/utils/suggestionList.d.ts.map +1 -0
  146. package/dist/types/utils/usePortalContainer.d.ts +19 -0
  147. package/dist/types/utils/usePortalContainer.d.ts.map +1 -0
  148. package/docs/consumers/README.md +2 -2
  149. package/package.json +1 -1
  150. package/tokens/t1-primitives/color.json +10 -0
  151. package/tokens/t2-alias/base.json +14 -0
  152. package/tokens/t2-alias/brand/bouwplan/dark.json +5 -0
  153. package/tokens/t2-alias/brand/bouwplan/light.json +5 -0
  154. package/tokens/t2-alias/brand/fscl/dark.json +5 -0
  155. package/tokens/t2-alias/brand/fscl/light.json +5 -0
  156. package/tokens/t2-alias/brand/grip/dark.json +14 -0
  157. package/tokens/t2-alias/brand/grip/light.json +14 -0
  158. package/tokens/t2-alias/brand/muka/dark.json +14 -0
  159. package/tokens/t2-alias/brand/muka/light.json +14 -0
  160. package/tokens/t2-alias/brand/wireframe/dark.json +14 -0
  161. package/tokens/t2-alias/brand/wireframe/light.json +14 -0
  162. package/tokens/t3-semantics/ui.json +49 -2
  163. package/tokens/t4-components/avatar.json +82 -18
  164. package/tokens/t4-components/button.json +56 -0
  165. 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
- /* Textarea */
3802
- /* Textarea Component Styles - Using Muka Design Tokens */
3681
+ /* Toggle */
3682
+ /* Toggle Component Styles - Using Muka Design Tokens */
3803
3683
 
3804
- .muka-textarea {
3805
- display: inline-flex;
3806
- flex-direction: column;
3684
+ /* Wrapper container */
3685
+ .muka-toggle {
3686
+ display: flex;
3687
+ align-items: center;
3807
3688
  gap: var(--spacing-2);
3689
+ position: relative;
3690
+ padding: var(--spacing-4) 0;
3808
3691
  }
3809
3692
 
3810
- /* Label */
3811
- .muka-textarea__label {
3693
+ .muka-toggle--with-caption {
3694
+ padding: var(--spacing-5) 0;
3695
+ }
3696
+
3697
+ .muka-toggle--disabled {
3698
+ opacity: 0.6;
3699
+ }
3700
+
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);
3812
3709
  color: var(--color-text-default-default);
3813
- cursor: pointer;
3814
3710
  }
3815
3711
 
3816
- .muka-textarea__label--sm {
3817
- font-family: var(--text-label-sm-semibold-fontFamily);
3818
- font-weight: var(--text-label-sm-semibold-fontWeight);
3819
- font-size: var(--text-label-sm-semibold-fontSize);
3820
- line-height: var(--text-label-sm-semibold-lineHeight);
3712
+ .muka-toggle__icon svg {
3713
+ width: 100%;
3714
+ height: 100%;
3821
3715
  }
3822
3716
 
3823
- .muka-textarea__label--md {
3824
- font-family: var(--text-label-md-semibold-fontFamily);
3825
- font-weight: var(--text-label-md-semibold-fontWeight);
3826
- font-size: var(--text-label-md-semibold-fontSize);
3827
- line-height: var(--text-label-md-semibold-lineHeight);
3717
+ /* Content area (label + caption) */
3718
+ .muka-toggle__content {
3719
+ display: flex;
3720
+ flex-direction: column;
3721
+ flex: 1;
3722
+ min-width: 0;
3723
+ gap: var(--spacing-1);
3828
3724
  }
3829
3725
 
3830
- .muka-textarea__label--lg {
3726
+ /* 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);
3732
+ color: var(--color-text-default-default);
3733
+ cursor: pointer;
3734
+ }
3735
+
3736
+ .muka-toggle--with-caption .muka-toggle__label {
3831
3737
  font-family: var(--text-label-lg-semibold-fontFamily);
3832
3738
  font-weight: var(--text-label-lg-semibold-fontWeight);
3833
3739
  font-size: var(--text-label-lg-semibold-fontSize);
3834
3740
  line-height: var(--text-label-lg-semibold-lineHeight);
3835
3741
  }
3836
3742
 
3837
- .muka-textarea__required {
3838
- color: var(--color-state-error-default);
3743
+ .muka-toggle--disabled .muka-toggle__label {
3744
+ color: var(--color-text-subtle-default);
3745
+ cursor: not-allowed;
3839
3746
  }
3840
3747
 
3841
- /* Field container */
3842
- .muka-textarea__field {
3843
- display: flex;
3844
- background-color: var(--input-field-color-default-background);
3845
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
3846
- border-radius: var(--input-field-radius-md);
3847
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
3848
- transition: border-color 0.2s ease, background-color 0.2s ease;
3849
- box-sizing: border-box;
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);
3850
3755
  }
3851
3756
 
3852
- .muka-textarea__field--sm {
3853
- min-height: var(--input-textarea-height-sm);
3854
- border-radius: var(--input-field-radius-sm);
3757
+ /* Switch container */
3758
+ .muka-toggle__switch {
3759
+ position: relative;
3760
+ display: inline-flex;
3761
+ flex-shrink: 0;
3762
+ cursor: pointer;
3855
3763
  }
3856
3764
 
3857
- .muka-textarea__field--md {
3858
- min-height: var(--input-textarea-height-default);
3859
- border-radius: var(--input-field-radius-md);
3765
+ .muka-toggle--disabled .muka-toggle__switch {
3766
+ cursor: not-allowed;
3860
3767
  }
3861
3768
 
3862
- .muka-textarea__field--lg {
3863
- min-height: var(--input-textarea-height-lg);
3864
- border-radius: var(--input-field-radius-lg);
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;
3865
3780
  }
3866
3781
 
3867
- /* Focus state */
3868
- .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
3869
- border-width: var(--border-width-bold);
3870
- border-color: var(--input-field-color-focus-border);
3871
- background-color: var(--input-field-color-focus-background);
3872
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
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;
3873
3793
  }
3874
3794
 
3875
- /* Error state */
3876
- .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
3877
- border-width: var(--border-width-bold);
3878
- border-color: var(--input-field-color-error-border);
3879
- background-color: var(--input-field-color-error-background);
3880
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
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;
3881
3805
  }
3882
3806
 
3883
- /* Disabled state */
3884
- .muka-textarea__field--disabled {
3885
- background-color: var(--input-field-color-disabled-background);
3886
- border-color: var(--input-field-color-disabled-border);
3887
- cursor: not-allowed;
3807
+ /* Focus state */
3808
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3809
+ outline: 2px solid var(--color-border-focus);
3810
+ outline-offset: 2px;
3888
3811
  }
3889
3812
 
3890
- /* Native textarea */
3891
- .muka-textarea__native {
3892
- flex: 1;
3893
- border: none;
3894
- outline: none;
3895
- background: transparent;
3896
- color: var(--input-field-color-default-foreground);
3897
- font-family: var(--text-input-md-fontFamily);
3898
- font-weight: var(--text-input-md-fontWeight);
3899
- font-size: var(--text-input-md-fontSize);
3900
- line-height: var(--text-input-md-lineHeight);
3901
- padding: 0;
3902
- width: 100%;
3903
- min-width: 0;
3813
+ /* Checked (on) state */
3814
+ .muka-toggle__input:checked + .muka-toggle__track {
3815
+ background-color: var(--toggle-track-color-on);
3904
3816
  }
3905
3817
 
3906
- .muka-textarea__field--sm .muka-textarea__native {
3907
- font-family: var(--text-input-sm-fontFamily);
3908
- font-weight: var(--text-input-sm-fontWeight);
3909
- font-size: var(--text-input-sm-fontSize);
3910
- line-height: var(--text-input-sm-lineHeight);
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));
3911
3820
  }
3912
3821
 
3913
- .muka-textarea__field--lg .muka-textarea__native {
3914
- font-family: var(--text-input-lg-fontFamily);
3915
- font-weight: var(--text-input-lg-fontWeight);
3916
- font-size: var(--text-input-lg-fontSize);
3917
- line-height: var(--text-input-lg-lineHeight);
3822
+ /* Disabled state */
3823
+ .muka-toggle--disabled .muka-toggle__track {
3824
+ background-color: var(--toggle-track-color-disabled);
3825
+ box-shadow: none;
3918
3826
  }
3919
3827
 
3920
- .muka-textarea__native::placeholder {
3921
- color: var(--color-text-subtle-default);
3828
+ .muka-toggle--disabled .muka-toggle__knob {
3829
+ background-color: var(--toggle-knob-color-disabled);
3830
+ box-shadow: none;
3922
3831
  }
3923
3832
 
3924
- .muka-textarea__field--disabled .muka-textarea__native {
3925
- color: var(--input-field-color-disabled-foreground);
3926
- cursor: not-allowed;
3927
- }
3928
-
3929
- /* Footer (helper/error + count) */
3930
- .muka-textarea__footer {
3931
- display: flex;
3932
- justify-content: space-between;
3933
- align-items: flex-start;
3934
- gap: var(--spacing-2);
3935
- }
3936
-
3937
- .muka-textarea__helper {
3938
- font-family: var(--text-label-sm-regular-fontFamily);
3939
- font-weight: var(--text-label-sm-regular-fontWeight);
3940
- font-size: var(--text-label-sm-regular-fontSize);
3941
- line-height: var(--text-label-sm-regular-lineHeight);
3942
- color: var(--color-text-subtle-default);
3943
- margin: 0;
3944
- }
3945
-
3946
- .muka-textarea__error {
3947
- font-family: var(--text-label-sm-regular-fontFamily);
3948
- font-weight: var(--text-label-sm-regular-fontWeight);
3949
- font-size: var(--text-label-sm-regular-fontSize);
3950
- line-height: var(--text-label-sm-regular-lineHeight);
3951
- color: var(--color-state-error-default);
3952
- margin: 0;
3953
- }
3954
-
3955
- .muka-textarea__count {
3956
- font-family: var(--text-label-sm-regular-fontFamily);
3957
- font-weight: var(--text-label-sm-regular-fontWeight);
3958
- font-size: var(--text-label-sm-regular-fontSize);
3959
- line-height: var(--text-label-sm-regular-lineHeight);
3960
- color: var(--color-text-subtle-default);
3961
- margin-left: auto;
3962
- }
3963
-
3964
-
3965
- /* TextLink */
3966
- /* TextLink Component Styles - Using Muka Design Tokens */
3967
-
3968
- .muka-text-link {
3969
- display: inline;
3970
- cursor: pointer;
3971
- text-decoration: underline;
3972
- /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3973
- text-underline-offset: 0.2em;
3974
- text-decoration-thickness: from-font;
3975
- /* Rounds the focus ring's corners; the link itself has no visible box. */
3976
- border-radius: var(--border-radius-sm);
3977
- transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3978
- }
3979
-
3980
- /* ─── Sizes ───────────────────────────────────────────────
3981
- Mirrors the body text scale so a link matches the copy it sits in. */
3982
- .muka-text-link--sm {
3983
- font-family: var(--text-body-sm-regular-fontFamily);
3984
- font-weight: var(--text-body-sm-regular-fontWeight);
3985
- font-size: var(--text-body-sm-regular-fontSize);
3986
- line-height: var(--text-body-sm-regular-lineHeight);
3987
- }
3988
-
3989
- .muka-text-link--base {
3990
- font-family: var(--text-body-base-regular-fontFamily);
3991
- font-weight: var(--text-body-base-regular-fontWeight);
3992
- font-size: var(--text-body-base-regular-fontSize);
3993
- line-height: var(--text-body-base-regular-lineHeight);
3994
- }
3995
-
3996
- .muka-text-link--lg {
3997
- font-family: var(--text-body-lg-regular-fontFamily);
3998
- font-weight: var(--text-body-lg-regular-fontWeight);
3999
- font-size: var(--text-body-lg-regular-fontSize);
4000
- line-height: var(--text-body-lg-regular-lineHeight);
4001
- }
4002
-
4003
- /* ─── Variant: default (accent) ───────────────────────────
4004
- Visited repeats the default colour on purpose: the design treats visited and
4005
- default the same, and pinning it stops the browser's purple from showing. */
4006
- .muka-text-link--default,
4007
- .muka-text-link--default:visited {
4008
- color: var(--color-text-action-default);
4009
- }
4010
-
4011
- .muka-text-link--default:hover,
4012
- .muka-text-link--default:focus-visible {
4013
- color: var(--color-text-action-hover);
4014
- }
4015
-
4016
- .muka-text-link--default:active {
4017
- color: var(--color-text-action-pressed);
4018
- }
4019
-
4020
- /* ─── Variant: subtle (neutral) ───────────────────────────
4021
- Hover, focus and pressed all darken to the default text colour. */
4022
- .muka-text-link--subtle,
4023
- .muka-text-link--subtle:visited {
4024
- color: var(--color-text-subtle-default);
4025
- }
4026
-
4027
- .muka-text-link--subtle:hover,
4028
- .muka-text-link--subtle:focus-visible,
4029
- .muka-text-link--subtle:active {
4030
- color: var(--color-text-default-default);
4031
- }
4032
-
4033
- /* ─── Focus ───────────────────────────────────────────────
4034
- Same ring as every other focusable Muka component. */
4035
- .muka-text-link:focus-visible {
4036
- outline: 2px solid var(--color-border-focus);
4037
- outline-offset: 2px;
4038
- }
4039
-
4040
- @media (prefers-reduced-motion: reduce) {
4041
- .muka-text-link {
4042
- transition: none;
4043
- }
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) {
@@ -4191,25 +4011,271 @@ body {
4191
4011
  }
4192
4012
  }
4193
4013
 
4194
- /* Tab Panel — content area */
4195
- .muka-tabs__panel {
4196
- background-color: var(--tabs-panel-background);
4197
- /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4198
- border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4199
- padding: var(--spacing-4);
4200
- position: relative;
4201
- z-index: 1;
4202
- font-family: var(--text-body-base-regular-fontFamily);
4203
- font-weight: var(--text-body-base-regular-fontWeight);
4204
- font-size: var(--text-body-base-regular-fontSize);
4205
- line-height: var(--text-body-base-regular-lineHeight);
4014
+ /* Tab Panel — content area */
4015
+ .muka-tabs__panel {
4016
+ background-color: var(--tabs-panel-background);
4017
+ /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4018
+ border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4019
+ padding: var(--spacing-4);
4020
+ position: relative;
4021
+ z-index: 1;
4022
+ font-family: var(--text-body-base-regular-fontFamily);
4023
+ font-weight: var(--text-body-base-regular-fontWeight);
4024
+ font-size: var(--text-body-base-regular-fontSize);
4025
+ line-height: var(--text-body-base-regular-lineHeight);
4026
+ }
4027
+
4028
+ .muka-tabs__panel:focus-visible {
4029
+ outline: 2px solid var(--color-border-focus);
4030
+ outline-offset: 2px;
4031
+ }
4032
+
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);
4206
4247
  }
4207
4248
 
4208
- .muka-tabs__panel:focus-visible {
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 {
4209
4269
  outline: 2px solid var(--color-border-focus);
4210
4270
  outline-offset: 2px;
4211
4271
  }
4212
4272
 
4273
+ @media (prefers-reduced-motion: reduce) {
4274
+ .muka-text-link {
4275
+ transition: none;
4276
+ }
4277
+ }
4278
+
4213
4279
 
4214
4280
  /* Table */
4215
4281
  /* Table Component Styles - Using Muka Design Tokens */
@@ -4563,114 +4629,6 @@ body {
4563
4629
  }
4564
4630
 
4565
4631
 
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;
4600
- }
4601
-
4602
- .muka-swipe-actions__panel--left {
4603
- left: 0;
4604
- }
4605
-
4606
- .muka-swipe-actions__panel--right {
4607
- right: 0;
4608
- }
4609
-
4610
- /* ─── Single action button ─────────────────────────────── */
4611
-
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;
4629
- }
4630
-
4631
- .muka-swipe-actions__button:hover {
4632
- filter: brightness(0.95);
4633
- }
4634
-
4635
- .muka-swipe-actions__button:focus-visible {
4636
- outline: 2px solid var(--color-action-default);
4637
- outline-offset: -2px;
4638
- }
4639
-
4640
- .muka-swipe-actions__button-icon {
4641
- display: inline-flex;
4642
- align-items: center;
4643
- justify-content: center;
4644
- }
4645
-
4646
- /* ─── Color variants ───────────────────────────────────── */
4647
-
4648
- .muka-swipe-actions__button--neutral {
4649
- background-color: var(--color-surface-level2);
4650
- color: var(--color-text-default-default);
4651
- }
4652
-
4653
- .muka-swipe-actions__button--primary {
4654
- background-color: var(--color-action-default);
4655
- color: var(--color-text-default-inverse);
4656
- }
4657
-
4658
- .muka-swipe-actions__button--success {
4659
- background-color: var(--color-state-success-default);
4660
- color: var(--color-text-default-inverse);
4661
- }
4662
-
4663
- .muka-swipe-actions__button--warning {
4664
- background-color: var(--color-state-warning-default);
4665
- color: var(--color-text-default-default);
4666
- }
4667
-
4668
- .muka-swipe-actions__button--destructive {
4669
- background-color: var(--color-state-error-default);
4670
- color: var(--color-text-default-inverse);
4671
- }
4672
-
4673
-
4674
4632
  /* Spinner */
4675
4633
  /* Spinner Component Styles */
4676
4634
 
@@ -4766,71 +4724,179 @@ body {
4766
4724
  padding-bottom: var(--spacing-3);
4767
4725
  }
4768
4726
 
4769
- /* ─── Label ───────────────────────────────────────────── */
4727
+ /* ─── Label ───────────────────────────────────────────── */
4728
+
4729
+ .muka-spec-row__label {
4730
+ flex: 0 0 auto;
4731
+ margin: 0;
4732
+ color: var(--color-text-subtle-default);
4733
+ font-family: var(--text-body-base-regular-fontFamily);
4734
+ font-weight: var(--text-body-base-regular-fontWeight);
4735
+ font-size: var(--text-body-base-regular-fontSize);
4736
+ line-height: var(--text-body-base-regular-lineHeight);
4737
+ overflow: hidden;
4738
+ text-overflow: ellipsis;
4739
+ white-space: nowrap;
4740
+ }
4741
+
4742
+ /* ─── Value ───────────────────────────────────────────── */
4743
+
4744
+ .muka-spec-row__value {
4745
+ flex: 1 1 0;
4746
+ min-width: 0;
4747
+ margin: 0;
4748
+ display: flex;
4749
+ flex-direction: column;
4750
+ color: var(--color-text-default-default);
4751
+ }
4752
+
4753
+ .muka-spec-row__value-text {
4754
+ font-family: var(--text-body-base-regular-fontFamily);
4755
+ font-weight: var(--text-body-base-regular-fontWeight);
4756
+ font-size: var(--text-body-base-regular-fontSize);
4757
+ line-height: var(--text-body-base-regular-lineHeight);
4758
+ }
4759
+
4760
+ .muka-spec-row__hint {
4761
+ color: var(--color-text-subtle-default);
4762
+ font-family: var(--text-body-sm-regular-fontFamily);
4763
+ font-weight: var(--text-body-sm-regular-fontWeight);
4764
+ font-size: var(--text-body-sm-regular-fontSize);
4765
+ line-height: var(--text-body-sm-regular-lineHeight);
4766
+ }
4767
+
4768
+ /* ─── Label width (horizontal stacking) ───────────────── */
4769
+
4770
+ .muka-spec-list--label-small .muka-spec-row__label {
4771
+ width: 80px;
4772
+ }
4773
+
4774
+ .muka-spec-list--label-medium .muka-spec-row__label {
4775
+ width: 120px;
4776
+ }
4777
+
4778
+ .muka-spec-list--label-large .muka-spec-row__label {
4779
+ width: 160px;
4780
+ }
4781
+
4782
+ /* ─── Vertical stacking ───────────────────────────────── */
4783
+
4784
+ .muka-spec-list--vertical .muka-spec-row {
4785
+ flex-direction: column;
4786
+ gap: var(--spacing-1);
4787
+ }
4788
+
4789
+ .muka-spec-list--vertical .muka-spec-row__label {
4790
+ width: 100%;
4791
+ white-space: normal;
4792
+ }
4793
+
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
+ }
4770
4834
 
4771
- .muka-spec-row__label {
4772
- flex: 0 0 auto;
4773
- margin: 0;
4774
- color: var(--color-text-subtle-default);
4775
- font-family: var(--text-body-base-regular-fontFamily);
4776
- font-weight: var(--text-body-base-regular-fontWeight);
4777
- font-size: var(--text-body-base-regular-fontSize);
4778
- line-height: var(--text-body-base-regular-lineHeight);
4779
- overflow: hidden;
4780
- text-overflow: ellipsis;
4781
- white-space: nowrap;
4835
+ .muka-swipe-actions__panel--right {
4836
+ right: 0;
4782
4837
  }
4783
4838
 
4784
- /* ─── Value ───────────────────────────────────────────── */
4839
+ /* ─── Single action button ─────────────────────────────── */
4785
4840
 
4786
- .muka-spec-row__value {
4787
- flex: 1 1 0;
4788
- min-width: 0;
4789
- margin: 0;
4841
+ .muka-swipe-actions__button {
4790
4842
  display: flex;
4791
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);
4792
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;
4793
4858
  }
4794
4859
 
4795
- .muka-spec-row__value-text {
4796
- font-family: var(--text-body-base-regular-fontFamily);
4797
- font-weight: var(--text-body-base-regular-fontWeight);
4798
- font-size: var(--text-body-base-regular-fontSize);
4799
- line-height: var(--text-body-base-regular-lineHeight);
4860
+ .muka-swipe-actions__button:hover {
4861
+ filter: brightness(0.95);
4800
4862
  }
4801
4863
 
4802
- .muka-spec-row__hint {
4803
- color: var(--color-text-subtle-default);
4804
- font-family: var(--text-body-sm-regular-fontFamily);
4805
- font-weight: var(--text-body-sm-regular-fontWeight);
4806
- font-size: var(--text-body-sm-regular-fontSize);
4807
- line-height: var(--text-body-sm-regular-lineHeight);
4864
+ .muka-swipe-actions__button:focus-visible {
4865
+ outline: 2px solid var(--color-action-default);
4866
+ outline-offset: -2px;
4808
4867
  }
4809
4868
 
4810
- /* ─── Label width (horizontal stacking) ───────────────── */
4811
-
4812
- .muka-spec-list--label-small .muka-spec-row__label {
4813
- width: 80px;
4869
+ .muka-swipe-actions__button-icon {
4870
+ display: inline-flex;
4871
+ align-items: center;
4872
+ justify-content: center;
4814
4873
  }
4815
4874
 
4816
- .muka-spec-list--label-medium .muka-spec-row__label {
4817
- width: 120px;
4875
+ /* ─── Color variants ───────────────────────────────────── */
4876
+
4877
+ .muka-swipe-actions__button--neutral {
4878
+ background-color: var(--color-surface-level2);
4879
+ color: var(--color-text-default-default);
4818
4880
  }
4819
4881
 
4820
- .muka-spec-list--label-large .muka-spec-row__label {
4821
- width: 160px;
4882
+ .muka-swipe-actions__button--primary {
4883
+ background-color: var(--color-action-default);
4884
+ color: var(--color-text-default-inverse);
4822
4885
  }
4823
4886
 
4824
- /* ─── Vertical stacking ───────────────────────────────── */
4887
+ .muka-swipe-actions__button--success {
4888
+ background-color: var(--color-state-success-default);
4889
+ color: var(--color-text-default-inverse);
4890
+ }
4825
4891
 
4826
- .muka-spec-list--vertical .muka-spec-row {
4827
- flex-direction: column;
4828
- gap: var(--spacing-1);
4892
+ .muka-swipe-actions__button--warning {
4893
+ background-color: var(--color-state-warning-default);
4894
+ color: var(--color-text-default-default);
4829
4895
  }
4830
4896
 
4831
- .muka-spec-list--vertical .muka-spec-row__label {
4832
- width: 100%;
4833
- white-space: normal;
4897
+ .muka-swipe-actions__button--destructive {
4898
+ background-color: var(--color-state-error-default);
4899
+ color: var(--color-text-default-inverse);
4834
4900
  }
4835
4901
 
4836
4902
 
@@ -7465,6 +7531,77 @@ body {
7465
7531
  }
7466
7532
 
7467
7533
 
7534
+ /* ProfileBadge */
7535
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7536
+
7537
+ .muka-profile-badge {
7538
+ display: inline-flex;
7539
+ align-items: center;
7540
+ font-family: var(--text-body-base-regular-fontFamily);
7541
+ }
7542
+
7543
+ /* Size variants */
7544
+ .muka-profile-badge--lg {
7545
+ gap: var(--spacing-4); /* 16px */
7546
+ }
7547
+
7548
+ .muka-profile-badge--md {
7549
+ gap: var(--spacing-3); /* 12px */
7550
+ }
7551
+
7552
+ .muka-profile-badge__avatar {
7553
+ flex-shrink: 0;
7554
+ }
7555
+
7556
+ /* Text stack */
7557
+ .muka-profile-badge__text {
7558
+ display: flex;
7559
+ flex-direction: column;
7560
+ align-items: flex-start;
7561
+ min-width: 0;
7562
+ }
7563
+
7564
+ .muka-profile-badge__name {
7565
+ font-family: var(--text-body-base-regular-fontFamily);
7566
+ font-size: var(--text-body-base-regular-fontSize);
7567
+ font-weight: var(--text-body-base-regular-fontWeight);
7568
+ line-height: var(--text-body-base-regular-lineHeight);
7569
+ color: var(--color-text-default-default);
7570
+ }
7571
+
7572
+ .muka-profile-badge__email {
7573
+ font-family: var(--text-body-xs-regular-fontFamily);
7574
+ font-size: var(--text-body-xs-regular-fontSize);
7575
+ font-weight: var(--text-body-xs-regular-fontWeight);
7576
+ line-height: var(--text-body-xs-regular-lineHeight);
7577
+ color: var(--color-text-subtle-default);
7578
+ }
7579
+
7580
+ /* Clickable state */
7581
+ .muka-profile-badge--clickable {
7582
+ cursor: pointer;
7583
+ border: none;
7584
+ background: none;
7585
+ padding: 0;
7586
+ text-align: left;
7587
+ border-radius: var(--radius-md);
7588
+ transition: opacity 0.2s ease;
7589
+ }
7590
+
7591
+ .muka-profile-badge--clickable:hover {
7592
+ opacity: 0.9;
7593
+ }
7594
+
7595
+ .muka-profile-badge--clickable:active {
7596
+ opacity: 0.8;
7597
+ }
7598
+
7599
+ .muka-profile-badge--clickable:focus-visible {
7600
+ outline: 2px solid var(--color-border-focus);
7601
+ outline-offset: 2px;
7602
+ }
7603
+
7604
+
7468
7605
  /* PriceTag */
7469
7606
  /* PriceTag Component Styles - Using Muka Design Tokens */
7470
7607
 
@@ -7562,77 +7699,6 @@ body {
7562
7699
  }
7563
7700
 
7564
7701
 
7565
- /* ProfileBadge */
7566
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7567
-
7568
- .muka-profile-badge {
7569
- display: inline-flex;
7570
- align-items: center;
7571
- font-family: var(--text-body-base-regular-fontFamily);
7572
- }
7573
-
7574
- /* Size variants */
7575
- .muka-profile-badge--lg {
7576
- gap: var(--spacing-4); /* 16px */
7577
- }
7578
-
7579
- .muka-profile-badge--md {
7580
- gap: var(--spacing-3); /* 12px */
7581
- }
7582
-
7583
- .muka-profile-badge__avatar {
7584
- flex-shrink: 0;
7585
- }
7586
-
7587
- /* Text stack */
7588
- .muka-profile-badge__text {
7589
- display: flex;
7590
- flex-direction: column;
7591
- align-items: flex-start;
7592
- min-width: 0;
7593
- }
7594
-
7595
- .muka-profile-badge__name {
7596
- font-family: var(--text-body-base-regular-fontFamily);
7597
- font-size: var(--text-body-base-regular-fontSize);
7598
- font-weight: var(--text-body-base-regular-fontWeight);
7599
- line-height: var(--text-body-base-regular-lineHeight);
7600
- color: var(--color-text-default-default);
7601
- }
7602
-
7603
- .muka-profile-badge__email {
7604
- font-family: var(--text-body-xs-regular-fontFamily);
7605
- font-size: var(--text-body-xs-regular-fontSize);
7606
- font-weight: var(--text-body-xs-regular-fontWeight);
7607
- line-height: var(--text-body-xs-regular-lineHeight);
7608
- color: var(--color-text-subtle-default);
7609
- }
7610
-
7611
- /* Clickable state */
7612
- .muka-profile-badge--clickable {
7613
- cursor: pointer;
7614
- border: none;
7615
- background: none;
7616
- padding: 0;
7617
- text-align: left;
7618
- border-radius: var(--radius-md);
7619
- transition: opacity 0.2s ease;
7620
- }
7621
-
7622
- .muka-profile-badge--clickable:hover {
7623
- opacity: 0.9;
7624
- }
7625
-
7626
- .muka-profile-badge--clickable:active {
7627
- opacity: 0.8;
7628
- }
7629
-
7630
- .muka-profile-badge--clickable:focus-visible {
7631
- outline: 2px solid var(--color-border-focus);
7632
- outline-offset: 2px;
7633
- }
7634
-
7635
-
7636
7702
  /* Popover */
7637
7703
  /* Popover Component Styles */
7638
7704
 
@@ -8038,18 +8104,46 @@ body {
8038
8104
  white-space: nowrap;
8039
8105
  }
8040
8106
 
8041
- /* Hide the native number spinners — affixes/step API replace them. */
8042
- .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8043
- .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8044
- -webkit-appearance: none;
8045
- margin: 0;
8107
+ /* Hide the native number spinners — affixes/step API replace them. */
8108
+ .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8109
+ .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8110
+ -webkit-appearance: none;
8111
+ margin: 0;
8112
+ }
8113
+
8114
+ .muka-numberinput__field .muka-input__native {
8115
+ -moz-appearance: textfield;
8116
+ appearance: textfield;
8117
+ }
8118
+
8119
+
8120
+ /* NavigationTransition */
8121
+ /* NavigationTransition Component Styles */
8122
+
8123
+ /* ─── Wrapper ────────────────────────────────────────── */
8124
+
8125
+ .muka-nav-transition {
8126
+ position: relative;
8127
+ height: 100vh;
8128
+ overflow: hidden;
8129
+ }
8130
+
8131
+ /* Disable interaction during animation */
8132
+ .muka-nav-transition--active {
8133
+ pointer-events: none;
8046
8134
  }
8047
8135
 
8048
- .muka-numberinput__field .muka-input__native {
8049
- -moz-appearance: textfield;
8050
- appearance: textfield;
8136
+ /* ─── View slots ─────────────────────────────────────── */
8137
+
8138
+ .muka-nav-transition--active .muka-nav-transition__view {
8139
+ position: absolute;
8140
+ inset: 0;
8051
8141
  }
8052
8142
 
8143
+ /* Z-index layering */
8144
+ .muka-nav-transition__view--bottom { z-index: 1; }
8145
+ .muka-nav-transition__view--top { z-index: 2; }
8146
+
8053
8147
 
8054
8148
  /* Menu */
8055
8149
  /* Menu Component Styles */
@@ -8530,34 +8624,6 @@ body {
8530
8624
  }
8531
8625
 
8532
8626
 
8533
- /* NavigationTransition */
8534
- /* NavigationTransition Component Styles */
8535
-
8536
- /* ─── Wrapper ────────────────────────────────────────── */
8537
-
8538
- .muka-nav-transition {
8539
- position: relative;
8540
- height: 100vh;
8541
- overflow: hidden;
8542
- }
8543
-
8544
- /* Disable interaction during animation */
8545
- .muka-nav-transition--active {
8546
- pointer-events: none;
8547
- }
8548
-
8549
- /* ─── View slots ─────────────────────────────────────── */
8550
-
8551
- .muka-nav-transition--active .muka-nav-transition__view {
8552
- position: absolute;
8553
- inset: 0;
8554
- }
8555
-
8556
- /* Z-index layering */
8557
- .muka-nav-transition__view--bottom { z-index: 1; }
8558
- .muka-nav-transition__view--top { z-index: 2; }
8559
-
8560
-
8561
8627
  /* ListItem */
8562
8628
  /* ListItem Component Styles - Using Muka Design Tokens */
8563
8629
 
@@ -8986,6 +9052,184 @@ li.muka-listitem {
8986
9052
  }
8987
9053
 
8988
9054
 
9055
+ /* InputCounter */
9056
+ /* InputCounter — numeric field + joined decrement/increment buttons.
9057
+ Label, helper and error text reuse Input.css (../Input/Input.css).
9058
+ Field and button group share one radius per size:
9059
+ sm/md → input.field.radius.md, lg → input.field.radius.lg. */
9060
+
9061
+ .muka-inputcounter {
9062
+ --muka-inputcounter-radius: var(--input-field-radius-md);
9063
+ --muka-inputcounter-height: var(--input-field-height-default);
9064
+ --muka-inputcounter-pad: calc(var(--spacing-2) + var(--spacing-1));
9065
+ --muka-inputcounter-min: var(--size-3xl);
9066
+
9067
+ display: inline-flex;
9068
+ flex-direction: column;
9069
+ gap: var(--spacing-2);
9070
+ }
9071
+
9072
+ .muka-inputcounter--sm {
9073
+ --muka-inputcounter-height: var(--input-field-height-sm);
9074
+ --muka-inputcounter-pad: calc(var(--spacing-1) + var(--spacing-1));
9075
+ --muka-inputcounter-min: var(--size-2xl);
9076
+ }
9077
+
9078
+ .muka-inputcounter--lg {
9079
+ --muka-inputcounter-radius: var(--input-field-radius-lg);
9080
+ --muka-inputcounter-height: var(--input-field-height-lg);
9081
+ }
9082
+
9083
+ /* Label row — label, info tooltip trigger, optional hint */
9084
+ .muka-inputcounter__label-row {
9085
+ display: flex;
9086
+ align-items: center;
9087
+ gap: var(--spacing-2);
9088
+ min-height: var(--size-xl);
9089
+ }
9090
+
9091
+ .muka-inputcounter__info {
9092
+ display: inline-flex;
9093
+ align-items: center;
9094
+ justify-content: center;
9095
+ padding: 0;
9096
+ border: none;
9097
+ border-radius: 50%;
9098
+ background: transparent;
9099
+ cursor: pointer;
9100
+ }
9101
+
9102
+ .muka-inputcounter__info .muka-icon {
9103
+ color: var(--color-action-default);
9104
+ }
9105
+
9106
+ .muka-inputcounter__info:focus-visible {
9107
+ outline: 2px solid var(--color-border-focus);
9108
+ outline-offset: 2px;
9109
+ }
9110
+
9111
+ .muka-inputcounter__optional {
9112
+ font-family: var(--text-label-sm-regular-fontFamily);
9113
+ font-weight: var(--text-label-sm-regular-fontWeight);
9114
+ font-size: var(--text-label-sm-regular-fontSize);
9115
+ line-height: var(--text-label-sm-regular-lineHeight);
9116
+ color: var(--color-text-subtle-default);
9117
+ }
9118
+
9119
+ /* Field + button group */
9120
+ .muka-inputcounter__row {
9121
+ display: flex;
9122
+ align-items: center;
9123
+ gap: var(--spacing-3);
9124
+ }
9125
+
9126
+ /* Field — grows with the value (in ch), never narrower than the Figma width.
9127
+ Padding sits on the native input so the 2px focus/error border doesn't
9128
+ need compensating: content is centred in a fixed box. */
9129
+ .muka-inputcounter__field {
9130
+ position: relative;
9131
+ display: flex;
9132
+ align-items: center;
9133
+ box-sizing: border-box;
9134
+ height: var(--muka-inputcounter-height);
9135
+ width: calc(
9136
+ max(var(--muka-inputcounter-min), calc(var(--muka-inputcounter-chars, 1) * 1ch)) +
9137
+ 2 * var(--muka-inputcounter-pad) + 2 * var(--border-width-regular)
9138
+ );
9139
+ background-color: var(--input-field-color-default-background);
9140
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
9141
+ border-radius: var(--muka-inputcounter-radius);
9142
+ transition: border-color 0.2s ease, background-color 0.2s ease;
9143
+ }
9144
+
9145
+ .muka-inputcounter__field::after {
9146
+ content: '';
9147
+ position: absolute;
9148
+ inset: 0;
9149
+ border-radius: inherit;
9150
+ box-shadow: var(--shadow-sunken);
9151
+ pointer-events: none;
9152
+ }
9153
+
9154
+ .muka-inputcounter__field--focused:not(.muka-inputcounter__field--disabled) {
9155
+ border-width: var(--border-width-bold);
9156
+ border-color: var(--input-field-color-focus-border);
9157
+ background-color: var(--input-field-color-focus-background);
9158
+ }
9159
+
9160
+ .muka-inputcounter__field--error:not(.muka-inputcounter__field--disabled) {
9161
+ border-width: var(--border-width-bold);
9162
+ border-color: var(--input-field-color-error-border);
9163
+ background-color: var(--input-field-color-error-background);
9164
+ }
9165
+
9166
+ .muka-inputcounter__field--disabled {
9167
+ background-color: var(--input-field-color-disabled-background);
9168
+ border-color: var(--input-field-color-disabled-border);
9169
+ }
9170
+
9171
+ .muka-inputcounter__field--disabled::after {
9172
+ display: none;
9173
+ }
9174
+
9175
+ .muka-inputcounter__native {
9176
+ width: 100%;
9177
+ min-width: 0;
9178
+ height: 100%;
9179
+ box-sizing: border-box;
9180
+ padding: 0 calc(var(--muka-inputcounter-pad) - var(--border-width-regular));
9181
+ border: none;
9182
+ outline: none;
9183
+ background: transparent;
9184
+ text-align: center;
9185
+ font-variant-numeric: tabular-nums;
9186
+ color: var(--input-field-color-default-foreground);
9187
+ font-family: var(--text-input-md-fontFamily);
9188
+ font-weight: var(--text-input-md-fontWeight);
9189
+ font-size: var(--text-input-md-fontSize);
9190
+ line-height: var(--text-input-md-lineHeight);
9191
+ }
9192
+
9193
+ .muka-inputcounter--sm .muka-inputcounter__native {
9194
+ font-family: var(--text-input-sm-fontFamily);
9195
+ font-weight: var(--text-input-sm-fontWeight);
9196
+ font-size: var(--text-input-sm-fontSize);
9197
+ line-height: var(--text-input-sm-lineHeight);
9198
+ }
9199
+
9200
+ .muka-inputcounter__field--disabled .muka-inputcounter__native {
9201
+ color: var(--input-field-color-disabled-foreground);
9202
+ cursor: not-allowed;
9203
+ }
9204
+
9205
+ /* Button group — secondary icon-only Buttons joined by a divider.
9206
+ Only the outer corners are rounded. */
9207
+ .muka-inputcounter__group {
9208
+ display: inline-flex;
9209
+ align-items: stretch;
9210
+ }
9211
+
9212
+ .muka-inputcounter__group .muka-button {
9213
+ border-radius: 0;
9214
+ }
9215
+
9216
+ .muka-inputcounter__group .muka-button:first-child {
9217
+ border-start-start-radius: var(--muka-inputcounter-radius);
9218
+ border-end-start-radius: var(--muka-inputcounter-radius);
9219
+ }
9220
+
9221
+ .muka-inputcounter__group .muka-button:last-child {
9222
+ border-start-end-radius: var(--muka-inputcounter-radius);
9223
+ border-end-end-radius: var(--muka-inputcounter-radius);
9224
+ }
9225
+
9226
+ .muka-inputcounter__divider {
9227
+ flex: none;
9228
+ width: var(--border-width-regular);
9229
+ background-color: var(--color-border-default);
9230
+ }
9231
+
9232
+
8989
9233
  /* Input */
8990
9234
  /* Input Component Styles - Using Muka Design Tokens */
8991
9235
 
@@ -13424,6 +13668,39 @@ button.muka-chat-photo-grid__tile:focus-visible {
13424
13668
  opacity: 1; /* Remove opacity since we have proper disabled tokens */
13425
13669
  }
13426
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
+
13427
13704
  /* Secondary variant - supporting actions, no border, only bottom inner shadow */
13428
13705
  .muka-button--secondary {
13429
13706
  background-color: var(--button-color-secondary-background-default);
@@ -14357,12 +14634,29 @@ button.muka-chat-photo-grid__tile:focus-visible {
14357
14634
  vertical-align: middle;
14358
14635
  background-color: var(--avatar-color-background-default);
14359
14636
  color: var(--avatar-color-foreground-default);
14360
- border: var(--avatar-border-width) solid var(--avatar-color-border-default);
14361
14637
  font-family: var(--alias-font-brand-family);
14362
14638
  font-weight: var(--alias-font-brand-weight-semibold);
14363
14639
  }
14364
14640
 
14365
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
+
14366
14660
  .muka-avatar--xs {
14367
14661
  width: var(--avatar-size-xs);
14368
14662
  height: var(--avatar-size-xs);
@@ -14402,6 +14696,20 @@ button.muka-chat-photo-grid__tile:focus-visible {
14402
14696
  border-radius: var(--avatar-radius-square);
14403
14697
  }
14404
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
+
14405
14713
  /* Clickable state */
14406
14714
  .muka-avatar--clickable {
14407
14715
  cursor: pointer;
@@ -14505,6 +14813,16 @@ button.muka-chat-photo-grid__tile:focus-visible {
14505
14813
  box-sizing: border-box;
14506
14814
  }
14507
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
+
14508
14826
  .muka-avatar--xs .muka-avatar__status {
14509
14827
  width: var(--avatar-status-size-xs);
14510
14828
  height: var(--avatar-status-size-xs);
@@ -14558,56 +14876,130 @@ button.muka-chat-photo-grid__tile:focus-visible {
14558
14876
  background-color: var(--avatar-color-status-away);
14559
14877
  }
14560
14878
 
14561
- /* Avatar Group */
14879
+ /* Avatar Group (Figma "Avatar Stack") */
14562
14880
  .muka-avatar-group {
14563
14881
  display: inline-flex;
14564
14882
  align-items: center;
14565
14883
  flex-direction: row;
14566
14884
  }
14567
14885
 
14886
+ /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
14568
14887
  .muka-avatar-group__item {
14569
14888
  position: relative;
14570
14889
  display: inline-flex;
14571
- border: 2px solid var(--color-surface-level1);
14572
- border-radius: inherit;
14890
+ z-index: 0;
14573
14891
  }
14574
14892
 
14575
- /* Add border radius to match avatar shape */
14576
- .muka-avatar-group__item .muka-avatar--circle {
14577
- border-radius: var(--avatar-radius-circle);
14893
+ .muka-avatar-group__item:hover {
14894
+ z-index: 10;
14578
14895
  }
14579
14896
 
14580
- .muka-avatar-group__item .muka-avatar--square {
14581
- border-radius: var(--avatar-radius-square);
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));
14582
14930
  }
14583
14931
 
14584
- .muka-avatar-group__item .muka-avatar {
14932
+ /* Overflow avatar styling */
14933
+ .muka-avatar--overflow {
14934
+ background-color: var(--avatar-color-background-default);
14935
+ color: var(--avatar-color-foreground-default);
14936
+ font-weight: var(--alias-font-brand-weight-semibold);
14937
+ }
14938
+
14939
+
14940
+ /* Autocomplete */
14941
+ /* Autocomplete — Figma Input Autocomplete (Input field + single-line suggestion Menu).
14942
+ The field reuses the Input styles (.muka-input*); only the menu wiring lives here. */
14943
+
14944
+ .muka-autocomplete {
14945
+ min-width: 200px;
14946
+ }
14947
+
14948
+ /* Covers the field's outer edge so the menu matches its full width. The menu
14949
+ is only open while focused, when the field has the bold border. */
14950
+ .muka-autocomplete__menu-anchor {
14951
+ position: absolute;
14952
+ inset: calc(-1 * var(--border-width-bold));
14953
+ z-index: 0;
14954
+ margin: 0;
14955
+ padding: 0;
14585
14956
  border: none;
14957
+ background: transparent;
14958
+ pointer-events: none;
14959
+ opacity: 0;
14586
14960
  }
14587
14961
 
14588
- /* Spacing variants for avatar group */
14589
- .muka-avatar-group--tight .muka-avatar-group__item:not(:first-child) {
14590
- margin-left: calc(var(--avatar-group-spacing-tight));
14962
+ /* Keep the field content above the invisible anchor. */
14963
+ .muka-autocomplete__field > :not(.muka-autocomplete__menu-anchor) {
14964
+ position: relative;
14965
+ z-index: 1;
14591
14966
  }
14592
14967
 
14593
- .muka-avatar-group--normal .muka-avatar-group__item:not(:first-child) {
14594
- margin-left: calc(var(--avatar-group-spacing-normal));
14968
+ /* Figma: the menu is as wide as the field (never below the menu min-width token). */
14969
+ .muka-autocomplete__menu {
14970
+ width: var(--radix-dropdown-menu-trigger-width);
14971
+ max-width: calc(100vw - 2rem);
14595
14972
  }
14596
14973
 
14597
- /* Z-index stacking for overlap effect */
14598
- .muka-avatar-group__item {
14599
- z-index: 0;
14974
+ /* Suggestions are single-line; long labels truncate. */
14975
+ .muka-autocomplete__menu .muka-menu__item-label {
14976
+ overflow: hidden;
14977
+ text-overflow: ellipsis;
14600
14978
  }
14601
14979
 
14602
- .muka-avatar-group__item:hover {
14603
- z-index: 10;
14980
+ /* Loading and empty rows: menu-row geometry, not selectable. */
14981
+ .muka-autocomplete__status {
14982
+ display: flex;
14983
+ align-items: center;
14984
+ gap: var(--menu-item-gap);
14985
+ min-height: var(--menu-item-height);
14986
+ padding: var(--menu-item-padding-y) var(--menu-item-padding-x);
14987
+ color: var(--color-text-subtle-default);
14988
+ font-family: var(--text-label-md-regular-fontFamily);
14989
+ font-size: var(--text-label-md-regular-fontSize);
14990
+ font-weight: var(--text-label-md-regular-fontWeight);
14991
+ line-height: var(--text-label-md-regular-lineHeight);
14604
14992
  }
14605
14993
 
14606
- /* Overflow avatar styling */
14607
- .muka-avatar--overflow {
14608
- background-color: var(--avatar-color-background-default);
14609
- color: var(--avatar-color-foreground-default);
14610
- font-weight: var(--alias-font-brand-weight-semibold);
14994
+ .muka-autocomplete__footer {
14995
+ flex-shrink: 0;
14996
+ padding: var(--spacing-2) var(--spacing-3);
14997
+ border-top: var(--border-width-regular) solid var(--color-border-default);
14998
+ color: var(--color-text-subtle-default);
14999
+ font-family: var(--text-label-sm-regular-fontFamily);
15000
+ font-size: var(--text-label-sm-regular-fontSize);
15001
+ font-weight: var(--text-label-sm-regular-fontWeight);
15002
+ line-height: var(--text-label-sm-regular-lineHeight);
14611
15003
  }
14612
15004
 
14613
15005