@dxos/react-ui 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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