@dxos/react-ui 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 (504) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-A5QCIG5R.mjs +24 -0
  4. package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-LY5XDQR5.mjs +846 -0
  6. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +4427 -61
  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 +106 -61
  11. package/dist/lib/browser/testing/index.mjs.map +4 -4
  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-NGKLIKP3.mjs +848 -0
  15. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-XCFLA74M.mjs +26 -0
  17. package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +4427 -61
  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 +106 -61
  22. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  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 +2 -2
  26. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  28. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  30. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  32. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  33. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  34. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +4 -4
  36. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  37. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  38. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +5 -4
  40. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  41. package/dist/types/src/components/Button/IconButton.stories.d.ts +16 -0
  42. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  43. package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +2 -2
  44. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  45. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  46. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  47. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  48. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  49. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  50. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  51. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  52. package/dist/types/src/components/Card/Card.d.ts +124 -0
  53. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  54. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  55. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Card/index.d.ts +2 -0
  57. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  58. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  59. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  60. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  61. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  62. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  63. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  64. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  65. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  66. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  67. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  68. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  69. package/dist/types/src/components/Dialog/AlertDialog.d.ts +51 -0
  70. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  71. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  72. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Dialog/Dialog.d.ts +64 -0
  74. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  75. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +25 -0
  76. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  77. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  78. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  79. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  80. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  81. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  82. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  83. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  84. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +19 -0
  85. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  86. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  87. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  88. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  89. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  90. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  91. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  92. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  93. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/Focus/index.d.ts +2 -0
  95. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  96. package/dist/types/src/components/Icon/Icon.d.ts +6 -2
  97. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  98. package/dist/types/src/components/Icon/Icon.stories.d.ts +25 -0
  99. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  100. package/dist/types/src/components/Image/Image.d.ts +15 -0
  101. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  102. package/dist/types/src/components/Image/Image.stories.d.ts +34 -0
  103. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  104. package/dist/types/src/components/Image/index.d.ts +2 -0
  105. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  106. package/dist/types/src/components/Input/Input.d.ts +19 -24
  107. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  108. package/dist/types/src/components/Input/Input.stories.d.ts +17 -18
  109. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  111. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  112. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  113. package/dist/types/src/components/{Lists → List}/List.d.ts +8 -6
  114. package/dist/types/src/components/List/List.d.ts.map +1 -0
  115. package/dist/types/src/components/List/List.stories.d.ts +16 -0
  116. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  117. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  118. package/dist/types/src/components/{Lists → List}/Tree.d.ts +3 -3
  119. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  120. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  121. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  123. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +6 -10
  124. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -0
  125. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  126. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  127. package/dist/types/src/components/List/index.d.ts.map +1 -0
  128. package/dist/types/src/components/Main/Main.d.ts +25 -31
  129. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  130. package/dist/types/src/components/Main/Main.stories.d.ts +6 -10
  131. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  133. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
  134. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  135. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  136. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  137. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  138. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  139. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  140. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  141. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  142. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  143. package/dist/types/src/components/Menu/DropdownMenu.d.ts +121 -0
  144. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  145. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
  146. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  148. package/dist/types/src/components/Message/Message.d.ts +2 -2
  149. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  150. package/dist/types/src/components/Message/Message.stories.d.ts +12 -22
  151. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  152. package/dist/types/src/components/Popover/Popover.d.ts +41 -24
  153. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  154. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  155. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +27 -27
  157. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  158. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +50 -27
  159. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +68 -0
  161. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  162. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +23 -0
  163. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  164. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  165. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  166. package/dist/types/src/components/Select/Select.d.ts +10 -10
  167. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  168. package/dist/types/src/components/Select/Select.stories.d.ts +6 -11
  169. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  171. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  172. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  173. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  174. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  175. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  176. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  177. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  178. package/dist/types/src/components/Splitter/Splitter.d.ts +34 -0
  179. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  180. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  181. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  182. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  183. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  184. package/dist/types/src/components/Status/Status.d.ts +3 -4
  185. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  186. package/dist/types/src/components/Status/Status.stories.d.ts +6 -10
  187. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  189. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  190. package/dist/types/src/components/Tag/Tag.stories.d.ts +8 -13
  191. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  192. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +4 -4
  193. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  194. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  195. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  196. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +55 -63
  197. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  198. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  199. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  200. package/dist/types/src/components/Toast/Toast.d.ts +20 -20
  201. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  202. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  203. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  204. package/dist/types/src/components/Toolbar/Toolbar.d.ts +41 -23
  205. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  206. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  207. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  208. package/dist/types/src/components/Tooltip/Tooltip.d.ts +16 -18
  209. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  210. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +10 -63
  211. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  212. package/dist/types/src/components/index.d.ts +16 -8
  213. package/dist/types/src/components/index.d.ts.map +1 -1
  214. package/dist/types/src/exemplars/generics.stories.d.ts +19 -0
  215. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  216. package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
  217. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  218. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  219. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  220. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  221. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  222. package/dist/types/src/hooks/index.d.ts +1 -0
  223. package/dist/types/src/hooks/index.d.ts.map +1 -1
  224. package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
  225. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  226. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  227. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  228. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  229. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  230. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  231. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  232. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  233. package/dist/types/src/index.d.ts +2 -1
  234. package/dist/types/src/index.d.ts.map +1 -1
  235. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  236. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  237. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  238. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  239. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  240. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  241. package/dist/types/src/primitives/Column/Column.d.ts +33 -0
  242. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  243. package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
  244. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  245. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  246. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  247. package/dist/types/src/primitives/Container/Container.d.ts +7 -0
  248. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  249. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  250. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  251. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  252. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  253. package/dist/types/src/primitives/Flex/Flex.d.ts +11 -0
  254. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  255. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  256. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  257. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  258. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  259. package/dist/types/src/primitives/Grid/Grid.d.ts +10 -0
  260. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  261. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  262. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  263. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  264. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  265. package/dist/types/src/primitives/Panel/Panel.d.ts +35 -0
  266. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  267. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  268. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  269. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  270. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  271. package/dist/types/src/primitives/index.d.ts +6 -0
  272. package/dist/types/src/primitives/index.d.ts.map +1 -0
  273. package/dist/types/src/testing/Loading.d.ts +9 -0
  274. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  275. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  276. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  277. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  278. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  279. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  280. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  281. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  282. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  283. package/dist/types/src/testing/index.d.ts +1 -0
  284. package/dist/types/src/testing/index.d.ts.map +1 -1
  285. package/dist/types/src/translations.d.ts +16 -0
  286. package/dist/types/src/translations.d.ts.map +1 -0
  287. package/dist/types/src/util/index.d.ts +2 -1
  288. package/dist/types/src/util/index.d.ts.map +1 -1
  289. package/dist/types/src/util/usePx.d.ts +8 -0
  290. package/dist/types/src/util/usePx.d.ts.map +1 -0
  291. package/dist/types/tsconfig.tsbuildinfo +1 -1
  292. package/package.json +55 -40
  293. package/src/components/Avatars/Avatar.stories.tsx +23 -16
  294. package/src/components/Avatars/Avatar.tsx +10 -18
  295. package/src/components/Avatars/AvatarGroup.stories.tsx +11 -8
  296. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +19 -15
  297. package/src/components/Breadcrumb/Breadcrumb.tsx +14 -40
  298. package/src/components/{Buttons → Button}/Button.stories.tsx +11 -13
  299. package/src/components/{Buttons → Button}/Button.tsx +12 -26
  300. package/src/components/{Buttons → Button}/IconButton.stories.tsx +18 -13
  301. package/src/components/{Buttons → Button}/IconButton.tsx +22 -16
  302. package/src/components/Button/Toggle.stories.tsx +36 -0
  303. package/src/components/{Buttons → Button}/Toggle.tsx +4 -4
  304. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +14 -12
  305. package/src/components/Button/ToggleGroup.tsx +50 -0
  306. package/src/components/Card/Card.stories.tsx +151 -0
  307. package/src/components/Card/Card.tsx +514 -0
  308. package/src/components/Card/index.ts +5 -0
  309. package/src/components/Carousel/Carousel.tsx +379 -0
  310. package/src/components/Carousel/index.ts +5 -0
  311. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  312. package/src/components/Clipboard/CopyButton.tsx +11 -11
  313. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  314. package/src/components/Dialog/AlertDialog.stories.tsx +68 -0
  315. package/src/components/Dialog/AlertDialog.tsx +213 -0
  316. package/src/components/Dialog/Dialog.stories.tsx +177 -0
  317. package/src/components/Dialog/Dialog.tsx +285 -0
  318. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  319. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
  320. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  321. package/src/components/ErrorFallback/ErrorStack.tsx +114 -0
  322. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  323. package/src/components/ErrorFallback/index.ts +9 -0
  324. package/src/components/Focus/AUDIT.md +43 -0
  325. package/src/components/Focus/Focus.stories.tsx +230 -0
  326. package/src/components/Focus/Focus.tsx +201 -0
  327. package/src/components/Focus/index.ts +5 -0
  328. package/src/components/Icon/Icon.stories.tsx +143 -0
  329. package/src/components/Icon/Icon.tsx +15 -4
  330. package/src/components/Image/Image.stories.tsx +86 -0
  331. package/src/components/Image/Image.tsx +246 -0
  332. package/src/components/Image/index.ts +5 -0
  333. package/src/components/Input/Input.stories.tsx +27 -49
  334. package/src/components/Input/Input.tsx +51 -87
  335. package/src/components/Link/Link.stories.tsx +11 -8
  336. package/src/components/Link/Link.tsx +11 -3
  337. package/src/components/{Lists → List}/List.stories.tsx +46 -48
  338. package/src/components/{Lists → List}/List.tsx +30 -35
  339. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -8
  340. package/src/components/{Lists → List}/Tree.stories.tsx +16 -14
  341. package/src/components/{Lists → List}/Tree.tsx +3 -3
  342. package/src/components/{Lists → List}/TreeDropIndicator.tsx +7 -7
  343. package/src/components/{Lists → List}/Treegrid.stories.tsx +39 -34
  344. package/src/components/List/Treegrid.tsx +188 -0
  345. package/src/components/Main/Main.stories.tsx +52 -27
  346. package/src/components/Main/Main.tsx +176 -105
  347. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  348. package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
  349. package/src/components/MediaPlayer/index.ts +5 -0
  350. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +12 -10
  351. package/src/components/{Menus → Menu}/ContextMenu.tsx +10 -33
  352. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +13 -11
  353. package/src/components/{Menus → Menu}/DropdownMenu.tsx +157 -120
  354. package/src/components/Message/Message.stories.tsx +36 -18
  355. package/src/components/Message/Message.tsx +59 -33
  356. package/src/components/Popover/Popover.stories.tsx +18 -16
  357. package/src/components/Popover/Popover.tsx +124 -102
  358. package/src/components/ScrollArea/ScrollArea.stories.tsx +221 -33
  359. package/src/components/ScrollArea/ScrollArea.tsx +97 -79
  360. package/src/components/ScrollArea/index.ts +1 -1
  361. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +91 -0
  362. package/src/components/ScrollContainer/ScrollContainer.tsx +345 -0
  363. package/src/components/ScrollContainer/index.ts +5 -0
  364. package/src/components/Select/Select.stories.tsx +19 -17
  365. package/src/components/Select/Select.tsx +16 -32
  366. package/src/components/Separator/Separator.tsx +5 -8
  367. package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
  368. package/src/components/Skeleton/Skeleton.tsx +26 -0
  369. package/src/components/Skeleton/index.ts +5 -0
  370. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  371. package/src/components/Splitter/Splitter.tsx +127 -0
  372. package/src/components/Splitter/index.ts +5 -0
  373. package/src/components/Status/Status.stories.tsx +29 -23
  374. package/src/components/Status/Status.tsx +10 -7
  375. package/src/components/Tag/Tag.stories.tsx +16 -13
  376. package/src/components/Tag/Tag.tsx +3 -8
  377. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
  378. package/src/components/ThemeProvider/ThemeProvider.tsx +12 -11
  379. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  380. package/src/components/ThemeProvider/index.ts +3 -3
  381. package/src/components/Toast/Toast.stories.tsx +13 -11
  382. package/src/components/Toast/Toast.tsx +23 -42
  383. package/src/components/Toolbar/Toolbar.stories.tsx +22 -21
  384. package/src/components/Toolbar/Toolbar.tsx +190 -14
  385. package/src/components/Tooltip/Tooltip.stories.tsx +35 -30
  386. package/src/components/Tooltip/Tooltip.tsx +58 -54
  387. package/src/components/index.ts +17 -9
  388. package/src/exemplars/generics.stories.tsx +41 -0
  389. package/src/exemplars/slot.stories.tsx +115 -0
  390. package/src/exemplars/tabster.stories.tsx +127 -0
  391. package/src/exemplars/virtualizer.stories.tsx +136 -0
  392. package/src/hooks/index.ts +1 -0
  393. package/src/hooks/useDensityContext.ts +3 -3
  394. package/src/hooks/useElevationContext.ts +1 -1
  395. package/src/hooks/useSafeArea.ts +3 -2
  396. package/src/hooks/useSafeCollisionPadding.ts +1 -1
  397. package/src/hooks/useVisualViewport.ts +4 -4
  398. package/src/index.ts +2 -1
  399. package/src/playground/Controls.stories.tsx +20 -24
  400. package/src/playground/Custom.stories.tsx +20 -34
  401. package/src/playground/Typography.stories.tsx +11 -9
  402. package/src/primitives/Column/AUDIT.md +148 -0
  403. package/src/primitives/Column/Column.stories.tsx +181 -0
  404. package/src/primitives/Column/Column.tsx +165 -0
  405. package/src/primitives/Column/index.ts +5 -0
  406. package/src/primitives/Container/Container.stories.tsx +29 -0
  407. package/src/primitives/Container/Container.tsx +19 -0
  408. package/src/primitives/Container/index.ts +5 -0
  409. package/src/primitives/Flex/Flex.stories.tsx +57 -0
  410. package/src/primitives/Flex/Flex.tsx +27 -0
  411. package/src/primitives/Flex/index.ts +5 -0
  412. package/src/primitives/Grid/Grid.stories.tsx +56 -0
  413. package/src/primitives/Grid/Grid.tsx +30 -0
  414. package/src/primitives/Grid/index.ts +5 -0
  415. package/src/primitives/Panel/Panel.stories.tsx +68 -0
  416. package/src/primitives/Panel/Panel.tsx +120 -0
  417. package/src/primitives/Panel/index.ts +5 -0
  418. package/src/primitives/index.ts +9 -0
  419. package/src/testing/Loading.tsx +47 -0
  420. package/src/testing/decorators/index.ts +2 -1
  421. package/src/testing/decorators/withLayout.tsx +67 -0
  422. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  423. package/src/testing/decorators/withTheme.tsx +37 -0
  424. package/src/testing/index.ts +2 -0
  425. package/src/translations.ts +24 -0
  426. package/src/util/index.ts +3 -1
  427. package/src/util/usePx.ts +62 -0
  428. package/dist/lib/browser/chunk-T6YPS45E.mjs +0 -4376
  429. package/dist/lib/browser/chunk-T6YPS45E.mjs.map +0 -7
  430. package/dist/lib/node-esm/chunk-TYVQJ4KW.mjs +0 -4378
  431. package/dist/lib/node-esm/chunk-TYVQJ4KW.mjs.map +0 -7
  432. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  433. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  434. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  435. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  436. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  437. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  438. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  439. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  440. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  441. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  442. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  443. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  444. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  445. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  446. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  447. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  448. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  449. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  450. package/dist/types/src/components/Dialogs/AlertDialog.d.ts +0 -31
  451. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  452. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  453. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  454. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  455. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  456. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  457. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  458. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  459. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  460. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  461. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  462. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  463. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  464. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  465. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  466. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  467. package/dist/types/src/components/Lists/Treegrid.d.ts.map +0 -1
  468. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  469. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  470. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  471. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  472. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  473. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  474. package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -112
  475. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  476. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  477. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  478. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  479. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  480. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  481. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  482. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  483. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  484. package/src/components/AnchoredOverflow/index.ts +0 -5
  485. package/src/components/Buttons/Toggle.stories.tsx +0 -33
  486. package/src/components/Buttons/ToggleGroup.tsx +0 -41
  487. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -66
  488. package/src/components/Dialogs/AlertDialog.tsx +0 -172
  489. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  490. package/src/components/Dialogs/Dialog.tsx +0 -159
  491. package/src/components/Lists/Treegrid.tsx +0 -152
  492. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  493. package/src/testing/decorators/withTheme.ts +0 -22
  494. package/src/util/ThemedClassName.ts +0 -7
  495. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  496. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  497. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  498. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  499. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  500. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  501. /package/src/components/{Buttons → Button}/index.ts +0 -0
  502. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  503. /package/src/components/{Lists → List}/index.ts +0 -0
  504. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -1,100 +1,4448 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- AlertDialog,
4
- AnchoredOverflow,
5
- Avatar,
6
- BUTTON_GROUP_NAME,
7
- Breadcrumb,
8
- Button,
9
- ButtonGroup,
10
- Callout,
11
- Clipboard,
12
- ContextMenu,
13
3
  DensityContext,
14
4
  DensityProvider,
15
- Dialog,
16
- DropdownMenu,
17
5
  ElevationContext,
18
6
  ElevationProvider,
19
- Icon,
20
- IconButton,
21
- Input,
22
- LIST_ITEM_NAME,
23
- LIST_NAME,
24
- Link,
25
- List,
26
- ListItem,
27
- Main,
28
- Message,
29
- Popover,
30
- ScrollArea,
31
- Select,
32
- Separator,
33
- Status,
34
- Tag,
7
+ ErrorStack,
35
8
  ThemeContext,
36
9
  ThemeProvider,
37
- Toast,
38
- Toggle,
39
- ToggleGroup,
40
- ToggleGroupItem,
41
- Toolbar,
42
10
  Tooltip,
43
- Tree,
44
- TreeItem,
45
- Treegrid,
46
- createDropdownMenuScope,
47
- createPopoverScope,
11
+ TranslationsContext,
48
12
  createTooltipScope,
49
13
  hasIosKeyboard,
50
14
  initialSafeArea,
51
- isLabel,
52
- messageIcons,
53
- toLocalizedString,
54
- useAvatarContext,
55
- useButtonGroupContext,
56
- useClipboard,
57
- useDensityContext,
58
- useDropdownMenuContext,
59
- useDropdownMenuMenuScope,
15
+ parseCaptureOwnerStack,
60
16
  useElevationContext,
61
- useIconHref,
62
- useLandmarkMover,
63
- useListContext,
64
- useListItemContext,
65
- useMainContext,
66
17
  useSafeArea,
67
- useSidebars,
68
18
  useThemeContext,
69
19
  useTooltipContext,
70
- useTranslation,
71
- useTranslationsContext,
72
- useVisualViewport
73
- } from "./chunk-TYVQJ4KW.mjs";
20
+ useTranslation
21
+ } from "./chunk-NGKLIKP3.mjs";
22
+ import {
23
+ translationKey
24
+ } from "./chunk-XCFLA74M.mjs";
74
25
 
75
26
  // src/index.ts
76
27
  import { Trans } from "react-i18next";
77
28
  export * from "@dxos/react-hooks";
78
- export * from "@dxos/react-ui-types";
29
+ export * from "@dxos/ui-types";
30
+
31
+ // src/components/ThemeProvider/index.ts
32
+ import { isLabel, toLocalizedString } from "@dxos/ui-types/translations";
33
+
34
+ // src/hooks/useDensityContext.ts
35
+ import { useContext } from "react";
36
+ var useDensityContext = (densityProp) => {
37
+ const { density } = useContext(DensityContext);
38
+ return densityProp ?? density;
39
+ };
40
+
41
+ // src/hooks/useIconHref.ts
42
+ var ICONS_URL = "/icons.svg";
43
+ var useIconHref = (icon) => {
44
+ const { noCache } = useThemeContext();
45
+ const url = noCache ? `${ICONS_URL}?nocache=${(/* @__PURE__ */ new Date()).getMinutes()}` : ICONS_URL;
46
+ return icon ? `${url}#${icon}` : void 0;
47
+ };
48
+
49
+ // src/hooks/useSafeCollisionPadding.ts
50
+ import { useMemo } from "react";
51
+ var propIsNumber = (prop) => Number.isFinite(prop);
52
+ var propsIsRecord = (prop) => !!(prop && typeof prop === "object");
53
+ var safePadding = (propsPadding, safePadding2, side) => {
54
+ return (propIsNumber(safePadding2[side]) ? safePadding2[side] : 0) + (propIsNumber(propsPadding) ? propsPadding : propsIsRecord(propsPadding) ? propsPadding[side] ?? 0 : 0);
55
+ };
56
+ var useSafeCollisionPadding = (collisionPadding) => {
57
+ const { safeAreaPadding } = useThemeContext();
58
+ return useMemo(() => ({
59
+ top: safePadding(collisionPadding, safeAreaPadding, "top"),
60
+ right: safePadding(collisionPadding, safeAreaPadding, "right"),
61
+ bottom: safePadding(collisionPadding, safeAreaPadding, "bottom"),
62
+ left: safePadding(collisionPadding, safeAreaPadding, "left")
63
+ }), [
64
+ collisionPadding,
65
+ safeAreaPadding
66
+ ]);
67
+ };
68
+
69
+ // src/hooks/useTranslationsContext.ts
70
+ import { useContext as useContext2 } from "react";
71
+ var useTranslationsContext = () => useContext2(TranslationsContext);
72
+
73
+ // src/hooks/useVisualViewport.ts
74
+ import { useCallback, useState } from "react";
75
+ import { useViewportResize } from "@dxos/react-hooks";
76
+ var useVisualViewport = (deps) => {
77
+ const [width, setWidth] = useState(null);
78
+ const [height, setHeight] = useState(null);
79
+ const handleResize = useCallback(() => {
80
+ if (window.visualViewport) {
81
+ setWidth(window.visualViewport.width);
82
+ setHeight(window.visualViewport.height);
83
+ }
84
+ }, []);
85
+ useViewportResize(handleResize, deps);
86
+ return {
87
+ width,
88
+ height
89
+ };
90
+ };
91
+
92
+ // src/util/usePx.ts
93
+ import { useCallback as useCallback2, useEffect, useMemo as useMemo2, useState as useState2 } from "react";
94
+ var getDocumentElementFontSize = () => parseFloat(getComputedStyle(document.documentElement).fontSize);
95
+ var usePx = (rem) => {
96
+ const [fontSize, setFontSize] = useState2(() => {
97
+ if (typeof document !== "undefined") {
98
+ return getDocumentElementFontSize();
99
+ }
100
+ return 16;
101
+ });
102
+ const updateFontSize = useCallback2(() => {
103
+ setFontSize(getDocumentElementFontSize());
104
+ }, []);
105
+ useEffect(() => {
106
+ if (typeof document === "undefined") {
107
+ return;
108
+ }
109
+ const resizeObserver = new ResizeObserver(updateFontSize);
110
+ resizeObserver.observe(document.documentElement);
111
+ const mediaQueryList = window.matchMedia("all");
112
+ const handleMediaChange = () => {
113
+ updateFontSize();
114
+ };
115
+ if (mediaQueryList.addEventListener) {
116
+ mediaQueryList.addEventListener("change", handleMediaChange);
117
+ } else {
118
+ mediaQueryList.addListener(handleMediaChange);
119
+ }
120
+ return () => {
121
+ resizeObserver.disconnect();
122
+ if (mediaQueryList.removeEventListener) {
123
+ mediaQueryList.removeEventListener("change", handleMediaChange);
124
+ } else {
125
+ mediaQueryList.removeListener(handleMediaChange);
126
+ }
127
+ };
128
+ }, []);
129
+ return useMemo2(() => rem * fontSize, [
130
+ fontSize
131
+ ]);
132
+ };
133
+
134
+ // src/components/Avatars/Avatar.tsx
135
+ import { createContext } from "@radix-ui/react-context";
136
+ import { Primitive } from "@radix-ui/react-primitive";
137
+ import { Slot } from "@radix-ui/react-slot";
138
+ import React, { forwardRef } from "react";
139
+ import "@dxos/lit-ui/dx-avatar.pcss";
140
+ import { DxAvatar } from "@dxos/lit-ui/react";
141
+ import { useId } from "@dxos/react-hooks";
142
+ import { mx } from "@dxos/ui-theme";
143
+ var AVATAR_NAME = "Avatar";
144
+ var [AvatarProvider, useAvatarContext] = createContext(AVATAR_NAME);
145
+ var AvatarRoot = ({ children, labelId: propsLabelId, descriptionId: propsDescriptionId }) => {
146
+ const labelId = useId("avatar__label", propsLabelId);
147
+ const descriptionId = useId("avatar__description", propsDescriptionId);
148
+ return /* @__PURE__ */ React.createElement(AvatarProvider, {
149
+ labelId,
150
+ descriptionId
151
+ }, children);
152
+ };
153
+ var AvatarContent = /* @__PURE__ */ forwardRef(({ icon, classNames, ...props }, forwardedRef) => {
154
+ const href = useIconHref(icon);
155
+ const { labelId, descriptionId } = useAvatarContext("AvatarContent");
156
+ return /* @__PURE__ */ React.createElement(DxAvatar, {
157
+ ...props,
158
+ icon: href,
159
+ "aria-labelledby": labelId,
160
+ "aria-describedby": descriptionId,
161
+ rootClassName: mx(classNames),
162
+ ref: forwardedRef
163
+ });
164
+ });
165
+ var AvatarLabel = /* @__PURE__ */ forwardRef(({ asChild, srOnly, classNames, ...props }, forwardedRef) => {
166
+ const Comp = asChild ? Slot : Primitive.span;
167
+ const { tx } = useThemeContext();
168
+ const { labelId } = useAvatarContext("AvatarLabel");
169
+ return /* @__PURE__ */ React.createElement(Comp, {
170
+ ...props,
171
+ id: labelId,
172
+ ref: forwardedRef,
173
+ className: tx("avatar.label", {
174
+ srOnly
175
+ }, classNames)
176
+ });
177
+ });
178
+ var AvatarDescription = /* @__PURE__ */ forwardRef(({ asChild, srOnly, classNames, ...props }, forwardedRef) => {
179
+ const Comp = asChild ? Slot : Primitive.span;
180
+ const { tx } = useThemeContext();
181
+ const { descriptionId } = useAvatarContext("AvatarDescription");
182
+ return /* @__PURE__ */ React.createElement(Comp, {
183
+ ...props,
184
+ id: descriptionId,
185
+ ref: forwardedRef,
186
+ className: tx("avatar.description", {
187
+ srOnly
188
+ }, classNames)
189
+ });
190
+ });
191
+ var Avatar = {
192
+ Root: AvatarRoot,
193
+ Content: AvatarContent,
194
+ Label: AvatarLabel,
195
+ Description: AvatarDescription
196
+ };
197
+
198
+ // src/components/Breadcrumb/Breadcrumb.tsx
199
+ import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
200
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
201
+ import React4, { forwardRef as forwardRef4 } from "react";
202
+
203
+ // src/components/Icon/Icon.tsx
204
+ import React2, { forwardRef as forwardRef2, memo, useMemo as useMemo3 } from "react";
205
+ var Icon = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ classNames, icon, size, synchronized, style, ...props }, forwardedRef) => {
206
+ const { tx } = useThemeContext();
207
+ const spinDelay = useMemo3(() => synchronized ? `${-(Date.now() % 1e3)}ms` : void 0, [
208
+ synchronized
209
+ ]);
210
+ const href = useIconHref(icon);
211
+ return /* @__PURE__ */ React2.createElement("svg", {
212
+ ...props,
213
+ style: {
214
+ ...style,
215
+ animationDelay: spinDelay
216
+ },
217
+ className: tx("icon.root", {
218
+ size
219
+ }, classNames),
220
+ ref: forwardedRef
221
+ }, /* @__PURE__ */ React2.createElement("use", {
222
+ href
223
+ }));
224
+ }));
225
+
226
+ // src/components/Link/Link.tsx
227
+ import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
228
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
229
+ import React3, { forwardRef as forwardRef3 } from "react";
230
+ var Link = /* @__PURE__ */ forwardRef3(({ classNames, asChild, variant, target = "_blank", rel = "noreferrer", ...props }, forwardedRef) => {
231
+ const { tx } = useThemeContext();
232
+ const Comp = asChild ? Slot2 : Primitive2.a;
233
+ return /* @__PURE__ */ React3.createElement(Comp, {
234
+ ...props,
235
+ target,
236
+ rel,
237
+ className: tx("link.root", {
238
+ variant
239
+ }, classNames),
240
+ ref: forwardedRef
241
+ });
242
+ });
243
+
244
+ // src/components/Breadcrumb/Breadcrumb.tsx
245
+ var BreadcrumbRoot = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
246
+ const { tx } = useThemeContext();
247
+ const Comp = asChild ? Slot3 : Primitive3.div;
248
+ return /* @__PURE__ */ React4.createElement(Comp, {
249
+ role: "navigation",
250
+ ...props,
251
+ className: tx("breadcrumb.root", {}, classNames),
252
+ ref: forwardedRef
253
+ });
254
+ });
255
+ var BreadcrumbList = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
256
+ const { tx } = useThemeContext();
257
+ const Comp = asChild ? Slot3 : Primitive3.ol;
258
+ return /* @__PURE__ */ React4.createElement(Comp, {
259
+ role: "list",
260
+ ...props,
261
+ className: tx("breadcrumb.list", {}, classNames),
262
+ ref: forwardedRef
263
+ });
264
+ });
265
+ var BreadcrumbListItem = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
266
+ const { tx } = useThemeContext();
267
+ const Comp = asChild ? Slot3 : Primitive3.li;
268
+ return /* @__PURE__ */ React4.createElement(Comp, {
269
+ role: "listitem",
270
+ ...props,
271
+ className: tx("breadcrumb.listItem", {}, classNames),
272
+ ref: forwardedRef
273
+ });
274
+ });
275
+ var BreadcrumbLink = /* @__PURE__ */ forwardRef4(({ asChild, ...props }, forwardedRef) => {
276
+ const Comp = asChild ? Slot3 : Link;
277
+ return /* @__PURE__ */ React4.createElement(Comp, {
278
+ ...props,
279
+ ref: forwardedRef
280
+ });
281
+ });
282
+ var BreadcrumbCurrent = /* @__PURE__ */ forwardRef4(({ asChild, classNames, ...props }, forwardedRef) => {
283
+ const { tx } = useThemeContext();
284
+ const Comp = asChild ? Slot3 : "h1";
285
+ return /* @__PURE__ */ React4.createElement(Comp, {
286
+ ...props,
287
+ "aria-current": "page",
288
+ className: tx("breadcrumb.current", {}, classNames),
289
+ ref: forwardedRef
290
+ });
291
+ });
292
+ var BreadcrumbSeparator = ({ children, classNames, ...props }) => {
293
+ const { tx } = useThemeContext();
294
+ return /* @__PURE__ */ React4.createElement(Primitive3.span, {
295
+ role: "separator",
296
+ "aria-hidden": "true",
297
+ ...props,
298
+ className: tx("breadcrumb.separator", {}, classNames)
299
+ }, children ?? /* @__PURE__ */ React4.createElement(Icon, {
300
+ icon: "ph--dot--bold"
301
+ }));
302
+ };
303
+ var Breadcrumb = {
304
+ Root: BreadcrumbRoot,
305
+ List: BreadcrumbList,
306
+ ListItem: BreadcrumbListItem,
307
+ Link: BreadcrumbLink,
308
+ Current: BreadcrumbCurrent,
309
+ Separator: BreadcrumbSeparator
310
+ };
311
+
312
+ // src/components/Button/Button.tsx
313
+ import { createContext as createContext2 } from "@radix-ui/react-context";
314
+ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
315
+ import { Slot as Slot4 } from "@radix-ui/react-slot";
316
+ import React5, { forwardRef as forwardRef5, memo as memo2 } from "react";
317
+ var BUTTON_GROUP_NAME = "ButtonGroup";
318
+ var BUTTON_NAME = "Button";
319
+ var [ButtonGroupProvider, useButtonGroupContext] = createContext2(BUTTON_GROUP_NAME, {
320
+ inGroup: false
321
+ });
322
+ var Button = /* @__PURE__ */ memo2(/* @__PURE__ */ forwardRef5(({ classNames, children, density: densityProp, elevation: elevationProp, variant = "default", asChild, ...props }, ref) => {
323
+ const { inGroup } = useButtonGroupContext(BUTTON_NAME);
324
+ const { tx } = useThemeContext();
325
+ const elevation = useElevationContext(elevationProp);
326
+ const density = useDensityContext(densityProp);
327
+ const Comp = asChild ? Slot4 : Primitive4.button;
328
+ return /* @__PURE__ */ React5.createElement(Comp, {
329
+ ref,
330
+ ...props,
331
+ "data-variant": variant,
332
+ "data-density": density,
333
+ "data-props": inGroup ? "grouped" : "",
334
+ className: tx("button.root", {
335
+ variant,
336
+ inGroup,
337
+ disabled: props.disabled,
338
+ density,
339
+ elevation
340
+ }, classNames),
341
+ ...props.disabled && {
342
+ disabled: true
343
+ }
344
+ }, children);
345
+ }));
346
+ Button.displayName = BUTTON_NAME;
347
+ var ButtonGroup = /* @__PURE__ */ forwardRef5(({ children, elevation: propsElevation, classNames, asChild, ...props }, forwardedRef) => {
348
+ const { tx } = useThemeContext();
349
+ const elevation = useElevationContext(propsElevation);
350
+ const Comp = asChild ? Slot4 : Primitive4.div;
351
+ return /* @__PURE__ */ React5.createElement(Comp, {
352
+ role: "none",
353
+ ...props,
354
+ className: tx("button.group", {
355
+ elevation
356
+ }, classNames),
357
+ ref: forwardedRef
358
+ }, /* @__PURE__ */ React5.createElement(ButtonGroupProvider, {
359
+ inGroup: true
360
+ }, children));
361
+ });
362
+ ButtonGroup.displayName = BUTTON_GROUP_NAME;
363
+
364
+ // src/components/Button/IconButton.tsx
365
+ import React6, { forwardRef as forwardRef6 } from "react";
366
+ var IconButton = /* @__PURE__ */ forwardRef6((props, forwardedRef) => props.iconOnly ? /* @__PURE__ */ React6.createElement(IconOnlyButton, {
367
+ ...props,
368
+ ref: forwardedRef
369
+ }) : /* @__PURE__ */ React6.createElement(LabelledIconButton, {
370
+ ...props,
371
+ ref: forwardedRef
372
+ }));
373
+ var IconOnlyButton = /* @__PURE__ */ forwardRef6(({ noTooltip, tooltipSide, ...props }, forwardedRef) => {
374
+ if (noTooltip) {
375
+ return /* @__PURE__ */ React6.createElement(LabelledIconButton, {
376
+ ...props,
377
+ ref: forwardedRef
378
+ });
379
+ }
380
+ return /* @__PURE__ */ React6.createElement(Tooltip.Trigger, {
381
+ asChild: true,
382
+ content: props.label,
383
+ side: tooltipSide
384
+ }, /* @__PURE__ */ React6.createElement(LabelledIconButton, {
385
+ ...props,
386
+ ref: forwardedRef
387
+ }));
388
+ });
389
+ var LabelledIconButton = /* @__PURE__ */ forwardRef6(({ size, icon, iconOnly, square, iconEnd, iconClassNames, label, caretDown, noTooltip: _, classNames, ...props }, forwardedRef) => {
390
+ const { tx } = useThemeContext();
391
+ return /* @__PURE__ */ React6.createElement(Button, {
392
+ ...props,
393
+ classNames: tx("iconButton.root", {
394
+ iconOnly,
395
+ square
396
+ }, classNames),
397
+ ref: forwardedRef
398
+ }, icon && !iconEnd && /* @__PURE__ */ React6.createElement(Icon, {
399
+ icon,
400
+ size,
401
+ classNames: iconClassNames
402
+ }), /* @__PURE__ */ React6.createElement("span", {
403
+ className: iconOnly ? "sr-only" : void 0
404
+ }, label), icon && iconEnd && /* @__PURE__ */ React6.createElement(Icon, {
405
+ icon,
406
+ size,
407
+ classNames: iconClassNames
408
+ }), caretDown && /* @__PURE__ */ React6.createElement(Icon, {
409
+ size: 3,
410
+ icon: "ph--caret-down--bold"
411
+ }));
412
+ });
413
+
414
+ // src/components/Button/Toggle.tsx
415
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
416
+ import React7, { forwardRef as forwardRef7 } from "react";
417
+ var Toggle = /* @__PURE__ */ forwardRef7(({ defaultPressed, pressed, onPressedChange, ...props }, forwardedRef) => {
418
+ return /* @__PURE__ */ React7.createElement(TogglePrimitive.Root, {
419
+ defaultPressed,
420
+ pressed,
421
+ onPressedChange,
422
+ asChild: true
423
+ }, /* @__PURE__ */ React7.createElement(Button, {
424
+ ...props,
425
+ ref: forwardedRef
426
+ }));
427
+ });
428
+
429
+ // src/components/Button/ToggleGroup.tsx
430
+ import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
431
+ import React8, { forwardRef as forwardRef8 } from "react";
432
+ var ToggleGroup = /* @__PURE__ */ forwardRef8(({ classNames, children, ...props }, forwardedRef) => {
433
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Root, {
434
+ ...props,
435
+ asChild: true
436
+ }, /* @__PURE__ */ React8.createElement(ButtonGroup, {
437
+ classNames,
438
+ children,
439
+ ref: forwardedRef
440
+ }));
441
+ });
442
+ var ToggleGroupItem = /* @__PURE__ */ forwardRef8(({ variant, elevation, density, classNames, children, ...props }, forwardedRef) => {
443
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Item, {
444
+ ...props,
445
+ asChild: true
446
+ }, /* @__PURE__ */ React8.createElement(Button, {
447
+ variant,
448
+ elevation,
449
+ density,
450
+ classNames,
451
+ children,
452
+ ref: forwardedRef
453
+ }));
454
+ });
455
+ var ToggleGroupIconItem = /* @__PURE__ */ forwardRef8(({ variant, label, icon, size, elevation, density, classNames, ...props }, forwardedRef) => {
456
+ return /* @__PURE__ */ React8.createElement(ToggleGroupPrimitive.Item, {
457
+ ...props,
458
+ asChild: true
459
+ }, /* @__PURE__ */ React8.createElement(IconButton, {
460
+ variant,
461
+ elevation,
462
+ density,
463
+ classNames,
464
+ label,
465
+ icon,
466
+ size,
467
+ ref: forwardedRef
468
+ }));
469
+ });
470
+
471
+ // src/components/Card/Card.tsx
472
+ import { Primitive as Primitive12 } from "@radix-ui/react-primitive";
473
+ import { Slot as Slot12 } from "@radix-ui/react-slot";
474
+ import DOMPurify from "dompurify";
475
+ import React19, { createContext as createContext3, forwardRef as forwardRef13, useContext as useContext3, useMemo as useMemo5 } from "react";
476
+ import { composable as composable3, composableProps as composableProps7, iconSize, mx as mx6, slottable as slottable6 } from "@dxos/ui-theme";
477
+
478
+ // src/primitives/Column/Column.tsx
479
+ import { Primitive as Primitive5 } from "@radix-ui/react-primitive";
480
+ import { Slot as Slot5 } from "@radix-ui/react-slot";
481
+ import React9 from "react";
482
+ import { composableProps, slottable } from "@dxos/ui-theme";
483
+ var COLUMN_ROOT_NAME = "Column.Root";
484
+ var gutterSizes = {
485
+ xs: "var(--dx-gutter-xs)",
486
+ sm: "var(--dx-gutter-sm)",
487
+ md: "var(--dx-gutter-md)",
488
+ lg: "var(--dx-gutter-lg)"
489
+ };
490
+ var ColumnRoot = slottable(({ children, asChild, role, gutter = "md", ...props }, forwardedRef) => {
491
+ const { className, ...rest } = composableProps(props);
492
+ const Comp = asChild ? Slot5 : Primitive5.div;
493
+ const { tx } = useThemeContext();
494
+ const gutterSize = gutterSizes[gutter];
495
+ return /* @__PURE__ */ React9.createElement(Comp, {
496
+ ...rest,
497
+ role: role ?? "none",
498
+ style: {
499
+ "--gutter": gutterSize,
500
+ "--dx-col": "2 / span 1",
501
+ gridTemplateColumns: [
502
+ gutterSize,
503
+ "minmax(0,1fr)",
504
+ gutterSize
505
+ ].join(" ")
506
+ },
507
+ className: tx("column.root", {
508
+ gutter
509
+ }, className),
510
+ ref: forwardedRef
511
+ }, children);
512
+ });
513
+ ColumnRoot.displayName = COLUMN_ROOT_NAME;
514
+ var COLUMN_ROW_NAME = "Column.Row";
515
+ var ColumnRow = slottable(({ children, asChild, role, ...props }, forwardedRef) => {
516
+ const { className, ...rest } = composableProps(props);
517
+ const Comp = asChild ? Slot5 : Primitive5.div;
518
+ const { tx } = useThemeContext();
519
+ return /* @__PURE__ */ React9.createElement(Comp, {
520
+ ...rest,
521
+ role: role ?? "none",
522
+ className: tx("column.row", {}, className),
523
+ ref: forwardedRef
524
+ }, children);
525
+ });
526
+ ColumnRow.displayName = COLUMN_ROW_NAME;
527
+ var COLUMN_BLEED_NAME = "Column.Bleed";
528
+ var ColumnBleed = slottable(({ children, asChild, ...props }, forwardedRef) => {
529
+ const { tx } = useThemeContext();
530
+ const { className, ...rest } = composableProps(props);
531
+ const Comp = asChild ? Slot5 : Primitive5.div;
532
+ return /* @__PURE__ */ React9.createElement(Comp, {
533
+ ...rest,
534
+ className: tx("column.bleed", {}, className),
535
+ ref: forwardedRef
536
+ }, children);
537
+ });
538
+ ColumnBleed.displayName = COLUMN_BLEED_NAME;
539
+ var COLUMN_CENTER_NAME = "Column.Center";
540
+ var ColumnCenter = slottable(({ children, asChild, ...props }, forwardedRef) => {
541
+ const { tx } = useThemeContext();
542
+ const { className, ...rest } = composableProps(props);
543
+ const Comp = asChild ? Slot5 : Primitive5.div;
544
+ return /* @__PURE__ */ React9.createElement(Comp, {
545
+ ...rest,
546
+ className: tx("column.center", {}, className),
547
+ ref: forwardedRef
548
+ }, children);
549
+ });
550
+ ColumnCenter.displayName = COLUMN_CENTER_NAME;
551
+ var Column = {
552
+ Root: ColumnRoot,
553
+ Row: ColumnRow,
554
+ Bleed: ColumnBleed,
555
+ Center: ColumnCenter
556
+ };
557
+
558
+ // src/primitives/Container/Container.tsx
559
+ import { Primitive as Primitive6 } from "@radix-ui/react-primitive";
560
+ import { Slot as Slot6 } from "@radix-ui/react-slot";
561
+ import React10 from "react";
562
+ import { composableProps as composableProps2, mx as mx2, slottable as slottable2 } from "@dxos/ui-theme";
563
+ var Container = slottable2(({ children, asChild, ...props }, forwardedRef) => {
564
+ const { className, ...rest } = composableProps2(props);
565
+ const Comp = asChild ? Slot6 : Primitive6.div;
566
+ return /* @__PURE__ */ React10.createElement(Comp, {
567
+ ...rest,
568
+ className: mx2("dx-container", className),
569
+ ref: forwardedRef
570
+ }, children);
571
+ });
572
+
573
+ // src/primitives/Flex/Flex.tsx
574
+ import { Primitive as Primitive7 } from "@radix-ui/react-primitive";
575
+ import { Slot as Slot7 } from "@radix-ui/react-slot";
576
+ import React11 from "react";
577
+ import { composableProps as composableProps3, mx as mx3, slottable as slottable3 } from "@dxos/ui-theme";
578
+ var Flex = slottable3(({ children, asChild, column, grow, ...props }, forwardedRef) => {
579
+ const { className, ...rest } = composableProps3(props);
580
+ const Comp = asChild ? Slot7 : Primitive7.div;
581
+ return /* @__PURE__ */ React11.createElement(Comp, {
582
+ ref: forwardedRef,
583
+ ...rest,
584
+ className: mx3("flex", column && "flex-col", grow && "flex-1 overflow-hidden", className)
585
+ }, children);
586
+ });
587
+
588
+ // src/primitives/Grid/Grid.tsx
589
+ import React12 from "react";
590
+ import { composable, composableProps as composableProps4, mx as mx4 } from "@dxos/ui-theme";
591
+ var Grid = composable(({ children, style, role, cols, rows, grow = true, ...props }, forwardedRef) => {
592
+ const { className, ...rest } = composableProps4(props);
593
+ return /* @__PURE__ */ React12.createElement("div", {
594
+ ref: forwardedRef,
595
+ ...rest,
596
+ role: role ?? "none",
597
+ className: mx4("grid overflow-hidden", grow && "dx-container", className),
598
+ style: {
599
+ gridTemplateColumns: cols ? `repeat(${cols}, 1fr)` : void 0,
600
+ gridTemplateRows: rows ? `repeat(${rows}, 1fr)` : void 0,
601
+ ...style
602
+ }
603
+ }, children);
604
+ });
605
+
606
+ // src/primitives/Panel/Panel.tsx
607
+ import { Primitive as Primitive8 } from "@radix-ui/react-primitive";
608
+ import { Slot as Slot8 } from "@radix-ui/react-slot";
609
+ import React13 from "react";
610
+ import { composableProps as composableProps5, slottable as slottable4 } from "@dxos/ui-theme";
611
+ var GRID_TEMPLATE_ROWS = "auto 1fr auto";
612
+ var GRID_TEMPLATE_AREAS = '"toolbar" "content" "statusbar"';
613
+ var PanelRoot = slottable4(({ children, asChild, role, style, ...props }, forwardedRef) => {
614
+ const { className, ...rest } = composableProps5(props);
615
+ const Comp = asChild ? Slot8 : Primitive8.div;
616
+ const { tx } = useThemeContext();
617
+ return /* @__PURE__ */ React13.createElement(Comp, {
618
+ ...rest,
619
+ role: role ?? "none",
620
+ style: {
621
+ gridTemplateRows: GRID_TEMPLATE_ROWS,
622
+ gridTemplateAreas: GRID_TEMPLATE_AREAS,
623
+ ...style
624
+ },
625
+ className: tx("panel.root", {}, className),
626
+ ref: forwardedRef
627
+ }, children);
628
+ });
629
+ PanelRoot.displayName = "Panel.Root";
630
+ var PanelToolbar = slottable4(({ children, asChild, size, ...props }, forwardedRef) => {
631
+ const { className, ...rest } = composableProps5(props);
632
+ const Comp = asChild ? Slot8 : Primitive8.div;
633
+ const { tx } = useThemeContext();
634
+ return /* @__PURE__ */ React13.createElement(Comp, {
635
+ ...rest,
636
+ "data-slot": "toolbar",
637
+ className: tx("panel.toolbar", {
638
+ size
639
+ }, className),
640
+ ref: forwardedRef
641
+ }, children);
642
+ });
643
+ PanelToolbar.displayName = "Panel.Toolbar";
644
+ var PanelContent = slottable4(({ children, asChild, ...props }, forwardedRef) => {
645
+ const { className, ...rest } = composableProps5(props);
646
+ const Comp = asChild ? Slot8 : Primitive8.div;
647
+ const { tx } = useThemeContext();
648
+ return /* @__PURE__ */ React13.createElement(Comp, {
649
+ ...rest,
650
+ "data-slot": "content",
651
+ className: tx("panel.content", {}, className),
652
+ ref: forwardedRef
653
+ }, children);
654
+ });
655
+ PanelContent.displayName = "Panel.Content";
656
+ var PanelStatusbar = slottable4(({ children, asChild, size, ...props }, forwardedRef) => {
657
+ const { className, ...rest } = composableProps5(props);
658
+ const Comp = asChild ? Slot8 : Primitive8.div;
659
+ const { tx } = useThemeContext();
660
+ return /* @__PURE__ */ React13.createElement(Comp, {
661
+ ...rest,
662
+ "data-slot": "statusbar",
663
+ className: tx("panel.statusbar", {
664
+ size
665
+ }, className),
666
+ ref: forwardedRef
667
+ }, children);
668
+ });
669
+ PanelStatusbar.displayName = "Panel.Statusbar";
670
+ var Panel = {
671
+ Root: PanelRoot,
672
+ Toolbar: PanelToolbar,
673
+ Content: PanelContent,
674
+ Statusbar: PanelStatusbar
675
+ };
676
+
677
+ // src/components/Image/Image.tsx
678
+ import React14, { useCallback as useCallback3, useRef, useState as useState3 } from "react";
679
+ import { mx as mx5 } from "@dxos/ui-theme";
680
+ var cache = /* @__PURE__ */ new Map();
681
+ var Image = ({ classNames, src, alt = "", fit = "contain", crossOrigin = "anonymous", sampleSize = 64, contrast = 0.9 }) => {
682
+ const [crossOriginState, setCrossOriginState] = useState3(crossOrigin);
683
+ const [dominantColor, setDominantColor] = useState3(void 0);
684
+ const [imageLoaded, setImageLoaded] = useState3(false);
685
+ const canvasRef = useRef(null);
686
+ const handleImageError = () => {
687
+ setCrossOriginState(void 0);
688
+ };
689
+ const handleImageLoad = useCallback3(({ target }) => {
690
+ const rgb = cache.get(src);
691
+ if (rgb) {
692
+ setDominantColor(rgb);
693
+ setImageLoaded(true);
694
+ return;
695
+ }
696
+ const img = target;
697
+ if (!canvasRef.current) {
698
+ return;
699
+ }
700
+ try {
701
+ const color = extractDominantColor(canvasRef.current, img, {
702
+ sampleSize,
703
+ contrast
704
+ });
705
+ if (color) {
706
+ const rgb2 = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
707
+ cache.set(src, rgb2);
708
+ setDominantColor(rgb2);
709
+ }
710
+ } catch {
711
+ setCrossOriginState(void 0);
712
+ }
713
+ setImageLoaded(true);
714
+ }, [
715
+ sampleSize,
716
+ contrast,
717
+ src
718
+ ]);
719
+ return /* @__PURE__ */ React14.createElement("div", {
720
+ // `isolate` (`isolation: isolate`) creates a new stacking context so
721
+ // the inner <img>'s `z-10` stays scoped to this wrapper. Without it
722
+ // the z-10 leaks into the parent's stacking context and elevates the
723
+ // image above any pseudo-element rings (e.g. Focus.Item's
724
+ // `dx-ring-pseudo` `::after`) painted on ancestors — most visibly,
725
+ // the focus ring on a Card containing a Card.Poster.
726
+ className: mx5(`relative flex w-full justify-center overflow-hidden transition-all duration-700 isolate`, classNames),
727
+ style: {
728
+ backgroundColor: dominantColor
729
+ }
730
+ }, /* @__PURE__ */ React14.createElement("canvas", {
731
+ ref: canvasRef,
732
+ style: {
733
+ display: "none"
734
+ },
735
+ "aria-hidden": "true"
736
+ }), /* @__PURE__ */ React14.createElement("div", {
737
+ className: "absolute inset-0 pointer-events-none",
738
+ style: {
739
+ background: dominantColor ? `radial-gradient(circle at center, transparent 30%, ${dominantColor} 100%)` : void 0,
740
+ transition: "opacity 0.7s ease-in-out",
741
+ opacity: 0.5
742
+ }
743
+ }), /* @__PURE__ */ React14.createElement("img", {
744
+ src,
745
+ alt,
746
+ crossOrigin: crossOriginState,
747
+ onError: handleImageError,
748
+ onLoad: handleImageLoad,
749
+ className: mx5("z-10 transition-opacity duration-500", fit === "cover" ? "w-full h-full object-cover" : "object-contain"),
750
+ style: {
751
+ opacity: imageLoaded ? 1 : 0
752
+ }
753
+ }));
754
+ };
755
+ var extractDominantColor = (canvas, img, { sampleSize = 64, contrast = 0.95 }) => {
756
+ const ctx = canvas.getContext("2d");
757
+ if (!ctx) {
758
+ return null;
759
+ }
760
+ canvas.width = sampleSize;
761
+ canvas.height = sampleSize;
762
+ ctx.drawImage(img, 0, 0, sampleSize, sampleSize);
763
+ const imageData = ctx.getImageData(0, 0, sampleSize, sampleSize);
764
+ const pixels = imageData.data;
765
+ if (isTransparent(pixels, sampleSize)) {
766
+ return null;
767
+ }
768
+ let r = 0;
769
+ let g = 0;
770
+ let b = 0;
771
+ let totalWeight = 0;
772
+ const cornerSize = Math.floor(sampleSize * 0.125);
773
+ for (let y = 0; y < sampleSize; y++) {
774
+ for (let x = 0; x < sampleSize; x++) {
775
+ const isInTopLeft = x < cornerSize && y < cornerSize;
776
+ const isInTopRight = x >= sampleSize - cornerSize && y < cornerSize;
777
+ const isInBottomLeft = x < cornerSize && y >= sampleSize - cornerSize;
778
+ const isInBottomRight = x >= sampleSize - cornerSize && y >= sampleSize - cornerSize;
779
+ if (!isInTopLeft && !isInTopRight && !isInBottomLeft && !isInBottomRight) {
780
+ continue;
781
+ }
782
+ const i = (y * sampleSize + x) * 4;
783
+ const red = pixels[i];
784
+ const green = pixels[i + 1];
785
+ const blue = pixels[i + 2];
786
+ const alpha = pixels[i + 3];
787
+ if (alpha === 0) {
788
+ continue;
789
+ }
790
+ const max = Math.max(red, green, blue);
791
+ const min = Math.min(red, green, blue);
792
+ const saturation = max === 0 ? 0 : (max - min) / max;
793
+ const weight = 1 + saturation * 2;
794
+ r += red * weight;
795
+ g += green * weight;
796
+ b += blue * weight;
797
+ totalWeight += weight;
798
+ }
799
+ }
800
+ if (totalWeight > 0) {
801
+ r = Math.round(Math.round(r / totalWeight) * contrast);
802
+ g = Math.round(Math.round(g / totalWeight) * contrast);
803
+ b = Math.round(Math.round(b / totalWeight) * contrast);
804
+ return [
805
+ r,
806
+ g,
807
+ b
808
+ ];
809
+ }
810
+ return null;
811
+ };
812
+ var isTransparent = (pixels, sampleSize, threshold = 0.5) => {
813
+ let edgeTransparentPixels = 0;
814
+ const edgePixels = sampleSize * 4 - 4;
815
+ for (let x = 0; x < sampleSize; x++) {
816
+ const topIndex = x * 4;
817
+ if (pixels[topIndex + 3] === 0) {
818
+ edgeTransparentPixels++;
819
+ }
820
+ const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
821
+ if (pixels[bottomIndex + 3] === 0) {
822
+ edgeTransparentPixels++;
823
+ }
824
+ }
825
+ for (let y = 1; y < sampleSize - 1; y++) {
826
+ const leftIndex = y * sampleSize * 4;
827
+ if (pixels[leftIndex + 3] === 0) {
828
+ edgeTransparentPixels++;
829
+ }
830
+ const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
831
+ if (pixels[rightIndex + 3] === 0) {
832
+ edgeTransparentPixels++;
833
+ }
834
+ }
835
+ return edgeTransparentPixels / edgePixels > threshold;
836
+ };
837
+
838
+ // src/components/Toolbar/Toolbar.tsx
839
+ import { Primitive as Primitive11 } from "@radix-ui/react-primitive";
840
+ import { Slot as Slot11 } from "@radix-ui/react-slot";
841
+ import * as ToolbarPrimitive from "@radix-ui/react-toolbar";
842
+ import React18, { forwardRef as forwardRef12 } from "react";
843
+ import { useTranslation as useTranslation2 } from "react-i18next";
844
+ import { composable as composable2, composableProps as composableProps6, slottable as slottable5 } from "@dxos/ui-theme";
845
+ import { translationKey as translationKey2 } from "#translations";
846
+
847
+ // src/components/Menu/ContextMenu.tsx
848
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
849
+ import { Primitive as Primitive9 } from "@radix-ui/react-primitive";
850
+ import { Slot as Slot9 } from "@radix-ui/react-slot";
851
+ import React15, { forwardRef as forwardRef9 } from "react";
852
+ var ContextMenuRoot = ContextMenuPrimitive.ContextMenu;
853
+ var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
854
+ var ContextMenuPortal = ContextMenuPrimitive.Portal;
855
+ var ContextMenuContent = /* @__PURE__ */ forwardRef9(({ classNames, children, collisionPadding = 8, ...props }, forwardedRef) => {
856
+ const { tx } = useThemeContext();
857
+ const elevation = useElevationContext();
858
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
859
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Content, {
860
+ ...props,
861
+ "data-arrow-keys": "up down",
862
+ collisionPadding: safeCollisionPadding,
863
+ className: tx("menu.content", {
864
+ elevation
865
+ }, classNames),
866
+ ref: forwardedRef
867
+ }, children);
868
+ });
869
+ var ContextMenuViewport = /* @__PURE__ */ forwardRef9(({ classNames, asChild, children, ...props }, forwardedRef) => {
870
+ const { tx } = useThemeContext();
871
+ const Comp = asChild ? Slot9 : Primitive9.div;
872
+ return /* @__PURE__ */ React15.createElement(Comp, {
873
+ ...props,
874
+ className: tx("menu.viewport", {}, classNames),
875
+ ref: forwardedRef
876
+ }, children);
877
+ });
878
+ var ContextMenuArrow = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
879
+ const { tx } = useThemeContext();
880
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Arrow, {
881
+ ...props,
882
+ className: tx("menu.arrow", {}, classNames),
883
+ ref: forwardedRef
884
+ });
885
+ });
886
+ var ContextMenuGroup = ContextMenuPrimitive.Group;
887
+ var ContextMenuItemIndicator = ContextMenuPrimitive.ItemIndicator;
888
+ var ContextMenuItem = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
889
+ const { tx } = useThemeContext();
890
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Item, {
891
+ ...props,
892
+ className: tx("menu.item", {}, classNames),
893
+ ref: forwardedRef
894
+ });
895
+ });
896
+ var ContextMenuCheckboxItem = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
897
+ const { tx } = useThemeContext();
898
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.CheckboxItem, {
899
+ ...props,
900
+ className: tx("menu.item", {}, classNames),
901
+ ref: forwardedRef
902
+ });
903
+ });
904
+ var ContextMenuSeparator = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
905
+ const { tx } = useThemeContext();
906
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Separator, {
907
+ ...props,
908
+ className: tx("menu.separator", {}, classNames),
909
+ ref: forwardedRef
910
+ });
911
+ });
912
+ var ContextMenuGroupLabel = /* @__PURE__ */ forwardRef9(({ classNames, ...props }, forwardedRef) => {
913
+ const { tx } = useThemeContext();
914
+ return /* @__PURE__ */ React15.createElement(ContextMenuPrimitive.Label, {
915
+ ...props,
916
+ className: tx("menu.groupLabel", {}, classNames),
917
+ ref: forwardedRef
918
+ });
919
+ });
920
+ var ContextMenu2 = {
921
+ Root: ContextMenuRoot,
922
+ Trigger: ContextMenuTrigger,
923
+ Portal: ContextMenuPortal,
924
+ Content: ContextMenuContent,
925
+ Viewport: ContextMenuViewport,
926
+ Arrow: ContextMenuArrow,
927
+ Group: ContextMenuGroup,
928
+ Item: ContextMenuItem,
929
+ CheckboxItem: ContextMenuCheckboxItem,
930
+ ItemIndicator: ContextMenuItemIndicator,
931
+ Separator: ContextMenuSeparator,
932
+ GroupLabel: ContextMenuGroupLabel
933
+ };
934
+
935
+ // src/components/Menu/DropdownMenu.tsx
936
+ import { composeEventHandlers } from "@radix-ui/primitive";
937
+ import { composeRefs } from "@radix-ui/react-compose-refs";
938
+ import { createContextScope } from "@radix-ui/react-context";
939
+ import { useId as useId2 } from "@radix-ui/react-id";
940
+ import * as MenuPrimitive from "@radix-ui/react-menu";
941
+ import { createMenuScope } from "@radix-ui/react-menu";
942
+ import { Primitive as Primitive10 } from "@radix-ui/react-primitive";
943
+ import { Slot as Slot10 } from "@radix-ui/react-slot";
944
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
945
+ import React16, { forwardRef as forwardRef10, useCallback as useCallback4, useEffect as useEffect2, useMemo as useMemo4, useRef as useRef2 } from "react";
946
+ var DROPDOWN_MENU_NAME = "DropdownMenu";
947
+ var [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(DROPDOWN_MENU_NAME, [
948
+ createMenuScope
949
+ ]);
950
+ var useMenuScope = createMenuScope();
951
+ var [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);
952
+ var DropdownMenuRoot = ({ __scopeDropdownMenu, children, dir, modal = true, open: openProp, defaultOpen, onOpenChange }) => {
953
+ const menuScope = useMenuScope(__scopeDropdownMenu);
954
+ const triggerRef = useRef2(null);
955
+ const [open = false, setOpen] = useControllableState({
956
+ prop: openProp,
957
+ defaultProp: defaultOpen,
958
+ onChange: onOpenChange
959
+ });
960
+ return /* @__PURE__ */ React16.createElement(DropdownMenuProvider, {
961
+ scope: __scopeDropdownMenu,
962
+ triggerId: useId2(),
963
+ triggerRef,
964
+ contentId: useId2(),
965
+ open,
966
+ onOpenChange: setOpen,
967
+ onOpenToggle: useCallback4(() => setOpen((prevOpen) => !prevOpen), [
968
+ setOpen
969
+ ]),
970
+ modal
971
+ }, /* @__PURE__ */ React16.createElement(MenuPrimitive.Root, {
972
+ ...menuScope,
973
+ dir,
974
+ modal,
975
+ open,
976
+ onOpenChange: setOpen
977
+ }, children));
978
+ };
979
+ DropdownMenuRoot.displayName = DROPDOWN_MENU_NAME;
980
+ var TRIGGER_NAME = "DropdownMenuTrigger";
981
+ var DropdownMenuTrigger = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
982
+ const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;
983
+ const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);
984
+ const menuScope = useMenuScope(__scopeDropdownMenu);
985
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Anchor, {
986
+ asChild: true,
987
+ ...menuScope
988
+ }, /* @__PURE__ */ React16.createElement(Primitive10.button, {
989
+ type: "button",
990
+ id: context.triggerId,
991
+ "aria-haspopup": "menu",
992
+ "aria-expanded": context.open,
993
+ "aria-controls": context.open ? context.contentId : void 0,
994
+ "data-state": context.open ? "open" : "closed",
995
+ "data-disabled": disabled ? "" : void 0,
996
+ disabled,
997
+ ...triggerProps,
998
+ ref: composeRefs(forwardedRef, context.triggerRef),
999
+ "data-arrow-keys": "down",
1000
+ onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {
1001
+ if (!disabled && event.button === 0 && event.ctrlKey === false) {
1002
+ context.onOpenToggle();
1003
+ if (!context.open) {
1004
+ event.preventDefault();
1005
+ }
1006
+ }
1007
+ }),
1008
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
1009
+ if (disabled) {
1010
+ return;
1011
+ }
1012
+ if ([
1013
+ "Enter",
1014
+ " "
1015
+ ].includes(event.key)) {
1016
+ context.onOpenToggle();
1017
+ }
1018
+ if (event.key === "ArrowDown") {
1019
+ context.onOpenChange(true);
1020
+ }
1021
+ if ([
1022
+ "Enter",
1023
+ " ",
1024
+ "ArrowDown"
1025
+ ].includes(event.key)) {
1026
+ event.preventDefault();
1027
+ }
1028
+ })
1029
+ }));
1030
+ });
1031
+ DropdownMenuTrigger.displayName = TRIGGER_NAME;
1032
+ var VIRTUAL_TRIGGER_NAME = "DropdownMenuVirtualTrigger";
1033
+ var DropdownMenuVirtualTrigger = (props) => {
1034
+ const { __scopeDropdownMenu, virtualRef } = props;
1035
+ const context = useDropdownMenuContext(VIRTUAL_TRIGGER_NAME, __scopeDropdownMenu);
1036
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1037
+ useEffect2(() => {
1038
+ if (virtualRef.current) {
1039
+ context.triggerRef.current = virtualRef.current;
1040
+ }
1041
+ });
1042
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Anchor, {
1043
+ ...menuScope,
1044
+ virtualRef
1045
+ });
1046
+ };
1047
+ DropdownMenuVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME;
1048
+ var PORTAL_NAME = "DropdownMenuPortal";
1049
+ var DropdownMenuPortal = (props) => {
1050
+ const { __scopeDropdownMenu, ...portalProps } = props;
1051
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1052
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Portal, {
1053
+ ...menuScope,
1054
+ ...portalProps
1055
+ });
1056
+ };
1057
+ DropdownMenuPortal.displayName = PORTAL_NAME;
1058
+ var DropdownMenuViewport = /* @__PURE__ */ forwardRef10(({ classNames, asChild, children, ...props }, forwardedRef) => {
1059
+ const { tx } = useThemeContext();
1060
+ const Comp = asChild ? Slot10 : Primitive10.div;
1061
+ return /* @__PURE__ */ React16.createElement(Comp, {
1062
+ ...props,
1063
+ className: tx("menu.viewport", {}, classNames),
1064
+ ref: forwardedRef
1065
+ }, children);
1066
+ });
1067
+ var CONTENT_NAME = "DropdownMenuContent";
1068
+ var DropdownMenuContent = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1069
+ const { __scopeDropdownMenu, classNames, collisionPadding = 8, collisionBoundary, ...contentProps } = props;
1070
+ const { tx } = useThemeContext();
1071
+ const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);
1072
+ const elevation = useElevationContext();
1073
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1074
+ const hasInteractedOutsideRef = useRef2(false);
1075
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
1076
+ const computedCollisionBoundary = useMemo4(() => {
1077
+ const closestBoundary = context.triggerRef.current?.closest("[data-popover-collision-boundary]");
1078
+ return closestBoundary ? Array.isArray(collisionBoundary) ? [
1079
+ closestBoundary,
1080
+ ...collisionBoundary
1081
+ ] : collisionBoundary ? [
1082
+ closestBoundary,
1083
+ collisionBoundary
1084
+ ] : [
1085
+ closestBoundary
1086
+ ] : collisionBoundary;
1087
+ }, [
1088
+ context.open,
1089
+ collisionBoundary,
1090
+ context.triggerRef.current
1091
+ ]);
1092
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Content, {
1093
+ id: context.contentId,
1094
+ "aria-labelledby": context.triggerId,
1095
+ ...menuScope,
1096
+ ...contentProps,
1097
+ collisionBoundary: computedCollisionBoundary,
1098
+ collisionPadding: safeCollisionPadding,
1099
+ ref: forwardedRef,
1100
+ onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {
1101
+ if (!hasInteractedOutsideRef.current) {
1102
+ context.triggerRef.current?.focus();
1103
+ }
1104
+ hasInteractedOutsideRef.current = false;
1105
+ event.preventDefault();
1106
+ }),
1107
+ onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {
1108
+ const originalEvent = event.detail.originalEvent;
1109
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
1110
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
1111
+ if (!context.modal || isRightClick) {
1112
+ hasInteractedOutsideRef.current = true;
1113
+ }
1114
+ }),
1115
+ "data-arrow-keys": "up down",
1116
+ className: tx("menu.content", {
1117
+ elevation
1118
+ }, classNames),
1119
+ style: {
1120
+ ...props.style,
1121
+ // re-namespace exposed content custom properties
1122
+ ...{
1123
+ "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1124
+ "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
1125
+ "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
1126
+ "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
1127
+ "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
1128
+ }
1129
+ }
1130
+ });
1131
+ });
1132
+ DropdownMenuContent.displayName = CONTENT_NAME;
1133
+ var GROUP_NAME = "DropdownMenuGroup";
1134
+ var DropdownMenuGroup = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1135
+ const { __scopeDropdownMenu, ...groupProps } = props;
1136
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1137
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Group, {
1138
+ ...menuScope,
1139
+ ...groupProps,
1140
+ ref: forwardedRef
1141
+ });
1142
+ });
1143
+ DropdownMenuGroup.displayName = GROUP_NAME;
1144
+ var LABEL_NAME = "DropdownMenuLabel";
1145
+ var DropdownMenuGroupLabel = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1146
+ const { __scopeDropdownMenu, classNames, ...labelProps } = props;
1147
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1148
+ const { tx } = useThemeContext();
1149
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Label, {
1150
+ ...menuScope,
1151
+ ...labelProps,
1152
+ className: tx("menu.groupLabel", {}, classNames),
1153
+ ref: forwardedRef
1154
+ });
1155
+ });
1156
+ DropdownMenuGroupLabel.displayName = LABEL_NAME;
1157
+ var ITEM_NAME = "DropdownMenuItem";
1158
+ var DropdownMenuItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1159
+ const { __scopeDropdownMenu, classNames, ...itemProps } = props;
1160
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1161
+ const { tx } = useThemeContext();
1162
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Item, {
1163
+ ...menuScope,
1164
+ ...itemProps,
1165
+ className: tx("menu.item", {}, classNames),
1166
+ ref: forwardedRef
1167
+ });
1168
+ });
1169
+ DropdownMenuItem.displayName = ITEM_NAME;
1170
+ var CHECKBOX_ITEM_NAME = "DropdownMenuCheckboxItem";
1171
+ var DropdownMenuCheckboxItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1172
+ const { __scopeDropdownMenu, classNames, ...checkboxItemProps } = props;
1173
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1174
+ const { tx } = useThemeContext();
1175
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.CheckboxItem, {
1176
+ ...menuScope,
1177
+ ...checkboxItemProps,
1178
+ className: tx("menu.item", {}, classNames),
1179
+ ref: forwardedRef
1180
+ });
1181
+ });
1182
+ DropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
1183
+ var RADIO_GROUP_NAME = "DropdownMenuRadioGroup";
1184
+ var DropdownMenuRadioGroup = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1185
+ const { __scopeDropdownMenu, ...radioGroupProps } = props;
1186
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1187
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.RadioGroup, {
1188
+ ...menuScope,
1189
+ ...radioGroupProps,
1190
+ ref: forwardedRef
1191
+ });
1192
+ });
1193
+ DropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;
1194
+ var RADIO_ITEM_NAME = "DropdownMenuRadioItem";
1195
+ var DropdownMenuRadioItem = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1196
+ const { __scopeDropdownMenu, classNames, ...itemProps } = props;
1197
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1198
+ const { tx } = useThemeContext();
1199
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Item, {
1200
+ ...menuScope,
1201
+ ...itemProps,
1202
+ className: tx("menu.item", {}, classNames),
1203
+ ref: forwardedRef
1204
+ });
1205
+ });
1206
+ DropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;
1207
+ var INDICATOR_NAME = "DropdownMenuItemIndicator";
1208
+ var DropdownMenuItemIndicator = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1209
+ const { __scopeDropdownMenu, ...itemIndicatorProps } = props;
1210
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1211
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.ItemIndicator, {
1212
+ ...menuScope,
1213
+ ...itemIndicatorProps,
1214
+ ref: forwardedRef
1215
+ });
1216
+ });
1217
+ DropdownMenuItemIndicator.displayName = INDICATOR_NAME;
1218
+ var SEPARATOR_NAME = "DropdownMenuSeparator";
1219
+ var DropdownMenuSeparator = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1220
+ const { __scopeDropdownMenu, classNames, ...separatorProps } = props;
1221
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1222
+ const { tx } = useThemeContext();
1223
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Separator, {
1224
+ ...menuScope,
1225
+ ...separatorProps,
1226
+ className: tx("menu.separator", {}, classNames),
1227
+ ref: forwardedRef
1228
+ });
1229
+ });
1230
+ DropdownMenuSeparator.displayName = SEPARATOR_NAME;
1231
+ var ARROW_NAME = "DropdownMenuArrow";
1232
+ var DropdownMenuArrow = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1233
+ const { __scopeDropdownMenu, classNames, ...arrowProps } = props;
1234
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1235
+ const { tx } = useThemeContext();
1236
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Arrow, {
1237
+ ...menuScope,
1238
+ ...arrowProps,
1239
+ className: tx("menu.arrow", {}, classNames),
1240
+ ref: forwardedRef
1241
+ });
1242
+ });
1243
+ DropdownMenuArrow.displayName = ARROW_NAME;
1244
+ var DropdownMenuSub = (props) => {
1245
+ const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;
1246
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1247
+ const [open = false, setOpen] = useControllableState({
1248
+ prop: openProp,
1249
+ defaultProp: defaultOpen,
1250
+ onChange: onOpenChange
1251
+ });
1252
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.Sub, {
1253
+ ...menuScope,
1254
+ open,
1255
+ onOpenChange: setOpen
1256
+ }, children);
1257
+ };
1258
+ var SUB_TRIGGER_NAME = "DropdownMenuSubTrigger";
1259
+ var DropdownMenuSubTrigger = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1260
+ const { __scopeDropdownMenu, ...subTriggerProps } = props;
1261
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1262
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.SubTrigger, {
1263
+ ...menuScope,
1264
+ ...subTriggerProps,
1265
+ ref: forwardedRef
1266
+ });
1267
+ });
1268
+ DropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;
1269
+ var SUB_CONTENT_NAME = "DropdownMenuSubContent";
1270
+ var DropdownMenuSubContent = /* @__PURE__ */ forwardRef10((props, forwardedRef) => {
1271
+ const { __scopeDropdownMenu, ...subContentProps } = props;
1272
+ const menuScope = useMenuScope(__scopeDropdownMenu);
1273
+ return /* @__PURE__ */ React16.createElement(MenuPrimitive.SubContent, {
1274
+ ...menuScope,
1275
+ ...subContentProps,
1276
+ ref: forwardedRef,
1277
+ style: {
1278
+ ...props.style,
1279
+ // re-namespace exposed content custom properties
1280
+ ...{
1281
+ "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1282
+ "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
1283
+ "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
1284
+ "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
1285
+ "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
1286
+ }
1287
+ }
1288
+ });
1289
+ });
1290
+ DropdownMenuSubContent.displayName = SUB_CONTENT_NAME;
1291
+ var DropdownMenu = {
1292
+ Root: DropdownMenuRoot,
1293
+ Trigger: DropdownMenuTrigger,
1294
+ VirtualTrigger: DropdownMenuVirtualTrigger,
1295
+ Portal: DropdownMenuPortal,
1296
+ Content: DropdownMenuContent,
1297
+ Viewport: DropdownMenuViewport,
1298
+ Group: DropdownMenuGroup,
1299
+ GroupLabel: DropdownMenuGroupLabel,
1300
+ Item: DropdownMenuItem,
1301
+ CheckboxItem: DropdownMenuCheckboxItem,
1302
+ RadioGroup: DropdownMenuRadioGroup,
1303
+ RadioItem: DropdownMenuRadioItem,
1304
+ ItemIndicator: DropdownMenuItemIndicator,
1305
+ Separator: DropdownMenuSeparator,
1306
+ Arrow: DropdownMenuArrow,
1307
+ Sub: DropdownMenuSub,
1308
+ SubTrigger: DropdownMenuSubTrigger,
1309
+ SubContent: DropdownMenuSubContent
1310
+ };
1311
+ var useDropdownMenuMenuScope = useMenuScope;
1312
+
1313
+ // src/components/Separator/Separator.tsx
1314
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
1315
+ import React17, { forwardRef as forwardRef11 } from "react";
1316
+ var Separator3 = /* @__PURE__ */ forwardRef11(({ classNames, orientation = "horizontal", subdued, ...props }, forwardedRef) => {
1317
+ const { tx } = useThemeContext();
1318
+ return /* @__PURE__ */ React17.createElement(SeparatorPrimitive.Root, {
1319
+ ...props,
1320
+ orientation,
1321
+ className: tx("separator.root", {
1322
+ orientation,
1323
+ subdued
1324
+ }, classNames),
1325
+ ref: forwardedRef
1326
+ });
1327
+ });
1328
+
1329
+ // src/components/Toolbar/Toolbar.tsx
1330
+ var ToolbarRoot = composable2(({ children, density, disabled, layoutManaged, orientation, ...props }, forwardedRef) => {
1331
+ const { className, role, ...rest } = composableProps6(props);
1332
+ const { tx } = useThemeContext();
1333
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Root, {
1334
+ ...rest,
1335
+ ...role !== "none" && {
1336
+ role
1337
+ },
1338
+ orientation,
1339
+ "data-arrow-keys": orientation === "vertical" ? "up down" : "left right",
1340
+ className: tx("toolbar.root", {
1341
+ density,
1342
+ disabled,
1343
+ layoutManaged
1344
+ }, className),
1345
+ ref: forwardedRef
1346
+ }, children);
1347
+ });
1348
+ var ToolbarText = slottable5(({ children, asChild, ...props }, forwardedRef) => {
1349
+ const { className, ...rest } = composableProps6(props);
1350
+ const Comp = asChild ? Slot11 : Primitive11.div;
1351
+ const { tx } = useThemeContext();
1352
+ return /* @__PURE__ */ React18.createElement(Comp, {
1353
+ ...rest,
1354
+ className: tx("toolbar.text", {}, className),
1355
+ ref: forwardedRef
1356
+ }, children);
1357
+ });
1358
+ var ToolbarButton = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1359
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1360
+ asChild: true
1361
+ }, /* @__PURE__ */ React18.createElement(Button, {
1362
+ ...props,
1363
+ ref: forwardedRef
1364
+ }));
1365
+ });
1366
+ var ToolbarIconButton = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1367
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1368
+ asChild: true
1369
+ }, /* @__PURE__ */ React18.createElement(IconButton, {
1370
+ ...props,
1371
+ noTooltip: true,
1372
+ ref: forwardedRef
1373
+ }));
1374
+ });
1375
+ var ToolbarToggle = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1376
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Button, {
1377
+ asChild: true
1378
+ }, /* @__PURE__ */ React18.createElement(Toggle, {
1379
+ ...props,
1380
+ ref: forwardedRef
1381
+ }));
1382
+ });
1383
+ var ToolbarLink = /* @__PURE__ */ forwardRef12((props, forwardedRef) => {
1384
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Link, {
1385
+ asChild: true
1386
+ }, /* @__PURE__ */ React18.createElement(Link, {
1387
+ ...props,
1388
+ ref: forwardedRef
1389
+ }));
1390
+ });
1391
+ var ToolbarToggleGroup2 = /* @__PURE__ */ forwardRef12(({ classNames, children, elevation, ...props }, forwardedRef) => {
1392
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleGroup, {
1393
+ ...props,
1394
+ asChild: true
1395
+ }, /* @__PURE__ */ React18.createElement(ButtonGroup, {
1396
+ classNames,
1397
+ children,
1398
+ elevation,
1399
+ ref: forwardedRef
1400
+ }));
1401
+ });
1402
+ var ToolbarToggleGroupItem = /* @__PURE__ */ forwardRef12(({ variant, density, elevation, classNames, children, ...props }, forwardedRef) => {
1403
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleItem, {
1404
+ ...props,
1405
+ asChild: true
1406
+ }, /* @__PURE__ */ React18.createElement(Button, {
1407
+ variant,
1408
+ density,
1409
+ elevation,
1410
+ classNames,
1411
+ children,
1412
+ ref: forwardedRef
1413
+ }));
1414
+ });
1415
+ var ToolbarToggleGroupIconItem = /* @__PURE__ */ forwardRef12(({ variant, density, elevation, classNames, icon, label, iconOnly, iconClassNames, ...props }, forwardedRef) => {
1416
+ return /* @__PURE__ */ React18.createElement(ToolbarPrimitive.ToolbarToggleItem, {
1417
+ ...props,
1418
+ asChild: true
1419
+ }, /* @__PURE__ */ React18.createElement(IconButton, {
1420
+ variant,
1421
+ density,
1422
+ elevation,
1423
+ classNames,
1424
+ icon,
1425
+ label,
1426
+ iconOnly,
1427
+ iconClassNames,
1428
+ ref: forwardedRef
1429
+ }));
1430
+ });
1431
+ var ToolbarSeparator = /* @__PURE__ */ forwardRef12(({ variant = "gap", ...props }, forwardedRef) => {
1432
+ return variant === "line" ? /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Separator, {
1433
+ asChild: true
1434
+ }, /* @__PURE__ */ React18.createElement(Separator3, {
1435
+ orientation: "vertical",
1436
+ ...props,
1437
+ ref: forwardedRef
1438
+ })) : /* @__PURE__ */ React18.createElement(ToolbarPrimitive.Separator, {
1439
+ className: "grow",
1440
+ ref: forwardedRef
1441
+ });
1442
+ });
1443
+ var ToolbarDragHandle = /* @__PURE__ */ forwardRef12(({ testId = "drag-handle", label }, forwardedRef) => {
1444
+ const { t } = useTranslation2(translationKey2);
1445
+ return /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1446
+ "data-testid": testId,
1447
+ tabIndex: -1,
1448
+ noTooltip: true,
1449
+ iconOnly: true,
1450
+ icon: "ph--dots-six-vertical--regular",
1451
+ variant: "ghost",
1452
+ label: label ?? t("toolbar-drag-handle.label"),
1453
+ classNames: "dx-focus-ring-none cursor-pointer",
1454
+ disabled: !forwardedRef,
1455
+ ref: forwardedRef
1456
+ });
1457
+ });
1458
+ var ToolbarCloseIconButton = /* @__PURE__ */ forwardRef12(({ onClick, label }, forwardedRef) => {
1459
+ const { t } = useTranslation2(translationKey2);
1460
+ return /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1461
+ iconOnly: true,
1462
+ icon: "ph--x--regular",
1463
+ variant: "ghost",
1464
+ label: label ?? t("toolbar-close.label"),
1465
+ classNames: "cursor-pointer",
1466
+ onClick,
1467
+ ref: forwardedRef
1468
+ });
1469
+ });
1470
+ var ToolbarMenu = ({ context, items }) => {
1471
+ const { t } = useTranslation2(translationKey2);
1472
+ return /* @__PURE__ */ React18.createElement(DropdownMenu.Root, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Trigger, {
1473
+ disabled: !items?.length,
1474
+ asChild: true
1475
+ }, /* @__PURE__ */ React18.createElement(ToolbarIconButton, {
1476
+ iconOnly: true,
1477
+ variant: "ghost",
1478
+ icon: "ph--dots-three-vertical--regular",
1479
+ label: t("toolbar-menu.label")
1480
+ })), (items?.length ?? 0) > 0 && /* @__PURE__ */ React18.createElement(DropdownMenu.Portal, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Content, null, /* @__PURE__ */ React18.createElement(DropdownMenu.Viewport, null, items?.map(({ label, onClick: onSelect }, index) => /* @__PURE__ */ React18.createElement(DropdownMenu.Item, {
1481
+ key: index,
1482
+ onSelect: () => onSelect(context)
1483
+ }, label))), /* @__PURE__ */ React18.createElement(DropdownMenu.Arrow, null))));
1484
+ };
1485
+ var Toolbar = {
1486
+ Root: ToolbarRoot,
1487
+ Text: ToolbarText,
1488
+ Button: ToolbarButton,
1489
+ IconButton: ToolbarIconButton,
1490
+ Link: ToolbarLink,
1491
+ Toggle: ToolbarToggle,
1492
+ ToggleGroup: ToolbarToggleGroup2,
1493
+ ToggleGroupItem: ToolbarToggleGroupItem,
1494
+ ToggleGroupIconItem: ToolbarToggleGroupIconItem,
1495
+ Separator: ToolbarSeparator,
1496
+ DragHandle: ToolbarDragHandle,
1497
+ CloseIconButton: ToolbarCloseIconButton,
1498
+ Menu: ToolbarMenu
1499
+ };
1500
+
1501
+ // src/components/Card/Card.tsx
1502
+ var CardContext = /* @__PURE__ */ createContext3({});
1503
+ var CARD_ROOT_NAME = "Card.Root";
1504
+ var CardRoot = composable3(({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
1505
+ const { className, ...rest } = composableProps7(props);
1506
+ const { tx } = useThemeContext();
1507
+ return /* @__PURE__ */ React19.createElement(Column.Root, {
1508
+ asChild: true,
1509
+ gutter: density === "coarse" ? "lg" : "md",
1510
+ classNames: tx("card.root", {
1511
+ border,
1512
+ fullWidth
1513
+ }, className),
1514
+ role: role ?? "group"
1515
+ }, /* @__PURE__ */ React19.createElement("div", {
1516
+ ...rest,
1517
+ ...id && {
1518
+ "data-object-id": id
1519
+ },
1520
+ ref: forwardedRef
1521
+ }, children));
1522
+ });
1523
+ CardRoot.displayName = CARD_ROOT_NAME;
1524
+ var CARD_TOOLBAR_NAME = "Card.Toolbar";
1525
+ var CardToolbar = composable3(({ children, classNames, ...props }, forwardedRef) => {
1526
+ const { tx } = useThemeContext();
1527
+ return /* @__PURE__ */ React19.createElement(Toolbar.Root, {
1528
+ ...props,
1529
+ style: iconSize(5),
1530
+ classNames: [
1531
+ tx("card.toolbar", {}),
1532
+ classNames
1533
+ ],
1534
+ ref: forwardedRef
1535
+ }, children);
1536
+ });
1537
+ CardToolbar.displayName = CARD_TOOLBAR_NAME;
1538
+ var CARD_DRAG_HANDLE_NAME = "Card.DragHandle";
1539
+ var CardDragHandle = /* @__PURE__ */ forwardRef13((props, forwardedRef) => {
1540
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1541
+ padding: true
1542
+ }, /* @__PURE__ */ React19.createElement(Toolbar.DragHandle, {
1543
+ ...props,
1544
+ ref: forwardedRef
1545
+ }));
1546
+ });
1547
+ CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
1548
+ var CARD_CLOSE_ICON_BUTTON_NAME = "Card.CloseIconButton";
1549
+ var CloseIconButton = /* @__PURE__ */ forwardRef13((props, forwardedRef) => {
1550
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1551
+ padding: true
1552
+ }, /* @__PURE__ */ React19.createElement(Toolbar.CloseIconButton, {
1553
+ ...props,
1554
+ ref: forwardedRef
1555
+ }));
1556
+ });
1557
+ CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
1558
+ var CARD_MENU_NAME = "Card.Menu";
1559
+ var CardMenu = ({ context, items, ...props }) => {
1560
+ const { menuItems } = useContext3(CardContext) ?? {};
1561
+ const combinedItems = [
1562
+ ...items ?? [],
1563
+ ...menuItems ?? []
1564
+ ];
1565
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, {
1566
+ padding: true
1567
+ }, /* @__PURE__ */ React19.createElement(Toolbar.Menu, {
1568
+ ...props,
1569
+ context,
1570
+ items: combinedItems
1571
+ }));
1572
+ };
1573
+ CardMenu.displayName = CARD_MENU_NAME;
1574
+ var CARD_ICON_NAME = "Card.Icon";
1575
+ var CardIcon = (props) => {
1576
+ return /* @__PURE__ */ React19.createElement(CardIconBlock, null, /* @__PURE__ */ React19.createElement(Icon, props));
1577
+ };
1578
+ CardIcon.displayName = CARD_ICON_NAME;
1579
+ var CARD_ICON_BLOCK_NAME = "Card.IconBlock";
1580
+ var CardIconBlock = /* @__PURE__ */ forwardRef13(({ classNames, children, padding, ...props }, forwardedRef) => {
1581
+ const { tx } = useThemeContext();
1582
+ return /* @__PURE__ */ React19.createElement("div", {
1583
+ ...props,
1584
+ className: tx("card.icon-block", {
1585
+ padding
1586
+ }, classNames),
1587
+ ref: forwardedRef
1588
+ }, children);
1589
+ });
1590
+ CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
1591
+ var CARD_TITLE_NAME = "Card.Title";
1592
+ var CardTitle = slottable6(({ children, asChild, ...props }, forwardedRef) => {
1593
+ const { tx } = useThemeContext();
1594
+ const { className, ...rest } = composableProps7(props, {
1595
+ role: "heading"
1596
+ });
1597
+ const Comp = asChild ? Slot12 : Primitive12.div;
1598
+ return /* @__PURE__ */ React19.createElement(Comp, {
1599
+ ...rest,
1600
+ className: tx("card.title", {}, className),
1601
+ ref: forwardedRef
1602
+ }, children);
1603
+ });
1604
+ CardTitle.displayName = CARD_TITLE_NAME;
1605
+ var CARD_CONTENT_NAME = "Card.Content";
1606
+ var CardContent = slottable6(({ children, asChild, ...props }, forwardedRef) => {
1607
+ const { className, ...rest } = composableProps7(props);
1608
+ const Comp = asChild ? Slot12 : Primitive12.div;
1609
+ const { tx } = useThemeContext();
1610
+ return /* @__PURE__ */ React19.createElement(Comp, {
1611
+ ...rest,
1612
+ className: tx("card.content", {}, className),
1613
+ ref: forwardedRef
1614
+ }, children);
1615
+ });
1616
+ CardContent.displayName = CARD_CONTENT_NAME;
1617
+ var CARD_ROW_NAME = "Card.Row";
1618
+ var CardRow = slottable6(({ children, asChild, icon, ...props }, forwardedRef) => {
1619
+ const { className, ...rest } = composableProps7(props);
1620
+ const Comp = asChild ? Slot12 : Primitive12.div;
1621
+ const { tx } = useThemeContext();
1622
+ return /* @__PURE__ */ React19.createElement(Comp, {
1623
+ ...rest,
1624
+ className: tx("card.row", {}, className),
1625
+ ref: forwardedRef
1626
+ }, icon && /* @__PURE__ */ React19.createElement(CardIcon, {
1627
+ classNames: "text-subdued",
1628
+ icon,
1629
+ size: 4
1630
+ }) || /* @__PURE__ */ React19.createElement("div", null), children);
1631
+ });
1632
+ CardRow.displayName = CARD_ROW_NAME;
1633
+ var CARD_SECTION_NAME = "Card.Section";
1634
+ var CardSection = slottable6(({ children, asChild, role, ...props }, forwardedRef) => {
1635
+ const { className, ...rest } = composableProps7(props);
1636
+ const Comp = asChild ? Slot12 : Primitive12.div;
1637
+ return /* @__PURE__ */ React19.createElement(Comp, {
1638
+ ...rest,
1639
+ role: role ?? "none",
1640
+ className: mx6("col-span-full", className),
1641
+ ref: forwardedRef
1642
+ }, children);
1643
+ });
1644
+ CardSection.displayName = CARD_SECTION_NAME;
1645
+ var CARD_HEADING_NAME = "Card.Heading";
1646
+ var CardHeading = slottable6(({ children, asChild, role, variant = "default", ...props }, forwardedRef) => {
1647
+ const { className, ...rest } = composableProps7(props);
1648
+ const Comp = asChild ? Slot12 : Primitive12.div;
1649
+ const { tx } = useThemeContext();
1650
+ return /* @__PURE__ */ React19.createElement(Comp, {
1651
+ ...rest,
1652
+ role: role ?? "heading",
1653
+ className: tx("card.heading", {
1654
+ variant
1655
+ }, className),
1656
+ ref: forwardedRef
1657
+ }, children);
1658
+ });
1659
+ CardHeading.displayName = CARD_HEADING_NAME;
1660
+ var CARD_TEXT_NAME = "Card.Text";
1661
+ var CardText = slottable6(({ children, asChild, role, truncate, variant = "default", ...props }, forwardedRef) => {
1662
+ const { className, ...rest } = composableProps7(props);
1663
+ const Comp = asChild ? Slot12 : Primitive12.div;
1664
+ const { tx } = useThemeContext();
1665
+ return /* @__PURE__ */ React19.createElement(Comp, {
1666
+ ...rest,
1667
+ role: role ?? "none",
1668
+ className: tx("card.text", {
1669
+ variant
1670
+ }, className),
1671
+ ref: forwardedRef
1672
+ }, /* @__PURE__ */ React19.createElement("span", {
1673
+ className: tx("card.text-span", {
1674
+ variant,
1675
+ truncate
1676
+ })
1677
+ }, children));
1678
+ });
1679
+ CardText.displayName = CARD_TEXT_NAME;
1680
+ var CARD_HTML_NAME = "Card.Html";
1681
+ var CardHtml = ({ html, variant = "default", ...props }) => {
1682
+ const { tx } = useThemeContext();
1683
+ const sanitized = useMemo5(() => DOMPurify.sanitize(html), [
1684
+ html
1685
+ ]);
1686
+ return /* @__PURE__ */ React19.createElement("div", {
1687
+ ...props,
1688
+ className: tx("card.text", {
1689
+ variant
1690
+ }),
1691
+ // eslint-disable-next-line react/no-danger
1692
+ dangerouslySetInnerHTML: {
1693
+ __html: sanitized
1694
+ }
1695
+ });
1696
+ };
1697
+ CardHtml.displayName = CARD_HTML_NAME;
1698
+ var CARD_POSTER_NAME = "Card.Poster";
1699
+ var CardPoster = (props) => {
1700
+ const { tx } = useThemeContext();
1701
+ const aspect = props.aspect === "auto" ? "aspect-auto" : "aspect-video";
1702
+ if (props.image) {
1703
+ return /* @__PURE__ */ React19.createElement("div", {
1704
+ className: "col-span-full"
1705
+ }, /* @__PURE__ */ React19.createElement(Image, {
1706
+ classNames: [
1707
+ tx("card.poster", {}),
1708
+ aspect,
1709
+ props.classNames
1710
+ ],
1711
+ src: props.image,
1712
+ alt: props.alt,
1713
+ fit: props.fit
1714
+ }));
1715
+ }
1716
+ if (props.icon) {
1717
+ return /* @__PURE__ */ React19.createElement("div", {
1718
+ role: "image",
1719
+ className: tx("card.poster-icon", {}, [
1720
+ aspect,
1721
+ props.classNames
1722
+ ]),
1723
+ "aria-label": props.alt
1724
+ }, /* @__PURE__ */ React19.createElement(Icon, {
1725
+ icon: props.icon,
1726
+ size: 10
1727
+ }));
1728
+ }
1729
+ };
1730
+ CardPoster.displayName = CARD_POSTER_NAME;
1731
+ var CARD_ACTION_NAME = "Card.Action";
1732
+ var CardAction = ({ icon, actionIcon = "ph--arrow-right--regular", label, onClick }) => {
1733
+ const { tx } = useThemeContext();
1734
+ return /* @__PURE__ */ React19.createElement(Button, {
1735
+ variant: "ghost",
1736
+ classNames: tx("card.action", {}),
1737
+ onClick
1738
+ }, icon ? /* @__PURE__ */ React19.createElement(CardIcon, {
1739
+ classNames: "text-subdued",
1740
+ icon,
1741
+ size: 4
1742
+ }) : /* @__PURE__ */ React19.createElement("div", null), /* @__PURE__ */ React19.createElement("span", {
1743
+ className: tx("card.action-label", {}, !actionIcon ? "col-span-2" : void 0)
1744
+ }, label), actionIcon && /* @__PURE__ */ React19.createElement(CardIcon, {
1745
+ icon: actionIcon,
1746
+ size: 4
1747
+ }));
1748
+ };
1749
+ CardAction.displayName = CARD_ACTION_NAME;
1750
+ var CARD_LINK_NAME = "Card.Link";
1751
+ var CardLink = ({ label, href }) => {
1752
+ const { tx } = useThemeContext();
1753
+ return /* @__PURE__ */ React19.createElement("a", {
1754
+ className: tx("card.link", {}),
1755
+ "data-variant": "ghost",
1756
+ href,
1757
+ target: "_blank",
1758
+ rel: "noreferrer"
1759
+ }, /* @__PURE__ */ React19.createElement(CardIcon, {
1760
+ classNames: "text-subdued",
1761
+ icon: "ph--link--regular"
1762
+ }), /* @__PURE__ */ React19.createElement("span", {
1763
+ className: tx("card.link-label", {})
1764
+ }, label), /* @__PURE__ */ React19.createElement(CardIcon, {
1765
+ classNames: "invisible group-hover:visible",
1766
+ icon: "ph--arrow-square-out--regular"
1767
+ }));
1768
+ };
1769
+ CardLink.displayName = CARD_LINK_NAME;
1770
+ var Card = {
1771
+ Root: CardRoot,
1772
+ // Toolbar
1773
+ Toolbar: CardToolbar,
1774
+ ToolbarIconButton: Toolbar.IconButton,
1775
+ ToolbarSeparator: Toolbar.Separator,
1776
+ // Toolbar blocks
1777
+ IconBlock: CardIconBlock,
1778
+ DragHandle: CardDragHandle,
1779
+ CloseIconButton,
1780
+ Menu: CardMenu,
1781
+ Icon: CardIcon,
1782
+ Title: CardTitle,
1783
+ // Content
1784
+ Content: CardContent,
1785
+ Row: CardRow,
1786
+ Section: CardSection,
1787
+ Heading: CardHeading,
1788
+ Text: CardText,
1789
+ Html: CardHtml,
1790
+ Poster: CardPoster,
1791
+ Action: CardAction,
1792
+ Link: CardLink
1793
+ };
1794
+
1795
+ // src/components/Carousel/Carousel.tsx
1796
+ import { useArrowNavigationGroup } from "@fluentui/react-tabster";
1797
+ import React21, { createContext as createContext4, useCallback as useCallback5, useContext as useContext4, useEffect as useEffect3, useMemo as useMemo6, useState as useState4 } from "react";
1798
+ import { mx as mx8 } from "@dxos/ui-theme";
1799
+
1800
+ // src/components/MediaPlayer/MediaPlayer.tsx
1801
+ import React20 from "react";
1802
+ import { mx as mx7 } from "@dxos/ui-theme";
1803
+ var VIDEO_EXTENSIONS = [
1804
+ ".mp4",
1805
+ ".webm",
1806
+ ".ogv",
1807
+ ".mov",
1808
+ ".m4v"
1809
+ ];
1810
+ var AUDIO_EXTENSIONS = [
1811
+ ".mp3",
1812
+ ".wav",
1813
+ ".ogg",
1814
+ ".m4a",
1815
+ ".aac",
1816
+ ".flac"
1817
+ ];
1818
+ var DEFAULT_IFRAME_SANDBOX = "allow-scripts allow-same-origin allow-presentation";
1819
+ var detectMediaKind = (src) => {
1820
+ const pathname = src.split(/[?#]/, 1)[0];
1821
+ const lower = pathname.toLowerCase();
1822
+ if (VIDEO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
1823
+ return "video";
1824
+ }
1825
+ if (AUDIO_EXTENSIONS.some((extension) => lower.endsWith(extension))) {
1826
+ return "audio";
1827
+ }
1828
+ return void 0;
1829
+ };
1830
+ var isEmbedUrl = (src) => detectMediaKind(src) !== void 0;
1831
+ var LEGACY_IFRAME_PATH_PATTERN = /\/iframe(?:[/?#]|$)/i;
1832
+ var isLegacyIframeUrl = (src) => {
1833
+ const pathAndQuery = src.split("#", 1)[0];
1834
+ return LEGACY_IFRAME_PATH_PATTERN.test(pathAndQuery);
1835
+ };
1836
+ var MediaPlayer = ({ classNames, src, kind, controls = true, autoPlay = false, loop = false, muted = false, alt, crossOrigin = "anonymous", imgClassNames, mediaClassNames }) => {
1837
+ if (isEmbedUrl(src)) {
1838
+ const resolved = kind ?? detectMediaKind(src) ?? "video";
1839
+ if (resolved === "audio") {
1840
+ return /* @__PURE__ */ React20.createElement("audio", {
1841
+ className: mx7("w-full", classNames, mediaClassNames),
1842
+ src,
1843
+ controls,
1844
+ autoPlay,
1845
+ loop,
1846
+ muted,
1847
+ crossOrigin,
1848
+ "aria-label": alt
1849
+ });
1850
+ }
1851
+ return /* @__PURE__ */ React20.createElement("video", {
1852
+ className: mx7("aspect-video max-w-full max-h-full", classNames, mediaClassNames),
1853
+ src,
1854
+ controls,
1855
+ autoPlay,
1856
+ loop,
1857
+ muted,
1858
+ crossOrigin,
1859
+ "aria-label": alt
1860
+ });
1861
+ }
1862
+ if (isLegacyIframeUrl(src)) {
1863
+ return /* @__PURE__ */ React20.createElement("iframe", {
1864
+ src,
1865
+ title: alt ?? "Embedded media",
1866
+ loading: "lazy",
1867
+ className: mx7("border-none", classNames, mediaClassNames),
1868
+ sandbox: DEFAULT_IFRAME_SANDBOX,
1869
+ referrerPolicy: "no-referrer",
1870
+ allow: "accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;",
1871
+ allowFullScreen: true
1872
+ });
1873
+ }
1874
+ return /* @__PURE__ */ React20.createElement("img", {
1875
+ src,
1876
+ alt: alt ?? "",
1877
+ loading: "lazy",
1878
+ className: mx7(classNames, imgClassNames),
1879
+ onError: (event) => {
1880
+ event.currentTarget.style.display = "none";
1881
+ }
1882
+ });
1883
+ };
1884
+
1885
+ // src/components/Carousel/Carousel.tsx
1886
+ var CarouselContext = /* @__PURE__ */ createContext4(null);
1887
+ var useCarousel = () => {
1888
+ const context = useContext4(CarouselContext);
1889
+ if (!context) {
1890
+ throw new Error("useCarousel must be used within Carousel.Root");
1891
+ }
1892
+ return context;
1893
+ };
1894
+ var CarouselRoot = ({ classNames, children, count, autorun = false, intervalMs = 5e3, defaultIndex = 0 }) => {
1895
+ const [index, setIndexState] = useState4(defaultIndex);
1896
+ const [autoAdvance, setAutoAdvance] = useState4(autorun);
1897
+ useEffect3(() => {
1898
+ if (index >= count) {
1899
+ setIndexState(0);
1900
+ }
1901
+ }, [
1902
+ count,
1903
+ index
1904
+ ]);
1905
+ useEffect3(() => {
1906
+ if (!autoAdvance || count <= 1 || intervalMs <= 0) {
1907
+ return;
1908
+ }
1909
+ const handle = setInterval(() => setIndexState((i) => (i + 1) % count), intervalMs);
1910
+ return () => clearInterval(handle);
1911
+ }, [
1912
+ autoAdvance,
1913
+ count,
1914
+ intervalMs
1915
+ ]);
1916
+ const setIndex = useCallback5((next2) => {
1917
+ setAutoAdvance(false);
1918
+ setIndexState(next2);
1919
+ }, []);
1920
+ const next = useCallback5(() => {
1921
+ setAutoAdvance(false);
1922
+ setIndexState((i) => (i + 1) % count);
1923
+ }, [
1924
+ count
1925
+ ]);
1926
+ const prev = useCallback5(() => {
1927
+ setAutoAdvance(false);
1928
+ setIndexState((i) => (i - 1 + count) % count);
1929
+ }, [
1930
+ count
1931
+ ]);
1932
+ const value = useMemo6(() => ({
1933
+ index,
1934
+ count,
1935
+ setIndex,
1936
+ next,
1937
+ prev
1938
+ }), [
1939
+ index,
1940
+ count,
1941
+ setIndex,
1942
+ next,
1943
+ prev
1944
+ ]);
1945
+ if (count === 0) {
1946
+ return null;
1947
+ }
1948
+ return /* @__PURE__ */ React21.createElement(CarouselContext.Provider, {
1949
+ value
1950
+ }, /* @__PURE__ */ React21.createElement("div", {
1951
+ className: mx8("w-full grid grid-cols-[min-content_1fr_min-content] grid-rows-[minmax(0,1fr)_auto] gap-4 items-center", classNames)
1952
+ }, children));
1953
+ };
1954
+ CarouselRoot.displayName = "Carousel.Root";
1955
+ var CarouselViewport = ({ children, classNames }) => {
1956
+ const { t } = useTranslation(translationKey);
1957
+ const { count, next, prev } = useCarousel();
1958
+ const handleKeyDown = useCallback5((event) => {
1959
+ if (count <= 1) {
1960
+ return;
1961
+ }
1962
+ if (event.key === "ArrowLeft") {
1963
+ event.preventDefault();
1964
+ prev();
1965
+ } else if (event.key === "ArrowRight") {
1966
+ event.preventDefault();
1967
+ next();
1968
+ }
1969
+ }, [
1970
+ count,
1971
+ next,
1972
+ prev
1973
+ ]);
1974
+ return /* @__PURE__ */ React21.createElement("div", {
1975
+ // TODO(burdon): Move to ui-theme.
1976
+ className: mx8("relative w-full aspect-video overflow-hidden", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500", classNames),
1977
+ tabIndex: 0,
1978
+ role: "region",
1979
+ "aria-roledescription": "carousel",
1980
+ "aria-label": t("carousel-viewport.label"),
1981
+ onKeyDown: handleKeyDown
1982
+ }, children);
1983
+ };
1984
+ CarouselViewport.displayName = "Carousel.Viewport";
1985
+ var CarouselSlide = ({ index, classNames, src, kind, alt, imgClassNames, mediaClassNames, controls, autoPlay, loop, muted, crossOrigin }) => {
1986
+ const { index: active } = useCarousel();
1987
+ if (active !== index) {
1988
+ return null;
1989
+ }
1990
+ return /* @__PURE__ */ React21.createElement("div", {
1991
+ className: mx8("absolute inset-0 w-full h-full bg-baseSurface", classNames)
1992
+ }, /* @__PURE__ */ React21.createElement(MediaPlayer, {
1993
+ src,
1994
+ kind,
1995
+ alt,
1996
+ classNames: "w-full h-full",
1997
+ imgClassNames: mx8("object-cover", imgClassNames),
1998
+ mediaClassNames,
1999
+ controls,
2000
+ autoPlay,
2001
+ loop,
2002
+ muted,
2003
+ crossOrigin
2004
+ }));
2005
+ };
2006
+ CarouselSlide.displayName = "Carousel.Slide";
2007
+ var CarouselPrevious = ({ classNames }) => {
2008
+ const { t } = useTranslation(translationKey);
2009
+ const { count, prev } = useCarousel();
2010
+ if (count <= 1) {
2011
+ return /* @__PURE__ */ React21.createElement("div", null);
2012
+ }
2013
+ return /* @__PURE__ */ React21.createElement(IconButton, {
2014
+ classNames: mx8("self-center", classNames),
2015
+ square: true,
2016
+ variant: "ghost",
2017
+ icon: "ph--caret-left--regular",
2018
+ iconOnly: true,
2019
+ label: t("carousel-prev.label"),
2020
+ onClick: prev
2021
+ });
2022
+ };
2023
+ CarouselPrevious.displayName = "Carousel.Previous";
2024
+ var CarouselNext = ({ classNames }) => {
2025
+ const { t } = useTranslation(translationKey);
2026
+ const { count, next } = useCarousel();
2027
+ if (count <= 1) {
2028
+ return /* @__PURE__ */ React21.createElement("div", null);
2029
+ }
2030
+ return /* @__PURE__ */ React21.createElement(IconButton, {
2031
+ classNames: mx8("self-center", classNames),
2032
+ square: true,
2033
+ variant: "ghost",
2034
+ icon: "ph--caret-right--regular",
2035
+ iconOnly: true,
2036
+ label: t("carousel-next.label"),
2037
+ onClick: next
2038
+ });
2039
+ };
2040
+ CarouselNext.displayName = "Carousel.Next";
2041
+ var CarouselIndicators = ({ classNames }) => {
2042
+ const { t } = useTranslation(translationKey);
2043
+ const { count, index, setIndex } = useCarousel();
2044
+ const arrowNavigationAttrs = useArrowNavigationGroup({
2045
+ axis: "horizontal",
2046
+ memorizeCurrent: true
2047
+ });
2048
+ if (count <= 1) {
2049
+ return null;
2050
+ }
2051
+ return /* @__PURE__ */ React21.createElement("div", {
2052
+ className: "col-start-2 overflow-hidden"
2053
+ }, /* @__PURE__ */ React21.createElement("div", {
2054
+ ...arrowNavigationAttrs,
2055
+ className: mx8("flex items-center justify-center", classNames),
2056
+ role: "tablist",
2057
+ "aria-label": t("carousel-indicators.label")
2058
+ }, Array.from({
2059
+ length: count
2060
+ }).map((_, i) => /* @__PURE__ */ React21.createElement(IconButton, {
2061
+ key: i,
2062
+ role: "tab",
2063
+ "aria-selected": i === index,
2064
+ classNames: i === index ? "text-primary-500" : "text-description",
2065
+ icon: i === index ? "ph--circle--fill" : "ph--circle--regular",
2066
+ iconOnly: true,
2067
+ label: t("carousel-go-to.label", {
2068
+ index: i + 1
2069
+ }),
2070
+ onClick: () => setIndex(i),
2071
+ onFocus: () => setIndex(i),
2072
+ size: 3,
2073
+ variant: "ghost"
2074
+ }))));
2075
+ };
2076
+ CarouselIndicators.displayName = "Carousel.Indicators";
2077
+ var CarouselCaption = ({ children, classNames }) => {
2078
+ const { index } = useCarousel();
2079
+ const content = children(index);
2080
+ if (content == null || content === false || content === "") {
2081
+ return null;
2082
+ }
2083
+ return (
2084
+ // TODO(burdon): Move to ui-theme.
2085
+ /* @__PURE__ */ React21.createElement("div", {
2086
+ className: "col-start-2"
2087
+ }, /* @__PURE__ */ React21.createElement("p", {
2088
+ className: mx8("text-center text-description", classNames)
2089
+ }, content))
2090
+ );
2091
+ };
2092
+ CarouselCaption.displayName = "Carousel.Caption";
2093
+ var Carousel = {
2094
+ Root: CarouselRoot,
2095
+ Viewport: CarouselViewport,
2096
+ Slide: CarouselSlide,
2097
+ Previous: CarouselPrevious,
2098
+ Next: CarouselNext,
2099
+ Indicators: CarouselIndicators,
2100
+ Caption: CarouselCaption
2101
+ };
2102
+
2103
+ // src/components/Clipboard/ClipboardProvider.tsx
2104
+ import React22, { createContext as createContext5, useCallback as useCallback6, useContext as useContext5, useState as useState5 } from "react";
2105
+ var ClipboardContext = /* @__PURE__ */ createContext5({
2106
+ textValue: "",
2107
+ setTextValue: async (_) => {
2108
+ }
2109
+ });
2110
+ var useClipboard = () => useContext5(ClipboardContext);
2111
+ var ClipboardProvider = ({ children }) => {
2112
+ const [textValue, setInternalTextValue] = useState5("");
2113
+ const setTextValue = useCallback6(async (nextValue) => {
2114
+ await navigator.clipboard.writeText(nextValue);
2115
+ return setInternalTextValue(nextValue);
2116
+ }, []);
2117
+ return /* @__PURE__ */ React22.createElement(ClipboardContext.Provider, {
2118
+ value: {
2119
+ textValue,
2120
+ setTextValue
2121
+ }
2122
+ }, children);
2123
+ };
2124
+
2125
+ // src/components/Clipboard/CopyButton.tsx
2126
+ import React23 from "react";
2127
+ import { mx as mx9, osTranslations } from "@dxos/ui-theme";
2128
+ var inactiveLabelStyles = "invisible h-px -mb-px overflow-hidden";
2129
+ var CopyButton = ({ classNames, value, size = 5, ...props }) => {
2130
+ const { t } = useTranslation(osTranslations);
2131
+ const { textValue, setTextValue } = useClipboard();
2132
+ const isCopied = textValue === value;
2133
+ return /* @__PURE__ */ React23.createElement(Button, {
2134
+ ...props,
2135
+ classNames: [
2136
+ "inline-flex flex-col justify-center",
2137
+ classNames
2138
+ ],
2139
+ onClick: () => setTextValue(value),
2140
+ "data-testid": "copy-invitation"
2141
+ }, /* @__PURE__ */ React23.createElement("div", {
2142
+ className: mx9("flex gap-1 items-center", isCopied && inactiveLabelStyles)
2143
+ }, /* @__PURE__ */ React23.createElement("span", {
2144
+ className: "px-1"
2145
+ }, t("copy.label")), /* @__PURE__ */ React23.createElement(Icon, {
2146
+ icon: "ph--copy--regular",
2147
+ size
2148
+ })), /* @__PURE__ */ React23.createElement("div", {
2149
+ className: mx9("flex gap-1 items-center", !isCopied && inactiveLabelStyles)
2150
+ }, /* @__PURE__ */ React23.createElement("span", {
2151
+ className: "px-1"
2152
+ }, t("copy-success.label")), /* @__PURE__ */ React23.createElement(Icon, {
2153
+ icon: "ph--check--regular",
2154
+ size
2155
+ })));
2156
+ };
2157
+ var CopyButtonIconOnly = ({ __scopeTooltip, value, classNames, size, variant, ...props }) => {
2158
+ const { t } = useTranslation(osTranslations);
2159
+ const { textValue, setTextValue } = useClipboard();
2160
+ const isCopied = textValue === value;
2161
+ const label = isCopied ? t("copy-success.label") : props.label ?? t("copy.label");
2162
+ const { onOpen } = useTooltipContext("CopyButton", __scopeTooltip);
2163
+ return /* @__PURE__ */ React23.createElement(IconButton, {
2164
+ iconOnly: true,
2165
+ label,
2166
+ icon: "ph--copy--regular",
2167
+ size,
2168
+ variant,
2169
+ classNames: [
2170
+ "inline-flex flex-col justify-center",
2171
+ classNames
2172
+ ],
2173
+ onClick: () => setTextValue(value).then(onOpen),
2174
+ "data-testid": "copy-invitation"
2175
+ });
2176
+ };
2177
+
2178
+ // src/components/Clipboard/index.ts
2179
+ var Clipboard = {
2180
+ Button: CopyButton,
2181
+ IconButton: CopyButtonIconOnly,
2182
+ Provider: ClipboardProvider
2183
+ };
2184
+
2185
+ // src/components/Dialog/Dialog.tsx
2186
+ import { createContext as createContext6 } from "@radix-ui/react-context";
2187
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2188
+ import { Primitive as Primitive13 } from "@radix-ui/react-primitive";
2189
+ import { Slot as Slot13 } from "@radix-ui/react-slot";
2190
+ import React24, { forwardRef as forwardRef14 } from "react";
2191
+ import { useTranslation as useTranslation3 } from "react-i18next";
2192
+ import { composableProps as composableProps8, osTranslations as osTranslations2, slottable as slottable7 } from "@dxos/ui-theme";
2193
+ var DialogRoot = (props) => /* @__PURE__ */ React24.createElement(ElevationProvider, {
2194
+ elevation: "dialog"
2195
+ }, /* @__PURE__ */ React24.createElement(DialogPrimitive.Root, {
2196
+ // NOTE: Radix warning unless set to undefined.
2197
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
2198
+ "aria-describedby": void 0,
2199
+ ...props
2200
+ }));
2201
+ var DialogTrigger = DialogPrimitive.Trigger;
2202
+ var DialogPortal = DialogPrimitive.Portal;
2203
+ var DIALOG_OVERLAY_NAME = "DialogOverlay";
2204
+ var [OverlayLayoutProvider, useOverlayLayoutContext] = createContext6(DIALOG_OVERLAY_NAME, {});
2205
+ var DialogOverlay = /* @__PURE__ */ forwardRef14(({ classNames, children, blockAlign, ...props }, forwardedRef) => {
2206
+ const { tx } = useThemeContext();
2207
+ return /* @__PURE__ */ React24.createElement(DialogPrimitive.Overlay, {
2208
+ ...props,
2209
+ "data-block-align": blockAlign,
2210
+ className: tx("dialog.overlay", {}, classNames),
2211
+ ref: forwardedRef
2212
+ }, /* @__PURE__ */ React24.createElement(OverlayLayoutProvider, {
2213
+ inOverlayLayout: true
2214
+ }, children));
2215
+ });
2216
+ DialogOverlay.displayName = DIALOG_OVERLAY_NAME;
2217
+ var DIALOG_CONTENT_NAME = "DialogContent";
2218
+ var DialogContent = /* @__PURE__ */ forwardRef14(({ classNames, children, size = "md", inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
2219
+ const { tx } = useThemeContext();
2220
+ const { inOverlayLayout } = useOverlayLayoutContext(DIALOG_CONTENT_NAME);
2221
+ return /* @__PURE__ */ React24.createElement(DialogPrimitive.Content, {
2222
+ ...props,
2223
+ // NOTE: Radix warning unless set to undefined.
2224
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
2225
+ "aria-describedby": void 0,
2226
+ className: tx("dialog.content", {
2227
+ size,
2228
+ inOverlayLayout: propsInOverlayLayout || inOverlayLayout
2229
+ }, classNames),
2230
+ ref: forwardedRef
2231
+ }, /* @__PURE__ */ React24.createElement(Column.Root, {
2232
+ classNames: "dx-expander",
2233
+ gutter: "sm"
2234
+ }, children));
2235
+ });
2236
+ DialogContent.displayName = DIALOG_CONTENT_NAME;
2237
+ var DialogHeader = slottable7(({ children, asChild, ...props }, forwardedRef) => {
2238
+ const { className, ...rest } = composableProps8(props);
2239
+ const Comp = asChild ? Slot13 : Primitive13.div;
2240
+ const { tx } = useThemeContext();
2241
+ return /* @__PURE__ */ React24.createElement(Comp, {
2242
+ ...rest,
2243
+ className: tx("dialog.header", {}, className),
2244
+ ref: forwardedRef
2245
+ }, children);
2246
+ });
2247
+ var DialogCloseIconButton = /* @__PURE__ */ forwardRef14(({ label, ...props }, forwardedRef) => {
2248
+ const { t } = useTranslation3(osTranslations2);
2249
+ return /* @__PURE__ */ React24.createElement(IconButton, {
2250
+ ...props,
2251
+ label: label ?? t("close-dialog.label"),
2252
+ icon: "ph--x--regular",
2253
+ iconOnly: true,
2254
+ size: 4,
2255
+ variant: "ghost",
2256
+ ref: forwardedRef
2257
+ });
2258
+ });
2259
+ var DialogBody = slottable7(({ children, asChild, ...props }, forwardedRef) => {
2260
+ const { className, ...rest } = composableProps8(props);
2261
+ const Comp = asChild ? Slot13 : Primitive13.div;
2262
+ const { tx } = useThemeContext();
2263
+ return /* @__PURE__ */ React24.createElement(Comp, {
2264
+ ...rest,
2265
+ className: tx("dialog.body", {}, className),
2266
+ ref: forwardedRef
2267
+ }, children);
2268
+ });
2269
+ var DialogTitle = /* @__PURE__ */ forwardRef14(({ classNames, srOnly, ...props }, forwardedRef) => {
2270
+ const { tx } = useThemeContext();
2271
+ return /* @__PURE__ */ React24.createElement(DialogPrimitive.Title, {
2272
+ ...props,
2273
+ className: tx("dialog.title", {
2274
+ srOnly
2275
+ }, classNames),
2276
+ ref: forwardedRef
2277
+ });
2278
+ });
2279
+ var DialogDescription = /* @__PURE__ */ forwardRef14(({ classNames, srOnly, ...props }, forwardedRef) => {
2280
+ const { tx } = useThemeContext();
2281
+ return /* @__PURE__ */ React24.createElement(DialogPrimitive.Description, {
2282
+ ...props,
2283
+ className: tx("dialog.description", {
2284
+ srOnly
2285
+ }, classNames),
2286
+ ref: forwardedRef
2287
+ });
2288
+ });
2289
+ var DialogActionBar = slottable7(({ children, asChild, ...props }, forwardedRef) => {
2290
+ const { className: classNames, ...rest } = composableProps8(props);
2291
+ const Comp = asChild ? Slot13 : Primitive13.div;
2292
+ const { tx } = useThemeContext();
2293
+ return /* @__PURE__ */ React24.createElement(Comp, {
2294
+ ...rest,
2295
+ className: tx("dialog.actionbar", {}, classNames),
2296
+ ref: forwardedRef
2297
+ }, children);
2298
+ });
2299
+ var DialogClose = DialogPrimitive.Close;
2300
+ var Dialog = {
2301
+ Root: DialogRoot,
2302
+ Trigger: DialogTrigger,
2303
+ Portal: DialogPortal,
2304
+ Overlay: DialogOverlay,
2305
+ Content: DialogContent,
2306
+ Header: DialogHeader,
2307
+ Body: DialogBody,
2308
+ Title: DialogTitle,
2309
+ Description: DialogDescription,
2310
+ ActionBar: DialogActionBar,
2311
+ Close: DialogClose,
2312
+ CloseIconButton: DialogCloseIconButton
2313
+ };
2314
+
2315
+ // src/components/Dialog/AlertDialog.tsx
2316
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
2317
+ import { createContext as createContext7 } from "@radix-ui/react-context";
2318
+ import React25, { forwardRef as forwardRef15 } from "react";
2319
+ var AlertDialogRoot = (props) => /* @__PURE__ */ React25.createElement(ElevationProvider, {
2320
+ elevation: "dialog"
2321
+ }, /* @__PURE__ */ React25.createElement(AlertDialogPrimitive.Root, props));
2322
+ var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2323
+ var AlertDialogPortal = AlertDialogPrimitive.Portal;
2324
+ var AlertDialogCancel = AlertDialogPrimitive.Cancel;
2325
+ var AlertDialogAction = AlertDialogPrimitive.Action;
2326
+ var ALERT_DIALOG_OVERLAY_NAME = "AlertDialogOverlay";
2327
+ var ALERT_DIALOG_CONTENT_NAME = "AlertDialogContent";
2328
+ var [OverlayLayoutProvider2, useOverlayLayoutContext2] = createContext7(ALERT_DIALOG_OVERLAY_NAME, {
2329
+ inOverlayLayout: false
2330
+ });
2331
+ var AlertDialogOverlay = /* @__PURE__ */ forwardRef15(({ classNames, children, blockAlign, ...props }, forwardedRef) => {
2332
+ const { tx } = useThemeContext();
2333
+ return /* @__PURE__ */ React25.createElement(AlertDialogPrimitive.Overlay, {
2334
+ ...props,
2335
+ "data-block-align": blockAlign,
2336
+ className: tx("dialog.overlay", {}, classNames),
2337
+ ref: forwardedRef
2338
+ }, /* @__PURE__ */ React25.createElement(OverlayLayoutProvider2, {
2339
+ inOverlayLayout: true
2340
+ }, children));
2341
+ });
2342
+ AlertDialogOverlay.displayName = ALERT_DIALOG_OVERLAY_NAME;
2343
+ var AlertDialogContent = /* @__PURE__ */ forwardRef15(({ classNames, children, size = "md", ...props }, forwardedRef) => {
2344
+ const { tx } = useThemeContext();
2345
+ const { inOverlayLayout } = useOverlayLayoutContext2(ALERT_DIALOG_CONTENT_NAME);
2346
+ return /* @__PURE__ */ React25.createElement(AlertDialogPrimitive.Content, {
2347
+ ...props,
2348
+ className: tx("dialog.content", {
2349
+ inOverlayLayout,
2350
+ size
2351
+ }, classNames),
2352
+ // NOTE: Radix warning unless set to undefined.
2353
+ // https://www.radix-ui.com/primitives/docs/components/dialog#description
2354
+ "aria-describedby": void 0,
2355
+ ref: forwardedRef
2356
+ }, /* @__PURE__ */ React25.createElement(Column.Root, {
2357
+ classNames: "dx-expander",
2358
+ gutter: "sm"
2359
+ }, children));
2360
+ });
2361
+ AlertDialogContent.displayName = ALERT_DIALOG_CONTENT_NAME;
2362
+ var AlertDialogTitle = /* @__PURE__ */ forwardRef15(({ classNames, srOnly, ...props }, forwardedRef) => {
2363
+ const { tx } = useThemeContext();
2364
+ return /* @__PURE__ */ React25.createElement(AlertDialogPrimitive.Title, {
2365
+ ...props,
2366
+ className: tx("dialog.title", {
2367
+ srOnly
2368
+ }, classNames),
2369
+ ref: forwardedRef
2370
+ });
2371
+ });
2372
+ var AlertDialogDescription = /* @__PURE__ */ forwardRef15(({ classNames, srOnly, ...props }, forwardedRef) => {
2373
+ const { tx } = useThemeContext();
2374
+ return /* @__PURE__ */ React25.createElement(AlertDialogPrimitive.Description, {
2375
+ ...props,
2376
+ className: tx("dialog.description", {
2377
+ srOnly
2378
+ }, classNames),
2379
+ ref: forwardedRef
2380
+ });
2381
+ });
2382
+ var AlertDialog = {
2383
+ Root: AlertDialogRoot,
2384
+ Trigger: AlertDialogTrigger,
2385
+ Portal: AlertDialogPortal,
2386
+ Overlay: AlertDialogOverlay,
2387
+ Content: AlertDialogContent,
2388
+ // Shared with Dialog.
2389
+ Header: Dialog.Header,
2390
+ Body: Dialog.Body,
2391
+ Title: AlertDialogTitle,
2392
+ Description: AlertDialogDescription,
2393
+ ActionBar: Dialog.ActionBar,
2394
+ CloseIconButton: Dialog.CloseIconButton,
2395
+ // AlertDialog-specific dismissal.
2396
+ Cancel: AlertDialogCancel,
2397
+ Action: AlertDialogAction
2398
+ };
2399
+
2400
+ // src/components/ErrorFallback/index.ts
2401
+ import { ErrorBoundary } from "@dxos/react-error-boundary";
2402
+
2403
+ // src/components/ErrorFallback/ErrorFallback.tsx
2404
+ import React26 from "react";
2405
+ import { safeStringify } from "@dxos/util";
2406
+ var ErrorFallback = ({ children, error, title, data }) => {
2407
+ const isDev = process.env.NODE_ENV === "development";
2408
+ const message = error instanceof Error ? error.message : String(error);
2409
+ return /* @__PURE__ */ React26.createElement("div", {
2410
+ role: "alert",
2411
+ "data-testid": "error-boundary-fallback",
2412
+ className: "flex flex-col p-4 gap-4 overflow-auto"
2413
+ }, /* @__PURE__ */ React26.createElement("h1", {
2414
+ className: "text-lg text-info-text"
2415
+ }, title ?? "Runtime Error"), /* @__PURE__ */ React26.createElement("p", null, message), isDev && error instanceof Error && /* @__PURE__ */ React26.createElement(Section, {
2416
+ title: "Stack",
2417
+ onClick: () => {
2418
+ const text = error instanceof Error ? error.stack ?? error.message : String(error);
2419
+ void navigator.clipboard.writeText(text);
2420
+ }
2421
+ }, /* @__PURE__ */ React26.createElement(ErrorStack, {
2422
+ error
2423
+ })), data && /* @__PURE__ */ React26.createElement(Section, {
2424
+ title: "Data",
2425
+ onClick: () => {
2426
+ void navigator.clipboard.writeText(JSON.stringify(data, void 0, 2));
2427
+ }
2428
+ }, /* @__PURE__ */ React26.createElement("pre", {
2429
+ className: "overflow-x-auto text-xs"
2430
+ }, safeStringify(data, void 0, 2))), children);
2431
+ };
2432
+ var Section = ({ children, title, onClick }) => {
2433
+ return /* @__PURE__ */ React26.createElement("div", {
2434
+ className: "flex flex-col gap-1"
2435
+ }, onClick && /* @__PURE__ */ React26.createElement("button", {
2436
+ type: "button",
2437
+ onClick,
2438
+ className: "flex items-center gap-1 text-xs text-subdued hover:text-primary-500 transition-colors",
2439
+ title: `Copy ${title}`
2440
+ }, /* @__PURE__ */ React26.createElement("h2", {
2441
+ className: "text-xs uppercase text-subdued"
2442
+ }, title)), children);
2443
+ };
2444
+
2445
+ // src/components/ErrorFallback/ThrowError.tsx
2446
+ import { useEffect as useEffect4, useState as useState6 } from "react";
2447
+ var ThrowError = ({ delay = 1e3, ...props }) => {
2448
+ const [error, setError] = useState6();
2449
+ useEffect4(() => {
2450
+ if (delay < 0) {
2451
+ return;
2452
+ }
2453
+ const t = setTimeout(() => {
2454
+ setError(generator({
2455
+ delay,
2456
+ ...props
2457
+ }));
2458
+ }, delay);
2459
+ return () => clearTimeout(t);
2460
+ }, [
2461
+ delay,
2462
+ generator
2463
+ ]);
2464
+ if (error) {
2465
+ throw error;
2466
+ }
2467
+ return null;
2468
+ };
2469
+ var generator = ({ error, delay }) => {
2470
+ return error?.() ?? new Error(`Error generated after ${delay}ms`);
2471
+ };
2472
+
2473
+ // src/components/Focus/Focus.tsx
2474
+ import { useArrowNavigationGroup as useArrowNavigationGroup2, useFocusableGroup, useMergedTabsterAttributes_unstable } from "@fluentui/react-tabster";
2475
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
2476
+ import { Primitive as Primitive14 } from "@radix-ui/react-primitive";
2477
+ import { Slot as Slot14 } from "@radix-ui/react-slot";
2478
+ import React27, { createContext as createContext8, useCallback as useCallback7, useContext as useContext6, useRef as useRef3, useState as useState7 } from "react";
2479
+ import { composableProps as composableProps9, slottable as slottable8 } from "@dxos/ui-theme";
2480
+ var FOCUS_STATE_ATTR = "focus-state";
2481
+ var FocusContext = /* @__PURE__ */ createContext8({});
2482
+ var useFocus = () => useContext6(FocusContext);
2483
+ var Group3 = slottable8(({ children, asChild, orientation = "vertical", border = false, ...props }, forwardedRef) => {
2484
+ const Comp = asChild ? Slot14 : Primitive14.div;
2485
+ const { tx } = useThemeContext();
2486
+ const rootRef = useRef3(null);
2487
+ const focusableGroupAttrs = useFocusableGroup({
2488
+ tabBehavior: "limited-trap-focus"
2489
+ });
2490
+ const arrowNavigationAttrs = useArrowNavigationGroup2({
2491
+ axis: orientation,
2492
+ memorizeCurrent: true
2493
+ });
2494
+ const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
2495
+ const [state, setState] = useState7();
2496
+ const [groupHasFocus, setGroupHasFocus] = useState7(false);
2497
+ const handleFocusIn = useCallback7(() => setGroupHasFocus(true), []);
2498
+ const handleFocusOut = useCallback7((event) => {
2499
+ const related = event.relatedTarget;
2500
+ if (!related || !rootRef.current?.contains(related)) {
2501
+ setGroupHasFocus(false);
2502
+ }
2503
+ }, []);
2504
+ const { className, ...rest } = composableProps9(props);
2505
+ return /* @__PURE__ */ React27.createElement(FocusContext.Provider, {
2506
+ value: {
2507
+ setFocus: setState,
2508
+ groupHasFocus
2509
+ }
2510
+ }, /* @__PURE__ */ React27.createElement(Comp, {
2511
+ ...rest,
2512
+ tabIndex: 0,
2513
+ className: tx("focus.group", {
2514
+ border
2515
+ }, className),
2516
+ ...tabsterAttrs,
2517
+ ...state && {
2518
+ [`data-${FOCUS_STATE_ATTR}`]: state
2519
+ },
2520
+ onBlur: handleFocusOut,
2521
+ onFocus: handleFocusIn,
2522
+ ref: useComposedRefs(rootRef, forwardedRef)
2523
+ }, children));
2524
+ });
2525
+ var Item4 = slottable8(({ children, asChild, current, border = false, onCurrentChange, onClick, onFocus, onBlur, ...props }, forwardedRef) => {
2526
+ const Comp = asChild ? Slot14 : Primitive14.div;
2527
+ const { tx } = useThemeContext();
2528
+ const focusableGroupAttrs = useFocusableGroup({
2529
+ ignoreDefaultKeydown: {
2530
+ Enter: true
2531
+ }
2532
+ });
2533
+ const [focused, setFocused] = useState7(false);
2534
+ const handleClick = useCallback7((event) => {
2535
+ onCurrentChange?.();
2536
+ onClick?.(event);
2537
+ }, [
2538
+ onCurrentChange,
2539
+ onClick
2540
+ ]);
2541
+ const handleKeyDown = useCallback7((event) => {
2542
+ if (event.key === "Enter") {
2543
+ onCurrentChange?.();
2544
+ }
2545
+ }, [
2546
+ onCurrentChange
2547
+ ]);
2548
+ const handleFocus = useCallback7((event) => {
2549
+ setFocused(true);
2550
+ onFocus?.(event);
2551
+ }, [
2552
+ onFocus
2553
+ ]);
2554
+ const handleBlur = useCallback7((event) => {
2555
+ setFocused(false);
2556
+ onBlur?.(event);
2557
+ }, [
2558
+ onBlur
2559
+ ]);
2560
+ const isCurrent = current ?? focused;
2561
+ const { className, ...rest } = composableProps9(props);
2562
+ return /* @__PURE__ */ React27.createElement(Comp, {
2563
+ ...rest,
2564
+ tabIndex: 0,
2565
+ className: tx("focus.item", {
2566
+ border
2567
+ }, className),
2568
+ ...focusableGroupAttrs,
2569
+ "aria-current": isCurrent || void 0,
2570
+ onClick: handleClick,
2571
+ onKeyDown: handleKeyDown,
2572
+ onFocus: handleFocus,
2573
+ onBlur: handleBlur,
2574
+ ref: forwardedRef
2575
+ }, children);
2576
+ });
2577
+ var Focus = {
2578
+ Group: Group3,
2579
+ Item: Item4
2580
+ };
2581
+
2582
+ // src/components/Input/Input.tsx
2583
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
2584
+ import { useControllableState as useControllableState2 } from "@radix-ui/react-use-controllable-state";
2585
+ import React28, { forwardRef as forwardRef16 } from "react";
2586
+ import { DescriptionAndValidation as DescriptionAndValidationPrimitive, Description as DescriptionPrimitive, INPUT_NAME, InputRoot, Label as LabelPrimitive, PinInput as PinInputPrimitive, TextArea as TextAreaPrimitive, TextInput as TextInputPrimitive, Validation as ValidationPrimitive, useInputContext } from "@dxos/react-input";
2587
+ import { mx as mx10 } from "@dxos/ui-theme";
2588
+ var Label3 = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2589
+ const { tx } = useThemeContext();
2590
+ return /* @__PURE__ */ React28.createElement(LabelPrimitive, {
2591
+ ...props,
2592
+ className: tx("input.label", {
2593
+ srOnly
2594
+ }, classNames),
2595
+ ref: forwardedRef
2596
+ }, children);
2597
+ });
2598
+ var Description3 = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2599
+ const { tx } = useThemeContext();
2600
+ return /* @__PURE__ */ React28.createElement(DescriptionPrimitive, {
2601
+ ...props,
2602
+ className: tx("input.description", {
2603
+ srOnly
2604
+ }, classNames),
2605
+ ref: forwardedRef
2606
+ }, children);
2607
+ });
2608
+ var Validation = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, children, srOnly, ...props }, forwardedRef) => {
2609
+ const { tx } = useThemeContext();
2610
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2611
+ return /* @__PURE__ */ React28.createElement(ValidationPrimitive, {
2612
+ ...props,
2613
+ className: tx("input.validation", {
2614
+ srOnly,
2615
+ validationValence
2616
+ }, classNames),
2617
+ ref: forwardedRef
2618
+ }, children);
2619
+ });
2620
+ var DescriptionAndValidation = /* @__PURE__ */ forwardRef16(({ classNames, children, srOnly, ...props }, forwardedRef) => {
2621
+ const { tx } = useThemeContext();
2622
+ return /* @__PURE__ */ React28.createElement(DescriptionAndValidationPrimitive, {
2623
+ ...props,
2624
+ className: tx("input.descriptionAndValidation", {
2625
+ srOnly
2626
+ }, classNames),
2627
+ ref: forwardedRef
2628
+ }, children);
2629
+ });
2630
+ var PinInput = /* @__PURE__ */ forwardRef16(({ classNames, density: propsDensity, elevation: propsElevation, ...props }, forwardedRef) => {
2631
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2632
+ const { tx } = useThemeContext();
2633
+ const density = useDensityContext(propsDensity);
2634
+ const elevation = useElevationContext(propsElevation);
2635
+ return /* @__PURE__ */ React28.createElement(PinInputPrimitive, {
2636
+ ...props,
2637
+ ...props.autoFocus && !hasIosKeyboard2 && {
2638
+ autoFocus: true
2639
+ },
2640
+ className: tx("input.inputWithSegments", {
2641
+ disabled: props.disabled
2642
+ }, classNames) || "",
2643
+ segmentClassName: tx("input.segment", {
2644
+ disabled: props.disabled,
2645
+ density,
2646
+ elevation
2647
+ }) || "",
2648
+ ref: forwardedRef
2649
+ });
2650
+ });
2651
+ var TextInput = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, density: densityProp, elevation: elevationProp, variant, noAutoFill, ...props }, forwardedRef) => {
2652
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2653
+ const { tx } = useThemeContext();
2654
+ const density = useDensityContext(densityProp);
2655
+ const elevation = useElevationContext(elevationProp);
2656
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2657
+ return /* @__PURE__ */ React28.createElement(TextInputPrimitive, {
2658
+ ...props,
2659
+ "data-1p-ignore": noAutoFill,
2660
+ className: tx("input.input", {
2661
+ variant,
2662
+ disabled: props.disabled,
2663
+ density,
2664
+ elevation,
2665
+ validationValence
2666
+ }, classNames),
2667
+ ...props.autoFocus && !hasIosKeyboard2 && {
2668
+ autoFocus: true
2669
+ },
2670
+ ref: forwardedRef
2671
+ });
2672
+ });
2673
+ var TextArea = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, density: propsDensity, elevation: propsElevation, variant, ...props }, forwardedRef) => {
2674
+ const { hasIosKeyboard: hasIosKeyboard2 } = useThemeContext();
2675
+ const { tx } = useThemeContext();
2676
+ const density = useDensityContext(propsDensity);
2677
+ const elevation = useElevationContext(propsElevation);
2678
+ const { validationValence } = useInputContext(INPUT_NAME, __inputScope);
2679
+ return /* @__PURE__ */ React28.createElement(TextAreaPrimitive, {
2680
+ ...props,
2681
+ className: tx("input.textArea", {
2682
+ variant,
2683
+ disabled: props.disabled,
2684
+ density,
2685
+ elevation,
2686
+ validationValence
2687
+ }, classNames),
2688
+ ...props.autoFocus && !hasIosKeyboard2 && {
2689
+ autoFocus: true
2690
+ },
2691
+ ref: forwardedRef
2692
+ });
2693
+ });
2694
+ var Checkbox = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, checked: propsChecked, defaultChecked: propsDefaultChecked, onCheckedChange: propsOnCheckedChange, size, ...props }, forwardedRef) => {
2695
+ const [checked, onCheckedChange] = useControllableState2({
2696
+ prop: propsChecked,
2697
+ defaultProp: propsDefaultChecked,
2698
+ onChange: propsOnCheckedChange
2699
+ });
2700
+ const { id, validationValence, descriptionId, errorMessageId } = useInputContext(INPUT_NAME, __inputScope);
2701
+ const { tx } = useThemeContext();
2702
+ return /* @__PURE__ */ React28.createElement(CheckboxPrimitive.Root, {
2703
+ ...props,
2704
+ checked,
2705
+ onCheckedChange,
2706
+ id,
2707
+ "aria-describedby": descriptionId,
2708
+ ...validationValence === "error" && {
2709
+ "aria-invalid": "true",
2710
+ "aria-errormessage": errorMessageId
2711
+ },
2712
+ className: tx("input.checkbox", {
2713
+ size
2714
+ }, "shrink-0", classNames),
2715
+ ref: forwardedRef
2716
+ }, /* @__PURE__ */ React28.createElement(Icon, {
2717
+ icon: checked === "indeterminate" ? "ph--minus--regular" : "ph--check--regular",
2718
+ classNames: tx("input.checkboxIndicator", {
2719
+ size,
2720
+ checked
2721
+ })
2722
+ }));
2723
+ });
2724
+ var Switch = /* @__PURE__ */ forwardRef16(({ __inputScope, classNames, checked: propsChecked, defaultChecked: propsDefaultChecked, onCheckedChange: propsOnCheckedChange, ...props }, forwardedRef) => {
2725
+ const [checked, onCheckedChange] = useControllableState2({
2726
+ prop: propsChecked,
2727
+ defaultProp: propsDefaultChecked ?? false,
2728
+ onChange: propsOnCheckedChange
2729
+ });
2730
+ const { id, validationValence, descriptionId, errorMessageId } = useInputContext(INPUT_NAME, __inputScope);
2731
+ return /* @__PURE__ */ React28.createElement("input", {
2732
+ type: "checkbox",
2733
+ className: mx10("dx-checkbox--switch dx-focus-ring", classNames),
2734
+ checked,
2735
+ onChange: (event) => {
2736
+ onCheckedChange(event.target.checked);
2737
+ },
2738
+ id,
2739
+ "aria-describedby": descriptionId,
2740
+ ...props,
2741
+ ...validationValence === "error" && {
2742
+ "aria-invalid": "true",
2743
+ "aria-errormessage": errorMessageId
2744
+ },
2745
+ ref: forwardedRef
2746
+ });
2747
+ });
2748
+ var Input = {
2749
+ Root: InputRoot,
2750
+ PinInput,
2751
+ TextInput,
2752
+ TextArea,
2753
+ Checkbox,
2754
+ Switch,
2755
+ Label: Label3,
2756
+ Description: Description3,
2757
+ Validation,
2758
+ DescriptionAndValidation
2759
+ };
2760
+
2761
+ // src/components/List/List.tsx
2762
+ import { Primitive as Primitive15 } from "@radix-ui/react-primitive";
2763
+ import { Slot as Slot15 } from "@radix-ui/react-slot";
2764
+ import React30, { forwardRef as forwardRef17 } from "react";
2765
+ import { LIST_ITEM_NAME, LIST_NAME, ListItemCollapsibleContent, List as ListPrimitive, ListItem as ListPrimitiveItem, ListItemHeading as ListPrimitiveItemHeading, ListItemOpenTrigger as ListPrimitiveItemOpenTrigger, useListContext, useListItemContext } from "@dxos/react-list";
2766
+ import { composable as composable4, composableProps as composableProps10 } from "@dxos/ui-theme";
2767
+
2768
+ // src/components/List/ListDropIndicator.tsx
2769
+ import React29 from "react";
2770
+ var edgeToOrientationMap = {
2771
+ top: "horizontal",
2772
+ bottom: "horizontal",
2773
+ left: "vertical",
2774
+ right: "vertical"
2775
+ };
2776
+ var orientationStyles = {
2777
+ horizontal: "h-(--line-thickness) left-[calc(var(--line-inset)+var(--terminal-radius))] right-(--line-inset) before:left-(--terminal-inset)",
2778
+ vertical: "w-(--line-thickness) top-[calc(var(--line-inset)+var(--terminal-radius))] bottom-(--line-inset) before:top-(--terminal-inset)"
2779
+ };
2780
+ var edgeStyles = {
2781
+ top: "top-(--line-offset) before:top-(--offset-terminal)",
2782
+ right: "right-(--line-offset) before:right-(--offset-terminal)",
2783
+ bottom: "bottom-(--line-offset) before:bottom-(--offset-terminal)",
2784
+ left: "left-(--line-offset) before:left-(--offset-terminal)"
2785
+ };
2786
+ var strokeSize = 2;
2787
+ var terminalSize = 8;
2788
+ var offsetToAlignTerminalWithLine = (strokeSize - terminalSize) / 2;
2789
+ var ListDropIndicator = ({ edge, gap = 0, lineInset = 0, terminalInset = lineInset - terminalSize }) => {
2790
+ const orientation = edgeToOrientationMap[edge];
2791
+ return /* @__PURE__ */ React29.createElement("div", {
2792
+ style: {
2793
+ "--line-thickness": `${strokeSize}px`,
2794
+ "--line-offset": `calc(-0.5 * (${gap}px + ${strokeSize}px))`,
2795
+ "--line-inset": `${lineInset}px`,
2796
+ "--terminal-size": `${terminalSize}px`,
2797
+ "--terminal-radius": `${terminalSize / 2}px`,
2798
+ "--terminal-inset": `${terminalInset}px`,
2799
+ "--offset-terminal": `${offsetToAlignTerminalWithLine}px`
2800
+ },
2801
+ className: `absolute z-10 pointer-events-none bg-accent-surface before:content-[''] before:w-(--terminal-size) before:h-(--terminal-size) box-border before:absolute before:border-[length:--line-thickness] before:border-solid before:border-accent-surface before:rounded-full ${orientationStyles[orientation]} ${edgeStyles[edge]}`
2802
+ });
2803
+ };
2804
+
2805
+ // src/components/List/List.tsx
2806
+ var List = composable4(({ children, ...props }, forwardedRef) => {
2807
+ const { tx } = useThemeContext();
2808
+ const density = useDensityContext(props.density);
2809
+ const { className, ...rest } = composableProps10(props);
2810
+ return /* @__PURE__ */ React30.createElement(DensityProvider, {
2811
+ density
2812
+ }, /* @__PURE__ */ React30.createElement(ListPrimitive, {
2813
+ ...rest,
2814
+ className: tx("list.root", {}, className),
2815
+ ref: forwardedRef
2816
+ }, children));
2817
+ });
2818
+ var ListItemEndcap = /* @__PURE__ */ forwardRef17(({ children, classNames, asChild, ...props }, forwardedRef) => {
2819
+ const Comp = asChild ? Slot15 : Primitive15.div;
2820
+ const density = useDensityContext();
2821
+ const { tx } = useThemeContext();
2822
+ return /* @__PURE__ */ React30.createElement(Comp, {
2823
+ ...!asChild && {
2824
+ role: "none"
2825
+ },
2826
+ ...props,
2827
+ className: tx("list.item.endcap", {
2828
+ density
2829
+ }, classNames),
2830
+ ref: forwardedRef
2831
+ }, children);
2832
+ });
2833
+ var MockListItemOpenTrigger = ({ classNames, ...props }) => {
2834
+ const density = useDensityContext();
2835
+ const { tx } = useThemeContext();
2836
+ return /* @__PURE__ */ React30.createElement("div", {
2837
+ ...props,
2838
+ className: tx("list.item.openTrigger", {
2839
+ density
2840
+ }, classNames)
2841
+ });
2842
+ };
2843
+ var ListItemHeading = /* @__PURE__ */ forwardRef17(({ children, classNames, ...props }, forwardedRef) => {
2844
+ const { tx } = useThemeContext();
2845
+ const density = useDensityContext();
2846
+ return /* @__PURE__ */ React30.createElement(ListPrimitiveItemHeading, {
2847
+ ...props,
2848
+ className: tx("list.item.heading", {
2849
+ density
2850
+ }, classNames),
2851
+ ref: forwardedRef
2852
+ }, /* @__PURE__ */ React30.createElement("span", null, children));
2853
+ });
2854
+ var ListItemOpenTrigger = /* @__PURE__ */ forwardRef17(({ __listItemScope, classNames, children, ...props }, forwardedRef) => {
2855
+ const { tx } = useThemeContext();
2856
+ const density = useDensityContext();
2857
+ const { open } = useListItemContext(LIST_ITEM_NAME, __listItemScope);
2858
+ return /* @__PURE__ */ React30.createElement(ListPrimitiveItemOpenTrigger, {
2859
+ ...props,
2860
+ className: tx("list.item.openTrigger", {
2861
+ density
2862
+ }, classNames),
2863
+ ref: forwardedRef
2864
+ }, children || /* @__PURE__ */ React30.createElement(Icon, {
2865
+ size: 3,
2866
+ icon: open ? "ph--caret-down--bold" : "ph--caret-right--bold",
2867
+ classNames: tx("list.item.openTriggerIcon", {})
2868
+ }));
2869
+ });
2870
+ var ListItemRoot = /* @__PURE__ */ forwardRef17(({ classNames, children, ...props }, forwardedRef) => {
2871
+ const { tx } = useThemeContext();
2872
+ const density = useDensityContext();
2873
+ return /* @__PURE__ */ React30.createElement(ListPrimitiveItem, {
2874
+ ...props,
2875
+ className: tx("list.item.root", {
2876
+ density,
2877
+ collapsible: props.collapsible
2878
+ }, classNames),
2879
+ ref: forwardedRef
2880
+ }, children);
2881
+ });
2882
+ var ListItem = {
2883
+ Root: ListItemRoot,
2884
+ Endcap: ListItemEndcap,
2885
+ Heading: ListItemHeading,
2886
+ OpenTrigger: ListItemOpenTrigger,
2887
+ CollapsibleContent: ListItemCollapsibleContent,
2888
+ MockOpenTrigger: MockListItemOpenTrigger,
2889
+ DropIndicator: ListDropIndicator
2890
+ };
2891
+
2892
+ // src/components/List/Tree.tsx
2893
+ import React32, { forwardRef as forwardRef18 } from "react";
2894
+
2895
+ // src/components/List/TreeDropIndicator.tsx
2896
+ import React31 from "react";
2897
+ var edgeToOrientationMap2 = {
2898
+ "reorder-above": "sibling",
2899
+ "reorder-below": "sibling",
2900
+ "make-child": "child",
2901
+ reparent: "child"
2902
+ };
2903
+ var orientationStyles2 = {
2904
+ // TODO(wittjosiah): Stop using left/right here.
2905
+ sibling: "h-(--line-thickness) left-(--horizontal-indent) right-0 bg-accent-surface before:left-(--negative-terminal-size)",
2906
+ child: "inset-0 border-[length:var(--line-thickness)] before:invisible"
2907
+ };
2908
+ var instructionStyles = {
2909
+ "reorder-above": "top-(--line-offset) before:top-(--offset-terminal)",
2910
+ "reorder-below": "bottom-(--line-offset) before:bottom-(--offset-terminal)",
2911
+ "make-child": "border-accent-surface",
2912
+ // TODO(wittjosiah): This is not occurring in the current implementation.
2913
+ reparent: ""
2914
+ };
2915
+ var strokeSize2 = 2;
2916
+ var terminalSize2 = 8;
2917
+ var offsetToAlignTerminalWithLine2 = (strokeSize2 - terminalSize2) / 2;
2918
+ var TreeDropIndicator = ({ instruction, gap = 0 }) => {
2919
+ const lineOffset = `calc(-0.5 * (${gap}px + ${strokeSize2}px))`;
2920
+ const isBlocked = instruction.type === "instruction-blocked";
2921
+ const desiredInstruction = isBlocked ? instruction.desired : instruction;
2922
+ const orientation = edgeToOrientationMap2[desiredInstruction.type];
2923
+ if (isBlocked) {
2924
+ return null;
2925
+ }
2926
+ return /* @__PURE__ */ React31.createElement("div", {
2927
+ style: {
2928
+ "--line-thickness": `${strokeSize2}px`,
2929
+ "--line-offset": `${lineOffset}`,
2930
+ "--terminal-size": `${terminalSize2}px`,
2931
+ "--terminal-radius": `${terminalSize2 / 2}px`,
2932
+ "--negative-terminal-size": `-${terminalSize2}px`,
2933
+ "--offset-terminal": `${offsetToAlignTerminalWithLine2}px`,
2934
+ "--horizontal-indent": `${desiredInstruction.currentLevel * desiredInstruction.indentPerLevel + 4}px`
2935
+ },
2936
+ className: `absolute z-10 pointer-events-none before:w-(--terminal-size) before:h-(--terminal-size) box-border before:absolute before:border-[length:--line-thickness] before:border-solid before:border-accent-surface before:rounded-full ${orientationStyles2[orientation]} ${instructionStyles[desiredInstruction.type]}`
2937
+ });
2938
+ };
2939
+
2940
+ // src/components/List/Tree.tsx
2941
+ var TreeRoot = /* @__PURE__ */ forwardRef18((props, forwardedRef) => {
2942
+ return /* @__PURE__ */ React32.createElement(List, {
2943
+ ...props,
2944
+ ref: forwardedRef
2945
+ });
2946
+ });
2947
+ var TreeBranch = /* @__PURE__ */ forwardRef18(({ __listScope, ...props }, forwardedRef) => {
2948
+ const { headingId } = useListItemContext(LIST_ITEM_NAME, __listScope);
2949
+ return /* @__PURE__ */ React32.createElement(List, {
2950
+ ...props,
2951
+ "aria-labelledby": headingId,
2952
+ ref: forwardedRef
2953
+ });
2954
+ });
2955
+ var TreeItemRoot = /* @__PURE__ */ forwardRef18((props, forwardedRef) => {
2956
+ return /* @__PURE__ */ React32.createElement(ListItem.Root, {
2957
+ role: "treeitem",
2958
+ ...props,
2959
+ ref: forwardedRef
2960
+ });
2961
+ });
2962
+ var TreeItemHeading = ListItem.Heading;
2963
+ var TreeItemOpenTrigger = ListItem.OpenTrigger;
2964
+ var MockTreeItemOpenTrigger = ListItem.MockOpenTrigger;
2965
+ var TreeItemBody = ListItem.CollapsibleContent;
2966
+ var Tree = {
2967
+ Root: TreeRoot,
2968
+ Branch: TreeBranch
2969
+ };
2970
+ var TreeItem = {
2971
+ Root: TreeItemRoot,
2972
+ Heading: TreeItemHeading,
2973
+ Body: TreeItemBody,
2974
+ OpenTrigger: TreeItemOpenTrigger,
2975
+ MockOpenTrigger: MockTreeItemOpenTrigger,
2976
+ DropIndicator: TreeDropIndicator
2977
+ };
2978
+
2979
+ // src/components/List/Treegrid.tsx
2980
+ import { useFocusFinders } from "@fluentui/react-tabster";
2981
+ import { createContextScope as createContextScope2 } from "@radix-ui/react-context";
2982
+ import { Primitive as Primitive16 } from "@radix-ui/react-primitive";
2983
+ import { Slot as Slot16 } from "@radix-ui/react-slot";
2984
+ import { useControllableState as useControllableState3 } from "@radix-ui/react-use-controllable-state";
2985
+ import React33, { forwardRef as forwardRef19, useCallback as useCallback8 } from "react";
2986
+ import { composable as composable5, composableProps as composableProps11 } from "@dxos/ui-theme";
2987
+ var TREEGRID_ROW_NAME = "TreegridRow";
2988
+ var [createTreegridRowContext, createTreegridRowScope] = createContextScope2(TREEGRID_ROW_NAME, []);
2989
+ var [TreegridRowProvider, useTreegridRowContext] = createTreegridRowContext(TREEGRID_ROW_NAME);
2990
+ var TREEGRID_PATH_SEPARATOR = "~";
2991
+ var TREEGRID_PARENT_OF_SEPARATOR = " ";
2992
+ var TreegridRoot = composable5(({ asChild, classNames, children, style, gridTemplateColumns, onKeyDown: onKeyDownProp, ...props }, forwardedRef) => {
2993
+ const { tx } = useThemeContext();
2994
+ const { className, role: _role, ...rest } = composableProps11(props, {
2995
+ classNames
2996
+ });
2997
+ const Comp = asChild ? Slot16 : Primitive16.div;
2998
+ const { findFirstFocusable } = useFocusFinders();
2999
+ const handleKeyDown = useCallback8((event) => {
3000
+ switch (event.key) {
3001
+ case "ArrowDown":
3002
+ case "ArrowUp": {
3003
+ const direction = event.key === "ArrowDown" ? "down" : "up";
3004
+ const target = event.target;
3005
+ const ancestorWithArrowKeys = target.closest(`[data-arrow-keys*="${direction}"], [data-arrow-keys="all"]`);
3006
+ if (!ancestorWithArrowKeys) {
3007
+ const currentRow = target.closest('[role="row"]');
3008
+ if (currentRow) {
3009
+ const treegrid = currentRow.closest('[role="treegrid"]');
3010
+ if (treegrid) {
3011
+ const rows = Array.from(treegrid.querySelectorAll('[role="row"]'));
3012
+ const currentIndex = rows.indexOf(currentRow);
3013
+ const nextIndex = direction === "down" ? currentIndex + 1 : currentIndex - 1;
3014
+ const targetRow = rows[nextIndex];
3015
+ if (targetRow) {
3016
+ const firstFocusable = findFirstFocusable(targetRow);
3017
+ if (firstFocusable) {
3018
+ event.preventDefault();
3019
+ firstFocusable.focus();
3020
+ }
3021
+ }
3022
+ }
3023
+ }
3024
+ }
3025
+ break;
3026
+ }
3027
+ }
3028
+ onKeyDownProp?.(event);
3029
+ }, [
3030
+ findFirstFocusable,
3031
+ onKeyDownProp
3032
+ ]);
3033
+ return /* @__PURE__ */ React33.createElement(Comp, {
3034
+ role: "treegrid",
3035
+ ...rest,
3036
+ className: tx("treegrid.root", {}, className),
3037
+ style: {
3038
+ ...style,
3039
+ gridTemplateColumns
3040
+ },
3041
+ onKeyDown: handleKeyDown,
3042
+ ref: forwardedRef
3043
+ }, children);
3044
+ });
3045
+ var TreegridRow = /* @__PURE__ */ forwardRef19(({ __treegridRowScope, asChild, classNames, children, id, parentOf, open: propsOpen, defaultOpen, onOpenChange: propsOnOpenChange, ...props }, forwardedRef) => {
3046
+ const { tx } = useThemeContext();
3047
+ const Comp = asChild ? Slot16 : Primitive16.div;
3048
+ const pathParts = id.split(TREEGRID_PATH_SEPARATOR);
3049
+ const level = pathParts.length - 1;
3050
+ const [open, onOpenChange] = useControllableState3({
3051
+ prop: propsOpen,
3052
+ onChange: propsOnOpenChange,
3053
+ defaultProp: defaultOpen
3054
+ });
3055
+ return /* @__PURE__ */ React33.createElement(TreegridRowProvider, {
3056
+ open,
3057
+ onOpenChange,
3058
+ scope: __treegridRowScope
3059
+ }, /* @__PURE__ */ React33.createElement(Comp, {
3060
+ role: "row",
3061
+ "aria-level": level,
3062
+ className: tx("treegrid.row", {
3063
+ level
3064
+ }, classNames),
3065
+ ...parentOf && {
3066
+ "aria-expanded": open,
3067
+ "aria-owns": parentOf
3068
+ },
3069
+ ...props,
3070
+ id,
3071
+ ref: forwardedRef
3072
+ }, children));
3073
+ });
3074
+ var TreegridCell = /* @__PURE__ */ forwardRef19(({ classNames, children, indent, ...props }, forwardedRef) => {
3075
+ const { tx } = useThemeContext();
3076
+ return /* @__PURE__ */ React33.createElement("div", {
3077
+ role: "gridcell",
3078
+ className: tx("treegrid.cell", {
3079
+ indent
3080
+ }, classNames),
3081
+ ...props,
3082
+ ref: forwardedRef
3083
+ }, children);
3084
+ });
3085
+ var Treegrid = {
3086
+ Root: TreegridRoot,
3087
+ Row: TreegridRow,
3088
+ Cell: TreegridCell
3089
+ };
3090
+
3091
+ // src/components/Main/Main.tsx
3092
+ import { useFocusableGroup as useFocusableGroup2 } from "@fluentui/react-tabster";
3093
+ import { createContext as createContext9 } from "@radix-ui/react-context";
3094
+ import { DialogContent as DialogContent2, Root as DialogRoot2, DialogTitle as DialogTitle2 } from "@radix-ui/react-dialog";
3095
+ import { Primitive as Primitive17 } from "@radix-ui/react-primitive";
3096
+ import { Slot as Slot17 } from "@radix-ui/react-slot";
3097
+ import { useControllableState as useControllableState4 } from "@radix-ui/react-use-controllable-state";
3098
+ import React34, { forwardRef as forwardRef20, useCallback as useCallback10, useEffect as useEffect6, useRef as useRef4, useState as useState9 } from "react";
3099
+ import { addEventListener } from "@dxos/async";
3100
+ import { log } from "@dxos/log";
3101
+ import { useForwardedRef, useMediaQuery } from "@dxos/react-hooks";
3102
+ import { osTranslations as osTranslations3 } from "@dxos/ui-theme";
3103
+
3104
+ // src/components/Main/useSwipeToDismiss.ts
3105
+ import { useCallback as useCallback9, useEffect as useEffect5, useState as useState8 } from "react";
3106
+ var useSwipeToDismiss = (ref, {
3107
+ onDismiss,
3108
+ dismissThreshold = 64,
3109
+ debounceThreshold = 8,
3110
+ offset = 0
3111
+ /* side = 'inline-start' */
3112
+ }) => {
3113
+ const $root = ref.current;
3114
+ const [motionState, setMotionState] = useState8(0);
3115
+ const [gestureStartX, setGestureStartX] = useState8(0);
3116
+ const setIdle = useCallback9(() => {
3117
+ setMotionState(0);
3118
+ $root?.style.removeProperty("inset-inline-start");
3119
+ $root?.style.setProperty("transition-duration", "200ms");
3120
+ }, [
3121
+ $root
3122
+ ]);
3123
+ const setFollowing = useCallback9(() => {
3124
+ setMotionState(2);
3125
+ $root?.style.setProperty("transition-duration", "0ms");
3126
+ }, [
3127
+ $root
3128
+ ]);
3129
+ const handlePointerDown = useCallback9(({ screenX }) => {
3130
+ if (motionState === 0) {
3131
+ setMotionState(1);
3132
+ setGestureStartX(screenX);
3133
+ }
3134
+ }, [
3135
+ motionState
3136
+ ]);
3137
+ const handlePointerMove = useCallback9(({ screenX }) => {
3138
+ if ($root) {
3139
+ const delta = Math.min(screenX - gestureStartX, 0);
3140
+ switch (motionState) {
3141
+ case 2:
3142
+ if (Math.abs(delta) > dismissThreshold) {
3143
+ setIdle();
3144
+ onDismiss?.();
3145
+ } else {
3146
+ $root.style.setProperty("inset-inline-start", `${offset + delta}px`);
3147
+ }
3148
+ break;
3149
+ case 1:
3150
+ if (Math.abs(delta) > debounceThreshold) {
3151
+ setFollowing();
3152
+ }
3153
+ break;
3154
+ }
3155
+ }
3156
+ }, [
3157
+ $root,
3158
+ motionState,
3159
+ gestureStartX
3160
+ ]);
3161
+ const handlePointerUp = useCallback9(() => {
3162
+ setIdle();
3163
+ }, [
3164
+ setIdle
3165
+ ]);
3166
+ useEffect5(() => {
3167
+ $root?.addEventListener("pointerdown", handlePointerDown);
3168
+ return () => {
3169
+ $root?.removeEventListener("pointerdown", handlePointerDown);
3170
+ };
3171
+ }, [
3172
+ $root,
3173
+ handlePointerDown
3174
+ ]);
3175
+ useEffect5(() => {
3176
+ $root && document.documentElement.addEventListener("pointermove", handlePointerMove);
3177
+ return () => {
3178
+ document.documentElement.removeEventListener("pointermove", handlePointerMove);
3179
+ };
3180
+ }, [
3181
+ $root,
3182
+ handlePointerMove
3183
+ ]);
3184
+ useEffect5(() => {
3185
+ $root && document.documentElement.addEventListener("pointerup", handlePointerUp);
3186
+ return () => {
3187
+ document.documentElement.removeEventListener("pointerup", handlePointerUp);
3188
+ };
3189
+ }, [
3190
+ $root,
3191
+ handlePointerUp
3192
+ ]);
3193
+ };
3194
+
3195
+ // src/components/Main/Main.tsx
3196
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui/src/components/Main/Main.tsx";
3197
+ var MAIN_NAME = "Main";
3198
+ var MAIN_ROOT_NAME = "MainRoot";
3199
+ var MAIN_OVERLAY_NAME = "MainOverlay";
3200
+ var NAVIGATION_SIDEBAR_NAME = "NavigationSidebar";
3201
+ var COMPLEMENTARY_SIDEBAR_NAME = "ComplementarySidebar";
3202
+ var handleOpenAutoFocus = (event) => {
3203
+ !document.body.hasAttribute("data-w-keyboard") && event.preventDefault();
3204
+ };
3205
+ var landmarkAttr = "data-main-landmark";
3206
+ var useLandmarkMover = (propsOnKeyDown, landmark) => {
3207
+ const handleKeyDown = useCallback10((event) => {
3208
+ const target = event.target;
3209
+ if (event.target === event.currentTarget && event.key === "Tab" && target.hasAttribute(landmarkAttr)) {
3210
+ event.preventDefault();
3211
+ const landmarks = Array.from(document.querySelectorAll(`[${landmarkAttr}]:not([inert])`)).map((el) => el.hasAttribute(landmarkAttr) ? parseInt(el.getAttribute(landmarkAttr)) : NaN).sort();
3212
+ const l = landmarks.length;
3213
+ const cursor = landmarks.indexOf(parseInt(target.getAttribute(landmarkAttr)));
3214
+ const nextLandmark = landmarks[(cursor + l + (event.getModifierState("Shift") ? -1 : 1)) % l];
3215
+ document.querySelector(`[${landmarkAttr}="${nextLandmark}"]`)?.focus();
3216
+ }
3217
+ propsOnKeyDown?.(event);
3218
+ }, [
3219
+ propsOnKeyDown
3220
+ ]);
3221
+ const focusableGroupAttrs = useFocusableGroup2({
3222
+ tabBehavior: "limited",
3223
+ ignoreDefaultKeydown: {
3224
+ Tab: true
3225
+ }
3226
+ });
3227
+ return {
3228
+ [landmarkAttr]: landmark,
3229
+ tabIndex: 0,
3230
+ onKeyDown: handleKeyDown,
3231
+ ...focusableGroupAttrs
3232
+ };
3233
+ };
3234
+ var [MainProvider, useMainContext] = createContext9(MAIN_NAME, {
3235
+ resizing: false,
3236
+ navigationSidebarState: "closed",
3237
+ setNavigationSidebarState: (_nextState) => {
3238
+ log.warn("Not initialized", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 67, S: void 0 });
3239
+ },
3240
+ complementarySidebarState: "closed",
3241
+ setComplementarySidebarState: (_nextState) => {
3242
+ log.warn("Not initialized", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 71, S: void 0 });
3243
+ }
3244
+ });
3245
+ var useSidebars = (consumerName) => {
3246
+ const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } = useMainContext(consumerName);
3247
+ return {
3248
+ navigationSidebarState,
3249
+ setNavigationSidebarState,
3250
+ toggleNavigationSidebar: useCallback10(() => setNavigationSidebarState(navigationSidebarState === "expanded" ? "closed" : "expanded"), [
3251
+ navigationSidebarState,
3252
+ setNavigationSidebarState
3253
+ ]),
3254
+ openNavigationSidebar: useCallback10(() => setNavigationSidebarState("expanded"), []),
3255
+ collapseNavigationSidebar: useCallback10(() => setNavigationSidebarState("collapsed"), []),
3256
+ closeNavigationSidebar: useCallback10(() => setNavigationSidebarState("closed"), []),
3257
+ complementarySidebarState,
3258
+ setComplementarySidebarState,
3259
+ toggleComplementarySidebar: useCallback10(() => setComplementarySidebarState(complementarySidebarState === "expanded" ? "closed" : "expanded"), [
3260
+ complementarySidebarState,
3261
+ setComplementarySidebarState
3262
+ ]),
3263
+ openComplementarySidebar: useCallback10(() => setComplementarySidebarState("expanded"), []),
3264
+ collapseComplementarySidebar: useCallback10(() => setComplementarySidebarState("collapsed"), []),
3265
+ closeComplementarySidebar: useCallback10(() => setComplementarySidebarState("closed"), [])
3266
+ };
3267
+ };
3268
+ var MainRoot = ({ navigationSidebarState: propsNavigationSidebarState, defaultNavigationSidebarState = "closed", onNavigationSidebarStateChange, complementarySidebarState: propsComplementarySidebarState, defaultComplementarySidebarState = "closed", onComplementarySidebarStateChange, children, ...props }) => {
3269
+ const [isLg] = useMediaQuery("lg");
3270
+ const [navigationSidebarState = isLg ? "expanded" : "collapsed", setNavigationSidebarState] = useControllableState4({
3271
+ prop: propsNavigationSidebarState,
3272
+ defaultProp: defaultNavigationSidebarState,
3273
+ onChange: onNavigationSidebarStateChange
3274
+ });
3275
+ const [complementarySidebarState = isLg ? "expanded" : "collapsed", setComplementarySidebarState] = useControllableState4({
3276
+ prop: propsComplementarySidebarState,
3277
+ defaultProp: defaultComplementarySidebarState,
3278
+ onChange: onComplementarySidebarStateChange
3279
+ });
3280
+ const [resizing, setResizing] = useState9(false);
3281
+ const resizeInterval = useRef4(null);
3282
+ useEffect6(() => addEventListener(window, "resize", () => {
3283
+ setResizing(true);
3284
+ if (resizeInterval.current) {
3285
+ clearTimeout(resizeInterval.current);
3286
+ }
3287
+ resizeInterval.current = setTimeout(() => {
3288
+ setResizing(false);
3289
+ resizeInterval.current = null;
3290
+ }, 3e3);
3291
+ }), []);
3292
+ return /* @__PURE__ */ React34.createElement(MainProvider, {
3293
+ ...props,
3294
+ navigationSidebarState,
3295
+ setNavigationSidebarState,
3296
+ complementarySidebarState,
3297
+ setComplementarySidebarState,
3298
+ resizing
3299
+ }, children);
3300
+ };
3301
+ MainRoot.displayName = MAIN_ROOT_NAME;
3302
+ var MainOverlay = /* @__PURE__ */ forwardRef20(({ classNames, ...props }, forwardedRef) => {
3303
+ const [isLg] = useMediaQuery("lg");
3304
+ const { navigationSidebarState, setNavigationSidebarState, complementarySidebarState, setComplementarySidebarState } = useMainContext(MAIN_OVERLAY_NAME);
3305
+ const { tx } = useThemeContext();
3306
+ return /* @__PURE__ */ React34.createElement("div", {
3307
+ ...props,
3308
+ onClick: () => {
3309
+ setNavigationSidebarState("collapsed");
3310
+ setComplementarySidebarState("collapsed");
3311
+ },
3312
+ className: tx("main.overlay", {
3313
+ isLg,
3314
+ inlineStartSidebarOpen: navigationSidebarState,
3315
+ inlineEndSidebarOpen: complementarySidebarState
3316
+ }, classNames),
3317
+ "data-state": navigationSidebarState === "expanded" || complementarySidebarState === "expanded" ? "open" : "closed",
3318
+ "aria-hidden": "true",
3319
+ ref: forwardedRef
3320
+ });
3321
+ });
3322
+ MainOverlay.displayName = MAIN_OVERLAY_NAME;
3323
+ var MainSidebar = /* @__PURE__ */ forwardRef20(({ classNames, children, swipeToDismiss, onOpenAutoFocus, state, resizing, onStateChange, side, label, ...props }, forwardedRef) => {
3324
+ const [isLg] = useMediaQuery("lg");
3325
+ const { tx } = useThemeContext();
3326
+ const { t } = useTranslation(osTranslations3);
3327
+ const ref = useForwardedRef(forwardedRef);
3328
+ const noopRef = useRef4(null);
3329
+ useSwipeToDismiss(swipeToDismiss ? ref : noopRef, {
3330
+ onDismiss: () => onStateChange?.("closed")
3331
+ });
3332
+ const handleKeyDown = useCallback10((event) => {
3333
+ const focusGroupParent = event.target.closest("[data-tabster]");
3334
+ if (event.key === "Escape" && focusGroupParent) {
3335
+ event.preventDefault();
3336
+ event.stopPropagation();
3337
+ focusGroupParent.focus();
3338
+ }
3339
+ props.onKeyDown?.(event);
3340
+ }, [
3341
+ props.onKeyDown
3342
+ ]);
3343
+ const Root14 = isLg ? Primitive17.div : DialogContent2;
3344
+ return /* @__PURE__ */ React34.createElement(DialogRoot2, {
3345
+ open: state !== "closed",
3346
+ "aria-label": toLocalizedString(label, t),
3347
+ modal: false
3348
+ }, !isLg && /* @__PURE__ */ React34.createElement(DialogTitle2, {
3349
+ className: "sr-only"
3350
+ }, toLocalizedString(label, t)), /* @__PURE__ */ React34.createElement(Root14, {
3351
+ ...!isLg && {
3352
+ forceMount: true,
3353
+ tabIndex: -1,
3354
+ onOpenAutoFocus: onOpenAutoFocus ?? handleOpenAutoFocus
3355
+ },
3356
+ ...state === "closed" && {
3357
+ inert: true
3358
+ },
3359
+ ...props,
3360
+ "data-side": side === "w-end" ? "ie" : "is",
3361
+ "data-state": state,
3362
+ "data-resizing": resizing ? "true" : "false",
3363
+ className: tx("main.sidebar", {}, classNames),
3364
+ onKeyDownCapture: handleKeyDown,
3365
+ ref
3366
+ }, children));
3367
+ });
3368
+ var MainNavigationSidebar = /* @__PURE__ */ forwardRef20((props, forwardedRef) => {
3369
+ const { navigationSidebarState, setNavigationSidebarState, resizing } = useMainContext(NAVIGATION_SIDEBAR_NAME);
3370
+ const mover = useLandmarkMover(props.onKeyDown, "0");
3371
+ return /* @__PURE__ */ React34.createElement(MainSidebar, {
3372
+ ...mover,
3373
+ ...props,
3374
+ state: navigationSidebarState,
3375
+ onStateChange: setNavigationSidebarState,
3376
+ resizing,
3377
+ side: "w-start",
3378
+ ref: forwardedRef
3379
+ });
3380
+ });
3381
+ MainNavigationSidebar.displayName = NAVIGATION_SIDEBAR_NAME;
3382
+ var MainComplementarySidebar = /* @__PURE__ */ forwardRef20((props, forwardedRef) => {
3383
+ const { complementarySidebarState, setComplementarySidebarState, resizing } = useMainContext(COMPLEMENTARY_SIDEBAR_NAME);
3384
+ const mover = useLandmarkMover(props.onKeyDown, "2");
3385
+ return /* @__PURE__ */ React34.createElement(MainSidebar, {
3386
+ ...mover,
3387
+ ...props,
3388
+ state: complementarySidebarState,
3389
+ onStateChange: setComplementarySidebarState,
3390
+ resizing,
3391
+ side: "w-end",
3392
+ ref: forwardedRef
3393
+ });
3394
+ });
3395
+ MainComplementarySidebar.displayName = COMPLEMENTARY_SIDEBAR_NAME;
3396
+ var MainContent = /* @__PURE__ */ forwardRef20(({ asChild, classNames, bounce, handlesFocus, children, role, ...props }, forwardedRef) => {
3397
+ const { navigationSidebarState, complementarySidebarState } = useMainContext(MAIN_NAME);
3398
+ const { tx } = useThemeContext();
3399
+ const Comp = asChild ? Slot17 : role ? Primitive17.div : "main";
3400
+ const mover = useLandmarkMover(props.onKeyDown, "1");
3401
+ return /* @__PURE__ */ React34.createElement(Comp, {
3402
+ ...handlesFocus && {
3403
+ ...mover
3404
+ },
3405
+ ...props,
3406
+ role,
3407
+ "data-sidebar-left-state": navigationSidebarState,
3408
+ "data-sidebar-right-state": complementarySidebarState,
3409
+ "data-handles-focus": handlesFocus,
3410
+ className: tx("main.content", {
3411
+ bounce,
3412
+ handlesFocus
3413
+ }, classNames),
3414
+ ref: forwardedRef
3415
+ }, children);
3416
+ });
3417
+ MainContent.displayName = MAIN_NAME;
3418
+ var Main = {
3419
+ Root: MainRoot,
3420
+ Overlay: MainOverlay,
3421
+ Content: MainContent,
3422
+ NavigationSidebar: MainNavigationSidebar,
3423
+ ComplementarySidebar: MainComplementarySidebar
3424
+ };
3425
+
3426
+ // src/components/Message/Message.tsx
3427
+ import { createContext as createContext10 } from "@radix-ui/react-context";
3428
+ import { Primitive as Primitive18 } from "@radix-ui/react-primitive";
3429
+ import { Slot as Slot18 } from "@radix-ui/react-slot";
3430
+ import React35, { forwardRef as forwardRef21 } from "react";
3431
+ import { useTranslation as useTranslation4 } from "react-i18next";
3432
+ import { useId as useId3 } from "@dxos/react-hooks";
3433
+ import { translationKey as translationKey3 } from "#translations";
3434
+ var messageIcons = {
3435
+ success: "ph--check-circle--duotone",
3436
+ info: "ph--info--duotone",
3437
+ warning: "ph--warning--duotone",
3438
+ error: "ph--warning-circle--duotone",
3439
+ neutral: "ph--info--duotone"
3440
+ };
3441
+ var MESSAGE_NAME = "Message";
3442
+ var [MessageProvider, useMessageContext] = createContext10(MESSAGE_NAME);
3443
+ var MessageRoot = /* @__PURE__ */ forwardRef21(({ asChild, valence = "neutral", elevation: propsElevation, classNames, titleId: propsTitleId, descriptionId: propsDescriptionId, children, ...props }, forwardedRef) => {
3444
+ const { tx } = useThemeContext();
3445
+ const titleId = useId3("message__title", propsTitleId);
3446
+ const descriptionId = useId3("message__description", propsDescriptionId);
3447
+ const elevation = useElevationContext(propsElevation);
3448
+ const Comp = asChild ? Slot18 : Primitive18.div;
3449
+ return /* @__PURE__ */ React35.createElement(MessageProvider, {
3450
+ titleId,
3451
+ descriptionId,
3452
+ valence
3453
+ }, /* @__PURE__ */ React35.createElement(Comp, {
3454
+ role: valence === "neutral" ? "paragraph" : "alert",
3455
+ ...props,
3456
+ className: tx("message.root", {
3457
+ valence,
3458
+ elevation
3459
+ }, classNames),
3460
+ "aria-labelledby": titleId,
3461
+ "aria-describedby": descriptionId,
3462
+ ref: forwardedRef
3463
+ }, children));
3464
+ });
3465
+ MessageRoot.displayName = MESSAGE_NAME;
3466
+ var MESSAGE_TITLE_NAME = "MessageTitle";
3467
+ var MessageTitle = /* @__PURE__ */ forwardRef21(({ classNames, children, icon: iconProp, onClose }, forwardedRef) => {
3468
+ const { t } = useTranslation4(translationKey3);
3469
+ const { tx } = useThemeContext();
3470
+ const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
3471
+ const icon = iconProp ?? messageIcons[valence];
3472
+ return /* @__PURE__ */ React35.createElement("div", {
3473
+ className: tx("message.header", {}, classNames),
3474
+ id: titleId,
3475
+ ref: forwardedRef
3476
+ }, icon && /* @__PURE__ */ React35.createElement("div", {
3477
+ className: tx("message.icon", {
3478
+ valence
3479
+ })
3480
+ }, /* @__PURE__ */ React35.createElement(Icon, {
3481
+ icon
3482
+ })), /* @__PURE__ */ React35.createElement("h2", {
3483
+ className: tx("message.title", {}, classNames)
3484
+ }, children), onClose && /* @__PURE__ */ React35.createElement(IconButton, {
3485
+ variant: "ghost",
3486
+ icon: "ph--x--regular",
3487
+ iconOnly: true,
3488
+ label: t("toolbar-close.label"),
3489
+ onClick: onClose
3490
+ }));
3491
+ });
3492
+ MessageTitle.displayName = MESSAGE_TITLE_NAME;
3493
+ var MESSAGE_CONTENT_NAME = "MessageContent";
3494
+ var MessageContent = /* @__PURE__ */ forwardRef21(({ asChild, classNames, children, ...props }, forwardedRef) => {
3495
+ const { tx } = useThemeContext();
3496
+ const { descriptionId } = useMessageContext(MESSAGE_CONTENT_NAME);
3497
+ const Comp = asChild ? Slot18 : Primitive18.p;
3498
+ return /* @__PURE__ */ React35.createElement(Comp, {
3499
+ ...props,
3500
+ className: tx("message.content", {}, classNames),
3501
+ id: descriptionId,
3502
+ ref: forwardedRef
3503
+ }, children);
3504
+ });
3505
+ MessageContent.displayName = MESSAGE_CONTENT_NAME;
3506
+ var Message = {
3507
+ Root: MessageRoot,
3508
+ Title: MessageTitle,
3509
+ Content: MessageContent
3510
+ };
3511
+ var Callout = Message;
3512
+
3513
+ // src/components/Popover/Popover.tsx
3514
+ import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
3515
+ import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
3516
+ import { createContextScope as createContextScope3 } from "@radix-ui/react-context";
3517
+ import { DismissableLayer } from "@radix-ui/react-dismissable-layer";
3518
+ import { useFocusGuards } from "@radix-ui/react-focus-guards";
3519
+ import { FocusScope } from "@radix-ui/react-focus-scope";
3520
+ import { useId as useId4 } from "@radix-ui/react-id";
3521
+ import * as PopperPrimitive from "@radix-ui/react-popper";
3522
+ import { createPopperScope } from "@radix-ui/react-popper";
3523
+ import { Portal as PortalPrimitive } from "@radix-ui/react-portal";
3524
+ import { Presence } from "@radix-ui/react-presence";
3525
+ import { Primitive as Primitive19 } from "@radix-ui/react-primitive";
3526
+ import { Slot as Slot19 } from "@radix-ui/react-slot";
3527
+ import { useControllableState as useControllableState5 } from "@radix-ui/react-use-controllable-state";
3528
+ import { hideOthers } from "aria-hidden";
3529
+ import React36, { forwardRef as forwardRef22, useCallback as useCallback11, useEffect as useEffect7, useMemo as useMemo7, useRef as useRef5, useState as useState10 } from "react";
3530
+ import { RemoveScroll } from "react-remove-scroll";
3531
+ var POPOVER_NAME = "Popover";
3532
+ var [createPopoverContext, createPopoverScope] = createContextScope3(POPOVER_NAME, [
3533
+ createPopperScope
3534
+ ]);
3535
+ var usePopperScope = createPopperScope();
3536
+ var [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);
3537
+ var PopoverRoot = (props) => {
3538
+ const { __scopePopover, children, open: openProp, defaultOpen, onOpenChange, modal = false } = props;
3539
+ const popperScope = usePopperScope(__scopePopover);
3540
+ const triggerRef = useRef5(null);
3541
+ const [hasCustomAnchor, setHasCustomAnchor] = useState10(false);
3542
+ const [open = false, setOpen] = useControllableState5({
3543
+ prop: openProp,
3544
+ defaultProp: defaultOpen,
3545
+ onChange: onOpenChange
3546
+ });
3547
+ return /* @__PURE__ */ React36.createElement(PopperPrimitive.Root, popperScope, /* @__PURE__ */ React36.createElement(PopoverProvider, {
3548
+ scope: __scopePopover,
3549
+ contentId: useId4(),
3550
+ triggerRef,
3551
+ open,
3552
+ onOpenChange: setOpen,
3553
+ onOpenToggle: useCallback11(() => setOpen((prevOpen) => !prevOpen), [
3554
+ setOpen
3555
+ ]),
3556
+ hasCustomAnchor,
3557
+ onCustomAnchorAdd: useCallback11(() => setHasCustomAnchor(true), []),
3558
+ onCustomAnchorRemove: useCallback11(() => setHasCustomAnchor(false), []),
3559
+ modal
3560
+ }, children));
3561
+ };
3562
+ PopoverRoot.displayName = POPOVER_NAME;
3563
+ var ANCHOR_NAME = "PopoverAnchor";
3564
+ var PopoverAnchor = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3565
+ const { __scopePopover, ...anchorProps } = props;
3566
+ const context = usePopoverContext(ANCHOR_NAME, __scopePopover);
3567
+ const popperScope = usePopperScope(__scopePopover);
3568
+ const { onCustomAnchorAdd, onCustomAnchorRemove } = context;
3569
+ useEffect7(() => {
3570
+ onCustomAnchorAdd();
3571
+ return () => onCustomAnchorRemove();
3572
+ }, [
3573
+ onCustomAnchorAdd,
3574
+ onCustomAnchorRemove
3575
+ ]);
3576
+ return /* @__PURE__ */ React36.createElement(PopperPrimitive.Anchor, {
3577
+ ...popperScope,
3578
+ ...anchorProps,
3579
+ ref: forwardedRef
3580
+ });
3581
+ });
3582
+ PopoverAnchor.displayName = ANCHOR_NAME;
3583
+ var TRIGGER_NAME2 = "PopoverTrigger";
3584
+ var PopoverTrigger = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3585
+ const { __scopePopover, asChild, ...triggerProps } = props;
3586
+ const context = usePopoverContext(TRIGGER_NAME2, __scopePopover);
3587
+ const popperScope = usePopperScope(__scopePopover);
3588
+ const composedTriggerRef = useComposedRefs2(forwardedRef, context.triggerRef);
3589
+ const Comp = asChild ? Slot19 : Primitive19.button;
3590
+ const trigger = /* @__PURE__ */ React36.createElement(Comp, {
3591
+ type: "button",
3592
+ "aria-haspopup": "dialog",
3593
+ "aria-expanded": context.open,
3594
+ "aria-controls": context.contentId,
3595
+ "data-state": getState(context.open),
3596
+ ...triggerProps,
3597
+ ref: composedTriggerRef,
3598
+ onClick: composeEventHandlers2(props.onClick, context.onOpenToggle)
3599
+ });
3600
+ return context.hasCustomAnchor ? trigger : /* @__PURE__ */ React36.createElement(PopperPrimitive.Anchor, {
3601
+ asChild: true,
3602
+ ...popperScope
3603
+ }, trigger);
3604
+ });
3605
+ PopoverTrigger.displayName = TRIGGER_NAME2;
3606
+ var VIRTUAL_TRIGGER_NAME2 = "PopoverVirtualTrigger";
3607
+ var PopoverVirtualTrigger = (props) => {
3608
+ const { __scopePopover, virtualRef } = props;
3609
+ const context = usePopoverContext(VIRTUAL_TRIGGER_NAME2, __scopePopover);
3610
+ const popperScope = usePopperScope(__scopePopover);
3611
+ useEffect7(() => {
3612
+ if (virtualRef.current) {
3613
+ context.triggerRef.current = virtualRef.current;
3614
+ }
3615
+ });
3616
+ return /* @__PURE__ */ React36.createElement(PopperPrimitive.Anchor, {
3617
+ ...popperScope,
3618
+ virtualRef
3619
+ });
3620
+ };
3621
+ PopoverVirtualTrigger.displayName = VIRTUAL_TRIGGER_NAME2;
3622
+ var PORTAL_NAME2 = "PopoverPortal";
3623
+ var [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME2, {
3624
+ forceMount: void 0
3625
+ });
3626
+ var PopoverPortal = (props) => {
3627
+ const { __scopePopover, forceMount, children, container } = props;
3628
+ const context = usePopoverContext(PORTAL_NAME2, __scopePopover);
3629
+ return /* @__PURE__ */ React36.createElement(PortalProvider, {
3630
+ scope: __scopePopover,
3631
+ forceMount
3632
+ }, /* @__PURE__ */ React36.createElement(Presence, {
3633
+ present: forceMount || context.open
3634
+ }, /* @__PURE__ */ React36.createElement(PortalPrimitive, {
3635
+ asChild: true,
3636
+ container
3637
+ }, children)));
3638
+ };
3639
+ PopoverPortal.displayName = PORTAL_NAME2;
3640
+ var CONTENT_NAME2 = "PopoverContent";
3641
+ var PopoverContent = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3642
+ const portalContext = usePortalContext(CONTENT_NAME2, props.__scopePopover);
3643
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
3644
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3645
+ return /* @__PURE__ */ React36.createElement(Presence, {
3646
+ present: forceMount || context.open
3647
+ }, context.modal ? /* @__PURE__ */ React36.createElement(PopoverContentModal, {
3648
+ ...contentProps,
3649
+ ref: forwardedRef
3650
+ }) : /* @__PURE__ */ React36.createElement(PopoverContentNonModal, {
3651
+ ...contentProps,
3652
+ ref: forwardedRef
3653
+ }));
3654
+ });
3655
+ PopoverContent.displayName = CONTENT_NAME2;
3656
+ var PopoverContentModal = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3657
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3658
+ const contentRef = useRef5(null);
3659
+ const composedRefs = useComposedRefs2(forwardedRef, contentRef);
3660
+ const isRightClickOutsideRef = useRef5(false);
3661
+ useEffect7(() => {
3662
+ const content = contentRef.current;
3663
+ if (content) {
3664
+ return hideOthers(content);
3665
+ }
3666
+ }, []);
3667
+ return /* @__PURE__ */ React36.createElement(RemoveScroll, {
3668
+ as: Slot19,
3669
+ allowPinchZoom: true
3670
+ }, /* @__PURE__ */ React36.createElement(PopoverContentImpl, {
3671
+ ...props,
3672
+ ref: composedRefs,
3673
+ // Make sure we're not trapping once it's been closed (closed !== unmounted when animating out).
3674
+ trapFocus: context.open,
3675
+ disableOutsidePointerEvents: true,
3676
+ onCloseAutoFocus: composeEventHandlers2(props.onCloseAutoFocus, (event) => {
3677
+ event.preventDefault();
3678
+ if (!isRightClickOutsideRef.current) {
3679
+ context.triggerRef.current?.focus();
3680
+ }
3681
+ }),
3682
+ onPointerDownOutside: composeEventHandlers2(props.onPointerDownOutside, (event) => {
3683
+ const originalEvent = event.detail.originalEvent;
3684
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
3685
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
3686
+ isRightClickOutsideRef.current = isRightClick;
3687
+ }, {
3688
+ checkForDefaultPrevented: false
3689
+ }),
3690
+ // When focus is trapped, a `focusout` event may still happen.
3691
+ // We make sure we don't trigger our `onDismiss` in such case.
3692
+ onFocusOutside: composeEventHandlers2(props.onFocusOutside, (event) => event.preventDefault(), {
3693
+ checkForDefaultPrevented: false
3694
+ })
3695
+ }));
3696
+ });
3697
+ var PopoverContentNonModal = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3698
+ const context = usePopoverContext(CONTENT_NAME2, props.__scopePopover);
3699
+ const hasInteractedOutsideRef = useRef5(false);
3700
+ const hasPointerDownOutsideRef = useRef5(false);
3701
+ return /* @__PURE__ */ React36.createElement(PopoverContentImpl, {
3702
+ ...props,
3703
+ ref: forwardedRef,
3704
+ trapFocus: false,
3705
+ disableOutsidePointerEvents: false,
3706
+ onCloseAutoFocus: (event) => {
3707
+ props.onCloseAutoFocus?.(event);
3708
+ if (!event.defaultPrevented) {
3709
+ if (!hasInteractedOutsideRef.current) {
3710
+ context.triggerRef.current?.focus();
3711
+ }
3712
+ event.preventDefault();
3713
+ }
3714
+ hasInteractedOutsideRef.current = false;
3715
+ hasPointerDownOutsideRef.current = false;
3716
+ },
3717
+ onInteractOutside: (event) => {
3718
+ props.onInteractOutside?.(event);
3719
+ if (!event.defaultPrevented) {
3720
+ hasInteractedOutsideRef.current = true;
3721
+ if (event.detail.originalEvent.type === "pointerdown") {
3722
+ hasPointerDownOutsideRef.current = true;
3723
+ }
3724
+ }
3725
+ const target = event.target;
3726
+ const targetIsTrigger = context.triggerRef.current?.contains(target);
3727
+ if (targetIsTrigger) {
3728
+ event.preventDefault();
3729
+ }
3730
+ if (event.detail.originalEvent.type === "focusin" && hasPointerDownOutsideRef.current) {
3731
+ event.preventDefault();
3732
+ }
3733
+ }
3734
+ });
3735
+ });
3736
+ var PopoverContentImpl = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3737
+ const { __scopePopover, trapFocus, onOpenAutoFocus, onCloseAutoFocus, disableOutsidePointerEvents, onEscapeKeyDown, onPointerDownOutside, onFocusOutside, onInteractOutside, collisionPadding = 8, collisionBoundary, classNames, ...contentProps } = props;
3738
+ const context = usePopoverContext(CONTENT_NAME2, __scopePopover);
3739
+ const popperScope = usePopperScope(__scopePopover);
3740
+ const { tx } = useThemeContext();
3741
+ const elevation = useElevationContext();
3742
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
3743
+ useFocusGuards();
3744
+ const computedCollisionBoundary = useMemo7(() => {
3745
+ const closestBoundary = context.triggerRef.current?.closest("[data-popover-collision-boundary]");
3746
+ return closestBoundary ? Array.isArray(collisionBoundary) ? [
3747
+ closestBoundary,
3748
+ ...collisionBoundary
3749
+ ] : collisionBoundary ? [
3750
+ closestBoundary,
3751
+ collisionBoundary
3752
+ ] : [
3753
+ closestBoundary
3754
+ ] : collisionBoundary;
3755
+ }, [
3756
+ context.open,
3757
+ collisionBoundary,
3758
+ context.triggerRef.current
3759
+ ]);
3760
+ return /* @__PURE__ */ React36.createElement(FocusScope, {
3761
+ asChild: true,
3762
+ loop: true,
3763
+ trapped: trapFocus,
3764
+ onMountAutoFocus: onOpenAutoFocus,
3765
+ onUnmountAutoFocus: onCloseAutoFocus
3766
+ }, /* @__PURE__ */ React36.createElement(DismissableLayer, {
3767
+ asChild: true,
3768
+ disableOutsidePointerEvents,
3769
+ onInteractOutside,
3770
+ onEscapeKeyDown,
3771
+ onPointerDownOutside,
3772
+ onFocusOutside,
3773
+ onDismiss: () => context.onOpenChange(false)
3774
+ }, /* @__PURE__ */ React36.createElement(PopperPrimitive.Content, {
3775
+ "data-state": getState(context.open),
3776
+ role: "dialog",
3777
+ id: context.contentId,
3778
+ ...popperScope,
3779
+ ...contentProps,
3780
+ collisionPadding: safeCollisionPadding,
3781
+ collisionBoundary: computedCollisionBoundary,
3782
+ className: tx("popover.content", {
3783
+ elevation
3784
+ }, classNames),
3785
+ ref: forwardedRef,
3786
+ style: {
3787
+ ...contentProps.style,
3788
+ // Re-namespace exposed content custom properties.
3789
+ ...{
3790
+ "--radix-popover-content-transform-origin": "var(--radix-popper-transform-origin)",
3791
+ "--radix-popover-content-available-width": "var(--radix-popper-available-width)",
3792
+ "--radix-popover-content-available-height": "var(--radix-popper-available-height)",
3793
+ "--radix-popover-trigger-width": "var(--radix-popper-anchor-width)",
3794
+ "--radix-popover-trigger-height": "var(--radix-popper-anchor-height)"
3795
+ }
3796
+ }
3797
+ })));
3798
+ });
3799
+ var CLOSE_NAME = "PopoverClose";
3800
+ var PopoverClose = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3801
+ const { __scopePopover, ...closeProps } = props;
3802
+ const context = usePopoverContext(CLOSE_NAME, __scopePopover);
3803
+ return /* @__PURE__ */ React36.createElement(Primitive19.button, {
3804
+ type: "button",
3805
+ ...closeProps,
3806
+ ref: forwardedRef,
3807
+ onClick: composeEventHandlers2(props.onClick, () => context.onOpenChange(false))
3808
+ });
3809
+ });
3810
+ PopoverClose.displayName = CLOSE_NAME;
3811
+ var ARROW_NAME2 = "PopoverArrow";
3812
+ var PopoverArrow = /* @__PURE__ */ forwardRef22((props, forwardedRef) => {
3813
+ const { __scopePopover, classNames, ...arrowProps } = props;
3814
+ const popperScope = usePopperScope(__scopePopover);
3815
+ const { tx } = useThemeContext();
3816
+ return /* @__PURE__ */ React36.createElement(PopperPrimitive.Arrow, {
3817
+ ...popperScope,
3818
+ ...arrowProps,
3819
+ className: tx("popover.arrow", {}, classNames),
3820
+ ref: forwardedRef
3821
+ });
3822
+ });
3823
+ PopoverArrow.displayName = ARROW_NAME2;
3824
+ var PopoverViewport = /* @__PURE__ */ forwardRef22(({ classNames, asChild, constrainInline = true, constrainBlock = true, children, ...props }, forwardedRef) => {
3825
+ const { tx } = useThemeContext();
3826
+ const Comp = asChild ? Slot19 : Primitive19.div;
3827
+ return /* @__PURE__ */ React36.createElement(Comp, {
3828
+ ...props,
3829
+ className: tx("popover.viewport", {
3830
+ constrainInline,
3831
+ constrainBlock
3832
+ }, classNames),
3833
+ ref: forwardedRef
3834
+ }, children);
3835
+ });
3836
+ var getState = (open) => open ? "open" : "closed";
3837
+ var Popover = {
3838
+ Root: PopoverRoot,
3839
+ Anchor: PopoverAnchor,
3840
+ Trigger: PopoverTrigger,
3841
+ VirtualTrigger: PopoverVirtualTrigger,
3842
+ Portal: PopoverPortal,
3843
+ Content: PopoverContent,
3844
+ Close: PopoverClose,
3845
+ Arrow: PopoverArrow,
3846
+ Viewport: PopoverViewport
3847
+ };
3848
+
3849
+ // src/components/Status/Status.tsx
3850
+ import React37, { forwardRef as forwardRef23 } from "react";
3851
+ var Status = /* @__PURE__ */ forwardRef23(({ classNames, children, progress = 0, indeterminate, variant, ...props }, forwardedRef) => {
3852
+ const { tx } = useThemeContext();
3853
+ return /* @__PURE__ */ React37.createElement("span", {
3854
+ role: "status",
3855
+ ...props,
3856
+ className: tx("status.root", {
3857
+ indeterminate,
3858
+ variant
3859
+ }, classNames),
3860
+ ref: forwardedRef
3861
+ }, /* @__PURE__ */ React37.createElement("span", {
3862
+ role: "none",
3863
+ className: tx("status.bar", {
3864
+ indeterminate,
3865
+ variant
3866
+ }, classNames),
3867
+ ...!indeterminate && {
3868
+ style: {
3869
+ width: `${Math.round(progress * 100)}%`
3870
+ }
3871
+ }
3872
+ }), children);
3873
+ });
3874
+
3875
+ // src/components/ScrollArea/ScrollArea.tsx
3876
+ import { createContext as createContext11 } from "@radix-ui/react-context";
3877
+ import { Primitive as Primitive20 } from "@radix-ui/react-primitive";
3878
+ import { Slot as Slot20 } from "@radix-ui/react-slot";
3879
+ import React38, { useMemo as useMemo8 } from "react";
3880
+ import { composableProps as composableProps12, scrollbar, slottable as slottable9 } from "@dxos/ui-theme";
3881
+ var SCROLLAREA_NAME = "ScrollArea";
3882
+ var [ScrollAreaProvider, useScrollAreaContext] = createContext11(SCROLLAREA_NAME);
3883
+ var SCROLLAREA_ROOT_NAME = "ScrollArea.Root";
3884
+ var ScrollAreaRoot = slottable9(({ children, asChild, orientation = "vertical", autoHide = true, centered = false, padding = false, thin = false, snap = false, ...props }, forwardedRef) => {
3885
+ const { tx } = useThemeContext();
3886
+ const { className, ...rest } = composableProps12(props);
3887
+ const Comp = asChild ? Slot20 : Primitive20.div;
3888
+ const options = useMemo8(() => ({
3889
+ orientation,
3890
+ autoHide,
3891
+ centered,
3892
+ padding,
3893
+ thin,
3894
+ snap
3895
+ }), [
3896
+ orientation,
3897
+ autoHide,
3898
+ centered,
3899
+ padding,
3900
+ thin,
3901
+ snap
3902
+ ]);
3903
+ return /* @__PURE__ */ React38.createElement(ScrollAreaProvider, options, /* @__PURE__ */ React38.createElement(Comp, {
3904
+ ...rest,
3905
+ className: tx("scrollArea.root", options, className),
3906
+ ref: forwardedRef
3907
+ }, children));
3908
+ });
3909
+ ScrollAreaRoot.displayName = SCROLLAREA_ROOT_NAME;
3910
+ var SCROLLAREA_VIEWPORT_NAME = "ScrollArea.Viewport";
3911
+ var ScrollAreaViewport = slottable9(({ children, asChild, ...props }, forwardedRef) => {
3912
+ const { tx } = useThemeContext();
3913
+ const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
3914
+ const density = options.thin ? scrollbar.thin : scrollbar.coarse;
3915
+ const { className, ...rest } = composableProps12(props);
3916
+ const { style, ...restWithoutStyle } = rest;
3917
+ const Comp = asChild ? Slot20 : Primitive20.div;
3918
+ return /* @__PURE__ */ React38.createElement(Comp, {
3919
+ ...restWithoutStyle,
3920
+ style: {
3921
+ "--scroll-width": `${density.size}px`,
3922
+ "--scroll-padding": `${density.padding}px`,
3923
+ ...style
3924
+ },
3925
+ className: tx("scrollArea.viewport", options, className),
3926
+ ref: forwardedRef
3927
+ }, children);
3928
+ });
3929
+ ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
3930
+ var ScrollArea = {
3931
+ Root: ScrollAreaRoot,
3932
+ Viewport: ScrollAreaViewport
3933
+ };
3934
+
3935
+ // src/components/ScrollContainer/ScrollContainer.tsx
3936
+ import { createContext as createContext12 } from "@radix-ui/react-context";
3937
+ import React39, { forwardRef as forwardRef24, useCallback as useCallback12, useEffect as useEffect8, useImperativeHandle, useMemo as useMemo9, useRef as useRef6, useState as useState11 } from "react";
3938
+ import { addEventListener as addEventListener2, combine } from "@dxos/async";
3939
+ import { invariant } from "@dxos/invariant";
3940
+ import { useMergeRefs } from "@dxos/react-hooks";
3941
+ import { composable as composable6, composableProps as composableProps13, slottable as slottable10 } from "@dxos/ui-theme";
3942
+ import { mx as mx11 } from "@dxos/ui-theme";
3943
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui/src/components/ScrollContainer/ScrollContainer.tsx";
3944
+ var isBottom = (el) => {
3945
+ return !!(el && el.scrollHeight - el.scrollTop === el.clientHeight);
3946
+ };
3947
+ var [ScrollContainerProvider, useScrollContainerContext] = createContext12("ScrollContainer");
3948
+ var Root10 = /* @__PURE__ */ forwardRef24(({ children, pin, behavior: behaviorProp = "smooth" }, forwardedRef) => {
3949
+ const scrollerRef = useRef6(null);
3950
+ const autoScrollRef = useRef6(false);
3951
+ const [pinned, setPinned] = useState11(pin);
3952
+ const [overflow, setOverflow] = useState11(false);
3953
+ const timeoutRef = useRef6(void 0);
3954
+ const scrollToBottom = useCallback12((behavior = behaviorProp) => {
3955
+ if (scrollerRef.current) {
3956
+ if (behavior !== "instant") {
3957
+ autoScrollRef.current = true;
3958
+ scrollerRef.current.classList.add("scrollbar-none");
3959
+ clearTimeout(timeoutRef.current);
3960
+ timeoutRef.current = setTimeout(() => {
3961
+ scrollerRef.current?.classList.remove("scrollbar-none");
3962
+ autoScrollRef.current = false;
3963
+ }, 500);
3964
+ }
3965
+ scrollerRef.current.scrollTo({
3966
+ top: scrollerRef.current.scrollHeight,
3967
+ behavior
3968
+ });
3969
+ setPinned(true);
3970
+ }
3971
+ }, [
3972
+ behaviorProp
3973
+ ]);
3974
+ const controller = useMemo9(() => ({
3975
+ get viewport() {
3976
+ return scrollerRef.current;
3977
+ },
3978
+ scrollToTop: () => {
3979
+ invariant(scrollerRef.current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 54, S: void 0, A: ["scrollerRef.current", ""] });
3980
+ scrollerRef.current.scrollTo({
3981
+ top: 0,
3982
+ behavior: "smooth"
3983
+ });
3984
+ setPinned(false);
3985
+ },
3986
+ scrollToBottom: (behavior = "smooth") => {
3987
+ scrollToBottom(behavior);
3988
+ }
3989
+ }), [
3990
+ scrollToBottom
3991
+ ]);
3992
+ useImperativeHandle(forwardedRef, () => controller, [
3993
+ controller
3994
+ ]);
3995
+ const setViewport = useCallback12((el) => {
3996
+ scrollerRef.current = el;
3997
+ }, []);
3998
+ return /* @__PURE__ */ React39.createElement(ScrollContainerProvider, {
3999
+ pinned,
4000
+ overflow,
4001
+ controller,
4002
+ setViewport,
4003
+ setPinned,
4004
+ setOverflow
4005
+ }, children);
4006
+ });
4007
+ Root10.displayName = "ScrollContainer.Root";
4008
+ var Content6 = composable6(({ children, thin, padding, centered, ...props }, forwardedRef) => {
4009
+ return /* @__PURE__ */ React39.createElement(ScrollArea.Root, {
4010
+ ...composableProps13(props, {
4011
+ classNames: "relative"
4012
+ }),
4013
+ thin,
4014
+ padding,
4015
+ centered,
4016
+ ref: forwardedRef
4017
+ }, children);
4018
+ });
4019
+ Content6.displayName = "ScrollContainer.Content";
4020
+ var VIEWPORT_NAME = "ScrollContainer.Viewport";
4021
+ var Viewport = slottable10(({ children, asChild, ...props }, forwardedRef) => {
4022
+ const scrollerRef = useRef6(null);
4023
+ const mergedRef = useMergeRefs([
4024
+ forwardedRef,
4025
+ scrollerRef
4026
+ ]);
4027
+ const { setViewport, setPinned, setOverflow } = useScrollContainerContext(VIEWPORT_NAME);
4028
+ useEffect8(() => {
4029
+ const el = scrollerRef.current;
4030
+ if (!el) {
4031
+ return;
4032
+ }
4033
+ setViewport(el);
4034
+ return combine(addEventListener2(el, "wheel", () => setPinned(isBottom(el))), addEventListener2(el, "scroll", () => setOverflow((el.scrollTop ?? 0) > 0)), () => setViewport(null));
4035
+ }, [
4036
+ setViewport,
4037
+ setPinned,
4038
+ setOverflow
4039
+ ]);
4040
+ return /* @__PURE__ */ React39.createElement(React39.Fragment, null, /* @__PURE__ */ React39.createElement(ScrollArea.Viewport, {
4041
+ asChild,
4042
+ ...composableProps13(props),
4043
+ ref: mergedRef
4044
+ }, children), /* @__PURE__ */ React39.createElement(PinEffect, {
4045
+ scrollerRef
4046
+ }));
4047
+ });
4048
+ Viewport.displayName = VIEWPORT_NAME;
4049
+ var PIN_EFFECT_NAME = "ScrollContainer.PinEffect";
4050
+ var PinEffect = ({ scrollerRef }) => {
4051
+ const { pinned, controller } = useScrollContainerContext(PIN_EFFECT_NAME);
4052
+ useEffect8(() => {
4053
+ const viewport = scrollerRef.current;
4054
+ if (!pinned || !viewport) {
4055
+ return;
4056
+ }
4057
+ controller?.scrollToBottom("instant");
4058
+ const resizeObserver = new ResizeObserver(() => controller?.scrollToBottom("smooth"));
4059
+ Array.from(viewport.children).forEach((child) => {
4060
+ resizeObserver.observe(child);
4061
+ });
4062
+ const mutationObserver = new MutationObserver((mutations) => {
4063
+ mutations.forEach((mutation) => {
4064
+ mutation.addedNodes.forEach((node) => {
4065
+ if (node instanceof Element) {
4066
+ resizeObserver.observe(node);
4067
+ }
4068
+ });
4069
+ });
4070
+ controller?.scrollToBottom("smooth");
4071
+ });
4072
+ mutationObserver.observe(viewport, {
4073
+ childList: true
4074
+ });
4075
+ return () => {
4076
+ resizeObserver.disconnect();
4077
+ mutationObserver.disconnect();
4078
+ };
4079
+ }, [
4080
+ pinned,
4081
+ controller,
4082
+ scrollerRef
4083
+ ]);
4084
+ return null;
4085
+ };
4086
+ var FADE_NAME = "ScrollContainer.Fade";
4087
+ var Fade = () => {
4088
+ const { overflow } = useScrollContainerContext(FADE_NAME);
4089
+ return /* @__PURE__ */ React39.createElement("div", {
4090
+ "data-visible": overflow,
4091
+ className: mx11(
4092
+ // NOTE: Gradients may not be visible with dark reader extensions.
4093
+ "z-10 absolute top-0 inset-x-0 h-24 w-full",
4094
+ 'opacity-0 duration-200 transition-opacity data-[visible="true"]:opacity-100',
4095
+ "bg-gradient-to-b from-(--color-base-surface) to-transparent pointer-events-none"
4096
+ )
4097
+ });
4098
+ };
4099
+ Fade.displayName = FADE_NAME;
4100
+ var SCROLL_DOWN_BUTTON_NAME = "ScrollContainer.ScrollDownButton";
4101
+ var ScrollDownButton = ({ classNames }) => {
4102
+ const { pinned, controller } = useScrollContainerContext(SCROLL_DOWN_BUTTON_NAME);
4103
+ return /* @__PURE__ */ React39.createElement("div", {
4104
+ className: mx11("absolute bottom-2 right-4 opacity-100 transition-opacity duration-300", pinned && "opacity-0", classNames)
4105
+ }, /* @__PURE__ */ React39.createElement(IconButton, {
4106
+ variant: "primary",
4107
+ icon: "ph--arrow-down--regular",
4108
+ iconOnly: true,
4109
+ size: 4,
4110
+ label: "Scroll down",
4111
+ onClick: () => controller?.scrollToBottom()
4112
+ }));
4113
+ };
4114
+ ScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
4115
+ var ScrollContainer = {
4116
+ Root: Root10,
4117
+ Content: Content6,
4118
+ Viewport,
4119
+ Fade,
4120
+ ScrollDownButton
4121
+ };
4122
+
4123
+ // src/components/Select/Select.tsx
4124
+ import * as SelectPrimitive from "@radix-ui/react-select";
4125
+ import React40, { forwardRef as forwardRef25 } from "react";
4126
+ var SelectRoot = SelectPrimitive.Root;
4127
+ var SelectTrigger = SelectPrimitive.Trigger;
4128
+ var SelectValue = SelectPrimitive.Value;
4129
+ var SelectIcon = SelectPrimitive.Icon;
4130
+ var SelectPortal = SelectPrimitive.Portal;
4131
+ var SelectTriggerButton = /* @__PURE__ */ forwardRef25(({ children, placeholder, ...props }, forwardedRef) => {
4132
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Trigger, {
4133
+ asChild: true,
4134
+ ref: forwardedRef
4135
+ }, /* @__PURE__ */ React40.createElement(Button, props, /* @__PURE__ */ React40.createElement(SelectPrimitive.Value, {
4136
+ placeholder
4137
+ }, children), /* @__PURE__ */ React40.createElement("span", {
4138
+ className: "w-1 flex-1"
4139
+ }), /* @__PURE__ */ React40.createElement(SelectPrimitive.Icon, {
4140
+ asChild: true
4141
+ }, /* @__PURE__ */ React40.createElement(Icon, {
4142
+ size: 3,
4143
+ icon: "ph--caret-down--bold"
4144
+ }))));
4145
+ });
4146
+ var SelectContent = /* @__PURE__ */ forwardRef25(({ classNames, children, collisionPadding = 8, ...props }, forwardedRef) => {
4147
+ const { tx } = useThemeContext();
4148
+ const elevation = useElevationContext();
4149
+ const safeCollisionPadding = useSafeCollisionPadding(collisionPadding);
4150
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Content, {
4151
+ ...props,
4152
+ "data-arrow-keys": "up down",
4153
+ collisionPadding: safeCollisionPadding,
4154
+ className: tx("select.content", {
4155
+ elevation
4156
+ }, classNames),
4157
+ position: "popper",
4158
+ ref: forwardedRef
4159
+ }, children);
4160
+ });
4161
+ var SelectScrollUpButton2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
4162
+ const { tx } = useThemeContext();
4163
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.SelectScrollUpButton, {
4164
+ ...props,
4165
+ className: tx("select.scrollButton", {}, classNames),
4166
+ ref: forwardedRef
4167
+ }, children ?? /* @__PURE__ */ React40.createElement(Icon, {
4168
+ size: 3,
4169
+ icon: "ph--caret-up--bold"
4170
+ }));
4171
+ });
4172
+ var SelectScrollDownButton2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
4173
+ const { tx } = useThemeContext();
4174
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.SelectScrollDownButton, {
4175
+ ...props,
4176
+ className: tx("select.scrollButton", {}, classNames),
4177
+ ref: forwardedRef
4178
+ }, children ?? /* @__PURE__ */ React40.createElement(Icon, {
4179
+ size: 3,
4180
+ icon: "ph--caret-down--bold"
4181
+ }));
4182
+ });
4183
+ var SelectViewport2 = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
4184
+ const { tx } = useThemeContext();
4185
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.SelectViewport, {
4186
+ ...props,
4187
+ className: tx("select.viewport", {}, classNames),
4188
+ ref: forwardedRef
4189
+ }, children);
4190
+ });
4191
+ var SelectItem = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
4192
+ const { tx } = useThemeContext();
4193
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Item, {
4194
+ ...props,
4195
+ className: tx("select.item", {}, classNames),
4196
+ ref: forwardedRef
4197
+ });
4198
+ });
4199
+ var SelectItemText = SelectPrimitive.ItemText;
4200
+ var SelectItemIndicator = /* @__PURE__ */ forwardRef25(({ classNames, children, ...props }, forwardedRef) => {
4201
+ const { tx } = useThemeContext();
4202
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.ItemIndicator, {
4203
+ ...props,
4204
+ className: tx("select.itemIndicator", {}, classNames),
4205
+ ref: forwardedRef
4206
+ }, children);
4207
+ });
4208
+ var SelectOption = /* @__PURE__ */ forwardRef25(({ children, classNames, ...props }, forwardedRef) => {
4209
+ const { tx } = useThemeContext();
4210
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Item, {
4211
+ ...props,
4212
+ className: tx("select.item", {}, classNames),
4213
+ ref: forwardedRef
4214
+ }, /* @__PURE__ */ React40.createElement(SelectPrimitive.ItemText, null, children), /* @__PURE__ */ React40.createElement("span", {
4215
+ className: "grow w-1"
4216
+ }), /* @__PURE__ */ React40.createElement(Icon, {
4217
+ icon: "ph--check--regular"
4218
+ }));
4219
+ });
4220
+ var SelectGroup = SelectPrimitive.Group;
4221
+ var SelectLabel = SelectPrimitive.Label;
4222
+ var SelectSeparator = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
4223
+ const { tx } = useThemeContext();
4224
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Separator, {
4225
+ ...props,
4226
+ className: tx("select.separator", {}, classNames),
4227
+ ref: forwardedRef
4228
+ });
4229
+ });
4230
+ var SelectArrow = /* @__PURE__ */ forwardRef25(({ classNames, ...props }, forwardedRef) => {
4231
+ const { tx } = useThemeContext();
4232
+ return /* @__PURE__ */ React40.createElement(SelectPrimitive.Arrow, {
4233
+ ...props,
4234
+ className: tx("select.arrow", {}, classNames),
4235
+ ref: forwardedRef
4236
+ });
4237
+ });
4238
+ var Select = {
4239
+ Root: SelectRoot,
4240
+ Trigger: SelectTrigger,
4241
+ TriggerButton: SelectTriggerButton,
4242
+ Value: SelectValue,
4243
+ Icon: SelectIcon,
4244
+ Portal: SelectPortal,
4245
+ Content: SelectContent,
4246
+ ScrollUpButton: SelectScrollUpButton2,
4247
+ ScrollDownButton: SelectScrollDownButton2,
4248
+ Viewport: SelectViewport2,
4249
+ Item: SelectItem,
4250
+ ItemText: SelectItemText,
4251
+ ItemIndicator: SelectItemIndicator,
4252
+ Option: SelectOption,
4253
+ Group: SelectGroup,
4254
+ Label: SelectLabel,
4255
+ Separator: SelectSeparator,
4256
+ Arrow: SelectArrow
4257
+ };
4258
+
4259
+ // src/components/Skeleton/Skeleton.tsx
4260
+ import React41, { forwardRef as forwardRef26 } from "react";
4261
+ var Skeleton = /* @__PURE__ */ forwardRef26(({ classNames, variant = "default", ...props }, forwardedRef) => {
4262
+ const { tx } = useThemeContext();
4263
+ return /* @__PURE__ */ React41.createElement("div", {
4264
+ ...props,
4265
+ className: tx("skeleton.root", {
4266
+ variant
4267
+ }, classNames),
4268
+ ref: forwardedRef
4269
+ });
4270
+ });
4271
+
4272
+ // src/components/Splitter/Splitter.tsx
4273
+ import { createContextScope as createContextScope4 } from "@radix-ui/react-context";
4274
+ import { Primitive as Primitive21 } from "@radix-ui/react-primitive";
4275
+ import { Slot as Slot21 } from "@radix-ui/react-slot";
4276
+ import React42 from "react";
4277
+ import { composableProps as composableProps14, slottable as slottable11 } from "@dxos/ui-theme";
4278
+ var SPLITTER_NAME = "Splitter";
4279
+ var [createSplitterContext, createSplitterScope] = createContextScope4(SPLITTER_NAME);
4280
+ var [SplitterProvider, useSplitterContext] = createSplitterContext(SPLITTER_NAME);
4281
+ var ROOT_NAME = "Splitter.Root";
4282
+ var Root12 = slottable11(({ asChild, mode = "top", ratio = 0.5, transition = 250, children, ...props }, forwardedRef) => {
4283
+ const { tx } = useThemeContext();
4284
+ const { __scopeSplitter, ...rest } = props;
4285
+ const { className, ...restProps } = composableProps14(rest);
4286
+ const Comp = asChild ? Slot21 : Primitive21.div;
4287
+ return /* @__PURE__ */ React42.createElement(SplitterProvider, {
4288
+ scope: __scopeSplitter,
4289
+ mode,
4290
+ ratio,
4291
+ transition
4292
+ }, /* @__PURE__ */ React42.createElement(Comp, {
4293
+ ...restProps,
4294
+ ref: forwardedRef,
4295
+ className: tx("splitter.root", {}, className)
4296
+ }, children));
4297
+ });
4298
+ Root12.displayName = ROOT_NAME;
4299
+ var PANEL_NAME = "Splitter.Panel";
4300
+ var Panel2 = slottable11(({ classNames, asChild, children, position, style, ...props }, forwardedRef) => {
4301
+ const { tx } = useThemeContext();
4302
+ const { __scopeSplitter, ...rest } = props;
4303
+ const Comp = asChild ? Slot21 : Primitive21.div;
4304
+ const { mode, ratio = 0.5, transition } = useSplitterContext(PANEL_NAME, __scopeSplitter);
4305
+ const { className, ...restProps } = composableProps14(rest);
4306
+ const isTopPanel = position === "top";
4307
+ const topOffset = isTopPanel ? "0%" : mode === "top" ? "100%" : mode === "bottom" ? "0%" : `${ratio * 100}%`;
4308
+ const height = isTopPanel ? mode === "top" ? "100%" : mode === "bottom" ? "0%" : `${ratio * 100}%` : mode === "bottom" ? "100%" : mode === "top" ? "0%" : `${(1 - ratio) * 100}%`;
4309
+ return /* @__PURE__ */ React42.createElement(Comp, {
4310
+ ...restProps,
4311
+ ref: forwardedRef,
4312
+ className: tx("splitter.panel", {}, className),
4313
+ style: {
4314
+ top: topOffset,
4315
+ height,
4316
+ transition: `top ${transition}ms, height ${transition}ms ease-out`,
4317
+ ...style
4318
+ }
4319
+ }, children);
4320
+ });
4321
+ Panel2.displayName = PANEL_NAME;
4322
+ var Splitter = {
4323
+ Root: Root12,
4324
+ Panel: Panel2
4325
+ };
4326
+
4327
+ // src/components/Tag/Tag.tsx
4328
+ import { Primitive as Primitive22 } from "@radix-ui/react-primitive";
4329
+ import { Slot as Slot22 } from "@radix-ui/react-slot";
4330
+ import React43, { forwardRef as forwardRef27 } from "react";
4331
+ var Tag = /* @__PURE__ */ forwardRef27(({ asChild, palette = "neutral", classNames, ...props }, forwardedRef) => {
4332
+ const { tx } = useThemeContext();
4333
+ const Comp = asChild ? Slot22 : Primitive22.span;
4334
+ return /* @__PURE__ */ React43.createElement(Comp, {
4335
+ ...props,
4336
+ className: tx("tag.root", {
4337
+ palette
4338
+ }, classNames),
4339
+ "data-hue": palette,
4340
+ ref: forwardedRef
4341
+ });
4342
+ });
4343
+
4344
+ // src/components/Toast/Toast.tsx
4345
+ import { Primitive as Primitive23 } from "@radix-ui/react-primitive";
4346
+ import { Slot as Slot23 } from "@radix-ui/react-slot";
4347
+ import * as ToastPrimitive from "@radix-ui/react-toast";
4348
+ import React44, { forwardRef as forwardRef28 } from "react";
4349
+ var ToastProvider = ToastPrimitive.Provider;
4350
+ var ToastViewport = /* @__PURE__ */ forwardRef28(({ classNames, ...props }, forwardedRef) => {
4351
+ const { tx } = useThemeContext();
4352
+ return /* @__PURE__ */ React44.createElement(ToastPrimitive.Viewport, {
4353
+ ...props,
4354
+ className: tx("toast.viewport", {}, classNames),
4355
+ ref: forwardedRef
4356
+ });
4357
+ });
4358
+ var ToastRoot = /* @__PURE__ */ forwardRef28(({ classNames, children, ...props }, forwardedRef) => {
4359
+ const { tx } = useThemeContext();
4360
+ return /* @__PURE__ */ React44.createElement(ToastPrimitive.Root, {
4361
+ ...props,
4362
+ className: tx("toast.root", {}, classNames),
4363
+ ref: forwardedRef
4364
+ }, /* @__PURE__ */ React44.createElement(ElevationProvider, {
4365
+ elevation: "toast"
4366
+ }, children));
4367
+ });
4368
+ var ToastBody = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4369
+ const { tx } = useThemeContext();
4370
+ const Comp = asChild ? Slot23 : Primitive23.div;
4371
+ return /* @__PURE__ */ React44.createElement(Comp, {
4372
+ ...props,
4373
+ className: tx("toast.body", {}, classNames),
4374
+ ref: forwardedRef
4375
+ });
4376
+ });
4377
+ var ToastTitle = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4378
+ const { tx } = useThemeContext();
4379
+ const Comp = asChild ? Slot23 : ToastPrimitive.Title;
4380
+ return /* @__PURE__ */ React44.createElement(Comp, {
4381
+ ...props,
4382
+ className: tx("toast.title", {}, classNames),
4383
+ ref: forwardedRef
4384
+ });
4385
+ });
4386
+ var ToastDescription = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4387
+ const { tx } = useThemeContext();
4388
+ const Comp = asChild ? Slot23 : ToastPrimitive.Description;
4389
+ return /* @__PURE__ */ React44.createElement(Comp, {
4390
+ ...props,
4391
+ className: tx("toast.description", {}, classNames),
4392
+ ref: forwardedRef
4393
+ });
4394
+ });
4395
+ var ToastActions = /* @__PURE__ */ forwardRef28(({ asChild, classNames, ...props }, forwardedRef) => {
4396
+ const { tx } = useThemeContext();
4397
+ const Comp = asChild ? Slot23 : Primitive23.div;
4398
+ return /* @__PURE__ */ React44.createElement(Comp, {
4399
+ ...props,
4400
+ className: tx("toast.actions", {}, classNames),
4401
+ ref: forwardedRef
4402
+ });
4403
+ });
4404
+ var ToastAction = ToastPrimitive.Action;
4405
+ var ToastClose = ToastPrimitive.Close;
4406
+ var Toast = {
4407
+ Provider: ToastProvider,
4408
+ Viewport: ToastViewport,
4409
+ Root: ToastRoot,
4410
+ Body: ToastBody,
4411
+ Title: ToastTitle,
4412
+ Description: ToastDescription,
4413
+ Actions: ToastActions,
4414
+ Action: ToastAction,
4415
+ Close: ToastClose
4416
+ };
79
4417
  export {
80
4418
  AlertDialog,
81
- AnchoredOverflow,
82
4419
  Avatar,
83
4420
  BUTTON_GROUP_NAME,
84
4421
  Breadcrumb,
85
4422
  Button,
86
4423
  ButtonGroup,
87
4424
  Callout,
4425
+ Card,
4426
+ Carousel,
88
4427
  Clipboard,
89
- ContextMenu,
4428
+ Column,
4429
+ Container,
4430
+ ContextMenu2 as ContextMenu,
90
4431
  DensityContext,
91
4432
  DensityProvider,
92
4433
  Dialog,
93
4434
  DropdownMenu,
94
4435
  ElevationContext,
95
4436
  ElevationProvider,
4437
+ ErrorBoundary,
4438
+ ErrorFallback,
4439
+ ErrorStack,
4440
+ Flex,
4441
+ Focus,
4442
+ Grid,
96
4443
  Icon,
97
4444
  IconButton,
4445
+ Image,
98
4446
  Input,
99
4447
  LIST_ITEM_NAME,
100
4448
  LIST_NAME,
@@ -102,18 +4450,27 @@ export {
102
4450
  List,
103
4451
  ListItem,
104
4452
  Main,
4453
+ MediaPlayer,
105
4454
  Message,
4455
+ Panel,
106
4456
  Popover,
107
4457
  ScrollArea,
4458
+ ScrollContainer,
108
4459
  Select,
109
- Separator,
4460
+ Separator3 as Separator,
4461
+ Skeleton,
4462
+ Splitter,
110
4463
  Status,
4464
+ TREEGRID_PARENT_OF_SEPARATOR,
4465
+ TREEGRID_PATH_SEPARATOR,
111
4466
  Tag,
112
4467
  ThemeContext,
113
4468
  ThemeProvider,
4469
+ ThrowError,
114
4470
  Toast,
115
4471
  Toggle,
116
4472
  ToggleGroup,
4473
+ ToggleGroupIconItem,
117
4474
  ToggleGroupItem,
118
4475
  Toolbar,
119
4476
  Tooltip,
@@ -123,25 +4480,34 @@ export {
123
4480
  Treegrid,
124
4481
  createDropdownMenuScope,
125
4482
  createPopoverScope,
4483
+ createSplitterScope,
126
4484
  createTooltipScope,
4485
+ detectMediaKind,
127
4486
  hasIosKeyboard,
128
4487
  initialSafeArea,
4488
+ isEmbedUrl,
129
4489
  isLabel,
130
4490
  messageIcons,
4491
+ parseCaptureOwnerStack,
131
4492
  toLocalizedString,
132
4493
  useAvatarContext,
133
4494
  useButtonGroupContext,
4495
+ useCarousel,
134
4496
  useClipboard,
135
4497
  useDensityContext,
136
4498
  useDropdownMenuContext,
137
4499
  useDropdownMenuMenuScope,
138
4500
  useElevationContext,
4501
+ useFocus,
139
4502
  useIconHref,
140
4503
  useLandmarkMover,
141
4504
  useListContext,
142
4505
  useListItemContext,
143
4506
  useMainContext,
4507
+ usePx,
144
4508
  useSafeArea,
4509
+ useSafeCollisionPadding,
4510
+ useScrollContainerContext,
145
4511
  useSidebars,
146
4512
  useThemeContext,
147
4513
  useTooltipContext,