@dxos/plugin-simple-layout 0.8.4-main.d05673bc65 → 0.8.4-main.effb148878

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 (292) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/neutral/SimpleLayoutPlugin.mjs +52 -0
  3. package/dist/lib/neutral/SimpleLayoutPlugin.mjs.map +7 -0
  4. package/dist/lib/neutral/app-graph-builder-EYQKLRRP.mjs +21 -0
  5. package/dist/lib/neutral/app-graph-builder-EYQKLRRP.mjs.map +7 -0
  6. package/dist/lib/neutral/capabilities/index.mjs +21 -0
  7. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  8. package/dist/lib/neutral/chunk-5LQGH5KW.mjs +20 -0
  9. package/dist/lib/neutral/chunk-5LQGH5KW.mjs.map +7 -0
  10. package/dist/lib/neutral/chunk-7UDV3JDT.mjs +22 -0
  11. package/dist/lib/neutral/chunk-7UDV3JDT.mjs.map +7 -0
  12. package/dist/lib/neutral/chunk-FD2CAY4Q.mjs +26 -0
  13. package/dist/lib/neutral/chunk-FD2CAY4Q.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  15. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-Y2QR5SYD.mjs +8 -0
  17. package/dist/lib/neutral/chunk-Y2QR5SYD.mjs.map +7 -0
  18. package/dist/lib/neutral/close-WKMURGUB.mjs +35 -0
  19. package/dist/lib/neutral/close-WKMURGUB.mjs.map +7 -0
  20. package/dist/lib/neutral/components/index.mjs +928 -0
  21. package/dist/lib/neutral/components/index.mjs.map +7 -0
  22. package/dist/lib/neutral/hooks/index.mjs +332 -0
  23. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  24. package/dist/lib/neutral/index.mjs +14 -0
  25. package/dist/lib/neutral/index.mjs.map +7 -0
  26. package/dist/lib/neutral/meta.json +1 -0
  27. package/dist/lib/neutral/meta.mjs +8 -0
  28. package/dist/lib/neutral/meta.mjs.map +7 -0
  29. package/dist/lib/neutral/open-PEVXNVTV.mjs +51 -0
  30. package/dist/lib/neutral/open-PEVXNVTV.mjs.map +7 -0
  31. package/dist/lib/neutral/operation-handler-EAIE7KPR.mjs +13 -0
  32. package/dist/lib/neutral/operation-handler-EAIE7KPR.mjs.map +7 -0
  33. package/dist/lib/neutral/operations/index.mjs +8 -0
  34. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  35. package/dist/lib/neutral/plugin.mjs +16 -0
  36. package/dist/lib/neutral/plugin.mjs.map +7 -0
  37. package/dist/lib/{browser/react-root-WVQYY2JA.mjs → neutral/react-root-VE265VX4.mjs} +5 -8
  38. package/dist/lib/neutral/react-root-VE265VX4.mjs.map +7 -0
  39. package/dist/lib/{browser/react-surface-VLBR37ED.mjs → neutral/react-surface-YHXOHJI7.mjs} +16 -14
  40. package/dist/lib/neutral/react-surface-YHXOHJI7.mjs.map +7 -0
  41. package/dist/lib/neutral/revert-workspace-ST6NZUNG.mjs +22 -0
  42. package/dist/lib/neutral/revert-workspace-ST6NZUNG.mjs.map +7 -0
  43. package/dist/lib/neutral/set-6ZRLWPJS.mjs +22 -0
  44. package/dist/lib/neutral/set-6ZRLWPJS.mjs.map +7 -0
  45. package/dist/lib/neutral/set-layout-mode-L22HRCKS.mjs +13 -0
  46. package/dist/lib/neutral/set-layout-mode-L22HRCKS.mjs.map +7 -0
  47. package/dist/lib/{browser/spotlight-dismiss-67PHYS5B.mjs → neutral/spotlight-dismiss-EIYW5E7M.mjs} +7 -15
  48. package/dist/lib/{node-esm/spotlight-dismiss-RMLRZUVY.mjs.map → neutral/spotlight-dismiss-EIYW5E7M.mjs.map} +3 -3
  49. package/dist/lib/{browser/state-TXSMUWYI.mjs → neutral/state-7NXKBLPY.mjs} +5 -6
  50. package/dist/lib/neutral/state-7NXKBLPY.mjs.map +7 -0
  51. package/dist/lib/neutral/switch-workspace-PYWPTMFO.mjs +25 -0
  52. package/dist/lib/neutral/switch-workspace-PYWPTMFO.mjs.map +7 -0
  53. package/dist/lib/neutral/translations.mjs +36 -0
  54. package/dist/lib/neutral/translations.mjs.map +7 -0
  55. package/dist/lib/neutral/types/index.mjs +10 -0
  56. package/dist/lib/neutral/types/index.mjs.map +7 -0
  57. package/dist/lib/neutral/update-complementary-HKWF5OXT.mjs +33 -0
  58. package/dist/lib/neutral/update-complementary-HKWF5OXT.mjs.map +7 -0
  59. package/dist/lib/neutral/update-dialog-P4ASXCE7.mjs +30 -0
  60. package/dist/lib/neutral/update-dialog-P4ASXCE7.mjs.map +7 -0
  61. package/dist/lib/neutral/update-popover-REAKC2GN.mjs +34 -0
  62. package/dist/lib/neutral/update-popover-REAKC2GN.mjs.map +7 -0
  63. package/dist/lib/neutral/update-sidebar-O5SQPR6Q.mjs +12 -0
  64. package/dist/lib/neutral/update-sidebar-O5SQPR6Q.mjs.map +7 -0
  65. package/dist/lib/neutral/url-handler-GZXUUAHD.mjs +129 -0
  66. package/dist/lib/neutral/url-handler-GZXUUAHD.mjs.map +7 -0
  67. package/dist/types/src/SimpleLayoutPlugin.d.ts +2 -1
  68. package/dist/types/src/SimpleLayoutPlugin.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts +6 -0
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/index.d.ts +21 -6
  72. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  74. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/{spotlight-dismiss/spotlight-dismiss.d.ts → spotlight-dismiss.d.ts} +1 -1
  78. package/dist/types/src/capabilities/spotlight-dismiss.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/{state/state.d.ts → state.d.ts} +3 -3
  80. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/{url-handler/url-handler.d.ts → url-handler.d.ts} +1 -1
  82. package/dist/types/src/capabilities/url-handler.d.ts.map +1 -0
  83. package/dist/types/src/components/ContentError.stories.d.ts +26 -19
  84. package/dist/types/src/components/ContentError.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts +19 -0
  86. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts.map +1 -0
  87. package/dist/types/src/components/DebugOverlay/index.d.ts +2 -0
  88. package/dist/types/src/components/DebugOverlay/index.d.ts.map +1 -0
  89. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  90. package/dist/types/src/components/Home/Home.d.ts.map +1 -1
  91. package/dist/types/src/components/Loading/Loading.d.ts +3 -0
  92. package/dist/types/src/components/Loading/Loading.d.ts.map +1 -0
  93. package/dist/types/src/components/{ContentLoading/ContentLoading.stories.d.ts → Loading/Loading.stories.d.ts} +1 -1
  94. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +1 -0
  95. package/dist/types/src/components/Loading/index.d.ts +2 -0
  96. package/dist/types/src/components/Loading/index.d.ts.map +1 -0
  97. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts +2 -2
  98. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts.map +1 -1
  99. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -1
  101. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  102. package/dist/types/src/components/SimpleLayout/AppBar.d.ts +5 -7
  103. package/dist/types/src/components/SimpleLayout/AppBar.d.ts.map +1 -1
  104. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts +29 -22
  105. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/SimpleLayout/Drawer.d.ts +4 -7
  107. package/dist/types/src/components/SimpleLayout/Drawer.d.ts.map +1 -1
  108. package/dist/types/src/components/SimpleLayout/Main.d.ts +4 -7
  109. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
  110. package/dist/types/src/components/SimpleLayout/NavBar.d.ts +5 -7
  111. package/dist/types/src/components/SimpleLayout/NavBar.d.ts.map +1 -1
  112. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts +29 -23
  113. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/SimpleLayout/SimpleLayout.d.ts.map +1 -1
  115. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts +26 -25
  116. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts.map +1 -1
  117. package/dist/types/src/components/hooks.d.ts.map +1 -1
  118. package/dist/types/src/components/index.d.ts +2 -1
  119. package/dist/types/src/components/index.d.ts.map +1 -1
  120. package/dist/types/src/hooks/actions.d.ts +3 -3
  121. package/dist/types/src/hooks/actions.d.ts.map +1 -1
  122. package/dist/types/src/hooks/useAppBarProps.d.ts +2 -2
  123. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -1
  124. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
  125. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -1
  126. package/dist/types/src/hooks/useSimpleLayoutState.d.ts +3 -3
  127. package/dist/types/src/hooks/useSimpleLayoutState.d.ts.map +1 -1
  128. package/dist/types/src/index.d.ts +2 -1
  129. package/dist/types/src/index.d.ts.map +1 -1
  130. package/dist/types/src/meta.d.ts.map +1 -1
  131. package/dist/types/src/operations/close.d.ts +5 -0
  132. package/dist/types/src/operations/close.d.ts.map +1 -0
  133. package/dist/types/src/operations/index.d.ts +3 -0
  134. package/dist/types/src/operations/index.d.ts.map +1 -0
  135. package/dist/types/src/operations/open.d.ts +5 -0
  136. package/dist/types/src/operations/open.d.ts.map +1 -0
  137. package/dist/types/src/operations/revert-workspace.d.ts +5 -0
  138. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -0
  139. package/dist/types/src/operations/set-layout-mode.d.ts +5 -0
  140. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -0
  141. package/dist/types/src/operations/set.d.ts +5 -0
  142. package/dist/types/src/operations/set.d.ts.map +1 -0
  143. package/dist/types/src/operations/state-access.d.ts +8 -0
  144. package/dist/types/src/operations/state-access.d.ts.map +1 -0
  145. package/dist/types/src/operations/switch-workspace.d.ts +5 -0
  146. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -0
  147. package/dist/types/src/operations/update-complementary.d.ts +5 -0
  148. package/dist/types/src/operations/update-complementary.d.ts.map +1 -0
  149. package/dist/types/src/operations/update-dialog.d.ts +5 -0
  150. package/dist/types/src/operations/update-dialog.d.ts.map +1 -0
  151. package/dist/types/src/operations/update-popover.d.ts +5 -0
  152. package/dist/types/src/operations/update-popover.d.ts.map +1 -0
  153. package/dist/types/src/operations/update-sidebar.d.ts +5 -0
  154. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -0
  155. package/dist/types/src/plugin.d.ts +4 -0
  156. package/dist/types/src/plugin.d.ts.map +1 -0
  157. package/dist/types/src/translations.d.ts +26 -20
  158. package/dist/types/src/translations.d.ts.map +1 -1
  159. package/dist/types/src/types/{capabilities.d.ts → SimpleLayoutCapabilities.d.ts} +12 -10
  160. package/dist/types/src/types/SimpleLayoutCapabilities.d.ts.map +1 -0
  161. package/dist/types/src/types/SimpleLayoutEvents.d.ts +4 -0
  162. package/dist/types/src/types/SimpleLayoutEvents.d.ts.map +1 -0
  163. package/dist/types/src/types/index.d.ts +2 -2
  164. package/dist/types/src/types/index.d.ts.map +1 -1
  165. package/dist/types/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +89 -35
  167. package/src/SimpleLayoutPlugin.ts +19 -8
  168. package/src/capabilities/app-graph-builder.ts +21 -0
  169. package/src/capabilities/index.ts +13 -6
  170. package/src/capabilities/operation-handler.ts +14 -0
  171. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +2 -2
  172. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +13 -6
  173. package/src/capabilities/{state/state.tsx → state.tsx} +5 -6
  174. package/src/capabilities/url-handler.ts +164 -0
  175. package/src/components/ContentError.stories.tsx +1 -1
  176. package/src/components/DebugOverlay/DebugOverlay.tsx +96 -0
  177. package/src/components/DebugOverlay/index.ts +5 -0
  178. package/src/components/Dialog/Dialog.tsx +14 -3
  179. package/src/components/Home/Home.tsx +31 -31
  180. package/src/components/{ContentLoading/ContentLoading.stories.tsx → Loading/Loading.stories.tsx} +4 -4
  181. package/src/components/{ContentLoading/ContentLoading.tsx → Loading/Loading.tsx} +2 -2
  182. package/src/components/{ContentLoading → Loading}/index.ts +1 -1
  183. package/src/components/MobileLayout/MobileLayout.stories.tsx +21 -17
  184. package/src/components/MobileLayout/MobileLayout.tsx +118 -51
  185. package/src/components/NavBranch/NavBranch.tsx +27 -33
  186. package/src/components/Popover/Popover.tsx +14 -19
  187. package/src/components/SimpleLayout/AppBar.stories.tsx +10 -10
  188. package/src/components/SimpleLayout/AppBar.tsx +63 -60
  189. package/src/components/SimpleLayout/Drawer.tsx +30 -22
  190. package/src/components/SimpleLayout/Main.tsx +19 -23
  191. package/src/components/SimpleLayout/NavBar.stories.tsx +2 -2
  192. package/src/components/SimpleLayout/NavBar.tsx +8 -9
  193. package/src/components/SimpleLayout/SimpleLayout.stories.tsx +46 -69
  194. package/src/components/SimpleLayout/SimpleLayout.tsx +33 -34
  195. package/src/components/hooks.ts +1 -1
  196. package/src/components/index.ts +2 -1
  197. package/src/hooks/actions.ts +9 -6
  198. package/src/hooks/useAppBarProps.ts +9 -29
  199. package/src/hooks/useDrawerActions.ts +7 -7
  200. package/src/hooks/useNavbarActions.ts +4 -4
  201. package/src/hooks/useSimpleLayoutState.ts +7 -5
  202. package/src/index.ts +2 -1
  203. package/src/meta.ts +3 -1
  204. package/src/operations/close.ts +34 -0
  205. package/src/operations/index.ts +16 -0
  206. package/src/operations/open.ts +65 -0
  207. package/src/operations/revert-workspace.ts +22 -0
  208. package/src/operations/set-layout-mode.ts +12 -0
  209. package/src/operations/set.ts +23 -0
  210. package/src/operations/state-access.ts +21 -0
  211. package/src/operations/switch-workspace.ts +26 -0
  212. package/src/operations/update-complementary.ts +35 -0
  213. package/src/operations/update-dialog.ts +28 -0
  214. package/src/operations/update-popover.ts +35 -0
  215. package/src/operations/update-sidebar.ts +12 -0
  216. package/src/plugin.ts +11 -0
  217. package/src/translations.ts +21 -19
  218. package/src/types/{capabilities.ts → SimpleLayoutCapabilities.ts} +6 -18
  219. package/src/types/SimpleLayoutEvents.ts +15 -0
  220. package/src/types/index.ts +2 -2
  221. package/dist/lib/browser/chunk-MDPEKLKR.mjs +0 -1163
  222. package/dist/lib/browser/chunk-MDPEKLKR.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-MRR7PXSM.mjs +0 -29
  224. package/dist/lib/browser/chunk-MRR7PXSM.mjs.map +0 -7
  225. package/dist/lib/browser/index.mjs +0 -101
  226. package/dist/lib/browser/index.mjs.map +0 -7
  227. package/dist/lib/browser/meta.json +0 -1
  228. package/dist/lib/browser/operation-resolver-VTZ6HZ4B.mjs +0 -194
  229. package/dist/lib/browser/operation-resolver-VTZ6HZ4B.mjs.map +0 -7
  230. package/dist/lib/browser/react-root-WVQYY2JA.mjs.map +0 -7
  231. package/dist/lib/browser/react-surface-VLBR37ED.mjs.map +0 -7
  232. package/dist/lib/browser/spotlight-dismiss-67PHYS5B.mjs.map +0 -7
  233. package/dist/lib/browser/state-TXSMUWYI.mjs.map +0 -7
  234. package/dist/lib/browser/url-handler-RBRONH7S.mjs +0 -151
  235. package/dist/lib/browser/url-handler-RBRONH7S.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-DCKASLMP.mjs +0 -1164
  237. package/dist/lib/node-esm/chunk-DCKASLMP.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-WMNTJ2MK.mjs +0 -31
  239. package/dist/lib/node-esm/chunk-WMNTJ2MK.mjs.map +0 -7
  240. package/dist/lib/node-esm/index.mjs +0 -102
  241. package/dist/lib/node-esm/index.mjs.map +0 -7
  242. package/dist/lib/node-esm/meta.json +0 -1
  243. package/dist/lib/node-esm/operation-resolver-R7CQ6ERU.mjs +0 -195
  244. package/dist/lib/node-esm/operation-resolver-R7CQ6ERU.mjs.map +0 -7
  245. package/dist/lib/node-esm/react-root-XBNDM7BE.mjs +0 -22
  246. package/dist/lib/node-esm/react-root-XBNDM7BE.mjs.map +0 -7
  247. package/dist/lib/node-esm/react-surface-U5NHA367.mjs +0 -45
  248. package/dist/lib/node-esm/react-surface-U5NHA367.mjs.map +0 -7
  249. package/dist/lib/node-esm/spotlight-dismiss-RMLRZUVY.mjs +0 -68
  250. package/dist/lib/node-esm/state-JMX6FAG4.mjs +0 -49
  251. package/dist/lib/node-esm/state-JMX6FAG4.mjs.map +0 -7
  252. package/dist/lib/node-esm/url-handler-QSMCH3JB.mjs +0 -152
  253. package/dist/lib/node-esm/url-handler-QSMCH3JB.mjs.map +0 -7
  254. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  255. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  256. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  257. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  258. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  259. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  260. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  261. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  262. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  263. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  264. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts +0 -3
  265. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts.map +0 -1
  266. package/dist/types/src/capabilities/spotlight-dismiss/spotlight-dismiss.d.ts.map +0 -1
  267. package/dist/types/src/capabilities/state/index.d.ts +0 -13
  268. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  269. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  270. package/dist/types/src/capabilities/url-handler/index.d.ts +0 -3
  271. package/dist/types/src/capabilities/url-handler/index.d.ts.map +0 -1
  272. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +0 -1
  273. package/dist/types/src/components/ContentLoading/ContentLoading.d.ts +0 -3
  274. package/dist/types/src/components/ContentLoading/ContentLoading.d.ts.map +0 -1
  275. package/dist/types/src/components/ContentLoading/ContentLoading.stories.d.ts.map +0 -1
  276. package/dist/types/src/components/ContentLoading/index.d.ts +0 -2
  277. package/dist/types/src/components/ContentLoading/index.d.ts.map +0 -1
  278. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  279. package/dist/types/src/types/events.d.ts +0 -6
  280. package/dist/types/src/types/events.d.ts.map +0 -1
  281. package/src/capabilities/operation-resolver/index.ts +0 -10
  282. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -202
  283. package/src/capabilities/react-root/index.ts +0 -7
  284. package/src/capabilities/react-surface/index.ts +0 -7
  285. package/src/capabilities/spotlight-dismiss/index.ts +0 -7
  286. package/src/capabilities/state/index.ts +0 -9
  287. package/src/capabilities/url-handler/index.ts +0 -7
  288. package/src/capabilities/url-handler/url-handler.ts +0 -133
  289. package/src/types/events.ts +0 -15
  290. /package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +0 -0
  291. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
  292. /package/src/capabilities/{spotlight-dismiss/spotlight-dismiss.ts → spotlight-dismiss.ts} +0 -0
@@ -0,0 +1,928 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/components/DebugOverlay/DebugOverlay.tsx
4
+ import { createContext } from "@radix-ui/react-context";
5
+ import React, { useCallback, useRef } from "react";
6
+ var DEBUG_OVERLAY_NAME = "DebugOverlay";
7
+ var [DebugOverlayProvider, useDebugLog] = createContext(DEBUG_OVERLAY_NAME, {
8
+ dbg: () => {
9
+ }
10
+ });
11
+ var DebugOverlayRoot = ({ children, enabled = true, maxLines = 10 }) => {
12
+ const overlayRef = useRef(null);
13
+ const dbg = useCallback((msg) => {
14
+ if (!overlayRef.current) {
15
+ return;
16
+ }
17
+ const line = document.createElement("pre");
18
+ line.textContent = `${(performance.now() / 1e3).toFixed(2).padStart(8, " ")} ${msg}`;
19
+ overlayRef.current.prepend(line);
20
+ while (overlayRef.current.children.length > maxLines) {
21
+ overlayRef.current.lastChild?.remove();
22
+ }
23
+ }, []);
24
+ return /* @__PURE__ */ React.createElement(DebugOverlayProvider, {
25
+ dbg
26
+ }, children, enabled && /* @__PURE__ */ React.createElement("div", {
27
+ ref: overlayRef,
28
+ style: {
29
+ position: "fixed",
30
+ bottom: "calc(var(--kb-height, 0px) + 8px)",
31
+ left: 8,
32
+ right: 8,
33
+ background: "rgba(0,0,0,0.8)",
34
+ color: "#0f0",
35
+ fontSize: 10,
36
+ fontFamily: "monospace",
37
+ padding: 6,
38
+ borderRadius: 4,
39
+ zIndex: 9999,
40
+ pointerEvents: "none"
41
+ }
42
+ }));
43
+ };
44
+ var DebugOverlay = {
45
+ Root: DebugOverlayRoot
46
+ };
47
+
48
+ // src/components/Home/Home.tsx
49
+ import React2, { useCallback as useCallback2, useEffect as useEffect2, useMemo, useRef as useRef2 } from "react";
50
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
51
+ import { LayoutOperation } from "@dxos/app-toolkit";
52
+ import { useAppGraph as useAppGraph2 } from "@dxos/app-toolkit/ui";
53
+ import { Node, useConnections } from "@dxos/plugin-graph";
54
+ import { Avatar, Icon, ScrollArea, toLocalizedString, useTranslation } from "@dxos/react-ui";
55
+ import { Card } from "@dxos/react-ui";
56
+ import { Mosaic } from "@dxos/react-ui-mosaic";
57
+ import { SearchPanel, useSearchListItem, useSearchListResults } from "@dxos/react-ui-search";
58
+ import { mx } from "@dxos/ui-theme";
59
+ import { byPosition, getHostPlatform, isTauri } from "@dxos/util";
60
+ import { meta } from "#meta";
61
+
62
+ // src/components/hooks.ts
63
+ import { useEffect } from "react";
64
+ import { useAppGraph } from "@dxos/app-toolkit/ui";
65
+ import { Graph } from "@dxos/plugin-graph";
66
+ import { expandAttendableId } from "@dxos/react-ui-attention";
67
+ var useExpandPath = (nodeId) => {
68
+ const { graph } = useAppGraph();
69
+ useEffect(() => {
70
+ if (nodeId) {
71
+ for (const prefix of expandAttendableId(nodeId)) {
72
+ Graph.expand(graph, prefix, "child");
73
+ }
74
+ }
75
+ }, [
76
+ nodeId,
77
+ graph
78
+ ]);
79
+ };
80
+
81
+ // src/components/Home/Home.tsx
82
+ var Home = (_) => {
83
+ const { t } = useTranslation(meta.id);
84
+ const userAccountItem = useItemsByDisposition("user-account")[0];
85
+ const pinnedItems = useItemsByDisposition("pin-end", true);
86
+ const workspaceItems = useItemsByDisposition("workspace");
87
+ useExpandPath(Node.RootId);
88
+ const items = useMemo(() => [
89
+ ...userAccountItem ? [
90
+ userAccountItem
91
+ ] : [],
92
+ ...pinnedItems,
93
+ ...workspaceItems
94
+ ], [
95
+ userAccountItem,
96
+ pinnedItems,
97
+ workspaceItems
98
+ ]);
99
+ const { results, handleSearch } = useSearchListResults({
100
+ items,
101
+ extract: (node) => toLocalizedString(node.properties.label, t)
102
+ });
103
+ const autoFocus = !isTauri() || getHostPlatform() !== "ios";
104
+ return /* @__PURE__ */ React2.createElement(SearchPanel, {
105
+ onSearch: handleSearch
106
+ }, /* @__PURE__ */ React2.createElement(Mosaic.Container, {
107
+ asChild: true
108
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
109
+ centered: true,
110
+ padding: true,
111
+ thin: true
112
+ }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React2.createElement(Mosaic.Stack, {
113
+ classNames: "gap-1",
114
+ draggable: false,
115
+ items: results,
116
+ getId: (item) => item.id,
117
+ Tile: WorkspaceTile
118
+ })))));
119
+ };
120
+ var WorkspaceTile = (props) => {
121
+ const data = props.data;
122
+ const { t } = useTranslation(meta.id);
123
+ const { invokePromise } = useOperationInvoker();
124
+ const { selectedValue, registerItem, unregisterItem } = useSearchListItem();
125
+ const name = toLocalizedString(data.properties.label, t);
126
+ const isSelected = selectedValue === data.id;
127
+ const cardRef = useRef2(null);
128
+ useExpandPath(data.id);
129
+ const handleSelect = useCallback2(() => invokePromise(LayoutOperation.SwitchWorkspace, {
130
+ subject: data.id
131
+ }), [
132
+ invokePromise,
133
+ data.id
134
+ ]);
135
+ useEffect2(() => {
136
+ if (cardRef.current) {
137
+ registerItem(data.id, cardRef.current, handleSelect);
138
+ }
139
+ return () => unregisterItem(data.id);
140
+ }, [
141
+ data.id,
142
+ handleSelect,
143
+ registerItem,
144
+ unregisterItem
145
+ ]);
146
+ useEffect2(() => {
147
+ if (isSelected && cardRef.current) {
148
+ cardRef.current.scrollIntoView({
149
+ block: "nearest",
150
+ behavior: "smooth"
151
+ });
152
+ }
153
+ }, [
154
+ isSelected
155
+ ]);
156
+ return /* @__PURE__ */ React2.createElement(Card.Root, {
157
+ role: "button",
158
+ fullWidth: true,
159
+ tabIndex: -1,
160
+ "data-selected": isSelected,
161
+ classNames: mx("dx-focus-ring", isSelected && "bg-selected-surface"),
162
+ onClick: handleSelect,
163
+ ref: cardRef
164
+ }, /* @__PURE__ */ React2.createElement(Card.Header, {
165
+ density: "md"
166
+ }, /* @__PURE__ */ React2.createElement(Avatar.Root, null, /* @__PURE__ */ React2.createElement(Avatar.Content, {
167
+ icon: data.properties.icon,
168
+ hue: data.properties.hue,
169
+ hueVariant: "transparent",
170
+ variant: "square",
171
+ size: 8,
172
+ fallback: name
173
+ }), /* @__PURE__ */ React2.createElement(Avatar.Label, {
174
+ classNames: "cursor-pointer"
175
+ }, name), /* @__PURE__ */ React2.createElement(Icon, {
176
+ icon: "ph--caret-right--regular"
177
+ }))));
178
+ };
179
+ var filterItems = (node, disposition) => {
180
+ return node.properties.disposition === disposition;
181
+ };
182
+ var useItemsByDisposition = (disposition, sort = false) => {
183
+ const { graph } = useAppGraph2();
184
+ const connections = useConnections(graph, Node.RootId, "child");
185
+ return useMemo(() => {
186
+ const filtered = connections.filter((node) => filterItems(node, disposition));
187
+ return sort ? filtered.toSorted((a, b) => byPosition(a.properties, b.properties)) : filtered;
188
+ }, [
189
+ connections,
190
+ disposition,
191
+ sort
192
+ ]);
193
+ };
194
+
195
+ // src/components/Loading/Loading.tsx
196
+ import React3 from "react";
197
+ var Loading = () => {
198
+ return /* @__PURE__ */ React3.createElement("div", {
199
+ className: "grid place-items-center dx-attention-surface"
200
+ });
201
+ };
202
+
203
+ // src/components/MobileLayout/MobileLayout.tsx
204
+ import { createContext as createContext2 } from "@radix-ui/react-context";
205
+ import React4, { forwardRef, useEffect as useEffect3, useLayoutEffect, useState } from "react";
206
+ import { addEventListener, combine } from "@dxos/async";
207
+ import { log } from "@dxos/log";
208
+ import { mx as mx2 } from "@dxos/ui-theme";
209
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-simple-layout/src/components/MobileLayout/MobileLayout.tsx";
210
+ var MOBILE_LAYOUT_NAME = "MobileLayout";
211
+ var MOBILE_LAYOUT_ROOT_NAME = "MobileLayout.Root";
212
+ var MOBILE_LAYOUT_PANEL_NAME = "MobileLayout.Panel";
213
+ var [MobileLayoutProvider, useMobileLayout] = createContext2(MOBILE_LAYOUT_NAME);
214
+ var MobileLayoutRoot = /* @__PURE__ */ forwardRef(({ classNames, children, transition = 500, onKeyboardOpenChange, ...props }, forwardedRef) => {
215
+ const { open: keyboardOpen } = useIOSKeyboard();
216
+ useLockBodyScroll(keyboardOpen);
217
+ useAutoScroll();
218
+ useLayoutEffect(() => onKeyboardOpenChange?.(keyboardOpen), [
219
+ keyboardOpen,
220
+ onKeyboardOpenChange
221
+ ]);
222
+ return /* @__PURE__ */ React4.createElement(MobileLayoutProvider, {
223
+ keyboardOpen
224
+ }, /* @__PURE__ */ React4.createElement("div", {
225
+ ...props,
226
+ style: {
227
+ height: "calc(100vh - var(--kb-height, 0px))",
228
+ transition: `height ${keyboardOpen ? 0 : transition}ms ease-out`
229
+ },
230
+ className: mx2("fixed top-0 left-0 right-0 grid overflow-hidden", classNames),
231
+ ref: forwardedRef
232
+ }, children));
233
+ });
234
+ MobileLayoutRoot.displayName = MOBILE_LAYOUT_ROOT_NAME;
235
+ var MobileLayoutPanel = /* @__PURE__ */ forwardRef(({ classNames, children, safe, ...props }, forwardedRef) => {
236
+ return /* @__PURE__ */ React4.createElement("div", {
237
+ ...props,
238
+ style: {
239
+ paddingTop: safe?.top ? "env(safe-area-inset-top)" : void 0,
240
+ paddingBottom: safe?.bottom ? `calc((1 - var(--kb-open, 0)) * env(safe-area-inset-bottom))` : void 0
241
+ },
242
+ className: mx2(classNames),
243
+ ref: forwardedRef
244
+ }, children);
245
+ });
246
+ MobileLayoutPanel.displayName = MOBILE_LAYOUT_PANEL_NAME;
247
+ var MobileLayout = {
248
+ Root: MobileLayoutRoot,
249
+ Panel: MobileLayoutPanel
250
+ };
251
+ var useAutoScroll = () => {
252
+ const { dbg } = useDebugLog("useAutoScroll");
253
+ useEffect3(() => {
254
+ const resetScroll = () => {
255
+ if (window.scrollX !== 0 || window.scrollY !== 0) {
256
+ window.scrollTo(0, 0);
257
+ }
258
+ };
259
+ const detectContainerScroll = (event) => {
260
+ const el = event.target;
261
+ if (el === document.documentElement || el === document.body) {
262
+ return;
263
+ }
264
+ dbg(`scroll: ${el.tagName}.${Array.from(el.classList).slice(0, 2).join(".")} top=${el.scrollTop.toFixed(0)}`);
265
+ };
266
+ return combine(
267
+ addEventListener(window, "scroll", resetScroll),
268
+ window.visualViewport ? addEventListener(window.visualViewport, "scroll", resetScroll) : () => {
269
+ },
270
+ // TODO(burdon): Remove debug logging.
271
+ addEventListener(document, "scroll", detectContainerScroll, {
272
+ capture: true
273
+ }),
274
+ // Prevent focus-triggered scroll-into-view on inputs.
275
+ (() => {
276
+ let focusingWithPreventScroll = false;
277
+ return addEventListener(document, "focus", (event) => {
278
+ if (focusingWithPreventScroll) {
279
+ return;
280
+ }
281
+ const target = event.target;
282
+ if (target.tagName === "INPUT" || target.tagName === "TEXTAREA" || target.isContentEditable) {
283
+ focusingWithPreventScroll = true;
284
+ target.focus({
285
+ preventScroll: true
286
+ });
287
+ focusingWithPreventScroll = false;
288
+ }
289
+ }, {
290
+ capture: true
291
+ });
292
+ })()
293
+ );
294
+ }, [
295
+ dbg
296
+ ]);
297
+ };
298
+ var useLockBodyScroll = (enabled) => {
299
+ useEffect3(() => {
300
+ if (!enabled) {
301
+ return;
302
+ }
303
+ const isScrollable = (el, axis) => {
304
+ while (el && el !== document.body) {
305
+ const style = getComputedStyle(el);
306
+ if (axis === "y") {
307
+ const overflow = style.overflowY;
308
+ if ((overflow === "auto" || overflow === "scroll") && el.scrollHeight > el.clientHeight) {
309
+ return true;
310
+ }
311
+ } else {
312
+ const overflow = style.overflowX;
313
+ if ((overflow === "auto" || overflow === "scroll") && el.scrollWidth > el.clientWidth) {
314
+ return true;
315
+ }
316
+ }
317
+ el = el.parentElement;
318
+ }
319
+ return false;
320
+ };
321
+ let touchStartX = 0;
322
+ let touchStartY = 0;
323
+ return combine(
324
+ // Record initial touch position.
325
+ addEventListener(document, "touchstart", (event) => {
326
+ const touch = event.touches[0];
327
+ touchStartX = touch.clientX;
328
+ touchStartY = touch.clientY;
329
+ }, {
330
+ passive: true
331
+ }),
332
+ // Prevent scrolling the viewport.
333
+ addEventListener(document, "touchmove", (event) => {
334
+ const touch = event.touches[0];
335
+ const dx = Math.abs(touch.clientX - touchStartX);
336
+ const dy = Math.abs(touch.clientY - touchStartY);
337
+ if (!isScrollable(event.target, dx > dy ? "x" : "y")) {
338
+ event.preventDefault();
339
+ }
340
+ }, {
341
+ passive: false
342
+ })
343
+ );
344
+ }, [
345
+ enabled
346
+ ]);
347
+ };
348
+ var useIOSKeyboard = () => {
349
+ const { dbg } = useDebugLog("useIOSKeyboard");
350
+ const [open, setOpen] = useState(false);
351
+ const [height, setHeight] = useState(0);
352
+ const [duration, setDuration] = useState(void 0);
353
+ useEffect3(() => {
354
+ const viewport = window.visualViewport;
355
+ if (!viewport) {
356
+ return;
357
+ }
358
+ const initialHeight = viewport.height ?? window.innerHeight;
359
+ const updateState = (keyboardHeight, keyboardOpen, animationDuration) => {
360
+ setOpen(keyboardOpen);
361
+ setHeight(keyboardHeight);
362
+ setDuration(animationDuration);
363
+ const vvh = initialHeight - keyboardHeight;
364
+ document.documentElement.style.setProperty("--vvh", `${vvh}px`);
365
+ document.documentElement.style.setProperty("--kb-height", `${keyboardHeight}px`);
366
+ document.documentElement.style.setProperty("--kb-open", keyboardOpen ? "1" : "0");
367
+ log.info("viewport size", {
368
+ initialHeight,
369
+ vvh,
370
+ keyboardHeight,
371
+ keyboardOpen,
372
+ animationDuration
373
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 211, S: void 0 });
374
+ };
375
+ let rafId;
376
+ return combine(
377
+ // Handler for native iOS keyboard events (from KeyboardObserver.swift).
378
+ addEventListener(window, "keyboard", (event) => {
379
+ const { type, height: height2, duration: duration2 } = event.detail;
380
+ const durationMs = duration2 < 1 ? duration2 * 1e3 : duration2;
381
+ const vp = window.visualViewport;
382
+ dbg(`kb:${type} h=${height2} dur=${duration2} scrollY=${window.scrollY} vpOffset=${vp?.offsetTop?.toFixed(0) ?? "?"}`);
383
+ log.info("keyboard event", {
384
+ type,
385
+ height: height2,
386
+ duration: duration2
387
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 228, S: void 0 });
388
+ updateState(height2, type === "show", durationMs);
389
+ const end = performance.now() + durationMs + 300;
390
+ let prevOffsetTop = vp?.offsetTop ?? 0;
391
+ let prevScrollY = window.scrollY;
392
+ const monitorFrame = () => {
393
+ const offsetTop = vp?.offsetTop ?? 0;
394
+ const scrollY = window.scrollY;
395
+ if (offsetTop !== prevOffsetTop || scrollY !== prevScrollY) {
396
+ dbg(`\u0394 vpOffset=${offsetTop.toFixed(0)} scrollY=${scrollY.toFixed(0)}`);
397
+ prevOffsetTop = offsetTop;
398
+ prevScrollY = scrollY;
399
+ }
400
+ if (scrollY !== 0) {
401
+ window.scrollTo(0, 0);
402
+ }
403
+ if (performance.now() < end) {
404
+ rafId = requestAnimationFrame(monitorFrame);
405
+ }
406
+ };
407
+ rafId = requestAnimationFrame(monitorFrame);
408
+ }),
409
+ () => {
410
+ if (rafId !== void 0) {
411
+ cancelAnimationFrame(rafId);
412
+ }
413
+ }
414
+ );
415
+ }, [
416
+ dbg
417
+ ]);
418
+ return {
419
+ open,
420
+ height,
421
+ duration
422
+ };
423
+ };
424
+
425
+ // src/components/Popover/Popover.tsx
426
+ import { createContext as createContext3 } from "@radix-ui/react-context";
427
+ import React5, { useCallback as useCallback3, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef3, useState as useState2 } from "react";
428
+ import { Surface } from "@dxos/app-framework/ui";
429
+ import { AppSurface } from "@dxos/app-toolkit/ui";
430
+ import { Popover, toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
431
+ import { Card as Card2 } from "@dxos/react-ui";
432
+ import { useSimpleLayoutState } from "#hooks";
433
+ import { meta as meta2 } from "#meta";
434
+ var DEBOUNCE_DELAY = 40;
435
+ var [LayoutPopoverProvider, useLayoutPopoverContext] = createContext3("LayoutPopover");
436
+ var PopoverRoot = ({ children }) => {
437
+ const { state } = useSimpleLayoutState();
438
+ const [open, setOpen] = useState2(false);
439
+ const virtualRef = useRef3(null);
440
+ const [virtualIter, setVirtualIter] = useState2(0);
441
+ const debounceRef = useRef3(null);
442
+ useEffect4(() => {
443
+ setOpen(false);
444
+ if (state.popoverOpen) {
445
+ if (debounceRef.current) {
446
+ clearTimeout(debounceRef.current);
447
+ }
448
+ if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {
449
+ virtualRef.current = state.popoverAnchor ?? null;
450
+ setVirtualIter((iter) => iter + 1);
451
+ }
452
+ debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);
453
+ }
454
+ }, [
455
+ state.popoverOpen,
456
+ state.popoverAnchorId,
457
+ state.popoverAnchor,
458
+ state.popoverContent
459
+ ]);
460
+ return /* @__PURE__ */ React5.createElement(LayoutPopoverProvider, {
461
+ setOpen
462
+ }, /* @__PURE__ */ React5.createElement(Popover.Root, {
463
+ modal: false,
464
+ open
465
+ }, state.popoverAnchor && /* @__PURE__ */ React5.createElement(Popover.VirtualTrigger, {
466
+ key: virtualIter,
467
+ virtualRef
468
+ }), children));
469
+ };
470
+ var PopoverContent = () => {
471
+ const { t } = useTranslation2(meta2.id);
472
+ const { state, updateState } = useSimpleLayoutState();
473
+ const { setOpen } = useLayoutPopoverContext("PopoverContent");
474
+ const handleClose = useCallback3(() => {
475
+ setOpen(false);
476
+ updateState((s) => ({
477
+ ...s,
478
+ popoverOpen: false,
479
+ popoverAnchor: void 0,
480
+ popoverAnchorId: void 0,
481
+ popoverSide: void 0
482
+ }));
483
+ }, [
484
+ setOpen,
485
+ updateState
486
+ ]);
487
+ const handleInteractOutside = useCallback3((event) => {
488
+ if (
489
+ // TODO(thure): CodeMirror should not focus itself when it updates.
490
+ event.type === "dismissableLayer.focusOutside" && event.currentTarget?.classList.contains("cm-content")
491
+ ) {
492
+ event.preventDefault();
493
+ } else {
494
+ handleClose();
495
+ }
496
+ }, [
497
+ handleClose
498
+ ]);
499
+ const collisionBoundaries = useMemo2(() => {
500
+ const closest = state.popoverAnchor?.closest("[data-popover-collision-boundary]");
501
+ return closest ? [
502
+ closest
503
+ ] : [];
504
+ }, [
505
+ state.popoverAnchor
506
+ ]);
507
+ return /* @__PURE__ */ React5.createElement(Popover.Portal, null, /* @__PURE__ */ React5.createElement(Popover.Content, {
508
+ side: state.popoverSide,
509
+ sticky: "always",
510
+ hideWhenDetached: true,
511
+ collisionBoundary: collisionBoundaries,
512
+ onInteractOutside: handleInteractOutside,
513
+ onEscapeKeyDown: handleInteractOutside
514
+ }, /* @__PURE__ */ React5.createElement(Popover.Viewport, null, state.popoverKind === "base" && state.popoverContent && "component" in state.popoverContent && /* @__PURE__ */ React5.createElement(Surface.Surface, {
515
+ type: AppSurface.Popover,
516
+ data: state.popoverContent,
517
+ limit: 1
518
+ }), state.popoverKind === "card" && /* @__PURE__ */ React5.createElement(Card2.Root, {
519
+ border: false,
520
+ classNames: "dx-card-popover"
521
+ }, /* @__PURE__ */ React5.createElement(Card2.Header, null, /* @__PURE__ */ React5.createElement("span", null), state.popoverTitle ? /* @__PURE__ */ React5.createElement(Card2.Title, null, toLocalizedString2(state.popoverTitle, t)) : /* @__PURE__ */ React5.createElement("span", null), /* @__PURE__ */ React5.createElement(Card2.ActionIconButton, {
522
+ action: "close",
523
+ onClick: handleClose
524
+ })), state.popoverContent && "subject" in state.popoverContent && /* @__PURE__ */ React5.createElement(Surface.Surface, {
525
+ type: AppSurface.Card,
526
+ data: state.popoverContent,
527
+ limit: 1
528
+ }))), /* @__PURE__ */ React5.createElement(Popover.Arrow, null)));
529
+ };
530
+
531
+ // src/components/SimpleLayout/AppBar.tsx
532
+ import { useAtomValue } from "@effect-atom/atom-react";
533
+ import React6, { Fragment } from "react";
534
+ import { DensityProvider, IconButton, Popover as Popover2, Toolbar, useTranslation as useTranslation3 } from "@dxos/react-ui";
535
+ import { composable, composableProps } from "@dxos/react-ui";
536
+ import { Menu, useMenuActions } from "@dxos/react-ui-menu";
537
+ import { osTranslations } from "@dxos/ui-theme";
538
+ import { meta as meta3 } from "#meta";
539
+ var APP_BAR_NAME = "SimpleLayout.AppBar";
540
+ var AppBar = composable(({ classNames, title, actions, showBackButton, popoverAnchorId, onAction, onBack, ...props }, forwardedRef) => {
541
+ const { t } = useTranslation3(meta3.id);
542
+ const menuActions = useMenuActions(actions);
543
+ const actionsValue = useAtomValue(actions);
544
+ const hasActions = actionsValue.nodes.length > 0;
545
+ const { keyboardOpen } = useMobileLayout(APP_BAR_NAME);
546
+ const displayTitle = title ?? t("current-app.name", {
547
+ ns: osTranslations
548
+ });
549
+ const AnchorRoot = popoverAnchorId ? Popover2.Anchor : Fragment;
550
+ return /* @__PURE__ */ React6.createElement(DensityProvider, {
551
+ density: "md"
552
+ }, /* @__PURE__ */ React6.createElement(Toolbar.Root, {
553
+ ...composableProps(props, {
554
+ role: "banner",
555
+ classNames: "grid grid-cols-[var(--dx-rail-size)_1fr_var(--dx-rail-size)] items-center dx-density-md"
556
+ }),
557
+ ref: forwardedRef
558
+ }, keyboardOpen ? /* @__PURE__ */ React6.createElement(IconButton, {
559
+ variant: "ghost",
560
+ icon: "ph--x--regular",
561
+ iconOnly: true,
562
+ label: t("done.label")
563
+ }) : showBackButton ? /* @__PURE__ */ React6.createElement(IconButton, {
564
+ variant: "ghost",
565
+ icon: "ph--caret-left--regular",
566
+ iconOnly: true,
567
+ label: t("back.label"),
568
+ onClick: onBack
569
+ }) : /* @__PURE__ */ React6.createElement("div", null), /* @__PURE__ */ React6.createElement("h1", {
570
+ className: "text-center truncate font-thin uppercase"
571
+ }, displayTitle), hasActions ? /* @__PURE__ */ React6.createElement(AnchorRoot, null, /* @__PURE__ */ React6.createElement(Menu.Root, {
572
+ ...menuActions,
573
+ caller: meta3.id,
574
+ onAction
575
+ }, /* @__PURE__ */ React6.createElement(Menu.Trigger, {
576
+ asChild: true
577
+ }, /* @__PURE__ */ React6.createElement(IconButton, {
578
+ variant: "ghost",
579
+ icon: "ph--dots-three-vertical--regular",
580
+ iconOnly: true,
581
+ label: t("actions-menu.label")
582
+ })), /* @__PURE__ */ React6.createElement(Menu.Content, null))) : /* @__PURE__ */ React6.createElement("span", null)));
583
+ });
584
+ AppBar.displayName = APP_BAR_NAME;
585
+
586
+ // src/components/SimpleLayout/Main.tsx
587
+ import React8, { useMemo as useMemo3 } from "react";
588
+ import { Surface as Surface2 } from "@dxos/app-framework/ui";
589
+ import { AppSurface as AppSurface2, useAppGraph as useAppGraph3 } from "@dxos/app-toolkit/ui";
590
+ import { useNode } from "@dxos/plugin-graph";
591
+ import { ErrorFallback, Panel } from "@dxos/react-ui";
592
+ import { useAttentionAttributes } from "@dxos/react-ui-attention";
593
+ import { useAppBarProps, useNavbarActions, useSimpleLayoutState as useSimpleLayoutState2 } from "#hooks";
594
+
595
+ // src/components/SimpleLayout/NavBar.tsx
596
+ import React7 from "react";
597
+ import { composable as composable2, composableProps as composableProps2 } from "@dxos/react-ui";
598
+ import { Menu as Menu2, useMenuActions as useMenuActions2 } from "@dxos/react-ui-menu";
599
+ var NAVBAR_NAME = "SimpleLayout.NavBar";
600
+ var NavBar = composable2(({ actions, onAction, ...props }, forwardedRef) => {
601
+ const menuActions = useMenuActions2(actions);
602
+ return /* @__PURE__ */ React7.createElement(Menu2.Root, {
603
+ ...menuActions,
604
+ alwaysActive: true,
605
+ onAction
606
+ }, /* @__PURE__ */ React7.createElement(Menu2.Toolbar, {
607
+ ...composableProps2(props),
608
+ ref: forwardedRef
609
+ }));
610
+ });
611
+ NavBar.displayName = NAVBAR_NAME;
612
+
613
+ // src/components/SimpleLayout/Main.tsx
614
+ var MAIN_NAME = "SimpleLayout.Main";
615
+ var Main = () => {
616
+ const { state } = useSimpleLayoutState2();
617
+ const id = state.active ?? state.workspace;
618
+ const attentionAttrs = useAttentionAttributes(id);
619
+ const { keyboardOpen } = useMobileLayout(MAIN_NAME);
620
+ const { actions, onAction } = useNavbarActions();
621
+ const appBarProps = useAppBarProps();
622
+ const placeholder = useMemo3(() => /* @__PURE__ */ React8.createElement(Loading, null), []);
623
+ const { graph } = useAppGraph3();
624
+ const node = useNode(graph, id);
625
+ const data = useMemo3(() => {
626
+ return node && {
627
+ attendableId: id,
628
+ subject: node.data,
629
+ properties: node.properties,
630
+ popoverAnchorId: state.popoverAnchorId
631
+ };
632
+ }, [
633
+ id,
634
+ node,
635
+ node?.data,
636
+ node?.properties,
637
+ state.popoverAnchorId
638
+ ]);
639
+ useExpandPath(id);
640
+ const showNavBar = !keyboardOpen && !state.isPopover && state.drawerState === "closed";
641
+ return /* @__PURE__ */ React8.createElement(Panel.Root, {
642
+ ...attentionAttrs,
643
+ className: "dx-document"
644
+ }, /* @__PURE__ */ React8.createElement(Panel.Toolbar, {
645
+ asChild: true
646
+ }, /* @__PURE__ */ React8.createElement(AppBar, appBarProps)), /* @__PURE__ */ React8.createElement(Panel.Content, {
647
+ role: "article",
648
+ className: "bg-base-surface"
649
+ }, /* @__PURE__ */ React8.createElement(Surface2.Surface, {
650
+ key: id,
651
+ type: AppSurface2.Article,
652
+ data,
653
+ limit: 1,
654
+ fallback: ErrorFallback,
655
+ placeholder
656
+ })), showNavBar && /* @__PURE__ */ React8.createElement(Panel.Statusbar, {
657
+ asChild: true
658
+ }, /* @__PURE__ */ React8.createElement(NavBar, {
659
+ actions,
660
+ onAction
661
+ })));
662
+ };
663
+ Main.displayName = MAIN_NAME;
664
+
665
+ // src/components/SimpleLayout/SimpleLayout.tsx
666
+ import React11, { useLayoutEffect as useLayoutEffect2, useRef as useRef4, useState as useState3 } from "react";
667
+ import { Splitter } from "@dxos/react-ui";
668
+ import { Mosaic as Mosaic2 } from "@dxos/react-ui-mosaic";
669
+ import { useSimpleLayoutState as useSimpleLayoutState5 } from "#hooks";
670
+
671
+ // src/components/Dialog/Dialog.tsx
672
+ import React9 from "react";
673
+ import { Surface as Surface3 } from "@dxos/app-framework/ui";
674
+ import { AppSurface as AppSurface3 } from "@dxos/app-toolkit/ui";
675
+ import { AlertDialog, Dialog as NaturalDialog } from "@dxos/react-ui";
676
+ import { ErrorFallback as ErrorFallback2 } from "@dxos/react-ui";
677
+ import { useSimpleLayoutState as useSimpleLayoutState3 } from "#hooks";
678
+ var Dialog = () => {
679
+ const { state, updateState } = useSimpleLayoutState3();
680
+ const DialogRoot = state.dialogType === "alert" ? AlertDialog.Root : NaturalDialog.Root;
681
+ const DialogOverlay = state.dialogType === "alert" ? AlertDialog.Overlay : NaturalDialog.Overlay;
682
+ return /* @__PURE__ */ React9.createElement(DialogRoot, {
683
+ modal: state.dialogBlockAlign !== "end",
684
+ open: state.dialogOpen,
685
+ onOpenChange: (nextOpen) => updateState((state2) => ({
686
+ ...state2,
687
+ dialogOpen: nextOpen
688
+ }))
689
+ }, state.dialogBlockAlign === "end" ? /* @__PURE__ */ React9.createElement(Surface3.Surface, {
690
+ type: AppSurface3.Dialog,
691
+ data: state.dialogContent ?? void 0,
692
+ limit: 1,
693
+ fallback: ErrorFallback2
694
+ }) : /* @__PURE__ */ React9.createElement(DialogOverlay, {
695
+ blockAlign: state.dialogBlockAlign,
696
+ classNames: state.dialogOverlayClasses,
697
+ style: state.dialogOverlayStyle
698
+ }, /* @__PURE__ */ React9.createElement(Surface3.Surface, {
699
+ type: AppSurface3.Dialog,
700
+ data: state.dialogContent ?? void 0,
701
+ limit: 1,
702
+ fallback: ErrorFallback2
703
+ })));
704
+ };
705
+
706
+ // src/components/SimpleLayout/Drawer.tsx
707
+ import React10, { useMemo as useMemo4 } from "react";
708
+ import { Surface as Surface4 } from "@dxos/app-framework/ui";
709
+ import { AppSurface as AppSurface4, useAppGraph as useAppGraph4 } from "@dxos/app-toolkit/ui";
710
+ import { useNode as useNode2 } from "@dxos/plugin-graph";
711
+ import { ErrorFallback as ErrorFallback3, Panel as Panel2 } from "@dxos/react-ui";
712
+ import { getLinkedVariant } from "@dxos/react-ui-attention";
713
+ import { Menu as Menu3, useMenuActions as useMenuActions3 } from "@dxos/react-ui-menu";
714
+ import { useCompanions, useDrawerActions, useSimpleLayoutState as useSimpleLayoutState4 } from "#hooks";
715
+ var DRAWER_NAME = "SimpleLayout.Drawer";
716
+ var Drawer = () => {
717
+ const { graph } = useAppGraph4();
718
+ const { state: layoutState } = useSimpleLayoutState4();
719
+ const placeholder = useMemo4(() => /* @__PURE__ */ React10.createElement(Loading, null), []);
720
+ const activeId = layoutState.active ?? layoutState.workspace;
721
+ const companions = useCompanions(activeId);
722
+ const { companionId, variant } = useSelectedCompanion(companions, layoutState.companionVariant);
723
+ const node = useNode2(graph, companionId);
724
+ const parentNode = useNode2(graph, activeId);
725
+ const data = useMemo4(() => {
726
+ if (!node || !companionId) {
727
+ return void 0;
728
+ }
729
+ return {
730
+ attendableId: companionId,
731
+ subject: node.data,
732
+ companionTo: parentNode?.data,
733
+ properties: node.properties,
734
+ variant
735
+ };
736
+ }, [
737
+ companionId,
738
+ node,
739
+ parentNode,
740
+ variant
741
+ ]);
742
+ const { actions, onAction } = useDrawerActions(DRAWER_NAME);
743
+ const menuActions = useMenuActions3(actions);
744
+ return /* @__PURE__ */ React10.createElement(Panel2.Root, null, /* @__PURE__ */ React10.createElement(Panel2.Toolbar, null, /* @__PURE__ */ React10.createElement(Menu3.Root, {
745
+ ...menuActions,
746
+ alwaysActive: true,
747
+ onAction
748
+ }, /* @__PURE__ */ React10.createElement(Menu3.Toolbar, null))), /* @__PURE__ */ React10.createElement(Panel2.Content, null, /* @__PURE__ */ React10.createElement(Surface4.Surface, {
749
+ type: AppSurface4.Article,
750
+ data,
751
+ limit: 1,
752
+ fallback: ErrorFallback3,
753
+ placeholder
754
+ })));
755
+ };
756
+ Drawer.displayName = DRAWER_NAME;
757
+ var useSelectedCompanion = (companions, preferredVariant) => {
758
+ const selectedCompanion = useMemo4(() => {
759
+ if (companions.length === 0) {
760
+ return void 0;
761
+ }
762
+ if (preferredVariant) {
763
+ const preferred = companions.find((c) => getLinkedVariant(c.id) === preferredVariant);
764
+ if (preferred) {
765
+ return preferred;
766
+ }
767
+ }
768
+ return companions[0];
769
+ }, [
770
+ companions,
771
+ preferredVariant
772
+ ]);
773
+ const companionId = selectedCompanion?.id;
774
+ const variant = companionId ? getLinkedVariant(companionId) : void 0;
775
+ return {
776
+ selectedCompanion,
777
+ companionId,
778
+ variant
779
+ };
780
+ };
781
+
782
+ // src/components/SimpleLayout/SimpleLayout.tsx
783
+ var SimpleLayout = () => {
784
+ const { state } = useSimpleLayoutState5();
785
+ const [keyboardOpen, setKeyboardOpen] = useState3(false);
786
+ const [splitterMode, setSplitterMode] = useState3("top");
787
+ const drawerRef = useRef4(null);
788
+ useLayoutEffect2(() => {
789
+ if (!keyboardOpen) {
790
+ setSplitterMode(state.drawerState === "closed" ? "top" : state.drawerState === "open" ? "split" : "bottom");
791
+ }
792
+ }, [
793
+ state.drawerState,
794
+ keyboardOpen
795
+ ]);
796
+ return /* @__PURE__ */ React11.createElement(DebugOverlay.Root, {
797
+ enabled: false
798
+ }, /* @__PURE__ */ React11.createElement(PopoverRoot, null, /* @__PURE__ */ React11.createElement(Mosaic2.Root, null, /* @__PURE__ */ React11.createElement(MobileLayout.Root, {
799
+ classNames: "dx-container grid relative bg-toolbar-surface",
800
+ onKeyboardOpenChange: (nextKeyboardOpen) => setKeyboardOpen(nextKeyboardOpen)
801
+ }, /* @__PURE__ */ React11.createElement(MobileLayout.Panel, {
802
+ safe: {
803
+ top: true,
804
+ bottom: splitterMode === "top"
805
+ }
806
+ }, /* @__PURE__ */ React11.createElement(Splitter.Root, {
807
+ mode: splitterMode,
808
+ ratio: 0.55
809
+ }, /* @__PURE__ */ React11.createElement(Splitter.Panel, {
810
+ position: "top"
811
+ }, /* @__PURE__ */ React11.createElement(Main, null)), /* @__PURE__ */ React11.createElement(Splitter.Panel, {
812
+ position: "bottom",
813
+ ref: drawerRef
814
+ }, /* @__PURE__ */ React11.createElement(Drawer, null))), /* @__PURE__ */ React11.createElement(Dialog, null), /* @__PURE__ */ React11.createElement(PopoverContent, null))))));
815
+ };
816
+
817
+ // src/components/NavBranch/NavBranch.tsx
818
+ import React12, { useCallback as useCallback4, useEffect as useEffect5, useMemo as useMemo5, useRef as useRef5 } from "react";
819
+ import { useOperationInvoker as useOperationInvoker2 } from "@dxos/app-framework/ui";
820
+ import { LayoutOperation as LayoutOperation2 } from "@dxos/app-toolkit";
821
+ import { useAppGraph as useAppGraph5 } from "@dxos/app-toolkit/ui";
822
+ import { useConnections as useConnections2 } from "@dxos/plugin-graph";
823
+ import { Avatar as Avatar2, Icon as Icon2, ScrollArea as ScrollArea2, toLocalizedString as toLocalizedString3, useTranslation as useTranslation4 } from "@dxos/react-ui";
824
+ import { Card as Card3 } from "@dxos/react-ui";
825
+ import { Mosaic as Mosaic3 } from "@dxos/react-ui-mosaic";
826
+ import { SearchPanel as SearchPanel2, useSearchListItem as useSearchListItem2, useSearchListResults as useSearchListResults2 } from "@dxos/react-ui-search";
827
+ import { mx as mx3 } from "@dxos/ui-theme";
828
+ import { meta as meta4 } from "#meta";
829
+ var NavBranch = ({ id }) => {
830
+ const { t } = useTranslation4(meta4.id);
831
+ const { graph } = useAppGraph5();
832
+ useExpandPath(id);
833
+ const children = useConnections2(graph, id, "child");
834
+ const visibleChildren = useMemo5(() => children.filter((node) => node.properties.disposition !== "hidden"), [
835
+ children
836
+ ]);
837
+ const { results, handleSearch } = useSearchListResults2({
838
+ items: visibleChildren,
839
+ extract: (child) => toLocalizedString3(child.properties.label, t)
840
+ });
841
+ return /* @__PURE__ */ React12.createElement(SearchPanel2, {
842
+ onSearch: handleSearch
843
+ }, /* @__PURE__ */ React12.createElement(Mosaic3.Container, {
844
+ asChild: true
845
+ }, /* @__PURE__ */ React12.createElement(ScrollArea2.Root, {
846
+ centered: true,
847
+ padding: true,
848
+ thin: true
849
+ }, /* @__PURE__ */ React12.createElement(ScrollArea2.Viewport, null, /* @__PURE__ */ React12.createElement(Mosaic3.Stack, {
850
+ classNames: "gap-1",
851
+ draggable: false,
852
+ items: results,
853
+ getId: (item) => item.id,
854
+ Tile: NavBranchTile
855
+ })))));
856
+ };
857
+ var NavBranchTile = (props) => {
858
+ const data = props.data;
859
+ const { t } = useTranslation4(meta4.id);
860
+ const { invokePromise } = useOperationInvoker2();
861
+ const ref = useRef5(null);
862
+ const { selectedValue, registerItem, unregisterItem } = useSearchListItem2();
863
+ const isSelected = selectedValue === data.id;
864
+ const name = toLocalizedString3(data.properties.label, t);
865
+ const handleSelect = useCallback4(() => void invokePromise(LayoutOperation2.Open, {
866
+ subject: [
867
+ data.id
868
+ ]
869
+ }), [
870
+ invokePromise,
871
+ data.id
872
+ ]);
873
+ useEffect5(() => {
874
+ if (ref.current) {
875
+ registerItem(data.id, ref.current, handleSelect);
876
+ }
877
+ return () => unregisterItem(data.id);
878
+ }, [
879
+ data.id,
880
+ handleSelect,
881
+ registerItem,
882
+ unregisterItem
883
+ ]);
884
+ useEffect5(() => {
885
+ if (isSelected && ref.current) {
886
+ ref.current.scrollIntoView({
887
+ block: "nearest",
888
+ behavior: "smooth"
889
+ });
890
+ }
891
+ }, [
892
+ isSelected
893
+ ]);
894
+ return /* @__PURE__ */ React12.createElement(Card3.Root, {
895
+ ref,
896
+ role: "button",
897
+ fullWidth: true,
898
+ tabIndex: -1,
899
+ "data-selected": isSelected,
900
+ classNames: mx3("dx-focus-ring cursor-pointer", isSelected && "bg-selected-surface"),
901
+ onClick: handleSelect
902
+ }, /* @__PURE__ */ React12.createElement(Card3.Header, null, /* @__PURE__ */ React12.createElement(Avatar2.Root, null, /* @__PURE__ */ React12.createElement(Avatar2.Content, {
903
+ hue: data.properties.hue,
904
+ icon: data.properties.icon,
905
+ hueVariant: "transparent",
906
+ variant: "square",
907
+ size: 8,
908
+ fallback: name
909
+ }), /* @__PURE__ */ React12.createElement(Avatar2.Label, null, name), /* @__PURE__ */ React12.createElement(Icon2, {
910
+ icon: "ph--caret-right--regular"
911
+ }))));
912
+ };
913
+ export {
914
+ AppBar,
915
+ DebugOverlay,
916
+ Home,
917
+ Loading,
918
+ Main,
919
+ MobileLayout,
920
+ NavBar,
921
+ NavBranch,
922
+ PopoverContent,
923
+ PopoverRoot,
924
+ SimpleLayout,
925
+ useDebugLog,
926
+ useMobileLayout
927
+ };
928
+ //# sourceMappingURL=index.mjs.map