@tempoxyz/ds 0.2.0 → 0.2.4

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 (428) hide show
  1. package/README.md +36 -0
  2. package/dist/mobile/components/Avatar.d.ts +1 -1
  3. package/dist/mobile/components/Avatar.d.ts.map +1 -1
  4. package/dist/mobile/components/Avatar.js.map +1 -1
  5. package/dist/mobile/components/Button.d.ts +2 -2
  6. package/dist/mobile/components/Button.d.ts.map +1 -1
  7. package/dist/mobile/components/Button.js +6 -2
  8. package/dist/mobile/components/Button.js.map +1 -1
  9. package/dist/mobile/components/CodeInput.d.ts +1 -1
  10. package/dist/mobile/components/CodeInput.d.ts.map +1 -1
  11. package/dist/mobile/components/CodeInput.js.map +1 -1
  12. package/dist/mobile/components/IconButton.d.ts +2 -2
  13. package/dist/mobile/components/IconButton.d.ts.map +1 -1
  14. package/dist/mobile/components/IconButton.js +6 -2
  15. package/dist/mobile/components/IconButton.js.map +1 -1
  16. package/dist/mobile/components/Skeleton.d.ts.map +1 -1
  17. package/dist/mobile/components/Skeleton.js.map +1 -1
  18. package/dist/mobile/components/Spinner.d.ts +4 -4
  19. package/dist/mobile/components/Spinner.d.ts.map +1 -1
  20. package/dist/mobile/components/Spinner.js +3 -3
  21. package/dist/mobile/components/Spinner.js.map +1 -1
  22. package/dist/mobile/components/TextButton.d.ts.map +1 -1
  23. package/dist/mobile/components/TextButton.js +7 -2
  24. package/dist/mobile/components/TextButton.js.map +1 -1
  25. package/dist/mobile/components/TextInput.d.ts.map +1 -1
  26. package/dist/mobile/components/TextInput.js +1 -1
  27. package/dist/mobile/components/TextInput.js.map +1 -1
  28. package/dist/mobile/components/Toast.d.ts +1 -1
  29. package/dist/mobile/components/Toast.d.ts.map +1 -1
  30. package/dist/mobile/components/Toast.js +1 -1
  31. package/dist/mobile/components/Toast.js.map +1 -1
  32. package/dist/mobile/components/Toggle.d.ts +2 -2
  33. package/dist/mobile/components/Toggle.js +2 -2
  34. package/dist/mobile/components/Toggle.js.map +1 -1
  35. package/dist/mobile/vars.d.ts +24 -0
  36. package/dist/mobile/vars.d.ts.map +1 -1
  37. package/dist/mobile/vars.js +12 -0
  38. package/dist/mobile/vars.js.map +1 -1
  39. package/dist/mobile/zyzz.config.d.ts +96 -0
  40. package/dist/mobile/zyzz.config.d.ts.map +1 -1
  41. package/dist/oxlint/index.d.ts +43 -0
  42. package/dist/oxlint/index.d.ts.map +1 -0
  43. package/dist/oxlint/index.js +68 -0
  44. package/dist/oxlint/index.js.map +1 -0
  45. package/dist/oxlint/internal/Imports.d.ts +22 -0
  46. package/dist/oxlint/internal/Imports.d.ts.map +1 -0
  47. package/dist/oxlint/internal/Imports.js +52 -0
  48. package/dist/oxlint/internal/Imports.js.map +1 -0
  49. package/dist/oxlint/rules/NoCrossSurface.d.ts +16 -0
  50. package/dist/oxlint/rules/NoCrossSurface.d.ts.map +1 -0
  51. package/dist/oxlint/rules/NoCrossSurface.js +55 -0
  52. package/dist/oxlint/rules/NoCrossSurface.js.map +1 -0
  53. package/dist/oxlint/rules/NoInternalImports.d.ts +8 -0
  54. package/dist/oxlint/rules/NoInternalImports.d.ts.map +1 -0
  55. package/dist/oxlint/rules/NoInternalImports.js +22 -0
  56. package/dist/oxlint/rules/NoInternalImports.js.map +1 -0
  57. package/dist/oxlint/rules/NoRawValues.d.ts +9 -0
  58. package/dist/oxlint/rules/NoRawValues.d.ts.map +1 -0
  59. package/dist/oxlint/rules/NoRawValues.js +73 -0
  60. package/dist/oxlint/rules/NoRawValues.js.map +1 -0
  61. package/dist/oxlint/rules/PreferComponent.d.ts +16 -0
  62. package/dist/oxlint/rules/PreferComponent.d.ts.map +1 -0
  63. package/dist/oxlint/rules/PreferComponent.js +92 -0
  64. package/dist/oxlint/rules/PreferComponent.js.map +1 -0
  65. package/dist/oxlint/rules/RequireAccessibleName.d.ts +9 -0
  66. package/dist/oxlint/rules/RequireAccessibleName.d.ts.map +1 -0
  67. package/dist/oxlint/rules/RequireAccessibleName.js +104 -0
  68. package/dist/oxlint/rules/RequireAccessibleName.js.map +1 -0
  69. package/dist/web/components/Accordion.css +1 -1
  70. package/dist/web/components/Accordion.d.ts +7 -7
  71. package/dist/web/components/Accordion.js.map +1 -1
  72. package/dist/web/components/Accordion.js.zyzz.json +1 -1
  73. package/dist/web/components/AlertDialog.css +1 -1
  74. package/dist/web/components/AlertDialog.d.ts.map +1 -1
  75. package/dist/web/components/AlertDialog.js +1 -1
  76. package/dist/web/components/AlertDialog.js.map +1 -1
  77. package/dist/web/components/AlertDialog.js.zyzz.json +1 -1
  78. package/dist/web/components/Amount.d.ts +10 -3
  79. package/dist/web/components/Amount.d.ts.map +1 -1
  80. package/dist/web/components/Amount.js +19 -9
  81. package/dist/web/components/Amount.js.map +1 -1
  82. package/dist/web/components/Amount.js.zyzz.json +1 -1
  83. package/dist/web/components/AmountInput.css +1 -1
  84. package/dist/web/components/AmountInput.d.ts +15 -2
  85. package/dist/web/components/AmountInput.d.ts.map +1 -1
  86. package/dist/web/components/AmountInput.js +43 -12
  87. package/dist/web/components/AmountInput.js.map +1 -1
  88. package/dist/web/components/AmountInput.js.zyzz.json +1 -1
  89. package/dist/web/components/AppShell.css +1 -1
  90. package/dist/web/components/AppShell.d.ts +10 -10
  91. package/dist/web/components/AppShell.js.map +1 -1
  92. package/dist/web/components/AppShell.js.zyzz.json +1 -1
  93. package/dist/web/components/Autocomplete.js.zyzz.json +1 -1
  94. package/dist/web/components/Avatar.css +1 -1
  95. package/dist/web/components/Avatar.d.ts +3 -3
  96. package/dist/web/components/Avatar.js.map +1 -1
  97. package/dist/web/components/Avatar.js.zyzz.json +1 -1
  98. package/dist/web/components/Banner.css +1 -1
  99. package/dist/web/components/Banner.js +3 -3
  100. package/dist/web/components/Banner.js.map +1 -1
  101. package/dist/web/components/Banner.js.zyzz.json +1 -1
  102. package/dist/web/components/Breadcrumbs.css +1 -1
  103. package/dist/web/components/Breadcrumbs.d.ts +4 -4
  104. package/dist/web/components/Breadcrumbs.js.map +1 -1
  105. package/dist/web/components/Breadcrumbs.js.zyzz.json +1 -1
  106. package/dist/web/components/Button.css +1 -1
  107. package/dist/web/components/Button.d.ts +12 -11
  108. package/dist/web/components/Button.d.ts.map +1 -1
  109. package/dist/web/components/Button.js +2 -2
  110. package/dist/web/components/Button.js.map +1 -1
  111. package/dist/web/components/Button.js.zyzz.json +1 -1
  112. package/dist/web/components/Calendar.css +1 -1
  113. package/dist/web/components/Calendar.d.ts.map +1 -1
  114. package/dist/web/components/Calendar.js +7 -5
  115. package/dist/web/components/Calendar.js.map +1 -1
  116. package/dist/web/components/Calendar.js.zyzz.json +1 -1
  117. package/dist/web/components/Callout.css +1 -1
  118. package/dist/web/components/Callout.d.ts +6 -6
  119. package/dist/web/components/Callout.d.ts.map +1 -1
  120. package/dist/web/components/Callout.js +5 -2
  121. package/dist/web/components/Callout.js.map +1 -1
  122. package/dist/web/components/Callout.js.zyzz.json +1 -1
  123. package/dist/web/components/Checkbox.css +1 -1
  124. package/dist/web/components/Checkbox.d.ts +8 -8
  125. package/dist/web/components/Checkbox.js.map +1 -1
  126. package/dist/web/components/Checkbox.js.zyzz.json +1 -1
  127. package/dist/web/components/CheckboxGroup.js.zyzz.json +1 -1
  128. package/dist/web/components/ChoiceGroup.css +1 -1
  129. package/dist/web/components/ChoiceGroup.d.ts +2 -2
  130. package/dist/web/components/ChoiceGroup.d.ts.map +1 -1
  131. package/dist/web/components/ChoiceGroup.js +2 -2
  132. package/dist/web/components/ChoiceGroup.js.map +1 -1
  133. package/dist/web/components/ChoiceGroup.js.zyzz.json +1 -1
  134. package/dist/web/components/Choicebox.css +1 -1
  135. package/dist/web/components/Choicebox.d.ts +4 -4
  136. package/dist/web/components/Choicebox.js +1 -1
  137. package/dist/web/components/Choicebox.js.map +1 -1
  138. package/dist/web/components/Choicebox.js.zyzz.json +1 -1
  139. package/dist/web/components/Combobox.css +1 -1
  140. package/dist/web/components/Combobox.js.map +1 -1
  141. package/dist/web/components/Combobox.js.zyzz.json +1 -1
  142. package/dist/web/components/Container.js.zyzz.json +1 -1
  143. package/dist/web/components/CopyButton.js.zyzz.json +1 -1
  144. package/dist/web/components/DatePicker.css +1 -1
  145. package/dist/web/components/DatePicker.d.ts +20 -20
  146. package/dist/web/components/DatePicker.d.ts.map +1 -1
  147. package/dist/web/components/DatePicker.js +2 -2
  148. package/dist/web/components/DatePicker.js.map +1 -1
  149. package/dist/web/components/DatePicker.js.zyzz.json +1 -1
  150. package/dist/web/components/Dialog.css +1 -1
  151. package/dist/web/components/Dialog.d.ts.map +1 -1
  152. package/dist/web/components/Dialog.js +3 -3
  153. package/dist/web/components/Dialog.js.map +1 -1
  154. package/dist/web/components/Dialog.js.zyzz.json +1 -1
  155. package/dist/web/components/Drawer.css +1 -1
  156. package/dist/web/components/Drawer.js +2 -2
  157. package/dist/web/components/Drawer.js.map +1 -1
  158. package/dist/web/components/Drawer.js.zyzz.json +1 -1
  159. package/dist/web/components/Empty.js.zyzz.json +1 -1
  160. package/dist/web/components/Field.css +1 -1
  161. package/dist/web/components/Field.d.ts +7 -0
  162. package/dist/web/components/Field.d.ts.map +1 -1
  163. package/dist/web/components/Field.js +25 -3
  164. package/dist/web/components/Field.js.map +1 -1
  165. package/dist/web/components/Field.js.zyzz.json +1 -1
  166. package/dist/web/components/Fieldset.js.zyzz.json +1 -1
  167. package/dist/web/components/Frame.css +1 -1
  168. package/dist/web/components/Frame.d.ts +27 -10
  169. package/dist/web/components/Frame.d.ts.map +1 -1
  170. package/dist/web/components/Frame.js +12 -5
  171. package/dist/web/components/Frame.js.map +1 -1
  172. package/dist/web/components/Frame.js.zyzz.json +1 -1
  173. package/dist/web/components/Gauge.css +1 -1
  174. package/dist/web/components/Gauge.js.map +1 -1
  175. package/dist/web/components/Gauge.js.zyzz.json +1 -1
  176. package/dist/web/components/Grid.js.zyzz.json +1 -1
  177. package/dist/web/components/Hex.css +1 -1
  178. package/dist/web/components/Hex.d.ts +5 -5
  179. package/dist/web/components/Hex.js +1 -1
  180. package/dist/web/components/Hex.js.map +1 -1
  181. package/dist/web/components/Hex.js.zyzz.json +1 -1
  182. package/dist/web/components/IconChip.css +1 -1
  183. package/dist/web/components/IconChip.d.ts +1 -1
  184. package/dist/web/components/IconChip.js.map +1 -1
  185. package/dist/web/components/IconChip.js.zyzz.json +1 -1
  186. package/dist/web/components/Identicon.js.zyzz.json +1 -1
  187. package/dist/web/components/Inline.js.zyzz.json +1 -1
  188. package/dist/web/components/Input.css +1 -1
  189. package/dist/web/components/Input.js.map +1 -1
  190. package/dist/web/components/Input.js.zyzz.json +1 -1
  191. package/dist/web/components/Inset.js.zyzz.json +1 -1
  192. package/dist/web/components/Kbd.css +1 -1
  193. package/dist/web/components/Kbd.d.ts +32 -10
  194. package/dist/web/components/Kbd.d.ts.map +1 -1
  195. package/dist/web/components/Kbd.js +55 -13
  196. package/dist/web/components/Kbd.js.map +1 -1
  197. package/dist/web/components/Kbd.js.zyzz.json +1 -1
  198. package/dist/web/components/LoadingDots.css +1 -1
  199. package/dist/web/components/LoadingDots.d.ts +2 -2
  200. package/dist/web/components/LoadingDots.js.map +1 -1
  201. package/dist/web/components/LoadingDots.js.zyzz.json +1 -1
  202. package/dist/web/components/Menu.css +1 -1
  203. package/dist/web/components/Menu.d.ts +11 -11
  204. package/dist/web/components/Menu.d.ts.map +1 -1
  205. package/dist/web/components/Menu.js +2 -2
  206. package/dist/web/components/Menu.js.map +1 -1
  207. package/dist/web/components/Menu.js.zyzz.json +1 -1
  208. package/dist/web/components/NumberField.css +1 -1
  209. package/dist/web/components/NumberField.js +1 -1
  210. package/dist/web/components/NumberField.js.map +1 -1
  211. package/dist/web/components/NumberField.js.zyzz.json +1 -1
  212. package/dist/web/components/OtpField.css +1 -1
  213. package/dist/web/components/OtpField.d.ts.map +1 -1
  214. package/dist/web/components/OtpField.js +1 -1
  215. package/dist/web/components/OtpField.js.map +1 -1
  216. package/dist/web/components/OtpField.js.zyzz.json +1 -1
  217. package/dist/web/components/Pagination.css +1 -1
  218. package/dist/web/components/Pagination.d.ts +13 -13
  219. package/dist/web/components/Pagination.js +1 -1
  220. package/dist/web/components/Pagination.js.map +1 -1
  221. package/dist/web/components/Pagination.js.zyzz.json +1 -1
  222. package/dist/web/components/Popover.css +1 -1
  223. package/dist/web/components/Popover.d.ts.map +1 -1
  224. package/dist/web/components/Popover.js +1 -1
  225. package/dist/web/components/Popover.js.map +1 -1
  226. package/dist/web/components/Popover.js.zyzz.json +1 -1
  227. package/dist/web/components/Progress.css +1 -1
  228. package/dist/web/components/Progress.js.map +1 -1
  229. package/dist/web/components/Progress.js.zyzz.json +1 -1
  230. package/dist/web/components/Qr.js.zyzz.json +1 -1
  231. package/dist/web/components/RadioGroup.css +1 -1
  232. package/dist/web/components/RadioGroup.d.ts +4 -4
  233. package/dist/web/components/RadioGroup.js.map +1 -1
  234. package/dist/web/components/RadioGroup.js.zyzz.json +1 -1
  235. package/dist/web/components/Rows.css +1 -1
  236. package/dist/web/components/Rows.d.ts +7 -7
  237. package/dist/web/components/Rows.d.ts.map +1 -1
  238. package/dist/web/components/Rows.js +3 -3
  239. package/dist/web/components/Rows.js.map +1 -1
  240. package/dist/web/components/Rows.js.zyzz.json +1 -1
  241. package/dist/web/components/SecretValue.css +1 -1
  242. package/dist/web/components/SecretValue.d.ts +4 -4
  243. package/dist/web/components/SecretValue.js +1 -1
  244. package/dist/web/components/SecretValue.js.map +1 -1
  245. package/dist/web/components/SecretValue.js.zyzz.json +1 -1
  246. package/dist/web/components/Select.css +1 -1
  247. package/dist/web/components/Select.js.map +1 -1
  248. package/dist/web/components/Select.js.zyzz.json +1 -1
  249. package/dist/web/components/Separator.js.zyzz.json +1 -1
  250. package/dist/web/components/SidebarMenu.css +1 -1
  251. package/dist/web/components/SidebarMenu.d.ts +11 -11
  252. package/dist/web/components/SidebarMenu.d.ts.map +1 -1
  253. package/dist/web/components/SidebarMenu.js +1 -1
  254. package/dist/web/components/SidebarMenu.js.map +1 -1
  255. package/dist/web/components/SidebarMenu.js.zyzz.json +1 -1
  256. package/dist/web/components/Skeleton.js.zyzz.json +1 -1
  257. package/dist/web/components/Slider.css +1 -1
  258. package/dist/web/components/Slider.d.ts.map +1 -1
  259. package/dist/web/components/Slider.js.map +1 -1
  260. package/dist/web/components/Slider.js.zyzz.json +1 -1
  261. package/dist/web/components/Snippet.css +1 -1
  262. package/dist/web/components/Snippet.d.ts +4 -4
  263. package/dist/web/components/Snippet.js +2 -2
  264. package/dist/web/components/Snippet.js.map +1 -1
  265. package/dist/web/components/Snippet.js.zyzz.json +1 -1
  266. package/dist/web/components/Spinner.js.zyzz.json +1 -1
  267. package/dist/web/components/SplitButton.css +1 -1
  268. package/dist/web/components/SplitButton.d.ts.map +1 -1
  269. package/dist/web/components/SplitButton.js +1 -1
  270. package/dist/web/components/SplitButton.js.map +1 -1
  271. package/dist/web/components/SplitButton.js.zyzz.json +1 -1
  272. package/dist/web/components/Stack.js.zyzz.json +1 -1
  273. package/dist/web/components/Stepper.css +1 -1
  274. package/dist/web/components/Stepper.d.ts +1 -1
  275. package/dist/web/components/Stepper.js.map +1 -1
  276. package/dist/web/components/Stepper.js.zyzz.json +1 -1
  277. package/dist/web/components/Surface.css +1 -1
  278. package/dist/web/components/Surface.d.ts +46 -46
  279. package/dist/web/components/Surface.js +2 -2
  280. package/dist/web/components/Surface.js.map +1 -1
  281. package/dist/web/components/Surface.js.zyzz.json +1 -1
  282. package/dist/web/components/Switch.css +1 -1
  283. package/dist/web/components/Switch.d.ts +14 -14
  284. package/dist/web/components/Switch.d.ts.map +1 -1
  285. package/dist/web/components/Switch.js.map +1 -1
  286. package/dist/web/components/Switch.js.zyzz.json +1 -1
  287. package/dist/web/components/Table.css +1 -1
  288. package/dist/web/components/Table.d.ts +10 -7
  289. package/dist/web/components/Table.d.ts.map +1 -1
  290. package/dist/web/components/Table.js +5 -2
  291. package/dist/web/components/Table.js.map +1 -1
  292. package/dist/web/components/Table.js.zyzz.json +1 -1
  293. package/dist/web/components/Tabs.css +1 -1
  294. package/dist/web/components/Tabs.d.ts +14 -14
  295. package/dist/web/components/Tabs.js +1 -1
  296. package/dist/web/components/Tabs.js.map +1 -1
  297. package/dist/web/components/Tabs.js.zyzz.json +1 -1
  298. package/dist/web/components/Tag.css +1 -1
  299. package/dist/web/components/Tag.d.ts +10 -10
  300. package/dist/web/components/Tag.js +1 -1
  301. package/dist/web/components/Tag.js.map +1 -1
  302. package/dist/web/components/Tag.js.zyzz.json +1 -1
  303. package/dist/web/components/Textarea.css +1 -1
  304. package/dist/web/components/Textarea.d.ts +15 -15
  305. package/dist/web/components/Textarea.js.map +1 -1
  306. package/dist/web/components/Textarea.js.zyzz.json +1 -1
  307. package/dist/web/components/Toast.css +1 -1
  308. package/dist/web/components/Toast.d.ts.map +1 -1
  309. package/dist/web/components/Toast.js +7 -3
  310. package/dist/web/components/Toast.js.map +1 -1
  311. package/dist/web/components/Toast.js.zyzz.json +1 -1
  312. package/dist/web/components/Token.js.zyzz.json +1 -1
  313. package/dist/web/components/Tooltip.css +1 -1
  314. package/dist/web/components/Tooltip.d.ts.map +1 -1
  315. package/dist/web/components/Tooltip.js +1 -1
  316. package/dist/web/components/Tooltip.js.map +1 -1
  317. package/dist/web/components/Tooltip.js.zyzz.json +1 -1
  318. package/dist/web/components/internal/Field.css +1 -1
  319. package/dist/web/components/internal/Field.d.ts +7 -7
  320. package/dist/web/components/internal/Field.js.map +1 -1
  321. package/dist/web/components/internal/Field.js.zyzz.json +1 -1
  322. package/dist/web/components/internal/InputGroup.css +1 -1
  323. package/dist/web/components/internal/InputGroup.d.ts +12 -12
  324. package/dist/web/components/internal/InputGroup.d.ts.map +1 -1
  325. package/dist/web/components/internal/InputGroup.js +1 -1
  326. package/dist/web/components/internal/InputGroup.js.map +1 -1
  327. package/dist/web/components/internal/InputGroup.js.zyzz.json +1 -1
  328. package/dist/web/components/internal/Listbox.css +1 -1
  329. package/dist/web/components/internal/Listbox.d.ts +9 -9
  330. package/dist/web/components/internal/Listbox.d.ts.map +1 -1
  331. package/dist/web/components/internal/Listbox.js +1 -1
  332. package/dist/web/components/internal/Listbox.js.map +1 -1
  333. package/dist/web/components/internal/Listbox.js.zyzz.json +1 -1
  334. package/dist/web/icons/BadgeX.d.ts.map +1 -1
  335. package/dist/web/icons/BadgeX.js.map +1 -1
  336. package/dist/web/icons/InfinityIcon.d.ts.map +1 -1
  337. package/dist/web/icons/InfinityIcon.js.map +1 -1
  338. package/dist/web/icons/LightMode.d.ts.map +1 -1
  339. package/dist/web/icons/LightMode.js.map +1 -1
  340. package/dist/web/icons/OctagonAlert.d.ts.map +1 -1
  341. package/dist/web/icons/OctagonAlert.js.map +1 -1
  342. package/dist/web/icons/Unlink.d.ts.map +1 -1
  343. package/dist/web/icons/Unlink.js.map +1 -1
  344. package/dist/web/index.js.zyzz.json +1 -1
  345. package/dist/web/vars.d.ts +91 -0
  346. package/dist/web/vars.d.ts.map +1 -1
  347. package/dist/web/vars.js.map +1 -1
  348. package/dist/web/vars.js.zyzz.json +1 -1
  349. package/dist/web/zyzz.config.d.ts +455 -0
  350. package/dist/web/zyzz.config.d.ts.map +1 -1
  351. package/dist/web/zyzz.config.js.zyzz.json +1 -1
  352. package/package.json +7 -1
  353. package/src/mobile/components/Avatar.tsx +2 -2
  354. package/src/mobile/components/Button.tsx +6 -3
  355. package/src/mobile/components/CodeInput.tsx +2 -2
  356. package/src/mobile/components/IconButton.tsx +6 -3
  357. package/src/mobile/components/Skeleton.tsx +1 -1
  358. package/src/mobile/components/Spinner.tsx +4 -5
  359. package/src/mobile/components/TextButton.tsx +6 -2
  360. package/src/mobile/components/TextInput.tsx +1 -1
  361. package/src/mobile/components/Toast.tsx +1 -2
  362. package/src/mobile/components/Toggle.tsx +2 -2
  363. package/src/mobile/vars.ts +14 -0
  364. package/src/oxlint/index.ts +89 -0
  365. package/src/oxlint/internal/Imports.ts +68 -0
  366. package/src/oxlint/rules/NoCrossSurface.ts +71 -0
  367. package/src/oxlint/rules/NoInternalImports.ts +25 -0
  368. package/src/oxlint/rules/NoRawValues.ts +76 -0
  369. package/src/oxlint/rules/PreferComponent.ts +113 -0
  370. package/src/oxlint/rules/RequireAccessibleName.ts +132 -0
  371. package/src/web/components/Accordion.tsx +8 -8
  372. package/src/web/components/AlertDialog.tsx +11 -8
  373. package/src/web/components/Amount.tsx +29 -9
  374. package/src/web/components/AmountInput.tsx +60 -24
  375. package/src/web/components/AppShell.tsx +23 -23
  376. package/src/web/components/Avatar.tsx +3 -3
  377. package/src/web/components/Banner.tsx +16 -16
  378. package/src/web/components/Breadcrumbs.tsx +4 -4
  379. package/src/web/components/Button.tsx +15 -12
  380. package/src/web/components/Calendar.tsx +10 -11
  381. package/src/web/components/Callout.tsx +19 -16
  382. package/src/web/components/Checkbox.tsx +9 -9
  383. package/src/web/components/ChoiceGroup.tsx +13 -14
  384. package/src/web/components/Choicebox.tsx +21 -21
  385. package/src/web/components/Combobox.tsx +3 -3
  386. package/src/web/components/DatePicker.tsx +25 -25
  387. package/src/web/components/Dialog.tsx +28 -19
  388. package/src/web/components/Drawer.tsx +8 -8
  389. package/src/web/components/Field.tsx +46 -11
  390. package/src/web/components/Frame.tsx +30 -9
  391. package/src/web/components/Gauge.tsx +1 -1
  392. package/src/web/components/Hex.tsx +5 -5
  393. package/src/web/components/IconChip.tsx +1 -1
  394. package/src/web/components/Input.tsx +11 -11
  395. package/src/web/components/Kbd.tsx +77 -21
  396. package/src/web/components/LoadingDots.tsx +4 -4
  397. package/src/web/components/Menu.tsx +17 -14
  398. package/src/web/components/NumberField.tsx +17 -17
  399. package/src/web/components/OtpField.tsx +14 -6
  400. package/src/web/components/Pagination.tsx +13 -13
  401. package/src/web/components/Popover.tsx +14 -11
  402. package/src/web/components/Progress.tsx +2 -2
  403. package/src/web/components/RadioGroup.tsx +11 -11
  404. package/src/web/components/Rows.tsx +8 -9
  405. package/src/web/components/SecretValue.tsx +4 -4
  406. package/src/web/components/Select.tsx +2 -2
  407. package/src/web/components/SidebarMenu.tsx +14 -15
  408. package/src/web/components/Slider.tsx +6 -7
  409. package/src/web/components/Snippet.tsx +9 -9
  410. package/src/web/components/SplitButton.tsx +17 -5
  411. package/src/web/components/Stepper.tsx +1 -1
  412. package/src/web/components/Surface.tsx +47 -47
  413. package/src/web/components/Switch.tsx +21 -23
  414. package/src/web/components/Table.tsx +11 -7
  415. package/src/web/components/Tabs.tsx +14 -14
  416. package/src/web/components/Tag.tsx +12 -12
  417. package/src/web/components/Textarea.tsx +15 -15
  418. package/src/web/components/Toast.tsx +28 -21
  419. package/src/web/components/Tooltip.tsx +12 -9
  420. package/src/web/components/internal/Field.ts +20 -20
  421. package/src/web/components/internal/InputGroup.ts +13 -14
  422. package/src/web/components/internal/Listbox.ts +19 -16
  423. package/src/web/icons/BadgeX.tsx +1 -1
  424. package/src/web/icons/InfinityIcon.tsx +1 -1
  425. package/src/web/icons/LightMode.tsx +1 -1
  426. package/src/web/icons/OctagonAlert.tsx +1 -1
  427. package/src/web/icons/Unlink.tsx +1 -1
  428. package/src/web/vars.ts +81 -2
@@ -240,7 +240,7 @@ namespace styles {
240
240
  height: '16',
241
241
  width: '16',
242
242
  selectors: {
243
- '[data-size="medium"] > &': { height: '14px !custom', width: '14px !custom' },
243
+ '[data-size="medium"] > &': { height: '14', width: '14' },
244
244
  '[data-size="small"] > &': { height: '12', width: '12' },
245
245
  },
246
246
  },
@@ -258,24 +258,27 @@ namespace styles {
258
258
  opacity: '1 !custom',
259
259
  padding: '8',
260
260
  transformOrigin: 'var(--transform-origin) !custom',
261
- transitionDuration: '240ms !custom',
262
- transitionProperty: 'opacity, transform !custom',
261
+ transitionDuration: '240',
262
+ transitionProperty: 'opacity, scale !custom',
263
263
  transitionTimingFunction: 'spring',
264
264
  selectors: {
265
265
  '&:focus-visible': { outline: 'none !custom' },
266
266
  '&[data-ending-style]': {
267
267
  opacity: '0 !custom',
268
- transform: 'scale(0.96) !custom',
269
- transitionDuration: '150ms !custom',
268
+ scale: 'enter',
269
+ transitionDuration: '150',
270
270
  transitionTimingFunction: 'snappy',
271
271
  },
272
- '&[data-starting-style]': { opacity: '0 !custom', transform: 'scale(0.96) !custom' },
272
+ '&[data-starting-style]': {
273
+ opacity: '0 !custom',
274
+ scale: 'enter',
275
+ },
273
276
  },
274
277
  '@media (prefers-reduced-motion: reduce)': {
275
- transitionDuration: '150ms !custom',
278
+ transitionDuration: '150',
276
279
  transitionProperty: 'opacity !custom',
277
280
  selectors: {
278
- '&[data-ending-style], &[data-starting-style]': { transform: 'none !custom' },
281
+ '&[data-ending-style], &[data-starting-style]': { scale: 'none !custom' },
279
282
  },
280
283
  },
281
284
  },
@@ -283,10 +286,7 @@ namespace styles {
283
286
  { id: 'tds/web/date-picker/popup' },
284
287
  )
285
288
 
286
- export const positioner = style(
287
- { zIndex: '50 !custom' },
288
- { id: 'tds/web/date-picker/positioner' },
289
- )
289
+ export const positioner = style({ zIndex: 'popover' }, { id: 'tds/web/date-picker/positioner' })
290
290
 
291
291
  export const trigger = variants(
292
292
  {
@@ -300,39 +300,39 @@ namespace styles {
300
300
  minWidth: '224',
301
301
  position: 'relative',
302
302
  outlineColor: 'transparent !custom',
303
- outlineOffset: '2px !custom',
303
+ outlineOffset: '2',
304
304
  outlineStyle: 'solid !custom',
305
- outlineWidth: '2px !custom',
305
+ outlineWidth: '2',
306
306
  textAlign: 'start',
307
- transitionDuration: '160ms !custom',
307
+ transitionDuration: '160',
308
308
  transitionProperty:
309
- 'background-color, border-color, color, opacity, outline-color, transform !custom',
309
+ 'background-color, border-color, color, opacity, outline-color, scale !custom',
310
310
  transitionTimingFunction: 'snappy',
311
311
  selectors: {
312
312
  '&:active:not(:disabled)': {
313
- transform: 'scale(0.98) !custom',
314
- transitionDuration: '100ms !custom',
313
+ scale: 'press',
314
+ transitionDuration: '100',
315
315
  },
316
- '&:disabled': { cursor: 'default', opacity: '0.4 !custom' },
316
+ '&:disabled': { cursor: 'default', opacity: 'disabled' },
317
317
  '&:focus-visible': { outlineColor: 'blue.700' },
318
318
  '&::before': {
319
319
  borderColor: 'transparent !custom',
320
320
  borderRadius: 'inherit !custom',
321
321
  borderStyle: 'solid !custom',
322
- borderWidth: '2px !custom',
322
+ borderWidth: '2',
323
323
  boxSizing: 'border-box',
324
324
  content: '"" !custom',
325
325
  inset: '0',
326
326
  pointerEvents: 'none',
327
327
  position: 'absolute',
328
- transitionDuration: '160ms !custom',
328
+ transitionDuration: '160',
329
329
  transitionProperty: 'border-color !custom',
330
330
  transitionTimingFunction: 'snappy',
331
331
  },
332
332
  '&[aria-invalid="true"]::before': { borderColor: 'red.800' },
333
333
  '&[aria-invalid="true"]:focus-visible': { outlineColor: 'red.800' },
334
334
  '&:focus-visible::before': { borderColor: 'transparent !custom' },
335
- '&[data-placeholder]': { color: 'gray.700' },
335
+ '&[data-placeholder]': { color: 'gray.900' },
336
336
  },
337
337
  '@media (forced-colors: active)': {
338
338
  outlineStyle: 'none !custom',
@@ -341,7 +341,7 @@ namespace styles {
341
341
  '@media (prefers-reduced-motion: reduce)': {
342
342
  transitionProperty:
343
343
  'background-color, border-color, color, opacity, outline-color !custom',
344
- selectors: { '&:active:not(:disabled)': { transform: 'none !custom' } },
344
+ selectors: { '&:active:not(:disabled)': { scale: 'none !custom' } },
345
345
  },
346
346
  },
347
347
  defaultVariants: { size: 'medium', variant: 'filled' },
@@ -364,7 +364,7 @@ namespace styles {
364
364
  },
365
365
  small: {
366
366
  borderRadius: '8',
367
- columnGap: '6px !custom',
367
+ columnGap: '6',
368
368
  height: '32',
369
369
  paddingInline: '12',
370
370
  typography: 'copy.13',
@@ -380,7 +380,7 @@ namespace styles {
380
380
  backgroundColor: 'background.surface',
381
381
  borderColor: 'grayAlpha.200',
382
382
  borderStyle: 'solid !custom',
383
- borderWidth: '1px !custom',
383
+ borderWidth: '1',
384
384
  selectors: { '&:hover:not(:disabled)': { borderColor: 'grayAlpha.400' } },
385
385
  },
386
386
  },
@@ -1,7 +1,7 @@
1
1
  import * as BaseUi from '@base-ui/react/dialog'
2
2
  import type { ComponentPropsWithRef } from 'react'
3
3
  import type * as zyzz from 'zyzz'
4
- import * as Icons from '../icons/index.js'
4
+ import { Close as CloseIcon } from '../icons/Close.js'
5
5
  import { style } from '../zyzz.config.js'
6
6
  import { Button } from './Button.js'
7
7
 
@@ -90,7 +90,7 @@ export namespace Dialog {
90
90
  <Button shape="icon" size="medium" variant="secondary" {...styles.close()} />
91
91
  }
92
92
  >
93
- <Icons.Close />
93
+ <CloseIcon />
94
94
  </BaseUi.Dialog.Close>
95
95
  )}
96
96
  </BaseUi.Dialog.Popup>
@@ -134,13 +134,13 @@ export namespace styles {
134
134
  {
135
135
  backgroundColor: 'black',
136
136
  inset: '0',
137
- opacity: '0.4 !custom',
137
+ opacity: 'disabled',
138
138
  position: 'fixed',
139
- transitionDuration: '240ms',
139
+ transitionDuration: '240',
140
140
  transitionProperty: 'opacity',
141
141
  transitionTimingFunction: 'snappy',
142
142
  selectors: {
143
- '&[data-ending-style]': { opacity: '0 !custom', transitionDuration: '160ms' },
143
+ '&[data-ending-style]': { opacity: '0 !custom', transitionDuration: '160' },
144
144
  '&[data-starting-style]': { opacity: '0 !custom' },
145
145
  },
146
146
  },
@@ -151,8 +151,8 @@ export namespace styles {
151
151
  export const close = style(
152
152
  {
153
153
  height: '36',
154
- insetBlockStart: '22px !custom',
155
- insetInlineEnd: '22px !custom',
154
+ insetBlockStart: '22',
155
+ insetInlineEnd: '22',
156
156
  position: 'absolute',
157
157
  },
158
158
  { id: 'tds/web/dialog/close' },
@@ -169,42 +169,51 @@ export namespace styles {
169
169
 
170
170
  export const popup = style(
171
171
  {
172
- backgroundColor: 'light-dark(#fff, #1f1e1e) !custom',
172
+ backgroundColor: 'background.raised',
173
173
  borderRadius: '16',
174
- boxShadow: '0 32px 64px -16px rgb(0 0 0 / 0.28) !custom',
174
+ boxShadow: 'modal',
175
175
  boxSizing: 'border-box',
176
176
  color: 'foreground',
177
177
  maxWidth: '448',
178
178
  outline: 'none !custom',
179
179
  padding: '24',
180
180
  position: 'relative',
181
- transitionDuration: '280ms',
182
- transitionProperty: 'opacity, transform',
181
+ transitionDuration: '280',
182
+ transitionProperty: 'opacity, scale, transform',
183
183
  transitionTimingFunction: 'spring',
184
184
  typography: 'copy.14',
185
185
  width: '100% !custom',
186
186
  selectors: {
187
187
  '&[data-ending-style]': {
188
188
  opacity: '0 !custom',
189
- transform: 'scale(0.96) !custom',
190
- transitionDuration: '180ms',
189
+ scale: 'enter',
190
+ transitionDuration: '180',
191
+ },
192
+ '&[data-starting-style]': {
193
+ opacity: '0 !custom',
194
+ scale: 'enter',
191
195
  },
192
- '&[data-starting-style]': { opacity: '0 !custom', transform: 'scale(0.96) !custom' },
193
196
  },
194
197
  '@media (max-width: 40rem)': {
195
- borderBottomLeftRadius: '0 !custom',
196
- borderBottomRightRadius: '0 !custom',
198
+ borderBottomLeftRadius: '0',
199
+ borderBottomRightRadius: '0',
197
200
  maxWidth: 'none !custom',
198
201
  paddingBottom: 'calc(24px + env(safe-area-inset-bottom, 0px)) !custom',
199
202
  selectors: {
200
- '&[data-ending-style]': { transform: 'translateY(100%) !custom' },
201
- '&[data-starting-style]': { transform: 'translateY(100%) !custom' },
203
+ '&[data-ending-style]': { scale: 'none !custom', transform: 'translateY(100%) !custom' },
204
+ '&[data-starting-style]': {
205
+ scale: 'none !custom',
206
+ transform: 'translateY(100%) !custom',
207
+ },
202
208
  },
203
209
  },
204
210
  '@media (prefers-reduced-motion: reduce)': {
205
211
  transitionProperty: 'opacity',
206
212
  selectors: {
207
- '&[data-ending-style], &[data-starting-style]': { transform: 'none !custom' },
213
+ '&[data-ending-style], &[data-starting-style]': {
214
+ scale: 'none !custom',
215
+ transform: 'none !custom',
216
+ },
208
217
  },
209
218
  },
210
219
  },
@@ -1,7 +1,7 @@
1
1
  import * as BaseUi from '@base-ui/react/drawer'
2
2
  import type { ComponentPropsWithRef } from 'react'
3
3
  import type * as zyzz from 'zyzz'
4
- import * as Icons from '../icons/index.js'
4
+ import { Close as CloseIcon } from '../icons/Close.js'
5
5
  import { style } from '../zyzz.config.js'
6
6
  import { Button } from './Button.js'
7
7
  import { styles as dialog } from './Dialog.js'
@@ -107,7 +107,7 @@ export namespace Drawer {
107
107
  <Button shape="icon" size="medium" variant="secondary" {...dialog.close()} />
108
108
  }
109
109
  >
110
- <Icons.Close />
110
+ <CloseIcon />
111
111
  </BaseUi.Drawer.Close>
112
112
  )}
113
113
  </BaseUi.Drawer.Popup>
@@ -153,7 +153,7 @@ namespace styles {
153
153
  inset: '0',
154
154
  opacity: 'calc(0.4 * (1 - var(--drawer-swipe-progress, 0))) !custom',
155
155
  position: 'fixed',
156
- transitionDuration: '320ms',
156
+ transitionDuration: '320',
157
157
  transitionProperty: 'opacity',
158
158
  transitionTimingFunction: 'spring',
159
159
  selectors: {
@@ -163,7 +163,7 @@ namespace styles {
163
163
  transitionDuration: 'calc(var(--drawer-swipe-strength, 1) * 240ms) !custom',
164
164
  },
165
165
  '&[data-starting-style]': { opacity: '0 !custom' },
166
- '&[data-swiping]': { transitionDuration: '0ms' },
166
+ '&[data-swiping]': { transitionDuration: '0' },
167
167
  },
168
168
  },
169
169
  { id: 'tds/web/drawer/backdrop' },
@@ -176,8 +176,8 @@ namespace styles {
176
176
 
177
177
  export const popup = style(
178
178
  {
179
- backgroundColor: 'light-dark(#fff, #1f1e1e) !custom',
180
- boxShadow: '0 32px 64px -16px rgb(0 0 0 / 0.28) !custom',
179
+ backgroundColor: 'background.raised',
180
+ boxShadow: 'modal',
181
181
  boxSizing: 'border-box',
182
182
  color: 'foreground',
183
183
  maxHeight: '100% !custom',
@@ -186,7 +186,7 @@ namespace styles {
186
186
  overscrollBehavior: 'contain',
187
187
  padding: '24',
188
188
  position: 'relative',
189
- transitionDuration: '320ms',
189
+ transitionDuration: '320',
190
190
  transitionProperty: 'opacity, transform',
191
191
  transitionTimingFunction: 'spring',
192
192
  typography: 'copy.14',
@@ -237,7 +237,7 @@ namespace styles {
237
237
  '&[data-swipe-direction="up"][data-ending-style], &[data-swipe-direction="up"][data-starting-style]':
238
238
  { transform: 'translateY(-100%) !custom' },
239
239
  // The popup follows the pointer without lag while swiping.
240
- '&[data-swiping]': { transitionDuration: '0ms', userSelect: 'none' },
240
+ '&[data-swiping]': { transitionDuration: '0', userSelect: 'none' },
241
241
  },
242
242
  '@media (prefers-reduced-motion: reduce)': {
243
243
  transitionProperty: 'opacity',
@@ -1,5 +1,5 @@
1
1
  import * as BaseUi from '@base-ui/react/field'
2
- import { type ComponentPropsWithRef, useContext } from 'react'
2
+ import { type ComponentPropsWithRef, useContext, useRef, useState } from 'react'
3
3
  import type * as zyzz from 'zyzz'
4
4
  import { style } from '../zyzz.config.js'
5
5
  import * as FieldVariant from './internal/FieldVariant.js'
@@ -37,21 +37,56 @@ export namespace Field {
37
37
  * Owns validity, dirty, touched and filled state for one control and shares the variant with the
38
38
  * controls inside. Without `variant`, it inherits the variant of an enclosing `Fieldset` or
39
39
  * `Field`, falling back to `default`.
40
+ *
41
+ * When a native `form` submit finds the control invalid, such as an empty `required` input, the
42
+ * field validates and shows `Field.Error`. Outside `onBlur` mode, it then revalidates on each
43
+ * change, as inside Base UI's `Form`. The browser still moves focus to the first invalid control.
44
+ *
45
+ * `checkValidity()` and `reportValidity()` validate the field only after the user has interacted
46
+ * with the control, when the browser already matches it as `:user-invalid`.
40
47
  */
41
48
  export function Root(props: Root.Props) {
42
- const { className, size, success = false, variant, vars, ...attributes } = props
49
+ const actions = useRef<BaseUi.Field.Root.Actions | null>(null)
50
+ const {
51
+ actionsRef = actions,
52
+ className,
53
+ onInvalidCapture,
54
+ size,
55
+ success = false,
56
+ validationMode,
57
+ variant,
58
+ vars,
59
+ ...attributes
60
+ } = props
43
61
  const inherited = useContext(FieldVariant.Context)
44
62
  const resolved = variant ?? inherited ?? 'default'
63
+ const [submitted, setSubmitted] = useState(false)
45
64
 
46
65
  return (
47
66
  <FieldVariant.Context.Provider value={resolved}>
48
67
  <BaseUi.Field.Root
49
68
  {...attributes}
50
69
  {...styles.root({ className, style: props.style, vars })}
70
+ actionsRef={actionsRef}
51
71
  data-field=""
52
72
  data-field-size={size}
53
73
  data-success={success || undefined}
54
74
  data-variant={resolved}
75
+ onInvalidCapture={(event) => {
76
+ onInvalidCapture?.(event)
77
+
78
+ // Base UI runs submit validation only inside its own Form. A native form fires `invalid`
79
+ // on each failing control instead, and the event does not bubble. `checkValidity()` and
80
+ // `reportValidity()` fire it too, but only a submit attempt marks the form's controls
81
+ // `:user-invalid` first. `invalid` targets only form controls.
82
+ if (!(event.target as Element).matches(':user-invalid')) return
83
+
84
+ actionsRef.current?.validate()
85
+ setSubmitted(true)
86
+ }}
87
+ // Base UI's Form counts submits to revalidate `onSubmit` fields on change. A native
88
+ // form has no count, so a failed submit switches the field to `onChange`.
89
+ validationMode={submitted && validationMode !== 'onBlur' ? 'onChange' : validationMode}
55
90
  />
56
91
  </FieldVariant.Context.Provider>
57
92
  )
@@ -171,7 +206,7 @@ namespace styles {
171
206
  {
172
207
  color: 'gray.900',
173
208
  margin: '0',
174
- transitionDuration: '200ms !custom',
209
+ transitionDuration: '200',
175
210
  transitionProperty: 'color, filter, opacity, transform !custom',
176
211
  transitionTimingFunction: 'snappy',
177
212
  typography: 'label.14',
@@ -192,7 +227,7 @@ namespace styles {
192
227
  pointerEvents: 'none',
193
228
  position: 'absolute',
194
229
  transform: 'translateY(-4px) !custom',
195
- transitionDuration: '150ms !custom',
230
+ transitionDuration: '150',
196
231
  },
197
232
  '[data-variant="setting"] > &': { gridColumn: '1 !custom', typography: 'copy.14' },
198
233
  '[data-variant="setting"][data-field-size="small"] > &': { typography: 'copy.13' },
@@ -214,7 +249,7 @@ namespace styles {
214
249
  export const error = style(
215
250
  {
216
251
  color: 'red.900',
217
- transitionDuration: '200ms !custom',
252
+ transitionDuration: '200',
218
253
  transitionProperty: 'color, filter, opacity, transform !custom',
219
254
  transitionTimingFunction: 'snappy',
220
255
  typography: 'label.14',
@@ -233,7 +268,7 @@ namespace styles {
233
268
  opacity: '0 !custom',
234
269
  position: 'absolute',
235
270
  transform: 'translateY(4px) !custom',
236
- transitionDuration: '150ms !custom',
271
+ transitionDuration: '150',
237
272
  },
238
273
  '&[data-starting-style]': {
239
274
  color: 'gray.900',
@@ -263,7 +298,7 @@ namespace styles {
263
298
  export const label = style(
264
299
  {
265
300
  color: 'foreground',
266
- transitionDuration: '160ms !custom',
301
+ transitionDuration: '160',
267
302
  transitionProperty: 'color, opacity !custom',
268
303
  transitionTimingFunction: 'snappy',
269
304
  typography: 'label.14.strong',
@@ -275,7 +310,7 @@ namespace styles {
275
310
  ':has(> [data-size="small"], > * > [data-size="small"]) > &': {
276
311
  typography: 'label.12.strong',
277
312
  },
278
- '[data-disabled] &': { opacity: '0.4 !custom' },
313
+ '[data-disabled] &': { opacity: 'disabled' },
279
314
  '[data-variant="setting"] > &': { gridColumn: '1 !custom', typography: 'copy.15.strong' },
280
315
  '[data-variant="setting"][data-field-size="small"] > &': {
281
316
  typography: 'copy.14.strong',
@@ -289,7 +324,7 @@ namespace styles {
289
324
  pointerEvents: 'none',
290
325
  transform: 'translateY(10px) !custom',
291
326
  transformOrigin: 'left top !custom',
292
- transitionDuration: '240ms !custom',
327
+ transitionDuration: '240',
293
328
  transitionProperty: 'color, opacity, transform !custom',
294
329
  transitionTimingFunction: 'spring',
295
330
  typography: 'label.14',
@@ -326,7 +361,7 @@ namespace styles {
326
361
  // Labels sit 8px above medium and large controls, and 6px above small ones.
327
362
  rowGap: '8',
328
363
  selectors: {
329
- '&:has(> [data-size="small"], > * > [data-size="small"])': { rowGap: '6px !custom' },
364
+ '&:has(> [data-size="small"], > * > [data-size="small"])': { rowGap: '6' },
330
365
  // A list of options reads as one block under its label, so it sits further away than one control.
331
366
  '&:has(> [role="radiogroup"], > [role="group"] [role="checkbox"])': { rowGap: '12' },
332
367
  '&[data-variant="setting"]': {
@@ -338,7 +373,7 @@ namespace styles {
338
373
  },
339
374
  '&[data-variant="setting"][data-field-size="small"]': {
340
375
  paddingBlock: '12',
341
- rowGap: '2px !custom',
376
+ rowGap: '2',
342
377
  },
343
378
  },
344
379
  },
@@ -33,7 +33,11 @@ export function Frame(props: Frame.Props) {
33
33
  export namespace Frame {
34
34
  export type Props = Root.Props
35
35
 
36
- /** A row of action buttons aligned to the end. */
36
+ /**
37
+ * A row of action buttons that share its width equally. Each action stays at least as wide as
38
+ * its label, and a `shape="icon"` button keeps its own size. If you stack the actions in a column,
39
+ * set `flex-basis: auto` on them so each keeps its height.
40
+ */
37
41
  export function Actions(props: Actions.Props) {
38
42
  const { className, vars, ...attributes } = props
39
43
 
@@ -44,7 +48,10 @@ export namespace Frame {
44
48
  export type Props = ComponentPropsWithRef<'div'> & zyzz.Props.Variants<typeof styles.actions>
45
49
  }
46
50
 
47
- /** The main content area. It grows to fill the frame and scrolls when its content overflows. */
51
+ /**
52
+ * The main content area. It grows to fill the frame and never scrolls, so the container that holds
53
+ * the frame handles overflow. A direct child `Rows` renders as a filled, rounded well.
54
+ */
48
55
  export function Body(props: Body.Props) {
49
56
  const { className, vars, ...attributes } = props
50
57
 
@@ -173,7 +180,15 @@ export namespace Frame {
173
180
  namespace styles {
174
181
  export const actions = variants(
175
182
  {
176
- base: { columnGap: '8', display: 'flex', justifyContent: 'flex-end' },
183
+ base: {
184
+ columnGap: '12',
185
+ display: 'flex',
186
+ selectors: {
187
+ // Actions keep at least their content width, icon buttons stay circles, and `:where` keeps
188
+ // the rule at single-class specificity so a caller can restore content-sized actions.
189
+ '& > :where(:not([data-shape="icon"]))': { flexBasis: '0', flexGrow: '1 !custom' },
190
+ },
191
+ },
177
192
  },
178
193
  { id: 'tds/web/frame/actions' },
179
194
  )
@@ -183,9 +198,15 @@ namespace styles {
183
198
  base: {
184
199
  color: 'gray.900',
185
200
  flexGrow: '1 !custom',
186
- minHeight: '0',
187
- overflowY: 'auto',
188
201
  typography: 'copy.14',
202
+ selectors: {
203
+ // The well clips its rows so their hover fills follow its corners.
204
+ '& > [data-rows]': {
205
+ backgroundColor: 'grayAlpha.100',
206
+ borderRadius: '12',
207
+ overflow: 'hidden',
208
+ },
209
+ },
189
210
  },
190
211
  },
191
212
  { id: 'tds/web/frame/body' },
@@ -206,18 +227,18 @@ namespace styles {
206
227
  height: '32',
207
228
  justifyContent: 'center',
208
229
  outlineColor: 'transparent !custom',
209
- outlineOffset: '0px !custom',
230
+ outlineOffset: '0',
210
231
  outlineStyle: 'solid !custom',
211
- outlineWidth: '2px !custom',
232
+ outlineWidth: '2',
212
233
  padding: '0',
213
- transitionDuration: '160ms',
234
+ transitionDuration: '160',
214
235
  transitionProperty: 'background-color, outline-color, outline-offset, transform',
215
236
  transitionTimingFunction: 'snappy',
216
237
  width: '32',
217
238
  selectors: {
218
239
  '&:hover': { backgroundColor: 'grayAlpha.200' },
219
240
  '&:active': { backgroundColor: 'grayAlpha.300', transform: 'scale(0.96) !custom' },
220
- '&:focus-visible': { outlineColor: 'blue.700', outlineOffset: '2px !custom' },
241
+ '&:focus-visible': { outlineColor: 'blue.700', outlineOffset: '2' },
221
242
  },
222
243
  '@media (prefers-reduced-motion: reduce)': {
223
244
  transitionProperty: 'background-color, outline-color',
@@ -112,7 +112,7 @@ namespace styles {
112
112
  export const arc = style(
113
113
  {
114
114
  stroke: 'currentColor !custom',
115
- transitionDuration: '240ms',
115
+ transitionDuration: '240',
116
116
  transitionProperty: 'stroke-dasharray',
117
117
  transitionTimingFunction: 'spring',
118
118
  '@media (prefers-reduced-motion: reduce)': { transitionProperty: 'none' },
@@ -287,7 +287,7 @@ namespace styles {
287
287
  style: {
288
288
  borderRadius: '12',
289
289
  height: '40',
290
- paddingInlineEnd: '10px !custom',
290
+ paddingInlineEnd: '10',
291
291
  paddingInlineStart: '16',
292
292
  selectors: {
293
293
  '& [data-hex-copy]': {
@@ -325,8 +325,8 @@ namespace styles {
325
325
  columnGap: '12',
326
326
  display: 'flex',
327
327
  justifyContent: 'space-between',
328
- transitionDuration: '160ms !custom',
329
- transitionProperty: 'background-color, transform !custom',
328
+ transitionDuration: '160',
329
+ transitionProperty: 'background-color, scale !custom',
330
330
  transitionTimingFunction: 'snappy',
331
331
  selectors: {
332
332
  '& [data-stretch]::after': {
@@ -339,12 +339,12 @@ namespace styles {
339
339
  '&:has([data-stretch]:hover)': { backgroundColor: 'gray.200' },
340
340
  '&:has([data-stretch]:active)': {
341
341
  backgroundColor: 'gray.300',
342
- transform: 'scale(0.98) !custom',
342
+ scale: 'press',
343
343
  },
344
344
  },
345
345
  '@media (prefers-reduced-motion: reduce)': {
346
346
  transitionProperty: 'background-color !custom',
347
- selectors: { '&:has([data-stretch]:active)': { transform: 'none !custom' } },
347
+ selectors: { '&:has([data-stretch]:active)': { scale: 'none !custom' } },
348
348
  },
349
349
  },
350
350
  inline: {},
@@ -33,7 +33,7 @@ namespace styles {
33
33
  base: {
34
34
  alignItems: 'center',
35
35
  // grayAlpha 100 in light mode and 300 in dark, where 100 reads as black.
36
- backgroundColor: 'light-dark(#0000000d, #ffffff21) !custom',
36
+ backgroundColor: 'background.chip',
37
37
  borderRadius: '12',
38
38
  boxSizing: 'border-box',
39
39
  color: 'foreground',
@@ -194,21 +194,21 @@ namespace styles {
194
194
  justifyContent: 'center',
195
195
  opacity: '0 !custom',
196
196
  outlineColor: 'transparent !custom',
197
- outlineOffset: '2px !custom',
197
+ outlineOffset: '2',
198
198
  outlineStyle: 'solid !custom',
199
- outlineWidth: '2px !custom',
199
+ outlineWidth: '2',
200
200
  padding: '0',
201
201
  pointerEvents: 'none',
202
202
  position: 'relative',
203
203
  transform: 'scale(0.6) !custom',
204
- transitionDuration: '160ms !custom',
204
+ transitionDuration: '160',
205
205
  transitionProperty: 'background-color, opacity, outline-color, transform, visibility !custom',
206
206
  transitionTimingFunction: 'snappy',
207
207
  visibility: 'hidden',
208
208
  width: '24',
209
209
  selectors: {
210
- '&::after': { content: '"" !custom', inset: '-8px !custom', position: 'absolute' },
211
- '&:active': { transform: 'scale(0.9) !custom', transitionDuration: '100ms !custom' },
210
+ '&::after': { content: '"" !custom', inset: '-8', position: 'absolute' },
211
+ '&:active': { transform: 'scale(0.9) !custom', transitionDuration: '100' },
212
212
  '&:focus-visible': { outlineColor: 'blue.700' },
213
213
  '&:hover': { backgroundColor: 'grayAlpha.300' },
214
214
  '[data-filled] &': {
@@ -218,11 +218,11 @@ namespace styles {
218
218
  visibility: 'visible',
219
219
  },
220
220
  '[data-filled] &:active': { transform: 'scale(0.9) !custom' },
221
- '[data-size="large"] > &:last-child': { marginInlineEnd: '-4px !custom' },
221
+ '[data-size="large"] > &:last-child': { marginInlineEnd: '-4' },
222
222
  '[data-size="medium"] > &': { fontSize: '12', height: '20', width: '20' },
223
- '[data-size="medium"] > &:last-child': { marginInlineEnd: '-6px !custom' },
223
+ '[data-size="medium"] > &:last-child': { marginInlineEnd: '-6' },
224
224
  '[data-size="small"] > &': { fontSize: '12', height: '16', width: '16' },
225
- '[data-size="small"] > &:last-child': { marginInlineEnd: '-4px !custom' },
225
+ '[data-size="small"] > &:last-child': { marginInlineEnd: '-4' },
226
226
  // A small stacked field takes the medium size, so Clear takes the medium size too.
227
227
  '[data-variant="stacked"] > [data-size="small"] > &': {
228
228
  fontSize: '12',
@@ -230,7 +230,7 @@ namespace styles {
230
230
  width: '20',
231
231
  },
232
232
  '[data-variant="stacked"] > [data-size="small"] > &:last-child': {
233
- marginInlineEnd: '-6px !custom',
233
+ marginInlineEnd: '-6',
234
234
  },
235
235
  },
236
236
  '@media (forced-colors: active)': {
@@ -262,8 +262,8 @@ namespace styles {
262
262
  selectors: {
263
263
  '&::-webkit-search-cancel-button': { appearance: 'none !custom', display: 'none' },
264
264
  '&::placeholder': {
265
- color: 'grayAlpha.700',
266
- transitionDuration: '160ms !custom',
265
+ color: 'grayAlpha.900',
266
+ transitionDuration: '160',
267
267
  transitionProperty: 'opacity !custom',
268
268
  transitionTimingFunction: 'snappy',
269
269
  },