@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
@@ -377,6 +377,8 @@ body {
377
377
  --color-red-10: #dc3d43;
378
378
  --color-red-11: #cd2b31;
379
379
  --color-red-12: #381316;
380
+ --color-redStrong-1: #bd1524;
381
+ --color-redStrong-2: #ab001a;
380
382
  --color-ruby-1: #fffcfd;
381
383
  --color-ruby-2: #fff7f8;
382
384
  --color-ruby-3: #ffeef1;
@@ -1175,6 +1177,9 @@ body {
1175
1177
  --color-state-error-default: #e5484d;
1176
1178
  --color-state-error-contrast: #cd2b31;
1177
1179
  --color-state-error-background: #ffefef;
1180
+ --color-state-error-solid-default: #cd2b31;
1181
+ --color-state-error-solid-hover: #bd1524;
1182
+ --color-state-error-solid-pressed: #ab001a;
1178
1183
  --color-state-info-default: #0091ff;
1179
1184
  --color-state-info-contrast: #0d74ce;
1180
1185
  --color-state-info-background: #edf6ff;
@@ -1275,6 +1280,9 @@ body {
1275
1280
  --alias-color-state-error-contrast: #cd2b31;
1276
1281
  --alias-color-state-error-default: #e5484d;
1277
1282
  --alias-color-state-error-muted: #ffefef;
1283
+ --alias-color-state-error-solid-default: #cd2b31;
1284
+ --alias-color-state-error-solid-hover: #bd1524;
1285
+ --alias-color-state-error-solid-pressed: #ab001a;
1278
1286
  --alias-color-state-error-surface-level0: #fff8f8;
1279
1287
  --alias-color-state-error-surface-level1: #ffefef;
1280
1288
  --alias-color-state-error-surface-level2: #ffe5e5;
@@ -1571,6 +1579,18 @@ body {
1571
1579
  --button-color-primary-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1572
1580
  --button-color-primary-shadow-pressed: none;
1573
1581
  --button-color-primary-shadow-disabled: none;
1582
+ --button-color-destructive-background-default: #cd2b31;
1583
+ --button-color-destructive-background-hover: #bd1524;
1584
+ --button-color-destructive-background-pressed: #ab001a;
1585
+ --button-color-destructive-background-disabled: #e0e0e0;
1586
+ --button-color-destructive-foreground-default: #fcfcfc;
1587
+ --button-color-destructive-foreground-hover: #fcfcfc;
1588
+ --button-color-destructive-foreground-pressed: #fcfcfc;
1589
+ --button-color-destructive-foreground-disabled: #bbbbbb;
1590
+ --button-color-destructive-shadow-default: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1591
+ --button-color-destructive-shadow-hover: inset 0px -2px 0px 0px rgba(0, 0, 0, 0.090);
1592
+ --button-color-destructive-shadow-pressed: none;
1593
+ --button-color-destructive-shadow-disabled: none;
1574
1594
  --button-color-secondary-background-default: #e8e8e8;
1575
1595
  --button-color-secondary-background-hover: #e8e8e8;
1576
1596
  --button-color-secondary-background-pressed: #e0e0e0;
@@ -1935,7 +1955,7 @@ body {
1935
1955
  --contextmenu-trigger-outline-color: #113264;
1936
1956
  --contextmenu-trigger-outline-offset: 0.25rem;
1937
1957
  --tabs-trigger-color-default-background: #e8e8e8;
1938
- --tabs-trigger-color-default-foreground: #202020;
1958
+ --tabs-trigger-color-default-foreground: #838383;
1939
1959
  --tabs-trigger-color-default-border: #bbbbbb;
1940
1960
  --tabs-trigger-color-hover-background: #e8e8e8;
1941
1961
  --tabs-trigger-color-hover-foreground: #202020;
@@ -1950,8 +1970,16 @@ body {
1950
1970
  --tabs-trigger-padding-y: 0.5rem;
1951
1971
  --tabs-trigger-height: 3rem;
1952
1972
  --tabs-trigger-radius: 0px;
1973
+ --tabs-trigger-min-height-sm: 2.5rem;
1974
+ --tabs-trigger-min-height-md: 3.5rem;
1975
+ --tabs-trigger-min-height-lg: 5rem;
1953
1976
  --tabs-panel-background: #fcfcfc;
1954
1977
  --tabs-panel-border: #bbbbbb;
1978
+ --tabs-indicator-color: #113264;
1979
+ --tabs-indicator-height-sm: 2px;
1980
+ --tabs-indicator-height-md: 3px;
1981
+ --tabs-indicator-height-lg: 4px;
1982
+ --tabs-list-padding-x: 1rem;
1955
1983
  --separator-color-default: #e0e0e0;
1956
1984
  --separator-color-contrast: #bbbbbb;
1957
1985
  --separator-width: 0.0625rem;
@@ -1984,6 +2012,9 @@ body {
1984
2012
  --progress-size-circle-strokeWidth-sm: 0.25rem;
1985
2013
  --progress-size-circle-strokeWidth-md: 0.5rem;
1986
2014
  --progress-size-circle-strokeWidth-lg: 0.75rem;
2015
+ --avatar-size-4xs: 1rem;
2016
+ --avatar-size-3xs: 1.5rem;
2017
+ --avatar-size-2xs: 2rem;
1987
2018
  --avatar-size-xs: 2.5rem;
1988
2019
  --avatar-size-sm: 3rem;
1989
2020
  --avatar-size-md: 4rem;
@@ -1993,26 +2024,38 @@ body {
1993
2024
  --avatar-color-background-loading: #e0e0e0;
1994
2025
  --avatar-color-foreground-default: #202020;
1995
2026
  --avatar-color-foreground-muted: #bbbbbb;
1996
- --avatar-color-border-default: #e0e0e0;
1997
2027
  --avatar-color-status-online: #30a46c;
1998
2028
  --avatar-color-status-offline: #bbbbbb;
1999
2029
  --avatar-color-status-busy: #e5484d;
2000
2030
  --avatar-color-status-away: #ffc53d;
2001
2031
  --avatar-radius-circle: 999rem;
2002
2032
  --avatar-radius-square: 0px;
2033
+ --avatar-radius-square-sm: 0px;
2034
+ --avatar-font-size-3xs: 0.75rem;
2035
+ --avatar-font-size-2xs: 0.75rem;
2003
2036
  --avatar-font-size-xs: 0.75rem;
2004
2037
  --avatar-font-size-sm: 0.875rem;
2005
2038
  --avatar-font-size-md: 1.125rem;
2006
2039
  --avatar-font-size-lg: 1.25rem;
2007
2040
  --avatar-font-size-xl: 1.5rem;
2041
+ --avatar-status-size-3xs: 0.5rem;
2042
+ --avatar-status-size-2xs: 0.5rem;
2008
2043
  --avatar-status-size-xs: 0.5rem;
2009
2044
  --avatar-status-size-sm: 0.75rem;
2010
2045
  --avatar-status-size-md: 1rem;
2011
2046
  --avatar-status-size-lg: 1.25rem;
2012
2047
  --avatar-status-size-xl: 1.5rem;
2013
- --avatar-border-width: 1px;
2014
- --avatar-group-spacing-tight: -0.5rem;
2015
- --avatar-group-spacing-normal: -0.25rem;
2048
+ --avatar-group-ring-width: 0.125rem;
2049
+ --avatar-group-ring-color: #fcfcfc;
2050
+ --avatar-group-overlap-tight-sm: 2rem;
2051
+ --avatar-group-overlap-tight-2xs: 1.25rem;
2052
+ --avatar-group-overlap-tight-3xs: 1rem;
2053
+ --avatar-group-overlap-compact-sm: 1.5rem;
2054
+ --avatar-group-overlap-compact-2xs: 1rem;
2055
+ --avatar-group-overlap-compact-3xs: 0.75rem;
2056
+ --avatar-group-overlap-spacious-sm: 1rem;
2057
+ --avatar-group-overlap-spacious-2xs: 0.75rem;
2058
+ --avatar-group-overlap-spacious-3xs: 0.5rem;
2016
2059
  --toast-color-info-background: #202020;
2017
2060
  --toast-color-info-foreground: #fcfcfc;
2018
2061
  --toast-color-info-accent: #edf6ff;
@@ -2418,116 +2461,6 @@ body {
2418
2461
  }
2419
2462
 
2420
2463
 
2421
- /* View */
2422
- /* View Component Styles */
2423
-
2424
- /* ─── Base layout ─────────────────────────────────────── */
2425
-
2426
- .muka-view {
2427
- display: flex;
2428
- flex-direction: column;
2429
- height: 100dvh;
2430
- background-color: var(--view-color-background);
2431
- position: relative;
2432
- isolation: isolate;
2433
- box-sizing: border-box;
2434
-
2435
- /* Width reserved for the footer nav once it becomes a left sidebar at the
2436
- large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2437
- --view-sidebar-width: 240px;
2438
- }
2439
-
2440
- /* ─── Surface level variants ─────────────────────────── */
2441
-
2442
- .muka-view--surface-3 {
2443
- background-color: var(--color-surface-level3);
2444
- }
2445
-
2446
- /* ─── Large screens: make room for the left sidebar ──────────
2447
- A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2448
- ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2449
- actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2450
- the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2451
- for a sidebar that hasn't rendered yet. */
2452
- @media (min-width: 1024px) {
2453
- .muka-view:has(.muka-bottombar--desktop-sidebar) {
2454
- padding-left: var(--view-sidebar-width);
2455
- }
2456
- }
2457
-
2458
- /* ─── TopBar elevation ────────────────────────────────── */
2459
-
2460
- .muka-view .muka-topbar {
2461
- flex-shrink: 0;
2462
- z-index: 3;
2463
- box-shadow: var(--shadow-level2);
2464
- }
2465
-
2466
- /* ─── Scrollable body ─────────────────────────────────── */
2467
-
2468
- .muka-view__body {
2469
- flex: 1 1 0%;
2470
- min-height: 0;
2471
- overflow-y: auto;
2472
- overflow-x: clip;
2473
- z-index: 1;
2474
-
2475
- /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2476
- content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2477
- reveal the content underneath. */
2478
- display: flex;
2479
- flex-direction: column;
2480
- }
2481
-
2482
- /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2483
- using the alias-layer section/container tokens, while the body scrolls full
2484
- width. Full-bleed below large. */
2485
- .muka-view__body-inner {
2486
- width: 100%;
2487
- /* Grow on short content so the sticky footer is pushed to the bottom rather
2488
- than floating mid-screen. */
2489
- flex: 1 0 auto;
2490
- }
2491
-
2492
- @media (min-width: 1024px) {
2493
- .muka-view:not([data-size]) .muka-view__body-inner {
2494
- max-width: var(--container-max-width-xl);
2495
- margin-inline: auto;
2496
- padding-inline: var(--section-padding-horizontal-default);
2497
- }
2498
- }
2499
-
2500
- .muka-view[data-size='lg'] .muka-view__body-inner {
2501
- max-width: var(--container-max-width-xl);
2502
- margin-inline: auto;
2503
- padding-inline: var(--section-padding-horizontal-default);
2504
- }
2505
-
2506
- /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2507
-
2508
- .muka-view__footer {
2509
- position: sticky;
2510
- bottom: 0;
2511
- flex-shrink: 0;
2512
- z-index: 2;
2513
- }
2514
-
2515
- /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2516
- navigation at the large tier, so hide a footer that holds a navigation bar.
2517
- Scoped to `.muka-app-shell` so bare Views (and the standalone
2518
- desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2519
- (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2520
- @media (min-width: 1024px) {
2521
- .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2522
- display: none;
2523
- }
2524
- }
2525
-
2526
- .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2527
- display: none;
2528
- }
2529
-
2530
-
2531
2464
  /* Typography */
2532
2465
  .muka-typography-catalog {
2533
2466
  display: flex;
@@ -2878,166 +2811,113 @@ body {
2878
2811
  }
2879
2812
 
2880
2813
 
2881
- /* Toggle */
2882
- /* Toggle Component Styles - Using Muka Design Tokens */
2814
+ /* View */
2815
+ /* View Component Styles */
2883
2816
 
2884
- /* Wrapper container */
2885
- .muka-toggle {
2817
+ /* ─── Base layout ─────────────────────────────────────── */
2818
+
2819
+ .muka-view {
2886
2820
  display: flex;
2887
- align-items: center;
2888
- gap: var(--spacing-2);
2821
+ flex-direction: column;
2822
+ height: 100dvh;
2823
+ background-color: var(--view-color-background);
2889
2824
  position: relative;
2890
- padding: var(--spacing-4) 0;
2825
+ isolation: isolate;
2826
+ box-sizing: border-box;
2827
+
2828
+ /* Width reserved for the footer nav once it becomes a left sidebar at the
2829
+ large tier (matches BottomBar's desktopAs="sidebar" rail width). */
2830
+ --view-sidebar-width: 240px;
2891
2831
  }
2892
2832
 
2893
- .muka-toggle--with-caption {
2894
- padding: var(--spacing-5) 0;
2833
+ /* ─── Surface level variants ─────────────────────────── */
2834
+
2835
+ .muka-view--surface-3 {
2836
+ background-color: var(--color-surface-level3);
2895
2837
  }
2896
2838
 
2897
- .muka-toggle--disabled {
2898
- opacity: 0.6;
2839
+ /* ─── Large screens: make room for the left sidebar ──────────
2840
+ A footer nav with desktopAs="sidebar" becomes a fixed 240px left rail at
2841
+ ≥1024px. Offset the shell so the TopBar/body clear it — tied to the sidebar's
2842
+ actual presence (the `.muka-bottombar--desktop-sidebar` element) rather than
2843
+ the View's `size`, so a forced `size="lg"` below 1024px never reserves space
2844
+ for a sidebar that hasn't rendered yet. */
2845
+ @media (min-width: 1024px) {
2846
+ .muka-view:has(.muka-bottombar--desktop-sidebar) {
2847
+ padding-left: var(--view-sidebar-width);
2848
+ }
2899
2849
  }
2900
2850
 
2901
- /* Icon */
2902
- .muka-toggle__icon {
2903
- display: flex;
2904
- align-items: center;
2905
- justify-content: center;
2851
+ /* ─── TopBar elevation ────────────────────────────────── */
2852
+
2853
+ .muka-view .muka-topbar {
2906
2854
  flex-shrink: 0;
2907
- width: var(--icon-size-default);
2908
- height: var(--icon-size-default);
2909
- color: var(--color-text-default-default);
2855
+ z-index: 3;
2856
+ box-shadow: var(--shadow-level2);
2910
2857
  }
2911
2858
 
2912
- .muka-toggle__icon svg {
2913
- width: 100%;
2914
- height: 100%;
2915
- }
2859
+ /* ─── Scrollable body ─────────────────────────────────── */
2916
2860
 
2917
- /* Content area (label + caption) */
2918
- .muka-toggle__content {
2861
+ .muka-view__body {
2862
+ flex: 1 1 0%;
2863
+ min-height: 0;
2864
+ overflow-y: auto;
2865
+ overflow-x: clip;
2866
+ z-index: 1;
2867
+
2868
+ /* Column flow so the footer (now a scroll-area child) can pin to the bottom and
2869
+ content scrolls *behind* it — letting a floating BottomBar's frosted backdrop
2870
+ reveal the content underneath. */
2919
2871
  display: flex;
2920
2872
  flex-direction: column;
2921
- flex: 1;
2922
- min-width: 0;
2923
- gap: var(--spacing-1);
2924
2873
  }
2925
2874
 
2926
- /* Label */
2927
- .muka-toggle__label {
2928
- font-family: var(--text-label-lg-regular-fontFamily);
2929
- font-weight: var(--text-label-lg-regular-fontWeight);
2930
- font-size: var(--text-label-lg-regular-fontSize);
2931
- line-height: var(--text-label-lg-regular-lineHeight);
2932
- color: var(--color-text-default-default);
2933
- cursor: pointer;
2875
+ /* Inner wrapper constrains content width at the large tier (enterprise desktop)
2876
+ using the alias-layer section/container tokens, while the body scrolls full
2877
+ width. Full-bleed below large. */
2878
+ .muka-view__body-inner {
2879
+ width: 100%;
2880
+ /* Grow on short content so the sticky footer is pushed to the bottom rather
2881
+ than floating mid-screen. */
2882
+ flex: 1 0 auto;
2934
2883
  }
2935
2884
 
2936
- .muka-toggle--with-caption .muka-toggle__label {
2937
- font-family: var(--text-label-lg-semibold-fontFamily);
2938
- font-weight: var(--text-label-lg-semibold-fontWeight);
2939
- font-size: var(--text-label-lg-semibold-fontSize);
2940
- line-height: var(--text-label-lg-semibold-lineHeight);
2885
+ @media (min-width: 1024px) {
2886
+ .muka-view:not([data-size]) .muka-view__body-inner {
2887
+ max-width: var(--container-max-width-xl);
2888
+ margin-inline: auto;
2889
+ padding-inline: var(--section-padding-horizontal-default);
2890
+ }
2941
2891
  }
2942
2892
 
2943
- .muka-toggle--disabled .muka-toggle__label {
2944
- color: var(--color-text-subtle-default);
2945
- cursor: not-allowed;
2893
+ .muka-view[data-size='lg'] .muka-view__body-inner {
2894
+ max-width: var(--container-max-width-xl);
2895
+ margin-inline: auto;
2896
+ padding-inline: var(--section-padding-horizontal-default);
2946
2897
  }
2947
2898
 
2948
- /* Caption */
2949
- .muka-toggle__caption {
2950
- font-family: var(--text-body-base-regular-fontFamily);
2951
- font-weight: var(--text-body-base-regular-fontWeight);
2952
- font-size: var(--text-body-base-regular-fontSize);
2953
- line-height: var(--text-body-base-regular-lineHeight);
2954
- color: var(--color-text-subtle-default);
2955
- }
2899
+ /* ─── Footer (e.g. BottomBar) ─────────────────────────── */
2956
2900
 
2957
- /* Switch container */
2958
- .muka-toggle__switch {
2959
- position: relative;
2960
- display: inline-flex;
2901
+ .muka-view__footer {
2902
+ position: sticky;
2903
+ bottom: 0;
2961
2904
  flex-shrink: 0;
2962
- cursor: pointer;
2905
+ z-index: 2;
2963
2906
  }
2964
2907
 
2965
- .muka-toggle--disabled .muka-toggle__switch {
2966
- cursor: not-allowed;
2908
+ /* Inside an AppShell, the persistent left rail replaces the per-view bottom
2909
+ navigation at the large tier, so hide a footer that holds a navigation bar.
2910
+ Scoped to `.muka-app-shell` so bare Views (and the standalone
2911
+ desktopAs="sidebar" footer pattern above) are unaffected. Action-bar footers
2912
+ (`.muka-bottombar--actions`) don't match and remain at the bottom. */
2913
+ @media (min-width: 1024px) {
2914
+ .muka-app-shell .muka-view__footer:has(.muka-bottombar--navigation) {
2915
+ display: none;
2916
+ }
2967
2917
  }
2968
2918
 
2969
- /* Hidden native input */
2970
- .muka-toggle__input {
2971
- position: absolute;
2972
- width: 1px;
2973
- height: 1px;
2974
- padding: 0;
2975
- margin: -1px;
2976
- overflow: hidden;
2977
- clip: rect(0, 0, 0, 0);
2978
- white-space: nowrap;
2979
- border: 0;
2980
- }
2981
-
2982
- /* Track (background pill) */
2983
- .muka-toggle__track {
2984
- display: flex;
2985
- align-items: center;
2986
- width: var(--toggle-track-width);
2987
- height: var(--toggle-track-height);
2988
- border-radius: var(--toggle-track-radius);
2989
- background-color: var(--toggle-track-color-off);
2990
- transition: background-color 0.2s ease;
2991
- box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
2992
- position: relative;
2993
- }
2994
-
2995
- /* Knob (sliding circle) */
2996
- .muka-toggle__knob {
2997
- position: absolute;
2998
- width: var(--toggle-knob-size);
2999
- height: var(--toggle-knob-size);
3000
- border-radius: var(--border-radius-full);
3001
- background-color: var(--toggle-knob-color-default);
3002
- box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3003
- left: var(--toggle-knob-offset);
3004
- transition: left 0.2s ease, transform 0.2s ease;
3005
- }
3006
-
3007
- /* Focus state */
3008
- .muka-toggle__input:focus-visible + .muka-toggle__track {
3009
- outline: 2px solid var(--color-border-focus);
3010
- outline-offset: 2px;
3011
- }
3012
-
3013
- /* Checked (on) state */
3014
- .muka-toggle__input:checked + .muka-toggle__track {
3015
- background-color: var(--toggle-track-color-on);
3016
- }
3017
-
3018
- .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3019
- left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3020
- }
3021
-
3022
- /* Disabled state */
3023
- .muka-toggle--disabled .muka-toggle__track {
3024
- background-color: var(--toggle-track-color-disabled);
3025
- box-shadow: none;
3026
- }
3027
-
3028
- .muka-toggle--disabled .muka-toggle__knob {
3029
- background-color: var(--toggle-knob-color-disabled);
3030
- box-shadow: none;
3031
- }
3032
-
3033
- /* Divider */
3034
- .muka-toggle__divider {
3035
- position: absolute;
3036
- bottom: 0;
3037
- left: 0;
3038
- right: 0;
3039
- height: 1px;
3040
- background-color: var(--color-border-muted);
2919
+ .muka-app-shell[data-size='lg'] .muka-view__footer:has(.muka-bottombar--navigation) {
2920
+ display: none;
3041
2921
  }
3042
2922
 
3043
2923
 
@@ -3766,249 +3646,166 @@ body {
3766
3646
  }
3767
3647
 
3768
3648
 
3769
- /* Textarea */
3770
- /* Textarea Component Styles - Using Muka Design Tokens */
3649
+ /* Toggle */
3650
+ /* Toggle Component Styles - Using Muka Design Tokens */
3771
3651
 
3772
- .muka-textarea {
3773
- display: inline-flex;
3774
- flex-direction: column;
3652
+ /* Wrapper container */
3653
+ .muka-toggle {
3654
+ display: flex;
3655
+ align-items: center;
3775
3656
  gap: var(--spacing-2);
3657
+ position: relative;
3658
+ padding: var(--spacing-4) 0;
3776
3659
  }
3777
3660
 
3778
- /* Label */
3779
- .muka-textarea__label {
3661
+ .muka-toggle--with-caption {
3662
+ padding: var(--spacing-5) 0;
3663
+ }
3664
+
3665
+ .muka-toggle--disabled {
3666
+ opacity: 0.6;
3667
+ }
3668
+
3669
+ /* Icon */
3670
+ .muka-toggle__icon {
3671
+ display: flex;
3672
+ align-items: center;
3673
+ justify-content: center;
3674
+ flex-shrink: 0;
3675
+ width: var(--icon-size-default);
3676
+ height: var(--icon-size-default);
3780
3677
  color: var(--color-text-default-default);
3781
- cursor: pointer;
3782
3678
  }
3783
3679
 
3784
- .muka-textarea__label--sm {
3785
- font-family: var(--text-label-sm-semibold-fontFamily);
3786
- font-weight: var(--text-label-sm-semibold-fontWeight);
3787
- font-size: var(--text-label-sm-semibold-fontSize);
3788
- line-height: var(--text-label-sm-semibold-lineHeight);
3680
+ .muka-toggle__icon svg {
3681
+ width: 100%;
3682
+ height: 100%;
3789
3683
  }
3790
3684
 
3791
- .muka-textarea__label--md {
3792
- font-family: var(--text-label-md-semibold-fontFamily);
3793
- font-weight: var(--text-label-md-semibold-fontWeight);
3794
- font-size: var(--text-label-md-semibold-fontSize);
3795
- line-height: var(--text-label-md-semibold-lineHeight);
3685
+ /* Content area (label + caption) */
3686
+ .muka-toggle__content {
3687
+ display: flex;
3688
+ flex-direction: column;
3689
+ flex: 1;
3690
+ min-width: 0;
3691
+ gap: var(--spacing-1);
3796
3692
  }
3797
3693
 
3798
- .muka-textarea__label--lg {
3694
+ /* Label */
3695
+ .muka-toggle__label {
3696
+ font-family: var(--text-label-lg-regular-fontFamily);
3697
+ font-weight: var(--text-label-lg-regular-fontWeight);
3698
+ font-size: var(--text-label-lg-regular-fontSize);
3699
+ line-height: var(--text-label-lg-regular-lineHeight);
3700
+ color: var(--color-text-default-default);
3701
+ cursor: pointer;
3702
+ }
3703
+
3704
+ .muka-toggle--with-caption .muka-toggle__label {
3799
3705
  font-family: var(--text-label-lg-semibold-fontFamily);
3800
3706
  font-weight: var(--text-label-lg-semibold-fontWeight);
3801
3707
  font-size: var(--text-label-lg-semibold-fontSize);
3802
3708
  line-height: var(--text-label-lg-semibold-lineHeight);
3803
3709
  }
3804
3710
 
3805
- .muka-textarea__required {
3806
- color: var(--color-state-error-default);
3711
+ .muka-toggle--disabled .muka-toggle__label {
3712
+ color: var(--color-text-subtle-default);
3713
+ cursor: not-allowed;
3807
3714
  }
3808
3715
 
3809
- /* Field container */
3810
- .muka-textarea__field {
3811
- display: flex;
3812
- background-color: var(--input-field-color-default-background);
3813
- border: var(--border-width-regular) solid var(--input-field-color-default-border);
3814
- border-radius: var(--input-field-radius-md);
3815
- padding: var(--input-field-padding-y) var(--input-field-padding-x);
3816
- transition: border-color 0.2s ease, background-color 0.2s ease;
3817
- box-sizing: border-box;
3716
+ /* Caption */
3717
+ .muka-toggle__caption {
3718
+ font-family: var(--text-body-base-regular-fontFamily);
3719
+ font-weight: var(--text-body-base-regular-fontWeight);
3720
+ font-size: var(--text-body-base-regular-fontSize);
3721
+ line-height: var(--text-body-base-regular-lineHeight);
3722
+ color: var(--color-text-subtle-default);
3818
3723
  }
3819
3724
 
3820
- .muka-textarea__field--sm {
3821
- min-height: var(--input-textarea-height-sm);
3822
- border-radius: var(--input-field-radius-sm);
3725
+ /* Switch container */
3726
+ .muka-toggle__switch {
3727
+ position: relative;
3728
+ display: inline-flex;
3729
+ flex-shrink: 0;
3730
+ cursor: pointer;
3823
3731
  }
3824
3732
 
3825
- .muka-textarea__field--md {
3826
- min-height: var(--input-textarea-height-default);
3827
- border-radius: var(--input-field-radius-md);
3733
+ .muka-toggle--disabled .muka-toggle__switch {
3734
+ cursor: not-allowed;
3828
3735
  }
3829
3736
 
3830
- .muka-textarea__field--lg {
3831
- min-height: var(--input-textarea-height-lg);
3832
- border-radius: var(--input-field-radius-lg);
3737
+ /* Hidden native input */
3738
+ .muka-toggle__input {
3739
+ position: absolute;
3740
+ width: 1px;
3741
+ height: 1px;
3742
+ padding: 0;
3743
+ margin: -1px;
3744
+ overflow: hidden;
3745
+ clip: rect(0, 0, 0, 0);
3746
+ white-space: nowrap;
3747
+ border: 0;
3833
3748
  }
3834
3749
 
3835
- /* Focus state */
3836
- .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
3837
- border-width: var(--border-width-bold);
3838
- border-color: var(--input-field-color-focus-border);
3839
- background-color: var(--input-field-color-focus-background);
3840
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3750
+ /* Track (background pill) */
3751
+ .muka-toggle__track {
3752
+ display: flex;
3753
+ align-items: center;
3754
+ width: var(--toggle-track-width);
3755
+ height: var(--toggle-track-height);
3756
+ border-radius: var(--toggle-track-radius);
3757
+ background-color: var(--toggle-track-color-off);
3758
+ transition: background-color 0.2s ease;
3759
+ box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.16);
3760
+ position: relative;
3841
3761
  }
3842
3762
 
3843
- /* Error state */
3844
- .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
3845
- border-width: var(--border-width-bold);
3846
- border-color: var(--input-field-color-error-border);
3847
- background-color: var(--input-field-color-error-background);
3848
- padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
3763
+ /* Knob (sliding circle) */
3764
+ .muka-toggle__knob {
3765
+ position: absolute;
3766
+ width: var(--toggle-knob-size);
3767
+ height: var(--toggle-knob-size);
3768
+ border-radius: var(--border-radius-full);
3769
+ background-color: var(--toggle-knob-color-default);
3770
+ box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.1);
3771
+ left: var(--toggle-knob-offset);
3772
+ transition: left 0.2s ease, transform 0.2s ease;
3849
3773
  }
3850
3774
 
3851
- /* Disabled state */
3852
- .muka-textarea__field--disabled {
3853
- background-color: var(--input-field-color-disabled-background);
3854
- border-color: var(--input-field-color-disabled-border);
3855
- cursor: not-allowed;
3775
+ /* Focus state */
3776
+ .muka-toggle__input:focus-visible + .muka-toggle__track {
3777
+ outline: 2px solid var(--color-border-focus);
3778
+ outline-offset: 2px;
3856
3779
  }
3857
3780
 
3858
- /* Native textarea */
3859
- .muka-textarea__native {
3860
- flex: 1;
3861
- border: none;
3862
- outline: none;
3863
- background: transparent;
3864
- color: var(--input-field-color-default-foreground);
3865
- font-family: var(--text-input-md-fontFamily);
3866
- font-weight: var(--text-input-md-fontWeight);
3867
- font-size: var(--text-input-md-fontSize);
3868
- line-height: var(--text-input-md-lineHeight);
3869
- padding: 0;
3870
- width: 100%;
3871
- min-width: 0;
3781
+ /* Checked (on) state */
3782
+ .muka-toggle__input:checked + .muka-toggle__track {
3783
+ background-color: var(--toggle-track-color-on);
3872
3784
  }
3873
3785
 
3874
- .muka-textarea__field--sm .muka-textarea__native {
3875
- font-family: var(--text-input-sm-fontFamily);
3876
- font-weight: var(--text-input-sm-fontWeight);
3877
- font-size: var(--text-input-sm-fontSize);
3878
- line-height: var(--text-input-sm-lineHeight);
3786
+ .muka-toggle__input:checked + .muka-toggle__track .muka-toggle__knob {
3787
+ left: calc(var(--toggle-track-width) - var(--toggle-knob-size) - var(--toggle-knob-offset));
3879
3788
  }
3880
3789
 
3881
- .muka-textarea__field--lg .muka-textarea__native {
3882
- font-family: var(--text-input-lg-fontFamily);
3883
- font-weight: var(--text-input-lg-fontWeight);
3884
- font-size: var(--text-input-lg-fontSize);
3885
- line-height: var(--text-input-lg-lineHeight);
3790
+ /* Disabled state */
3791
+ .muka-toggle--disabled .muka-toggle__track {
3792
+ background-color: var(--toggle-track-color-disabled);
3793
+ box-shadow: none;
3886
3794
  }
3887
3795
 
3888
- .muka-textarea__native::placeholder {
3889
- color: var(--color-text-subtle-default);
3796
+ .muka-toggle--disabled .muka-toggle__knob {
3797
+ background-color: var(--toggle-knob-color-disabled);
3798
+ box-shadow: none;
3890
3799
  }
3891
3800
 
3892
- .muka-textarea__field--disabled .muka-textarea__native {
3893
- color: var(--input-field-color-disabled-foreground);
3894
- cursor: not-allowed;
3895
- }
3896
-
3897
- /* Footer (helper/error + count) */
3898
- .muka-textarea__footer {
3899
- display: flex;
3900
- justify-content: space-between;
3901
- align-items: flex-start;
3902
- gap: var(--spacing-2);
3903
- }
3904
-
3905
- .muka-textarea__helper {
3906
- font-family: var(--text-label-sm-regular-fontFamily);
3907
- font-weight: var(--text-label-sm-regular-fontWeight);
3908
- font-size: var(--text-label-sm-regular-fontSize);
3909
- line-height: var(--text-label-sm-regular-lineHeight);
3910
- color: var(--color-text-subtle-default);
3911
- margin: 0;
3912
- }
3913
-
3914
- .muka-textarea__error {
3915
- font-family: var(--text-label-sm-regular-fontFamily);
3916
- font-weight: var(--text-label-sm-regular-fontWeight);
3917
- font-size: var(--text-label-sm-regular-fontSize);
3918
- line-height: var(--text-label-sm-regular-lineHeight);
3919
- color: var(--color-state-error-default);
3920
- margin: 0;
3921
- }
3922
-
3923
- .muka-textarea__count {
3924
- font-family: var(--text-label-sm-regular-fontFamily);
3925
- font-weight: var(--text-label-sm-regular-fontWeight);
3926
- font-size: var(--text-label-sm-regular-fontSize);
3927
- line-height: var(--text-label-sm-regular-lineHeight);
3928
- color: var(--color-text-subtle-default);
3929
- margin-left: auto;
3930
- }
3931
-
3932
-
3933
- /* TextLink */
3934
- /* TextLink Component Styles - Using Muka Design Tokens */
3935
-
3936
- .muka-text-link {
3937
- display: inline;
3938
- cursor: pointer;
3939
- text-decoration: underline;
3940
- /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
3941
- text-underline-offset: 0.2em;
3942
- text-decoration-thickness: from-font;
3943
- /* Rounds the focus ring's corners; the link itself has no visible box. */
3944
- border-radius: var(--border-radius-sm);
3945
- transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
3946
- }
3947
-
3948
- /* ─── Sizes ───────────────────────────────────────────────
3949
- Mirrors the body text scale so a link matches the copy it sits in. */
3950
- .muka-text-link--sm {
3951
- font-family: var(--text-body-sm-regular-fontFamily);
3952
- font-weight: var(--text-body-sm-regular-fontWeight);
3953
- font-size: var(--text-body-sm-regular-fontSize);
3954
- line-height: var(--text-body-sm-regular-lineHeight);
3955
- }
3956
-
3957
- .muka-text-link--base {
3958
- font-family: var(--text-body-base-regular-fontFamily);
3959
- font-weight: var(--text-body-base-regular-fontWeight);
3960
- font-size: var(--text-body-base-regular-fontSize);
3961
- line-height: var(--text-body-base-regular-lineHeight);
3962
- }
3963
-
3964
- .muka-text-link--lg {
3965
- font-family: var(--text-body-lg-regular-fontFamily);
3966
- font-weight: var(--text-body-lg-regular-fontWeight);
3967
- font-size: var(--text-body-lg-regular-fontSize);
3968
- line-height: var(--text-body-lg-regular-lineHeight);
3969
- }
3970
-
3971
- /* ─── Variant: default (accent) ───────────────────────────
3972
- Visited repeats the default colour on purpose: the design treats visited and
3973
- default the same, and pinning it stops the browser's purple from showing. */
3974
- .muka-text-link--default,
3975
- .muka-text-link--default:visited {
3976
- color: var(--color-text-action-default);
3977
- }
3978
-
3979
- .muka-text-link--default:hover,
3980
- .muka-text-link--default:focus-visible {
3981
- color: var(--color-text-action-hover);
3982
- }
3983
-
3984
- .muka-text-link--default:active {
3985
- color: var(--color-text-action-pressed);
3986
- }
3987
-
3988
- /* ─── Variant: subtle (neutral) ───────────────────────────
3989
- Hover, focus and pressed all darken to the default text colour. */
3990
- .muka-text-link--subtle,
3991
- .muka-text-link--subtle:visited {
3992
- color: var(--color-text-subtle-default);
3993
- }
3994
-
3995
- .muka-text-link--subtle:hover,
3996
- .muka-text-link--subtle:focus-visible,
3997
- .muka-text-link--subtle:active {
3998
- color: var(--color-text-default-default);
3999
- }
4000
-
4001
- /* ─── Focus ───────────────────────────────────────────────
4002
- Same ring as every other focusable Muka component. */
4003
- .muka-text-link:focus-visible {
4004
- outline: 2px solid var(--color-border-focus);
4005
- outline-offset: 2px;
4006
- }
4007
-
4008
- @media (prefers-reduced-motion: reduce) {
4009
- .muka-text-link {
4010
- transition: none;
4011
- }
3801
+ /* Divider */
3802
+ .muka-toggle__divider {
3803
+ position: absolute;
3804
+ bottom: 0;
3805
+ left: 0;
3806
+ right: 0;
3807
+ height: 1px;
3808
+ background-color: var(--color-border-muted);
4012
3809
  }
4013
3810
 
4014
3811
 
@@ -4043,12 +3840,17 @@ body {
4043
3840
  border-bottom: 1px solid var(--tabs-trigger-color-default-border);
4044
3841
  }
4045
3842
 
3843
+ /* Padding: inset the tabs; the divider (border) still spans the full width */
3844
+ .muka-tabs--padding-default .muka-tabs__list {
3845
+ padding-inline: var(--tabs-list-padding-x);
3846
+ }
3847
+
4046
3848
  /* Tab Trigger — clean underline style */
4047
3849
  .muka-tabs__trigger {
4048
3850
  display: inline-flex;
4049
3851
  align-items: center;
4050
3852
  justify-content: center;
4051
- gap: var(--spacing-2, 8px);
3853
+ gap: var(--spacing-1);
4052
3854
  background: transparent;
4053
3855
  border: none;
4054
3856
  cursor: pointer;
@@ -4061,8 +3863,8 @@ body {
4061
3863
  color: var(--tabs-trigger-color-default-foreground);
4062
3864
 
4063
3865
  /* Default MD size values */
4064
- height: 48px;
4065
- padding: 0 var(--spacing-3, 12px);
3866
+ min-height: var(--tabs-trigger-min-height-md);
3867
+ padding: var(--spacing-3);
4066
3868
  font-family: var(--text-label-md-regular-fontFamily);
4067
3869
  font-weight: var(--text-label-md-regular-fontWeight);
4068
3870
  font-size: var(--text-label-md-regular-fontSize);
@@ -4071,8 +3873,8 @@ body {
4071
3873
 
4072
3874
  /* Size Variants */
4073
3875
  .muka-tabs--size-sm .muka-tabs__trigger {
4074
- height: 36px;
4075
- padding: 0 var(--spacing-2, 8px);
3876
+ min-height: var(--tabs-trigger-min-height-sm);
3877
+ padding: 0 var(--spacing-2);
4076
3878
  font-family: var(--text-label-sm-regular-fontFamily);
4077
3879
  font-weight: var(--text-label-sm-regular-fontWeight);
4078
3880
  font-size: var(--text-label-sm-regular-fontSize);
@@ -4080,8 +3882,8 @@ body {
4080
3882
  }
4081
3883
 
4082
3884
  .muka-tabs--size-lg .muka-tabs__trigger {
4083
- height: 56px;
4084
- padding: 0 var(--spacing-4, 16px);
3885
+ min-height: var(--tabs-trigger-min-height-lg);
3886
+ padding: var(--spacing-4);
4085
3887
  font-family: var(--text-label-lg-regular-fontFamily);
4086
3888
  font-weight: var(--text-label-lg-regular-fontWeight);
4087
3889
  font-size: var(--text-label-lg-regular-fontSize);
@@ -4105,8 +3907,8 @@ body {
4105
3907
  bottom: -1px; /* Overlap the 1px border */
4106
3908
  left: 0;
4107
3909
  right: 0;
4108
- height: 3px;
4109
- background-color: var(--tabs-trigger-color-current-foreground);
3910
+ height: var(--tabs-indicator-height-md);
3911
+ background-color: var(--tabs-indicator-color);
4110
3912
  border-bottom-left-radius: 1px;
4111
3913
  border-bottom-right-radius: 1px;
4112
3914
  border-top-left-radius: 3px;
@@ -4114,6 +3916,13 @@ body {
4114
3916
  z-index: 3;
4115
3917
  }
4116
3918
 
3919
+ .muka-tabs--size-sm .muka-tabs__trigger--current::after {
3920
+ height: var(--tabs-indicator-height-sm);
3921
+ }
3922
+ .muka-tabs--size-lg .muka-tabs__trigger--current::after {
3923
+ height: var(--tabs-indicator-height-lg);
3924
+ }
3925
+
4117
3926
  .muka-tabs__trigger--disabled {
4118
3927
  color: var(--tabs-trigger-color-disabled-foreground);
4119
3928
  cursor: not-allowed;
@@ -4124,18 +3933,29 @@ body {
4124
3933
  outline-offset: -2px;
4125
3934
  }
4126
3935
 
4127
- /* Icons */
4128
- .muka-tabs__icon {
3936
+ /* Label: Figma pads the label 8px either side, so with the 4px gap a leading
3937
+ item sits 12px from the text */
3938
+ .muka-tabs__label {
3939
+ padding: 0 var(--spacing-2);
3940
+ }
3941
+
3942
+ /* Leading item: icon, avatar, avatar group or data pie chart */
3943
+ .muka-tabs__leading {
4129
3944
  display: flex;
4130
3945
  align-items: center;
4131
3946
  justify-content: center;
3947
+ flex-shrink: 0;
4132
3948
  }
4133
3949
  .muka-tabs__trigger .muka-icon {
4134
3950
  color: inherit;
4135
3951
  }
4136
- .muka-tabs--size-sm .muka-tabs__icon svg { width: 16px; height: 16px; }
4137
- .muka-tabs--size-md .muka-tabs__icon svg { width: 20px; height: 20px; }
4138
- .muka-tabs--size-lg .muka-tabs__icon svg { width: 24px; height: 24px; }
3952
+ /* Icon sizes only: avatars and pie charts are sized through their size prop */
3953
+ .muka-tabs--size-sm .muka-tabs__leading > svg,
3954
+ .muka-tabs--size-sm .muka-tabs__leading > .muka-icon svg { width: 16px; height: 16px; }
3955
+ .muka-tabs--size-md .muka-tabs__leading > svg,
3956
+ .muka-tabs--size-md .muka-tabs__leading > .muka-icon svg { width: 20px; height: 20px; }
3957
+ .muka-tabs--size-lg .muka-tabs__leading > svg,
3958
+ .muka-tabs--size-lg .muka-tabs__leading > .muka-icon svg { width: 24px; height: 24px; }
4139
3959
 
4140
3960
  /* Responsive Scroll behavior on small screens */
4141
3961
  @media (max-width: 768px) {
@@ -4159,25 +3979,271 @@ body {
4159
3979
  }
4160
3980
  }
4161
3981
 
4162
- /* Tab Panel — content area */
4163
- .muka-tabs__panel {
4164
- background-color: var(--tabs-panel-background);
4165
- /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
4166
- border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
4167
- padding: var(--spacing-4);
4168
- position: relative;
4169
- z-index: 1;
4170
- font-family: var(--text-body-base-regular-fontFamily);
4171
- font-weight: var(--text-body-base-regular-fontWeight);
4172
- font-size: var(--text-body-base-regular-fontSize);
4173
- line-height: var(--text-body-base-regular-lineHeight);
3982
+ /* Tab Panel — content area */
3983
+ .muka-tabs__panel {
3984
+ background-color: var(--tabs-panel-background);
3985
+ /* border-top: var(--border-width-regular) solid var(--tabs-panel-border); removed in favor of the new tablist border */
3986
+ border-bottom: var(--border-width-regular) solid var(--tabs-panel-border);
3987
+ padding: var(--spacing-4);
3988
+ position: relative;
3989
+ z-index: 1;
3990
+ font-family: var(--text-body-base-regular-fontFamily);
3991
+ font-weight: var(--text-body-base-regular-fontWeight);
3992
+ font-size: var(--text-body-base-regular-fontSize);
3993
+ line-height: var(--text-body-base-regular-lineHeight);
3994
+ }
3995
+
3996
+ .muka-tabs__panel:focus-visible {
3997
+ outline: 2px solid var(--color-border-focus);
3998
+ outline-offset: 2px;
3999
+ }
4000
+
4001
+
4002
+ /* Textarea */
4003
+ /* Textarea Component Styles - Using Muka Design Tokens */
4004
+
4005
+ .muka-textarea {
4006
+ display: inline-flex;
4007
+ flex-direction: column;
4008
+ gap: var(--spacing-2);
4009
+ }
4010
+
4011
+ /* Label */
4012
+ .muka-textarea__label {
4013
+ color: var(--color-text-default-default);
4014
+ cursor: pointer;
4015
+ }
4016
+
4017
+ .muka-textarea__label--sm {
4018
+ font-family: var(--text-label-sm-semibold-fontFamily);
4019
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4020
+ font-size: var(--text-label-sm-semibold-fontSize);
4021
+ line-height: var(--text-label-sm-semibold-lineHeight);
4022
+ }
4023
+
4024
+ .muka-textarea__label--md {
4025
+ font-family: var(--text-label-md-semibold-fontFamily);
4026
+ font-weight: var(--text-label-md-semibold-fontWeight);
4027
+ font-size: var(--text-label-md-semibold-fontSize);
4028
+ line-height: var(--text-label-md-semibold-lineHeight);
4029
+ }
4030
+
4031
+ .muka-textarea__label--lg {
4032
+ font-family: var(--text-label-lg-semibold-fontFamily);
4033
+ font-weight: var(--text-label-lg-semibold-fontWeight);
4034
+ font-size: var(--text-label-lg-semibold-fontSize);
4035
+ line-height: var(--text-label-lg-semibold-lineHeight);
4036
+ }
4037
+
4038
+ .muka-textarea__required {
4039
+ color: var(--color-state-error-default);
4040
+ }
4041
+
4042
+ /* Field container */
4043
+ .muka-textarea__field {
4044
+ display: flex;
4045
+ background-color: var(--input-field-color-default-background);
4046
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
4047
+ border-radius: var(--input-field-radius-md);
4048
+ padding: var(--input-field-padding-y) var(--input-field-padding-x);
4049
+ transition: border-color 0.2s ease, background-color 0.2s ease;
4050
+ box-sizing: border-box;
4051
+ }
4052
+
4053
+ .muka-textarea__field--sm {
4054
+ min-height: var(--input-textarea-height-sm);
4055
+ border-radius: var(--input-field-radius-sm);
4056
+ }
4057
+
4058
+ .muka-textarea__field--md {
4059
+ min-height: var(--input-textarea-height-default);
4060
+ border-radius: var(--input-field-radius-md);
4061
+ }
4062
+
4063
+ .muka-textarea__field--lg {
4064
+ min-height: var(--input-textarea-height-lg);
4065
+ border-radius: var(--input-field-radius-lg);
4066
+ }
4067
+
4068
+ /* Focus state */
4069
+ .muka-textarea__field--focused:not(.muka-textarea__field--disabled) {
4070
+ border-width: var(--border-width-bold);
4071
+ border-color: var(--input-field-color-focus-border);
4072
+ background-color: var(--input-field-color-focus-background);
4073
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4074
+ }
4075
+
4076
+ /* Error state */
4077
+ .muka-textarea__field--error:not(.muka-textarea__field--disabled) {
4078
+ border-width: var(--border-width-bold);
4079
+ border-color: var(--input-field-color-error-border);
4080
+ background-color: var(--input-field-color-error-background);
4081
+ padding: calc(var(--input-field-padding-y) - 1px) calc(var(--input-field-padding-x) - 1px);
4082
+ }
4083
+
4084
+ /* Disabled state */
4085
+ .muka-textarea__field--disabled {
4086
+ background-color: var(--input-field-color-disabled-background);
4087
+ border-color: var(--input-field-color-disabled-border);
4088
+ cursor: not-allowed;
4089
+ }
4090
+
4091
+ /* Native textarea */
4092
+ .muka-textarea__native {
4093
+ flex: 1;
4094
+ border: none;
4095
+ outline: none;
4096
+ background: transparent;
4097
+ color: var(--input-field-color-default-foreground);
4098
+ font-family: var(--text-input-md-fontFamily);
4099
+ font-weight: var(--text-input-md-fontWeight);
4100
+ font-size: var(--text-input-md-fontSize);
4101
+ line-height: var(--text-input-md-lineHeight);
4102
+ padding: 0;
4103
+ width: 100%;
4104
+ min-width: 0;
4105
+ }
4106
+
4107
+ .muka-textarea__field--sm .muka-textarea__native {
4108
+ font-family: var(--text-input-sm-fontFamily);
4109
+ font-weight: var(--text-input-sm-fontWeight);
4110
+ font-size: var(--text-input-sm-fontSize);
4111
+ line-height: var(--text-input-sm-lineHeight);
4112
+ }
4113
+
4114
+ .muka-textarea__field--lg .muka-textarea__native {
4115
+ font-family: var(--text-input-lg-fontFamily);
4116
+ font-weight: var(--text-input-lg-fontWeight);
4117
+ font-size: var(--text-input-lg-fontSize);
4118
+ line-height: var(--text-input-lg-lineHeight);
4119
+ }
4120
+
4121
+ .muka-textarea__native::placeholder {
4122
+ color: var(--color-text-subtle-default);
4123
+ }
4124
+
4125
+ .muka-textarea__field--disabled .muka-textarea__native {
4126
+ color: var(--input-field-color-disabled-foreground);
4127
+ cursor: not-allowed;
4128
+ }
4129
+
4130
+ /* Footer (helper/error + count) */
4131
+ .muka-textarea__footer {
4132
+ display: flex;
4133
+ justify-content: space-between;
4134
+ align-items: flex-start;
4135
+ gap: var(--spacing-2);
4136
+ }
4137
+
4138
+ .muka-textarea__helper {
4139
+ font-family: var(--text-label-sm-regular-fontFamily);
4140
+ font-weight: var(--text-label-sm-regular-fontWeight);
4141
+ font-size: var(--text-label-sm-regular-fontSize);
4142
+ line-height: var(--text-label-sm-regular-lineHeight);
4143
+ color: var(--color-text-subtle-default);
4144
+ margin: 0;
4145
+ }
4146
+
4147
+ .muka-textarea__error {
4148
+ font-family: var(--text-label-sm-regular-fontFamily);
4149
+ font-weight: var(--text-label-sm-regular-fontWeight);
4150
+ font-size: var(--text-label-sm-regular-fontSize);
4151
+ line-height: var(--text-label-sm-regular-lineHeight);
4152
+ color: var(--color-state-error-default);
4153
+ margin: 0;
4154
+ }
4155
+
4156
+ .muka-textarea__count {
4157
+ font-family: var(--text-label-sm-regular-fontFamily);
4158
+ font-weight: var(--text-label-sm-regular-fontWeight);
4159
+ font-size: var(--text-label-sm-regular-fontSize);
4160
+ line-height: var(--text-label-sm-regular-lineHeight);
4161
+ color: var(--color-text-subtle-default);
4162
+ margin-left: auto;
4163
+ }
4164
+
4165
+
4166
+ /* TextLink */
4167
+ /* TextLink Component Styles - Using Muka Design Tokens */
4168
+
4169
+ .muka-text-link {
4170
+ display: inline;
4171
+ cursor: pointer;
4172
+ text-decoration: underline;
4173
+ /* Nudge the rule clear of descenders; the Figma underline sits off baseline. */
4174
+ text-underline-offset: 0.2em;
4175
+ text-decoration-thickness: from-font;
4176
+ /* Rounds the focus ring's corners; the link itself has no visible box. */
4177
+ border-radius: var(--border-radius-sm);
4178
+ transition: color var(--motion-duration-micro, 0.15s) var(--motion-easing-enter, ease);
4179
+ }
4180
+
4181
+ /* ─── Sizes ───────────────────────────────────────────────
4182
+ Mirrors the body text scale so a link matches the copy it sits in. */
4183
+ .muka-text-link--sm {
4184
+ font-family: var(--text-body-sm-regular-fontFamily);
4185
+ font-weight: var(--text-body-sm-regular-fontWeight);
4186
+ font-size: var(--text-body-sm-regular-fontSize);
4187
+ line-height: var(--text-body-sm-regular-lineHeight);
4188
+ }
4189
+
4190
+ .muka-text-link--base {
4191
+ font-family: var(--text-body-base-regular-fontFamily);
4192
+ font-weight: var(--text-body-base-regular-fontWeight);
4193
+ font-size: var(--text-body-base-regular-fontSize);
4194
+ line-height: var(--text-body-base-regular-lineHeight);
4195
+ }
4196
+
4197
+ .muka-text-link--lg {
4198
+ font-family: var(--text-body-lg-regular-fontFamily);
4199
+ font-weight: var(--text-body-lg-regular-fontWeight);
4200
+ font-size: var(--text-body-lg-regular-fontSize);
4201
+ line-height: var(--text-body-lg-regular-lineHeight);
4202
+ }
4203
+
4204
+ /* ─── Variant: default (accent) ───────────────────────────
4205
+ Visited repeats the default colour on purpose: the design treats visited and
4206
+ default the same, and pinning it stops the browser's purple from showing. */
4207
+ .muka-text-link--default,
4208
+ .muka-text-link--default:visited {
4209
+ color: var(--color-text-action-default);
4210
+ }
4211
+
4212
+ .muka-text-link--default:hover,
4213
+ .muka-text-link--default:focus-visible {
4214
+ color: var(--color-text-action-hover);
4174
4215
  }
4175
4216
 
4176
- .muka-tabs__panel:focus-visible {
4217
+ .muka-text-link--default:active {
4218
+ color: var(--color-text-action-pressed);
4219
+ }
4220
+
4221
+ /* ─── Variant: subtle (neutral) ───────────────────────────
4222
+ Hover, focus and pressed all darken to the default text colour. */
4223
+ .muka-text-link--subtle,
4224
+ .muka-text-link--subtle:visited {
4225
+ color: var(--color-text-subtle-default);
4226
+ }
4227
+
4228
+ .muka-text-link--subtle:hover,
4229
+ .muka-text-link--subtle:focus-visible,
4230
+ .muka-text-link--subtle:active {
4231
+ color: var(--color-text-default-default);
4232
+ }
4233
+
4234
+ /* ─── Focus ───────────────────────────────────────────────
4235
+ Same ring as every other focusable Muka component. */
4236
+ .muka-text-link:focus-visible {
4177
4237
  outline: 2px solid var(--color-border-focus);
4178
4238
  outline-offset: 2px;
4179
4239
  }
4180
4240
 
4241
+ @media (prefers-reduced-motion: reduce) {
4242
+ .muka-text-link {
4243
+ transition: none;
4244
+ }
4245
+ }
4246
+
4181
4247
 
4182
4248
  /* Table */
4183
4249
  /* Table Component Styles - Using Muka Design Tokens */
@@ -4531,114 +4597,6 @@ body {
4531
4597
  }
4532
4598
 
4533
4599
 
4534
- /* SwipeActions */
4535
- /* SwipeActions Component Styles */
4536
-
4537
- .muka-swipe-actions {
4538
- position: relative;
4539
- overflow: hidden;
4540
- touch-action: pan-y;
4541
- -webkit-user-select: none;
4542
- user-select: none;
4543
- background-color: var(--color-surface-level3);
4544
- }
4545
-
4546
- .muka-swipe-actions--disabled {
4547
- touch-action: auto;
4548
- }
4549
-
4550
- /* ─── Row that holds the actual content ────────────────── */
4551
-
4552
- .muka-swipe-actions__row {
4553
- position: relative;
4554
- z-index: 1;
4555
- background-color: inherit;
4556
- will-change: transform;
4557
- }
4558
-
4559
- /* ─── Action panels — sit beneath the row ──────────────── */
4560
-
4561
- .muka-swipe-actions__panel {
4562
- position: absolute;
4563
- top: 0;
4564
- bottom: 0;
4565
- display: flex;
4566
- align-items: stretch;
4567
- z-index: 0;
4568
- }
4569
-
4570
- .muka-swipe-actions__panel--left {
4571
- left: 0;
4572
- }
4573
-
4574
- .muka-swipe-actions__panel--right {
4575
- right: 0;
4576
- }
4577
-
4578
- /* ─── Single action button ─────────────────────────────── */
4579
-
4580
- .muka-swipe-actions__button {
4581
- display: flex;
4582
- flex-direction: column;
4583
- align-items: center;
4584
- justify-content: center;
4585
- gap: var(--spacing-1);
4586
- border: none;
4587
- cursor: pointer;
4588
- padding: var(--spacing-2);
4589
- background-color: var(--color-surface-level2);
4590
- color: var(--color-text-default-default);
4591
- font-family: var(--text-label-sm-semibold-fontFamily);
4592
- font-weight: var(--text-label-sm-semibold-fontWeight);
4593
- font-size: var(--text-label-sm-semibold-fontSize);
4594
- line-height: var(--text-label-sm-semibold-lineHeight);
4595
- -webkit-tap-highlight-color: transparent;
4596
- transition: filter 0.12s ease;
4597
- }
4598
-
4599
- .muka-swipe-actions__button:hover {
4600
- filter: brightness(0.95);
4601
- }
4602
-
4603
- .muka-swipe-actions__button:focus-visible {
4604
- outline: 2px solid var(--color-action-default);
4605
- outline-offset: -2px;
4606
- }
4607
-
4608
- .muka-swipe-actions__button-icon {
4609
- display: inline-flex;
4610
- align-items: center;
4611
- justify-content: center;
4612
- }
4613
-
4614
- /* ─── Color variants ───────────────────────────────────── */
4615
-
4616
- .muka-swipe-actions__button--neutral {
4617
- background-color: var(--color-surface-level2);
4618
- color: var(--color-text-default-default);
4619
- }
4620
-
4621
- .muka-swipe-actions__button--primary {
4622
- background-color: var(--color-action-default);
4623
- color: var(--color-text-default-inverse);
4624
- }
4625
-
4626
- .muka-swipe-actions__button--success {
4627
- background-color: var(--color-state-success-default);
4628
- color: var(--color-text-default-inverse);
4629
- }
4630
-
4631
- .muka-swipe-actions__button--warning {
4632
- background-color: var(--color-state-warning-default);
4633
- color: var(--color-text-default-default);
4634
- }
4635
-
4636
- .muka-swipe-actions__button--destructive {
4637
- background-color: var(--color-state-error-default);
4638
- color: var(--color-text-default-inverse);
4639
- }
4640
-
4641
-
4642
4600
  /* Spinner */
4643
4601
  /* Spinner Component Styles */
4644
4602
 
@@ -4734,71 +4692,179 @@ body {
4734
4692
  padding-bottom: var(--spacing-3);
4735
4693
  }
4736
4694
 
4737
- /* ─── Label ───────────────────────────────────────────── */
4695
+ /* ─── Label ───────────────────────────────────────────── */
4696
+
4697
+ .muka-spec-row__label {
4698
+ flex: 0 0 auto;
4699
+ margin: 0;
4700
+ color: var(--color-text-subtle-default);
4701
+ font-family: var(--text-body-base-regular-fontFamily);
4702
+ font-weight: var(--text-body-base-regular-fontWeight);
4703
+ font-size: var(--text-body-base-regular-fontSize);
4704
+ line-height: var(--text-body-base-regular-lineHeight);
4705
+ overflow: hidden;
4706
+ text-overflow: ellipsis;
4707
+ white-space: nowrap;
4708
+ }
4709
+
4710
+ /* ─── Value ───────────────────────────────────────────── */
4711
+
4712
+ .muka-spec-row__value {
4713
+ flex: 1 1 0;
4714
+ min-width: 0;
4715
+ margin: 0;
4716
+ display: flex;
4717
+ flex-direction: column;
4718
+ color: var(--color-text-default-default);
4719
+ }
4720
+
4721
+ .muka-spec-row__value-text {
4722
+ font-family: var(--text-body-base-regular-fontFamily);
4723
+ font-weight: var(--text-body-base-regular-fontWeight);
4724
+ font-size: var(--text-body-base-regular-fontSize);
4725
+ line-height: var(--text-body-base-regular-lineHeight);
4726
+ }
4727
+
4728
+ .muka-spec-row__hint {
4729
+ color: var(--color-text-subtle-default);
4730
+ font-family: var(--text-body-sm-regular-fontFamily);
4731
+ font-weight: var(--text-body-sm-regular-fontWeight);
4732
+ font-size: var(--text-body-sm-regular-fontSize);
4733
+ line-height: var(--text-body-sm-regular-lineHeight);
4734
+ }
4735
+
4736
+ /* ─── Label width (horizontal stacking) ───────────────── */
4737
+
4738
+ .muka-spec-list--label-small .muka-spec-row__label {
4739
+ width: 80px;
4740
+ }
4741
+
4742
+ .muka-spec-list--label-medium .muka-spec-row__label {
4743
+ width: 120px;
4744
+ }
4745
+
4746
+ .muka-spec-list--label-large .muka-spec-row__label {
4747
+ width: 160px;
4748
+ }
4749
+
4750
+ /* ─── Vertical stacking ───────────────────────────────── */
4751
+
4752
+ .muka-spec-list--vertical .muka-spec-row {
4753
+ flex-direction: column;
4754
+ gap: var(--spacing-1);
4755
+ }
4756
+
4757
+ .muka-spec-list--vertical .muka-spec-row__label {
4758
+ width: 100%;
4759
+ white-space: normal;
4760
+ }
4761
+
4762
+
4763
+ /* SwipeActions */
4764
+ /* SwipeActions Component Styles */
4765
+
4766
+ .muka-swipe-actions {
4767
+ position: relative;
4768
+ overflow: hidden;
4769
+ touch-action: pan-y;
4770
+ -webkit-user-select: none;
4771
+ user-select: none;
4772
+ background-color: var(--color-surface-level3);
4773
+ }
4774
+
4775
+ .muka-swipe-actions--disabled {
4776
+ touch-action: auto;
4777
+ }
4778
+
4779
+ /* ─── Row that holds the actual content ────────────────── */
4780
+
4781
+ .muka-swipe-actions__row {
4782
+ position: relative;
4783
+ z-index: 1;
4784
+ background-color: inherit;
4785
+ will-change: transform;
4786
+ }
4787
+
4788
+ /* ─── Action panels — sit beneath the row ──────────────── */
4789
+
4790
+ .muka-swipe-actions__panel {
4791
+ position: absolute;
4792
+ top: 0;
4793
+ bottom: 0;
4794
+ display: flex;
4795
+ align-items: stretch;
4796
+ z-index: 0;
4797
+ }
4798
+
4799
+ .muka-swipe-actions__panel--left {
4800
+ left: 0;
4801
+ }
4738
4802
 
4739
- .muka-spec-row__label {
4740
- flex: 0 0 auto;
4741
- margin: 0;
4742
- color: var(--color-text-subtle-default);
4743
- font-family: var(--text-body-base-regular-fontFamily);
4744
- font-weight: var(--text-body-base-regular-fontWeight);
4745
- font-size: var(--text-body-base-regular-fontSize);
4746
- line-height: var(--text-body-base-regular-lineHeight);
4747
- overflow: hidden;
4748
- text-overflow: ellipsis;
4749
- white-space: nowrap;
4803
+ .muka-swipe-actions__panel--right {
4804
+ right: 0;
4750
4805
  }
4751
4806
 
4752
- /* ─── Value ───────────────────────────────────────────── */
4807
+ /* ─── Single action button ─────────────────────────────── */
4753
4808
 
4754
- .muka-spec-row__value {
4755
- flex: 1 1 0;
4756
- min-width: 0;
4757
- margin: 0;
4809
+ .muka-swipe-actions__button {
4758
4810
  display: flex;
4759
4811
  flex-direction: column;
4812
+ align-items: center;
4813
+ justify-content: center;
4814
+ gap: var(--spacing-1);
4815
+ border: none;
4816
+ cursor: pointer;
4817
+ padding: var(--spacing-2);
4818
+ background-color: var(--color-surface-level2);
4760
4819
  color: var(--color-text-default-default);
4820
+ font-family: var(--text-label-sm-semibold-fontFamily);
4821
+ font-weight: var(--text-label-sm-semibold-fontWeight);
4822
+ font-size: var(--text-label-sm-semibold-fontSize);
4823
+ line-height: var(--text-label-sm-semibold-lineHeight);
4824
+ -webkit-tap-highlight-color: transparent;
4825
+ transition: filter 0.12s ease;
4761
4826
  }
4762
4827
 
4763
- .muka-spec-row__value-text {
4764
- font-family: var(--text-body-base-regular-fontFamily);
4765
- font-weight: var(--text-body-base-regular-fontWeight);
4766
- font-size: var(--text-body-base-regular-fontSize);
4767
- line-height: var(--text-body-base-regular-lineHeight);
4828
+ .muka-swipe-actions__button:hover {
4829
+ filter: brightness(0.95);
4768
4830
  }
4769
4831
 
4770
- .muka-spec-row__hint {
4771
- color: var(--color-text-subtle-default);
4772
- font-family: var(--text-body-sm-regular-fontFamily);
4773
- font-weight: var(--text-body-sm-regular-fontWeight);
4774
- font-size: var(--text-body-sm-regular-fontSize);
4775
- line-height: var(--text-body-sm-regular-lineHeight);
4832
+ .muka-swipe-actions__button:focus-visible {
4833
+ outline: 2px solid var(--color-action-default);
4834
+ outline-offset: -2px;
4776
4835
  }
4777
4836
 
4778
- /* ─── Label width (horizontal stacking) ───────────────── */
4779
-
4780
- .muka-spec-list--label-small .muka-spec-row__label {
4781
- width: 80px;
4837
+ .muka-swipe-actions__button-icon {
4838
+ display: inline-flex;
4839
+ align-items: center;
4840
+ justify-content: center;
4782
4841
  }
4783
4842
 
4784
- .muka-spec-list--label-medium .muka-spec-row__label {
4785
- width: 120px;
4843
+ /* ─── Color variants ───────────────────────────────────── */
4844
+
4845
+ .muka-swipe-actions__button--neutral {
4846
+ background-color: var(--color-surface-level2);
4847
+ color: var(--color-text-default-default);
4786
4848
  }
4787
4849
 
4788
- .muka-spec-list--label-large .muka-spec-row__label {
4789
- width: 160px;
4850
+ .muka-swipe-actions__button--primary {
4851
+ background-color: var(--color-action-default);
4852
+ color: var(--color-text-default-inverse);
4790
4853
  }
4791
4854
 
4792
- /* ─── Vertical stacking ───────────────────────────────── */
4855
+ .muka-swipe-actions__button--success {
4856
+ background-color: var(--color-state-success-default);
4857
+ color: var(--color-text-default-inverse);
4858
+ }
4793
4859
 
4794
- .muka-spec-list--vertical .muka-spec-row {
4795
- flex-direction: column;
4796
- gap: var(--spacing-1);
4860
+ .muka-swipe-actions__button--warning {
4861
+ background-color: var(--color-state-warning-default);
4862
+ color: var(--color-text-default-default);
4797
4863
  }
4798
4864
 
4799
- .muka-spec-list--vertical .muka-spec-row__label {
4800
- width: 100%;
4801
- white-space: normal;
4865
+ .muka-swipe-actions__button--destructive {
4866
+ background-color: var(--color-state-error-default);
4867
+ color: var(--color-text-default-inverse);
4802
4868
  }
4803
4869
 
4804
4870
 
@@ -7433,6 +7499,77 @@ body {
7433
7499
  }
7434
7500
 
7435
7501
 
7502
+ /* ProfileBadge */
7503
+ /* ProfileBadge Component Styles - Using Muka Design Tokens */
7504
+
7505
+ .muka-profile-badge {
7506
+ display: inline-flex;
7507
+ align-items: center;
7508
+ font-family: var(--text-body-base-regular-fontFamily);
7509
+ }
7510
+
7511
+ /* Size variants */
7512
+ .muka-profile-badge--lg {
7513
+ gap: var(--spacing-4); /* 16px */
7514
+ }
7515
+
7516
+ .muka-profile-badge--md {
7517
+ gap: var(--spacing-3); /* 12px */
7518
+ }
7519
+
7520
+ .muka-profile-badge__avatar {
7521
+ flex-shrink: 0;
7522
+ }
7523
+
7524
+ /* Text stack */
7525
+ .muka-profile-badge__text {
7526
+ display: flex;
7527
+ flex-direction: column;
7528
+ align-items: flex-start;
7529
+ min-width: 0;
7530
+ }
7531
+
7532
+ .muka-profile-badge__name {
7533
+ font-family: var(--text-body-base-regular-fontFamily);
7534
+ font-size: var(--text-body-base-regular-fontSize);
7535
+ font-weight: var(--text-body-base-regular-fontWeight);
7536
+ line-height: var(--text-body-base-regular-lineHeight);
7537
+ color: var(--color-text-default-default);
7538
+ }
7539
+
7540
+ .muka-profile-badge__email {
7541
+ font-family: var(--text-body-xs-regular-fontFamily);
7542
+ font-size: var(--text-body-xs-regular-fontSize);
7543
+ font-weight: var(--text-body-xs-regular-fontWeight);
7544
+ line-height: var(--text-body-xs-regular-lineHeight);
7545
+ color: var(--color-text-subtle-default);
7546
+ }
7547
+
7548
+ /* Clickable state */
7549
+ .muka-profile-badge--clickable {
7550
+ cursor: pointer;
7551
+ border: none;
7552
+ background: none;
7553
+ padding: 0;
7554
+ text-align: left;
7555
+ border-radius: var(--radius-md);
7556
+ transition: opacity 0.2s ease;
7557
+ }
7558
+
7559
+ .muka-profile-badge--clickable:hover {
7560
+ opacity: 0.9;
7561
+ }
7562
+
7563
+ .muka-profile-badge--clickable:active {
7564
+ opacity: 0.8;
7565
+ }
7566
+
7567
+ .muka-profile-badge--clickable:focus-visible {
7568
+ outline: 2px solid var(--color-border-focus);
7569
+ outline-offset: 2px;
7570
+ }
7571
+
7572
+
7436
7573
  /* PriceTag */
7437
7574
  /* PriceTag Component Styles - Using Muka Design Tokens */
7438
7575
 
@@ -7530,77 +7667,6 @@ body {
7530
7667
  }
7531
7668
 
7532
7669
 
7533
- /* ProfileBadge */
7534
- /* ProfileBadge Component Styles - Using Muka Design Tokens */
7535
-
7536
- .muka-profile-badge {
7537
- display: inline-flex;
7538
- align-items: center;
7539
- font-family: var(--text-body-base-regular-fontFamily);
7540
- }
7541
-
7542
- /* Size variants */
7543
- .muka-profile-badge--lg {
7544
- gap: var(--spacing-4); /* 16px */
7545
- }
7546
-
7547
- .muka-profile-badge--md {
7548
- gap: var(--spacing-3); /* 12px */
7549
- }
7550
-
7551
- .muka-profile-badge__avatar {
7552
- flex-shrink: 0;
7553
- }
7554
-
7555
- /* Text stack */
7556
- .muka-profile-badge__text {
7557
- display: flex;
7558
- flex-direction: column;
7559
- align-items: flex-start;
7560
- min-width: 0;
7561
- }
7562
-
7563
- .muka-profile-badge__name {
7564
- font-family: var(--text-body-base-regular-fontFamily);
7565
- font-size: var(--text-body-base-regular-fontSize);
7566
- font-weight: var(--text-body-base-regular-fontWeight);
7567
- line-height: var(--text-body-base-regular-lineHeight);
7568
- color: var(--color-text-default-default);
7569
- }
7570
-
7571
- .muka-profile-badge__email {
7572
- font-family: var(--text-body-xs-regular-fontFamily);
7573
- font-size: var(--text-body-xs-regular-fontSize);
7574
- font-weight: var(--text-body-xs-regular-fontWeight);
7575
- line-height: var(--text-body-xs-regular-lineHeight);
7576
- color: var(--color-text-subtle-default);
7577
- }
7578
-
7579
- /* Clickable state */
7580
- .muka-profile-badge--clickable {
7581
- cursor: pointer;
7582
- border: none;
7583
- background: none;
7584
- padding: 0;
7585
- text-align: left;
7586
- border-radius: var(--radius-md);
7587
- transition: opacity 0.2s ease;
7588
- }
7589
-
7590
- .muka-profile-badge--clickable:hover {
7591
- opacity: 0.9;
7592
- }
7593
-
7594
- .muka-profile-badge--clickable:active {
7595
- opacity: 0.8;
7596
- }
7597
-
7598
- .muka-profile-badge--clickable:focus-visible {
7599
- outline: 2px solid var(--color-border-focus);
7600
- outline-offset: 2px;
7601
- }
7602
-
7603
-
7604
7670
  /* Popover */
7605
7671
  /* Popover Component Styles */
7606
7672
 
@@ -8006,18 +8072,46 @@ body {
8006
8072
  white-space: nowrap;
8007
8073
  }
8008
8074
 
8009
- /* Hide the native number spinners — affixes/step API replace them. */
8010
- .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8011
- .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8012
- -webkit-appearance: none;
8013
- margin: 0;
8075
+ /* Hide the native number spinners — affixes/step API replace them. */
8076
+ .muka-numberinput__field .muka-input__native::-webkit-outer-spin-button,
8077
+ .muka-numberinput__field .muka-input__native::-webkit-inner-spin-button {
8078
+ -webkit-appearance: none;
8079
+ margin: 0;
8080
+ }
8081
+
8082
+ .muka-numberinput__field .muka-input__native {
8083
+ -moz-appearance: textfield;
8084
+ appearance: textfield;
8085
+ }
8086
+
8087
+
8088
+ /* NavigationTransition */
8089
+ /* NavigationTransition Component Styles */
8090
+
8091
+ /* ─── Wrapper ────────────────────────────────────────── */
8092
+
8093
+ .muka-nav-transition {
8094
+ position: relative;
8095
+ height: 100vh;
8096
+ overflow: hidden;
8097
+ }
8098
+
8099
+ /* Disable interaction during animation */
8100
+ .muka-nav-transition--active {
8101
+ pointer-events: none;
8014
8102
  }
8015
8103
 
8016
- .muka-numberinput__field .muka-input__native {
8017
- -moz-appearance: textfield;
8018
- appearance: textfield;
8104
+ /* ─── View slots ─────────────────────────────────────── */
8105
+
8106
+ .muka-nav-transition--active .muka-nav-transition__view {
8107
+ position: absolute;
8108
+ inset: 0;
8019
8109
  }
8020
8110
 
8111
+ /* Z-index layering */
8112
+ .muka-nav-transition__view--bottom { z-index: 1; }
8113
+ .muka-nav-transition__view--top { z-index: 2; }
8114
+
8021
8115
 
8022
8116
  /* Menu */
8023
8117
  /* Menu Component Styles */
@@ -8498,34 +8592,6 @@ body {
8498
8592
  }
8499
8593
 
8500
8594
 
8501
- /* NavigationTransition */
8502
- /* NavigationTransition Component Styles */
8503
-
8504
- /* ─── Wrapper ────────────────────────────────────────── */
8505
-
8506
- .muka-nav-transition {
8507
- position: relative;
8508
- height: 100vh;
8509
- overflow: hidden;
8510
- }
8511
-
8512
- /* Disable interaction during animation */
8513
- .muka-nav-transition--active {
8514
- pointer-events: none;
8515
- }
8516
-
8517
- /* ─── View slots ─────────────────────────────────────── */
8518
-
8519
- .muka-nav-transition--active .muka-nav-transition__view {
8520
- position: absolute;
8521
- inset: 0;
8522
- }
8523
-
8524
- /* Z-index layering */
8525
- .muka-nav-transition__view--bottom { z-index: 1; }
8526
- .muka-nav-transition__view--top { z-index: 2; }
8527
-
8528
-
8529
8595
  /* ListItem */
8530
8596
  /* ListItem Component Styles - Using Muka Design Tokens */
8531
8597
 
@@ -8954,6 +9020,184 @@ li.muka-listitem {
8954
9020
  }
8955
9021
 
8956
9022
 
9023
+ /* InputCounter */
9024
+ /* InputCounter — numeric field + joined decrement/increment buttons.
9025
+ Label, helper and error text reuse Input.css (../Input/Input.css).
9026
+ Field and button group share one radius per size:
9027
+ sm/md → input.field.radius.md, lg → input.field.radius.lg. */
9028
+
9029
+ .muka-inputcounter {
9030
+ --muka-inputcounter-radius: var(--input-field-radius-md);
9031
+ --muka-inputcounter-height: var(--input-field-height-default);
9032
+ --muka-inputcounter-pad: calc(var(--spacing-2) + var(--spacing-1));
9033
+ --muka-inputcounter-min: var(--size-3xl);
9034
+
9035
+ display: inline-flex;
9036
+ flex-direction: column;
9037
+ gap: var(--spacing-2);
9038
+ }
9039
+
9040
+ .muka-inputcounter--sm {
9041
+ --muka-inputcounter-height: var(--input-field-height-sm);
9042
+ --muka-inputcounter-pad: calc(var(--spacing-1) + var(--spacing-1));
9043
+ --muka-inputcounter-min: var(--size-2xl);
9044
+ }
9045
+
9046
+ .muka-inputcounter--lg {
9047
+ --muka-inputcounter-radius: var(--input-field-radius-lg);
9048
+ --muka-inputcounter-height: var(--input-field-height-lg);
9049
+ }
9050
+
9051
+ /* Label row — label, info tooltip trigger, optional hint */
9052
+ .muka-inputcounter__label-row {
9053
+ display: flex;
9054
+ align-items: center;
9055
+ gap: var(--spacing-2);
9056
+ min-height: var(--size-xl);
9057
+ }
9058
+
9059
+ .muka-inputcounter__info {
9060
+ display: inline-flex;
9061
+ align-items: center;
9062
+ justify-content: center;
9063
+ padding: 0;
9064
+ border: none;
9065
+ border-radius: 50%;
9066
+ background: transparent;
9067
+ cursor: pointer;
9068
+ }
9069
+
9070
+ .muka-inputcounter__info .muka-icon {
9071
+ color: var(--color-action-default);
9072
+ }
9073
+
9074
+ .muka-inputcounter__info:focus-visible {
9075
+ outline: 2px solid var(--color-border-focus);
9076
+ outline-offset: 2px;
9077
+ }
9078
+
9079
+ .muka-inputcounter__optional {
9080
+ font-family: var(--text-label-sm-regular-fontFamily);
9081
+ font-weight: var(--text-label-sm-regular-fontWeight);
9082
+ font-size: var(--text-label-sm-regular-fontSize);
9083
+ line-height: var(--text-label-sm-regular-lineHeight);
9084
+ color: var(--color-text-subtle-default);
9085
+ }
9086
+
9087
+ /* Field + button group */
9088
+ .muka-inputcounter__row {
9089
+ display: flex;
9090
+ align-items: center;
9091
+ gap: var(--spacing-3);
9092
+ }
9093
+
9094
+ /* Field — grows with the value (in ch), never narrower than the Figma width.
9095
+ Padding sits on the native input so the 2px focus/error border doesn't
9096
+ need compensating: content is centred in a fixed box. */
9097
+ .muka-inputcounter__field {
9098
+ position: relative;
9099
+ display: flex;
9100
+ align-items: center;
9101
+ box-sizing: border-box;
9102
+ height: var(--muka-inputcounter-height);
9103
+ width: calc(
9104
+ max(var(--muka-inputcounter-min), calc(var(--muka-inputcounter-chars, 1) * 1ch)) +
9105
+ 2 * var(--muka-inputcounter-pad) + 2 * var(--border-width-regular)
9106
+ );
9107
+ background-color: var(--input-field-color-default-background);
9108
+ border: var(--border-width-regular) solid var(--input-field-color-default-border);
9109
+ border-radius: var(--muka-inputcounter-radius);
9110
+ transition: border-color 0.2s ease, background-color 0.2s ease;
9111
+ }
9112
+
9113
+ .muka-inputcounter__field::after {
9114
+ content: '';
9115
+ position: absolute;
9116
+ inset: 0;
9117
+ border-radius: inherit;
9118
+ box-shadow: var(--shadow-sunken);
9119
+ pointer-events: none;
9120
+ }
9121
+
9122
+ .muka-inputcounter__field--focused:not(.muka-inputcounter__field--disabled) {
9123
+ border-width: var(--border-width-bold);
9124
+ border-color: var(--input-field-color-focus-border);
9125
+ background-color: var(--input-field-color-focus-background);
9126
+ }
9127
+
9128
+ .muka-inputcounter__field--error:not(.muka-inputcounter__field--disabled) {
9129
+ border-width: var(--border-width-bold);
9130
+ border-color: var(--input-field-color-error-border);
9131
+ background-color: var(--input-field-color-error-background);
9132
+ }
9133
+
9134
+ .muka-inputcounter__field--disabled {
9135
+ background-color: var(--input-field-color-disabled-background);
9136
+ border-color: var(--input-field-color-disabled-border);
9137
+ }
9138
+
9139
+ .muka-inputcounter__field--disabled::after {
9140
+ display: none;
9141
+ }
9142
+
9143
+ .muka-inputcounter__native {
9144
+ width: 100%;
9145
+ min-width: 0;
9146
+ height: 100%;
9147
+ box-sizing: border-box;
9148
+ padding: 0 calc(var(--muka-inputcounter-pad) - var(--border-width-regular));
9149
+ border: none;
9150
+ outline: none;
9151
+ background: transparent;
9152
+ text-align: center;
9153
+ font-variant-numeric: tabular-nums;
9154
+ color: var(--input-field-color-default-foreground);
9155
+ font-family: var(--text-input-md-fontFamily);
9156
+ font-weight: var(--text-input-md-fontWeight);
9157
+ font-size: var(--text-input-md-fontSize);
9158
+ line-height: var(--text-input-md-lineHeight);
9159
+ }
9160
+
9161
+ .muka-inputcounter--sm .muka-inputcounter__native {
9162
+ font-family: var(--text-input-sm-fontFamily);
9163
+ font-weight: var(--text-input-sm-fontWeight);
9164
+ font-size: var(--text-input-sm-fontSize);
9165
+ line-height: var(--text-input-sm-lineHeight);
9166
+ }
9167
+
9168
+ .muka-inputcounter__field--disabled .muka-inputcounter__native {
9169
+ color: var(--input-field-color-disabled-foreground);
9170
+ cursor: not-allowed;
9171
+ }
9172
+
9173
+ /* Button group — secondary icon-only Buttons joined by a divider.
9174
+ Only the outer corners are rounded. */
9175
+ .muka-inputcounter__group {
9176
+ display: inline-flex;
9177
+ align-items: stretch;
9178
+ }
9179
+
9180
+ .muka-inputcounter__group .muka-button {
9181
+ border-radius: 0;
9182
+ }
9183
+
9184
+ .muka-inputcounter__group .muka-button:first-child {
9185
+ border-start-start-radius: var(--muka-inputcounter-radius);
9186
+ border-end-start-radius: var(--muka-inputcounter-radius);
9187
+ }
9188
+
9189
+ .muka-inputcounter__group .muka-button:last-child {
9190
+ border-start-end-radius: var(--muka-inputcounter-radius);
9191
+ border-end-end-radius: var(--muka-inputcounter-radius);
9192
+ }
9193
+
9194
+ .muka-inputcounter__divider {
9195
+ flex: none;
9196
+ width: var(--border-width-regular);
9197
+ background-color: var(--color-border-default);
9198
+ }
9199
+
9200
+
8957
9201
  /* Input */
8958
9202
  /* Input Component Styles - Using Muka Design Tokens */
8959
9203
 
@@ -13392,6 +13636,39 @@ button.muka-chat-photo-grid__tile:focus-visible {
13392
13636
  opacity: 1; /* Remove opacity since we have proper disabled tokens */
13393
13637
  }
13394
13638
 
13639
+ /* Destructive variant - primary's structure on the solid error fill, for
13640
+ irreversible actions. Hover and pressed step away from the label color, so
13641
+ contrast never drops (darker in light themes, lighter in dark themes).
13642
+ Disabled is neutral grey rather than primary's brand-tinted fill. */
13643
+ .muka-button--destructive {
13644
+ background-color: var(--button-color-destructive-background-default);
13645
+ color: var(--button-color-destructive-foreground-default);
13646
+ box-shadow: var(--button-color-destructive-shadow-default);
13647
+ }
13648
+
13649
+ .muka-button--destructive:hover:not(:disabled) {
13650
+ background-color: var(--button-color-destructive-background-hover);
13651
+ color: var(--button-color-destructive-foreground-hover);
13652
+ box-shadow: var(--button-color-destructive-shadow-hover);
13653
+ }
13654
+
13655
+ .muka-button--destructive:active:not(:disabled),
13656
+ .muka-button--destructive.muka-button--pressed:not(:disabled),
13657
+ .muka-button--destructive[data-state="open"]:not(:disabled),
13658
+ .muka-button--destructive[aria-pressed="true"]:not(:disabled) {
13659
+ background-color: var(--button-color-destructive-background-pressed);
13660
+ color: var(--button-color-destructive-foreground-pressed);
13661
+ box-shadow: var(--button-color-destructive-shadow-pressed);
13662
+ }
13663
+
13664
+ .muka-button--destructive:disabled {
13665
+ background-color: var(--button-color-destructive-background-disabled);
13666
+ color: var(--button-color-destructive-foreground-disabled);
13667
+ box-shadow: var(--button-color-destructive-shadow-disabled);
13668
+ cursor: not-allowed;
13669
+ opacity: 1;
13670
+ }
13671
+
13395
13672
  /* Secondary variant - supporting actions, no border, only bottom inner shadow */
13396
13673
  .muka-button--secondary {
13397
13674
  background-color: var(--button-color-secondary-background-default);
@@ -14325,12 +14602,29 @@ button.muka-chat-photo-grid__tile:focus-visible {
14325
14602
  vertical-align: middle;
14326
14603
  background-color: var(--avatar-color-background-default);
14327
14604
  color: var(--avatar-color-foreground-default);
14328
- border: var(--avatar-border-width) solid var(--avatar-color-border-default);
14329
14605
  font-family: var(--alias-font-brand-family);
14330
14606
  font-weight: var(--alias-font-brand-weight-semibold);
14331
14607
  }
14332
14608
 
14333
14609
  /* Size variants */
14610
+ .muka-avatar--4xs {
14611
+ width: var(--avatar-size-4xs);
14612
+ height: var(--avatar-size-4xs);
14613
+ font-size: var(--avatar-font-size-3xs); /* only used by an AvatarGroup "+N" */
14614
+ }
14615
+
14616
+ .muka-avatar--3xs {
14617
+ width: var(--avatar-size-3xs);
14618
+ height: var(--avatar-size-3xs);
14619
+ font-size: var(--avatar-font-size-3xs);
14620
+ }
14621
+
14622
+ .muka-avatar--2xs {
14623
+ width: var(--avatar-size-2xs);
14624
+ height: var(--avatar-size-2xs);
14625
+ font-size: var(--avatar-font-size-2xs);
14626
+ }
14627
+
14334
14628
  .muka-avatar--xs {
14335
14629
  width: var(--avatar-size-xs);
14336
14630
  height: var(--avatar-size-xs);
@@ -14370,6 +14664,20 @@ button.muka-chat-photo-grid__tile:focus-visible {
14370
14664
  border-radius: var(--avatar-radius-square);
14371
14665
  }
14372
14666
 
14667
+ .muka-avatar--square.muka-avatar--4xs,
14668
+ .muka-avatar--square.muka-avatar--3xs,
14669
+ .muka-avatar--square.muka-avatar--2xs {
14670
+ border-radius: var(--avatar-radius-square-sm);
14671
+ }
14672
+
14673
+ /* 4xs is too small for initials, the fallback icon or a status dot:
14674
+ it shows the picture, or the plain background */
14675
+ .muka-avatar--4xs .muka-avatar__initials,
14676
+ .muka-avatar--4xs .muka-avatar__fallback,
14677
+ .muka-avatar--4xs .muka-avatar__status {
14678
+ display: none;
14679
+ }
14680
+
14373
14681
  /* Clickable state */
14374
14682
  .muka-avatar--clickable {
14375
14683
  cursor: pointer;
@@ -14473,6 +14781,16 @@ button.muka-chat-photo-grid__tile:focus-visible {
14473
14781
  box-sizing: border-box;
14474
14782
  }
14475
14783
 
14784
+ .muka-avatar--3xs .muka-avatar__status {
14785
+ width: var(--avatar-status-size-3xs);
14786
+ height: var(--avatar-status-size-3xs);
14787
+ }
14788
+
14789
+ .muka-avatar--2xs .muka-avatar__status {
14790
+ width: var(--avatar-status-size-2xs);
14791
+ height: var(--avatar-status-size-2xs);
14792
+ }
14793
+
14476
14794
  .muka-avatar--xs .muka-avatar__status {
14477
14795
  width: var(--avatar-status-size-xs);
14478
14796
  height: var(--avatar-status-size-xs);
@@ -14526,56 +14844,130 @@ button.muka-chat-photo-grid__tile:focus-visible {
14526
14844
  background-color: var(--avatar-color-status-away);
14527
14845
  }
14528
14846
 
14529
- /* Avatar Group */
14847
+ /* Avatar Group (Figma "Avatar Stack") */
14530
14848
  .muka-avatar-group {
14531
14849
  display: inline-flex;
14532
14850
  align-items: center;
14533
14851
  flex-direction: row;
14534
14852
  }
14535
14853
 
14854
+ /* Later avatars sit on top of earlier ones (DOM order); a hovered one comes to the front */
14536
14855
  .muka-avatar-group__item {
14537
14856
  position: relative;
14538
14857
  display: inline-flex;
14539
- border: 2px solid var(--color-surface-level1);
14540
- border-radius: inherit;
14858
+ z-index: 0;
14541
14859
  }
14542
14860
 
14543
- /* Add border radius to match avatar shape */
14544
- .muka-avatar-group__item .muka-avatar--circle {
14545
- border-radius: var(--avatar-radius-circle);
14861
+ .muka-avatar-group__item:hover {
14862
+ z-index: 10;
14546
14863
  }
14547
14864
 
14548
- .muka-avatar-group__item .muka-avatar--square {
14549
- border-radius: var(--avatar-radius-square);
14865
+ /* Grouped avatars get a ring outside their edge, drawn as a shadow so it
14866
+ does not change the avatar's size or the overlap */
14867
+ .muka-avatar-group__item .muka-avatar {
14868
+ box-shadow: 0 0 0 var(--avatar-group-ring-width) var(--avatar-group-ring-color);
14869
+ }
14870
+
14871
+ /* Overlap. Figma specifies exact values for 48 / 32 / 24px avatars (sm / 2xs / 3xs);
14872
+ other sizes use the same proportions: tight 2/3, compact 1/2, spacious 1/3. */
14873
+ .muka-avatar-group--4xs { --muka-avatar-group-size: var(--avatar-size-4xs); }
14874
+ .muka-avatar-group--3xs { --muka-avatar-group-size: var(--avatar-size-3xs); }
14875
+ .muka-avatar-group--2xs { --muka-avatar-group-size: var(--avatar-size-2xs); }
14876
+ .muka-avatar-group--xs { --muka-avatar-group-size: var(--avatar-size-xs); }
14877
+ .muka-avatar-group--sm { --muka-avatar-group-size: var(--avatar-size-sm); }
14878
+ .muka-avatar-group--md { --muka-avatar-group-size: var(--avatar-size-md); }
14879
+ .muka-avatar-group--lg { --muka-avatar-group-size: var(--avatar-size-lg); }
14880
+ .muka-avatar-group--xl { --muka-avatar-group-size: var(--avatar-size-xl); }
14881
+
14882
+ .muka-avatar-group--tight { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) * 2 / 3); }
14883
+ .muka-avatar-group--compact { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 2); }
14884
+ .muka-avatar-group--spacious { --muka-avatar-group-overlap: calc(var(--muka-avatar-group-size) / 3); }
14885
+
14886
+ .muka-avatar-group--tight.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-sm); }
14887
+ .muka-avatar-group--tight.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-2xs); }
14888
+ .muka-avatar-group--tight.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-tight-3xs); }
14889
+ .muka-avatar-group--compact.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-sm); }
14890
+ .muka-avatar-group--compact.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-2xs); }
14891
+ .muka-avatar-group--compact.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-compact-3xs); }
14892
+ .muka-avatar-group--spacious.muka-avatar-group--sm { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-sm); }
14893
+ .muka-avatar-group--spacious.muka-avatar-group--2xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-2xs); }
14894
+ .muka-avatar-group--spacious.muka-avatar-group--3xs { --muka-avatar-group-overlap: var(--avatar-group-overlap-spacious-3xs); }
14895
+
14896
+ .muka-avatar-group__item:not(:first-child) {
14897
+ margin-left: calc(-1 * var(--muka-avatar-group-overlap));
14550
14898
  }
14551
14899
 
14552
- .muka-avatar-group__item .muka-avatar {
14900
+ /* Overflow avatar styling */
14901
+ .muka-avatar--overflow {
14902
+ background-color: var(--avatar-color-background-default);
14903
+ color: var(--avatar-color-foreground-default);
14904
+ font-weight: var(--alias-font-brand-weight-semibold);
14905
+ }
14906
+
14907
+
14908
+ /* Autocomplete */
14909
+ /* Autocomplete — Figma Input Autocomplete (Input field + single-line suggestion Menu).
14910
+ The field reuses the Input styles (.muka-input*); only the menu wiring lives here. */
14911
+
14912
+ .muka-autocomplete {
14913
+ min-width: 200px;
14914
+ }
14915
+
14916
+ /* Covers the field's outer edge so the menu matches its full width. The menu
14917
+ is only open while focused, when the field has the bold border. */
14918
+ .muka-autocomplete__menu-anchor {
14919
+ position: absolute;
14920
+ inset: calc(-1 * var(--border-width-bold));
14921
+ z-index: 0;
14922
+ margin: 0;
14923
+ padding: 0;
14553
14924
  border: none;
14925
+ background: transparent;
14926
+ pointer-events: none;
14927
+ opacity: 0;
14554
14928
  }
14555
14929
 
14556
- /* Spacing variants for avatar group */
14557
- .muka-avatar-group--tight .muka-avatar-group__item:not(:first-child) {
14558
- margin-left: calc(var(--avatar-group-spacing-tight));
14930
+ /* Keep the field content above the invisible anchor. */
14931
+ .muka-autocomplete__field > :not(.muka-autocomplete__menu-anchor) {
14932
+ position: relative;
14933
+ z-index: 1;
14559
14934
  }
14560
14935
 
14561
- .muka-avatar-group--normal .muka-avatar-group__item:not(:first-child) {
14562
- margin-left: calc(var(--avatar-group-spacing-normal));
14936
+ /* Figma: the menu is as wide as the field (never below the menu min-width token). */
14937
+ .muka-autocomplete__menu {
14938
+ width: var(--radix-dropdown-menu-trigger-width);
14939
+ max-width: calc(100vw - 2rem);
14563
14940
  }
14564
14941
 
14565
- /* Z-index stacking for overlap effect */
14566
- .muka-avatar-group__item {
14567
- z-index: 0;
14942
+ /* Suggestions are single-line; long labels truncate. */
14943
+ .muka-autocomplete__menu .muka-menu__item-label {
14944
+ overflow: hidden;
14945
+ text-overflow: ellipsis;
14568
14946
  }
14569
14947
 
14570
- .muka-avatar-group__item:hover {
14571
- z-index: 10;
14948
+ /* Loading and empty rows: menu-row geometry, not selectable. */
14949
+ .muka-autocomplete__status {
14950
+ display: flex;
14951
+ align-items: center;
14952
+ gap: var(--menu-item-gap);
14953
+ min-height: var(--menu-item-height);
14954
+ padding: var(--menu-item-padding-y) var(--menu-item-padding-x);
14955
+ color: var(--color-text-subtle-default);
14956
+ font-family: var(--text-label-md-regular-fontFamily);
14957
+ font-size: var(--text-label-md-regular-fontSize);
14958
+ font-weight: var(--text-label-md-regular-fontWeight);
14959
+ line-height: var(--text-label-md-regular-lineHeight);
14572
14960
  }
14573
14961
 
14574
- /* Overflow avatar styling */
14575
- .muka-avatar--overflow {
14576
- background-color: var(--avatar-color-background-default);
14577
- color: var(--avatar-color-foreground-default);
14578
- font-weight: var(--alias-font-brand-weight-semibold);
14962
+ .muka-autocomplete__footer {
14963
+ flex-shrink: 0;
14964
+ padding: var(--spacing-2) var(--spacing-3);
14965
+ border-top: var(--border-width-regular) solid var(--color-border-default);
14966
+ color: var(--color-text-subtle-default);
14967
+ font-family: var(--text-label-sm-regular-fontFamily);
14968
+ font-size: var(--text-label-sm-regular-fontSize);
14969
+ font-weight: var(--text-label-sm-regular-fontWeight);
14970
+ line-height: var(--text-label-sm-regular-lineHeight);
14579
14971
  }
14580
14972
 
14581
14973