@dxos/react-ui 0.8.4-main.fffef41 → 0.8.4-staging.ac66bdf99f

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 (382) hide show
  1. package/dist/lib/browser/chunk-OCVRIJCH.mjs +848 -0
  2. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4111 -67
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +88 -64
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +850 -0
  9. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +4111 -67
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +88 -64
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  20. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Button/Button.d.ts +3 -3
  22. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  23. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  25. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  27. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  29. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  30. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  32. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  33. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  34. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/Card/Card.d.ts +120 -0
  36. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  37. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  38. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Card/index.d.ts +2 -0
  40. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  42. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  43. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  44. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  45. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/Dialog/AlertDialog.d.ts +39 -19
  47. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  48. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  49. package/dist/types/src/components/Dialog/Dialog.d.ts +54 -21
  50. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  51. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
  52. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  54. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  56. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  57. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  58. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  59. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  60. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  61. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  62. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  63. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  64. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  66. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  67. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  68. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Focus/index.d.ts +2 -0
  70. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Icon/Icon.d.ts +4 -1
  72. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  73. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  74. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Image/Image.d.ts +14 -0
  76. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  78. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/index.d.ts +2 -0
  80. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Input/Input.d.ts +7 -7
  82. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  83. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  84. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/List/List.d.ts +6 -4
  87. package/dist/types/src/components/List/List.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  89. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  91. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  93. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  94. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Main/Main.d.ts +9 -10
  96. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  97. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  98. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  100. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  101. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -51
  103. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  105. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  107. package/dist/types/src/components/Message/Message.d.ts +1 -1
  108. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  109. package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
  110. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Popover/Popover.d.ts +33 -24
  112. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  113. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  115. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  116. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +57 -8
  117. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +37 -14
  119. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
  121. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/Select/Select.d.ts +9 -9
  123. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  124. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  125. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  126. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  127. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  128. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  129. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  130. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  131. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  132. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  133. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  134. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  135. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  136. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  138. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  139. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  140. package/dist/types/src/components/Status/Status.d.ts +3 -4
  141. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  142. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  143. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  144. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  145. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  146. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  147. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  149. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  150. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  151. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  152. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  153. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  154. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  155. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  156. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  157. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  158. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -18
  160. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  161. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  162. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  163. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  164. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  165. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  166. package/dist/types/src/components/index.d.ts +10 -5
  167. package/dist/types/src/components/index.d.ts.map +1 -1
  168. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  169. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  170. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  171. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  172. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  173. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  174. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  175. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  176. package/dist/types/src/hooks/index.d.ts +1 -0
  177. package/dist/types/src/hooks/index.d.ts.map +1 -1
  178. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  179. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  180. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  181. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  182. package/dist/types/src/index.d.ts +2 -1
  183. package/dist/types/src/index.d.ts.map +1 -1
  184. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  185. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  187. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  188. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  189. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  190. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  191. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  192. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  193. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  194. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  195. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  196. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  197. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  198. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  199. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  200. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  201. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  202. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  203. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  204. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  205. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  206. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  207. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  208. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  209. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  210. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  211. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  212. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  213. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  214. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  215. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  216. package/dist/types/src/primitives/index.d.ts +6 -0
  217. package/dist/types/src/primitives/index.d.ts.map +1 -0
  218. package/dist/types/src/testing/Loading.d.ts +9 -0
  219. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  220. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  221. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  222. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  223. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  224. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  225. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  226. package/dist/types/src/testing/index.d.ts +1 -0
  227. package/dist/types/src/testing/index.d.ts.map +1 -1
  228. package/dist/types/src/translations.d.ts +11 -0
  229. package/dist/types/src/translations.d.ts.map +1 -0
  230. package/dist/types/src/util/index.d.ts +1 -2
  231. package/dist/types/src/util/index.d.ts.map +1 -1
  232. package/dist/types/src/util/usePx.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +42 -32
  235. package/src/components/Avatars/Avatar.stories.tsx +7 -9
  236. package/src/components/Avatars/Avatar.tsx +7 -15
  237. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
  238. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
  239. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  240. package/src/components/Button/Button.stories.tsx +3 -4
  241. package/src/components/Button/Button.tsx +12 -26
  242. package/src/components/Button/IconButton.stories.tsx +8 -6
  243. package/src/components/Button/IconButton.tsx +9 -6
  244. package/src/components/Button/Toggle.stories.tsx +2 -3
  245. package/src/components/Button/Toggle.tsx +4 -4
  246. package/src/components/Button/ToggleGroup.stories.tsx +2 -3
  247. package/src/components/Button/ToggleGroup.tsx +12 -16
  248. package/src/components/Card/Card.stories.tsx +151 -0
  249. package/src/components/Card/Card.tsx +493 -0
  250. package/src/components/Card/index.ts +5 -0
  251. package/src/components/Clipboard/CopyButton.tsx +7 -8
  252. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  253. package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
  254. package/src/components/Dialog/AlertDialog.tsx +123 -82
  255. package/src/components/Dialog/Dialog.stories.tsx +138 -28
  256. package/src/components/Dialog/Dialog.tsx +197 -71
  257. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  258. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  259. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  260. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  261. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  262. package/src/components/ErrorFallback/index.ts +9 -0
  263. package/src/components/Focus/AUDIT.md +43 -0
  264. package/src/components/Focus/Focus.stories.tsx +230 -0
  265. package/src/components/Focus/Focus.tsx +201 -0
  266. package/src/components/Focus/index.ts +5 -0
  267. package/src/components/Icon/Icon.stories.tsx +45 -15
  268. package/src/components/Icon/Icon.tsx +7 -3
  269. package/src/components/Image/Image.stories.tsx +86 -0
  270. package/src/components/Image/Image.tsx +223 -0
  271. package/src/components/Image/index.ts +5 -0
  272. package/src/components/Input/Input.stories.tsx +21 -41
  273. package/src/components/Input/Input.tsx +38 -74
  274. package/src/components/Link/Link.stories.tsx +2 -3
  275. package/src/components/Link/Link.tsx +2 -2
  276. package/src/components/List/List.stories.tsx +30 -34
  277. package/src/components/List/List.tsx +17 -21
  278. package/src/components/List/ListDropIndicator.tsx +7 -7
  279. package/src/components/List/Tree.stories.tsx +5 -6
  280. package/src/components/List/Tree.tsx +0 -1
  281. package/src/components/List/TreeDropIndicator.tsx +6 -6
  282. package/src/components/List/Treegrid.stories.tsx +29 -30
  283. package/src/components/List/Treegrid.tsx +23 -28
  284. package/src/components/Main/Main.stories.tsx +41 -24
  285. package/src/components/Main/Main.tsx +139 -83
  286. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
  287. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  288. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
  289. package/src/components/{Menus → Menu}/DropdownMenu.tsx +115 -107
  290. package/src/components/Message/Message.stories.tsx +27 -13
  291. package/src/components/Message/Message.tsx +43 -34
  292. package/src/components/Popover/Popover.stories.tsx +7 -8
  293. package/src/components/Popover/Popover.tsx +97 -92
  294. package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
  295. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  296. package/src/components/ScrollArea/index.ts +1 -1
  297. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
  298. package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
  299. package/src/components/Select/Select.stories.tsx +7 -8
  300. package/src/components/Select/Select.tsx +11 -27
  301. package/src/components/Separator/Separator.tsx +5 -8
  302. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  303. package/src/components/Skeleton/Skeleton.tsx +26 -0
  304. package/src/components/Skeleton/index.ts +5 -0
  305. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  306. package/src/components/Splitter/Splitter.tsx +127 -0
  307. package/src/components/Splitter/index.ts +5 -0
  308. package/src/components/Status/Status.stories.tsx +21 -18
  309. package/src/components/Status/Status.tsx +10 -7
  310. package/src/components/Tag/Tag.stories.tsx +6 -12
  311. package/src/components/Tag/Tag.tsx +3 -8
  312. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  313. package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
  314. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  315. package/src/components/ThemeProvider/index.ts +3 -3
  316. package/src/components/Toast/Toast.stories.tsx +2 -3
  317. package/src/components/Toast/Toast.tsx +22 -41
  318. package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
  319. package/src/components/Toolbar/Toolbar.tsx +185 -23
  320. package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
  321. package/src/components/Tooltip/Tooltip.tsx +40 -38
  322. package/src/components/index.ts +11 -6
  323. package/src/exemplars/generics.stories.tsx +41 -0
  324. package/src/exemplars/slot.stories.tsx +117 -0
  325. package/src/exemplars/tabster.stories.tsx +127 -0
  326. package/src/exemplars/virtualizer.stories.tsx +137 -0
  327. package/src/hooks/index.ts +1 -0
  328. package/src/hooks/useDensityContext.ts +3 -3
  329. package/src/hooks/useElevationContext.ts +1 -1
  330. package/src/index.ts +2 -1
  331. package/src/playground/Controls.stories.tsx +3 -10
  332. package/src/playground/Custom.stories.tsx +15 -18
  333. package/src/playground/Typography.stories.tsx +3 -3
  334. package/src/primitives/Column/AUDIT.md +148 -0
  335. package/src/primitives/Column/Column.stories.tsx +181 -0
  336. package/src/primitives/Column/Column.tsx +165 -0
  337. package/src/primitives/Column/index.ts +5 -0
  338. package/src/primitives/Container/Container.stories.tsx +29 -0
  339. package/src/primitives/Container/Container.tsx +19 -0
  340. package/src/primitives/Container/index.ts +5 -0
  341. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  342. package/src/primitives/Flex/Flex.tsx +27 -0
  343. package/src/primitives/Flex/index.ts +5 -0
  344. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  345. package/src/primitives/Grid/Grid.tsx +30 -0
  346. package/src/primitives/Grid/index.ts +5 -0
  347. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  348. package/src/primitives/Panel/Panel.tsx +120 -0
  349. package/src/primitives/Panel/index.ts +5 -0
  350. package/src/primitives/index.ts +9 -0
  351. package/src/testing/Loading.tsx +47 -0
  352. package/src/testing/decorators/withLayout.tsx +39 -18
  353. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  354. package/src/testing/decorators/withTheme.tsx +26 -20
  355. package/src/testing/index.ts +2 -0
  356. package/src/translations.ts +19 -0
  357. package/src/util/index.ts +2 -2
  358. package/src/util/usePx.ts +1 -0
  359. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  360. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  361. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  362. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  363. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  364. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  365. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  366. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  367. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  368. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  369. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  370. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  372. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  373. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  374. package/dist/types/src/util/domino.d.ts +0 -18
  375. package/dist/types/src/util/domino.d.ts.map +0 -1
  376. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  377. package/src/components/AnchoredOverflow/index.ts +0 -5
  378. package/src/util/ThemedClassName.ts +0 -7
  379. package/src/util/domino.ts +0 -53
  380. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  381. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  382. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -0,0 +1,223 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type SyntheticEvent, useCallback, useRef, useState } from 'react';
6
+
7
+ import { type ThemedClassName } from '@dxos/react-ui';
8
+ import { mx } from '@dxos/ui-theme';
9
+
10
+ const cache = new Map<string, string>();
11
+
12
+ export type ImageProps = ThemedClassName<
13
+ {
14
+ src: string;
15
+ alt?: string;
16
+ crossOrigin?: 'anonymous' | 'use-credentials' | '';
17
+ } & ColorOptions
18
+ >;
19
+
20
+ // TODO(burdon): Option for neutral background color.
21
+ export const Image = ({
22
+ classNames,
23
+ src,
24
+ alt = '',
25
+ crossOrigin = 'anonymous',
26
+ sampleSize = 64,
27
+ contrast = 0.9,
28
+ }: ImageProps) => {
29
+ const [crossOriginState, setCrossOriginState] = useState<ImageProps['crossOrigin']>(crossOrigin);
30
+ const [dominantColor, setDominantColor] = useState<string | undefined>(undefined);
31
+ const [imageLoaded, setImageLoaded] = useState<boolean>(false);
32
+ const canvasRef = useRef<HTMLCanvasElement>(null);
33
+
34
+ // CORS not supported by server.
35
+ const handleImageError = (): void => {
36
+ setCrossOriginState(undefined);
37
+ };
38
+
39
+ const handleImageLoad = useCallback(
40
+ ({ target }: SyntheticEvent<HTMLImageElement>): void => {
41
+ const rgb = cache.get(src);
42
+ if (rgb) {
43
+ setDominantColor(rgb);
44
+ setImageLoaded(true);
45
+ return;
46
+ }
47
+
48
+ const img = target as HTMLImageElement;
49
+ if (!canvasRef.current) {
50
+ return;
51
+ }
52
+
53
+ try {
54
+ const color = extractDominantColor(canvasRef.current, img, { sampleSize, contrast });
55
+ if (color) {
56
+ const rgb = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
57
+ cache.set(src, rgb);
58
+ setDominantColor(rgb);
59
+ }
60
+ } catch {
61
+ setCrossOriginState(undefined);
62
+ }
63
+
64
+ setImageLoaded(true);
65
+ },
66
+ [sampleSize, contrast, src],
67
+ );
68
+
69
+ return (
70
+ <div
71
+ className={mx(`relative flex w-full justify-center overflow-hidden transition-all duration-700`, classNames)}
72
+ style={{
73
+ backgroundColor: dominantColor,
74
+ }}
75
+ >
76
+ {/* Hidden canvas for color extraction. */}
77
+ <canvas ref={canvasRef} style={{ display: 'none' }} aria-hidden='true' />
78
+
79
+ {/* Background gradient overlay for smooth transition. */}
80
+ <div
81
+ className='absolute inset-0 pointer-events-none'
82
+ style={{
83
+ background: dominantColor
84
+ ? `radial-gradient(circle at center, transparent 30%, ${dominantColor} 100%)`
85
+ : undefined,
86
+ transition: 'opacity 0.7s ease-in-out',
87
+ opacity: 0.5,
88
+ }}
89
+ />
90
+
91
+ <img
92
+ src={src}
93
+ alt={alt}
94
+ crossOrigin={crossOriginState}
95
+ onError={handleImageError}
96
+ onLoad={handleImageLoad}
97
+ className='z-10 object-contain transition-opacity duration-500'
98
+ style={{
99
+ opacity: imageLoaded ? 1 : 0,
100
+ }}
101
+ />
102
+ </div>
103
+ );
104
+ };
105
+
106
+ type ColorOptions = {
107
+ sampleSize?: number;
108
+ contrast?: number;
109
+ };
110
+
111
+ /**
112
+ * Get dominant color from image (esp. from corners).
113
+ */
114
+ const extractDominantColor = (
115
+ canvas: HTMLCanvasElement,
116
+ img: HTMLImageElement,
117
+ { sampleSize = 64, contrast = 0.95 }: ColorOptions,
118
+ ): [number, number, number] | null => {
119
+ const ctx = canvas.getContext('2d');
120
+ if (!ctx) {
121
+ return null;
122
+ }
123
+
124
+ // Draw the image scaled down.
125
+ canvas.width = sampleSize;
126
+ canvas.height = sampleSize;
127
+ ctx.drawImage(img, 0, 0, sampleSize, sampleSize);
128
+
129
+ // Get image data.
130
+ const imageData = ctx.getImageData(0, 0, sampleSize, sampleSize);
131
+ const pixels = imageData.data;
132
+
133
+ // Check for transparent background.
134
+ if (isTransparent(pixels, sampleSize)) {
135
+ return null;
136
+ }
137
+
138
+ let r = 0;
139
+ let g = 0;
140
+ let b = 0;
141
+ let totalWeight = 0;
142
+
143
+ // Define corner sampling areas (e.g., 25% of each dimension from each corner).
144
+ const cornerSize = Math.floor(sampleSize * 0.125);
145
+
146
+ // Sample only pixels in corner areas.
147
+ for (let y = 0; y < sampleSize; y++) {
148
+ for (let x = 0; x < sampleSize; x++) {
149
+ // Check if pixel is in any corner area.
150
+ const isInTopLeft = x < cornerSize && y < cornerSize;
151
+ const isInTopRight = x >= sampleSize - cornerSize && y < cornerSize;
152
+ const isInBottomLeft = x < cornerSize && y >= sampleSize - cornerSize;
153
+ const isInBottomRight = x >= sampleSize - cornerSize && y >= sampleSize - cornerSize;
154
+ if (!isInTopLeft && !isInTopRight && !isInBottomLeft && !isInBottomRight) {
155
+ continue; // Skip pixels not in corner areas.
156
+ }
157
+
158
+ const i = (y * sampleSize + x) * 4;
159
+ const red = pixels[i];
160
+ const green = pixels[i + 1];
161
+ const blue = pixels[i + 2];
162
+ const alpha = pixels[i + 3];
163
+
164
+ // Skip transparent pixels.
165
+ if (alpha === 0) continue;
166
+
167
+ // Calculate saturation to weight vibrant colors more.
168
+ const max = Math.max(red, green, blue);
169
+ const min = Math.min(red, green, blue);
170
+ const saturation = max === 0 ? 0 : (max - min) / max;
171
+ const weight = 1 + saturation * 2;
172
+
173
+ r += red * weight;
174
+ g += green * weight;
175
+ b += blue * weight;
176
+ totalWeight += weight;
177
+ }
178
+ }
179
+
180
+ if (totalWeight > 0) {
181
+ // Slightly darken the color for better contrast.
182
+ r = Math.round(Math.round(r / totalWeight) * contrast);
183
+ g = Math.round(Math.round(g / totalWeight) * contrast);
184
+ b = Math.round(Math.round(b / totalWeight) * contrast);
185
+ return [r, g, b];
186
+ }
187
+
188
+ return null;
189
+ };
190
+
191
+ /**
192
+ * Detects if an image has a transparent background by examining edge pixels.
193
+ * @param pixels - Image pixel data from canvas
194
+ * @param sampleSize - Size of the sampled image
195
+ * @param threshold - Percentage threshold for considering background transparent (default: 0.5)
196
+ * @returns True if the image has a transparent background
197
+ */
198
+ const isTransparent = (pixels: Uint8ClampedArray, sampleSize: number, threshold: number = 0.5): boolean => {
199
+ let edgeTransparentPixels = 0;
200
+ const edgePixels = sampleSize * 4 - 4; // Perimeter minus corners counted twice.
201
+
202
+ for (let x = 0; x < sampleSize; x++) {
203
+ // Top edge.
204
+ const topIndex = x * 4;
205
+ if (pixels[topIndex + 3] === 0) edgeTransparentPixels++;
206
+
207
+ // Bottom edge.
208
+ const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
209
+ if (pixels[bottomIndex + 3] === 0) edgeTransparentPixels++;
210
+ }
211
+
212
+ for (let y = 1; y < sampleSize - 1; y++) {
213
+ // Left edge.
214
+ const leftIndex = y * sampleSize * 4;
215
+ if (pixels[leftIndex + 3] === 0) edgeTransparentPixels++;
216
+
217
+ // Right edge.
218
+ const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
219
+ if (pixels[rightIndex + 3] === 0) edgeTransparentPixels++;
220
+ }
221
+
222
+ return edgeTransparentPixels / edgePixels > threshold;
223
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Image';
@@ -5,11 +5,9 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { baseSurface, modalSurface, mx, surfaceShadow } from '@dxos/react-ui-theme';
9
- import { type MessageValence } from '@dxos/react-ui-types';
10
-
11
- import { withTheme } from '../../testing';
8
+ import { type MessageValence } from '@dxos/ui-types';
12
9
 
10
+ import { withLayoutVariants, withTheme } from '../../testing';
13
11
  import {
14
12
  type CheckboxProps,
15
13
  Input,
@@ -29,7 +27,7 @@ type VariantMap = {
29
27
 
30
28
  type Variant = { [K in keyof VariantMap]: { type: K } & VariantMap[K] }[keyof VariantMap];
31
29
 
32
- type BaseProps = Partial<{
30
+ type DefaultStoryProps = Partial<{
33
31
  kind: keyof VariantMap;
34
32
  label: string;
35
33
  labelVisuallyHidden: boolean;
@@ -39,7 +37,7 @@ type BaseProps = Partial<{
39
37
  validationMessage: string;
40
38
  }>;
41
39
 
42
- const Wrapper = ({
40
+ const DefaultStory = ({
43
41
  kind,
44
42
  label,
45
43
  description,
@@ -48,7 +46,7 @@ const Wrapper = ({
48
46
  validationValence,
49
47
  validationMessage,
50
48
  ...props
51
- }: BaseProps) => {
49
+ }: DefaultStoryProps) => {
52
50
  return (
53
51
  <Input.Root {...{ validationValence }}>
54
52
  <Input.Label srOnly={labelVisuallyHidden}>{label}</Input.Label>
@@ -60,48 +58,28 @@ const Wrapper = ({
60
58
  {kind === 'switch' && <Input.Switch {...props} />}
61
59
 
62
60
  <Input.DescriptionAndValidation srOnly={descriptionVisuallyHidden}>
63
- {validationMessage && (
64
- <>
65
- <Input.Validation>{validationMessage}</Input.Validation>{' '}
66
- </>
67
- )}
61
+ {validationMessage && <Input.Validation classNames='block'>{validationMessage}</Input.Validation>}
68
62
  <Input.Description>{description}</Input.Description>
69
63
  </Input.DescriptionAndValidation>
70
64
  </Input.Root>
71
65
  );
72
66
  };
73
67
 
74
- const DefaultStory = (props: BaseProps) => {
75
- return (
76
- <div className='space-b-4'>
77
- <div className={mx(baseSurface, 'p-4 rounded-md')}>
78
- <Wrapper {...props} />
79
- </div>
80
- <div className={mx('bg-cardSurface', 'p-4 rounded-md', surfaceShadow({ elevation: 'positioned' }))}>
81
- <Wrapper {...props} />
82
- </div>
83
- <div className={mx(modalSurface, 'p-4 rounded-md', surfaceShadow({ elevation: 'dialog' }))}>
84
- <Wrapper {...props} />
85
- </div>
86
- </div>
87
- );
88
- };
89
-
90
68
  const meta = {
91
- title: 'ui/react-ui-core/Input',
69
+ title: 'ui/react-ui-core/components/Input',
92
70
  component: Input.Root as any,
93
71
  render: DefaultStory,
94
- decorators: [withTheme],
72
+ decorators: [withTheme(), withLayoutVariants()],
95
73
  } satisfies Meta<typeof DefaultStory>;
96
74
 
97
75
  export default meta;
98
76
 
99
- type Story = StoryObj<BaseProps & Variant>;
77
+ type Story = StoryObj<DefaultStoryProps & Variant>;
100
78
 
101
- export const Default: Story = {
79
+ export const DensityCoarse: Story = {
102
80
  args: {
103
81
  kind: 'text',
104
- label: 'Hello',
82
+ label: 'Input value',
105
83
  placeholder: 'This is an input',
106
84
  disabled: false,
107
85
  description: undefined,
@@ -109,13 +87,14 @@ export const Default: Story = {
109
87
  descriptionVisuallyHidden: false,
110
88
  validationMessage: '',
111
89
  validationValence: undefined,
90
+ density: 'coarse',
112
91
  },
113
92
  };
114
93
 
115
94
  export const DensityFine: Story = {
116
95
  args: {
117
96
  kind: 'text',
118
- label: 'This is an Input with a density value of ‘fine’',
97
+ label: 'Input value',
119
98
  placeholder: 'This is a density:fine input',
120
99
  disabled: false,
121
100
  description: undefined,
@@ -130,7 +109,7 @@ export const DensityFine: Story = {
130
109
  export const Subdued: Story = {
131
110
  args: {
132
111
  kind: 'text',
133
- label: 'Hello',
112
+ label: 'Input value',
134
113
  placeholder: 'This is a subdued input',
135
114
  disabled: false,
136
115
  description: undefined,
@@ -160,7 +139,7 @@ export const LabelVisuallyHidden: Story = {
160
139
  },
161
140
  };
162
141
 
163
- export const InputWithDescription: Story = {
142
+ export const WithDescription: Story = {
164
143
  args: {
165
144
  kind: 'text',
166
145
  label: 'Described input',
@@ -169,7 +148,7 @@ export const InputWithDescription: Story = {
169
148
  },
170
149
  };
171
150
 
172
- export const InputWithErrorAndDescription: Story = {
151
+ export const WithErrorAndDescription: Story = {
173
152
  args: {
174
153
  kind: 'text',
175
154
  label: 'Described invalid input',
@@ -180,7 +159,7 @@ export const InputWithErrorAndDescription: Story = {
180
159
  },
181
160
  };
182
161
 
183
- export const InputWithValidationAndDescription: Story = {
162
+ export const WithValidationAndDescription: Story = {
184
163
  args: {
185
164
  kind: 'text',
186
165
  label: 'Described input with validation message',
@@ -206,7 +185,8 @@ export const PinInput: Story = {
206
185
  label: 'This input is a PIN-style input',
207
186
  length: 6,
208
187
  description: 'Type in secret you received',
209
- placeholder: '••••••',
188
+ pattern: '\\d*',
189
+ density: 'coarse',
210
190
  },
211
191
  };
212
192
 
@@ -214,7 +194,7 @@ export const Checkbox: Story = {
214
194
  args: {
215
195
  kind: 'checkbox',
216
196
  label: 'This is a checkbox',
217
- description: 'It’s checked, indeterminate, or unchecked',
197
+ description: 'Checked, indeterminate, or unchecked',
218
198
  size: 5,
219
199
  },
220
200
  };
@@ -223,6 +203,6 @@ export const Switch: Story = {
223
203
  args: {
224
204
  kind: 'switch',
225
205
  label: 'This is a switch',
226
- description: "It's either off... or on.",
206
+ description: 'On or off',
227
207
  },
228
208
  };
@@ -2,9 +2,9 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Root as CheckboxPrimitive, type CheckboxProps as CheckboxPrimitiveProps } from '@radix-ui/react-checkbox';
5
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
6
6
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
7
- import React, { type ComponentPropsWithRef, type ForwardRefExoticComponent, forwardRef, useCallback } from 'react';
7
+ import React, { type ComponentPropsWithRef, type ForwardRefExoticComponent, forwardRef } from 'react';
8
8
 
9
9
  import {
10
10
  DescriptionAndValidation as DescriptionAndValidationPrimitive,
@@ -27,8 +27,8 @@ import {
27
27
  type ValidationProps as ValidationPrimitiveProps,
28
28
  useInputContext,
29
29
  } from '@dxos/react-input';
30
- import { mx } from '@dxos/react-ui-theme';
31
- import { type ClassNameValue, type Density, type Elevation, type Size } from '@dxos/react-ui-types';
30
+ import { mx } from '@dxos/ui-theme';
31
+ import { type Density, type Elevation, type Size } from '@dxos/ui-types';
32
32
 
33
33
  import { useDensityContext, useElevationContext, useThemeContext } from '../../hooks';
34
34
  import { type ThemedClassName } from '../../util';
@@ -40,10 +40,10 @@ type InputSharedProps = Partial<{ density: Density; elevation: Elevation; varian
40
40
 
41
41
  type LabelProps = ThemedClassName<LabelPrimitiveProps> & { srOnly?: boolean };
42
42
 
43
- const Label = forwardRef<HTMLLabelElement, LabelProps>(({ srOnly, classNames, children, ...props }, forwardedRef) => {
43
+ const Label = forwardRef<HTMLLabelElement, LabelProps>(({ classNames, children, srOnly, ...props }, forwardedRef) => {
44
44
  const { tx } = useThemeContext();
45
45
  return (
46
- <LabelPrimitive {...props} className={tx('input.label', 'input__label', { srOnly }, classNames)} ref={forwardedRef}>
46
+ <LabelPrimitive {...props} className={tx('input.label', { srOnly }, classNames)} ref={forwardedRef}>
47
47
  {children}
48
48
  </LabelPrimitive>
49
49
  );
@@ -52,14 +52,10 @@ const Label = forwardRef<HTMLLabelElement, LabelProps>(({ srOnly, classNames, ch
52
52
  type DescriptionProps = ThemedClassName<DescriptionPrimitiveProps> & { srOnly?: boolean };
53
53
 
54
54
  const Description = forwardRef<HTMLSpanElement, DescriptionProps>(
55
- ({ srOnly, classNames, children, ...props }, forwardedRef) => {
55
+ ({ classNames, children, srOnly, ...props }, forwardedRef) => {
56
56
  const { tx } = useThemeContext();
57
57
  return (
58
- <DescriptionPrimitive
59
- {...props}
60
- className={tx('input.description', 'input__description', { srOnly }, classNames)}
61
- ref={forwardedRef}
62
- >
58
+ <DescriptionPrimitive {...props} className={tx('input.description', { srOnly }, classNames)} ref={forwardedRef}>
63
59
  {children}
64
60
  </DescriptionPrimitive>
65
61
  );
@@ -69,18 +65,13 @@ const Description = forwardRef<HTMLSpanElement, DescriptionProps>(
69
65
  type ValidationProps = ThemedClassName<ValidationPrimitiveProps> & { srOnly?: boolean };
70
66
 
71
67
  const Validation = forwardRef<HTMLSpanElement, InputScopedProps<ValidationProps>>(
72
- ({ __inputScope, srOnly, classNames, children, ...props }, forwardedRef) => {
68
+ ({ __inputScope, classNames, children, srOnly, ...props }, forwardedRef) => {
73
69
  const { tx } = useThemeContext();
74
70
  const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
75
71
  return (
76
72
  <ValidationPrimitive
77
73
  {...props}
78
- className={tx(
79
- 'input.validation',
80
- `input__validation-message input__validation-message--${validationValence}`,
81
- { srOnly, validationValence },
82
- classNames,
83
- )}
74
+ className={tx('input.validation', { srOnly, validationValence }, classNames)}
84
75
  ref={forwardedRef}
85
76
  >
86
77
  {children}
@@ -92,12 +83,12 @@ const Validation = forwardRef<HTMLSpanElement, InputScopedProps<ValidationProps>
92
83
  type DescriptionAndValidationProps = ThemedClassName<DescriptionAndValidationPrimitiveProps> & { srOnly?: boolean };
93
84
 
94
85
  const DescriptionAndValidation = forwardRef<HTMLParagraphElement, DescriptionAndValidationProps>(
95
- ({ srOnly, classNames, children, ...props }, forwardedRef) => {
86
+ ({ classNames, children, srOnly, ...props }, forwardedRef) => {
96
87
  const { tx } = useThemeContext();
97
88
  return (
98
89
  <DescriptionAndValidationPrimitive
99
90
  {...props}
100
- className={tx('input.descriptionAndValidation', 'input__description-and-validation', { srOnly }, classNames)}
91
+ className={tx('input.descriptionAndValidation', { srOnly }, classNames)}
101
92
  ref={forwardedRef}
102
93
  >
103
94
  {children}
@@ -106,54 +97,23 @@ const DescriptionAndValidation = forwardRef<HTMLParagraphElement, DescriptionAnd
106
97
  },
107
98
  );
108
99
 
109
- type PinInputProps = InputSharedProps &
110
- Omit<PinInputPrimitiveProps, 'segmentClassName' | 'inputClassName'> & {
111
- segmentClassName?: ClassNameValue;
112
- inputClassName?: ClassNameValue;
113
- };
100
+ type PinInputProps = ThemedClassName<InputSharedProps & Omit<PinInputPrimitiveProps, 'className' | 'segmentClassName'>>;
114
101
 
115
102
  const PinInput = forwardRef<HTMLInputElement, PinInputProps>(
116
- (
117
- {
118
- density: propsDensity,
119
- elevation: propsElevation,
120
- segmentClassName: propsSegmentClassName,
121
- inputClassName,
122
- variant,
123
- ...props
124
- },
125
- forwardedRef,
126
- ) => {
103
+ ({ classNames, density: propsDensity, elevation: propsElevation, ...props }, forwardedRef) => {
127
104
  const { hasIosKeyboard } = useThemeContext();
128
105
  const { tx } = useThemeContext();
129
106
  const density = useDensityContext(propsDensity);
130
107
  const elevation = useElevationContext(propsElevation);
131
108
 
132
- const segmentClassName = useCallback(
133
- ({ focused, validationValence }: Parameters<Exclude<PinInputPrimitiveProps['segmentClassName'], undefined>>[0]) =>
134
- tx(
135
- 'input.input',
136
- 'input--pin-segment',
137
- {
138
- variant: 'static',
139
- focused,
140
- disabled: props.disabled,
141
- density,
142
- elevation,
143
- validationValence,
144
- },
145
- propsSegmentClassName,
146
- ),
147
- [tx, props.disabled, elevation, propsElevation, density],
148
- );
149
109
  return (
150
110
  <PinInputPrimitive
151
111
  {...{
152
112
  ...props,
153
- segmentClassName,
154
113
  ...(props.autoFocus && !hasIosKeyboard && { autoFocus: true }),
155
114
  }}
156
- inputClassName={tx('input.inputWithSegments', 'input input--pin', { disabled: props.disabled }, inputClassName)}
115
+ className={tx('input.inputWithSegments', { disabled: props.disabled }, classNames) || ''}
116
+ segmentClassName={tx('input.segment', { disabled: props.disabled, density, elevation }) || ''}
157
117
  ref={forwardedRef}
158
118
  />
159
119
  );
@@ -162,24 +122,30 @@ const PinInput = forwardRef<HTMLInputElement, PinInputProps>(
162
122
 
163
123
  // TODO(burdon): Implement inline icon within button: e.g., https://www.radix-ui.com/themes/playground#text-field
164
124
 
165
- type TextInputProps = InputSharedProps & ThemedClassName<TextInputPrimitiveProps>;
125
+ type AutoFillProps = {
126
+ noAutoFill?: boolean;
127
+ };
128
+
129
+ type TextInputProps = InputSharedProps & ThemedClassName<TextInputPrimitiveProps> & AutoFillProps;
166
130
 
167
131
  const TextInput = forwardRef<HTMLInputElement, InputScopedProps<TextInputProps>>(
168
- ({ __inputScope, classNames, density: propsDensity, elevation: propsElevation, variant, ...props }, forwardedRef) => {
132
+ (
133
+ { __inputScope, classNames, density: densityProp, elevation: elevationProp, variant, noAutoFill, ...props },
134
+ forwardedRef,
135
+ ) => {
169
136
  const { hasIosKeyboard } = useThemeContext();
170
- const themeContextValue = useThemeContext();
171
- const density = useDensityContext(propsDensity);
172
- const elevation = useElevationContext(propsElevation);
137
+ const { tx } = useThemeContext();
138
+ const density = useDensityContext(densityProp);
139
+ const elevation = useElevationContext(elevationProp);
173
140
  const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
174
141
 
175
- const { tx } = themeContextValue;
176
-
177
142
  return (
178
143
  <TextInputPrimitive
179
144
  {...props}
145
+ // TODO(wittjosiah): Factor out autofill properies.
146
+ {...{ 'data-1p-ignore': noAutoFill }}
180
147
  className={tx(
181
148
  'input.input',
182
- 'input',
183
149
  {
184
150
  variant,
185
151
  disabled: props.disabled,
@@ -210,8 +176,7 @@ const TextArea = forwardRef<HTMLTextAreaElement, InputScopedProps<TextAreaProps>
210
176
  <TextAreaPrimitive
211
177
  {...props}
212
178
  className={tx(
213
- 'input.input',
214
- 'input--text-area',
179
+ 'input.textArea',
215
180
  {
216
181
  variant,
217
182
  disabled: props.disabled,
@@ -219,7 +184,6 @@ const TextArea = forwardRef<HTMLTextAreaElement, InputScopedProps<TextAreaProps>
219
184
  elevation,
220
185
  validationValence,
221
186
  },
222
- '-mbe-labelSpacingBlock',
223
187
  classNames,
224
188
  )}
225
189
  {...(props.autoFocus && !hasIosKeyboard && { autoFocus: true })}
@@ -229,7 +193,7 @@ const TextArea = forwardRef<HTMLTextAreaElement, InputScopedProps<TextAreaProps>
229
193
  },
230
194
  );
231
195
 
232
- type CheckboxProps = ThemedClassName<Omit<CheckboxPrimitiveProps, 'children'>> & {
196
+ type CheckboxProps = ThemedClassName<Omit<CheckboxPrimitive.CheckboxProps, 'children'>> & {
233
197
  size?: Size;
234
198
  };
235
199
 
@@ -240,11 +204,11 @@ const Checkbox: ForwardRefExoticComponent<CheckboxProps> = forwardRef<
240
204
  (
241
205
  {
242
206
  __inputScope,
207
+ classNames,
243
208
  checked: propsChecked,
244
209
  defaultChecked: propsDefaultChecked,
245
210
  onCheckedChange: propsOnCheckedChange,
246
211
  size,
247
- classNames,
248
212
  ...props
249
213
  },
250
214
  forwardedRef,
@@ -258,7 +222,7 @@ const Checkbox: ForwardRefExoticComponent<CheckboxProps> = forwardRef<
258
222
  const { tx } = useThemeContext();
259
223
 
260
224
  return (
261
- <CheckboxPrimitive
225
+ <CheckboxPrimitive.Root
262
226
  {...{
263
227
  ...props,
264
228
  checked,
@@ -269,15 +233,15 @@ const Checkbox: ForwardRefExoticComponent<CheckboxProps> = forwardRef<
269
233
  'aria-invalid': 'true' as const,
270
234
  'aria-errormessage': errorMessageId,
271
235
  }),
272
- className: tx('input.checkbox', 'input--checkbox', { size }, 'shrink-0', classNames),
236
+ className: tx('input.checkbox', { size }, 'shrink-0', classNames),
273
237
  }}
274
238
  ref={forwardedRef}
275
239
  >
276
240
  <Icon
277
241
  icon={checked === 'indeterminate' ? 'ph--minus--regular' : 'ph--check--regular'}
278
- classNames={tx('input.checkboxIndicator', 'input--checkbox__indicator', { size, checked })}
242
+ classNames={tx('input.checkboxIndicator', { size, checked })}
279
243
  />
280
- </CheckboxPrimitive>
244
+ </CheckboxPrimitive.Root>
281
245
  );
282
246
  },
283
247
  );
@@ -290,10 +254,10 @@ const Switch = forwardRef<HTMLInputElement, InputScopedProps<SwitchProps>>(
290
254
  (
291
255
  {
292
256
  __inputScope,
257
+ classNames,
293
258
  checked: propsChecked,
294
259
  defaultChecked: propsDefaultChecked,
295
260
  onCheckedChange: propsOnCheckedChange,
296
- classNames,
297
261
  ...props
298
262
  },
299
263
  forwardedRef,
@@ -5,13 +5,12 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
7
  import { withTheme } from '../../testing';
8
-
9
8
  import { Link } from './Link';
10
9
 
11
10
  const meta = {
12
- title: 'ui/react-ui-core/Link',
11
+ title: 'ui/react-ui-core/components/Link',
13
12
  component: Link,
14
- decorators: [withTheme],
13
+ decorators: [withTheme()],
15
14
  } satisfies Meta<typeof Link>;
16
15
 
17
16
  export default meta;
@@ -18,7 +18,7 @@ export type LinkProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.a
18
18
  export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
19
19
  ({ asChild, variant, classNames, ...props }, forwardedRef) => {
20
20
  const { tx } = useThemeContext();
21
- const Root = asChild ? Slot : Primitive.a;
22
- return <Root {...props} className={tx('link.root', 'link', { variant }, classNames)} ref={forwardedRef} />;
21
+ const Comp = asChild ? Slot : Primitive.a;
22
+ return <Comp {...props} className={tx('link.root', { variant }, classNames)} ref={forwardedRef} />;
23
23
  },
24
24
  );