@dxos/react-ui 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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