@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
@@ -410,6 +410,8 @@ body {
410
410
  --color-red-10: #dc3d43;
411
411
  --color-red-11: #cd2b31;
412
412
  --color-red-12: #381316;
413
+ --color-redStrong-1: #bd1524;
414
+ --color-redStrong-2: #ab001a;
413
415
  --color-ruby-1: #fffcfd;
414
416
  --color-ruby-2: #fff7f8;
415
417
  --color-ruby-3: #ffeef1;
@@ -1208,6 +1210,9 @@ body {
1208
1210
  --color-state-error-default: #e5484d;
1209
1211
  --color-state-error-contrast: #cd2b31;
1210
1212
  --color-state-error-background: #ffefef;
1213
+ --color-state-error-solid-default: #cd2b31;
1214
+ --color-state-error-solid-hover: #bd1524;
1215
+ --color-state-error-solid-pressed: #ab001a;
1211
1216
  --color-state-info-default: #3e63dd;
1212
1217
  --color-state-info-contrast: #3a5ccc;
1213
1218
  --color-state-info-background: #edf2fe;
@@ -1308,6 +1313,9 @@ body {
1308
1313
  --alias-color-state-error-contrast: #cd2b31;
1309
1314
  --alias-color-state-error-default: #e5484d;
1310
1315
  --alias-color-state-error-muted: #ffefef;
1316
+ --alias-color-state-error-solid-default: #cd2b31;
1317
+ --alias-color-state-error-solid-hover: #bd1524;
1318
+ --alias-color-state-error-solid-pressed: #ab001a;
1311
1319
  --alias-color-state-error-surface-level0: #fff8f8;
1312
1320
  --alias-color-state-error-surface-level1: #ffefef;
1313
1321
  --alias-color-state-error-surface-level2: #ffe5e5;
@@ -1604,6 +1612,18 @@ body {
1604
1612
  --button-color-primary-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1605
1613
  --button-color-primary-shadow-pressed: none;
1606
1614
  --button-color-primary-shadow-disabled: none;
1615
+ --button-color-destructive-background-default: #cd2b31;
1616
+ --button-color-destructive-background-hover: #bd1524;
1617
+ --button-color-destructive-background-pressed: #ab001a;
1618
+ --button-color-destructive-background-disabled: #eae7ec;
1619
+ --button-color-destructive-foreground-default: #fdfcfd;
1620
+ --button-color-destructive-foreground-hover: #fdfcfd;
1621
+ --button-color-destructive-foreground-pressed: #fdfcfd;
1622
+ --button-color-destructive-foreground-disabled: #d0cdd7;
1623
+ --button-color-destructive-shadow-default: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1624
+ --button-color-destructive-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1625
+ --button-color-destructive-shadow-pressed: none;
1626
+ --button-color-destructive-shadow-disabled: none;
1607
1627
  --button-color-secondary-background-default: #f2eff3;
1608
1628
  --button-color-secondary-background-hover: #f2eff3;
1609
1629
  --button-color-secondary-background-pressed: #eae7ec;
@@ -1968,7 +1988,7 @@ body {
1968
1988
  --contextmenu-trigger-outline-color: #3e63dd;
1969
1989
  --contextmenu-trigger-outline-offset: 0.25rem;
1970
1990
  --tabs-trigger-color-default-background: #f2eff3;
1971
- --tabs-trigger-color-default-foreground: #211f26;
1991
+ --tabs-trigger-color-default-foreground: #8e8c99;
1972
1992
  --tabs-trigger-color-default-border: #d0cdd7;
1973
1993
  --tabs-trigger-color-hover-background: #f2eff3;
1974
1994
  --tabs-trigger-color-hover-foreground: #211f26;
@@ -1983,8 +2003,16 @@ body {
1983
2003
  --tabs-trigger-padding-y: 0.5rem;
1984
2004
  --tabs-trigger-height: 3rem;
1985
2005
  --tabs-trigger-radius: 0.75rem;
2006
+ --tabs-trigger-min-height-sm: 2.5rem;
2007
+ --tabs-trigger-min-height-md: 3.5rem;
2008
+ --tabs-trigger-min-height-lg: 5rem;
1986
2009
  --tabs-panel-background: #fdfcfd;
1987
2010
  --tabs-panel-border: #d0cdd7;
2011
+ --tabs-indicator-color: #3e63dd;
2012
+ --tabs-indicator-height-sm: 2px;
2013
+ --tabs-indicator-height-md: 3px;
2014
+ --tabs-indicator-height-lg: 4px;
2015
+ --tabs-list-padding-x: 1rem;
1988
2016
  --separator-color-default: #eae7ec;
1989
2017
  --separator-color-contrast: #d0cdd7;
1990
2018
  --separator-width: 0.0625rem;
@@ -2017,6 +2045,9 @@ body {
2017
2045
  --progress-size-circle-strokeWidth-sm: 0.25rem;
2018
2046
  --progress-size-circle-strokeWidth-md: 0.5rem;
2019
2047
  --progress-size-circle-strokeWidth-lg: 0.75rem;
2048
+ --avatar-size-4xs: 1rem;
2049
+ --avatar-size-3xs: 1.5rem;
2050
+ --avatar-size-2xs: 2rem;
2020
2051
  --avatar-size-xs: 2.5rem;
2021
2052
  --avatar-size-sm: 3rem;
2022
2053
  --avatar-size-md: 4rem;
@@ -2026,26 +2057,38 @@ body {
2026
2057
  --avatar-color-background-loading: #eae7ec;
2027
2058
  --avatar-color-foreground-default: #211f26;
2028
2059
  --avatar-color-foreground-muted: #d0cdd7;
2029
- --avatar-color-border-default: #eae7ec;
2030
2060
  --avatar-color-status-online: #027864;
2031
2061
  --avatar-color-status-offline: #d0cdd7;
2032
2062
  --avatar-color-status-busy: #e5484d;
2033
2063
  --avatar-color-status-away: #ffc53d;
2034
2064
  --avatar-radius-circle: 999rem;
2035
2065
  --avatar-radius-square: 0.75rem;
2066
+ --avatar-radius-square-sm: 0.375rem;
2067
+ --avatar-font-size-3xs: 0.75rem;
2068
+ --avatar-font-size-2xs: 0.75rem;
2036
2069
  --avatar-font-size-xs: 0.75rem;
2037
2070
  --avatar-font-size-sm: 0.875rem;
2038
2071
  --avatar-font-size-md: 1.125rem;
2039
2072
  --avatar-font-size-lg: 1.25rem;
2040
2073
  --avatar-font-size-xl: 1.5rem;
2074
+ --avatar-status-size-3xs: 0.5rem;
2075
+ --avatar-status-size-2xs: 0.5rem;
2041
2076
  --avatar-status-size-xs: 0.5rem;
2042
2077
  --avatar-status-size-sm: 0.75rem;
2043
2078
  --avatar-status-size-md: 1rem;
2044
2079
  --avatar-status-size-lg: 1.25rem;
2045
2080
  --avatar-status-size-xl: 1.5rem;
2046
- --avatar-border-width: 1px;
2047
- --avatar-group-spacing-tight: -0.5rem;
2048
- --avatar-group-spacing-normal: -0.25rem;
2081
+ --avatar-group-ring-width: 0.125rem;
2082
+ --avatar-group-ring-color: #fdfcfd;
2083
+ --avatar-group-overlap-tight-sm: 2rem;
2084
+ --avatar-group-overlap-tight-2xs: 1.25rem;
2085
+ --avatar-group-overlap-tight-3xs: 1rem;
2086
+ --avatar-group-overlap-compact-sm: 1.5rem;
2087
+ --avatar-group-overlap-compact-2xs: 1rem;
2088
+ --avatar-group-overlap-compact-3xs: 0.75rem;
2089
+ --avatar-group-overlap-spacious-sm: 1rem;
2090
+ --avatar-group-overlap-spacious-2xs: 0.75rem;
2091
+ --avatar-group-overlap-spacious-3xs: 0.5rem;
2049
2092
  --toast-color-info-background: #211f26;
2050
2093
  --toast-color-info-foreground: #fdfcfd;
2051
2094
  --toast-color-info-accent: #edf2fe;
@@ -2451,116 +2494,6 @@ body {
2451
2494
  }
2452
2495
 
2453
2496
 
2454
- /* View */
2455
- /* View Component Styles */
2456
-
2457
- /* ─── Base layout ─────────────────────────────────────── */
2458
-
2459
- .muka-view {
2460
- display: flex;
2461
- flex-direction: column;
2462
- height: 100dvh;
2463
- background-color: var(--view-color-background);
2464
- position: relative;
2465
- isolation: isolate;
2466
- box-sizing: border-box;
2467
-
2468
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2469
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2470
- --view-sidebar-width: 240px;
2471
- }
2472
-
2473
- /* ─── Surface level variants ─────────────────────────── */
2474
-
2475
- .muka-view--surface-3 {
2476
- background-color: var(--color-surface-level3);
2477
- }
2478
-
2479
- /* ─── Large screens: make room for the left sidebar ──────────
2480
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2481
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2482
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2483
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2484
- for a sidebar that hasn't rendered yet. */
2485
- @media (min-width: 1024px) {
2486
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2487
- padding-left: var(--view-sidebar-width);
2488
- }
2489
- }
2490
-
2491
- /* ─── TopBar elevation ────────────────────────────────── */
2492
-
2493
- .muka-view .muka-topbar {
2494
- flex-shrink: 0;
2495
- z-index: 3;
2496
- box-shadow: var(--shadow-level2);
2497
- }
2498
-
2499
- /* ─── Scrollable body ─────────────────────────────────── */
2500
-
2501
- .muka-view__body {
2502
- flex: 1 1 0%;
2503
- min-height: 0;
2504
- overflow-y: auto;
2505
- overflow-x: clip;
2506
- z-index: 1;
2507
-
2508
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2509
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2510
- reveal the content underneath. */
2511
- display: flex;
2512
- flex-direction: column;
2513
- }
2514
-
2515
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2516
- using the alias-layer section/container tokens, while the body scrolls full
2517
- width. Full-bleed below large. */
2518
- .muka-view__body-inner {
2519
- width: 100%;
2520
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2521
- than floating mid-screen. */
2522
- flex: 1 0 auto;
2523
- }
2524
-
2525
- @media (min-width: 1024px) {
2526
- .muka-view:not([data-size]) .muka-view__body-inner {
2527
- max-width: var(--container-max-width-xl);
2528
- margin-inline: auto;
2529
- padding-inline: var(--section-padding-horizontal-default);
2530
- }
2531
- }
2532
-
2533
- .muka-view[data-size='lg'] .muka-view__body-inner {
2534
- max-width: var(--container-max-width-xl);
2535
- margin-inline: auto;
2536
- padding-inline: var(--section-padding-horizontal-default);
2537
- }
2538
-
2539
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2540
-
2541
- .muka-view__footer {
2542
- position: sticky;
2543
- bottom: 0;
2544
- flex-shrink: 0;
2545
- z-index: 2;
2546
- }
2547
-
2548
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2549
- navigation at the large tier, so hide a footer that holds a navigation bar.
2550
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2551
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2552
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2553
- @media (min-width: 1024px) {
2554
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2555
- display: none;
2556
- }
2557
- }
2558
-
2559
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2560
- display: none;
2561
- }
2562
-
2563
-
2564
2497
  /* Typography */
2565
2498
  .muka-typography-catalog {
2566
2499
  display: flex;
@@ -2911,166 +2844,113 @@ body {
2911
2844
  }
2912
2845
 
2913
2846
 
2914
- /* Toggle */
2915
- /* Toggle Component Styles - Using Muka Design Tokens */
2847
+ /* View */
2848
+ /* View Component Styles */
2916
2849
 
2917
- /* Wrapper container */
2918
- .muka-toggle {
2850
+ /* ─── Base layout ─────────────────────────────────────── */
2851
+
2852
+ .muka-view {
2919
2853
  display: flex;
2920
- align-items: center;
2921
- gap: var(--spacing-2);
2854
+ flex-direction: column;
2855
+ height: 100dvh;
2856
+ background-color: var(--view-color-background);
2922
2857
  position: relative;
2923
- padding: var(--spacing-4) 0;
2858
+ isolation: isolate;
2859
+ box-sizing: border-box;
2860
+
2861
+ /* Width reserved for the footer nav once it becomes a left sidebar at the
2862
+ large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2863
+ --view-sidebar-width: 240px;
2924
2864
  }
2925
2865
 
2926
- .muka-toggle--with-caption {
2927
- padding: var(--spacing-5) 0;
2866
+ /* ─── Surface level variants ─────────────────────────── */
2867
+
2868
+ .muka-view--surface-3 {
2869
+ background-color: var(--color-surface-level3);
2928
2870
  }
2929
2871
 
2930
- .muka-toggle--disabled {
2931
- opacity: 0.6;
2872
+ /* ─── Large screens: make room for the left sidebar ──────────
2873
+ A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2874
+ ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2875
+ actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2876
+ the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2877
+ for a sidebar that hasn't rendered yet. */
2878
+ @media (min-width: 1024px) {
2879
+ .muka-view:has(.muka-bottombar--desktop-sidebar) {
2880
+ padding-left: var(--view-sidebar-width);
2881
+ }
2932
2882
  }
2933
2883
 
2934
- /* Icon */
2935
- .muka-toggle__icon {
2936
- display: flex;
2937
- align-items: center;
2938
- justify-content: center;
2884
+ /* ─── TopBar elevation ────────────────────────────────── */
2885
+
2886
+ .muka-view .muka-topbar {
2939
2887
  flex-shrink: 0;
2940
- width: var(--icon-size-default);
2941
- height: var(--icon-size-default);
2942
- color: var(--color-text-default-default);
2888
+ z-index: 3;
2889
+ box-shadow: var(--shadow-level2);
2943
2890
  }
2944
2891
 
2945
- .muka-toggle__icon svg {
2946
- width: 100%;
2947
- height: 100%;
2948
- }
2892
+ /* ─── Scrollable body ─────────────────────────────────── */
2949
2893
 
2950
- /* Content area (label + caption) */
2951
- .muka-toggle__content {
2894
+ .muka-view__body {
2895
+ flex: 1 1 0%;
2896
+ min-height: 0;
2897
+ overflow-y: auto;
2898
+ overflow-x: clip;
2899
+ z-index: 1;
2900
+
2901
+ /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2902
+ content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2903
+ reveal the content underneath. */
2952
2904
  display: flex;
2953
2905
  flex-direction: column;
2954
- flex: 1;
2955
- min-width: 0;
2956
- gap: var(--spacing-1);
2957
2906
  }
2958
2907
 
2959
- /* Label */
2960
- .muka-toggle__label {
2961
- font-family: var(--text-label-lg-regular-fontFamily);
2962
- font-weight: var(--text-label-lg-regular-fontWeight);
2963
- font-size: var(--text-label-lg-regular-fontSize);
2964
- line-height: var(--text-label-lg-regular-lineHeight);
2965
- color: var(--color-text-default-default);
2966
- cursor: pointer;
2908
+ /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2909
+ using the alias-layer section/container tokens, while the body scrolls full
2910
+ width. Full-bleed below large. */
2911
+ .muka-view__body-inner {
2912
+ width: 100%;
2913
+ /* Grow on short content so the sticky footer is pushed to the bottom rather
2914
+ than floating mid-screen. */
2915
+ flex: 1 0 auto;
2967
2916
  }
2968
2917
 
2969
- .muka-toggle--with-caption .muka-toggle__label {
2970
- font-family: var(--text-label-lg-semibold-fontFamily);
2971
- font-weight: var(--text-label-lg-semibold-fontWeight);
2972
- font-size: var(--text-label-lg-semibold-fontSize);
2973
- line-height: var(--text-label-lg-semibold-lineHeight);
2918
+ @media (min-width: 1024px) {
2919
+ .muka-view:not([data-size]) .muka-view__body-inner {
2920
+ max-width: var(--container-max-width-xl);
2921
+ margin-inline: auto;
2922
+ padding-inline: var(--section-padding-horizontal-default);
2923
+ }
2974
2924
  }
2975
2925
 
2976
- .muka-toggle--disabled .muka-toggle__label {
2977
- color: var(--color-text-subtle-default);
2978
- cursor: not-allowed;
2926
+ .muka-view[data-size='lg'] .muka-view__body-inner {
2927
+ max-width: var(--container-max-width-xl);
2928
+ margin-inline: auto;
2929
+ padding-inline: var(--section-padding-horizontal-default);
2979
2930
  }
2980
2931
 
2981
- /* Caption */
2982
- .muka-toggle__caption {
2983
- font-family: var(--text-body-base-regular-fontFamily);
2984
- font-weight: var(--text-body-base-regular-fontWeight);
2985
- font-size: var(--text-body-base-regular-fontSize);
2986
- line-height: var(--text-body-base-regular-lineHeight);
2987
- color: var(--color-text-subtle-default);
2988
- }
2932
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2989
2933
 
2990
- /* Switch container */
2991
- .muka-toggle__switch {
2992
- position: relative;
2993
- display: inline-flex;
2934
+ .muka-view__footer {
2935
+ position: sticky;
2936
+ bottom: 0;
2994
2937
  flex-shrink: 0;
2995
- cursor: pointer;
2938
+ z-index: 2;
2996
2939
  }
2997
2940
 
2998
- .muka-toggle--disabled .muka-toggle__switch {
2999
- cursor: not-allowed;
2941
+ /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2942
+ navigation at the large tier, so hide a footer that holds a navigation bar.
2943
+ Scoped to `.muka-app-shell` so bare Views (and the standalone
2944
+ desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2945
+ (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2946
+ @media (min-width: 1024px) {
2947
+ .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2948
+ display: none;
2949
+ }
3000
2950
  }
3001
2951
 
3002
- /* Hidden native input */
3003
- .muka-toggle__input {
3004
- position: absolute;
3005
- width: 1px;
3006
- height: 1px;
3007
- padding: 0;
3008
- margin: -1px;
3009
- overflow: hidden;
3010
- clip: rect(0, 0, 0, 0);
3011
- white-space: nowrap;
3012
- border: 0;
3013
- }
3014
-
3015
- /* Track (background pill) */
3016
- .muka-toggle__track {
3017
- display: flex;
3018
- align-items: center;
3019
- width: var(--toggle-track-width);
3020
- height: var(--toggle-track-height);
3021
- border-radius: var(--toggle-track-radius);
3022
- background-color: var(--toggle-track-color-off);
3023
- transition: background-color 0.2s ease;
3024
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3025
- position: relative;
3026
- }
3027
-
3028
- /* Knob (sliding circle) */
3029
- .muka-toggle__knob {
3030
- position: absolute;
3031
- width: var(--toggle-knob-size);
3032
- height: var(--toggle-knob-size);
3033
- border-radius: var(--border-radius-full);
3034
- background-color: var(--toggle-knob-color-default);
3035
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3036
- left: var(--toggle-knob-offset);
3037
- transition: left 0.2s ease, transform 0.2s ease;
3038
- }
3039
-
3040
- /* Focus state */
3041
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3042
- outline: 2px solid var(--color-border-focus);
3043
- outline-offset: 2px;
3044
- }
3045
-
3046
- /* Checked (on) state */
3047
- .muka-toggle__input:checked + .muka-toggle__track {
3048
- background-color: var(--toggle-track-color-on);
3049
- }
3050
-
3051
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3052
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3053
- }
3054
-
3055
- /* Disabled state */
3056
- .muka-toggle--disabled .muka-toggle__track {
3057
- background-color: var(--toggle-track-color-disabled);
3058
- box-shadow: none;
3059
- }
3060
-
3061
- .muka-toggle--disabled .muka-toggle__knob {
3062
- background-color: var(--toggle-knob-color-disabled);
3063
- box-shadow: none;
3064
- }
3065
-
3066
- /* Divider */
3067
- .muka-toggle__divider {
3068
- position: absolute;
3069
- bottom: 0;
3070
- left: 0;
3071
- right: 0;
3072
- height: 1px;
3073
- background-color: var(--color-border-muted);
2952
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2953
+ display: none;
3074
2954
  }
3075
2955
 
3076
2956
 
@@ -3799,249 +3679,166 @@ body {
3799
3679
  }
3800
3680
 
3801
3681
 
3802
- /* Textarea */
3803
- /* Textarea Component Styles - Using Muka Design Tokens */
3682
+ /* Toggle */
3683
+ /* Toggle Component Styles - Using Muka Design Tokens */
3804
3684
 
3805
- .muka-textarea {
3806
- display: inline-flex;
3807
- flex-direction: column;
3685
+ /* Wrapper container */
3686
+ .muka-toggle {
3687
+ display: flex;
3688
+ align-items: center;
3808
3689
  gap: var(--spacing-2);
3690
+ position: relative;
3691
+ padding: var(--spacing-4) 0;
3809
3692
  }
3810
3693
 
3811
- /* Label */
3812
- .muka-textarea__label {
3694
+ .muka-toggle--with-caption {
3695
+ padding: var(--spacing-5) 0;
3696
+ }
3697
+
3698
+ .muka-toggle--disabled {
3699
+ opacity: 0.6;
3700
+ }
3701
+
3702
+ /* Icon */
3703
+ .muka-toggle__icon {
3704
+ display: flex;
3705
+ align-items: center;
3706
+ justify-content: center;
3707
+ flex-shrink: 0;
3708
+ width: var(--icon-size-default);
3709
+ height: var(--icon-size-default);
3813
3710
  color: var(--color-text-default-default);
3814
- cursor: pointer;
3815
3711
  }
3816
3712
 
3817
- .muka-textarea__label--sm {
3818
- font-family: var(--text-label-sm-semibold-fontFamily);
3819
- font-weight: var(--text-label-sm-semibold-fontWeight);
3820
- font-size: var(--text-label-sm-semibold-fontSize);
3821
- line-height: var(--text-label-sm-semibold-lineHeight);
3713
+ .muka-toggle__icon svg {
3714
+ width: 100%;
3715
+ height: 100%;
3822
3716
  }
3823
3717
 
3824
- .muka-textarea__label--md {
3825
- font-family: var(--text-label-md-semibold-fontFamily);
3826
- font-weight: var(--text-label-md-semibold-fontWeight);
3827
- font-size: var(--text-label-md-semibold-fontSize);
3828
- line-height: var(--text-label-md-semibold-lineHeight);
3718
+ /* Content area (label + caption) */
3719
+ .muka-toggle__content {
3720
+ display: flex;
3721
+ flex-direction: column;
3722
+ flex: 1;
3723
+ min-width: 0;
3724
+ gap: var(--spacing-1);
3829
3725
  }
3830
3726
 
3831
- .muka-textarea__label--lg {
3727
+ /* Label */
3728
+ .muka-toggle__label {
3729
+ font-family: var(--text-label-lg-regular-fontFamily);
3730
+ font-weight: var(--text-label-lg-regular-fontWeight);
3731
+ font-size: var(--text-label-lg-regular-fontSize);
3732
+ line-height: var(--text-label-lg-regular-lineHeight);
3733
+ color: var(--color-text-default-default);
3734
+ cursor: pointer;
3735
+ }
3736
+
3737
+ .muka-toggle--with-caption .muka-toggle__label {
3832
3738
  font-family: var(--text-label-lg-semibold-fontFamily);
3833
3739
  font-weight: var(--text-label-lg-semibold-fontWeight);
3834
3740
  font-size: var(--text-label-lg-semibold-fontSize);
3835
3741
  line-height: var(--text-label-lg-semibold-lineHeight);
3836
3742
  }
3837
3743
 
3838
- .muka-textarea__required {
3839
- color: var(--color-state-error-default);
3744
+ .muka-toggle--disabled .muka-toggle__label {
3745
+ color: var(--color-text-subtle-default);
3746
+ cursor: not-allowed;
3840
3747
  }
3841
3748
 
3842
- /* Field container */
3843
- .muka-textarea__field {
3844
- display: flex;
3845
- background-color: var(--input-field-color-default-background);
3846
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
3847
- border-radius: var(--input-field-radius-md);
3848
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
3849
- transition: border-color 0.2s ease, background-color 0.2s ease;
3850
- box-sizing: border-box;
3749
+ /* Caption */
3750
+ .muka-toggle__caption {
3751
+ font-family: var(--text-body-base-regular-fontFamily);
3752
+ font-weight: var(--text-body-base-regular-fontWeight);
3753
+ font-size: var(--text-body-base-regular-fontSize);
3754
+ line-height: var(--text-body-base-regular-lineHeight);
3755
+ color: var(--color-text-subtle-default);
3851
3756
  }
3852
3757
 
3853
- .muka-textarea__field--sm {
3854
- min-height: var(--input-textarea-height-sm);
3855
- border-radius: var(--input-field-radius-sm);
3758
+ /* Switch container */
3759
+ .muka-toggle__switch {
3760
+ position: relative;
3761
+ display: inline-flex;
3762
+ flex-shrink: 0;
3763
+ cursor: pointer;
3856
3764
  }
3857
3765
 
3858
- .muka-textarea__field--md {
3859
- min-height: var(--input-textarea-height-default);
3860
- border-radius: var(--input-field-radius-md);
3766
+ .muka-toggle--disabled .muka-toggle__switch {
3767
+ cursor: not-allowed;
3861
3768
  }
3862
3769
 
3863
- .muka-textarea__field--lg {
3864
- min-height: var(--input-textarea-height-lg);
3865
- border-radius: var(--input-field-radius-lg);
3770
+ /* Hidden native input */
3771
+ .muka-toggle__input {
3772
+ position: absolute;
3773
+ width: 1px;
3774
+ height: 1px;
3775
+ padding: 0;
3776
+ margin: -1px;
3777
+ overflow: hidden;
3778
+ clip: rect(0, 0, 0, 0);
3779
+ white-space: nowrap;
3780
+ border: 0;
3866
3781
  }
3867
3782
 
3868
- /* Focus state */
3869
- .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
3870
- border-width: var(--border-width-bold);
3871
- border-color: var(--input-field-color-focus-border);
3872
- background-color: var(--input-field-color-focus-background);
3873
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3783
+ /* Track (background pill) */
3784
+ .muka-toggle__track {
3785
+ display: flex;
3786
+ align-items: center;
3787
+ width: var(--toggle-track-width);
3788
+ height: var(--toggle-track-height);
3789
+ border-radius: var(--toggle-track-radius);
3790
+ background-color: var(--toggle-track-color-off);
3791
+ transition: background-color 0.2s ease;
3792
+ box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3793
+ position: relative;
3874
3794
  }
3875
3795
 
3876
- /* Error state */
3877
- .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
3878
- border-width: var(--border-width-bold);
3879
- border-color: var(--input-field-color-error-border);
3880
- background-color: var(--input-field-color-error-background);
3881
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3796
+ /* Knob (sliding circle) */
3797
+ .muka-toggle__knob {
3798
+ position: absolute;
3799
+ width: var(--toggle-knob-size);
3800
+ height: var(--toggle-knob-size);
3801
+ border-radius: var(--border-radius-full);
3802
+ background-color: var(--toggle-knob-color-default);
3803
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3804
+ left: var(--toggle-knob-offset);
3805
+ transition: left 0.2s ease, transform 0.2s ease;
3882
3806
  }
3883
3807
 
3884
- /* Disabled state */
3885
- .muka-textarea__field--disabled {
3886
- background-color: var(--input-field-color-disabled-background);
3887
- border-color: var(--input-field-color-disabled-border);
3888
- cursor: not-allowed;
3808
+ /* Focus state */
3809
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3810
+ outline: 2px solid var(--color-border-focus);
3811
+ outline-offset: 2px;
3889
3812
  }
3890
3813
 
3891
- /* Native textarea */
3892
- .muka-textarea__native {
3893
- flex: 1;
3894
- border: none;
3895
- outline: none;
3896
- background: transparent;
3897
- color: var(--input-field-color-default-foreground);
3898
- font-family: var(--text-input-md-fontFamily);
3899
- font-weight: var(--text-input-md-fontWeight);
3900
- font-size: var(--text-input-md-fontSize);
3901
- line-height: var(--text-input-md-lineHeight);
3902
- padding: 0;
3903
- width: 100%;
3904
- min-width: 0;
3814
+ /* Checked (on) state */
3815
+ .muka-toggle__input:checked + .muka-toggle__track {
3816
+ background-color: var(--toggle-track-color-on);
3905
3817
  }
3906
3818
 
3907
- .muka-textarea__field--sm .muka-textarea__native {
3908
- font-family: var(--text-input-sm-fontFamily);
3909
- font-weight: var(--text-input-sm-fontWeight);
3910
- font-size: var(--text-input-sm-fontSize);
3911
- line-height: var(--text-input-sm-lineHeight);
3819
+ .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3820
+ left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3912
3821
  }
3913
3822
 
3914
- .muka-textarea__field--lg .muka-textarea__native {
3915
- font-family: var(--text-input-lg-fontFamily);
3916
- font-weight: var(--text-input-lg-fontWeight);
3917
- font-size: var(--text-input-lg-fontSize);
3918
- line-height: var(--text-input-lg-lineHeight);
3823
+ /* Disabled state */
3824
+ .muka-toggle--disabled .muka-toggle__track {
3825
+ background-color: var(--toggle-track-color-disabled);
3826
+ box-shadow: none;
3919
3827
  }
3920
3828
 
3921
- .muka-textarea__native::placeholder {
3922
- color: var(--color-text-subtle-default);
3829
+ .muka-toggle--disabled .muka-toggle__knob {
3830
+ background-color: var(--toggle-knob-color-disabled);
3831
+ box-shadow: none;
3923
3832
  }
3924
3833
 
3925
- .muka-textarea__field--disabled .muka-textarea__native {
3926
- color: var(--input-field-color-disabled-foreground);
3927
- cursor: not-allowed;
3928
- }
3929
-
3930
- /* Footer (helper/error + count) */
3931
- .muka-textarea__footer {
3932
- display: flex;
3933
- justify-content: space-between;
3934
- align-items: flex-start;
3935
- gap: var(--spacing-2);
3936
- }
3937
-
3938
- .muka-textarea__helper {
3939
- font-family: var(--text-label-sm-regular-fontFamily);
3940
- font-weight: var(--text-label-sm-regular-fontWeight);
3941
- font-size: var(--text-label-sm-regular-fontSize);
3942
- line-height: var(--text-label-sm-regular-lineHeight);
3943
- color: var(--color-text-subtle-default);
3944
- margin: 0;
3945
- }
3946
-
3947
- .muka-textarea__error {
3948
- font-family: var(--text-label-sm-regular-fontFamily);
3949
- font-weight: var(--text-label-sm-regular-fontWeight);
3950
- font-size: var(--text-label-sm-regular-fontSize);
3951
- line-height: var(--text-label-sm-regular-lineHeight);
3952
- color: var(--color-state-error-default);
3953
- margin: 0;
3954
- }
3955
-
3956
- .muka-textarea__count {
3957
- font-family: var(--text-label-sm-regular-fontFamily);
3958
- font-weight: var(--text-label-sm-regular-fontWeight);
3959
- font-size: var(--text-label-sm-regular-fontSize);
3960
- line-height: var(--text-label-sm-regular-lineHeight);
3961
- color: var(--color-text-subtle-default);
3962
- margin-left: auto;
3963
- }
3964
-
3965
-
3966
- /* TextLink */
3967
- /* TextLink Component Styles - Using Muka Design Tokens */
3968
-
3969
- .muka-text-link {
3970
- display: inline;
3971
- cursor: pointer;
3972
- text-decoration: underline;
3973
- /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3974
- text-underline-offset: 0.2em;
3975
- text-decoration-thickness: from-font;
3976
- /* Rounds the focus ring's corners; the link itself has no visible box. */
3977
- border-radius: var(--border-radius-sm);
3978
- transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3979
- }
3980
-
3981
- /* ─── Sizes ───────────────────────────────────────────────
3982
- Mirrors the body text scale so a link matches the copy it sits in. */
3983
- .muka-text-link--sm {
3984
- font-family: var(--text-body-sm-regular-fontFamily);
3985
- font-weight: var(--text-body-sm-regular-fontWeight);
3986
- font-size: var(--text-body-sm-regular-fontSize);
3987
- line-height: var(--text-body-sm-regular-lineHeight);
3988
- }
3989
-
3990
- .muka-text-link--base {
3991
- font-family: var(--text-body-base-regular-fontFamily);
3992
- font-weight: var(--text-body-base-regular-fontWeight);
3993
- font-size: var(--text-body-base-regular-fontSize);
3994
- line-height: var(--text-body-base-regular-lineHeight);
3995
- }
3996
-
3997
- .muka-text-link--lg {
3998
- font-family: var(--text-body-lg-regular-fontFamily);
3999
- font-weight: var(--text-body-lg-regular-fontWeight);
4000
- font-size: var(--text-body-lg-regular-fontSize);
4001
- line-height: var(--text-body-lg-regular-lineHeight);
4002
- }
4003
-
4004
- /* ─── Variant: default (accent) ───────────────────────────
4005
- Visited repeats the default colour on purpose: the design treats visited and
4006
- default the same, and pinning it stops the browser's purple from showing. */
4007
- .muka-text-link--default,
4008
- .muka-text-link--default:visited {
4009
- color: var(--color-text-action-default);
4010
- }
4011
-
4012
- .muka-text-link--default:hover,
4013
- .muka-text-link--default:focus-visible {
4014
- color: var(--color-text-action-hover);
4015
- }
4016
-
4017
- .muka-text-link--default:active {
4018
- color: var(--color-text-action-pressed);
4019
- }
4020
-
4021
- /* ─── Variant: subtle (neutral) ───────────────────────────
4022
- Hover, focus and pressed all darken to the default text colour. */
4023
- .muka-text-link--subtle,
4024
- .muka-text-link--subtle:visited {
4025
- color: var(--color-text-subtle-default);
4026
- }
4027
-
4028
- .muka-text-link--subtle:hover,
4029
- .muka-text-link--subtle:focus-visible,
4030
- .muka-text-link--subtle:active {
4031
- color: var(--color-text-default-default);
4032
- }
4033
-
4034
- /* ─── Focus ───────────────────────────────────────────────
4035
- Same ring as every other focusable Muka component. */
4036
- .muka-text-link:focus-visible {
4037
- outline: 2px solid var(--color-border-focus);
4038
- outline-offset: 2px;
4039
- }
4040
-
4041
- @media (prefers-reduced-motion: reduce) {
4042
- .muka-text-link {
4043
- transition: none;
4044
- }
3834
+ /* Divider */
3835
+ .muka-toggle__divider {
3836
+ position: absolute;
3837
+ bottom: 0;
3838
+ left: 0;
3839
+ right: 0;
3840
+ height: 1px;
3841
+ background-color: var(--color-border-muted);
4045
3842
  }
4046
3843
 
4047
3844
 
@@ -4076,12 +3873,17 @@ body {
4076
3873
  border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4077
3874
  }
4078
3875
 
3876
+ /* Padding: inset the tabs; the divider (border) still spans the full width */
3877
+ .muka-tabs--padding-default .muka-tabs__list {
3878
+ padding-inline: var(--tabs-list-padding-x);
3879
+ }
3880
+
4079
3881
  /* Tab Trigger — clean underline style */
4080
3882
  .muka-tabs__trigger {
4081
3883
  display: inline-flex;
4082
3884
  align-items: center;
4083
3885
  justify-content: center;
4084
- gap: var(--spacing-2, 8px);
3886
+ gap: var(--spacing-1);
4085
3887
  background: transparent;
4086
3888
  border: none;
4087
3889
  cursor: pointer;
@@ -4094,8 +3896,8 @@ body {
4094
3896
  color: var(--tabs-trigger-color-default-foreground);
4095
3897
 
4096
3898
  /* Default MD size values */
4097
- height: 48px;
4098
- padding: 0 var(--spacing-3, 12px);
3899
+ min-height: var(--tabs-trigger-min-height-md);
3900
+ padding: var(--spacing-3);
4099
3901
  font-family: var(--text-label-md-regular-fontFamily);
4100
3902
  font-weight: var(--text-label-md-regular-fontWeight);
4101
3903
  font-size: var(--text-label-md-regular-fontSize);
@@ -4104,8 +3906,8 @@ body {
4104
3906
 
4105
3907
  /* Size Variants */
4106
3908
  .muka-tabs--size-sm .muka-tabs__trigger {
4107
- height: 36px;
4108
- padding: 0 var(--spacing-2, 8px);
3909
+ min-height: var(--tabs-trigger-min-height-sm);
3910
+ padding: 0 var(--spacing-2);
4109
3911
  font-family: var(--text-label-sm-regular-fontFamily);
4110
3912
  font-weight: var(--text-label-sm-regular-fontWeight);
4111
3913
  font-size: var(--text-label-sm-regular-fontSize);
@@ -4113,8 +3915,8 @@ body {
4113
3915
  }
4114
3916
 
4115
3917
  .muka-tabs--size-lg .muka-tabs__trigger {
4116
- height: 56px;
4117
- padding: 0 var(--spacing-4, 16px);
3918
+ min-height: var(--tabs-trigger-min-height-lg);
3919
+ padding: var(--spacing-4);
4118
3920
  font-family: var(--text-label-lg-regular-fontFamily);
4119
3921
  font-weight: var(--text-label-lg-regular-fontWeight);
4120
3922
  font-size: var(--text-label-lg-regular-fontSize);
@@ -4138,8 +3940,8 @@ body {
4138
3940
  bottom: -1px; /* Overlap the 1px border */
4139
3941
  left: 0;
4140
3942
  right: 0;
4141
- height: 3px;
4142
- background-color: var(--tabs-trigger-color-current-foreground);
3943
+ height: var(--tabs-indicator-height-md);
3944
+ background-color: var(--tabs-indicator-color);
4143
3945
  border-bottom-left-radius: 1px;
4144
3946
  border-bottom-right-radius: 1px;
4145
3947
  border-top-left-radius: 3px;
@@ -4147,6 +3949,13 @@ body {
4147
3949
  z-index: 3;
4148
3950
  }
4149
3951
 
3952
+ .muka-tabs--size-sm .muka-tabs__trigger--current::after {
3953
+ height: var(--tabs-indicator-height-sm);
3954
+ }
3955
+ .muka-tabs--size-lg .muka-tabs__trigger--current::after {
3956
+ height: var(--tabs-indicator-height-lg);
3957
+ }
3958
+
4150
3959
  .muka-tabs__trigger--disabled {
4151
3960
  color: var(--tabs-trigger-color-disabled-foreground);
4152
3961
  cursor: not-allowed;
@@ -4157,18 +3966,29 @@ body {
4157
3966
  outline-offset: -2px;
4158
3967
  }
4159
3968
 
4160
- /* Icons */
4161
- .muka-tabs__icon {
3969
+ /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
3970
+ item sits 12px from the text */
3971
+ .muka-tabs__label {
3972
+ padding: 0 var(--spacing-2);
3973
+ }
3974
+
3975
+ /* Leading item: icon, avatar, avatar group or data pie chart */
3976
+ .muka-tabs__leading {
4162
3977
  display: flex;
4163
3978
  align-items: center;
4164
3979
  justify-content: center;
3980
+ flex-shrink: 0;
4165
3981
  }
4166
3982
  .muka-tabs__trigger .muka-icon {
4167
3983
  color: inherit;
4168
3984
  }
4169
- .muka-tabs--size-sm .muka-tabs__icon svg { width: 16px; height: 16px; }
4170
- .muka-tabs--size-md .muka-tabs__icon svg { width: 20px; height: 20px; }
4171
- .muka-tabs--size-lg .muka-tabs__icon svg { width: 24px; height: 24px; }
3985
+ /* Icon sizes only: avatars and pie charts are sized through their size prop */
3986
+ .muka-tabs--size-sm .muka-tabs__leading > svg,
3987
+ .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
3988
+ .muka-tabs--size-md .muka-tabs__leading > svg,
3989
+ .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
3990
+ .muka-tabs--size-lg .muka-tabs__leading > svg,
3991
+ .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
4172
3992
 
4173
3993
  /* Responsive Scroll behavior on small screens */
4174
3994
  @media (max-width: 768px) {
@@ -4192,25 +4012,271 @@ body {
4192
4012
  }
4193
4013
  }
4194
4014
 
4195
- /* Tab Panel — content area */
4196
- .muka-tabs__panel {
4197
- background-color: var(--tabs-panel-background);
4198
- /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4199
- border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4200
- padding: var(--spacing-4);
4201
- position: relative;
4202
- z-index: 1;
4203
- font-family: var(--text-body-base-regular-fontFamily);
4204
- font-weight: var(--text-body-base-regular-fontWeight);
4205
- font-size: var(--text-body-base-regular-fontSize);
4206
- line-height: var(--text-body-base-regular-lineHeight);
4015
+ /* Tab Panel — content area */
4016
+ .muka-tabs__panel {
4017
+ background-color: var(--tabs-panel-background);
4018
+ /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4019
+ border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4020
+ padding: var(--spacing-4);
4021
+ position: relative;
4022
+ z-index: 1;
4023
+ font-family: var(--text-body-base-regular-fontFamily);
4024
+ font-weight: var(--text-body-base-regular-fontWeight);
4025
+ font-size: var(--text-body-base-regular-fontSize);
4026
+ line-height: var(--text-body-base-regular-lineHeight);
4027
+ }
4028
+
4029
+ .muka-tabs__panel:focus-visible {
4030
+ outline: 2px solid var(--color-border-focus);
4031
+ outline-offset: 2px;
4032
+ }
4033
+
4034
+
4035
+ /* Textarea */
4036
+ /* Textarea Component Styles - Using Muka Design Tokens */
4037
+
4038
+ .muka-textarea {
4039
+ display: inline-flex;
4040
+ flex-direction: column;
4041
+ gap: var(--spacing-2);
4042
+ }
4043
+
4044
+ /* Label */
4045
+ .muka-textarea__label {
4046
+ color: var(--color-text-default-default);
4047
+ cursor: pointer;
4048
+ }
4049
+
4050
+ .muka-textarea__label--sm {
4051
+ font-family: var(--text-label-sm-semibold-fontFamily);
4052
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4053
+ font-size: var(--text-label-sm-semibold-fontSize);
4054
+ line-height: var(--text-label-sm-semibold-lineHeight);
4055
+ }
4056
+
4057
+ .muka-textarea__label--md {
4058
+ font-family: var(--text-label-md-semibold-fontFamily);
4059
+ font-weight: var(--text-label-md-semibold-fontWeight);
4060
+ font-size: var(--text-label-md-semibold-fontSize);
4061
+ line-height: var(--text-label-md-semibold-lineHeight);
4062
+ }
4063
+
4064
+ .muka-textarea__label--lg {
4065
+ font-family: var(--text-label-lg-semibold-fontFamily);
4066
+ font-weight: var(--text-label-lg-semibold-fontWeight);
4067
+ font-size: var(--text-label-lg-semibold-fontSize);
4068
+ line-height: var(--text-label-lg-semibold-lineHeight);
4069
+ }
4070
+
4071
+ .muka-textarea__required {
4072
+ color: var(--color-state-error-default);
4073
+ }
4074
+
4075
+ /* Field container */
4076
+ .muka-textarea__field {
4077
+ display: flex;
4078
+ background-color: var(--input-field-color-default-background);
4079
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
4080
+ border-radius: var(--input-field-radius-md);
4081
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
4082
+ transition: border-color 0.2s ease, background-color 0.2s ease;
4083
+ box-sizing: border-box;
4084
+ }
4085
+
4086
+ .muka-textarea__field--sm {
4087
+ min-height: var(--input-textarea-height-sm);
4088
+ border-radius: var(--input-field-radius-sm);
4089
+ }
4090
+
4091
+ .muka-textarea__field--md {
4092
+ min-height: var(--input-textarea-height-default);
4093
+ border-radius: var(--input-field-radius-md);
4094
+ }
4095
+
4096
+ .muka-textarea__field--lg {
4097
+ min-height: var(--input-textarea-height-lg);
4098
+ border-radius: var(--input-field-radius-lg);
4099
+ }
4100
+
4101
+ /* Focus state */
4102
+ .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
4103
+ border-width: var(--border-width-bold);
4104
+ border-color: var(--input-field-color-focus-border);
4105
+ background-color: var(--input-field-color-focus-background);
4106
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4107
+ }
4108
+
4109
+ /* Error state */
4110
+ .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
4111
+ border-width: var(--border-width-bold);
4112
+ border-color: var(--input-field-color-error-border);
4113
+ background-color: var(--input-field-color-error-background);
4114
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4115
+ }
4116
+
4117
+ /* Disabled state */
4118
+ .muka-textarea__field--disabled {
4119
+ background-color: var(--input-field-color-disabled-background);
4120
+ border-color: var(--input-field-color-disabled-border);
4121
+ cursor: not-allowed;
4122
+ }
4123
+
4124
+ /* Native textarea */
4125
+ .muka-textarea__native {
4126
+ flex: 1;
4127
+ border: none;
4128
+ outline: none;
4129
+ background: transparent;
4130
+ color: var(--input-field-color-default-foreground);
4131
+ font-family: var(--text-input-md-fontFamily);
4132
+ font-weight: var(--text-input-md-fontWeight);
4133
+ font-size: var(--text-input-md-fontSize);
4134
+ line-height: var(--text-input-md-lineHeight);
4135
+ padding: 0;
4136
+ width: 100%;
4137
+ min-width: 0;
4138
+ }
4139
+
4140
+ .muka-textarea__field--sm .muka-textarea__native {
4141
+ font-family: var(--text-input-sm-fontFamily);
4142
+ font-weight: var(--text-input-sm-fontWeight);
4143
+ font-size: var(--text-input-sm-fontSize);
4144
+ line-height: var(--text-input-sm-lineHeight);
4145
+ }
4146
+
4147
+ .muka-textarea__field--lg .muka-textarea__native {
4148
+ font-family: var(--text-input-lg-fontFamily);
4149
+ font-weight: var(--text-input-lg-fontWeight);
4150
+ font-size: var(--text-input-lg-fontSize);
4151
+ line-height: var(--text-input-lg-lineHeight);
4152
+ }
4153
+
4154
+ .muka-textarea__native::placeholder {
4155
+ color: var(--color-text-subtle-default);
4156
+ }
4157
+
4158
+ .muka-textarea__field--disabled .muka-textarea__native {
4159
+ color: var(--input-field-color-disabled-foreground);
4160
+ cursor: not-allowed;
4161
+ }
4162
+
4163
+ /* Footer (helper/error + count) */
4164
+ .muka-textarea__footer {
4165
+ display: flex;
4166
+ justify-content: space-between;
4167
+ align-items: flex-start;
4168
+ gap: var(--spacing-2);
4169
+ }
4170
+
4171
+ .muka-textarea__helper {
4172
+ font-family: var(--text-label-sm-regular-fontFamily);
4173
+ font-weight: var(--text-label-sm-regular-fontWeight);
4174
+ font-size: var(--text-label-sm-regular-fontSize);
4175
+ line-height: var(--text-label-sm-regular-lineHeight);
4176
+ color: var(--color-text-subtle-default);
4177
+ margin: 0;
4178
+ }
4179
+
4180
+ .muka-textarea__error {
4181
+ font-family: var(--text-label-sm-regular-fontFamily);
4182
+ font-weight: var(--text-label-sm-regular-fontWeight);
4183
+ font-size: var(--text-label-sm-regular-fontSize);
4184
+ line-height: var(--text-label-sm-regular-lineHeight);
4185
+ color: var(--color-state-error-default);
4186
+ margin: 0;
4187
+ }
4188
+
4189
+ .muka-textarea__count {
4190
+ font-family: var(--text-label-sm-regular-fontFamily);
4191
+ font-weight: var(--text-label-sm-regular-fontWeight);
4192
+ font-size: var(--text-label-sm-regular-fontSize);
4193
+ line-height: var(--text-label-sm-regular-lineHeight);
4194
+ color: var(--color-text-subtle-default);
4195
+ margin-left: auto;
4196
+ }
4197
+
4198
+
4199
+ /* TextLink */
4200
+ /* TextLink Component Styles - Using Muka Design Tokens */
4201
+
4202
+ .muka-text-link {
4203
+ display: inline;
4204
+ cursor: pointer;
4205
+ text-decoration: underline;
4206
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
4207
+ text-underline-offset: 0.2em;
4208
+ text-decoration-thickness: from-font;
4209
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
4210
+ border-radius: var(--border-radius-sm);
4211
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
4212
+ }
4213
+
4214
+ /* ─── Sizes ───────────────────────────────────────────────
4215
+ Mirrors the body text scale so a link matches the copy it sits in. */
4216
+ .muka-text-link--sm {
4217
+ font-family: var(--text-body-sm-regular-fontFamily);
4218
+ font-weight: var(--text-body-sm-regular-fontWeight);
4219
+ font-size: var(--text-body-sm-regular-fontSize);
4220
+ line-height: var(--text-body-sm-regular-lineHeight);
4221
+ }
4222
+
4223
+ .muka-text-link--base {
4224
+ font-family: var(--text-body-base-regular-fontFamily);
4225
+ font-weight: var(--text-body-base-regular-fontWeight);
4226
+ font-size: var(--text-body-base-regular-fontSize);
4227
+ line-height: var(--text-body-base-regular-lineHeight);
4228
+ }
4229
+
4230
+ .muka-text-link--lg {
4231
+ font-family: var(--text-body-lg-regular-fontFamily);
4232
+ font-weight: var(--text-body-lg-regular-fontWeight);
4233
+ font-size: var(--text-body-lg-regular-fontSize);
4234
+ line-height: var(--text-body-lg-regular-lineHeight);
4235
+ }
4236
+
4237
+ /* ─── Variant: default (accent) ───────────────────────────
4238
+ Visited repeats the default colour on purpose: the design treats visited and
4239
+ default the same, and pinning it stops the browser's purple from showing. */
4240
+ .muka-text-link--default,
4241
+ .muka-text-link--default:visited {
4242
+ color: var(--color-text-action-default);
4243
+ }
4244
+
4245
+ .muka-text-link--default:hover,
4246
+ .muka-text-link--default:focus-visible {
4247
+ color: var(--color-text-action-hover);
4207
4248
  }
4208
4249
 
4209
- .muka-tabs__panel:focus-visible {
4250
+ .muka-text-link--default:active {
4251
+ color: var(--color-text-action-pressed);
4252
+ }
4253
+
4254
+ /* ─── Variant: subtle (neutral) ───────────────────────────
4255
+ Hover, focus and pressed all darken to the default text colour. */
4256
+ .muka-text-link--subtle,
4257
+ .muka-text-link--subtle:visited {
4258
+ color: var(--color-text-subtle-default);
4259
+ }
4260
+
4261
+ .muka-text-link--subtle:hover,
4262
+ .muka-text-link--subtle:focus-visible,
4263
+ .muka-text-link--subtle:active {
4264
+ color: var(--color-text-default-default);
4265
+ }
4266
+
4267
+ /* ─── Focus ───────────────────────────────────────────────
4268
+ Same ring as every other focusable Muka component. */
4269
+ .muka-text-link:focus-visible {
4210
4270
  outline: 2px solid var(--color-border-focus);
4211
4271
  outline-offset: 2px;
4212
4272
  }
4213
4273
 
4274
+ @media (prefers-reduced-motion: reduce) {
4275
+ .muka-text-link {
4276
+ transition: none;
4277
+ }
4278
+ }
4279
+
4214
4280
 
4215
4281
  /* Table */
4216
4282
  /* Table Component Styles - Using Muka Design Tokens */
@@ -4564,114 +4630,6 @@ body {
4564
4630
  }
4565
4631
 
4566
4632
 
4567
- /* SwipeActions */
4568
- /* SwipeActions Component Styles */
4569
-
4570
- .muka-swipe-actions {
4571
- position: relative;
4572
- overflow: hidden;
4573
- touch-action: pan-y;
4574
- -webkit-user-select: none;
4575
- user-select: none;
4576
- background-color: var(--color-surface-level3);
4577
- }
4578
-
4579
- .muka-swipe-actions--disabled {
4580
- touch-action: auto;
4581
- }
4582
-
4583
- /* ─── Row that holds the actual content ────────────────── */
4584
-
4585
- .muka-swipe-actions__row {
4586
- position: relative;
4587
- z-index: 1;
4588
- background-color: inherit;
4589
- will-change: transform;
4590
- }
4591
-
4592
- /* ─── Action panels — sit beneath the row ──────────────── */
4593
-
4594
- .muka-swipe-actions__panel {
4595
- position: absolute;
4596
- top: 0;
4597
- bottom: 0;
4598
- display: flex;
4599
- align-items: stretch;
4600
- z-index: 0;
4601
- }
4602
-
4603
- .muka-swipe-actions__panel--left {
4604
- left: 0;
4605
- }
4606
-
4607
- .muka-swipe-actions__panel--right {
4608
- right: 0;
4609
- }
4610
-
4611
- /* ─── Single action button ─────────────────────────────── */
4612
-
4613
- .muka-swipe-actions__button {
4614
- display: flex;
4615
- flex-direction: column;
4616
- align-items: center;
4617
- justify-content: center;
4618
- gap: var(--spacing-1);
4619
- border: none;
4620
- cursor: pointer;
4621
- padding: var(--spacing-2);
4622
- background-color: var(--color-surface-level2);
4623
- color: var(--color-text-default-default);
4624
- font-family: var(--text-label-sm-semibold-fontFamily);
4625
- font-weight: var(--text-label-sm-semibold-fontWeight);
4626
- font-size: var(--text-label-sm-semibold-fontSize);
4627
- line-height: var(--text-label-sm-semibold-lineHeight);
4628
- -webkit-tap-highlight-color: transparent;
4629
- transition: filter 0.12s ease;
4630
- }
4631
-
4632
- .muka-swipe-actions__button:hover {
4633
- filter: brightness(0.95);
4634
- }
4635
-
4636
- .muka-swipe-actions__button:focus-visible {
4637
- outline: 2px solid var(--color-action-default);
4638
- outline-offset: -2px;
4639
- }
4640
-
4641
- .muka-swipe-actions__button-icon {
4642
- display: inline-flex;
4643
- align-items: center;
4644
- justify-content: center;
4645
- }
4646
-
4647
- /* ─── Color variants ───────────────────────────────────── */
4648
-
4649
- .muka-swipe-actions__button--neutral {
4650
- background-color: var(--color-surface-level2);
4651
- color: var(--color-text-default-default);
4652
- }
4653
-
4654
- .muka-swipe-actions__button--primary {
4655
- background-color: var(--color-action-default);
4656
- color: var(--color-text-default-inverse);
4657
- }
4658
-
4659
- .muka-swipe-actions__button--success {
4660
- background-color: var(--color-state-success-default);
4661
- color: var(--color-text-default-inverse);
4662
- }
4663
-
4664
- .muka-swipe-actions__button--warning {
4665
- background-color: var(--color-state-warning-default);
4666
- color: var(--color-text-default-default);
4667
- }
4668
-
4669
- .muka-swipe-actions__button--destructive {
4670
- background-color: var(--color-state-error-default);
4671
- color: var(--color-text-default-inverse);
4672
- }
4673
-
4674
-
4675
4633
  /* Spinner */
4676
4634
  /* Spinner Component Styles */
4677
4635
 
@@ -4767,71 +4725,179 @@ body {
4767
4725
  padding-bottom: var(--spacing-3);
4768
4726
  }
4769
4727
 
4770
- /* ─── Label ───────────────────────────────────────────── */
4728
+ /* ─── Label ───────────────────────────────────────────── */
4729
+
4730
+ .muka-spec-row__label {
4731
+ flex: 0 0 auto;
4732
+ margin: 0;
4733
+ color: var(--color-text-subtle-default);
4734
+ font-family: var(--text-body-base-regular-fontFamily);
4735
+ font-weight: var(--text-body-base-regular-fontWeight);
4736
+ font-size: var(--text-body-base-regular-fontSize);
4737
+ line-height: var(--text-body-base-regular-lineHeight);
4738
+ overflow: hidden;
4739
+ text-overflow: ellipsis;
4740
+ white-space: nowrap;
4741
+ }
4742
+
4743
+ /* ─── Value ───────────────────────────────────────────── */
4744
+
4745
+ .muka-spec-row__value {
4746
+ flex: 1 1 0;
4747
+ min-width: 0;
4748
+ margin: 0;
4749
+ display: flex;
4750
+ flex-direction: column;
4751
+ color: var(--color-text-default-default);
4752
+ }
4753
+
4754
+ .muka-spec-row__value-text {
4755
+ font-family: var(--text-body-base-regular-fontFamily);
4756
+ font-weight: var(--text-body-base-regular-fontWeight);
4757
+ font-size: var(--text-body-base-regular-fontSize);
4758
+ line-height: var(--text-body-base-regular-lineHeight);
4759
+ }
4760
+
4761
+ .muka-spec-row__hint {
4762
+ color: var(--color-text-subtle-default);
4763
+ font-family: var(--text-body-sm-regular-fontFamily);
4764
+ font-weight: var(--text-body-sm-regular-fontWeight);
4765
+ font-size: var(--text-body-sm-regular-fontSize);
4766
+ line-height: var(--text-body-sm-regular-lineHeight);
4767
+ }
4768
+
4769
+ /* ─── Label width (horizontal stacking) ───────────────── */
4770
+
4771
+ .muka-spec-list--label-small .muka-spec-row__label {
4772
+ width: 80px;
4773
+ }
4774
+
4775
+ .muka-spec-list--label-medium .muka-spec-row__label {
4776
+ width: 120px;
4777
+ }
4778
+
4779
+ .muka-spec-list--label-large .muka-spec-row__label {
4780
+ width: 160px;
4781
+ }
4782
+
4783
+ /* ─── Vertical stacking ───────────────────────────────── */
4784
+
4785
+ .muka-spec-list--vertical .muka-spec-row {
4786
+ flex-direction: column;
4787
+ gap: var(--spacing-1);
4788
+ }
4789
+
4790
+ .muka-spec-list--vertical .muka-spec-row__label {
4791
+ width: 100%;
4792
+ white-space: normal;
4793
+ }
4794
+
4795
+
4796
+ /* SwipeActions */
4797
+ /* SwipeActions Component Styles */
4798
+
4799
+ .muka-swipe-actions {
4800
+ position: relative;
4801
+ overflow: hidden;
4802
+ touch-action: pan-y;
4803
+ -webkit-user-select: none;
4804
+ user-select: none;
4805
+ background-color: var(--color-surface-level3);
4806
+ }
4807
+
4808
+ .muka-swipe-actions--disabled {
4809
+ touch-action: auto;
4810
+ }
4811
+
4812
+ /* ─── Row that holds the actual content ────────────────── */
4813
+
4814
+ .muka-swipe-actions__row {
4815
+ position: relative;
4816
+ z-index: 1;
4817
+ background-color: inherit;
4818
+ will-change: transform;
4819
+ }
4820
+
4821
+ /* ─── Action panels — sit beneath the row ──────────────── */
4822
+
4823
+ .muka-swipe-actions__panel {
4824
+ position: absolute;
4825
+ top: 0;
4826
+ bottom: 0;
4827
+ display: flex;
4828
+ align-items: stretch;
4829
+ z-index: 0;
4830
+ }
4831
+
4832
+ .muka-swipe-actions__panel--left {
4833
+ left: 0;
4834
+ }
4771
4835
 
4772
- .muka-spec-row__label {
4773
- flex: 0 0 auto;
4774
- margin: 0;
4775
- color: var(--color-text-subtle-default);
4776
- font-family: var(--text-body-base-regular-fontFamily);
4777
- font-weight: var(--text-body-base-regular-fontWeight);
4778
- font-size: var(--text-body-base-regular-fontSize);
4779
- line-height: var(--text-body-base-regular-lineHeight);
4780
- overflow: hidden;
4781
- text-overflow: ellipsis;
4782
- white-space: nowrap;
4836
+ .muka-swipe-actions__panel--right {
4837
+ right: 0;
4783
4838
  }
4784
4839
 
4785
- /* ─── Value ───────────────────────────────────────────── */
4840
+ /* ─── Single action button ─────────────────────────────── */
4786
4841
 
4787
- .muka-spec-row__value {
4788
- flex: 1 1 0;
4789
- min-width: 0;
4790
- margin: 0;
4842
+ .muka-swipe-actions__button {
4791
4843
  display: flex;
4792
4844
  flex-direction: column;
4845
+ align-items: center;
4846
+ justify-content: center;
4847
+ gap: var(--spacing-1);
4848
+ border: none;
4849
+ cursor: pointer;
4850
+ padding: var(--spacing-2);
4851
+ background-color: var(--color-surface-level2);
4793
4852
  color: var(--color-text-default-default);
4853
+ font-family: var(--text-label-sm-semibold-fontFamily);
4854
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4855
+ font-size: var(--text-label-sm-semibold-fontSize);
4856
+ line-height: var(--text-label-sm-semibold-lineHeight);
4857
+ -webkit-tap-highlight-color: transparent;
4858
+ transition: filter 0.12s ease;
4794
4859
  }
4795
4860
 
4796
- .muka-spec-row__value-text {
4797
- font-family: var(--text-body-base-regular-fontFamily);
4798
- font-weight: var(--text-body-base-regular-fontWeight);
4799
- font-size: var(--text-body-base-regular-fontSize);
4800
- line-height: var(--text-body-base-regular-lineHeight);
4861
+ .muka-swipe-actions__button:hover {
4862
+ filter: brightness(0.95);
4801
4863
  }
4802
4864
 
4803
- .muka-spec-row__hint {
4804
- color: var(--color-text-subtle-default);
4805
- font-family: var(--text-body-sm-regular-fontFamily);
4806
- font-weight: var(--text-body-sm-regular-fontWeight);
4807
- font-size: var(--text-body-sm-regular-fontSize);
4808
- line-height: var(--text-body-sm-regular-lineHeight);
4865
+ .muka-swipe-actions__button:focus-visible {
4866
+ outline: 2px solid var(--color-action-default);
4867
+ outline-offset: -2px;
4809
4868
  }
4810
4869
 
4811
- /* ─── Label width (horizontal stacking) ───────────────── */
4812
-
4813
- .muka-spec-list--label-small .muka-spec-row__label {
4814
- width: 80px;
4870
+ .muka-swipe-actions__button-icon {
4871
+ display: inline-flex;
4872
+ align-items: center;
4873
+ justify-content: center;
4815
4874
  }
4816
4875
 
4817
- .muka-spec-list--label-medium .muka-spec-row__label {
4818
- width: 120px;
4876
+ /* ─── Color variants ───────────────────────────────────── */
4877
+
4878
+ .muka-swipe-actions__button--neutral {
4879
+ background-color: var(--color-surface-level2);
4880
+ color: var(--color-text-default-default);
4819
4881
  }
4820
4882
 
4821
- .muka-spec-list--label-large .muka-spec-row__label {
4822
- width: 160px;
4883
+ .muka-swipe-actions__button--primary {
4884
+ background-color: var(--color-action-default);
4885
+ color: var(--color-text-default-inverse);
4823
4886
  }
4824
4887
 
4825
- /* ─── Vertical stacking ───────────────────────────────── */
4888
+ .muka-swipe-actions__button--success {
4889
+ background-color: var(--color-state-success-default);
4890
+ color: var(--color-text-default-inverse);
4891
+ }
4826
4892
 
4827
- .muka-spec-list--vertical .muka-spec-row {
4828
- flex-direction: column;
4829
- gap: var(--spacing-1);
4893
+ .muka-swipe-actions__button--warning {
4894
+ background-color: var(--color-state-warning-default);
4895
+ color: var(--color-text-default-default);
4830
4896
  }
4831
4897
 
4832
- .muka-spec-list--vertical .muka-spec-row__label {
4833
- width: 100%;
4834
- white-space: normal;
4898
+ .muka-swipe-actions__button--destructive {
4899
+ background-color: var(--color-state-error-default);
4900
+ color: var(--color-text-default-inverse);
4835
4901
  }
4836
4902
 
4837
4903
 
@@ -7466,6 +7532,77 @@ body {
7466
7532
  }
7467
7533
 
7468
7534
 
7535
+ /* ProfileBadge */
7536
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7537
+
7538
+ .muka-profile-badge {
7539
+ display: inline-flex;
7540
+ align-items: center;
7541
+ font-family: var(--text-body-base-regular-fontFamily);
7542
+ }
7543
+
7544
+ /* Size variants */
7545
+ .muka-profile-badge--lg {
7546
+ gap: var(--spacing-4); /* 16px */
7547
+ }
7548
+
7549
+ .muka-profile-badge--md {
7550
+ gap: var(--spacing-3); /* 12px */
7551
+ }
7552
+
7553
+ .muka-profile-badge__avatar {
7554
+ flex-shrink: 0;
7555
+ }
7556
+
7557
+ /* Text stack */
7558
+ .muka-profile-badge__text {
7559
+ display: flex;
7560
+ flex-direction: column;
7561
+ align-items: flex-start;
7562
+ min-width: 0;
7563
+ }
7564
+
7565
+ .muka-profile-badge__name {
7566
+ font-family: var(--text-body-base-regular-fontFamily);
7567
+ font-size: var(--text-body-base-regular-fontSize);
7568
+ font-weight: var(--text-body-base-regular-fontWeight);
7569
+ line-height: var(--text-body-base-regular-lineHeight);
7570
+ color: var(--color-text-default-default);
7571
+ }
7572
+
7573
+ .muka-profile-badge__email {
7574
+ font-family: var(--text-body-xs-regular-fontFamily);
7575
+ font-size: var(--text-body-xs-regular-fontSize);
7576
+ font-weight: var(--text-body-xs-regular-fontWeight);
7577
+ line-height: var(--text-body-xs-regular-lineHeight);
7578
+ color: var(--color-text-subtle-default);
7579
+ }
7580
+
7581
+ /* Clickable state */
7582
+ .muka-profile-badge--clickable {
7583
+ cursor: pointer;
7584
+ border: none;
7585
+ background: none;
7586
+ padding: 0;
7587
+ text-align: left;
7588
+ border-radius: var(--radius-md);
7589
+ transition: opacity 0.2s ease;
7590
+ }
7591
+
7592
+ .muka-profile-badge--clickable:hover {
7593
+ opacity: 0.9;
7594
+ }
7595
+
7596
+ .muka-profile-badge--clickable:active {
7597
+ opacity: 0.8;
7598
+ }
7599
+
7600
+ .muka-profile-badge--clickable:focus-visible {
7601
+ outline: 2px solid var(--color-border-focus);
7602
+ outline-offset: 2px;
7603
+ }
7604
+
7605
+
7469
7606
  /* PriceTag */
7470
7607
  /* PriceTag Component Styles - Using Muka Design Tokens */
7471
7608
 
@@ -7563,77 +7700,6 @@ body {
7563
7700
  }
7564
7701
 
7565
7702
 
7566
- /* ProfileBadge */
7567
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7568
-
7569
- .muka-profile-badge {
7570
- display: inline-flex;
7571
- align-items: center;
7572
- font-family: var(--text-body-base-regular-fontFamily);
7573
- }
7574
-
7575
- /* Size variants */
7576
- .muka-profile-badge--lg {
7577
- gap: var(--spacing-4); /* 16px */
7578
- }
7579
-
7580
- .muka-profile-badge--md {
7581
- gap: var(--spacing-3); /* 12px */
7582
- }
7583
-
7584
- .muka-profile-badge__avatar {
7585
- flex-shrink: 0;
7586
- }
7587
-
7588
- /* Text stack */
7589
- .muka-profile-badge__text {
7590
- display: flex;
7591
- flex-direction: column;
7592
- align-items: flex-start;
7593
- min-width: 0;
7594
- }
7595
-
7596
- .muka-profile-badge__name {
7597
- font-family: var(--text-body-base-regular-fontFamily);
7598
- font-size: var(--text-body-base-regular-fontSize);
7599
- font-weight: var(--text-body-base-regular-fontWeight);
7600
- line-height: var(--text-body-base-regular-lineHeight);
7601
- color: var(--color-text-default-default);
7602
- }
7603
-
7604
- .muka-profile-badge__email {
7605
- font-family: var(--text-body-xs-regular-fontFamily);
7606
- font-size: var(--text-body-xs-regular-fontSize);
7607
- font-weight: var(--text-body-xs-regular-fontWeight);
7608
- line-height: var(--text-body-xs-regular-lineHeight);
7609
- color: var(--color-text-subtle-default);
7610
- }
7611
-
7612
- /* Clickable state */
7613
- .muka-profile-badge--clickable {
7614
- cursor: pointer;
7615
- border: none;
7616
- background: none;
7617
- padding: 0;
7618
- text-align: left;
7619
- border-radius: var(--radius-md);
7620
- transition: opacity 0.2s ease;
7621
- }
7622
-
7623
- .muka-profile-badge--clickable:hover {
7624
- opacity: 0.9;
7625
- }
7626
-
7627
- .muka-profile-badge--clickable:active {
7628
- opacity: 0.8;
7629
- }
7630
-
7631
- .muka-profile-badge--clickable:focus-visible {
7632
- outline: 2px solid var(--color-border-focus);
7633
- outline-offset: 2px;
7634
- }
7635
-
7636
-
7637
7703
  /* Popover */
7638
7704
  /* Popover Component Styles */
7639
7705
 
@@ -8039,18 +8105,46 @@ body {
8039
8105
  white-space: nowrap;
8040
8106
  }
8041
8107
 
8042
- /* Hide the native number spinners — affixes/step API replace them. */
8043
- .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8044
- .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8045
- -webkit-appearance: none;
8046
- margin: 0;
8108
+ /* Hide the native number spinners — affixes/step API replace them. */
8109
+ .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8110
+ .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8111
+ -webkit-appearance: none;
8112
+ margin: 0;
8113
+ }
8114
+
8115
+ .muka-numberinput__field .muka-input__native {
8116
+ -moz-appearance: textfield;
8117
+ appearance: textfield;
8118
+ }
8119
+
8120
+
8121
+ /* NavigationTransition */
8122
+ /* NavigationTransition Component Styles */
8123
+
8124
+ /* ─── Wrapper ────────────────────────────────────────── */
8125
+
8126
+ .muka-nav-transition {
8127
+ position: relative;
8128
+ height: 100vh;
8129
+ overflow: hidden;
8130
+ }
8131
+
8132
+ /* Disable interaction during animation */
8133
+ .muka-nav-transition--active {
8134
+ pointer-events: none;
8047
8135
  }
8048
8136
 
8049
- .muka-numberinput__field .muka-input__native {
8050
- -moz-appearance: textfield;
8051
- appearance: textfield;
8137
+ /* ─── View slots ─────────────────────────────────────── */
8138
+
8139
+ .muka-nav-transition--active .muka-nav-transition__view {
8140
+ position: absolute;
8141
+ inset: 0;
8052
8142
  }
8053
8143
 
8144
+ /* Z-index layering */
8145
+ .muka-nav-transition__view--bottom { z-index: 1; }
8146
+ .muka-nav-transition__view--top { z-index: 2; }
8147
+
8054
8148
 
8055
8149
  /* Menu */
8056
8150
  /* Menu Component Styles */
@@ -8531,34 +8625,6 @@ body {
8531
8625
  }
8532
8626
 
8533
8627
 
8534
- /* NavigationTransition */
8535
- /* NavigationTransition Component Styles */
8536
-
8537
- /* ─── Wrapper ────────────────────────────────────────── */
8538
-
8539
- .muka-nav-transition {
8540
- position: relative;
8541
- height: 100vh;
8542
- overflow: hidden;
8543
- }
8544
-
8545
- /* Disable interaction during animation */
8546
- .muka-nav-transition--active {
8547
- pointer-events: none;
8548
- }
8549
-
8550
- /* ─── View slots ─────────────────────────────────────── */
8551
-
8552
- .muka-nav-transition--active .muka-nav-transition__view {
8553
- position: absolute;
8554
- inset: 0;
8555
- }
8556
-
8557
- /* Z-index layering */
8558
- .muka-nav-transition__view--bottom { z-index: 1; }
8559
- .muka-nav-transition__view--top { z-index: 2; }
8560
-
8561
-
8562
8628
  /* ListItem */
8563
8629
  /* ListItem Component Styles - Using Muka Design Tokens */
8564
8630
 
@@ -8987,6 +9053,184 @@ li.muka-listitem {
8987
9053
  }
8988
9054
 
8989
9055
 
9056
+ /* InputCounter */
9057
+ /* InputCounter — numeric field + joined decrement/increment buttons.
9058
+ Label, helper and error text reuse Input.css (../Input/Input.css).
9059
+ Field and button group share one radius per size:
9060
+ sm/md → input.field.radius.md, lg → input.field.radius.lg. */
9061
+
9062
+ .muka-inputcounter {
9063
+ --muka-inputcounter-radius: var(--input-field-radius-md);
9064
+ --muka-inputcounter-height: var(--input-field-height-default);
9065
+ --muka-inputcounter-pad: calc(var(--spacing-2) + var(--spacing-1));
9066
+ --muka-inputcounter-min: var(--size-3xl);
9067
+
9068
+ display: inline-flex;
9069
+ flex-direction: column;
9070
+ gap: var(--spacing-2);
9071
+ }
9072
+
9073
+ .muka-inputcounter--sm {
9074
+ --muka-inputcounter-height: var(--input-field-height-sm);
9075
+ --muka-inputcounter-pad: calc(var(--spacing-1) + var(--spacing-1));
9076
+ --muka-inputcounter-min: var(--size-2xl);
9077
+ }
9078
+
9079
+ .muka-inputcounter--lg {
9080
+ --muka-inputcounter-radius: var(--input-field-radius-lg);
9081
+ --muka-inputcounter-height: var(--input-field-height-lg);
9082
+ }
9083
+
9084
+ /* Label row — label, info tooltip trigger, optional hint */
9085
+ .muka-inputcounter__label-row {
9086
+ display: flex;
9087
+ align-items: center;
9088
+ gap: var(--spacing-2);
9089
+ min-height: var(--size-xl);
9090
+ }
9091
+
9092
+ .muka-inputcounter__info {
9093
+ display: inline-flex;
9094
+ align-items: center;
9095
+ justify-content: center;
9096
+ padding: 0;
9097
+ border: none;
9098
+ border-radius: 50%;
9099
+ background: transparent;
9100
+ cursor: pointer;
9101
+ }
9102
+
9103
+ .muka-inputcounter__info .muka-icon {
9104
+ color: var(--color-action-default);
9105
+ }
9106
+
9107
+ .muka-inputcounter__info:focus-visible {
9108
+ outline: 2px solid var(--color-border-focus);
9109
+ outline-offset: 2px;
9110
+ }
9111
+
9112
+ .muka-inputcounter__optional {
9113
+ font-family: var(--text-label-sm-regular-fontFamily);
9114
+ font-weight: var(--text-label-sm-regular-fontWeight);
9115
+ font-size: var(--text-label-sm-regular-fontSize);
9116
+ line-height: var(--text-label-sm-regular-lineHeight);
9117
+ color: var(--color-text-subtle-default);
9118
+ }
9119
+
9120
+ /* Field + button group */
9121
+ .muka-inputcounter__row {
9122
+ display: flex;
9123
+ align-items: center;
9124
+ gap: var(--spacing-3);
9125
+ }
9126
+
9127
+ /* Field — grows with the value (in ch), never narrower than the Figma width.
9128
+ Padding sits on the native input so the 2px focus/error border doesn't
9129
+ need compensating: content is centred in a fixed box. */
9130
+ .muka-inputcounter__field {
9131
+ position: relative;
9132
+ display: flex;
9133
+ align-items: center;
9134
+ box-sizing: border-box;
9135
+ height: var(--muka-inputcounter-height);
9136
+ width: calc(
9137
+ max(var(--muka-inputcounter-min), calc(var(--muka-inputcounter-chars, 1) * 1ch)) +
9138
+ 2 * var(--muka-inputcounter-pad) + 2 * var(--border-width-regular)
9139
+ );
9140
+ background-color: var(--input-field-color-default-background);
9141
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
9142
+ border-radius: var(--muka-inputcounter-radius);
9143
+ transition: border-color 0.2s ease, background-color 0.2s ease;
9144
+ }
9145
+
9146
+ .muka-inputcounter__field::after {
9147
+ content: '';
9148
+ position: absolute;
9149
+ inset: 0;
9150
+ border-radius: inherit;
9151
+ box-shadow: var(--shadow-sunken);
9152
+ pointer-events: none;
9153
+ }
9154
+
9155
+ .muka-inputcounter__field--focused:not(.muka-inputcounter__field--disabled) {
9156
+ border-width: var(--border-width-bold);
9157
+ border-color: var(--input-field-color-focus-border);
9158
+ background-color: var(--input-field-color-focus-background);
9159
+ }
9160
+
9161
+ .muka-inputcounter__field--error:not(.muka-inputcounter__field--disabled) {
9162
+ border-width: var(--border-width-bold);
9163
+ border-color: var(--input-field-color-error-border);
9164
+ background-color: var(--input-field-color-error-background);
9165
+ }
9166
+
9167
+ .muka-inputcounter__field--disabled {
9168
+ background-color: var(--input-field-color-disabled-background);
9169
+ border-color: var(--input-field-color-disabled-border);
9170
+ }
9171
+
9172
+ .muka-inputcounter__field--disabled::after {
9173
+ display: none;
9174
+ }
9175
+
9176
+ .muka-inputcounter__native {
9177
+ width: 100%;
9178
+ min-width: 0;
9179
+ height: 100%;
9180
+ box-sizing: border-box;
9181
+ padding: 0 calc(var(--muka-inputcounter-pad) - var(--border-width-regular));
9182
+ border: none;
9183
+ outline: none;
9184
+ background: transparent;
9185
+ text-align: center;
9186
+ font-variant-numeric: tabular-nums;
9187
+ color: var(--input-field-color-default-foreground);
9188
+ font-family: var(--text-input-md-fontFamily);
9189
+ font-weight: var(--text-input-md-fontWeight);
9190
+ font-size: var(--text-input-md-fontSize);
9191
+ line-height: var(--text-input-md-lineHeight);
9192
+ }
9193
+
9194
+ .muka-inputcounter--sm .muka-inputcounter__native {
9195
+ font-family: var(--text-input-sm-fontFamily);
9196
+ font-weight: var(--text-input-sm-fontWeight);
9197
+ font-size: var(--text-input-sm-fontSize);
9198
+ line-height: var(--text-input-sm-lineHeight);
9199
+ }
9200
+
9201
+ .muka-inputcounter__field--disabled .muka-inputcounter__native {
9202
+ color: var(--input-field-color-disabled-foreground);
9203
+ cursor: not-allowed;
9204
+ }
9205
+
9206
+ /* Button group — secondary icon-only Buttons joined by a divider.
9207
+ Only the outer corners are rounded. */
9208
+ .muka-inputcounter__group {
9209
+ display: inline-flex;
9210
+ align-items: stretch;
9211
+ }
9212
+
9213
+ .muka-inputcounter__group .muka-button {
9214
+ border-radius: 0;
9215
+ }
9216
+
9217
+ .muka-inputcounter__group .muka-button:first-child {
9218
+ border-start-start-radius: var(--muka-inputcounter-radius);
9219
+ border-end-start-radius: var(--muka-inputcounter-radius);
9220
+ }
9221
+
9222
+ .muka-inputcounter__group .muka-button:last-child {
9223
+ border-start-end-radius: var(--muka-inputcounter-radius);
9224
+ border-end-end-radius: var(--muka-inputcounter-radius);
9225
+ }
9226
+
9227
+ .muka-inputcounter__divider {
9228
+ flex: none;
9229
+ width: var(--border-width-regular);
9230
+ background-color: var(--color-border-default);
9231
+ }
9232
+
9233
+
8990
9234
  /* Input */
8991
9235
  /* Input Component Styles - Using Muka Design Tokens */
8992
9236
 
@@ -13425,6 +13669,39 @@ button.muka-chat-photo-grid__tile:focus-visible {
13425
13669
  opacity: 1; /* Remove opacity since we have proper disabled tokens */
13426
13670
  }
13427
13671
 
13672
+ /* Destructive variant - primary's structure on the solid error fill, for
13673
+ irreversible actions. Hover and pressed step away from the label color, so
13674
+ contrast never drops (darker in light themes, lighter in dark themes).
13675
+ Disabled is neutral grey rather than primary's brand-tinted fill. */
13676
+ .muka-button--destructive {
13677
+ background-color: var(--button-color-destructive-background-default);
13678
+ color: var(--button-color-destructive-foreground-default);
13679
+ box-shadow: var(--button-color-destructive-shadow-default);
13680
+ }
13681
+
13682
+ .muka-button--destructive:hover:not(:disabled) {
13683
+ background-color: var(--button-color-destructive-background-hover);
13684
+ color: var(--button-color-destructive-foreground-hover);
13685
+ box-shadow: var(--button-color-destructive-shadow-hover);
13686
+ }
13687
+
13688
+ .muka-button--destructive:active:not(:disabled),
13689
+ .muka-button--destructive.muka-button--pressed:not(:disabled),
13690
+ .muka-button--destructive[data-state="open"]:not(:disabled),
13691
+ .muka-button--destructive[aria-pressed="true"]:not(:disabled) {
13692
+ background-color: var(--button-color-destructive-background-pressed);
13693
+ color: var(--button-color-destructive-foreground-pressed);
13694
+ box-shadow: var(--button-color-destructive-shadow-pressed);
13695
+ }
13696
+
13697
+ .muka-button--destructive:disabled {
13698
+ background-color: var(--button-color-destructive-background-disabled);
13699
+ color: var(--button-color-destructive-foreground-disabled);
13700
+ box-shadow: var(--button-color-destructive-shadow-disabled);
13701
+ cursor: not-allowed;
13702
+ opacity: 1;
13703
+ }
13704
+
13428
13705
  /* Secondary variant - supporting actions, no border, only bottom inner shadow */
13429
13706
  .muka-button--secondary {
13430
13707
  background-color: var(--button-color-secondary-background-default);
@@ -14358,12 +14635,29 @@ button.muka-chat-photo-grid__tile:focus-visible {
14358
14635
  vertical-align: middle;
14359
14636
  background-color: var(--avatar-color-background-default);
14360
14637
  color: var(--avatar-color-foreground-default);
14361
- border: var(--avatar-border-width) solid var(--avatar-color-border-default);
14362
14638
  font-family: var(--alias-font-brand-family);
14363
14639
  font-weight: var(--alias-font-brand-weight-semibold);
14364
14640
  }
14365
14641
 
14366
14642
  /* Size variants */
14643
+ .muka-avatar--4xs {
14644
+ width: var(--avatar-size-4xs);
14645
+ height: var(--avatar-size-4xs);
14646
+ font-size: var(--avatar-font-size-3xs); /* only used by an AvatarGroup "+N" */
14647
+ }
14648
+
14649
+ .muka-avatar--3xs {
14650
+ width: var(--avatar-size-3xs);
14651
+ height: var(--avatar-size-3xs);
14652
+ font-size: var(--avatar-font-size-3xs);
14653
+ }
14654
+
14655
+ .muka-avatar--2xs {
14656
+ width: var(--avatar-size-2xs);
14657
+ height: var(--avatar-size-2xs);
14658
+ font-size: var(--avatar-font-size-2xs);
14659
+ }
14660
+
14367
14661
  .muka-avatar--xs {
14368
14662
  width: var(--avatar-size-xs);
14369
14663
  height: var(--avatar-size-xs);
@@ -14403,6 +14697,20 @@ button.muka-chat-photo-grid__tile:focus-visible {
14403
14697
  border-radius: var(--avatar-radius-square);
14404
14698
  }
14405
14699
 
14700
+ .muka-avatar--square.muka-avatar--4xs,
14701
+ .muka-avatar--square.muka-avatar--3xs,
14702
+ .muka-avatar--square.muka-avatar--2xs {
14703
+ border-radius: var(--avatar-radius-square-sm);
14704
+ }
14705
+
14706
+ /* 4xs is too small for initials, the fallback icon or a status dot:
14707
+ it shows the picture, or the plain background */
14708
+ .muka-avatar--4xs .muka-avatar__initials,
14709
+ .muka-avatar--4xs .muka-avatar__fallback,
14710
+ .muka-avatar--4xs .muka-avatar__status {
14711
+ display: none;
14712
+ }
14713
+
14406
14714
  /* Clickable state */
14407
14715
  .muka-avatar--clickable {
14408
14716
  cursor: pointer;
@@ -14506,6 +14814,16 @@ button.muka-chat-photo-grid__tile:focus-visible {
14506
14814
  box-sizing: border-box;
14507
14815
  }
14508
14816
 
14817
+ .muka-avatar--3xs .muka-avatar__status {
14818
+ width: var(--avatar-status-size-3xs);
14819
+ height: var(--avatar-status-size-3xs);
14820
+ }
14821
+
14822
+ .muka-avatar--2xs .muka-avatar__status {
14823
+ width: var(--avatar-status-size-2xs);
14824
+ height: var(--avatar-status-size-2xs);
14825
+ }
14826
+
14509
14827
  .muka-avatar--xs .muka-avatar__status {
14510
14828
  width: var(--avatar-status-size-xs);
14511
14829
  height: var(--avatar-status-size-xs);
@@ -14559,56 +14877,130 @@ button.muka-chat-photo-grid__tile:focus-visible {
14559
14877
  background-color: var(--avatar-color-status-away);
14560
14878
  }
14561
14879
 
14562
- /* Avatar Group */
14880
+ /* Avatar Group (Figma "Avatar Stack") */
14563
14881
  .muka-avatar-group {
14564
14882
  display: inline-flex;
14565
14883
  align-items: center;
14566
14884
  flex-direction: row;
14567
14885
  }
14568
14886
 
14887
+ /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
14569
14888
  .muka-avatar-group__item {
14570
14889
  position: relative;
14571
14890
  display: inline-flex;
14572
- border: 2px solid var(--color-surface-level1);
14573
- border-radius: inherit;
14891
+ z-index: 0;
14574
14892
  }
14575
14893
 
14576
- /* Add border radius to match avatar shape */
14577
- .muka-avatar-group__item .muka-avatar--circle {
14578
- border-radius: var(--avatar-radius-circle);
14894
+ .muka-avatar-group__item:hover {
14895
+ z-index: 10;
14579
14896
  }
14580
14897
 
14581
- .muka-avatar-group__item .muka-avatar--square {
14582
- border-radius: var(--avatar-radius-square);
14898
+ /* Grouped avatars get a ring outside their edge, drawn as a shadow so it
14899
+ does not change the avatar's size or the overlap */
14900
+ .muka-avatar-group__item .muka-avatar {
14901
+ box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14902
+ }
14903
+
14904
+ /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14905
+ other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14906
+ .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14907
+ .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
14908
+ .muka-avatar-group--2xs { --muka-avatar-group-size: var(--avatar-size-2xs); }
14909
+ .muka-avatar-group--xs { --muka-avatar-group-size: var(--avatar-size-xs); }
14910
+ .muka-avatar-group--sm { --muka-avatar-group-size: var(--avatar-size-sm); }
14911
+ .muka-avatar-group--md { --muka-avatar-group-size: var(--avatar-size-md); }
14912
+ .muka-avatar-group--lg { --muka-avatar-group-size: var(--avatar-size-lg); }
14913
+ .muka-avatar-group--xl { --muka-avatar-group-size: var(--avatar-size-xl); }
14914
+
14915
+ .muka-avatar-group--tight { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) * 2 / 3); }
14916
+ .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14917
+ .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14918
+
14919
+ .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14920
+ .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14921
+ .muka-avatar-group--tight.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-3xs); }
14922
+ .muka-avatar-group--compact.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-sm); }
14923
+ .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14924
+ .muka-avatar-group--compact.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-3xs); }
14925
+ .muka-avatar-group--spacious.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-sm); }
14926
+ .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14927
+ .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14928
+
14929
+ .muka-avatar-group__item:not(:first-child) {
14930
+ margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14583
14931
  }
14584
14932
 
14585
- .muka-avatar-group__item .muka-avatar {
14933
+ /* Overflow avatar styling */
14934
+ .muka-avatar--overflow {
14935
+ background-color: var(--avatar-color-background-default);
14936
+ color: var(--avatar-color-foreground-default);
14937
+ font-weight: var(--alias-font-brand-weight-semibold);
14938
+ }
14939
+
14940
+
14941
+ /* Autocomplete */
14942
+ /* Autocomplete — Figma Input Autocomplete (Input field + single-line suggestion Menu).
14943
+ The field reuses the Input styles (.muka-input*); only the menu wiring lives here. */
14944
+
14945
+ .muka-autocomplete {
14946
+ min-width: 200px;
14947
+ }
14948
+
14949
+ /* Covers the field's outer edge so the menu matches its full width. The menu
14950
+ is only open while focused, when the field has the bold border. */
14951
+ .muka-autocomplete__menu-anchor {
14952
+ position: absolute;
14953
+ inset: calc(-1 * var(--border-width-bold));
14954
+ z-index: 0;
14955
+ margin: 0;
14956
+ padding: 0;
14586
14957
  border: none;
14958
+ background: transparent;
14959
+ pointer-events: none;
14960
+ opacity: 0;
14587
14961
  }
14588
14962
 
14589
- /* Spacing variants for avatar group */
14590
- .muka-avatar-group--tight .muka-avatar-group__item:not(:first-child) {
14591
- margin-left: calc(var(--avatar-group-spacing-tight));
14963
+ /* Keep the field content above the invisible anchor. */
14964
+ .muka-autocomplete__field > :not(.muka-autocomplete__menu-anchor) {
14965
+ position: relative;
14966
+ z-index: 1;
14592
14967
  }
14593
14968
 
14594
- .muka-avatar-group--normal .muka-avatar-group__item:not(:first-child) {
14595
- margin-left: calc(var(--avatar-group-spacing-normal));
14969
+ /* Figma: the menu is as wide as the field (never below the menu min-width token). */
14970
+ .muka-autocomplete__menu {
14971
+ width: var(--radix-dropdown-menu-trigger-width);
14972
+ max-width: calc(100vw - 2rem);
14596
14973
  }
14597
14974
 
14598
- /* Z-index stacking for overlap effect */
14599
- .muka-avatar-group__item {
14600
- z-index: 0;
14975
+ /* Suggestions are single-line; long labels truncate. */
14976
+ .muka-autocomplete__menu .muka-menu__item-label {
14977
+ overflow: hidden;
14978
+ text-overflow: ellipsis;
14601
14979
  }
14602
14980
 
14603
- .muka-avatar-group__item:hover {
14604
- z-index: 10;
14981
+ /* Loading and empty rows: menu-row geometry, not selectable. */
14982
+ .muka-autocomplete__status {
14983
+ display: flex;
14984
+ align-items: center;
14985
+ gap: var(--menu-item-gap);
14986
+ min-height: var(--menu-item-height);
14987
+ padding: var(--menu-item-padding-y) var(--menu-item-padding-x);
14988
+ color: var(--color-text-subtle-default);
14989
+ font-family: var(--text-label-md-regular-fontFamily);
14990
+ font-size: var(--text-label-md-regular-fontSize);
14991
+ font-weight: var(--text-label-md-regular-fontWeight);
14992
+ line-height: var(--text-label-md-regular-lineHeight);
14605
14993
  }
14606
14994
 
14607
- /* Overflow avatar styling */
14608
- .muka-avatar--overflow {
14609
- background-color: var(--avatar-color-background-default);
14610
- color: var(--avatar-color-foreground-default);
14611
- font-weight: var(--alias-font-brand-weight-semibold);
14995
+ .muka-autocomplete__footer {
14996
+ flex-shrink: 0;
14997
+ padding: var(--spacing-2) var(--spacing-3);
14998
+ border-top: var(--border-width-regular) solid var(--color-border-default);
14999
+ color: var(--color-text-subtle-default);
15000
+ font-family: var(--text-label-sm-regular-fontFamily);
15001
+ font-size: var(--text-label-sm-regular-fontSize);
15002
+ font-weight: var(--text-label-sm-regular-fontWeight);
15003
+ line-height: var(--text-label-sm-regular-lineHeight);
14612
15004
  }
14613
15005
 
14614
15006