@dxos/plugin-simple-layout 0.8.4-main.7996785055 → 0.8.4-main.8baae0fced

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 (294) 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/{browser/chunk-XJVW3PRY.mjs → neutral/chunk-7UDV3JDT.mjs} +4 -4
  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/{browser/close-OT5JOGVY.mjs → neutral/close-WKMURGUB.mjs} +5 -4
  19. package/dist/lib/{node-esm/close-PEVHREL2.mjs.map → neutral/close-WKMURGUB.mjs.map} +1 -1
  20. package/dist/lib/{browser/chunk-J5FQ32AV.mjs → neutral/components/index.mjs} +261 -591
  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-6KIGPLUT.mjs → neutral/react-root-VE265VX4.mjs} +5 -8
  38. package/dist/lib/neutral/react-root-VE265VX4.mjs.map +7 -0
  39. package/dist/lib/{node-esm/react-surface-WLKB6AET.mjs → neutral/react-surface-YHXOHJI7.mjs} +16 -15
  40. package/dist/lib/neutral/react-surface-YHXOHJI7.mjs.map +7 -0
  41. package/dist/lib/{browser/revert-workspace-DLE265AN.mjs → neutral/revert-workspace-ST6NZUNG.mjs} +5 -4
  42. package/dist/lib/{node-esm/revert-workspace-XZXT64YA.mjs.map → neutral/revert-workspace-ST6NZUNG.mjs.map} +1 -1
  43. package/dist/lib/{browser/set-52HGTSH4.mjs → neutral/set-6ZRLWPJS.mjs} +5 -4
  44. package/dist/lib/{node-esm/set-5I6LFH5L.mjs.map → neutral/set-6ZRLWPJS.mjs.map} +1 -1
  45. package/dist/lib/{browser/set-layout-mode-T6QI3DGU.mjs → neutral/set-layout-mode-L22HRCKS.mjs} +4 -2
  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/{browser/switch-workspace-5Y6T4BWJ.mjs → neutral/switch-workspace-PYWPTMFO.mjs} +5 -4
  52. package/dist/lib/{node-esm/switch-workspace-PB6T2SGY.mjs.map → neutral/switch-workspace-PYWPTMFO.mjs.map} +1 -1
  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/{browser/update-complementary-MX3TTVAB.mjs → neutral/update-complementary-HKWF5OXT.mjs} +8 -6
  58. package/dist/lib/neutral/update-complementary-HKWF5OXT.mjs.map +7 -0
  59. package/dist/lib/{browser/update-dialog-FPAPZXKO.mjs → neutral/update-dialog-P4ASXCE7.mjs} +5 -4
  60. package/dist/lib/{node-esm/update-dialog-ID267DCL.mjs.map → neutral/update-dialog-P4ASXCE7.mjs.map} +1 -1
  61. package/dist/lib/{browser/update-popover-6V5ZTIYN.mjs → neutral/update-popover-REAKC2GN.mjs} +5 -4
  62. package/dist/lib/{node-esm/update-popover-RLHU2HF4.mjs.map → neutral/update-popover-REAKC2GN.mjs.map} +1 -1
  63. package/dist/lib/{browser/update-sidebar-WHDKYMV7.mjs → neutral/update-sidebar-O5SQPR6Q.mjs} +4 -2
  64. package/dist/lib/neutral/update-sidebar-O5SQPR6Q.mjs.map +7 -0
  65. package/dist/lib/{node-esm/url-handler-WMONO2T6.mjs → neutral/url-handler-GZXUUAHD.mjs} +45 -80
  66. package/dist/lib/neutral/url-handler-GZXUUAHD.mjs.map +7 -0
  67. package/dist/types/src/SimpleLayoutPlugin.d.ts +1 -0
  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/operation-handler.d.ts → operation-handler.d.ts} +1 -1
  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 +21 -19
  84. package/dist/types/src/components/ContentError.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/DebugOverlay/DebugOverlay.d.ts.map +1 -1
  86. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  87. package/dist/types/src/components/Home/Home.d.ts.map +1 -1
  88. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts +2 -2
  90. package/dist/types/src/components/MobileLayout/MobileLayout.d.ts.map +1 -1
  91. package/dist/types/src/components/MobileLayout/MobileLayout.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/NavBranch/NavBranch.d.ts.map +1 -1
  93. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  94. package/dist/types/src/components/SimpleLayout/AppBar.d.ts +1 -5
  95. package/dist/types/src/components/SimpleLayout/AppBar.d.ts.map +1 -1
  96. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts +21 -19
  97. package/dist/types/src/components/SimpleLayout/AppBar.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/SimpleLayout/Drawer.d.ts +4 -7
  99. package/dist/types/src/components/SimpleLayout/Drawer.d.ts.map +1 -1
  100. package/dist/types/src/components/SimpleLayout/Main.d.ts +4 -7
  101. package/dist/types/src/components/SimpleLayout/Main.d.ts.map +1 -1
  102. package/dist/types/src/components/SimpleLayout/NavBar.d.ts +1 -5
  103. package/dist/types/src/components/SimpleLayout/NavBar.d.ts.map +1 -1
  104. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts +22 -24
  105. package/dist/types/src/components/SimpleLayout/NavBar.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts +21 -19
  107. package/dist/types/src/components/SimpleLayout/SimpleLayout.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/hooks.d.ts.map +1 -1
  109. package/dist/types/src/hooks/actions.d.ts +3 -3
  110. package/dist/types/src/hooks/actions.d.ts.map +1 -1
  111. package/dist/types/src/hooks/useAppBarProps.d.ts +2 -2
  112. package/dist/types/src/hooks/useAppBarProps.d.ts.map +1 -1
  113. package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
  114. package/dist/types/src/hooks/useDrawerActions.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useSimpleLayoutState.d.ts +3 -3
  116. package/dist/types/src/hooks/useSimpleLayoutState.d.ts.map +1 -1
  117. package/dist/types/src/index.d.ts +2 -1
  118. package/dist/types/src/index.d.ts.map +1 -1
  119. package/dist/types/src/meta.d.ts.map +1 -1
  120. package/dist/types/src/operations/close.d.ts +1 -1
  121. package/dist/types/src/operations/close.d.ts.map +1 -1
  122. package/dist/types/src/operations/index.d.ts +1 -1
  123. package/dist/types/src/operations/index.d.ts.map +1 -1
  124. package/dist/types/src/operations/open.d.ts +1 -1
  125. package/dist/types/src/operations/open.d.ts.map +1 -1
  126. package/dist/types/src/operations/revert-workspace.d.ts +1 -1
  127. package/dist/types/src/operations/revert-workspace.d.ts.map +1 -1
  128. package/dist/types/src/operations/set-layout-mode.d.ts +1 -1
  129. package/dist/types/src/operations/set-layout-mode.d.ts.map +1 -1
  130. package/dist/types/src/operations/set.d.ts +1 -1
  131. package/dist/types/src/operations/set.d.ts.map +1 -1
  132. package/dist/types/src/operations/state-access.d.ts +3 -3
  133. package/dist/types/src/operations/state-access.d.ts.map +1 -1
  134. package/dist/types/src/operations/switch-workspace.d.ts +1 -1
  135. package/dist/types/src/operations/switch-workspace.d.ts.map +1 -1
  136. package/dist/types/src/operations/update-complementary.d.ts +1 -1
  137. package/dist/types/src/operations/update-complementary.d.ts.map +1 -1
  138. package/dist/types/src/operations/update-dialog.d.ts +1 -1
  139. package/dist/types/src/operations/update-dialog.d.ts.map +1 -1
  140. package/dist/types/src/operations/update-popover.d.ts +1 -1
  141. package/dist/types/src/operations/update-popover.d.ts.map +1 -1
  142. package/dist/types/src/operations/update-sidebar.d.ts +1 -1
  143. package/dist/types/src/operations/update-sidebar.d.ts.map +1 -1
  144. package/dist/types/src/plugin.d.ts +4 -0
  145. package/dist/types/src/plugin.d.ts.map +1 -0
  146. package/dist/types/src/translations.d.ts +21 -20
  147. package/dist/types/src/translations.d.ts.map +1 -1
  148. package/dist/types/src/types/{capabilities.d.ts → SimpleLayoutCapabilities.d.ts} +12 -10
  149. package/dist/types/src/types/SimpleLayoutCapabilities.d.ts.map +1 -0
  150. package/dist/types/src/types/SimpleLayoutEvents.d.ts +4 -0
  151. package/dist/types/src/types/SimpleLayoutEvents.d.ts.map +1 -0
  152. package/dist/types/src/types/index.d.ts +2 -2
  153. package/dist/types/src/types/index.d.ts.map +1 -1
  154. package/dist/types/tsconfig.tsbuildinfo +1 -1
  155. package/package.json +87 -33
  156. package/src/SimpleLayoutPlugin.ts +17 -6
  157. package/src/capabilities/app-graph-builder.ts +21 -0
  158. package/src/capabilities/index.ts +13 -6
  159. package/src/capabilities/{operation-handler/operation-handler.ts → operation-handler.ts} +2 -2
  160. package/src/capabilities/{react-root/react-root.tsx → react-root.tsx} +2 -2
  161. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +13 -6
  162. package/src/capabilities/{state/state.tsx → state.tsx} +5 -6
  163. package/src/capabilities/url-handler.ts +164 -0
  164. package/src/components/ContentError.stories.tsx +1 -1
  165. package/src/components/Dialog/Dialog.tsx +14 -3
  166. package/src/components/Home/Home.tsx +3 -2
  167. package/src/components/Loading/Loading.tsx +1 -1
  168. package/src/components/MobileLayout/MobileLayout.stories.tsx +13 -13
  169. package/src/components/MobileLayout/MobileLayout.tsx +0 -2
  170. package/src/components/NavBranch/NavBranch.tsx +4 -7
  171. package/src/components/Popover/Popover.tsx +10 -5
  172. package/src/components/SimpleLayout/AppBar.stories.tsx +7 -7
  173. package/src/components/SimpleLayout/AppBar.tsx +45 -42
  174. package/src/components/SimpleLayout/Drawer.tsx +24 -16
  175. package/src/components/SimpleLayout/Main.tsx +5 -5
  176. package/src/components/SimpleLayout/NavBar.stories.tsx +2 -2
  177. package/src/components/SimpleLayout/SimpleLayout.stories.tsx +10 -10
  178. package/src/components/SimpleLayout/SimpleLayout.tsx +9 -9
  179. package/src/components/hooks.ts +1 -1
  180. package/src/hooks/actions.ts +8 -5
  181. package/src/hooks/useAppBarProps.ts +4 -24
  182. package/src/hooks/useDrawerActions.ts +6 -6
  183. package/src/hooks/useNavbarActions.ts +4 -4
  184. package/src/hooks/useSimpleLayoutState.ts +7 -5
  185. package/src/index.ts +2 -1
  186. package/src/meta.ts +3 -1
  187. package/src/operations/close.ts +1 -1
  188. package/src/operations/index.ts +1 -1
  189. package/src/operations/open.ts +36 -3
  190. package/src/operations/revert-workspace.ts +1 -1
  191. package/src/operations/set-layout-mode.ts +1 -1
  192. package/src/operations/set.ts +1 -1
  193. package/src/operations/state-access.ts +5 -3
  194. package/src/operations/switch-workspace.ts +1 -1
  195. package/src/operations/update-complementary.ts +4 -3
  196. package/src/operations/update-dialog.ts +1 -1
  197. package/src/operations/update-popover.ts +1 -1
  198. package/src/operations/update-sidebar.ts +1 -1
  199. package/src/plugin.ts +11 -0
  200. package/src/translations.ts +20 -19
  201. package/src/types/{capabilities.ts → SimpleLayoutCapabilities.ts} +6 -18
  202. package/src/types/SimpleLayoutEvents.ts +15 -0
  203. package/src/types/index.ts +2 -2
  204. package/dist/lib/browser/chunk-J5FQ32AV.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-MRR7PXSM.mjs +0 -29
  206. package/dist/lib/browser/chunk-MRR7PXSM.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-XJVW3PRY.mjs.map +0 -7
  208. package/dist/lib/browser/close-OT5JOGVY.mjs.map +0 -7
  209. package/dist/lib/browser/index.mjs +0 -102
  210. package/dist/lib/browser/index.mjs.map +0 -7
  211. package/dist/lib/browser/meta.json +0 -1
  212. package/dist/lib/browser/open-4FQ44Z5G.mjs +0 -31
  213. package/dist/lib/browser/open-4FQ44Z5G.mjs.map +0 -7
  214. package/dist/lib/browser/operation-handler-OAD7LISD.mjs +0 -16
  215. package/dist/lib/browser/operation-handler-OAD7LISD.mjs.map +0 -7
  216. package/dist/lib/browser/react-root-6KIGPLUT.mjs.map +0 -7
  217. package/dist/lib/browser/react-surface-JLIEQGOL.mjs +0 -44
  218. package/dist/lib/browser/react-surface-JLIEQGOL.mjs.map +0 -7
  219. package/dist/lib/browser/revert-workspace-DLE265AN.mjs.map +0 -7
  220. package/dist/lib/browser/set-52HGTSH4.mjs.map +0 -7
  221. package/dist/lib/browser/set-layout-mode-T6QI3DGU.mjs.map +0 -7
  222. package/dist/lib/browser/spotlight-dismiss-67PHYS5B.mjs.map +0 -7
  223. package/dist/lib/browser/state-TXSMUWYI.mjs.map +0 -7
  224. package/dist/lib/browser/switch-workspace-5Y6T4BWJ.mjs.map +0 -7
  225. package/dist/lib/browser/update-complementary-MX3TTVAB.mjs.map +0 -7
  226. package/dist/lib/browser/update-dialog-FPAPZXKO.mjs.map +0 -7
  227. package/dist/lib/browser/update-popover-6V5ZTIYN.mjs.map +0 -7
  228. package/dist/lib/browser/update-sidebar-WHDKYMV7.mjs.map +0 -7
  229. package/dist/lib/browser/url-handler-GUJ3L7Y3.mjs +0 -163
  230. package/dist/lib/browser/url-handler-GUJ3L7Y3.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-27K22G6S.mjs +0 -23
  232. package/dist/lib/node-esm/chunk-27K22G6S.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-EXNDYZTP.mjs +0 -1257
  234. package/dist/lib/node-esm/chunk-EXNDYZTP.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-WMNTJ2MK.mjs +0 -31
  236. package/dist/lib/node-esm/chunk-WMNTJ2MK.mjs.map +0 -7
  237. package/dist/lib/node-esm/close-PEVHREL2.mjs +0 -35
  238. package/dist/lib/node-esm/index.mjs +0 -103
  239. package/dist/lib/node-esm/index.mjs.map +0 -7
  240. package/dist/lib/node-esm/meta.json +0 -1
  241. package/dist/lib/node-esm/open-LMJY7JCJ.mjs +0 -32
  242. package/dist/lib/node-esm/open-LMJY7JCJ.mjs.map +0 -7
  243. package/dist/lib/node-esm/operation-handler-A2DC4WHC.mjs +0 -18
  244. package/dist/lib/node-esm/operation-handler-A2DC4WHC.mjs.map +0 -7
  245. package/dist/lib/node-esm/react-root-5SCW2KTH.mjs +0 -22
  246. package/dist/lib/node-esm/react-root-5SCW2KTH.mjs.map +0 -7
  247. package/dist/lib/node-esm/react-surface-WLKB6AET.mjs.map +0 -7
  248. package/dist/lib/node-esm/revert-workspace-XZXT64YA.mjs +0 -22
  249. package/dist/lib/node-esm/set-5I6LFH5L.mjs +0 -22
  250. package/dist/lib/node-esm/set-layout-mode-F5B6QLZM.mjs +0 -13
  251. package/dist/lib/node-esm/set-layout-mode-F5B6QLZM.mjs.map +0 -7
  252. package/dist/lib/node-esm/spotlight-dismiss-RMLRZUVY.mjs +0 -68
  253. package/dist/lib/node-esm/state-JMX6FAG4.mjs +0 -49
  254. package/dist/lib/node-esm/state-JMX6FAG4.mjs.map +0 -7
  255. package/dist/lib/node-esm/switch-workspace-PB6T2SGY.mjs +0 -25
  256. package/dist/lib/node-esm/update-complementary-FTW423IY.mjs +0 -32
  257. package/dist/lib/node-esm/update-complementary-FTW423IY.mjs.map +0 -7
  258. package/dist/lib/node-esm/update-dialog-ID267DCL.mjs +0 -30
  259. package/dist/lib/node-esm/update-popover-RLHU2HF4.mjs +0 -34
  260. package/dist/lib/node-esm/update-sidebar-BJ7HTNZ4.mjs +0 -12
  261. package/dist/lib/node-esm/update-sidebar-BJ7HTNZ4.mjs.map +0 -7
  262. package/dist/lib/node-esm/url-handler-WMONO2T6.mjs.map +0 -7
  263. package/dist/types/src/capabilities/operation-handler/index.d.ts +0 -4
  264. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +0 -1
  265. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +0 -1
  266. package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
  267. package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
  268. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
  269. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  270. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  271. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  272. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts +0 -3
  273. package/dist/types/src/capabilities/spotlight-dismiss/index.d.ts.map +0 -1
  274. package/dist/types/src/capabilities/spotlight-dismiss/spotlight-dismiss.d.ts.map +0 -1
  275. package/dist/types/src/capabilities/state/index.d.ts +0 -13
  276. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  277. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  278. package/dist/types/src/capabilities/url-handler/index.d.ts +0 -3
  279. package/dist/types/src/capabilities/url-handler/index.d.ts.map +0 -1
  280. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +0 -1
  281. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  282. package/dist/types/src/types/events.d.ts +0 -6
  283. package/dist/types/src/types/events.d.ts.map +0 -1
  284. package/src/capabilities/operation-handler/index.ts +0 -9
  285. package/src/capabilities/react-root/index.ts +0 -7
  286. package/src/capabilities/react-surface/index.ts +0 -7
  287. package/src/capabilities/spotlight-dismiss/index.ts +0 -7
  288. package/src/capabilities/state/index.ts +0 -9
  289. package/src/capabilities/url-handler/index.ts +0 -7
  290. package/src/capabilities/url-handler/url-handler.ts +0 -145
  291. package/src/types/events.ts +0 -15
  292. /package/dist/types/src/capabilities/{react-root/react-root.d.ts → react-root.d.ts} +0 -0
  293. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
  294. /package/src/capabilities/{spotlight-dismiss/spotlight-dismiss.ts → spotlight-dismiss.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-simple-layout",
3
- "version": "0.8.4-main.7996785055",
3
+ "version": "0.8.4-main.8baae0fced",
4
4
  "description": "Simple layout plugin for minimal UI contexts like popover windows.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -8,16 +8,67 @@
8
8
  "type": "git",
9
9
  "url": "https://github.com/dxos/dxos"
10
10
  },
11
- "license": "MIT",
11
+ "license": "FSL-1.1-Apache-2.0",
12
12
  "author": "DXOS.org",
13
13
  "sideEffects": true,
14
14
  "type": "module",
15
+ "imports": {
16
+ "#capabilities": {
17
+ "source": "./src/capabilities/index.ts",
18
+ "types": "./dist/types/src/capabilities/index.d.ts",
19
+ "default": "./dist/lib/neutral/capabilities/index.mjs"
20
+ },
21
+ "#components": {
22
+ "source": "./src/components/index.ts",
23
+ "types": "./dist/types/src/components/index.d.ts",
24
+ "default": "./dist/lib/neutral/components/index.mjs"
25
+ },
26
+ "#hooks": {
27
+ "source": "./src/hooks/index.ts",
28
+ "types": "./dist/types/src/hooks/index.d.ts",
29
+ "default": "./dist/lib/neutral/hooks/index.mjs"
30
+ },
31
+ "#meta": {
32
+ "source": "./src/meta.ts",
33
+ "types": "./dist/types/src/meta.d.ts",
34
+ "default": "./dist/lib/neutral/meta.mjs"
35
+ },
36
+ "#operations": {
37
+ "source": "./src/operations/index.ts",
38
+ "types": "./dist/types/src/operations/index.d.ts",
39
+ "default": "./dist/lib/neutral/operations/index.mjs"
40
+ },
41
+ "#plugin": {
42
+ "source": "./src/SimpleLayoutPlugin.ts",
43
+ "types": "./dist/types/src/SimpleLayoutPlugin.d.ts",
44
+ "default": "./dist/lib/neutral/SimpleLayoutPlugin.mjs"
45
+ },
46
+ "#translations": {
47
+ "source": "./src/translations.ts",
48
+ "types": "./dist/types/src/translations.d.ts",
49
+ "default": "./dist/lib/neutral/translations.mjs"
50
+ },
51
+ "#types": {
52
+ "source": "./src/types/index.ts",
53
+ "types": "./dist/types/src/types/index.d.ts",
54
+ "default": "./dist/lib/neutral/types/index.mjs"
55
+ }
56
+ },
15
57
  "exports": {
16
58
  ".": {
17
59
  "source": "./src/index.ts",
18
- "browser": "./dist/lib/browser/index.mjs",
19
- "node": "./dist/lib/node-esm/index.mjs",
20
- "types": "./dist/types/src/index.d.ts"
60
+ "types": "./dist/types/src/index.d.ts",
61
+ "default": "./dist/lib/neutral/index.mjs"
62
+ },
63
+ "./plugin": {
64
+ "source": "./src/plugin.ts",
65
+ "types": "./dist/types/src/plugin.d.ts",
66
+ "default": "./dist/lib/neutral/plugin.mjs"
67
+ },
68
+ "./translations": {
69
+ "source": "./src/translations.ts",
70
+ "types": "./dist/types/src/translations.d.ts",
71
+ "default": "./dist/lib/neutral/translations.mjs"
21
72
  }
22
73
  },
23
74
  "types": "dist/types/src/index.d.ts",
@@ -29,22 +80,26 @@
29
80
  "@effect-atom/atom": "^0.5.1",
30
81
  "@effect-atom/atom-react": "^0.5.0",
31
82
  "@radix-ui/react-context": "1.1.1",
32
- "@tauri-apps/plugin-deep-link": "^2.2.0",
83
+ "@tauri-apps/plugin-deep-link": "^2.4.9",
33
84
  "@tauri-apps/plugin-haptics": "^2.3.2",
34
- "@dxos/app-framework": "0.8.4-main.7996785055",
35
- "@dxos/echo": "0.8.4-main.7996785055",
36
- "@dxos/async": "0.8.4-main.7996785055",
37
- "@dxos/log": "0.8.4-main.7996785055",
38
- "@dxos/plugin-graph": "0.8.4-main.7996785055",
39
- "@dxos/react-ui-menu": "0.8.4-main.7996785055",
40
- "@dxos/react-ui-mosaic": "0.8.4-main.7996785055",
41
- "@dxos/react-ui-search": "0.8.4-main.7996785055",
42
- "@dxos/react-ui-stack": "0.8.4-main.7996785055",
43
- "@dxos/react-ui-attention": "0.8.4-main.7996785055",
44
- "@dxos/schema": "0.8.4-main.7996785055",
45
- "@dxos/util": "0.8.4-main.7996785055",
46
- "@dxos/operation": "0.8.4-main.7996785055",
47
- "@dxos/app-toolkit": "0.8.4-main.7996785055"
85
+ "@dxos/async": "0.8.4-main.8baae0fced",
86
+ "@dxos/app-framework": "0.8.4-main.8baae0fced",
87
+ "@dxos/app-toolkit": "0.8.4-main.8baae0fced",
88
+ "@dxos/context": "0.8.4-main.8baae0fced",
89
+ "@dxos/compute": "0.8.4-main.8baae0fced",
90
+ "@dxos/effect": "0.8.4-main.8baae0fced",
91
+ "@dxos/echo": "0.8.4-main.8baae0fced",
92
+ "@dxos/plugin-client": "0.8.4-main.8baae0fced",
93
+ "@dxos/log": "0.8.4-main.8baae0fced",
94
+ "@dxos/plugin-graph": "0.8.4-main.8baae0fced",
95
+ "@dxos/react-ui-attention": "0.8.4-main.8baae0fced",
96
+ "@dxos/react-ui-list": "0.8.4-main.8baae0fced",
97
+ "@dxos/react-ui-menu": "0.8.4-main.8baae0fced",
98
+ "@dxos/react-ui-search": "0.8.4-main.8baae0fced",
99
+ "@dxos/react-ui-mosaic": "0.8.4-main.8baae0fced",
100
+ "@dxos/react-ui-stack": "0.8.4-main.8baae0fced",
101
+ "@dxos/util": "0.8.4-main.8baae0fced",
102
+ "@dxos/schema": "0.8.4-main.8baae0fced"
48
103
  },
49
104
  "devDependencies": {
50
105
  "@types/react": "~19.2.7",
@@ -52,24 +107,23 @@
52
107
  "effect": "3.20.0",
53
108
  "react": "~19.2.3",
54
109
  "react-dom": "~19.2.3",
55
- "vite": "^7.1.11",
56
- "@dxos/app-graph": "0.8.4-main.7996785055",
57
- "@dxos/plugin-client": "0.8.4-main.7996785055",
58
- "@dxos/plugin-preview": "0.8.4-main.7996785055",
59
- "@dxos/plugin-search": "0.8.4-main.7996785055",
60
- "@dxos/plugin-space": "0.8.4-main.7996785055",
61
- "@dxos/plugin-testing": "0.8.4-main.7996785055",
62
- "@dxos/schema": "0.8.4-main.7996785055",
63
- "@dxos/ui-theme": "0.8.4-main.7996785055",
64
- "@dxos/storybook-utils": "0.8.4-main.7996785055",
65
- "@dxos/react-ui": "0.8.4-main.7996785055"
110
+ "vite": "^8.0.13",
111
+ "@dxos/app-graph": "0.8.4-main.8baae0fced",
112
+ "@dxos/plugin-preview": "0.8.4-main.8baae0fced",
113
+ "@dxos/plugin-search": "0.8.4-main.8baae0fced",
114
+ "@dxos/plugin-space": "0.8.4-main.8baae0fced",
115
+ "@dxos/plugin-testing": "0.8.4-main.8baae0fced",
116
+ "@dxos/schema": "0.8.4-main.8baae0fced",
117
+ "@dxos/react-ui": "0.8.4-main.8baae0fced",
118
+ "@dxos/ui-theme": "0.8.4-main.8baae0fced",
119
+ "@dxos/storybook-utils": "0.8.4-main.8baae0fced"
66
120
  },
67
121
  "peerDependencies": {
68
122
  "effect": "3.20.0",
69
123
  "react": "~19.2.3",
70
124
  "react-dom": "~19.2.3",
71
- "@dxos/react-ui": "0.8.4-main.7996785055",
72
- "@dxos/ui-theme": "0.8.4-main.7996785055"
125
+ "@dxos/ui-theme": "0.8.4-main.8baae0fced",
126
+ "@dxos/react-ui": "0.8.4-main.8baae0fced"
73
127
  },
74
128
  "publishConfig": {
75
129
  "access": "public"
@@ -5,10 +5,18 @@
5
5
  import { ActivationEvent, ActivationEvents, Capability, Plugin } from '@dxos/app-framework';
6
6
  import { AppActivationEvents, AppPlugin } from '@dxos/app-toolkit';
7
7
 
8
- import { OperationHandler, ReactRoot, ReactSurface, SpotlightDismiss, State, UrlHandler } from './capabilities';
9
- import { meta } from './meta';
10
- import { translations } from './translations';
11
- import { SimpleLayoutEvents } from './types';
8
+ import {
9
+ AppGraphBuilder,
10
+ OperationHandler,
11
+ ReactRoot,
12
+ ReactSurface,
13
+ SpotlightDismiss,
14
+ State,
15
+ UrlHandler,
16
+ } from '#capabilities';
17
+ import { meta } from '#meta';
18
+ import { translations } from '#translations';
19
+ import { SimpleLayoutEvents } from '#types';
12
20
 
13
21
  export type SimpleLayoutPluginOptions = {
14
22
  /** Determines if running in popover window context (hides mobile-specific UI). */
@@ -16,12 +24,13 @@ export type SimpleLayoutPluginOptions = {
16
24
  };
17
25
 
18
26
  export const SimpleLayoutPlugin = Plugin.define<SimpleLayoutPluginOptions>(meta).pipe(
27
+ AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
19
28
  AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
20
29
  AppPlugin.addTranslationsModule({ translations }),
21
30
  Plugin.addModule(({ isPopover = false }) => ({
22
31
  id: Capability.getModuleTag(State),
23
32
  activatesOn: ActivationEvents.Startup,
24
- activatesAfter: [SimpleLayoutEvents.StateReady, AppActivationEvents.LayoutReady],
33
+ firesAfterActivation: [SimpleLayoutEvents.StateReady, AppActivationEvents.LayoutReady],
25
34
  activate: () => State({ initialState: { isPopover } }),
26
35
  })),
27
36
  Plugin.addModule(({ isPopover = false }) => ({
@@ -41,8 +50,10 @@ export const SimpleLayoutPlugin = Plugin.define<SimpleLayoutPluginOptions>(meta)
41
50
  }),
42
51
  Plugin.addModule({
43
52
  id: Capability.getModuleTag(UrlHandler),
44
- activatesOn: ActivationEvent.allOf(ActivationEvents.OperationInvokerReady, SimpleLayoutEvents.StateReady),
53
+ activatesOn: ActivationEvent.allOf(ActivationEvents.ProcessManagerReady, SimpleLayoutEvents.StateReady),
45
54
  activate: UrlHandler,
46
55
  }),
47
56
  Plugin.make,
48
57
  );
58
+
59
+ export default SimpleLayoutPlugin;
@@ -0,0 +1,21 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities, AppNode } from '@dxos/app-toolkit';
9
+ import { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';
10
+
11
+ export default Capability.makeModule(
12
+ Effect.fnUntraced(function* () {
13
+ const extensions = yield* GraphBuilder.createExtension({
14
+ id: 'org.dxos.plugin.simpleLayout.not-found',
15
+ match: NodeMatcher.whenRoot,
16
+ connector: () => Effect.succeed([AppNode.makeNotFound()]),
17
+ });
18
+
19
+ return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
20
+ }),
21
+ );
@@ -2,9 +2,16 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './operation-handler';
6
- export * from './react-root';
7
- export * from './react-surface';
8
- export * from './spotlight-dismiss';
9
- export * from './state';
10
- export * from './url-handler';
5
+ import { Capability } from '@dxos/app-framework';
6
+ import { OperationHandlerSet } from '@dxos/compute';
7
+
8
+ export const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));
9
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
10
+ 'OperationHandler',
11
+ () => import('./operation-handler'),
12
+ );
13
+ export const ReactRoot = Capability.lazy('ReactRoot', () => import('./react-root'));
14
+ export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
15
+ export const SpotlightDismiss = Capability.lazy('SpotlightDismiss', () => import('./spotlight-dismiss'));
16
+ export const State = Capability.lazy('State', () => import('./state'));
17
+ export const UrlHandler = Capability.lazy('UrlHandler', () => import('./url-handler'));
@@ -3,9 +3,9 @@
3
3
  import * as Effect from 'effect/Effect';
4
4
 
5
5
  import { Capabilities, Capability } from '@dxos/app-framework';
6
- import type { OperationHandlerSet } from '@dxos/operation';
6
+ import type { OperationHandlerSet } from '@dxos/compute';
7
7
 
8
- import { SimpleLayoutOperationHandlerSet } from '../../operations';
8
+ import { SimpleLayoutOperationHandlerSet } from '#operations';
9
9
 
10
10
  export default Capability.makeModule<OperationHandlerSet.OperationHandlerSet>(
11
11
  Effect.fnUntraced(function* () {
@@ -7,8 +7,8 @@ import React from 'react';
7
7
 
8
8
  import { Capabilities, Capability } from '@dxos/app-framework';
9
9
 
10
- import { SimpleLayout } from '../../components';
11
- import { meta } from '../../meta';
10
+ import { SimpleLayout } from '#components';
11
+ import { meta } from '#meta';
12
12
 
13
13
  export default Capability.makeModule(() =>
14
14
  Effect.succeed(
@@ -7,31 +7,38 @@ import React from 'react';
7
7
 
8
8
  import { Capabilities, Capability } from '@dxos/app-framework';
9
9
  import { Surface } from '@dxos/app-framework/ui';
10
+ import { NOT_FOUND_PATH } from '@dxos/app-toolkit';
11
+ import { NotFoundArticle } from '@dxos/app-toolkit/ui';
10
12
  import { Node } from '@dxos/plugin-graph';
11
13
 
12
- import { Home, NavBranch } from '../../components';
13
- import { meta } from '../../meta';
14
+ import { Home, NavBranch } from '#components';
14
15
 
15
16
  type SurfaceData = {
16
17
  attendableId: string;
17
18
  properties: Record<string, any>;
18
19
  };
19
20
 
20
- const ALLOWED_DISPOSITIONS = ['workspace', 'user-account', 'pin-end', 'alternate-tree'];
21
+ const ALLOWED_DISPOSITIONS = ['workspace', 'user-account', 'pin-end'];
21
22
 
22
23
  export default Capability.makeModule(() =>
23
24
  Effect.succeed(
24
25
  Capability.contributes(Capabilities.ReactSurface, [
25
26
  Surface.create({
26
- id: `${meta.id}.home`,
27
+ id: 'home',
27
28
  role: 'article',
28
29
  filter: (data): data is SurfaceData => data.attendableId === Node.RootId,
29
30
  component: () => <Home />,
30
31
  }),
31
32
  Surface.create({
32
- id: `${meta.id}.nav-branch`,
33
+ id: 'not-found',
33
34
  role: 'article',
34
- position: 'fallback',
35
+ filter: (data): data is SurfaceData => data.attendableId === NOT_FOUND_PATH,
36
+ component: () => <NotFoundArticle />,
37
+ }),
38
+ Surface.create({
39
+ id: 'nav-branch',
40
+ role: 'article',
41
+ position: 'last',
35
42
  filter: (data): data is SurfaceData => {
36
43
  const props = data.properties as Record<string, any>;
37
44
  return ALLOWED_DISPOSITIONS.includes(props?.disposition) || props?.role === 'branch';
@@ -9,10 +9,9 @@ import { Capability } from '@dxos/app-framework';
9
9
  import { AppCapabilities } from '@dxos/app-toolkit';
10
10
  import { Node } from '@dxos/plugin-graph';
11
11
 
12
- import { type SimpleLayoutState } from '../../types';
13
- import { SimpleLayoutState as SimpleLayoutStateCapability } from '../../types';
12
+ import { SimpleLayoutCapabilities } from '#types';
14
13
 
15
- const defaultState: SimpleLayoutState = {
14
+ const defaultState: SimpleLayoutCapabilities.SimpleLayoutState = {
16
15
  dialogOpen: false,
17
16
  workspace: Node.RootId,
18
17
  previousWorkspace: Node.RootId,
@@ -23,12 +22,12 @@ const defaultState: SimpleLayoutState = {
23
22
  };
24
23
 
25
24
  export type SimpleLayoutStateOptions = {
26
- initialState?: Partial<SimpleLayoutState>;
25
+ initialState?: Partial<SimpleLayoutCapabilities.SimpleLayoutState>;
27
26
  };
28
27
 
29
28
  export default Capability.makeModule(({ initialState }: SimpleLayoutStateOptions = {}) =>
30
29
  Effect.sync(() => {
31
- const stateAtom = Atom.make<SimpleLayoutState>({ ...defaultState, ...initialState });
30
+ const stateAtom = Atom.make<SimpleLayoutCapabilities.SimpleLayoutState>({ ...defaultState, ...initialState });
32
31
 
33
32
  const layoutAtom = Atom.make((get): AppCapabilities.Layout => {
34
33
  const state = get(stateAtom);
@@ -45,7 +44,7 @@ export default Capability.makeModule(({ initialState }: SimpleLayoutStateOptions
45
44
  });
46
45
 
47
46
  return [
48
- Capability.contributes(SimpleLayoutStateCapability, stateAtom),
47
+ Capability.contributes(SimpleLayoutCapabilities.State, stateAtom),
49
48
  Capability.contributes(AppCapabilities.Layout, layoutAtom),
50
49
  ];
51
50
  }),
@@ -0,0 +1,164 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { AppCapabilities, LayoutOperation, fromUrlPath, getWorkspaceFromPath, toUrlPath } from '@dxos/app-toolkit';
9
+ import { runAndForwardErrors } from '@dxos/effect';
10
+ import { log } from '@dxos/log';
11
+ import { isTauri } from '@dxos/util';
12
+
13
+ import { SimpleLayoutCapabilities } from '#types';
14
+
15
+ /**
16
+ * URL handler for simple layout that syncs browser URL with layout state.
17
+ * URL paths map directly to qualified graph IDs with the leading `root` segment stripped.
18
+ * Root is represented as `/`.
19
+ *
20
+ * On Tauri, also listens for deep links via the deep-link plugin.
21
+ */
22
+ export default Capability.makeModule(
23
+ Effect.fnUntraced(function* () {
24
+ const { invokePromise } = yield* Capability.get(Capabilities.OperationInvoker);
25
+ const capabilities = yield* Capability.Service;
26
+
27
+ /** Dispatch all NavigationHandler contributions with a given URL. */
28
+ const dispatchNavigationHandlers = (url: URL) =>
29
+ Effect.gen(function* () {
30
+ const handlers = yield* Capability.getAll(AppCapabilities.NavigationHandler);
31
+ yield* Effect.all(
32
+ handlers.map((handler) => handler(url)),
33
+ { concurrency: 'unbounded' },
34
+ );
35
+ }).pipe(Effect.provideService(Capability.Service, capabilities), runAndForwardErrors);
36
+
37
+ /**
38
+ * Handle navigation from a URL.
39
+ * Dispatches to NavigationHandler contributions, then handles pathname routing.
40
+ */
41
+ const handlePathNavigation = (url?: URL) => {
42
+ const resolvedUrl = url ?? new URL(window.location.href);
43
+ void dispatchNavigationHandlers(resolvedUrl);
44
+
45
+ let pathname = resolvedUrl.pathname;
46
+ if (isFilePath(pathname)) {
47
+ log.info('[UrlHandler] Skipping file path (not a graph node)', { pathname });
48
+ pathname = '/';
49
+ }
50
+
51
+ const qualifiedId = fromUrlPath(pathname);
52
+ const workspace = getWorkspaceFromPath(qualifiedId);
53
+
54
+ void invokePromise(LayoutOperation.SwitchWorkspace, { subject: workspace });
55
+
56
+ const activeId = qualifiedId !== workspace ? qualifiedId : undefined;
57
+ if (activeId) {
58
+ void invokePromise(LayoutOperation.Open, { subject: [activeId] });
59
+ }
60
+ };
61
+
62
+ const onPopState = () => {
63
+ handlePathNavigation();
64
+ };
65
+
66
+ // Initial navigation.
67
+ yield* Effect.sync(() => handlePathNavigation());
68
+ window.addEventListener('popstate', onPopState);
69
+
70
+ // Tauri deep link support.
71
+ let unlistenDeepLink: (() => void) | undefined;
72
+ if (isTauri()) {
73
+ yield* Effect.tryPromise({
74
+ try: async () => {
75
+ const { getCurrent, onOpenUrl } = await import('@tauri-apps/plugin-deep-link');
76
+
77
+ const launchUrls = await getCurrent();
78
+ if (launchUrls && launchUrls.length > 0) {
79
+ log.info('[UrlHandler] App launched with deep links', { urls: launchUrls });
80
+ for (const urlString of launchUrls) {
81
+ handleDeepLink(urlString, handlePathNavigation);
82
+ }
83
+ }
84
+
85
+ unlistenDeepLink = await onOpenUrl((urls) => {
86
+ log.info('[UrlHandler] Deep links received', { urls });
87
+ for (const urlString of urls) {
88
+ handleDeepLink(urlString, handlePathNavigation);
89
+ }
90
+ });
91
+ },
92
+ catch: (error) => {
93
+ log.warn('[UrlHandler] Failed to initialize deep link listener', { error });
94
+ return error;
95
+ },
96
+ }).pipe(Effect.catchAll(() => Effect.void));
97
+ }
98
+
99
+ // Sync URL with layout state changes.
100
+ let lastWorkspace: string | undefined;
101
+ let lastActive: string | undefined;
102
+ const unsubscribe = yield* Capabilities.subscribeAtom(
103
+ SimpleLayoutCapabilities.State,
104
+ (state: SimpleLayoutCapabilities.SimpleLayoutState) => {
105
+ const { workspace, active } = state;
106
+
107
+ if (workspace !== lastWorkspace || active !== lastActive) {
108
+ lastWorkspace = workspace;
109
+ lastActive = active;
110
+
111
+ const path = active ? toUrlPath(active) : toUrlPath(workspace);
112
+ if (window.location.pathname !== path) {
113
+ history.pushState(null, '', `${path}${window.location.search}`);
114
+ }
115
+ }
116
+ },
117
+ );
118
+
119
+ return Capability.contributes(Capabilities.Null, null, () =>
120
+ Effect.sync(() => {
121
+ window.removeEventListener('popstate', onPopState);
122
+ unsubscribe();
123
+ unlistenDeepLink?.();
124
+ }),
125
+ );
126
+ }),
127
+ );
128
+
129
+ /** Check if a path is a redirect path handled elsewhere (e.g., OAuth). */
130
+ const isRedirectPath = (pathname: string): boolean => pathname.startsWith('/redirect/');
131
+
132
+ /** Paths with file extensions are not graph node paths. */
133
+ const isFilePath = (pathname: string): boolean => /\.[a-z]+$/i.test(pathname);
134
+
135
+ /** Handle a deep link URL string. Merges query params into window.location and navigates. */
136
+ const handleDeepLink = (urlString: string, navigate: (url?: URL) => void): void => {
137
+ log.info('[UrlHandler] Deep link received', { url: urlString });
138
+ try {
139
+ const deepLinkUrl = new URL(urlString);
140
+
141
+ // For custom schemes (e.g., composer://a/b/c), new URL() treats the first segment as the
142
+ // hostname. Reconstruct the full path from hostname + pathname.
143
+ const fullPath =
144
+ deepLinkUrl.protocol !== 'https:' && deepLinkUrl.protocol !== 'http:' && deepLinkUrl.hostname
145
+ ? '/' + deepLinkUrl.hostname + deepLinkUrl.pathname
146
+ : deepLinkUrl.pathname;
147
+
148
+ if (isRedirectPath(fullPath)) {
149
+ return;
150
+ }
151
+
152
+ // Merge deep link query params into the current window URL so handlers can read them.
153
+ const current = new URL(window.location.href);
154
+ if (deepLinkUrl.search) {
155
+ deepLinkUrl.searchParams.forEach((value, key) => current.searchParams.set(key, value));
156
+ }
157
+ current.pathname = fullPath;
158
+ history.replaceState(null, '', current.pathname + current.search);
159
+
160
+ navigate(current);
161
+ } catch (error) {
162
+ log.warn('[UrlHandler] Failed to parse deep link URL', { urlString, error });
163
+ }
164
+ };
@@ -7,7 +7,7 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
7
  import { ErrorFallback } from '@dxos/react-ui';
8
8
  import { withTheme } from '@dxos/react-ui/testing';
9
9
 
10
- import { translations } from '../translations';
10
+ import { translations } from '#translations';
11
11
 
12
12
  const meta = {
13
13
  title: 'plugins/plugin-simple-layout/components/ErrorFallback',
@@ -5,10 +5,11 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Surface } from '@dxos/app-framework/ui';
8
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
9
  import { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';
9
10
  import { ErrorFallback } from '@dxos/react-ui';
10
11
 
11
- import { useSimpleLayoutState } from '../../hooks';
12
+ import { useSimpleLayoutState } from '#hooks';
12
13
 
13
14
  export const Dialog = () => {
14
15
  const { state, updateState } = useSimpleLayoutState();
@@ -23,14 +24,24 @@ export const Dialog = () => {
23
24
  onOpenChange={(nextOpen) => updateState((state) => ({ ...state, dialogOpen: nextOpen }))}
24
25
  >
25
26
  {state.dialogBlockAlign === 'end' ? (
26
- <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />
27
+ <Surface.Surface
28
+ type={AppSurface.Dialog}
29
+ data={state.dialogContent ?? undefined}
30
+ limit={1}
31
+ fallback={ErrorFallback}
32
+ />
27
33
  ) : (
28
34
  <DialogOverlay
29
35
  blockAlign={state.dialogBlockAlign}
30
36
  classNames={state.dialogOverlayClasses}
31
37
  style={state.dialogOverlayStyle}
32
38
  >
33
- <Surface.Surface role='dialog' data={state.dialogContent} limit={1} fallback={ErrorFallback} />
39
+ <Surface.Surface
40
+ type={AppSurface.Dialog}
41
+ data={state.dialogContent ?? undefined}
42
+ limit={1}
43
+ fallback={ErrorFallback}
44
+ />
34
45
  </DialogOverlay>
35
46
  )}
36
47
  </DialogRoot>
@@ -15,7 +15,8 @@ import { SearchPanel, useSearchListItem, useSearchListResults } from '@dxos/reac
15
15
  import { mx } from '@dxos/ui-theme';
16
16
  import { byPosition, getHostPlatform, isTauri } from '@dxos/util';
17
17
 
18
- import { meta } from '../../meta';
18
+ import { meta } from '#meta';
19
+
19
20
  import { useExpandPath } from '../hooks';
20
21
 
21
22
  export type HomeProps = {};
@@ -99,7 +100,7 @@ const WorkspaceTile: MosaicStackTileComponent<Node.Node> = (props) => {
99
100
  fullWidth
100
101
  tabIndex={-1} // TODO(burdon): Use Mosaic.Focus.
101
102
  data-selected={isSelected}
102
- classNames={mx('dx-focus-ring', isSelected && 'bg-hover-overlay')}
103
+ classNames={mx('dx-focus-ring', isSelected && 'bg-selected-surface')}
103
104
  onClick={handleSelect}
104
105
  ref={cardRef}
105
106
  >
@@ -6,5 +6,5 @@ import React from 'react';
6
6
 
7
7
  // TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259
8
8
  export const Loading = () => {
9
- return <div role='none' className='grid place-items-center dx-attention-surface' />;
9
+ return <div className='grid place-items-center dx-attention-surface' />;
10
10
  };