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