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

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 (496) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-F3PLXTDA.mjs +1608 -0
  4. package/dist/lib/browser/chunk-F3PLXTDA.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-HFJYTGHU.mjs +43 -0
  6. package/dist/lib/browser/chunk-HFJYTGHU.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3785 -2451
  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 +14 -17
  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-LLVUYLAM.mjs +1610 -0
  15. package/dist/lib/node-esm/chunk-LLVUYLAM.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs +45 -0
  17. package/dist/lib/node-esm/chunk-OJYUPUCY.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +3785 -2451
  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 +14 -17
  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 +3 -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 -1
  42. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  43. package/dist/types/src/components/Button/IconButton.stories.d.ts +35 -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/SystemIconButton.d.ts +20 -0
  48. package/dist/types/src/components/Button/SystemIconButton.d.ts.map +1 -0
  49. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  51. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  52. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/Button/ToggleIconButton.d.ts +15 -0
  54. package/dist/types/src/components/Button/ToggleIconButton.d.ts.map +1 -0
  55. package/dist/types/src/components/Button/index.d.ts +2 -0
  56. package/dist/types/src/components/Button/index.d.ts.map +1 -1
  57. package/dist/types/src/components/Calendar/Calendar.d.ts +33 -0
  58. package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -0
  59. package/dist/types/src/components/Calendar/Calendar.stories.d.ts +9 -0
  60. package/dist/types/src/components/Calendar/Calendar.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Calendar/Calendar.theme.d.ts +4 -0
  62. package/dist/types/src/components/Calendar/Calendar.theme.d.ts.map +1 -0
  63. package/dist/types/src/components/Calendar/index.d.ts +2 -0
  64. package/dist/types/src/components/Calendar/index.d.ts.map +1 -0
  65. package/dist/types/src/components/Card/Card.d.ts +67 -55
  66. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  67. package/dist/types/src/components/Card/Card.stories.d.ts +2 -1
  68. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  69. package/dist/types/src/components/Card/Card.theme.d.ts +12 -0
  70. package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -0
  71. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  72. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  73. package/dist/types/src/components/Carousel/Carousel.stories.d.ts +14 -0
  74. package/dist/types/src/components/Carousel/Carousel.stories.d.ts.map +1 -0
  75. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  76. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  77. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  78. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  79. package/dist/types/src/components/Clipboard/index.d.ts +2 -1
  80. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  81. package/dist/types/src/components/Column/Column.d.ts +51 -0
  82. package/dist/types/src/components/Column/Column.d.ts.map +1 -0
  83. package/dist/types/src/components/Column/Column.stories.d.ts.map +1 -0
  84. package/dist/types/src/components/Column/Column.theme.d.ts +17 -0
  85. package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -0
  86. package/dist/types/src/components/Column/index.d.ts +3 -0
  87. package/dist/types/src/components/Column/index.d.ts.map +1 -0
  88. package/dist/types/src/components/Column/withColumn.d.ts +21 -0
  89. package/dist/types/src/components/Column/withColumn.d.ts.map +1 -0
  90. package/dist/types/src/components/DatePicker/DatePicker.d.ts +72 -0
  91. package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -0
  92. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts +10 -0
  93. package/dist/types/src/components/DatePicker/DatePicker.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts +6 -0
  95. package/dist/types/src/components/DatePicker/DatePicker.theme.d.ts.map +1 -0
  96. package/dist/types/src/components/DatePicker/index.d.ts +2 -0
  97. package/dist/types/src/components/DatePicker/index.d.ts.map +1 -0
  98. package/dist/types/src/components/Dialog/AlertDialog.d.ts +20 -20
  99. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  100. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Dialog/Dialog.d.ts +21 -19
  102. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/Dialog/Dialog.theme.d.ts +10 -0
  105. package/dist/types/src/components/Dialog/Dialog.theme.d.ts.map +1 -0
  106. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  107. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  109. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  110. package/dist/types/src/components/Focus/Focus.d.ts +2 -2
  111. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
  112. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/Focus/Focus.theme.d.ts +6 -0
  114. package/dist/types/src/components/Focus/Focus.theme.d.ts.map +1 -0
  115. package/dist/types/src/components/Icon/Icon.d.ts +1 -0
  116. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  117. package/dist/types/src/components/Icon/Icon.stories.d.ts +1 -1
  118. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/Icon/Icon.theme.d.ts +11 -0
  120. package/dist/types/src/components/Icon/Icon.theme.d.ts.map +1 -0
  121. package/dist/types/src/components/Icon/IconBlock.d.ts +15 -0
  122. package/dist/types/src/components/Icon/IconBlock.d.ts.map +1 -0
  123. package/dist/types/src/components/Icon/index.d.ts +1 -0
  124. package/dist/types/src/components/Icon/index.d.ts.map +1 -1
  125. package/dist/types/src/components/Image/Image.d.ts +8 -1
  126. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  127. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  128. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/Input/Input.d.ts +88 -13
  130. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  131. package/dist/types/src/components/Input/Input.stories.d.ts +14 -3
  132. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/Input/Input.theme.d.ts +115 -0
  134. package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -0
  135. package/dist/types/src/components/Input/SegmentedInput.d.ts +79 -0
  136. package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -0
  137. package/dist/types/src/components/Input/constants.d.ts +5 -0
  138. package/dist/types/src/components/Input/constants.d.ts.map +1 -0
  139. package/dist/types/src/components/Input/index.d.ts +2 -0
  140. package/dist/types/src/components/Input/index.d.ts.map +1 -1
  141. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  142. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  143. package/dist/types/src/components/Link/Link.theme.d.ts +6 -0
  144. package/dist/types/src/components/Link/Link.theme.d.ts.map +1 -0
  145. package/dist/types/src/components/List/List.d.ts +2 -2
  146. package/dist/types/src/components/List/List.d.ts.map +1 -1
  147. package/dist/types/src/components/List/List.stories.d.ts +1 -1
  148. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  149. package/dist/types/src/components/List/List.theme.d.ts +7 -0
  150. package/dist/types/src/components/List/List.theme.d.ts.map +1 -0
  151. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  152. package/dist/types/src/components/List/Tree.d.ts +2 -2
  153. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  154. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  155. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  156. package/dist/types/src/components/List/Treegrid.d.ts +2 -2
  157. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  158. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/List/Treegrid.theme.d.ts +7 -0
  160. package/dist/types/src/components/List/Treegrid.theme.d.ts.map +1 -0
  161. package/dist/types/src/components/Main/Main.d.ts +9 -5
  162. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  163. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/Main/Main.theme.d.ts +20 -0
  165. package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -0
  166. package/dist/types/src/components/Main/constants.d.ts +3 -0
  167. package/dist/types/src/components/Main/constants.d.ts.map +1 -0
  168. package/dist/types/src/components/Main/index.d.ts +1 -0
  169. package/dist/types/src/components/Main/index.d.ts.map +1 -1
  170. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  171. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +47 -0
  172. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  173. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  174. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  176. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  177. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  178. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  179. package/dist/types/src/components/Menu/DropdownMenu.d.ts +11 -3
  180. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  181. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  182. package/dist/types/src/components/Menu/Menu.theme.d.ts +7 -0
  183. package/dist/types/src/components/Menu/Menu.theme.d.ts.map +1 -0
  184. package/dist/types/src/components/Message/Message.d.ts +3 -3
  185. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  186. package/dist/types/src/components/Message/Message.stories.d.ts +5 -1
  187. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/Message/Message.theme.d.ts +7 -0
  189. package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -0
  190. package/dist/types/src/{primitives → components}/Panel/Panel.d.ts +5 -5
  191. package/dist/types/src/components/Panel/Panel.d.ts.map +1 -0
  192. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -0
  193. package/dist/types/src/components/Panel/Panel.theme.d.ts +13 -0
  194. package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -0
  195. package/dist/types/src/components/Panel/index.d.ts.map +1 -0
  196. package/dist/types/src/components/Popover/Popover.d.ts +10 -2
  197. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  198. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  199. package/dist/types/src/components/Popover/Popover.theme.d.ts +8 -0
  200. package/dist/types/src/components/Popover/Popover.theme.d.ts.map +1 -0
  201. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
  202. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  203. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
  204. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts +17 -0
  206. package/dist/types/src/components/ScrollArea/ScrollArea.theme.d.ts.map +1 -0
  207. package/dist/types/src/components/ScrollArea/index.d.ts +1 -0
  208. package/dist/types/src/components/ScrollArea/index.d.ts.map +1 -1
  209. package/dist/types/src/components/ScrollArea/scrollbar.d.ts +18 -0
  210. package/dist/types/src/components/ScrollArea/scrollbar.d.ts.map +1 -0
  211. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +20 -18
  212. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  213. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  214. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  215. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  216. package/dist/types/src/components/Select/Select.theme.d.ts +6 -0
  217. package/dist/types/src/components/Select/Select.theme.d.ts.map +1 -0
  218. package/dist/types/src/components/Separator/Separator.theme.d.ts +7 -0
  219. package/dist/types/src/components/Separator/Separator.theme.d.ts.map +1 -0
  220. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  221. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts +6 -0
  222. package/dist/types/src/components/Skeleton/Skeleton.theme.d.ts.map +1 -0
  223. package/dist/types/src/components/Splitter/Splitter.d.ts +6 -8
  224. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  225. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  226. package/dist/types/src/components/Splitter/Splitter.theme.d.ts +4 -0
  227. package/dist/types/src/components/Splitter/Splitter.theme.d.ts.map +1 -0
  228. package/dist/types/src/components/Status/Status.d.ts +1 -1
  229. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  230. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  231. package/dist/types/src/components/Status/Status.theme.d.ts +7 -0
  232. package/dist/types/src/components/Status/Status.theme.d.ts.map +1 -0
  233. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  234. package/dist/types/src/components/Tag/Tag.theme.d.ts +6 -0
  235. package/dist/types/src/components/Tag/Tag.theme.d.ts.map +1 -0
  236. package/dist/types/src/components/Toast/Toast.d.ts +12 -9
  237. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  238. package/dist/types/src/components/Toast/Toast.stories.d.ts +5 -2
  239. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  240. package/dist/types/src/components/Toast/Toast.theme.d.ts +4 -0
  241. package/dist/types/src/components/Toast/Toast.theme.d.ts.map +1 -0
  242. package/dist/types/src/components/Toolbar/Toolbar.d.ts +24 -12
  243. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  244. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  245. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts +8 -0
  246. package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -0
  247. package/dist/types/src/components/Tooltip/TextTooltip.d.ts +19 -0
  248. package/dist/types/src/components/Tooltip/TextTooltip.d.ts.map +1 -0
  249. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  250. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  251. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  252. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts +6 -0
  253. package/dist/types/src/components/Tooltip/Tooltip.theme.d.ts.map +1 -0
  254. package/dist/types/src/components/Tooltip/index.d.ts +2 -0
  255. package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
  256. package/dist/types/src/components/Tooltip/tooltipContent.d.ts +4 -0
  257. package/dist/types/src/components/Tooltip/tooltipContent.d.ts.map +1 -0
  258. package/dist/types/src/components/index.d.ts +7 -4
  259. package/dist/types/src/components/index.d.ts.map +1 -1
  260. package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
  261. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  262. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  263. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  264. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  265. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  266. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  267. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  268. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  269. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  270. package/dist/types/src/hooks/useTranslationsContext.d.ts +1 -1
  271. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  272. package/dist/types/src/index.d.ts +1 -0
  273. package/dist/types/src/index.d.ts.map +1 -1
  274. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  275. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  276. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  277. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  278. package/dist/types/src/primitives/Container/Container.d.ts +1 -1
  279. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  280. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  281. package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts.map +1 -1
  282. package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -0
  283. package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  284. package/dist/types/src/primitives/ElevationProvider/index.d.ts.map +1 -0
  285. package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
  286. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  287. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  288. package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
  289. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  290. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  291. package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  292. package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  293. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +128 -0
  294. package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -0
  295. package/dist/types/src/primitives/ThemeProvider/index.d.ts +4 -0
  296. package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -0
  297. package/dist/types/src/primitives/index.d.ts +3 -2
  298. package/dist/types/src/primitives/index.d.ts.map +1 -1
  299. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  300. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  301. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  302. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  303. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  304. package/dist/types/src/theme/bindTheme.d.ts +3 -0
  305. package/dist/types/src/theme/bindTheme.d.ts.map +1 -0
  306. package/dist/types/src/theme/defaultTheme.d.ts +4 -0
  307. package/dist/types/src/theme/defaultTheme.d.ts.map +1 -0
  308. package/dist/types/src/theme/index.d.ts +31 -0
  309. package/dist/types/src/theme/index.d.ts.map +1 -0
  310. package/dist/types/src/translations.d.ts +27 -3
  311. package/dist/types/src/translations.d.ts.map +1 -1
  312. package/dist/types/src/util/index.d.ts +2 -1
  313. package/dist/types/src/util/index.d.ts.map +1 -1
  314. package/dist/types/src/util/mobile.d.ts +5 -0
  315. package/dist/types/src/util/mobile.d.ts.map +1 -0
  316. package/dist/types/src/util/slots.d.ts +57 -0
  317. package/dist/types/src/util/slots.d.ts.map +1 -0
  318. package/dist/types/src/util/usePx.d.ts.map +1 -1
  319. package/dist/types/tsconfig.tsbuildinfo +1 -1
  320. package/package.json +29 -25
  321. package/src/components/Avatars/Avatar.theme.ts +93 -0
  322. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  323. package/src/components/Breadcrumb/Breadcrumb.theme.ts +26 -0
  324. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -2
  325. package/src/components/Button/Button.theme.ts +31 -0
  326. package/src/components/Button/Button.tsx +25 -4
  327. package/src/components/Button/IconButton.stories.tsx +132 -4
  328. package/src/components/Button/IconButton.theme.ts +21 -0
  329. package/src/components/Button/IconButton.tsx +3 -4
  330. package/src/components/Button/SystemIconButton.tsx +153 -0
  331. package/src/components/Button/ToggleIconButton.tsx +32 -0
  332. package/src/components/Button/index.ts +2 -0
  333. package/src/components/Calendar/Calendar.stories.tsx +43 -0
  334. package/src/components/Calendar/Calendar.theme.ts +74 -0
  335. package/src/components/Calendar/Calendar.tsx +196 -0
  336. package/src/components/Calendar/index.ts +5 -0
  337. package/src/components/Card/Card.stories.tsx +109 -46
  338. package/src/components/Card/Card.theme.ts +111 -0
  339. package/src/components/Card/Card.tsx +281 -212
  340. package/src/components/Carousel/Carousel.stories.tsx +47 -0
  341. package/src/components/Carousel/Carousel.tsx +373 -0
  342. package/src/components/Carousel/index.ts +5 -0
  343. package/src/components/Clipboard/CopyButton.tsx +3 -3
  344. package/src/{primitives → components}/Column/Column.stories.tsx +1 -1
  345. package/src/components/Column/Column.theme.ts +76 -0
  346. package/src/{primitives → components}/Column/Column.tsx +38 -2
  347. package/src/{primitives → components}/Column/index.ts +1 -0
  348. package/src/components/Column/withColumn.ts +27 -0
  349. package/src/components/DatePicker/DatePicker.stories.tsx +102 -0
  350. package/src/components/DatePicker/DatePicker.theme.ts +35 -0
  351. package/src/components/DatePicker/DatePicker.tsx +279 -0
  352. package/src/components/DatePicker/index.ts +5 -0
  353. package/src/components/Dialog/AlertDialog.tsx +12 -16
  354. package/src/components/Dialog/Dialog.stories.tsx +2 -2
  355. package/src/components/Dialog/Dialog.theme.ts +61 -0
  356. package/src/components/Dialog/Dialog.tsx +46 -17
  357. package/src/components/ErrorFallback/ErrorFallback.tsx +14 -8
  358. package/src/components/ErrorFallback/ErrorStack.tsx +12 -6
  359. package/src/components/Focus/Focus.theme.ts +32 -0
  360. package/src/components/Focus/Focus.tsx +1 -1
  361. package/src/components/Icon/Icon.theme.ts +45 -0
  362. package/src/components/Icon/Icon.tsx +10 -3
  363. package/src/components/Icon/IconBlock.tsx +38 -0
  364. package/src/components/Icon/index.ts +1 -0
  365. package/src/components/Image/Image.stories.tsx +1 -1
  366. package/src/components/Image/Image.tsx +38 -9
  367. package/src/components/Input/Input.stories.tsx +132 -29
  368. package/src/components/Input/Input.theme.ts +191 -0
  369. package/src/components/Input/Input.tsx +208 -2
  370. package/src/components/Input/SegmentedInput.tsx +454 -0
  371. package/src/components/Input/constants.ts +8 -0
  372. package/src/components/Input/index.ts +2 -0
  373. package/src/components/Link/Link.theme.ts +16 -0
  374. package/src/components/Link/Link.tsx +10 -2
  375. package/src/components/List/List.stories.tsx +1 -1
  376. package/src/components/List/List.theme.ts +47 -0
  377. package/src/components/List/List.tsx +3 -3
  378. package/src/components/List/ListDropIndicator.tsx +1 -2
  379. package/src/components/List/Tree.stories.tsx +1 -1
  380. package/src/components/List/TreeDropIndicator.tsx +3 -3
  381. package/src/components/List/Treegrid.theme.ts +35 -0
  382. package/src/components/List/Treegrid.tsx +3 -4
  383. package/src/components/Main/Main.theme.ts +29 -0
  384. package/src/components/Main/Main.tsx +9 -7
  385. package/src/components/Main/constants.ts +6 -0
  386. package/src/components/Main/index.ts +1 -0
  387. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  388. package/src/components/MediaPlayer/MediaPlayer.tsx +182 -0
  389. package/src/components/MediaPlayer/index.ts +5 -0
  390. package/src/components/Menu/ContextMenu.stories.tsx +0 -3
  391. package/src/components/Menu/DropdownMenu.stories.tsx +0 -3
  392. package/src/components/Menu/DropdownMenu.tsx +15 -15
  393. package/src/components/Menu/Menu.theme.ts +48 -0
  394. package/src/components/Message/Message.stories.tsx +43 -5
  395. package/src/components/Message/Message.theme.ts +34 -0
  396. package/src/components/Message/Message.tsx +76 -16
  397. package/src/{primitives → components}/Panel/Panel.stories.tsx +2 -3
  398. package/src/components/Panel/Panel.theme.ts +41 -0
  399. package/src/{primitives → components}/Panel/Panel.tsx +2 -1
  400. package/src/components/Popover/Popover.theme.ts +40 -0
  401. package/src/components/Popover/Popover.tsx +7 -7
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +2 -6
  403. package/src/components/ScrollArea/ScrollArea.theme.ts +107 -0
  404. package/src/components/ScrollArea/ScrollArea.tsx +3 -2
  405. package/src/components/ScrollArea/index.ts +1 -0
  406. package/src/components/ScrollArea/scrollbar.ts +21 -0
  407. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
  408. package/src/components/ScrollContainer/ScrollContainer.tsx +58 -58
  409. package/src/components/Select/Select.theme.ts +55 -0
  410. package/src/components/Select/Select.tsx +26 -10
  411. package/src/components/Separator/Separator.theme.ts +23 -0
  412. package/src/components/Skeleton/Skeleton.theme.ts +22 -0
  413. package/src/components/Splitter/Splitter.stories.tsx +1 -1
  414. package/src/components/Splitter/Splitter.theme.ts +18 -0
  415. package/src/components/Splitter/Splitter.tsx +10 -15
  416. package/src/components/Status/Status.theme.ts +31 -0
  417. package/src/components/Status/Status.tsx +1 -2
  418. package/src/components/Tag/Tag.theme.ts +22 -0
  419. package/src/components/Toast/Toast.stories.tsx +41 -20
  420. package/src/components/Toast/Toast.theme.ts +50 -0
  421. package/src/components/Toast/Toast.tsx +96 -27
  422. package/src/components/Toolbar/Toolbar.theme.ts +36 -0
  423. package/src/components/Toolbar/Toolbar.tsx +67 -15
  424. package/src/components/Tooltip/TextTooltip.tsx +54 -0
  425. package/src/components/Tooltip/Tooltip.stories.tsx +1 -10
  426. package/src/components/Tooltip/Tooltip.theme.ts +19 -0
  427. package/src/components/Tooltip/Tooltip.tsx +18 -17
  428. package/src/components/Tooltip/index.ts +2 -0
  429. package/src/components/Tooltip/tooltipContent.ts +16 -0
  430. package/src/components/index.ts +7 -5
  431. package/src/exemplars/generics.stories.tsx +1 -2
  432. package/src/exemplars/slot.stories.tsx +5 -6
  433. package/src/exemplars/virtualizer.stories.tsx +0 -1
  434. package/src/hooks/useDensityContext.ts +1 -1
  435. package/src/hooks/useElevationContext.ts +1 -1
  436. package/src/hooks/useThemeContext.ts +1 -1
  437. package/src/hooks/useTranslationsContext.ts +1 -1
  438. package/src/index.ts +1 -0
  439. package/src/playground/Custom.stories.tsx +12 -32
  440. package/src/primitives/Container/Container.tsx +3 -1
  441. package/src/{components → primitives}/DensityProvider/DensityProvider.tsx +1 -1
  442. package/src/primitives/Flex/Flex.tsx +3 -1
  443. package/src/primitives/Grid/Grid.tsx +3 -1
  444. package/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.tsx +1 -1
  445. package/src/{components → primitives}/ThemeProvider/ThemeProvider.tsx +1 -1
  446. package/src/{components → primitives}/ThemeProvider/index.ts +2 -2
  447. package/src/primitives/index.ts +4 -2
  448. package/src/testing/Loading.tsx +2 -1
  449. package/src/testing/decorators/withLayout.tsx +7 -17
  450. package/src/testing/decorators/withLayoutVariants.tsx +1 -1
  451. package/src/testing/decorators/withTheme.tsx +21 -13
  452. package/src/theme/bindTheme.ts +13 -0
  453. package/src/theme/defaultTheme.ts +83 -0
  454. package/src/theme/index.ts +37 -0
  455. package/src/translations.ts +24 -0
  456. package/src/util/index.ts +2 -1
  457. package/src/util/mobile.ts +11 -0
  458. package/src/util/slots.ts +129 -0
  459. package/src/util/usePx.ts +4 -1
  460. package/dist/lib/browser/chunk-OCVRIJCH.mjs +0 -848
  461. package/dist/lib/browser/chunk-OCVRIJCH.mjs.map +0 -7
  462. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs +0 -850
  463. package/dist/lib/node-esm/chunk-QUD5P3RU.mjs.map +0 -7
  464. package/dist/types/src/components/DensityProvider/index.d.ts.map +0 -1
  465. package/dist/types/src/components/ElevationProvider/index.d.ts.map +0 -1
  466. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +0 -1
  467. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +0 -129
  468. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +0 -1
  469. package/dist/types/src/components/ThemeProvider/index.d.ts +0 -4
  470. package/dist/types/src/components/ThemeProvider/index.d.ts.map +0 -1
  471. package/dist/types/src/primitives/Column/Column.d.ts +0 -33
  472. package/dist/types/src/primitives/Column/Column.d.ts.map +0 -1
  473. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +0 -1
  474. package/dist/types/src/primitives/Column/index.d.ts +0 -2
  475. package/dist/types/src/primitives/Column/index.d.ts.map +0 -1
  476. package/dist/types/src/primitives/Panel/Panel.d.ts.map +0 -1
  477. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +0 -1
  478. package/dist/types/src/primitives/Panel/index.d.ts.map +0 -1
  479. package/dist/types/src/util/hasIosKeyboard.d.ts +0 -2
  480. package/dist/types/src/util/hasIosKeyboard.d.ts.map +0 -1
  481. package/src/util/hasIosKeyboard.ts +0 -8
  482. /package/dist/types/src/{primitives → components}/Column/Column.stories.d.ts +0 -0
  483. /package/dist/types/src/{primitives → components}/Panel/Panel.stories.d.ts +0 -0
  484. /package/dist/types/src/{primitives → components}/Panel/index.d.ts +0 -0
  485. /package/dist/types/src/{components → primitives}/DensityProvider/DensityProvider.d.ts +0 -0
  486. /package/dist/types/src/{components → primitives}/DensityProvider/index.d.ts +0 -0
  487. /package/dist/types/src/{components → primitives}/ElevationProvider/ElevationProvider.d.ts +0 -0
  488. /package/dist/types/src/{components → primitives}/ElevationProvider/index.d.ts +0 -0
  489. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.d.ts +0 -0
  490. /package/dist/types/src/{components → primitives}/ThemeProvider/ThemeProvider.stories.d.ts +0 -0
  491. /package/src/{primitives → components}/Column/AUDIT.md +0 -0
  492. /package/src/{primitives → components}/Panel/index.ts +0 -0
  493. /package/src/{components → primitives}/DensityProvider/index.ts +0 -0
  494. /package/src/{components → primitives}/ElevationProvider/ElevationProvider.tsx +0 -0
  495. /package/src/{components → primitives}/ElevationProvider/index.ts +0 -0
  496. /package/src/{components → primitives}/ThemeProvider/TranslationsProvider.tsx +0 -0
@@ -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
+ };
@@ -3,8 +3,18 @@
3
3
  //
4
4
 
5
5
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
6
+ import { createContext } from '@radix-ui/react-context';
6
7
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
7
- import React, { type ComponentPropsWithRef, type ForwardRefExoticComponent, forwardRef } from 'react';
8
+ import React, {
9
+ type ComponentPropsWithRef,
10
+ type ForwardRefExoticComponent,
11
+ forwardRef,
12
+ useCallback,
13
+ useEffect,
14
+ useRef,
15
+ useState,
16
+ } from 'react';
17
+ import { useTranslation } from 'react-i18next';
8
18
 
9
19
  import {
10
20
  DescriptionAndValidation as DescriptionAndValidationPrimitive,
@@ -30,14 +40,130 @@ import {
30
40
  import { mx } from '@dxos/ui-theme';
31
41
  import { type Density, type Elevation, type Size } from '@dxos/ui-types';
32
42
 
43
+ import { translationKey } from '#translations';
44
+
33
45
  import { useDensityContext, useElevationContext, useThemeContext } from '../../hooks';
34
46
  import { type ThemedClassName } from '../../util';
47
+ import { IconButton, IconButtonProps } from '../Button';
35
48
  import { Icon } from '../Icon';
49
+ import {
50
+ SegmentedDate,
51
+ type SegmentedDateProps,
52
+ SegmentedDateTime,
53
+ type SegmentedDateTimeProps,
54
+ SegmentedTime,
55
+ type SegmentedTimeProps,
56
+ } from './SegmentedInput';
36
57
 
37
58
  type InputVariant = 'default' | 'subdued';
38
59
 
39
60
  type InputSharedProps = Partial<{ density: Density; elevation: Elevation; variant: InputVariant }>;
40
61
 
62
+ //
63
+ // Trigger context — lets a sibling `Input.TriggerIcon` open a picker registered by a field inside
64
+ // the same `Input.Root`. Each registered handler is keyed; the most recent registration wins.
65
+ //
66
+
67
+ type InputTriggerHandler = () => void;
68
+
69
+ type InputTriggerContextValue = {
70
+ registerTrigger: (handler: InputTriggerHandler) => () => void;
71
+ trigger: () => void;
72
+ hasTrigger: boolean;
73
+ };
74
+
75
+ // Default context makes the trigger registry a no-op outside `Input.Root` (consumers opt in).
76
+ const [InputTriggerProvider, useInputTriggerContext] = createContext<InputTriggerContextValue>(INPUT_NAME, {
77
+ registerTrigger: () => () => {},
78
+ trigger: () => {},
79
+ hasTrigger: false,
80
+ });
81
+
82
+ /**
83
+ * Field hook. Pass an opener function; while the field is mounted, an `Input.TriggerIcon`
84
+ * sibling will call this opener on press. Returns a no-op when used outside `Input.Root`.
85
+ */
86
+ const useInputTrigger = (handler: InputTriggerHandler | undefined) => {
87
+ const ctx = useInputTriggerContext('useInputTrigger');
88
+ useEffect(() => {
89
+ if (!handler) {
90
+ return;
91
+ }
92
+ return ctx.registerTrigger(handler);
93
+ }, [ctx, handler]);
94
+ };
95
+
96
+ //
97
+ // Root — wraps the @dxos/react-input primitive root with the trigger registry.
98
+ //
99
+
100
+ const Root = (props: InputRootProps) => {
101
+ const handlerRef = useRef<InputTriggerHandler | null>(null);
102
+ const [hasTrigger, setHasTrigger] = useState(false);
103
+
104
+ const registerTrigger = useCallback((handler: InputTriggerHandler) => {
105
+ handlerRef.current = handler;
106
+ setHasTrigger(true);
107
+ return () => {
108
+ if (handlerRef.current === handler) {
109
+ handlerRef.current = null;
110
+ setHasTrigger(false);
111
+ }
112
+ };
113
+ }, []);
114
+
115
+ const trigger = useCallback(() => {
116
+ handlerRef.current?.();
117
+ }, []);
118
+
119
+ return (
120
+ <InputTriggerProvider registerTrigger={registerTrigger} trigger={trigger} hasTrigger={hasTrigger}>
121
+ <InputRoot {...props} />
122
+ </InputTriggerProvider>
123
+ );
124
+ };
125
+
126
+ Root.displayName = 'Input.Root';
127
+
128
+ //
129
+ // TriggerIcon — sibling button that opens the picker of the registered field. Renders nothing
130
+ // when no field in the surrounding `Input.Root` has registered an opener.
131
+ //
132
+
133
+ // `label` and `icon` have defaults below, so both are optional for callers (e.g. `<Input.TriggerIcon />`).
134
+ // `onClick` is reserved — the trigger always opens the registered picker.
135
+ type TriggerIconProps = Omit<IconButtonProps, 'label' | 'onClick'> & { label?: string };
136
+
137
+ const TriggerIcon = forwardRef<HTMLButtonElement, TriggerIconProps>(
138
+ ({ classNames, icon = 'ph--calendar--regular', 'aria-label': ariaLabel, label, ...props }, forwardedRef) => {
139
+ const { t } = useTranslation(translationKey);
140
+ const ctx = useInputTriggerContext('Input.TriggerIcon');
141
+ if (!ctx.hasTrigger) {
142
+ return null;
143
+ }
144
+
145
+ return (
146
+ <IconButton
147
+ ref={forwardedRef}
148
+ variant='ghost'
149
+ icon={icon}
150
+ iconOnly
151
+ classNames={classNames}
152
+ aria-label={ariaLabel}
153
+ label={label ?? ariaLabel ?? t('trigger-button.label')}
154
+ {...props}
155
+ onClick={ctx.trigger}
156
+ />
157
+ );
158
+ },
159
+ );
160
+
161
+ TriggerIcon.displayName = 'Input.TriggerIcon';
162
+
163
+ //
164
+ // Label
165
+ //
166
+
41
167
  type LabelProps = ThemedClassName<LabelPrimitiveProps> & { srOnly?: boolean };
42
168
 
43
169
  const Label = forwardRef<HTMLLabelElement, LabelProps>(({ classNames, children, srOnly, ...props }, forwardedRef) => {
@@ -49,6 +175,12 @@ const Label = forwardRef<HTMLLabelElement, LabelProps>(({ classNames, children,
49
175
  );
50
176
  });
51
177
 
178
+ Label.displayName = 'Input.Label';
179
+
180
+ //
181
+ // Description
182
+ //
183
+
52
184
  type DescriptionProps = ThemedClassName<DescriptionPrimitiveProps> & { srOnly?: boolean };
53
185
 
54
186
  const Description = forwardRef<HTMLSpanElement, DescriptionProps>(
@@ -62,6 +194,12 @@ const Description = forwardRef<HTMLSpanElement, DescriptionProps>(
62
194
  },
63
195
  );
64
196
 
197
+ Description.displayName = 'Input.Description';
198
+
199
+ //
200
+ // Validation
201
+ //
202
+
65
203
  type ValidationProps = ThemedClassName<ValidationPrimitiveProps> & { srOnly?: boolean };
66
204
 
67
205
  const Validation = forwardRef<HTMLSpanElement, InputScopedProps<ValidationProps>>(
@@ -80,6 +218,12 @@ const Validation = forwardRef<HTMLSpanElement, InputScopedProps<ValidationProps>
80
218
  },
81
219
  );
82
220
 
221
+ Validation.displayName = 'Input.Validation';
222
+
223
+ //
224
+ // DescriptionAndValidation
225
+ //
226
+
83
227
  type DescriptionAndValidationProps = ThemedClassName<DescriptionAndValidationPrimitiveProps> & { srOnly?: boolean };
84
228
 
85
229
  const DescriptionAndValidation = forwardRef<HTMLParagraphElement, DescriptionAndValidationProps>(
@@ -97,6 +241,12 @@ const DescriptionAndValidation = forwardRef<HTMLParagraphElement, DescriptionAnd
97
241
  },
98
242
  );
99
243
 
244
+ DescriptionAndValidation.displayName = 'Input.DescriptionAndValidation';
245
+
246
+ //
247
+ // PinInput
248
+ //
249
+
100
250
  type PinInputProps = ThemedClassName<InputSharedProps & Omit<PinInputPrimitiveProps, 'className' | 'segmentClassName'>>;
101
251
 
102
252
  const PinInput = forwardRef<HTMLInputElement, PinInputProps>(
@@ -120,7 +270,12 @@ const PinInput = forwardRef<HTMLInputElement, PinInputProps>(
120
270
  },
121
271
  );
122
272
 
273
+ PinInput.displayName = 'Input.PinInput';
274
+
275
+ //
276
+ // TextInput
123
277
  // TODO(burdon): Implement inline icon within button: e.g., https://www.radix-ui.com/themes/playground#text-field
278
+ //
124
279
 
125
280
  type AutoFillProps = {
126
281
  noAutoFill?: boolean;
@@ -162,6 +317,12 @@ const TextInput = forwardRef<HTMLInputElement, InputScopedProps<TextInputProps>>
162
317
  },
163
318
  );
164
319
 
320
+ TextInput.displayName = 'Input.TextInput';
321
+
322
+ //
323
+ // TextArea
324
+ //
325
+
165
326
  type TextAreaProps = InputSharedProps & ThemedClassName<TextAreaPrimitiveProps>;
166
327
 
167
328
  const TextArea = forwardRef<HTMLTextAreaElement, InputScopedProps<TextAreaProps>>(
@@ -193,6 +354,12 @@ const TextArea = forwardRef<HTMLTextAreaElement, InputScopedProps<TextAreaProps>
193
354
  },
194
355
  );
195
356
 
357
+ TextArea.displayName = 'Input.TextArea';
358
+
359
+ //
360
+ // Checkbox
361
+ //
362
+
196
363
  type CheckboxProps = ThemedClassName<Omit<CheckboxPrimitive.CheckboxProps, 'children'>> & {
197
364
  size?: Size;
198
365
  };
@@ -246,6 +413,12 @@ const Checkbox: ForwardRefExoticComponent<CheckboxProps> = forwardRef<
246
413
  },
247
414
  );
248
415
 
416
+ Checkbox.displayName = 'Input.Checkbox';
417
+
418
+ //
419
+ // Switch
420
+ //
421
+
249
422
  type SwitchProps = ThemedClassName<
250
423
  Omit<ComponentPropsWithRef<'input'>, 'children' | 'onChange'> & { onCheckedChange?: (checked: boolean) => void }
251
424
  >;
@@ -291,11 +464,39 @@ const Switch = forwardRef<HTMLInputElement, InputScopedProps<SwitchProps>>(
291
464
  },
292
465
  );
293
466
 
467
+ Switch.displayName = 'Input.Switch';
468
+
469
+ //
470
+ // Date / Time / DateTime — segmented react-aria-components fields with locale-aware ordering,
471
+ // spinbutton semantics, and immutable separators. ISO string API:
472
+ // - Date `YYYY-MM-DD`
473
+ // - Time `HH:mm`
474
+ // - DateTime `YYYY-MM-DDTHH:mm`
475
+ // Pair `Input.Date` or `Input.DateTime` with a sibling `Input.TriggerIcon` inside an
476
+ // `Input.Root` to expose a calendar popover; `Input.Time` has no picker.
477
+ //
478
+
479
+ const Time = SegmentedTime;
480
+ const Date = SegmentedDate;
481
+ const DateTime = SegmentedDateTime;
482
+
483
+ type TimeProps = SegmentedTimeProps;
484
+ type DateInputProps = SegmentedDateProps;
485
+ type DateTimeInputProps = SegmentedDateTimeProps;
486
+
487
+ //
488
+ // Input
489
+ //
490
+
294
491
  export const Input = {
295
- Root: InputRoot,
492
+ Root,
493
+ TriggerIcon,
296
494
  PinInput,
297
495
  TextInput,
298
496
  TextArea,
497
+ Time,
498
+ Date,
499
+ DateTime,
299
500
  Checkbox,
300
501
  Switch,
301
502
  Label,
@@ -304,6 +505,8 @@ export const Input = {
304
505
  DescriptionAndValidation,
305
506
  };
306
507
 
508
+ export { useInputTrigger };
509
+
307
510
  export type {
308
511
  InputVariant,
309
512
  InputRootProps,
@@ -311,6 +514,9 @@ export type {
311
514
  PinInputProps,
312
515
  TextInputProps,
313
516
  TextAreaProps,
517
+ TimeProps,
518
+ DateInputProps,
519
+ DateTimeInputProps,
314
520
  CheckboxProps,
315
521
  SwitchProps,
316
522
  LabelProps,