@dxos/react-ui 0.8.4-main.b97322e → 0.8.4-main.bd9b33e6c8

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