@evinvest/uikit 0.32.0 → 0.33.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 (288) hide show
  1. package/README.md +21 -10
  2. package/dist/components/atomic/accordion.js +2 -1
  3. package/dist/components/atomic/accordion.js.map +1 -1
  4. package/dist/components/atomic/alert.js +4 -4
  5. package/dist/components/atomic/alert.js.map +1 -1
  6. package/dist/components/atomic/badge.js +4 -3
  7. package/dist/components/atomic/badge.js.map +1 -1
  8. package/dist/components/atomic/breadcrumb.js +7 -9
  9. package/dist/components/atomic/breadcrumb.js.map +1 -1
  10. package/dist/components/atomic/button.js +4 -3
  11. package/dist/components/atomic/button.js.map +1 -1
  12. package/dist/components/atomic/calendar.js +10 -25
  13. package/dist/components/atomic/calendar.js.map +1 -1
  14. package/dist/components/atomic/checkbox.js +2 -1
  15. package/dist/components/atomic/checkbox.js.map +1 -1
  16. package/dist/components/atomic/command.js +5 -20
  17. package/dist/components/atomic/command.js.map +1 -1
  18. package/dist/components/atomic/context-menu.js +6 -13
  19. package/dist/components/atomic/context-menu.js.map +1 -1
  20. package/dist/components/atomic/dialog.js +4 -2
  21. package/dist/components/atomic/dialog.js.map +1 -1
  22. package/dist/components/atomic/dropdown-menu.js +6 -14
  23. package/dist/components/atomic/dropdown-menu.js.map +1 -1
  24. package/dist/components/atomic/hover-card.js.map +1 -1
  25. package/dist/components/atomic/info-tip.js +8 -9
  26. package/dist/components/atomic/info-tip.js.map +1 -1
  27. package/dist/components/atomic/input-otp.js +2 -1
  28. package/dist/components/atomic/input-otp.js.map +1 -1
  29. package/dist/components/atomic/key-value.js +5 -4
  30. package/dist/components/atomic/key-value.js.map +1 -1
  31. package/dist/components/atomic/menubar.js +7 -18
  32. package/dist/components/atomic/menubar.js.map +1 -1
  33. package/dist/components/atomic/native-select.js +1 -1
  34. package/dist/components/atomic/native-select.js.map +1 -1
  35. package/dist/components/atomic/navigation-menu.js +6 -14
  36. package/dist/components/atomic/navigation-menu.js.map +1 -1
  37. package/dist/components/atomic/pagination.js +18 -19
  38. package/dist/components/atomic/pagination.js.map +1 -1
  39. package/dist/components/atomic/popover.js.map +1 -1
  40. package/dist/components/atomic/radio-group.js +5 -4
  41. package/dist/components/atomic/radio-group.js.map +1 -1
  42. package/dist/components/atomic/section-descriptor.js +5 -8
  43. package/dist/components/atomic/section-descriptor.js.map +1 -1
  44. package/dist/components/atomic/select-listbox.js +2 -2
  45. package/dist/components/atomic/select-listbox.js.map +1 -1
  46. package/dist/components/atomic/select.js +5 -13
  47. package/dist/components/atomic/select.js.map +1 -1
  48. package/dist/components/atomic/sheet.js +4 -2
  49. package/dist/components/atomic/sheet.js.map +1 -1
  50. package/dist/components/atomic/sidebar.js +7 -26
  51. package/dist/components/atomic/sidebar.js.map +1 -1
  52. package/dist/components/atomic/slider.js.map +1 -1
  53. package/dist/components/atomic/sonner.js +20 -18
  54. package/dist/components/atomic/sonner.js.map +1 -1
  55. package/dist/components/atomic/spinner.js +6 -3
  56. package/dist/components/atomic/spinner.js.map +1 -1
  57. package/dist/components/atomic/tabs.js.map +1 -1
  58. package/dist/components/atomic/toggle-group.js +2 -2
  59. package/dist/components/atomic/toggle-group.js.map +1 -1
  60. package/dist/components/atomic/toggle.js +3 -6
  61. package/dist/components/atomic/toggle.js.map +1 -1
  62. package/dist/components/atomic/tooltip.js.map +1 -1
  63. package/dist/components/derived/carousel.js +6 -6
  64. package/dist/components/derived/carousel.js.map +1 -1
  65. package/dist/components/derived/command-palette.js +8 -7
  66. package/dist/components/derived/command-palette.js.map +1 -1
  67. package/dist/components/derived/confirm-dialog.js +8 -13
  68. package/dist/components/derived/confirm-dialog.js.map +1 -1
  69. package/dist/components/derived/date-time-picker.js +10 -14
  70. package/dist/components/derived/date-time-picker.js.map +1 -1
  71. package/dist/components/derived/field.js.map +1 -1
  72. package/dist/components/derived/form.js +0 -1
  73. package/dist/components/derived/form.js.map +1 -1
  74. package/dist/components/derived/icon-button.js.map +1 -1
  75. package/dist/components/derived/item.js +0 -1
  76. package/dist/components/derived/item.js.map +1 -1
  77. package/dist/components/derived/popover-form.js +4 -3
  78. package/dist/components/derived/popover-form.js.map +1 -1
  79. package/dist/components/derived/settings.js +4 -4
  80. package/dist/components/derived/settings.js.map +1 -1
  81. package/dist/components/shell/account-menu-profile.js +1 -1
  82. package/dist/components/shell/account-menu-profile.js.map +1 -1
  83. package/dist/components/shell/account-settings-dialog.js +3 -2
  84. package/dist/components/shell/account-settings-dialog.js.map +1 -1
  85. package/dist/components/shell/aside.js +6 -4
  86. package/dist/components/shell/aside.js.map +1 -1
  87. package/dist/components/shell/auth-wall.js +3 -5
  88. package/dist/components/shell/auth-wall.js.map +1 -1
  89. package/dist/components/shell/bottom-tab-bar.js +3 -3
  90. package/dist/components/shell/bottom-tab-bar.js.map +1 -1
  91. package/dist/components/shell/chat-composer.js +9 -7
  92. package/dist/components/shell/chat-composer.js.map +1 -1
  93. package/dist/components/shell/chat-message.js.map +1 -1
  94. package/dist/components/shell/chat-typing.js +2 -1
  95. package/dist/components/shell/chat-typing.js.map +1 -1
  96. package/dist/components/shell/footer.js +26 -24
  97. package/dist/components/shell/footer.js.map +1 -1
  98. package/dist/components/shell/header-controls.js +17 -15
  99. package/dist/components/shell/header-controls.js.map +1 -1
  100. package/dist/components/shell/hotbar.js +158 -0
  101. package/dist/components/shell/hotbar.js.map +1 -0
  102. package/dist/components/shell/logo.js +3 -2
  103. package/dist/components/shell/logo.js.map +1 -1
  104. package/dist/components/shell/mobile-app-bar.js +4 -4
  105. package/dist/components/shell/mobile-app-bar.js.map +1 -1
  106. package/dist/components/shell/nav-collapse.js +6 -5
  107. package/dist/components/shell/nav-collapse.js.map +1 -1
  108. package/dist/components/shell/resource-error.js +2 -2
  109. package/dist/components/shell/resource-error.js.map +1 -1
  110. package/dist/components/shell/section-nav.js +3 -3
  111. package/dist/components/shell/section-nav.js.map +1 -1
  112. package/dist/components/shell/shell-icons.js +7 -22
  113. package/dist/components/shell/shell-icons.js.map +1 -1
  114. package/dist/components/shell/shell-nav.js +4 -4
  115. package/dist/components/shell/shell-nav.js.map +1 -1
  116. package/dist/components/shell/smart-header.js.map +1 -1
  117. package/dist/components/shell/status-screen.js +35 -35
  118. package/dist/components/shell/status-screen.js.map +1 -1
  119. package/dist/components/shell/system-banner.js +6 -6
  120. package/dist/components/shell/system-banner.js.map +1 -1
  121. package/dist/components/shell/workspace-tab.js +2 -1
  122. package/dist/components/shell/workspace-tab.js.map +1 -1
  123. package/dist/generated/accent.js +10 -10
  124. package/dist/generated/accent.js.map +1 -1
  125. package/dist/generated/accordion.js +6 -2
  126. package/dist/generated/accordion.js.map +1 -1
  127. package/dist/generated/account-list.js +4 -4
  128. package/dist/generated/account-list.js.map +1 -1
  129. package/dist/generated/account-settings-dialog.js +6 -2
  130. package/dist/generated/account-settings-dialog.js.map +1 -1
  131. package/dist/generated/alert-dialog.js +1 -1
  132. package/dist/generated/alert-dialog.js.map +1 -1
  133. package/dist/generated/alert.js +3 -10
  134. package/dist/generated/alert.js.map +1 -1
  135. package/dist/generated/aside.js +7 -0
  136. package/dist/generated/aside.js.map +1 -1
  137. package/dist/generated/badge.js +2 -11
  138. package/dist/generated/badge.js.map +1 -1
  139. package/dist/generated/band.js +10 -10
  140. package/dist/generated/band.js.map +1 -1
  141. package/dist/generated/breadcrumb.js +1 -1
  142. package/dist/generated/breadcrumb.js.map +1 -1
  143. package/dist/generated/button-group.js +3 -3
  144. package/dist/generated/button-group.js.map +1 -1
  145. package/dist/generated/button.js +4 -20
  146. package/dist/generated/button.js.map +1 -1
  147. package/dist/generated/calendar.js +5 -5
  148. package/dist/generated/calendar.js.map +1 -1
  149. package/dist/generated/card.js +1 -1
  150. package/dist/generated/card.js.map +1 -1
  151. package/dist/generated/carousel.js +1 -1
  152. package/dist/generated/carousel.js.map +1 -1
  153. package/dist/generated/chat-composer.js +9 -2
  154. package/dist/generated/chat-composer.js.map +1 -1
  155. package/dist/generated/chat-message.js +25 -19
  156. package/dist/generated/chat-message.js.map +1 -1
  157. package/dist/generated/checkbox.js +1 -1
  158. package/dist/generated/checkbox.js.map +1 -1
  159. package/dist/generated/command-palette.js +10 -1
  160. package/dist/generated/command-palette.js.map +1 -1
  161. package/dist/generated/command.js +8 -6
  162. package/dist/generated/command.js.map +1 -1
  163. package/dist/generated/confirm-dialog.js +8 -8
  164. package/dist/generated/confirm-dialog.js.map +1 -1
  165. package/dist/generated/context-menu.js +7 -5
  166. package/dist/generated/context-menu.js.map +1 -1
  167. package/dist/generated/copy.js +97 -0
  168. package/dist/generated/copy.js.map +1 -0
  169. package/dist/generated/date-time-picker.js +10 -0
  170. package/dist/generated/date-time-picker.js.map +1 -1
  171. package/dist/generated/dialog.js +2 -2
  172. package/dist/generated/dialog.js.map +1 -1
  173. package/dist/generated/drawer.js +6 -6
  174. package/dist/generated/drawer.js.map +1 -1
  175. package/dist/generated/dropdown-menu.js +7 -5
  176. package/dist/generated/dropdown-menu.js.map +1 -1
  177. package/dist/generated/empty.js +5 -5
  178. package/dist/generated/empty.js.map +1 -1
  179. package/dist/generated/field.js +9 -7
  180. package/dist/generated/field.js.map +1 -1
  181. package/dist/generated/footer.js +45 -0
  182. package/dist/generated/footer.js.map +1 -0
  183. package/dist/generated/header-controls.js +5 -10
  184. package/dist/generated/header-controls.js.map +1 -1
  185. package/dist/generated/hover-card.js +1 -1
  186. package/dist/generated/hover-card.js.map +1 -1
  187. package/dist/generated/icon-button.js +4 -2
  188. package/dist/generated/icon-button.js.map +1 -1
  189. package/dist/generated/icons.js +36 -0
  190. package/dist/generated/icons.js.map +1 -0
  191. package/dist/generated/info-tip.js +5 -0
  192. package/dist/generated/info-tip.js.map +1 -0
  193. package/dist/generated/input-group.js +10 -10
  194. package/dist/generated/input-group.js.map +1 -1
  195. package/dist/generated/input-otp.js +2 -2
  196. package/dist/generated/input-otp.js.map +1 -1
  197. package/dist/generated/input.js +4 -4
  198. package/dist/generated/input.js.map +1 -1
  199. package/dist/generated/item.js +11 -11
  200. package/dist/generated/item.js.map +1 -1
  201. package/dist/generated/kbd.js +1 -1
  202. package/dist/generated/kbd.js.map +1 -1
  203. package/dist/generated/key-value.js +7 -1
  204. package/dist/generated/key-value.js.map +1 -1
  205. package/dist/generated/label.js +1 -1
  206. package/dist/generated/label.js.map +1 -1
  207. package/dist/generated/logo.js +9 -0
  208. package/dist/generated/logo.js.map +1 -0
  209. package/dist/generated/menu.js +7 -0
  210. package/dist/generated/menu.js.map +1 -0
  211. package/dist/generated/menubar.js +10 -8
  212. package/dist/generated/menubar.js.map +1 -1
  213. package/dist/generated/navigation-menu.js +11 -5
  214. package/dist/generated/navigation-menu.js.map +1 -1
  215. package/dist/generated/orientation.js +5 -0
  216. package/dist/generated/orientation.js.map +1 -0
  217. package/dist/generated/pagination.js +15 -0
  218. package/dist/generated/pagination.js.map +1 -0
  219. package/dist/generated/popover-form.js +5 -0
  220. package/dist/generated/popover-form.js.map +1 -1
  221. package/dist/generated/popover.js +1 -1
  222. package/dist/generated/popover.js.map +1 -1
  223. package/dist/generated/primitives.js +7 -0
  224. package/dist/generated/primitives.js.map +1 -0
  225. package/dist/generated/radio-group.js +5 -1
  226. package/dist/generated/radio-group.js.map +1 -1
  227. package/dist/generated/section-descriptor.js +7 -0
  228. package/dist/generated/section-descriptor.js.map +1 -0
  229. package/dist/generated/select.js +16 -10
  230. package/dist/generated/select.js.map +1 -1
  231. package/dist/generated/settings.js +2 -7
  232. package/dist/generated/settings.js.map +1 -1
  233. package/dist/generated/sheet.js +1 -1
  234. package/dist/generated/sheet.js.map +1 -1
  235. package/dist/generated/sidebar.js +24 -12
  236. package/dist/generated/sidebar.js.map +1 -1
  237. package/dist/generated/size.js +12 -0
  238. package/dist/generated/size.js.map +1 -0
  239. package/dist/generated/skeleton.js +1 -1
  240. package/dist/generated/skeleton.js.map +1 -1
  241. package/dist/generated/slider.js +2 -2
  242. package/dist/generated/slider.js.map +1 -1
  243. package/dist/generated/slot.js +5 -0
  244. package/dist/generated/slot.js.map +1 -0
  245. package/dist/generated/smart-header.js +2 -0
  246. package/dist/generated/smart-header.js.map +1 -1
  247. package/dist/generated/sonner.js +11 -13
  248. package/dist/generated/sonner.js.map +1 -1
  249. package/dist/generated/spinner.js +5 -0
  250. package/dist/generated/spinner.js.map +1 -0
  251. package/dist/generated/status-screen.js +27 -0
  252. package/dist/generated/status-screen.js.map +1 -0
  253. package/dist/generated/switch.js +2 -2
  254. package/dist/generated/switch.js.map +1 -1
  255. package/dist/generated/system-banner.js +6 -16
  256. package/dist/generated/system-banner.js.map +1 -1
  257. package/dist/generated/table.js +9 -9
  258. package/dist/generated/table.js.map +1 -1
  259. package/dist/generated/tabs.js +2 -2
  260. package/dist/generated/tabs.js.map +1 -1
  261. package/dist/generated/textarea.js +1 -1
  262. package/dist/generated/textarea.js.map +1 -1
  263. package/dist/generated/toggle-group.js +9 -0
  264. package/dist/generated/toggle-group.js.map +1 -0
  265. package/dist/generated/toggle.js +1 -9
  266. package/dist/generated/toggle.js.map +1 -1
  267. package/dist/generated/tone.js +12 -0
  268. package/dist/generated/tone.js.map +1 -0
  269. package/dist/generated/tooltip.js +1 -1
  270. package/dist/generated/tooltip.js.map +1 -1
  271. package/dist/generated/workspace-tab.js +3 -3
  272. package/dist/generated/workspace-tab.js.map +1 -1
  273. package/dist/icons/icon-shapes.js +10 -0
  274. package/dist/icons/icon-shapes.js.map +1 -0
  275. package/dist/icons/select-chevron.js +2 -1
  276. package/dist/icons/select-chevron.js.map +1 -1
  277. package/dist/icons/ui-icons.js +3 -57
  278. package/dist/icons/ui-icons.js.map +1 -1
  279. package/dist/index.d.ts +203 -155
  280. package/dist/index.js +1 -0
  281. package/dist/lib/cn.js +1 -0
  282. package/dist/lib/cn.js.map +1 -1
  283. package/dist/primitives/use-floating.js.map +1 -1
  284. package/dist/primitives/use-roving-focus.js.map +1 -1
  285. package/package.json +1 -1
  286. package/styles/ev.css +13 -76
  287. package/styles/theme.css +133 -66
  288. package/styles/tokens.css +157 -149
package/styles/tokens.css CHANGED
@@ -23,17 +23,21 @@
23
23
  * accent-trace · accent-debug · accent-info · accent-warn · accent-error
24
24
  * primary-ink — the primary role as ink on a surface, where the
25
25
  * fill and the readable value are different colours;
26
- * primary-hover · primary-border — the solid button's states
26
+ * primary-hover · accent-*-hover — a solid fill's hover, derived;
27
+ * primary-border — the primary button's edge;
28
+ * on-secondary — the ink, derived
27
29
  * positive-ink · accent-info-ink — a quiet status role as text on
28
30
  * a surface; derived from the role and the ink, a palette may pin
29
31
  * them. warn and error are text in their own colour
30
- * FACES button-primary-* · button-danger-* ({bg,hover,border,ink}) and
31
- * chip-{neutral,primary,positive,info,warn,error}-{bg,border}:
32
- * what a Button or Badge paints, pinned per theme by EV and
32
+ * FACES button-danger-* ({bg,hover,border,ink}) and
33
+ * tint-{neutral,primary,positive,info,warn,error,trace,debug}-{fill,edge}:
34
+ * what a Button or a toned chip, toast or banner paints, pinned per theme by EV and
33
35
  * derived for a brand. Not part of what a brand file owes.
34
36
  * TYPE text-caption · body-s · body · body-l · h3 · h2 · h1 ·
35
- * figure-m · figure-l (size and line height); fonts
36
- * SCALARS radius · control-radius · chip-radius · control-* · display-scale ·
37
+ * figure-m · figure-l (size and line height), derived from
38
+ * body-{size,step,leading} and display-{base,step,leading} ·
39
+ * figure-leading · display-scale; fonts
40
+ * SCALARS radius · control-radius · chip-radius · control-* · disabled-opacity · body-* · display-* · figure-leading ·
37
41
  * page-* · shell-* · depth-* (behind shadow-card/elevated/overlay)
38
42
  * MOTION ev-ease-* · ev-dur-* · ev-rise · ev-stagger(-section)
39
43
  * CHARTS chart-1 … chart-6
@@ -720,6 +724,11 @@
720
724
  --radius-lg: var(--radius);
721
725
  --radius-xl: calc(var(--radius) + 4px);
722
726
  --radius-2xl: calc(var(--radius) + 8px);
727
+ /* the roles the kit's tables name; the steps above are the consumer's */
728
+ --radius-control: var(--control-radius);
729
+ --radius-panel: var(--radius);
730
+ --radius-chip: var(--chip-radius);
731
+ --radius-row: calc(var(--radius) - 4px); /* concentric inside a panel's p-1 */
723
732
 
724
733
  /* The names stay, the values are per theme: u2 is flat (`--depth-*` is a
725
734
  * zero shadow), Oldschool brings the ladder back in ev.css. */
@@ -727,25 +736,25 @@
727
736
  --shadow-elevated: var(--depth-elevated);
728
737
  --shadow-overlay: var(--depth-overlay);
729
738
 
730
- /* Type scale: size / line-height in pairs, the Figma text styles. */
731
- --text-caption: 0.6875rem;
732
- --text-caption--line-height: 0.875rem;
733
- --text-body-s: 0.75rem;
734
- --text-body-s--line-height: 1rem;
735
- --text-body: 0.8125rem;
736
- --text-body--line-height: 1.125rem;
737
- --text-body-l: 0.875rem;
738
- --text-body-l--line-height: 1.25rem;
739
- --text-h3: 0.875rem;
740
- --text-h3--line-height: 1.25rem;
741
- --text-h2: 1.5rem;
742
- --text-h2--line-height: 1.875rem;
743
- --text-h1: 2rem;
744
- --text-h1--line-height: 2.375rem;
745
- --text-figure-m: 1.25rem;
746
- --text-figure-m--line-height: 1.5rem;
747
- --text-figure-l: 1.75rem;
748
- --text-figure-l--line-height: 2rem;
739
+ /* Type scale: two even-step ramps off the geometry rule's inputs (docs/spec/roles.md). */
740
+ --text-caption: calc(var(--body-size) - 2 * var(--body-step));
741
+ --text-caption--line-height: calc(var(--body-leading) - 4 * var(--body-step));
742
+ --text-body-s: calc(var(--body-size) - var(--body-step));
743
+ --text-body-s--line-height: calc(var(--body-leading) - 2 * var(--body-step));
744
+ --text-body: var(--body-size);
745
+ --text-body--line-height: var(--body-leading);
746
+ --text-body-l: calc(var(--body-size) + var(--body-step));
747
+ --text-body-l--line-height: calc(var(--body-leading) + 2 * var(--body-step));
748
+ --text-h3: calc(var(--body-size) + var(--body-step));
749
+ --text-h3--line-height: calc(var(--body-leading) + 2 * var(--body-step));
750
+ --text-h2: calc((var(--display-base) + 2 * var(--display-step)) * var(--display-scale));
751
+ --text-h2--line-height: calc((var(--display-base) + 2 * var(--display-step) + var(--display-leading)) * var(--display-scale));
752
+ --text-h1: calc((var(--display-base) + 4 * var(--display-step)) * var(--display-scale));
753
+ --text-h1--line-height: calc((var(--display-base) + 4 * var(--display-step) + var(--display-leading)) * var(--display-scale));
754
+ --text-figure-m: calc((var(--display-base) + var(--display-step)) * var(--display-scale));
755
+ --text-figure-m--line-height: calc((var(--display-base) + var(--display-step) + var(--figure-leading)) * var(--display-scale));
756
+ --text-figure-l: calc((var(--display-base) + 3 * var(--display-step)) * var(--display-scale));
757
+ --text-figure-l--line-height: calc((var(--display-base) + 3 * var(--display-step) + var(--figure-leading)) * var(--display-scale));
749
758
 
750
759
  /* The families are parameters, apart from the colour contract: a brand scope
751
760
  * sets `--brand-font-sans`, `--brand-font-serif` and `--brand-font-mono`
@@ -804,38 +813,51 @@
804
813
  --color-positive-ink: var(--positive-ink);
805
814
  --color-accent-trace: var(--accent-trace);
806
815
  --color-on-accent-trace: var(--on-accent-trace);
816
+ --color-accent-trace-hover: var(--accent-trace-hover);
807
817
  --color-accent-debug: var(--accent-debug);
808
818
  --color-on-accent-debug: var(--on-accent-debug);
819
+ --color-accent-debug-hover: var(--accent-debug-hover);
809
820
  --color-accent-info: var(--accent-info);
810
821
  --color-on-accent-info: var(--on-accent-info);
822
+ --color-accent-info-hover: var(--accent-info-hover);
811
823
  --color-accent-info-ink: var(--accent-info-ink);
812
824
  --color-accent-warn: var(--accent-warn);
813
825
  --color-on-accent-warn: var(--on-accent-warn);
826
+ --color-accent-warn-hover: var(--accent-warn-hover);
814
827
  --color-accent-error: var(--accent-error);
815
828
  --color-on-accent-error: var(--on-accent-error);
829
+ --color-accent-error-hover: var(--accent-error-hover);
816
830
 
817
- /* component faces: derived below, pinned per theme by EV, so `bg-button-primary-bg`
818
- * and `border-chip-error-border` are real utilities the class merge understands */
819
- --color-button-primary-bg: var(--button-primary-bg);
820
- --color-button-primary-hover: var(--button-primary-hover);
821
- --color-button-primary-border: var(--button-primary-border);
822
- --color-button-primary-ink: var(--button-primary-ink);
831
+ /* component faces: derived below, pinned per theme by EV, so `bg-button-danger-bg`
832
+ * and `border-tint-error-edge` are real utilities the class merge understands */
823
833
  --color-button-danger-bg: var(--button-danger-bg);
824
834
  --color-button-danger-hover: var(--button-danger-hover);
825
835
  --color-button-danger-border: var(--button-danger-border);
826
836
  --color-button-danger-ink: var(--button-danger-ink);
827
- --color-chip-neutral-bg: var(--chip-neutral-bg);
828
- --color-chip-neutral-border: var(--chip-neutral-border);
829
- --color-chip-primary-bg: var(--chip-primary-bg);
830
- --color-chip-primary-border: var(--chip-primary-border);
831
- --color-chip-positive-bg: var(--chip-positive-bg);
832
- --color-chip-positive-border: var(--chip-positive-border);
833
- --color-chip-info-bg: var(--chip-info-bg);
834
- --color-chip-info-border: var(--chip-info-border);
835
- --color-chip-warn-bg: var(--chip-warn-bg);
836
- --color-chip-warn-border: var(--chip-warn-border);
837
- --color-chip-error-bg: var(--chip-error-bg);
838
- --color-chip-error-border: var(--chip-error-border);
837
+ --color-tint-neutral-fill: var(--tint-neutral-fill);
838
+ --color-tint-neutral-edge: var(--tint-neutral-edge);
839
+ --color-tint-neutral-wash: var(--tint-neutral-wash);
840
+ --color-tint-primary-fill: var(--tint-primary-fill);
841
+ --color-tint-primary-edge: var(--tint-primary-edge);
842
+ --color-tint-primary-wash: var(--tint-primary-wash);
843
+ --color-tint-positive-fill: var(--tint-positive-fill);
844
+ --color-tint-positive-edge: var(--tint-positive-edge);
845
+ --color-tint-positive-wash: var(--tint-positive-wash);
846
+ --color-tint-info-fill: var(--tint-info-fill);
847
+ --color-tint-info-edge: var(--tint-info-edge);
848
+ --color-tint-info-wash: var(--tint-info-wash);
849
+ --color-tint-warn-fill: var(--tint-warn-fill);
850
+ --color-tint-warn-edge: var(--tint-warn-edge);
851
+ --color-tint-warn-wash: var(--tint-warn-wash);
852
+ --color-tint-error-fill: var(--tint-error-fill);
853
+ --color-tint-error-edge: var(--tint-error-edge);
854
+ --color-tint-error-wash: var(--tint-error-wash);
855
+ --color-tint-trace-fill: var(--tint-trace-fill);
856
+ --color-tint-trace-edge: var(--tint-trace-edge);
857
+ --color-tint-trace-wash: var(--tint-trace-wash);
858
+ --color-tint-debug-fill: var(--tint-debug-fill);
859
+ --color-tint-debug-edge: var(--tint-debug-edge);
860
+ --color-tint-debug-wash: var(--tint-debug-wash);
839
861
 
840
862
  /* charts — distinguishable hues carrying no significance */
841
863
  --color-chart-1: var(--chart-1);
@@ -875,7 +897,14 @@
875
897
  * side — ink over white needs ~47% to clear it, dark lands near 4:1. */
876
898
  --input: color-mix(in srgb, var(--ink) 48%, transparent);
877
899
  --ring: var(--primary-ink);
878
- --primary-hover: color-mix(in srgb, var(--primary) 95%, black);
900
+ --on-secondary: var(--ink);
901
+ /* a solid fill's hover moves away from its label, so the label only gains contrast */
902
+ --primary-hover: color-mix(in srgb, rgb(from var(--on-primary) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--primary));
903
+ --accent-trace-hover: color-mix(in srgb, rgb(from var(--on-accent-trace) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-trace));
904
+ --accent-debug-hover: color-mix(in srgb, rgb(from var(--on-accent-debug) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-debug));
905
+ --accent-info-hover: color-mix(in srgb, rgb(from var(--on-accent-info) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-info));
906
+ --accent-warn-hover: color-mix(in srgb, rgb(from var(--on-accent-warn) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-warn));
907
+ --accent-error-hover: color-mix(in srgb, rgb(from var(--on-accent-error) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-error));
879
908
  --primary-border: color-mix(in srgb, var(--primary-ink) 55%, transparent);
880
909
  /* the quiet status roles as text on a surface: a fill is a shape, and as text
881
910
  * it reads far below AA on a light plane. warn and error have none: they are
@@ -890,31 +919,40 @@
890
919
  * same scopes, listed in another order so the contract reader finds one rule
891
920
  * per selector. */
892
921
  :where([data-theme], [data-brand], .light, .dark, :root) {
893
- /* primary is an outline button, danger the same in the error role */
894
- --button-primary-bg: transparent;
895
- --button-primary-hover: var(--hover);
896
- --button-primary-border: color-mix(in srgb, var(--ink) 60%, transparent);
897
- --button-primary-ink: var(--ink);
922
+ /* danger is an outline in the error role */
898
923
  --button-danger-bg: transparent;
899
- --button-danger-hover: color-mix(in srgb, var(--accent-error) 10%, transparent);
924
+ --button-danger-hover: color-mix(in srgb, var(--accent-error) var(--tint-hover), transparent);
900
925
  --button-danger-border: var(--accent-error);
901
926
  --button-danger-ink: var(--accent-error);
902
927
 
903
- /* chips (Badge, status pills). The source is the colour the label wears, so
904
- * the edge and the label are one hue; --chip-fill and --chip-edge are in the
905
- * geometry. */
906
- --chip-neutral-bg: var(--hover);
907
- --chip-neutral-border: var(--border);
908
- --chip-primary-bg: color-mix(in srgb, var(--primary-ink) var(--chip-fill), transparent);
909
- --chip-primary-border: color-mix(in srgb, var(--primary-ink) var(--chip-edge), transparent);
910
- --chip-positive-bg: color-mix(in srgb, var(--positive-ink) var(--chip-fill), transparent);
911
- --chip-positive-border: color-mix(in srgb, var(--positive-ink) var(--chip-edge), transparent);
912
- --chip-info-bg: color-mix(in srgb, var(--accent-info-ink) var(--chip-fill), transparent);
913
- --chip-info-border: color-mix(in srgb, var(--accent-info-ink) var(--chip-edge), transparent);
914
- --chip-warn-bg: color-mix(in srgb, var(--accent-warn) var(--chip-fill), transparent);
915
- --chip-warn-border: color-mix(in srgb, var(--accent-warn) var(--chip-edge), transparent);
916
- --chip-error-bg: color-mix(in srgb, var(--accent-error) var(--chip-fill), transparent);
917
- --chip-error-border: color-mix(in srgb, var(--accent-error) var(--chip-edge), transparent);
928
+ /* a tone worn as a tint: a chip's fill and edge are the tone's ink at
929
+ * --tint-fill and --tint-edge, so the edge and the label are one hue, and an
930
+ * area's wash is it at --tint-wash. warn and error are their own ink
931
+ * (docs/spec/accents.md). */
932
+ --tint-neutral-fill: var(--hover);
933
+ --tint-neutral-edge: var(--border);
934
+ --tint-neutral-wash: transparent;
935
+ --tint-primary-fill: color-mix(in srgb, var(--primary-ink) var(--tint-fill), transparent);
936
+ --tint-primary-edge: color-mix(in srgb, var(--primary-ink) var(--tint-edge), transparent);
937
+ --tint-primary-wash: color-mix(in srgb, var(--primary-ink) var(--tint-wash), transparent);
938
+ --tint-positive-fill: color-mix(in srgb, var(--positive-ink) var(--tint-fill), transparent);
939
+ --tint-positive-edge: color-mix(in srgb, var(--positive-ink) var(--tint-edge), transparent);
940
+ --tint-positive-wash: color-mix(in srgb, var(--positive-ink) var(--tint-wash), transparent);
941
+ --tint-info-fill: color-mix(in srgb, var(--accent-info-ink) var(--tint-fill), transparent);
942
+ --tint-info-edge: color-mix(in srgb, var(--accent-info-ink) var(--tint-edge), transparent);
943
+ --tint-info-wash: color-mix(in srgb, var(--accent-info-ink) var(--tint-wash), transparent);
944
+ --tint-warn-fill: color-mix(in srgb, var(--accent-warn) var(--tint-fill), transparent);
945
+ --tint-warn-edge: color-mix(in srgb, var(--accent-warn) var(--tint-edge), transparent);
946
+ --tint-warn-wash: color-mix(in srgb, var(--accent-warn) var(--tint-wash), transparent);
947
+ --tint-error-fill: color-mix(in srgb, var(--accent-error) var(--tint-fill), transparent);
948
+ --tint-error-edge: color-mix(in srgb, var(--accent-error) var(--tint-edge), transparent);
949
+ --tint-error-wash: color-mix(in srgb, var(--accent-error) var(--tint-wash), transparent);
950
+ --tint-trace-fill: color-mix(in srgb, var(--accent-trace) var(--tint-fill), transparent);
951
+ --tint-trace-edge: color-mix(in srgb, var(--accent-trace) var(--tint-edge), transparent);
952
+ --tint-trace-wash: color-mix(in srgb, var(--accent-trace) var(--tint-wash), transparent);
953
+ --tint-debug-fill: color-mix(in srgb, var(--accent-debug) var(--tint-fill), transparent);
954
+ --tint-debug-edge: color-mix(in srgb, var(--accent-debug) var(--tint-edge), transparent);
955
+ --tint-debug-wash: color-mix(in srgb, var(--accent-debug) var(--tint-wash), transparent);
918
956
  }
919
957
 
920
958
  /* Geometry. A `[data-brand]` scope is a theme root of its own, so it restarts
@@ -924,22 +962,37 @@
924
962
  --radius: 0.375rem; /* panels and menus */
925
963
  /* control geometry, so a consumer reshapes every button/input at once */
926
964
  --control-radius: 0.25rem;
965
+ --control-h: 2.25rem;
966
+ --control-step: 0.25rem;
967
+ --control-inset: 1rem; /* the md rung's side inset; every other rung's moves with its height */
927
968
  --chip-radius: 0.25rem;
928
- /* how much of its ink a chip's fill and edge take, for a brand that pins
929
- * nothing: an outline by default, a tint where a theme raises the fill */
930
- --chip-fill: 0%;
931
- --chip-edge: 50%;
969
+ --disabled-opacity: 0.5;
970
+ /* how much of its ink a tint's fill and edge take: an outline by default, a
971
+ * tinted pill where a theme raises the fill; and a tone's pointed-at row or face */
972
+ --tint-fill: 0%;
973
+ --tint-edge: 50%;
974
+ --tint-hover: 10%;
975
+ /* how much of its ink an area in a tone (a banner, an alert) is washed with:
976
+ * an area needs a body to read as content, where a chip reads as an outline.
977
+ * At 10 % Light's positive and warn labels fall under their floor. */
978
+ --tint-wash: 6%;
932
979
  /* u2 is flat: depth is surface steps and hairlines. Never `none` — inside
933
980
  * Tailwind's comma-separated box-shadow list it invalidates the whole
934
981
  * declaration, and the focus ring goes with it. */
935
982
  --depth-card: 0 0 #0000;
936
983
  --depth-elevated: 0 0 #0000;
937
984
  --depth-overlay: 0 0 #0000;
938
- --control-py: 0.5rem;
939
- /* the Xl (call-to-action) button reads all three */
985
+ /* the Xl (call-to-action) rung's inset and text */
940
986
  --control-px: 2rem;
941
987
  --control-text: 1rem;
942
- /* multiplies the display type scale (uikit <Display>) */
988
+ /* the type ramps: text steps 1 px, display steps 4 px, a scale over the display tier */
989
+ --body-size: 0.8125rem;
990
+ --body-step: 0.0625rem;
991
+ --body-leading: 1.125rem;
992
+ --display-base: 1rem;
993
+ --display-step: 0.25rem;
994
+ --display-leading: 0.375rem; /* h1, h2 */
995
+ --figure-leading: 0.25rem; /* figure-m, figure-l */
943
996
  --display-scale: 1;
944
997
  /* the vertical rhythm of a full-bleed <Section>; `tight` is the sub-page one */
945
998
  --band-py: 2.25rem;
@@ -983,6 +1036,24 @@
983
1036
  */
984
1037
  }
985
1038
 
1039
+ /* The control height and inset ramps a `Size` step names, re-derived on every
1040
+ * scope that may set `--control-h`. Pin one step to bend the ramp. */
1041
+ :where(:root, [data-brand], [data-theme]) {
1042
+ --control-h-2xs: calc(var(--control-h) - 3 * var(--control-step));
1043
+ --control-h-xs: calc(var(--control-h) - 2 * var(--control-step));
1044
+ --control-h-sm: calc(var(--control-h) - var(--control-step));
1045
+ --control-h-md: var(--control-h);
1046
+ --control-h-lg: calc(var(--control-h) + var(--control-step));
1047
+ --control-h-xl: calc(var(--control-h) + 3 * var(--control-step));
1048
+ --control-h-touch: max(var(--control-h-lg), 2.75rem); /* the 44 px pointer-target floor (WCAG 2.5.5) */
1049
+ --control-inset-xs: calc(var(--control-h-xs) - var(--control-h) + var(--control-inset));
1050
+ --control-inset-sm: calc(var(--control-h-sm) - var(--control-h) + var(--control-inset));
1051
+ --control-inset-md: var(--control-inset);
1052
+ --control-inset-lg: calc(var(--control-h-lg) - var(--control-h) + var(--control-inset));
1053
+ --control-inset-xl: var(--control-px);
1054
+ --control-inset-touch: calc(var(--control-h-touch) - var(--control-h) + var(--control-inset));
1055
+ }
1056
+
986
1057
  :root {
987
1058
  /* shell offset — viewport space reserved by whatever shell hosts the app.
988
1059
  Standalone apps get 0; a hosting shell overrides on :root. Size
@@ -1051,7 +1122,6 @@
1051
1122
  --background: #0d0d0f;
1052
1123
  --card: #151518;
1053
1124
  --secondary: #1c1c20;
1054
- --on-secondary: var(--ink);
1055
1125
  --popover: #252529;
1056
1126
  --muted: #070709;
1057
1127
  --hover: #e6e1d30f;
@@ -1075,13 +1145,11 @@
1075
1145
 
1076
1146
  /* brand and primary. A fill and an ink are different jobs (docs/spec/accents.md):
1077
1147
  * --primary carries white at 4.62:1 and reads as a shape on every plane (3.30:1
1078
- * on the popover); --primary-ink is the teal that reads as text (4.96:1 there).
1079
- * Figma's hover #18998b is 3.52:1 under white, so #127c71 (5.06:1) is pinned. */
1148
+ * on the popover); --primary-ink is the teal that reads as text (4.96:1 there). */
1080
1149
  --brand: #0d1627;
1081
1150
  --primary: #138377;
1082
1151
  --on-primary: #ffffff;
1083
1152
  --primary-ink: #35a395;
1084
- --primary-hover: #127c71;
1085
1153
  --primary-border: #35a3958c;
1086
1154
 
1087
1155
  /* status. Fills carry the dark label (white fails 3:1–3.4:1 on these); the
@@ -1107,29 +1175,6 @@
1107
1175
  --chart-4: #e68aaf;
1108
1176
  --chart-5: #2e9e5c;
1109
1177
  --chart-6: #988eef;
1110
-
1111
- --button-primary-bg: #e6e1d300;
1112
- --button-primary-hover: #e6e1d314;
1113
- --button-primary-border: #e6e1d399;
1114
- --button-primary-ink: #e6e1d3;
1115
- --button-danger-bg: #f05b5200;
1116
- --button-danger-hover: #f05b521a;
1117
- --button-danger-border: #f05b52;
1118
- --button-danger-ink: var(--accent-error);
1119
-
1120
- /* chips are outlines: a transparent fill and the label's hue at 50 % */
1121
- --chip-neutral-bg: var(--hover);
1122
- --chip-neutral-border: var(--border);
1123
- --chip-primary-bg: #35a39500;
1124
- --chip-primary-border: #35a3958c;
1125
- --chip-positive-bg: #2e9e5c00;
1126
- --chip-positive-border: #4abf7680;
1127
- --chip-info-bg: #4990d800;
1128
- --chip-info-border: #6ca6e480;
1129
- --chip-warn-bg: #f5c84e00;
1130
- --chip-warn-border: #f5c84e80;
1131
- --chip-error-bg: #f05b5200;
1132
- --chip-error-border: #f05b5280;
1133
1178
  }
1134
1179
 
1135
1180
  /* ── u2 Light ────────────────────────────────────────────────── */
@@ -1139,7 +1184,6 @@
1139
1184
  --background: #efebdf;
1140
1185
  --card: #f6f3eb;
1141
1186
  --secondary: #fbfaf6;
1142
- --on-secondary: var(--ink);
1143
1187
  --popover: #ffffff;
1144
1188
  --muted: #e6e1d3;
1145
1189
  --hover: #0d0d0f0d;
@@ -1161,7 +1205,6 @@
1161
1205
  --primary: #138377;
1162
1206
  --on-primary: #ffffff;
1163
1207
  --primary-ink: #116f65;
1164
- --primary-hover: #116f65;
1165
1208
  --primary-border: #116f658c;
1166
1209
 
1167
1210
  /* Figma's positive #228a4e carries neither label at 4.5:1 (white 4.36, dark
@@ -1190,29 +1233,6 @@
1190
1233
  --chart-4: #b74679;
1191
1234
  --chart-5: #228a4e;
1192
1235
  --chart-6: #6d5acc;
1193
-
1194
- --button-primary-bg: #0d0d0f00;
1195
- --button-primary-hover: #0d0d0f0f;
1196
- --button-primary-border: #0d0d0fa6;
1197
- --button-primary-ink: #080e1a;
1198
- --button-danger-bg: #db383400;
1199
- --button-danger-hover: #db383414;
1200
- --button-danger-border: #db3834;
1201
- --button-danger-ink: var(--accent-error);
1202
-
1203
- /* the solid hue at 50 % (warning 60 %), where Dark uses the ink's */
1204
- --chip-neutral-bg: var(--hover);
1205
- --chip-neutral-border: var(--border);
1206
- --chip-primary-bg: #13837700;
1207
- --chip-primary-border: #116f658c;
1208
- --chip-positive-bg: #228a4e00;
1209
- --chip-positive-border: #228a4e80;
1210
- --chip-info-bg: #2d79c200;
1211
- --chip-info-border: #2d79c280;
1212
- --chip-warn-bg: #a77f1200;
1213
- --chip-warn-border: #a77f1299;
1214
- --chip-error-bg: #db383400;
1215
- --chip-error-border: #db383480;
1216
1236
  }
1217
1237
 
1218
1238
  /* ── Oldschool ───────────────────────────────────────────────── *
@@ -1232,7 +1252,6 @@
1232
1252
  --background: #070d18;
1233
1253
  --card: #16233c;
1234
1254
  --secondary: #0d1526;
1235
- --on-secondary: var(--ink);
1236
1255
  --popover: #1d2c49;
1237
1256
  --muted: #26375c;
1238
1257
  --hover: #e6e1d312;
@@ -1254,7 +1273,6 @@
1254
1273
  --primary: #138377;
1255
1274
  --on-primary: #ffffff;
1256
1275
  --primary-ink: #35a395;
1257
- --primary-hover: #127c71;
1258
1276
  --primary-border: #35a39500;
1259
1277
 
1260
1278
  --positive: #2e9e5c;
@@ -1279,31 +1297,21 @@
1279
1297
  --chart-5: #2e9e5c;
1280
1298
  --chart-6: #988eef;
1281
1299
 
1282
- /* filled buttons. The danger label stays dark: white on #f05b52 is 3.32:1. */
1283
- --button-primary-bg: #138377;
1284
- --button-primary-hover: #127c71;
1285
- --button-primary-border: #138377;
1286
- --button-primary-ink: #ffffff;
1287
- --button-danger-bg: #f05b52;
1288
- --button-danger-hover: #f06c61;
1289
- --button-danger-border: #f05b52;
1290
- --button-danger-ink: #070d18;
1291
-
1292
- /* chips are tinted pills with no edge */
1293
- --chip-neutral-bg: var(--hover);
1294
- --chip-neutral-border: #e6e1d300;
1300
+ /* danger is a fill */
1301
+ --button-danger-bg: var(--accent-error);
1302
+ --button-danger-hover: var(--accent-error-hover);
1303
+ --button-danger-border: var(--accent-error);
1304
+ --button-danger-ink: var(--on-accent-error);
1305
+
1306
+ /* tints are pills with no edge */
1307
+ --tint-fill: 18%;
1308
+ --tint-edge: 0%;
1309
+ --tint-neutral-edge: transparent;
1295
1310
  /* Figma tints the accent chip 16 %, which leaves its teal label at 4.03:1 on
1296
1311
  * the card; 8 % holds 4.56:1 */
1297
- --chip-primary-bg: #35a39514;
1298
- --chip-primary-border: #35a39500;
1299
- --chip-positive-bg: #2e9e5c2e;
1300
- --chip-positive-border: #4abf7600;
1301
- --chip-info-bg: #4990d82e;
1302
- --chip-info-border: #6ca6e400;
1303
- --chip-warn-bg: #f5c84e29;
1304
- --chip-warn-border: #f5c84e00;
1305
- --chip-error-bg: #f05b522e;
1306
- --chip-error-border: #f06c6100;
1312
+ --tint-primary-fill: color-mix(in srgb, var(--primary-ink) 8%, transparent);
1313
+ /* at 18 % the info label reads 4.43:1 on its fill; 16 % clears 4.5:1 */
1314
+ --tint-info-fill: color-mix(in srgb, var(--accent-info-ink) 16%, transparent);
1307
1315
 
1308
1316
  --radius: 0.5rem;
1309
1317
  --control-radius: 0.375rem;