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