@dxos/react-ui 0.8.4-main.422d1c7879 → 0.8.4-main.43cb759274

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 (478) 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-KVJDKHLF.mjs +1613 -0
  6. package/dist/lib/browser/chunk-KVJDKHLF.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +2661 -1515
  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 +9 -12
  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-5JYHWJDZ.mjs +1615 -0
  15. package/dist/lib/node-esm/chunk-5JYHWJDZ.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-FPVTVXND.mjs +35 -0
  17. package/dist/lib/node-esm/chunk-FPVTVXND.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +2661 -1515
  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 +9 -12
  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 +60 -56
  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 +102 -0
  66. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  67. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  68. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  69. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  70. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  71. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  72. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  73. package/dist/types/src/{primitives → components}/Column/Column.d.ts +4 -4
  74. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  75. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  76. package/dist/types/src/components/Column/Column.theme.d.ts +9 -0
  77. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  78. package/dist/types/src/components/Column/index.d.ts +3 -0
  79. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  80. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  81. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  82. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  83. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  84. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  85. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  86. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  87. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  88. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  89. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  90. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  91. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  92. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  94. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  95. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  97. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  98. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  99. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  101. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  102. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  103. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  104. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  106. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  107. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  108. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  109. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  110. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  112. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  113. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  114. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/index.d.ts +1 -0
  116. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  117. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  118. package/dist/types/src/components/Image/Image.stories.d.ts +2 -2
  119. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Input/Input.d.ts +88 -13
  121. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  122. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  123. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  125. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  126. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  127. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  128. package/dist/types/src/components/Input/constants.d.ts +2 -0
  129. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  130. package/dist/types/src/components/Input/index.d.ts +2 -0
  131. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  132. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  133. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  135. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  136. package/dist/types/src/components/List/List.d.ts +2 -2
  137. package/dist/types/src/components/List/List.d.ts.map +1 -1
  138. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  139. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  141. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  142. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  143. package/dist/types/src/components/List/Tree.d.ts +2 -2
  144. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  145. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  147. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  148. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  149. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  151. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  152. package/dist/types/src/components/Main/Main.d.ts +9 -5
  153. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  154. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  156. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  157. package/dist/types/src/components/Main/constants.d.ts +3 -0
  158. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  159. package/dist/types/src/components/Main/index.d.ts +1 -0
  160. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  161. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  162. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +43 -0
  163. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  164. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  165. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  166. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  167. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  168. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  169. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  171. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  172. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  174. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  175. package/dist/types/src/components/Message/Message.d.ts +3 -3
  176. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  177. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  178. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  179. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  180. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  181. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  182. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  183. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  184. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  185. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  186. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  187. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  188. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  189. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  190. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  191. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  192. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  193. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  194. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  195. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  196. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  197. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  198. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  199. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  200. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  201. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  202. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  203. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  204. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  206. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  207. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  208. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  209. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  210. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  211. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  212. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  213. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  214. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  215. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  216. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  217. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  218. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  219. package/dist/types/src/components/Status/Status.d.ts +1 -1
  220. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  221. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  222. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  223. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  224. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  225. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  226. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  227. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  228. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  229. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  230. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  231. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  232. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  233. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  234. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  235. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  236. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  237. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  238. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  239. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  240. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  241. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  242. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  243. package/dist/types/src/components/Tooltip/index.d.ts +1 -0
  244. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  245. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  246. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  247. package/dist/types/src/components/index.d.ts +7 -4
  248. package/dist/types/src/components/index.d.ts.map +1 -1
  249. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  250. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  251. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  252. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  253. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  254. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  255. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  256. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  257. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  258. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  259. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  260. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  261. package/dist/types/src/index.d.ts +1 -0
  262. package/dist/types/src/index.d.ts.map +1 -1
  263. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  264. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  265. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  266. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  267. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  268. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  269. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  270. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  271. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  272. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  273. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  274. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  275. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  276. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  277. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  278. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  279. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  280. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  281. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  282. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  283. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  284. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  285. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  286. package/dist/types/src/primitives/index.d.ts +3 -2
  287. package/dist/types/src/primitives/index.d.ts.map +1 -1
  288. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  289. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  290. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  291. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  292. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  293. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  294. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  295. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  296. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  297. package/dist/types/src/theme/index.d.ts +31 -0
  298. package/dist/types/src/theme/index.d.ts.map +1 -0
  299. package/dist/types/src/translations.d.ts +17 -3
  300. package/dist/types/src/translations.d.ts.map +1 -1
  301. package/dist/types/src/util/index.d.ts +2 -1
  302. package/dist/types/src/util/index.d.ts.map +1 -1
  303. package/dist/types/src/util/mobile.d.ts +5 -0
  304. package/dist/types/src/util/mobile.d.ts.map +1 -0
  305. package/dist/types/src/util/slots.d.ts +57 -0
  306. package/dist/types/src/util/slots.d.ts.map +1 -0
  307. package/dist/types/src/util/usePx.d.ts.map +1 -1
  308. package/dist/types/tsconfig.tsbuildinfo +1 -1
  309. package/package.json +29 -18
  310. package/src/components/Avatars/Avatar.theme.ts +93 -0
  311. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  312. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  313. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  314. package/src/components/Button/Button.theme.ts +31 -0
  315. package/src/components/Button/Button.tsx +1 -1
  316. package/src/components/Button/IconButton.stories.tsx +51 -3
  317. package/src/components/Button/IconButton.theme.ts +21 -0
  318. package/src/components/Button/IconButton.tsx +3 -2
  319. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  320. package/src/components/Calendar/Calendar.theme.ts +74 -0
  321. package/src/components/Calendar/Calendar.tsx +196 -0
  322. package/src/components/Calendar/index.ts +5 -0
  323. package/src/components/Card/Card.stories.tsx +43 -22
  324. package/src/components/Card/Card.theme.ts +93 -0
  325. package/src/components/Card/Card.tsx +143 -160
  326. package/src/components/Carousel/Carousel.tsx +371 -0
  327. package/src/components/Carousel/index.ts +5 -0
  328. package/src/components/Clipboard/CopyButton.tsx +3 -3
  329. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  330. package/src/components/Column/Column.theme.ts +48 -0
  331. package/src/{primitives → components}/Column/Column.tsx +2 -1
  332. package/src/{primitives → components}/Column/index.ts +1 -0
  333. package/src/components/Column/withColumn.ts +27 -0
  334. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  335. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  336. package/src/components/DatePicker/DatePicker.tsx +279 -0
  337. package/src/components/DatePicker/index.ts +5 -0
  338. package/src/components/Dialog/AlertDialog.tsx +12 -13
  339. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  340. package/src/components/Dialog/Dialog.theme.ts +61 -0
  341. package/src/components/Dialog/Dialog.tsx +46 -17
  342. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  343. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  344. package/src/components/Focus/Focus.theme.ts +32 -0
  345. package/src/components/Focus/Focus.tsx +1 -1
  346. package/src/components/Icon/Icon.theme.ts +45 -0
  347. package/src/components/Icon/Icon.tsx +10 -3
  348. package/src/components/Icon/IconBlock.tsx +38 -0
  349. package/src/components/Icon/index.ts +1 -0
  350. package/src/components/Image/Image.stories.tsx +1 -1
  351. package/src/components/Image/Image.tsx +15 -5
  352. package/src/components/Input/Input.stories.tsx +132 -29
  353. package/src/components/Input/Input.theme.ts +191 -0
  354. package/src/components/Input/Input.tsx +207 -2
  355. package/src/components/Input/SegmentedInput.tsx +454 -0
  356. package/src/components/Input/constants.ts +5 -0
  357. package/src/components/Input/index.ts +2 -0
  358. package/src/components/Link/Link.theme.ts +16 -0
  359. package/src/components/Link/Link.tsx +10 -2
  360. package/src/components/List/List.stories.tsx +1 -1
  361. package/src/components/List/List.theme.ts +47 -0
  362. package/src/components/List/List.tsx +3 -3
  363. package/src/components/List/ListDropIndicator.tsx +1 -2
  364. package/src/components/List/Tree.stories.tsx +1 -1
  365. package/src/components/List/TreeDropIndicator.tsx +3 -3
  366. package/src/components/List/Treegrid.theme.ts +35 -0
  367. package/src/components/List/Treegrid.tsx +3 -4
  368. package/src/components/Main/Main.theme.ts +29 -0
  369. package/src/components/Main/Main.tsx +9 -7
  370. package/src/components/Main/constants.ts +6 -0
  371. package/src/components/Main/index.ts +1 -0
  372. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  373. package/src/components/MediaPlayer/MediaPlayer.tsx +178 -0
  374. package/src/components/MediaPlayer/index.ts +5 -0
  375. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  376. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  377. package/src/components/Menu/DropdownMenu.tsx +15 -15
  378. package/src/components/Menu/Menu.theme.ts +48 -0
  379. package/src/components/Message/Message.stories.tsx +43 -5
  380. package/src/components/Message/Message.theme.ts +44 -0
  381. package/src/components/Message/Message.tsx +76 -16
  382. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  383. package/src/components/Panel/Panel.theme.ts +42 -0
  384. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  385. package/src/components/Popover/Popover.theme.ts +40 -0
  386. package/src/components/Popover/Popover.tsx +7 -7
  387. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  388. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  389. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  390. package/src/components/ScrollArea/index.ts +1 -0
  391. package/src/components/ScrollArea/scrollbar.ts +21 -0
  392. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  393. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  394. package/src/components/Select/Select.theme.ts +55 -0
  395. package/src/components/Select/Select.tsx +26 -10
  396. package/src/components/Separator/Separator.theme.ts +23 -0
  397. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  398. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  399. package/src/components/Splitter/Splitter.theme.ts +18 -0
  400. package/src/components/Splitter/Splitter.tsx +10 -15
  401. package/src/components/Status/Status.theme.ts +31 -0
  402. package/src/components/Status/Status.tsx +1 -2
  403. package/src/components/Tag/Tag.theme.ts +22 -0
  404. package/src/components/Toast/Toast.stories.tsx +41 -20
  405. package/src/components/Toast/Toast.theme.ts +56 -0
  406. package/src/components/Toast/Toast.tsx +95 -27
  407. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  408. package/src/components/Toolbar/Toolbar.tsx +67 -15
  409. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  410. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  411. package/src/components/Tooltip/Tooltip.tsx +18 -17
  412. package/src/components/Tooltip/index.ts +1 -0
  413. package/src/components/Tooltip/tooltipContent.ts +16 -0
  414. package/src/components/index.ts +7 -5
  415. package/src/exemplars/generics.stories.tsx +1 -2
  416. package/src/exemplars/slot.stories.tsx +4 -5
  417. package/src/exemplars/virtualizer.stories.tsx +0 -1
  418. package/src/hooks/useDensityContext.ts +1 -1
  419. package/src/hooks/useElevationContext.ts +1 -1
  420. package/src/hooks/useThemeContext.ts +1 -1
  421. package/src/hooks/useTranslationsContext.ts +1 -1
  422. package/src/index.ts +1 -0
  423. package/src/playground/Custom.stories.tsx +12 -32
  424. package/src/primitives/Container/Container.tsx +3 -1
  425. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  426. package/src/primitives/Flex/Flex.tsx +3 -1
  427. package/src/primitives/Grid/Grid.tsx +3 -1
  428. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  429. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  430. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  431. package/src/primitives/index.ts +4 -2
  432. package/src/testing/decorators/withLayout.tsx +6 -16
  433. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  434. package/src/testing/decorators/withTheme.tsx +21 -13
  435. package/src/theme/bindTheme.ts +13 -0
  436. package/src/theme/defaultTheme.ts +83 -0
  437. package/src/theme/index.ts +37 -0
  438. package/src/translations.ts +14 -0
  439. package/src/util/index.ts +2 -1
  440. package/src/util/mobile.ts +11 -0
  441. package/src/util/slots.ts +129 -0
  442. package/src/util/usePx.ts +4 -1
  443. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  444. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  445. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  446. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  447. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  448. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  449. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  450. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  451. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  452. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  453. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  454. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  455. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  456. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  457. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  458. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  459. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  460. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  461. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  462. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  463. package/src/util/hasIosKeyboard.ts +0 -8
  464. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  465. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  466. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  467. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  468. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  469. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  470. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  471. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  472. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  473. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  474. /package/src/{primitives → components}/Panel/index.ts +0 -0
  475. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  476. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  477. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  478. /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',
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'>
@@ -175,7 +175,9 @@ const extractDominantColor = (
175
175
  const alpha = pixels[i + 3];
176
176
 
177
177
  // Skip transparent pixels.
178
- if (alpha === 0) continue;
178
+ if (alpha === 0) {
179
+ continue;
180
+ }
179
181
 
180
182
  // Calculate saturation to weight vibrant colors more.
181
183
  const max = Math.max(red, green, blue);
@@ -215,21 +217,29 @@ const isTransparent = (pixels: Uint8ClampedArray, sampleSize: number, threshold:
215
217
  for (let x = 0; x < sampleSize; x++) {
216
218
  // Top edge.
217
219
  const topIndex = x * 4;
218
- if (pixels[topIndex + 3] === 0) edgeTransparentPixels++;
220
+ if (pixels[topIndex + 3] === 0) {
221
+ edgeTransparentPixels++;
222
+ }
219
223
 
220
224
  // Bottom edge.
221
225
  const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
222
- if (pixels[bottomIndex + 3] === 0) edgeTransparentPixels++;
226
+ if (pixels[bottomIndex + 3] === 0) {
227
+ edgeTransparentPixels++;
228
+ }
223
229
  }
224
230
 
225
231
  for (let y = 1; y < sampleSize - 1; y++) {
226
232
  // Left edge.
227
233
  const leftIndex = y * sampleSize * 4;
228
- if (pixels[leftIndex + 3] === 0) edgeTransparentPixels++;
234
+ if (pixels[leftIndex + 3] === 0) {
235
+ edgeTransparentPixels++;
236
+ }
229
237
 
230
238
  // Right edge.
231
239
  const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
232
- if (pixels[rightIndex + 3] === 0) edgeTransparentPixels++;
240
+ if (pixels[rightIndex + 3] === 0) {
241
+ edgeTransparentPixels++;
242
+ }
233
243
  }
234
244
 
235
245
  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
+ };
@@ -0,0 +1,191 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { densityDimensions, staticDisabled } from '@dxos/ui-theme';
6
+ import { getSize, getHeight, getWidth, mx, snapSize, sizeValue, textValence } from '@dxos/ui-theme';
7
+ import {
8
+ type ComponentFragment,
9
+ type ComponentFunction,
10
+ type Density,
11
+ type Elevation,
12
+ type MessageValence,
13
+ type Size,
14
+ } from '@dxos/ui-types';
15
+
16
+ import { inputTextLabel } from './constants';
17
+
18
+ export type InputStyleProps = Partial<{
19
+ variant: 'default' | 'subdued' | 'static';
20
+ density: Density;
21
+ disabled: boolean;
22
+ elevation: Elevation;
23
+ focused: boolean;
24
+ validationValence: MessageValence;
25
+ size: Size;
26
+ checked: boolean;
27
+ }>;
28
+
29
+ export type InputMetaStyleProps = Partial<{
30
+ srOnly: boolean;
31
+ validationValence: MessageValence;
32
+ }>;
33
+
34
+ const textInputSurfaceFocus =
35
+ 'transition-colors bg-input-surface focus:bg-focus-surface border border-separator focus:border-separator';
36
+
37
+ const textInputSurfaceHover = 'hover:bg-focus-surface';
38
+
39
+ const booleanInputSurface =
40
+ 'shadow-inner transition-colors bg-un-accent aria-checked:bg-accent-bg aria-[checked=mixed]:bg-accent-bg';
41
+
42
+ const booleanInputSurfaceHover =
43
+ 'hover:bg-un-accent-hover hover:aria-checked:bg-accent-bg-hover hover:aria-[checked=mixed]:bg-accent-bg-hover';
44
+
45
+ // TODO(burdon): Replace with semantic tokens.
46
+ const valence = (valence?: MessageValence) => {
47
+ switch (valence) {
48
+ case 'success':
49
+ return 'shadow-emerald-500/50 dark:shadow-emerald-600/50';
50
+ case 'info':
51
+ return 'shadow-cyan-500/50 dark:shadow-cyan-600/50';
52
+ case 'warning':
53
+ return 'shadow-amber-500/50 dark:shadow-amber-600/50';
54
+ case 'error':
55
+ return 'shadow-rose-500/50 dark:shadow-rose-600/50';
56
+ }
57
+ };
58
+
59
+ const sharedSubduedInputStyles: ComponentFragment<InputStyleProps> = (props) => [
60
+ '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
61
+ 'py-0 w-full bg-transparent text-current placeholder-placeholder',
62
+ 'dx-focus-subdued',
63
+ densityDimensions(props.density),
64
+ props.disabled && staticDisabled,
65
+ ];
66
+
67
+ const sharedDefaultInputStyles: ComponentFragment<InputStyleProps> = (props) => [
68
+ '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
69
+ 'py-0 w-full text-base-fg rounded-xs placeholder-placeholder',
70
+ textInputSurfaceFocus,
71
+ densityDimensions(props.density),
72
+ props.disabled ? staticDisabled : textInputSurfaceHover,
73
+ ];
74
+
75
+ const sharedStaticInputStyles: ComponentFragment<InputStyleProps> = (props) => [
76
+ '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
77
+ 'py-0 w-full text-base-fg rounded-xs placeholder-placeholder',
78
+ textInputSurfaceFocus,
79
+ textInputSurfaceHover,
80
+ props.focused && 'bg-attention-surface',
81
+ valence(props.validationValence),
82
+ props.disabled && staticDisabled,
83
+ props.focused && 'dx-focus-static',
84
+ ];
85
+
86
+ const input: ComponentFunction<InputStyleProps> = (props, ...etc) =>
87
+ props.variant === 'subdued'
88
+ ? mx(...sharedSubduedInputStyles(props), ...etc)
89
+ : props.variant === 'static'
90
+ ? mx(...sharedStaticInputStyles(props), ...etc)
91
+ : mx(
92
+ ...sharedDefaultInputStyles(props),
93
+ !props.disabled && 'dx-focus-ring',
94
+ valence(props.validationValence),
95
+ ...etc,
96
+ );
97
+
98
+ const textArea: ComponentFunction<InputStyleProps> = (props, ...etc) => input(props, ...etc);
99
+
100
+ const checkbox: ComponentFunction<InputStyleProps> = ({ size = 5 }, ...etc) =>
101
+ mx('dx-checkbox dx-focus-ring', getSize(size), ...etc);
102
+
103
+ const checkboxIndicator: ComponentFunction<InputStyleProps> = ({ size = 5, checked }, ...etc) =>
104
+ mx(getSize(snapSize(sizeValue(size) * 0.65, 4)), !checked && 'invisible', ...etc);
105
+
106
+ const switchRoot: ComponentFunction<InputStyleProps> = ({ size = 5, disabled }, ...etc) =>
107
+ mx(
108
+ getHeight(size),
109
+ getWidth(snapSize(sizeValue(size) * 1.75, 9)),
110
+ booleanInputSurface,
111
+ !disabled && booleanInputSurfaceHover,
112
+ // TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
113
+ 'cursor-pointer shrink-0 rounded-full px-1 mx-1 relative',
114
+ 'dx-focus-ring',
115
+ ...etc,
116
+ );
117
+
118
+ const switchThumb: ComponentFunction<InputStyleProps> = ({ size = 5 }, ...etc) =>
119
+ mx(
120
+ getSize(size === 'px' ? 'px' : ((size - 2) as Size)),
121
+ 'block bg-white rounded-full transition-transform duration-100 will-change-transform data-[state=checked]:translate-x-[100%]',
122
+ ...etc,
123
+ );
124
+
125
+ const withSegmentsInput: ComponentFunction<InputStyleProps> = (props, ...etc) =>
126
+ mx(
127
+ 'font-mono selection:bg-transparent mx-auto',
128
+ props.density === 'lg'
129
+ ? 'text-lg'
130
+ : props.density === 'sm'
131
+ ? 'text-sm'
132
+ : props.density === 'xs'
133
+ ? 'text-xs'
134
+ : 'text-base pointer-fine:text-sm',
135
+ props.disabled && 'cursor-not-allowed',
136
+ ...etc,
137
+ );
138
+
139
+ const segment: ComponentFunction<InputStyleProps> = (props, ...etc) =>
140
+ mx(
141
+ 'flex items-center justify-center font-mono',
142
+ props.density === 'lg'
143
+ ? 'size-12 rounded-xs'
144
+ : props.density === 'sm'
145
+ ? 'size-7 rounded-xs'
146
+ : props.density === 'xs'
147
+ ? 'size-6 rounded-xs'
148
+ : 'size-10 pointer-fine:size-8 rounded-xs',
149
+ 'bg-input-surface text-base-fg transition-colors border border-separator',
150
+ 'data-[focused]:bg-attention-surface data-[focused]:border-focus-ring-subtle',
151
+ 'data-[focused]:ring-2 data-[focused]:ring-offset-0 data-[focused]:ring-focus-ring-subtle',
152
+ valence(props.validationValence),
153
+ props.disabled && staticDisabled,
154
+ ...etc,
155
+ );
156
+
157
+ const label: ComponentFunction<InputMetaStyleProps> = (props, ...etc) =>
158
+ mx('block', inputTextLabel, props.srOnly && 'sr-only', ...etc);
159
+
160
+ const description: ComponentFunction<InputMetaStyleProps> = (props, ...etc) =>
161
+ mx('text-description', props.srOnly && 'sr-only', ...etc);
162
+
163
+ const descriptionAndValidation: ComponentFunction<InputMetaStyleProps> = (props, ...etc) =>
164
+ mx('leading-none my-1.5', props.srOnly && 'sr-only', ...etc);
165
+
166
+ const validation: ComponentFunction<InputMetaStyleProps> = (props, ...etc) =>
167
+ mx(inputTextLabel, props.srOnly ? 'sr-only' : textValence(props.validationValence), ...etc);
168
+
169
+ const triggerIcon: ComponentFunction<{}> = (_p, ...etc) =>
170
+ mx(
171
+ 'shrink-0 inline-flex items-center justify-center size-7 rounded-xs',
172
+ 'bg-input-surface text-subdued hover:text-base-fg hover:bg-hover-surface',
173
+ 'dx-focus-ring',
174
+ ...etc,
175
+ );
176
+
177
+ export const inputTheme = {
178
+ input,
179
+ textArea,
180
+ inputWithSegments: withSegmentsInput,
181
+ segment,
182
+ checkbox,
183
+ checkboxIndicator,
184
+ label,
185
+ description,
186
+ switch: switchRoot,
187
+ switchThumb,
188
+ validation,
189
+ descriptionAndValidation,
190
+ triggerIcon,
191
+ };