@dxos/react-ui 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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