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