@dxos/react-ui 0.8.4-staging.ac66bdf99f → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-5SPBSIWS.mjs +33 -0
  4. package/dist/lib/browser/chunk-5SPBSIWS.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs +1612 -0
  6. package/dist/lib/browser/chunk-7JFD5ZHZ.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3039 -1891
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +10 -13
  11. package/dist/lib/browser/testing/index.mjs.map +3 -3
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/chunk-FPVTVXND.mjs +35 -0
  15. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs +1614 -0
  17. package/dist/lib/node-esm/chunk-TTEL2FP2.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3039 -1891
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +10 -13
  22. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.theme.d.ts +11 -0
  28. package/dist/types/src/components/Avatars/Avatar.theme.d.ts.map +1 -0
  29. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +5 -1
  31. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  32. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts +4 -0
  34. package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -0
  35. package/dist/types/src/components/Button/Button.d.ts +1 -1
  36. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  37. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  38. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/Button.theme.d.ts +11 -0
  40. package/dist/types/src/components/Button/Button.theme.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +1 -0
  44. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  45. package/dist/types/src/components/Button/IconButton.theme.d.ts +8 -0
  46. package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  48. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  49. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  50. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  51. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  52. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  53. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  54. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  55. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  56. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  57. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  58. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  59. package/dist/types/src/components/Card/Card.d.ts +63 -57
  60. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  61. package/dist/types/src/components/Card/Card.stories.d.ts +1 -0
  62. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  63. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  64. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  65. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  66. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  67. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  68. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  70. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  71. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  72. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  73. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  74. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  75. package/dist/types/src/{primitives → components}/Column/Column.d.ts +4 -4
  76. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  77. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  78. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  79. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  80. package/dist/types/src/components/Column/index.d.ts +3 -0
  81. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  82. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  83. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  84. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  85. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  86. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  87. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  88. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  89. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  91. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  92. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  93. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  94. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  96. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  97. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  99. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  100. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  101. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  103. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  104. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  105. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  106. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  108. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  109. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  110. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  111. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  112. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  114. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  116. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  117. package/dist/types/src/components/Icon/index.d.ts +1 -0
  118. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  119. package/dist/types/src/components/Image/Image.d.ts +8 -1
  120. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  121. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  122. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/Input/Input.d.ts +88 -13
  124. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  125. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  126. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  128. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  129. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  130. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  131. package/dist/types/src/components/Input/constants.d.ts +2 -0
  132. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  133. package/dist/types/src/components/Input/index.d.ts +2 -0
  134. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  135. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  136. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  138. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  139. package/dist/types/src/components/List/List.d.ts +2 -2
  140. package/dist/types/src/components/List/List.d.ts.map +1 -1
  141. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  142. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  144. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  146. package/dist/types/src/components/List/Tree.d.ts +2 -2
  147. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  148. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  150. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  151. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  154. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  155. package/dist/types/src/components/Main/Main.d.ts +9 -5
  156. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  157. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  159. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  160. package/dist/types/src/components/Main/constants.d.ts +3 -0
  161. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  162. package/dist/types/src/components/Main/index.d.ts +1 -0
  163. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  165. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  166. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  167. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  168. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  170. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  171. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  172. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  174. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  175. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  177. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  178. package/dist/types/src/components/Message/Message.d.ts +3 -3
  179. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  180. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  181. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  183. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  184. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  185. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  186. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  187. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  188. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  189. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  190. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  191. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  192. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  193. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  194. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  196. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  197. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  198. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  200. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  202. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  204. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  205. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  206. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  207. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  208. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  209. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  210. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  211. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  212. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  213. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  214. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  215. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  216. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  217. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  218. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  219. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  220. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  221. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  222. package/dist/types/src/components/Status/Status.d.ts +1 -1
  223. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  224. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  225. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  226. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  227. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  228. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  229. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  230. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  231. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  232. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  233. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  235. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  237. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  238. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  239. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  240. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  241. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  242. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  243. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  244. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  245. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  246. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  247. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  248. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  249. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  250. package/dist/types/src/components/index.d.ts +7 -4
  251. package/dist/types/src/components/index.d.ts.map +1 -1
  252. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  253. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  254. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  255. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  256. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  257. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  258. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  260. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  261. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  262. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  263. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  264. package/dist/types/src/index.d.ts +1 -0
  265. package/dist/types/src/index.d.ts.map +1 -1
  266. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  267. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  268. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  269. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  270. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  271. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  272. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  273. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  274. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  275. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  276. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  277. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  278. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  279. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  281. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  282. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  283. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  285. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  286. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  287. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  288. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  289. package/dist/types/src/primitives/index.d.ts +3 -2
  290. package/dist/types/src/primitives/index.d.ts.map +1 -1
  291. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  292. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  293. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  294. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  295. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  296. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  297. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  298. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  299. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  300. package/dist/types/src/theme/index.d.ts +31 -0
  301. package/dist/types/src/theme/index.d.ts.map +1 -0
  302. package/dist/types/src/translations.d.ts +17 -3
  303. package/dist/types/src/translations.d.ts.map +1 -1
  304. package/dist/types/src/util/index.d.ts +2 -1
  305. package/dist/types/src/util/index.d.ts.map +1 -1
  306. package/dist/types/src/util/mobile.d.ts +5 -0
  307. package/dist/types/src/util/mobile.d.ts.map +1 -0
  308. package/dist/types/src/util/slots.d.ts +57 -0
  309. package/dist/types/src/util/slots.d.ts.map +1 -0
  310. package/dist/types/src/util/usePx.d.ts.map +1 -1
  311. package/dist/types/tsconfig.tsbuildinfo +1 -1
  312. package/package.json +29 -25
  313. package/src/components/Avatars/Avatar.theme.ts +93 -0
  314. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  315. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  316. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  317. package/src/components/Button/Button.theme.ts +31 -0
  318. package/src/components/Button/Button.tsx +2 -2
  319. package/src/components/Button/IconButton.stories.tsx +51 -3
  320. package/src/components/Button/IconButton.theme.ts +21 -0
  321. package/src/components/Button/IconButton.tsx +3 -2
  322. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  323. package/src/components/Calendar/Calendar.theme.ts +74 -0
  324. package/src/components/Calendar/Calendar.tsx +196 -0
  325. package/src/components/Calendar/index.ts +5 -0
  326. package/src/components/Card/Card.stories.tsx +43 -22
  327. package/src/components/Card/Card.theme.ts +93 -0
  328. package/src/components/Card/Card.tsx +161 -169
  329. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  330. package/src/components/Carousel/Carousel.tsx +373 -0
  331. package/src/components/Carousel/index.ts +5 -0
  332. package/src/components/Clipboard/CopyButton.tsx +3 -3
  333. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  334. package/src/components/Column/Column.theme.ts +48 -0
  335. package/src/{primitives → components}/Column/Column.tsx +2 -1
  336. package/src/{primitives → components}/Column/index.ts +1 -0
  337. package/src/components/Column/withColumn.ts +27 -0
  338. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  339. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  340. package/src/components/DatePicker/DatePicker.tsx +279 -0
  341. package/src/components/DatePicker/index.ts +5 -0
  342. package/src/components/Dialog/AlertDialog.tsx +12 -16
  343. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  344. package/src/components/Dialog/Dialog.theme.ts +61 -0
  345. package/src/components/Dialog/Dialog.tsx +46 -17
  346. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  347. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  348. package/src/components/Focus/Focus.theme.ts +32 -0
  349. package/src/components/Focus/Focus.tsx +1 -1
  350. package/src/components/Icon/Icon.theme.ts +45 -0
  351. package/src/components/Icon/Icon.tsx +10 -3
  352. package/src/components/Icon/IconBlock.tsx +38 -0
  353. package/src/components/Icon/index.ts +1 -0
  354. package/src/components/Image/Image.stories.tsx +1 -1
  355. package/src/components/Image/Image.tsx +38 -9
  356. package/src/components/Input/Input.stories.tsx +132 -29
  357. package/src/components/Input/Input.theme.ts +191 -0
  358. package/src/components/Input/Input.tsx +208 -2
  359. package/src/components/Input/SegmentedInput.tsx +454 -0
  360. package/src/components/Input/constants.ts +5 -0
  361. package/src/components/Input/index.ts +2 -0
  362. package/src/components/Link/Link.theme.ts +16 -0
  363. package/src/components/Link/Link.tsx +10 -2
  364. package/src/components/List/List.stories.tsx +1 -1
  365. package/src/components/List/List.theme.ts +47 -0
  366. package/src/components/List/List.tsx +3 -3
  367. package/src/components/List/ListDropIndicator.tsx +1 -2
  368. package/src/components/List/Tree.stories.tsx +1 -1
  369. package/src/components/List/TreeDropIndicator.tsx +3 -3
  370. package/src/components/List/Treegrid.theme.ts +35 -0
  371. package/src/components/List/Treegrid.tsx +3 -4
  372. package/src/components/Main/Main.theme.ts +29 -0
  373. package/src/components/Main/Main.tsx +9 -7
  374. package/src/components/Main/constants.ts +6 -0
  375. package/src/components/Main/index.ts +1 -0
  376. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  377. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  378. package/src/components/MediaPlayer/index.ts +5 -0
  379. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  380. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  381. package/src/components/Menu/DropdownMenu.tsx +15 -15
  382. package/src/components/Menu/Menu.theme.ts +48 -0
  383. package/src/components/Message/Message.stories.tsx +43 -5
  384. package/src/components/Message/Message.theme.ts +44 -0
  385. package/src/components/Message/Message.tsx +76 -16
  386. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  387. package/src/components/Panel/Panel.theme.ts +41 -0
  388. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  389. package/src/components/Popover/Popover.theme.ts +40 -0
  390. package/src/components/Popover/Popover.tsx +7 -7
  391. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  392. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  393. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  394. package/src/components/ScrollArea/index.ts +1 -0
  395. package/src/components/ScrollArea/scrollbar.ts +21 -0
  396. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  397. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  398. package/src/components/Select/Select.theme.ts +55 -0
  399. package/src/components/Select/Select.tsx +26 -10
  400. package/src/components/Separator/Separator.theme.ts +23 -0
  401. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  402. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  403. package/src/components/Splitter/Splitter.theme.ts +18 -0
  404. package/src/components/Splitter/Splitter.tsx +10 -15
  405. package/src/components/Status/Status.theme.ts +31 -0
  406. package/src/components/Status/Status.tsx +1 -2
  407. package/src/components/Tag/Tag.theme.ts +22 -0
  408. package/src/components/Toast/Toast.stories.tsx +41 -20
  409. package/src/components/Toast/Toast.theme.ts +56 -0
  410. package/src/components/Toast/Toast.tsx +95 -27
  411. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  412. package/src/components/Toolbar/Toolbar.tsx +67 -15
  413. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  414. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  415. package/src/components/Tooltip/Tooltip.tsx +18 -17
  416. package/src/components/Tooltip/index.ts +1 -0
  417. package/src/components/Tooltip/tooltipContent.ts +16 -0
  418. package/src/components/index.ts +7 -5
  419. package/src/exemplars/generics.stories.tsx +1 -2
  420. package/src/exemplars/slot.stories.tsx +5 -6
  421. package/src/exemplars/virtualizer.stories.tsx +0 -1
  422. package/src/hooks/useDensityContext.ts +1 -1
  423. package/src/hooks/useElevationContext.ts +1 -1
  424. package/src/hooks/useThemeContext.ts +1 -1
  425. package/src/hooks/useTranslationsContext.ts +1 -1
  426. package/src/index.ts +1 -0
  427. package/src/playground/Custom.stories.tsx +12 -32
  428. package/src/primitives/Container/Container.tsx +3 -1
  429. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  430. package/src/primitives/Flex/Flex.tsx +3 -1
  431. package/src/primitives/Grid/Grid.tsx +3 -1
  432. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  433. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  434. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  435. package/src/primitives/index.ts +4 -2
  436. package/src/testing/decorators/withLayout.tsx +7 -17
  437. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  438. package/src/testing/decorators/withTheme.tsx +21 -13
  439. package/src/theme/bindTheme.ts +13 -0
  440. package/src/theme/defaultTheme.ts +83 -0
  441. package/src/theme/index.ts +37 -0
  442. package/src/translations.ts +14 -0
  443. package/src/util/index.ts +2 -1
  444. package/src/util/mobile.ts +11 -0
  445. package/src/util/slots.ts +129 -0
  446. package/src/util/usePx.ts +4 -1
  447. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  448. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  449. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  450. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  451. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  452. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  453. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  454. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  455. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  456. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  457. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  458. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  459. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  460. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  461. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  462. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  463. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  464. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  465. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  466. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  467. package/src/util/hasIosKeyboard.ts +0 -8
  468. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  469. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  470. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  471. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  472. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  473. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  474. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  475. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  476. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  477. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  478. /package/src/{primitives → components}/Panel/index.ts +0 -0
  479. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  480. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  481. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  482. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -56,7 +56,7 @@ export const ErrorStack = ({ error, frames: framesProp }: ErrorStackProps) => {
56
56
  const local = frame.fileName
57
57
  ? parseLocalFrame(frame.fileName, frame.lineNumber, frame.columnNumber)
58
58
  : undefined;
59
- const name = frame.functionName ?? '<anonymous>';
59
+ const functionName = frame.functionName ?? '<anonymous>';
60
60
  return (
61
61
  <div
62
62
  key={i}
@@ -75,14 +75,15 @@ export const ErrorStack = ({ error, frames: framesProp }: ErrorStackProps) => {
75
75
  />
76
76
  <div className='absolute top-1/2 -translate-y-1/2 left-1/2 right-0 h-px bg-neutral-500' />
77
77
  </div>
78
+
78
79
  {local ? (
79
80
  <a href={local.href} className='truncate self-center'>
80
- {name}
81
+ {functionName}
81
82
  </a>
82
83
  ) : (
83
- <span className='text-subdued truncate self-center'>{name}</span>
84
+ <span className='text-subdued truncate self-center'>{functionName}</span>
84
85
  )}
85
- <span className='text-xs text-subdued truncate self-center'>{local?.fileName ?? ''}</span>
86
+ <span className='text-xs text-subdued truncate self-center truncate'>{local?.fileName ?? ''}</span>
86
87
  <span className='text-xs text-subdued text-right self-center'>
87
88
  {local ? `${frame.lineNumber}:${frame.columnNumber}` : ''}
88
89
  </span>
@@ -103,10 +104,15 @@ const parseLocalFrame = (fileUrl: string, line?: number, col?: number): LocalFra
103
104
  if (!pathname.startsWith('/@fs/')) {
104
105
  return undefined;
105
106
  }
106
- const localPath = pathname.slice(4); // /@fs/Users/... → /Users/...
107
+
108
+ const FILE_PREFIX = '/@fs';
109
+ const localPath = pathname.slice(FILE_PREFIX.length); // /@fs/Users/... → /Users/...
110
+ const PKG_PREFIX = '/packages/';
111
+ const i = localPath.indexOf(PKG_PREFIX);
112
+ const path = i === -1 ? localPath : localPath.substring(i + PKG_PREFIX.length);
107
113
  return {
108
114
  href: `vscode://file/${localPath}:${line ?? 1}:${col ?? 1}`,
109
- fileName: pathname.split('/').pop() ?? localPath,
115
+ fileName: path,
110
116
  };
111
117
  } catch {
112
118
  return undefined;
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { mx } from '@dxos/ui-theme';
6
+ import { type ComponentFunction, type Theme } from '@dxos/ui-types';
7
+
8
+ export type FocusStyleProps = {
9
+ border?: boolean;
10
+ };
11
+
12
+ /**
13
+ * Focus ring styles shared by Focus.Group and Focus.Item.
14
+ * Uses a `::after` pseudo-element overlay so the ring paints above child content
15
+ * (inset box-shadow alone is obscured by children with backgrounds).
16
+ * The pseudo-element is `pointer-events-none` and absolutely positioned over the element.
17
+ * When `border` is true, a subdued CSS border is always visible (e.g., for grid cell edges).
18
+ */
19
+ const ring: ComponentFunction<FocusStyleProps> = ({ border }, ...etc) =>
20
+ mx(
21
+ 'dx-ring-pseudo outline-hidden',
22
+ 'focus:after:ring-focus-ring-subtle',
23
+ 'data-[focus-state=active]:after:ring-focus-ring-subtle',
24
+ 'data-[focus-state=error]:after:ring-rose-500',
25
+ border && 'border border-separator',
26
+ ...etc,
27
+ );
28
+
29
+ export const focusTheme: Theme<FocusStyleProps> = {
30
+ group: ring,
31
+ item: ring,
32
+ };
@@ -21,10 +21,10 @@ import React, {
21
21
  useState,
22
22
  } from 'react';
23
23
 
24
- import { composableProps, slottable } from '@dxos/ui-theme';
25
24
  import { type Axis } from '@dxos/ui-types';
26
25
 
27
26
  import { useThemeContext } from '../../hooks';
27
+ import { composableProps, slottable } from '../../util';
28
28
 
29
29
  //
30
30
  // Context
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { getSize, mx } from '@dxos/ui-theme';
6
+ import { type ComponentFunction, type Size, type Theme } from '@dxos/ui-types';
7
+
8
+ export type IconStyleProps = {
9
+ size?: Size;
10
+ };
11
+
12
+ export type IconBlockStyleProps = {
13
+ compact?: boolean;
14
+ /** Constrain to a square (1:1) slot rather than the default rail-item width. */
15
+ square?: boolean;
16
+ };
17
+
18
+ /**
19
+ * Size can be specified directly, or inherited from a container (e.g., toolbar).
20
+ */
21
+ const root: ComponentFunction<IconStyleProps> = ({ size }, etc) => {
22
+ return mx(
23
+ 'shrink-0 text-[var(--icons-color,currentColor)]',
24
+ size
25
+ ? getSize(size)
26
+ : '[width:var(--icon-size,var(--dx-default-icons-size))] [height:var(--icon-size,var(--dx-default-icons-size))]',
27
+ etc,
28
+ );
29
+ };
30
+
31
+ /**
32
+ * Static slot sized to `--dx-rail-item` so a wrapped `Icon` lines up with an `IconButton iconOnly`.
33
+ */
34
+ const block: ComponentFunction<IconBlockStyleProps> = ({ compact, square }, ...etc) =>
35
+ mx(
36
+ 'grid place-items-center [&>img]:max-w-[1.5rem]',
37
+ square ? 'aspect-square' : 'w-[var(--dx-rail-item)]',
38
+ compact ? '' : 'h-[var(--dx-rail-item)]',
39
+ ...etc,
40
+ );
41
+
42
+ export const iconTheme: Theme<IconStyleProps & IconBlockStyleProps> = {
43
+ root,
44
+ block,
45
+ };
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Primitive } from '@radix-ui/react-primitive';
6
- import React, { type ComponentPropsWithRef, forwardRef, memo } from 'react';
6
+ import React, { type ComponentPropsWithRef, forwardRef, memo, useMemo } from 'react';
7
7
 
8
8
  import { type Size } from '@dxos/ui-types';
9
9
 
@@ -13,18 +13,25 @@ import { type ThemedClassName } from '../../util';
13
13
  export type IconProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.svg>> & {
14
14
  icon: string;
15
15
  size?: Size;
16
+ synchronized?: boolean;
16
17
  };
17
18
 
18
19
  /**
19
20
  * The Icon's size can be set directly or inherited from the `--dx-icon-size` CSS variable.
20
21
  */
21
22
  export const Icon = memo(
22
- forwardRef<SVGSVGElement, IconProps>(({ icon, classNames, size, ...props }, forwardedRef) => {
23
+ forwardRef<SVGSVGElement, IconProps>(({ classNames, icon, size, synchronized, style, ...props }, forwardedRef) => {
23
24
  const { tx } = useThemeContext();
25
+ const spinDelay = useMemo(() => (synchronized ? `${-(Date.now() % 1_000)}ms` : undefined), [synchronized]);
24
26
  const href = useIconHref(icon);
25
27
 
26
28
  return (
27
- <svg {...props} className={tx('icon.root', { size }, classNames)} ref={forwardedRef}>
29
+ <svg
30
+ {...props}
31
+ style={{ ...style, animationDelay: spinDelay }}
32
+ className={tx('icon.root', { size }, classNames)}
33
+ ref={forwardedRef}
34
+ >
28
35
  <use href={href} />
29
36
  </svg>
30
37
  );
@@ -0,0 +1,38 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type ComponentPropsWithRef, type PropsWithChildren, forwardRef } from 'react';
6
+
7
+ import { useThemeContext } from '../../hooks';
8
+ import { type ThemedClassName } from '../../util';
9
+ import { IconBlockStyleProps } from './Icon.theme';
10
+
11
+ export type IconBlockProps = ThemedClassName<ComponentPropsWithRef<'div'> & PropsWithChildren<IconBlockStyleProps>>;
12
+
13
+ /**
14
+ * Static layout slot sized to `--dx-rail-item` (the same square that an `IconButton iconOnly`
15
+ * occupies). Use whenever a decorative `<Icon>` needs to share a row, column, or grid track with
16
+ * interactive `IconButton`s without drifting by a pixel.
17
+ *
18
+ * Defaults `aria-hidden='true'` — the slot wraps decorative chrome by default. Pass
19
+ * `aria-hidden={false}` when the slot's contents convey meaning that isn't already labelled
20
+ * elsewhere in the row.
21
+ */
22
+ export const IconBlock = forwardRef<HTMLDivElement, IconBlockProps>(
23
+ ({ classNames, children, compact, square, ...props }, forwardedRef) => {
24
+ const { tx } = useThemeContext();
25
+ return (
26
+ <div
27
+ aria-hidden='true'
28
+ {...props}
29
+ className={tx('icon.block', { compact, square }, classNames)}
30
+ ref={forwardedRef}
31
+ >
32
+ {children}
33
+ </div>
34
+ );
35
+ },
36
+ );
37
+
38
+ IconBlock.displayName = 'IconBlock';
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './Icon';
6
+ export * from './IconBlock';
@@ -15,7 +15,7 @@ const seed = Math.random();
15
15
  random.seed(seed);
16
16
 
17
17
  const meta = {
18
- title: 'ui/react-ui-mosaic/Image',
18
+ title: 'ui/react-ui-core/components/Image',
19
19
  component: Image,
20
20
  render: (args) => (
21
21
  <div className='absolute inset-0 flex justify-center items-center'>
@@ -13,16 +13,23 @@ export type ImageProps = ThemedClassName<
13
13
  {
14
14
  src: string;
15
15
  alt?: string;
16
+ fit?: 'contain' | 'cover';
17
+ /**
18
+ * Image CORS mode (sets the `<img crossorigin>` attribute). Omitted by default: cross-origin
19
+ * images load without a CORS request (no console errors), but the dominant-color sampler can't
20
+ * read their pixels off the canvas (the browser taints it). Opt in with `'anonymous'` when the
21
+ * image host sends CORS headers and you want the dominant-color gradient.
22
+ */
16
23
  crossOrigin?: 'anonymous' | 'use-credentials' | '';
17
24
  } & ColorOptions
18
25
  >;
19
26
 
20
- // TODO(burdon): Option for neutral background color.
21
27
  export const Image = ({
22
28
  classNames,
23
29
  src,
24
30
  alt = '',
25
- crossOrigin = 'anonymous',
31
+ fit = 'contain',
32
+ crossOrigin,
26
33
  sampleSize = 64,
27
34
  contrast = 0.9,
28
35
  }: ImageProps) => {
@@ -68,7 +75,16 @@ export const Image = ({
68
75
 
69
76
  return (
70
77
  <div
71
- className={mx(`relative flex w-full justify-center overflow-hidden transition-all duration-700`, classNames)}
78
+ // `isolate` (`isolation: isolate`) creates a new stacking context so
79
+ // the inner <img>'s `z-10` stays scoped to this wrapper. Without it
80
+ // the z-10 leaks into the parent's stacking context and elevates the
81
+ // image above any pseudo-element rings (e.g. Focus.Item's
82
+ // `dx-ring-pseudo` `::after`) painted on ancestors — most visibly,
83
+ // the focus ring on a Card containing a Card.Poster.
84
+ className={mx(
85
+ `relative flex w-full justify-center overflow-hidden transition-all duration-700 isolate`,
86
+ classNames,
87
+ )}
72
88
  style={{
73
89
  backgroundColor: dominantColor,
74
90
  }}
@@ -94,7 +110,10 @@ export const Image = ({
94
110
  crossOrigin={crossOriginState}
95
111
  onError={handleImageError}
96
112
  onLoad={handleImageLoad}
97
- className='z-10 object-contain transition-opacity duration-500'
113
+ className={mx(
114
+ 'z-10 transition-opacity duration-500',
115
+ fit === 'cover' ? 'w-full h-full object-cover' : 'object-contain',
116
+ )}
98
117
  style={{
99
118
  opacity: imageLoaded ? 1 : 0,
100
119
  }}
@@ -162,7 +181,9 @@ const extractDominantColor = (
162
181
  const alpha = pixels[i + 3];
163
182
 
164
183
  // Skip transparent pixels.
165
- if (alpha === 0) continue;
184
+ if (alpha === 0) {
185
+ continue;
186
+ }
166
187
 
167
188
  // Calculate saturation to weight vibrant colors more.
168
189
  const max = Math.max(red, green, blue);
@@ -202,21 +223,29 @@ const isTransparent = (pixels: Uint8ClampedArray, sampleSize: number, threshold:
202
223
  for (let x = 0; x < sampleSize; x++) {
203
224
  // Top edge.
204
225
  const topIndex = x * 4;
205
- if (pixels[topIndex + 3] === 0) edgeTransparentPixels++;
226
+ if (pixels[topIndex + 3] === 0) {
227
+ edgeTransparentPixels++;
228
+ }
206
229
 
207
230
  // Bottom edge.
208
231
  const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
209
- if (pixels[bottomIndex + 3] === 0) edgeTransparentPixels++;
232
+ if (pixels[bottomIndex + 3] === 0) {
233
+ edgeTransparentPixels++;
234
+ }
210
235
  }
211
236
 
212
237
  for (let y = 1; y < sampleSize - 1; y++) {
213
238
  // Left edge.
214
239
  const leftIndex = y * sampleSize * 4;
215
- if (pixels[leftIndex + 3] === 0) edgeTransparentPixels++;
240
+ if (pixels[leftIndex + 3] === 0) {
241
+ edgeTransparentPixels++;
242
+ }
216
243
 
217
244
  // Right edge.
218
245
  const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
219
- if (pixels[rightIndex + 3] === 0) edgeTransparentPixels++;
246
+ if (pixels[rightIndex + 3] === 0) {
247
+ edgeTransparentPixels++;
248
+ }
220
249
  }
221
250
 
222
251
  return edgeTransparentPixels / edgePixels > threshold;
@@ -10,17 +10,23 @@ import { type MessageValence } from '@dxos/ui-types';
10
10
  import { withLayoutVariants, withTheme } from '../../testing';
11
11
  import {
12
12
  type CheckboxProps,
13
+ type DateInputProps,
14
+ type DateTimeInputProps,
13
15
  Input,
14
16
  type PinInputProps,
15
17
  type SwitchProps,
16
18
  type TextAreaProps,
17
19
  type TextInputProps,
20
+ type TimeProps,
18
21
  } from './Input';
19
22
 
20
23
  type VariantMap = {
21
24
  text: TextInputProps;
22
25
  pin: PinInputProps;
23
26
  textarea: TextAreaProps;
27
+ time: TimeProps;
28
+ date: DateInputProps;
29
+ datetime: DateTimeInputProps;
24
30
  checkbox: CheckboxProps;
25
31
  switch: SwitchProps;
26
32
  };
@@ -54,6 +60,9 @@ const DefaultStory = ({
54
60
  {kind === 'text' && <Input.TextInput {...props} />}
55
61
  {kind === 'pin' && <Input.PinInput {...props} />}
56
62
  {kind === 'textarea' && <Input.TextArea {...props} />}
63
+ {kind === 'time' && <Input.Time {...props} />}
64
+ {kind === 'date' && <Input.Date {...props} />}
65
+ {kind === 'datetime' && <Input.DateTime {...props} />}
57
66
  {kind === 'checkbox' && <Input.Checkbox {...props} />}
58
67
  {kind === 'switch' && <Input.Switch {...props} />}
59
68
 
@@ -76,34 +85,17 @@ export default meta;
76
85
 
77
86
  type Story = StoryObj<DefaultStoryProps & Variant>;
78
87
 
79
- export const DensityCoarse: Story = {
80
- args: {
81
- kind: 'text',
82
- label: 'Input value',
83
- placeholder: 'This is an input',
84
- disabled: false,
85
- description: undefined,
86
- labelVisuallyHidden: false,
87
- descriptionVisuallyHidden: false,
88
- validationMessage: '',
89
- validationValence: undefined,
90
- density: 'coarse',
91
- },
92
- };
93
-
94
- export const DensityFine: Story = {
95
- args: {
96
- kind: 'text',
97
- label: 'Input value',
98
- placeholder: 'This is a density:fine input',
99
- disabled: false,
100
- description: undefined,
101
- labelVisuallyHidden: false,
102
- descriptionVisuallyHidden: false,
103
- validationMessage: '',
104
- validationValence: undefined,
105
- density: 'fine',
106
- },
88
+ export const Density: Story = {
89
+ render: () => (
90
+ <div className='flex flex-col gap-4'>
91
+ {(['lg', 'md', 'sm', 'xs'] as const).map((density) => (
92
+ <Input.Root key={density}>
93
+ <Input.Label>{`density="${density}"`}</Input.Label>
94
+ <Input.TextInput density={density} placeholder={`This is a density:${density} input`} />
95
+ </Input.Root>
96
+ ))}
97
+ </div>
98
+ ),
107
99
  };
108
100
 
109
101
  export const Subdued: Story = {
@@ -186,10 +178,86 @@ export const PinInput: Story = {
186
178
  length: 6,
187
179
  description: 'Type in secret you received',
188
180
  pattern: '\\d*',
189
- density: 'coarse',
181
+ density: 'lg',
190
182
  },
191
183
  };
192
184
 
185
+ export const Time: Story = {
186
+ args: {
187
+ kind: 'time',
188
+ label: 'Time',
189
+ defaultValue: '09:30',
190
+ },
191
+ };
192
+
193
+ export const TimeUncontrolled: Story = {
194
+ args: {
195
+ kind: 'time',
196
+ label: 'Time (uncontrolled)',
197
+ defaultValue: '14:00',
198
+ },
199
+ };
200
+
201
+ export const TimeAmPm: Story = {
202
+ args: {
203
+ kind: 'time',
204
+ label: 'Time (12-hour, AM/PM)',
205
+ defaultValue: '14:00',
206
+ hourCycle: 12,
207
+ } as any,
208
+ };
209
+
210
+ export const TimeDisabled: Story = {
211
+ args: {
212
+ kind: 'time',
213
+ label: 'Time (disabled)',
214
+ defaultValue: '12:00',
215
+ disabled: true,
216
+ },
217
+ };
218
+
219
+ export const Date: Story = {
220
+ args: {
221
+ kind: 'date',
222
+ label: 'Date',
223
+ defaultValue: '1990-05-12',
224
+ },
225
+ };
226
+
227
+ export const DateTime: Story = {
228
+ args: {
229
+ kind: 'datetime',
230
+ label: 'Date & time',
231
+ defaultValue: '2026-06-01T15:30',
232
+ },
233
+ };
234
+
235
+ export const DateWithPicker: Story = {
236
+ render: () => (
237
+ <Input.Root>
238
+ <Input.Label>Date (with picker)</Input.Label>
239
+ <div className='flex items-center gap-1'>
240
+ <Input.Date defaultValue='2026-06-01' />
241
+ <Input.TriggerIcon />
242
+ </div>
243
+ <Input.Description>Click the calendar icon to open the date picker.</Input.Description>
244
+ </Input.Root>
245
+ ),
246
+ };
247
+
248
+ export const DateTimeWithPicker: Story = {
249
+ render: () => (
250
+ <Input.Root>
251
+ <Input.Label>Date & time (with picker)</Input.Label>
252
+ <div className='flex items-center gap-1'>
253
+ <Input.DateTime defaultValue='2026-06-01T15:30' />
254
+ <Input.TriggerIcon />
255
+ </div>
256
+ <Input.Description>Click the calendar icon to open the date picker.</Input.Description>
257
+ </Input.Root>
258
+ ),
259
+ };
260
+
193
261
  export const Checkbox: Story = {
194
262
  args: {
195
263
  kind: 'checkbox',
@@ -206,3 +274,38 @@ export const Switch: Story = {
206
274
  description: 'On or off',
207
275
  },
208
276
  };
277
+
278
+ /**
279
+ * Native HTML input types. `Input.TextInput` accepts every standard
280
+ * `<input type="…">` value via its `type` prop; this story exercises the most
281
+ * commonly used ones so the rendering across themes/browsers can be
282
+ * inspected at a glance.
283
+ */
284
+ const TEXT_INPUT_TYPES: { type: string; placeholder: string }[] = [
285
+ { type: 'text', placeholder: 'Plain text' },
286
+ { type: 'email', placeholder: 'name@example.com' },
287
+ { type: 'password', placeholder: '••••••••' },
288
+ { type: 'search', placeholder: 'Search…' },
289
+ { type: 'tel', placeholder: '+1 (555) 555-5555' },
290
+ { type: 'url', placeholder: 'https://example.com' },
291
+ { type: 'number', placeholder: '42' },
292
+ { type: 'date', placeholder: '' },
293
+ { type: 'time', placeholder: '' },
294
+ { type: 'datetime-local', placeholder: '' },
295
+ { type: 'month', placeholder: '' },
296
+ { type: 'week', placeholder: '' },
297
+ { type: 'color', placeholder: '' },
298
+ ];
299
+
300
+ export const TextInputTypes: Story = {
301
+ render: () => (
302
+ <div className='flex flex-col gap-3 min-w-[24rem]'>
303
+ {TEXT_INPUT_TYPES.map(({ type, placeholder }) => (
304
+ <Input.Root key={type}>
305
+ <Input.Label>{`type="${type}"`}</Input.Label>
306
+ <Input.TextInput type={type} placeholder={placeholder} />
307
+ </Input.Root>
308
+ ))}
309
+ </div>
310
+ ),
311
+ };