@dxos/plugin-deck 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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 (324) hide show
  1. package/dist/lib/browser/Banner-AJW6225V.mjs +14 -0
  2. package/dist/lib/browser/Banner-AJW6225V.mjs.map +7 -0
  3. package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs +96 -0
  4. package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs.map +7 -0
  5. package/dist/lib/browser/app-graph-builder-MP6INIM2.mjs +123 -0
  6. package/dist/lib/browser/app-graph-builder-MP6INIM2.mjs.map +7 -0
  7. package/dist/lib/browser/check-app-scheme-AUNCD2Y6.mjs +33 -0
  8. package/dist/lib/browser/check-app-scheme-AUNCD2Y6.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-3P2FJVXC.mjs +278 -0
  10. package/dist/lib/browser/chunk-3P2FJVXC.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BJDEG7YZ.mjs +74 -0
  12. package/dist/lib/browser/chunk-BJDEG7YZ.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-UXLU6CMW.mjs → chunk-L3RYMAV7.mjs} +2 -2
  14. package/dist/lib/browser/chunk-L3RYMAV7.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-TAHLKBDO.mjs +187 -0
  16. package/dist/lib/browser/chunk-TAHLKBDO.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-WTNYSXY5.mjs +1388 -0
  18. package/dist/lib/browser/chunk-WTNYSXY5.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +82 -72
  20. package/dist/lib/browser/index.mjs.map +4 -4
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/operation-resolver-2TEGT4PG.mjs +639 -0
  23. package/dist/lib/browser/operation-resolver-2TEGT4PG.mjs.map +7 -0
  24. package/dist/lib/browser/react-root-XBFHPSCP.mjs +48 -0
  25. package/dist/lib/browser/react-root-XBFHPSCP.mjs.map +7 -0
  26. package/dist/lib/browser/react-surface-4J3BZNT2.mjs +44 -0
  27. package/dist/lib/browser/react-surface-4J3BZNT2.mjs.map +7 -0
  28. package/dist/lib/browser/settings-PTMGCSJH.mjs +40 -0
  29. package/dist/lib/browser/settings-PTMGCSJH.mjs.map +7 -0
  30. package/dist/lib/browser/state-MA4SQ7BE.mjs +106 -0
  31. package/dist/lib/browser/state-MA4SQ7BE.mjs.map +7 -0
  32. package/dist/lib/browser/toolkit-6B34QFU3.mjs +55 -0
  33. package/dist/lib/browser/toolkit-6B34QFU3.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +14 -8
  35. package/dist/lib/browser/url-handler-FEUFPQIP.mjs +98 -0
  36. package/dist/lib/browser/url-handler-FEUFPQIP.mjs.map +7 -0
  37. package/dist/lib/node-esm/Banner-XBH2IIDR.mjs +15 -0
  38. package/dist/lib/node-esm/Banner-XBH2IIDR.mjs.map +7 -0
  39. package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs +97 -0
  40. package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs.map +7 -0
  41. package/dist/lib/node-esm/app-graph-builder-ACHG5HY7.mjs +124 -0
  42. package/dist/lib/node-esm/app-graph-builder-ACHG5HY7.mjs.map +7 -0
  43. package/dist/lib/node-esm/check-app-scheme-WN76GWVC.mjs +34 -0
  44. package/dist/lib/node-esm/check-app-scheme-WN76GWVC.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-CQ3XYTNJ.mjs +1389 -0
  46. package/dist/lib/node-esm/chunk-CQ3XYTNJ.mjs.map +7 -0
  47. package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs +76 -0
  48. package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-EMU4VIPH.mjs +188 -0
  50. package/dist/lib/node-esm/chunk-EMU4VIPH.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-GZJAQ5IP.mjs +279 -0
  52. package/dist/lib/node-esm/chunk-GZJAQ5IP.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-XCNF4COU.mjs +18 -0
  54. package/dist/lib/node-esm/chunk-XCNF4COU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +185 -0
  56. package/dist/lib/node-esm/index.mjs.map +7 -0
  57. package/dist/lib/node-esm/meta.json +1 -0
  58. package/dist/lib/node-esm/operation-resolver-GCMCCI7A.mjs +640 -0
  59. package/dist/lib/node-esm/operation-resolver-GCMCCI7A.mjs.map +7 -0
  60. package/dist/lib/node-esm/react-root-32LZ6APH.mjs +49 -0
  61. package/dist/lib/node-esm/react-root-32LZ6APH.mjs.map +7 -0
  62. package/dist/lib/node-esm/react-surface-CO4ZDZKM.mjs +45 -0
  63. package/dist/lib/node-esm/react-surface-CO4ZDZKM.mjs.map +7 -0
  64. package/dist/lib/node-esm/settings-LPPFLXNJ.mjs +41 -0
  65. package/dist/lib/node-esm/settings-LPPFLXNJ.mjs.map +7 -0
  66. package/dist/lib/node-esm/state-KNRU3GDC.mjs +107 -0
  67. package/dist/lib/node-esm/state-KNRU3GDC.mjs.map +7 -0
  68. package/dist/lib/node-esm/toolkit-SOWYKJY3.mjs +56 -0
  69. package/dist/lib/node-esm/toolkit-SOWYKJY3.mjs.map +7 -0
  70. package/dist/lib/node-esm/types/index.mjs +39 -0
  71. package/dist/lib/node-esm/url-handler-4LEB7UWF.mjs +99 -0
  72. package/dist/lib/node-esm/url-handler-4LEB7UWF.mjs.map +7 -0
  73. package/dist/types/src/DeckPlugin.d.ts +2 -1
  74. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  76. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  78. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +5 -0
  80. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/check-app-scheme/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/check-app-scheme/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/index.d.ts +8 -13
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  86. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  88. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  90. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  92. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  94. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  96. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/settings/index.d.ts +19 -0
  98. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/settings/settings.d.ts +22 -0
  100. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/state/index.d.ts +172 -0
  102. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/state/state.d.ts +175 -0
  104. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/toolkit/index.d.ts +3 -0
  106. package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/{toolkit.d.ts → toolkit/toolkit.d.ts} +6 -4
  108. package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/tools/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/tools/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/tools/tools.d.ts +12 -0
  112. package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/url-handler/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/url-handler/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +5 -0
  116. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -0
  117. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
  118. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +1 -1
  119. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
  120. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +1 -0
  121. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -1
  123. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
  124. package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +1 -1
  125. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
  126. package/dist/types/src/components/DeckLayout/Toast.d.ts +3 -3
  127. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
  128. package/dist/types/src/components/Plank/Plank.d.ts +5 -5
  129. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
  130. package/dist/types/src/components/Plank/Plank.stories.d.ts +25 -6
  131. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/Plank/PlankControls.d.ts +1 -1
  133. package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
  134. package/dist/types/src/components/Plank/PlankError.d.ts +6 -4
  135. package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
  136. package/dist/types/src/components/Plank/PlankHeading.d.ts +2 -2
  137. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
  138. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  139. package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +1 -1
  140. package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +1 -1
  141. package/dist/types/src/components/fragments.d.ts +4 -1
  142. package/dist/types/src/components/fragments.d.ts.map +1 -1
  143. package/dist/types/src/components/index.d.ts +0 -1
  144. package/dist/types/src/components/index.d.ts.map +1 -1
  145. package/dist/types/src/containers/Banner/Banner.d.ts +2 -0
  146. package/dist/types/src/containers/Banner/Banner.d.ts.map +1 -0
  147. package/dist/types/src/containers/Banner/index.d.ts +3 -0
  148. package/dist/types/src/containers/Banner/index.d.ts.map +1 -0
  149. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts +8 -0
  150. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
  151. package/dist/types/src/containers/DeckSettings/index.d.ts +3 -0
  152. package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
  153. package/dist/types/src/containers/index.d.ts +4 -0
  154. package/dist/types/src/containers/index.d.ts.map +1 -0
  155. package/dist/types/src/hooks/index.d.ts +2 -0
  156. package/dist/types/src/hooks/index.d.ts.map +1 -1
  157. package/dist/types/src/hooks/useDeckCompanions.d.ts +3 -4
  158. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  159. package/dist/types/src/hooks/useDeckState.d.ts +17 -0
  160. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
  161. package/dist/types/src/hooks/useHoistStatusbar.d.ts +1 -1
  162. package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +1 -1
  163. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  164. package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
  165. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  166. package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
  167. package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
  168. package/dist/types/src/index.d.ts +1 -2
  169. package/dist/types/src/index.d.ts.map +1 -1
  170. package/dist/types/src/layout.d.ts +1 -7
  171. package/dist/types/src/layout.d.ts.map +1 -1
  172. package/dist/types/src/meta.d.ts +2 -2
  173. package/dist/types/src/meta.d.ts.map +1 -1
  174. package/dist/types/src/translations.d.ts +1 -0
  175. package/dist/types/src/translations.d.ts.map +1 -1
  176. package/dist/types/src/{capabilities → types}/capabilities.d.ts +96 -90
  177. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  178. package/dist/types/src/types/events.d.ts +7 -0
  179. package/dist/types/src/types/events.d.ts.map +1 -0
  180. package/dist/types/src/types/index.d.ts +2 -0
  181. package/dist/types/src/types/index.d.ts.map +1 -1
  182. package/dist/types/src/types/schema.d.ts +99 -38
  183. package/dist/types/src/types/schema.d.ts.map +1 -1
  184. package/dist/types/src/util/set-active.d.ts +18 -3
  185. package/dist/types/src/util/set-active.d.ts.map +1 -1
  186. package/dist/types/tsconfig.tsbuildinfo +1 -1
  187. package/package.json +59 -49
  188. package/src/DeckPlugin.ts +28 -48
  189. package/src/capabilities/app-graph-builder/app-graph-builder.ts +119 -0
  190. package/src/capabilities/app-graph-builder/index.ts +7 -0
  191. package/src/capabilities/check-app-scheme/check-app-scheme.ts +45 -0
  192. package/src/capabilities/check-app-scheme/index.ts +7 -0
  193. package/src/capabilities/index.ts +9 -14
  194. package/src/capabilities/operation-resolver/index.ts +10 -0
  195. package/src/capabilities/operation-resolver/operation-resolver.ts +558 -0
  196. package/src/capabilities/react-root/index.ts +7 -0
  197. package/src/capabilities/react-root/react-root.tsx +47 -0
  198. package/src/capabilities/react-surface/index.ts +7 -0
  199. package/src/capabilities/react-surface/react-surface.tsx +38 -0
  200. package/src/capabilities/settings/index.ts +7 -0
  201. package/src/capabilities/settings/settings.ts +39 -0
  202. package/src/capabilities/state/index.ts +7 -0
  203. package/src/capabilities/state/state.ts +105 -0
  204. package/src/capabilities/toolkit/index.ts +7 -0
  205. package/src/capabilities/{toolkit.ts → toolkit/toolkit.ts} +20 -22
  206. package/src/capabilities/tools/index.ts +7 -0
  207. package/src/capabilities/tools/tools.ts +91 -0
  208. package/src/capabilities/url-handler/index.ts +7 -0
  209. package/src/capabilities/url-handler/url-handler.ts +98 -0
  210. package/src/components/DeckLayout/ActiveNode.tsx +3 -2
  211. package/src/components/DeckLayout/Banner.tsx +9 -9
  212. package/src/components/DeckLayout/ContentEmpty.tsx +5 -6
  213. package/src/components/DeckLayout/DeckLayout.stories.tsx +21 -31
  214. package/src/components/DeckLayout/DeckLayout.tsx +13 -11
  215. package/src/components/DeckLayout/DeckMain.tsx +64 -58
  216. package/src/components/DeckLayout/Dialog.tsx +22 -13
  217. package/src/components/DeckLayout/Fallback.tsx +2 -6
  218. package/src/components/DeckLayout/Popover.tsx +75 -22
  219. package/src/components/DeckLayout/StatusBar.tsx +4 -4
  220. package/src/components/DeckLayout/Toast.tsx +4 -4
  221. package/src/components/Plank/Plank.stories.tsx +19 -9
  222. package/src/components/Plank/Plank.tsx +46 -38
  223. package/src/components/Plank/PlankControls.tsx +8 -11
  224. package/src/components/Plank/PlankError.tsx +31 -17
  225. package/src/components/Plank/PlankHeading.tsx +39 -47
  226. package/src/components/Plank/PlankLoading.tsx +1 -1
  227. package/src/components/Sidebar/ComplementarySidebar.tsx +57 -51
  228. package/src/components/Sidebar/Sidebar.tsx +7 -7
  229. package/src/components/Sidebar/SidebarButton.tsx +31 -25
  230. package/src/components/fragments.ts +10 -5
  231. package/src/components/index.ts +0 -1
  232. package/src/containers/Banner/Banner.tsx +5 -0
  233. package/src/containers/Banner/index.ts +7 -0
  234. package/src/{components → containers}/DeckSettings/DeckSettings.tsx +41 -31
  235. package/src/containers/DeckSettings/index.ts +7 -0
  236. package/src/containers/index.ts +8 -0
  237. package/src/hooks/index.ts +2 -0
  238. package/src/hooks/useCompanions.ts +2 -2
  239. package/src/hooks/useDeckCompanions.ts +7 -11
  240. package/src/hooks/useDeckState.ts +82 -0
  241. package/src/hooks/useHoistStatusbar.ts +3 -6
  242. package/src/hooks/useMainSize.ts +2 -2
  243. package/src/hooks/useNodeActionExpander.ts +4 -4
  244. package/src/hooks/useSelectedCompanion.ts +32 -0
  245. package/src/index.ts +1 -2
  246. package/src/layout.ts +1 -14
  247. package/src/meta.ts +3 -3
  248. package/src/translations.ts +1 -0
  249. package/src/types/capabilities.ts +33 -0
  250. package/src/types/events.ts +21 -0
  251. package/src/types/index.ts +2 -0
  252. package/src/types/schema.ts +96 -25
  253. package/src/util/layoutAppliesTopbar.ts +1 -1
  254. package/src/util/overscroll.ts +3 -3
  255. package/src/util/set-active.ts +49 -29
  256. package/dist/lib/browser/app-graph-builder-D74NTOMK.mjs +0 -128
  257. package/dist/lib/browser/app-graph-builder-D74NTOMK.mjs.map +0 -7
  258. package/dist/lib/browser/check-app-scheme-HIEVFAAX.mjs +0 -32
  259. package/dist/lib/browser/check-app-scheme-HIEVFAAX.mjs.map +0 -7
  260. package/dist/lib/browser/chunk-5KMJPIQC.mjs +0 -16
  261. package/dist/lib/browser/chunk-5KMJPIQC.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-CNTGBCMK.mjs +0 -145
  263. package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-F3VCCHVL.mjs +0 -162
  265. package/dist/lib/browser/chunk-F3VCCHVL.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-QKCGZ45E.mjs +0 -128
  267. package/dist/lib/browser/chunk-QKCGZ45E.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-UXLU6CMW.mjs.map +0 -7
  269. package/dist/lib/browser/chunk-VBYJ664A.mjs +0 -132
  270. package/dist/lib/browser/chunk-VBYJ664A.mjs.map +0 -7
  271. package/dist/lib/browser/chunk-VUJ6UNIJ.mjs +0 -1553
  272. package/dist/lib/browser/chunk-VUJ6UNIJ.mjs.map +0 -7
  273. package/dist/lib/browser/intent-resolver-UA4YQGAC.mjs +0 -524
  274. package/dist/lib/browser/intent-resolver-UA4YQGAC.mjs.map +0 -7
  275. package/dist/lib/browser/react-root-JAMHKYWN.mjs +0 -44
  276. package/dist/lib/browser/react-root-JAMHKYWN.mjs.map +0 -7
  277. package/dist/lib/browser/react-surface-6LW337ZT.mjs +0 -40
  278. package/dist/lib/browser/react-surface-6LW337ZT.mjs.map +0 -7
  279. package/dist/lib/browser/settings-SDPTOCCM.mjs +0 -30
  280. package/dist/lib/browser/settings-SDPTOCCM.mjs.map +0 -7
  281. package/dist/lib/browser/state-7IFAGZQO.mjs +0 -12
  282. package/dist/lib/browser/toolkit-L5CFXJCF.mjs +0 -52
  283. package/dist/lib/browser/toolkit-L5CFXJCF.mjs.map +0 -7
  284. package/dist/lib/browser/url-handler-QEYGYE2H.mjs +0 -70
  285. package/dist/lib/browser/url-handler-QEYGYE2H.mjs.map +0 -7
  286. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  287. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  288. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  289. package/dist/types/src/capabilities/check-app-scheme.d.ts +0 -4
  290. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +0 -1
  291. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  292. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  293. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  294. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  295. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  296. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  297. package/dist/types/src/capabilities/settings.d.ts +0 -4
  298. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  299. package/dist/types/src/capabilities/state.d.ts +0 -104
  300. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  301. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  302. package/dist/types/src/capabilities/tools.d.ts +0 -11
  303. package/dist/types/src/capabilities/tools.d.ts.map +0 -1
  304. package/dist/types/src/capabilities/url-handler.d.ts +0 -4
  305. package/dist/types/src/capabilities/url-handler.d.ts.map +0 -1
  306. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +0 -6
  307. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
  308. package/dist/types/src/components/DeckSettings/index.d.ts +0 -2
  309. package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
  310. package/dist/types/src/events.d.ts +0 -4
  311. package/dist/types/src/events.d.ts.map +0 -1
  312. package/src/capabilities/app-graph-builder.ts +0 -143
  313. package/src/capabilities/capabilities.ts +0 -14
  314. package/src/capabilities/check-app-scheme.ts +0 -40
  315. package/src/capabilities/intent-resolver.ts +0 -471
  316. package/src/capabilities/react-root.tsx +0 -40
  317. package/src/capabilities/react-surface.tsx +0 -30
  318. package/src/capabilities/settings.ts +0 -27
  319. package/src/capabilities/state.ts +0 -113
  320. package/src/capabilities/tools.ts +0 -84
  321. package/src/capabilities/url-handler.ts +0 -60
  322. package/src/components/DeckSettings/index.ts +0 -5
  323. package/src/events.ts +0 -11
  324. /package/dist/lib/{browser/state-7IFAGZQO.mjs.map → node-esm/types/index.mjs.map} +0 -0
@@ -2,20 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { untracked } from '@preact/signals-core';
6
5
  import React, { Fragment, type UIEvent, useCallback, useEffect, useMemo, useRef } from 'react';
7
6
 
8
- import { Capabilities, LayoutAction, createIntent } from '@dxos/app-framework';
9
- import { useCapability, useIntentDispatcher, usePluginManager } from '@dxos/app-framework/react';
7
+ import { useAtomCapability, useOperationInvoker, usePluginManager } from '@dxos/app-framework/ui';
8
+ import { LayoutOperation } from '@dxos/app-toolkit';
10
9
  import { AttentionCapabilities } from '@dxos/plugin-attention';
11
- import { Main, type MainProps, useMediaQuery, useOnTransition } from '@dxos/react-ui';
10
+ import { Main, type MainContentProps, useMediaQuery, useOnTransition } from '@dxos/react-ui';
12
11
  import { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from '@dxos/react-ui-stack';
13
- import { mainPaddingTransitions, mx } from '@dxos/react-ui-theme';
12
+ import { mainPaddingTransitions, mx } from '@dxos/ui-theme';
14
13
 
15
- import { DeckCapabilities } from '../../capabilities';
16
- import { useBreakpoints, useHoistStatusbar } from '../../hooks';
17
- import { meta } from '../../meta';
18
- import { type DeckSettingsProps, getMode } from '../../types';
14
+ import { useBreakpoints, useDeckState, useHoistStatusbar } from '../../hooks';
15
+ import { DeckCapabilities, getMode } from '../../types';
19
16
  import { calculateOverscroll, layoutAppliesTopbar } from '../../util';
20
17
  import { fixedComplementarySidebarToggleStyles, fixedSidebarToggleStyles } from '../fragments';
21
18
  import { Plank } from '../Plank';
@@ -26,11 +23,12 @@ import { StatusBar } from './StatusBar';
26
23
  import { Topbar } from './Topbar';
27
24
 
28
25
  export const DeckMain = () => {
29
- const { dispatchPromise: dispatch } = useIntentDispatcher();
30
- const settings = useCapability(Capabilities.SettingsStore).getStore<DeckSettingsProps>(meta.id)?.value;
31
- const context = useCapability(DeckCapabilities.MutableDeckState);
32
- const { sidebarState, complementarySidebarState, complementarySidebarPanel, deck } = context;
33
- const { active, activeCompanions, fullscreen, solo, plankSizing } = deck;
26
+ const { invokeSync } = useOperationInvoker();
27
+ const settings = useAtomCapability(DeckCapabilities.Settings);
28
+ const { state, deck, updateState } = useDeckState();
29
+ const { sidebarState, complementarySidebarState, complementarySidebarPanel } = state;
30
+ const { active, companionOpen, companionVariant, fullscreen, solo, plankSizing } = deck;
31
+ const effectiveCompanionVariant = companionOpen ? companionVariant : undefined;
34
32
  const layoutMode = getMode(deck);
35
33
  const breakpoint = useBreakpoints();
36
34
  const topbar = layoutAppliesTopbar(breakpoint, layoutMode);
@@ -43,10 +41,8 @@ export const DeckMain = () => {
43
41
  // Ensure the first plank is attended when the deck is first rendered.
44
42
  useEffect(() => {
45
43
  // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.
46
- const attended = untracked(() => {
47
- const attention = pluginManager.context.getCapability(AttentionCapabilities.Attention);
48
- return attention.current;
49
- });
44
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
45
+ const attended = attention.getCurrent();
50
46
  const firstId = solo ?? active[0];
51
47
  if (attended.length === 0 && firstId) {
52
48
  // TODO(wittjosiah): Focusing the type button is a workaround.
@@ -60,31 +56,26 @@ export const DeckMain = () => {
60
56
  const [isNotMobile] = useMediaQuery('md');
61
57
  const shouldRevert = useRef(false);
62
58
  useEffect(() => {
63
- if (!isNotMobile && getMode(deck) === 'deck') {
59
+ if (!isNotMobile && layoutMode === 'deck') {
64
60
  // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.
65
- const attended = untracked(() => {
66
- const attention = pluginManager.context.getCapability(AttentionCapabilities.Attention);
67
- return attention.current;
68
- });
61
+ const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);
62
+ const attended = attention.getCurrent();
69
63
 
70
64
  shouldRevert.current = true;
71
- void dispatch(
72
- createIntent(LayoutAction.SetLayoutMode, { part: 'mode', subject: attended[0], options: { mode: 'solo' } }),
73
- );
74
- } else if (isNotMobile && getMode(deck) === 'solo' && shouldRevert.current) {
75
- void dispatch(createIntent(LayoutAction.SetLayoutMode, { part: 'mode', options: { revert: true } }));
65
+ invokeSync(LayoutOperation.SetLayoutMode, { subject: attended[0], mode: 'solo' });
66
+ } else if (isNotMobile && layoutMode === 'solo' && shouldRevert.current) {
67
+ invokeSync(LayoutOperation.SetLayoutMode, { revert: true });
76
68
  }
77
- }, [isNotMobile, deck, dispatch]);
69
+ // NOTE: Using `layoutMode` instead of `deck` to avoid infinite loops caused by object reference changes.
70
+ }, [isNotMobile, layoutMode, invokeSync]);
78
71
 
79
72
  // When deck is disabled in settings, set to solo mode if the current layout mode is deck.
80
- // TODO(thure): Applying this as an effect should be avoided over emitting the intent only when the setting changes.
73
+ // TODO(thure): Applying this as an effect should be avoided over emitting the operation only when the setting changes.
81
74
  useEffect(() => {
82
75
  if (!settings?.enableDeck && layoutMode === 'deck') {
83
- void dispatch(
84
- createIntent(LayoutAction.SetLayoutMode, { part: 'mode', subject: active[0], options: { mode: 'solo' } }),
85
- );
76
+ invokeSync(LayoutOperation.SetLayoutMode, { subject: active[0], mode: 'solo' });
86
77
  }
87
- }, [settings?.enableDeck, dispatch, active, layoutMode]);
78
+ }, [settings?.enableDeck, invokeSync, active, layoutMode]);
88
79
 
89
80
  /**
90
81
  * Clear scroll restoration state if the window is resized.
@@ -128,9 +119,9 @@ export const DeckMain = () => {
128
119
 
129
120
  const mainPosition = useMemo(
130
121
  () => [
131
- 'grid !block-start-[env(safe-area-inset-top)]',
132
- topbar && '!block-start-[calc(env(safe-area-inset-top)+var(--rail-size))]',
133
- hoistStatusbar && 'lg:block-end-[--statusbar-size]',
122
+ 'grid !top-[env(safe-area-inset-top)]',
123
+ topbar && '!top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
124
+ hoistStatusbar && 'lg:bottom-(--dx-statusbar-size)',
134
125
  ],
135
126
  [topbar, hoistStatusbar],
136
127
  );
@@ -139,19 +130,33 @@ export const DeckMain = () => {
139
130
  return active.reduce(
140
131
  (acc: { order: Record<string, number>; itemsCount: number }, entryId) => {
141
132
  acc.order[entryId] = acc.itemsCount + 1;
142
- acc.itemsCount += activeCompanions?.[entryId] ? 3 : 2;
133
+ acc.itemsCount += companionOpen ? 3 : 2;
143
134
  return acc;
144
135
  },
145
136
  { order: {}, itemsCount: 0 },
146
137
  );
147
- }, [active, activeCompanions]);
138
+ }, [active, companionOpen]);
139
+
140
+ const handleNavigationSidebarStateChange = useCallback(
141
+ (next: typeof sidebarState) => {
142
+ updateState((s) => ({ ...s, sidebarState: next }));
143
+ },
144
+ [updateState],
145
+ );
146
+
147
+ const handleComplementarySidebarStateChange = useCallback(
148
+ (next: typeof complementarySidebarState) => {
149
+ updateState((s) => ({ ...s, complementarySidebarState: next }));
150
+ },
151
+ [updateState],
152
+ );
148
153
 
149
154
  return (
150
155
  <Main.Root
151
- navigationSidebarState={fullscreen ? 'closed' : context.sidebarState}
152
- complementarySidebarState={fullscreen ? 'closed' : context.complementarySidebarState}
153
- onNavigationSidebarStateChange={(next) => (context.sidebarState = next)}
154
- onComplementarySidebarStateChange={(next) => (context.complementarySidebarState = next)}
156
+ navigationSidebarState={fullscreen ? 'closed' : sidebarState}
157
+ complementarySidebarState={fullscreen ? 'closed' : complementarySidebarState}
158
+ onNavigationSidebarStateChange={handleNavigationSidebarStateChange}
159
+ onComplementarySidebarStateChange={handleComplementarySidebarStateChange}
155
160
  >
156
161
  {/* Left sidebar. */}
157
162
  <Sidebar />
@@ -178,27 +183,27 @@ export const DeckMain = () => {
178
183
  style={
179
184
  {
180
185
  '--main-spacing': settings?.encapsulatedPlanks ? '0.75rem' : '0',
181
- '--dx-main-sidebarWidth':
186
+ '--dx-main-sidebar-width':
182
187
  sidebarState === 'expanded'
183
- ? 'var(--nav-sidebar-size)'
188
+ ? 'var(--dx-nav-sidebar-size)'
184
189
  : sidebarState === 'collapsed'
185
- ? 'var(--l0-size)'
190
+ ? 'var(--dx-l0-size)'
186
191
  : '0',
187
- '--dx-main-complementaryWidth':
192
+ '--dx-main-complementary-width':
188
193
  complementarySidebarState === 'expanded'
189
- ? 'var(--complementary-sidebar-size)'
194
+ ? 'var(--dx-complementary-sidebar-size)'
190
195
  : complementarySidebarState === 'collapsed'
191
- ? 'var(--rail-size)'
196
+ ? 'var(--dx-rail-size)'
192
197
  : '0',
193
- '--dx-main-contentFirstWidth': `${plankSizing[active[0] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
194
- '--dx-main-contentLastWidth': `${plankSizing[active[(active.length ?? 1) - 1] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
195
- } as MainProps['style']
198
+ '--dx-main-content-first-width': `${plankSizing[active[0] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
199
+ '--dx-main-content-last-width': `${plankSizing[active[(active.length ?? 1) - 1] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,
200
+ } as MainContentProps['style']
196
201
  }
197
202
  >
198
203
  {/* Deck mode. */}
199
204
  <div
200
205
  role='none'
201
- className={!solo ? 'relative bg-deckSurface overflow-hidden' : 'sr-only'}
206
+ className={!solo ? 'relative bg-deck-surface overflow-hidden' : 'sr-only'}
202
207
  {...(solo && { inert: true })}
203
208
  >
204
209
  {!topbar && !fullscreen && <ToggleSidebarButton classNames={fixedSidebarToggleStyles} />}
@@ -211,7 +216,7 @@ export const DeckMain = () => {
211
216
  size='contain'
212
217
  itemsCount={itemsCount - 1}
213
218
  classNames={[
214
- 'absolute inset-block-[--main-spacing] -inset-inline-px bs-[calc(100%-2*var(--main-spacing))]',
219
+ 'absolute inset-y-(--main-spacing) -inset-w-px h-[calc(100%-2*var(--main-spacing))]',
215
220
  mainPaddingTransitions,
216
221
  ]}
217
222
  style={padding}
@@ -222,7 +227,7 @@ export const DeckMain = () => {
222
227
  <PlankSeparator order={order[entryId] - 1} encapsulate={!!settings?.enableDeck} />
223
228
  <Plank
224
229
  id={entryId}
225
- companionId={activeCompanions?.[entryId]}
230
+ companionVariant={effectiveCompanionVariant}
226
231
  part='deck'
227
232
  order={order[entryId]}
228
233
  active={active}
@@ -233,10 +238,11 @@ export const DeckMain = () => {
233
238
  ))}
234
239
  </Stack>
235
240
  </div>
241
+
236
242
  {/* Solo mode. */}
237
243
  <div
238
244
  role='none'
239
- className={solo ? 'relative overflow-hidden bg-deckSurface' : 'sr-only'}
245
+ className={solo ? 'relative overflow-hidden bg-deck-surface' : 'sr-only'}
240
246
  {...(!solo && { inert: true })}
241
247
  >
242
248
  {!topbar && !fullscreen && <ToggleSidebarButton classNames={fixedSidebarToggleStyles} />}
@@ -252,7 +258,7 @@ export const DeckMain = () => {
252
258
  >
253
259
  <Plank
254
260
  id={solo}
255
- companionId={solo ? activeCompanions?.[solo] : undefined}
261
+ companionVariant={effectiveCompanionVariant}
256
262
  part='solo'
257
263
  layoutMode={layoutMode}
258
264
  settings={settings}
@@ -275,7 +281,7 @@ const PlankSeparator = ({ order, encapsulate }: { order: number; encapsulate?: b
275
281
  order > 0 ? (
276
282
  <span
277
283
  role='separator'
278
- className={mx('row-span-2 bg-deckSurface', encapsulate ? 'is-0' : 'is-4')}
284
+ className={mx('row-span-2 bg-deck-surface', encapsulate ? 'w-0' : 'w-4')}
279
285
  style={{ gridColumn: order }}
280
286
  />
281
287
  ) : null;
@@ -2,33 +2,42 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useCallback } from 'react';
6
6
 
7
- import { Surface, useCapability } from '@dxos/app-framework/react';
7
+ import { Surface } from '@dxos/app-framework/ui';
8
8
  import { AlertDialog, Dialog as NaturalDialog } from '@dxos/react-ui';
9
9
 
10
- import { DeckCapabilities } from '../../capabilities';
11
- import { PlankContentError } from '../Plank';
10
+ import { useDeckState } from '../../hooks';
11
+ import { PlankErrorFallback } from '../Plank';
12
12
 
13
13
  export const Dialog = () => {
14
- const context = useCapability(DeckCapabilities.MutableDeckState);
15
- const { dialogOpen, dialogType, dialogBlockAlign, dialogOverlayClasses, dialogOverlayStyle, dialogContent } = context;
14
+ const { state, updateEphemeral } = useDeckState();
15
+ const { dialogOpen, dialogType, dialogBlockAlign, dialogOverlayClasses, dialogOverlayStyle, dialogContent } = state;
16
16
  const Root = dialogType === 'alert' ? AlertDialog.Root : NaturalDialog.Root;
17
17
  const Overlay = dialogType === 'alert' ? AlertDialog.Overlay : NaturalDialog.Overlay;
18
18
 
19
+ const handleOpenChange = useCallback(
20
+ (nextOpen: boolean) => {
21
+ updateEphemeral((s) => ({ ...s, dialogOpen: nextOpen }));
22
+ },
23
+ [updateEphemeral],
24
+ );
25
+
19
26
  // TODO(thure): End block alignment affecting `modal` and whether the surface renders in an overlay is tailored to the needs of the ambient chat dialog. As the feature matures, consider separating concerns.
20
27
  return (
21
- <Root
22
- modal={dialogBlockAlign !== 'end'}
23
- open={dialogOpen}
24
- onOpenChange={(nextOpen) => (context.dialogOpen = nextOpen)}
25
- >
28
+ <Root modal={dialogBlockAlign !== 'end'} open={dialogOpen} onOpenChange={handleOpenChange}>
26
29
  {dialogBlockAlign === 'end' ? (
27
30
  // TODO(burdon): Placeholder creates a suspense boundary; replace with defaults.
28
- <Surface role='dialog' data={dialogContent} limit={1} fallback={PlankContentError} placeholder={<div />} />
31
+ <Surface.Surface
32
+ role='dialog'
33
+ data={dialogContent}
34
+ limit={1}
35
+ fallback={PlankErrorFallback}
36
+ placeholder={<div />}
37
+ />
29
38
  ) : (
30
39
  <Overlay blockAlign={dialogBlockAlign} classNames={dialogOverlayClasses} style={dialogOverlayStyle}>
31
- <Surface role='dialog' data={dialogContent} limit={1} fallback={PlankContentError} />
40
+ <Surface.Surface role='dialog' data={dialogContent} limit={1} fallback={PlankErrorFallback} />
32
41
  </Overlay>
33
42
  )}
34
43
  </Root>
@@ -5,7 +5,6 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { useTranslation } from '@dxos/react-ui';
8
- import { errorText, mx } from '@dxos/react-ui-theme';
9
8
 
10
9
  import { meta } from '../../meta';
11
10
 
@@ -13,13 +12,10 @@ export const Fallback = () => {
13
12
  const { t } = useTranslation(meta.id);
14
13
 
15
14
  return (
16
- <div role='none' className='min-bs-screen is-full flex items-center justify-center p-8'>
15
+ <div role='none' className='min-h-screen w-full flex items-center justify-center p-8'>
17
16
  <p
18
17
  role='alert'
19
- className={mx(
20
- errorText,
21
- 'border border-roseFill rounded-md flex items-center justify-center p-8 font-normal text-lg',
22
- )}
18
+ className='flex items-center justify-center p-8 font-normal text-lg text-error-text border border-rose-fill rounded-md'
23
19
  >
24
20
  {t('plugin error message')}
25
21
  </p>
@@ -3,12 +3,25 @@
3
3
  //
4
4
 
5
5
  import { createContext } from '@radix-ui/react-context';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
6
8
  import React, { type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
7
9
 
8
- import { Surface, useCapability } from '@dxos/app-framework/react';
9
- import { Popover, type PopoverContentInteractOutsideEvent } from '@dxos/react-ui';
10
+ import { Surface } from '@dxos/app-framework/ui';
11
+ import { useObjectMenuItems } from '@dxos/app-toolkit/ui';
12
+ import { Annotation, Obj } from '@dxos/echo';
13
+ import {
14
+ Card,
15
+ Popover,
16
+ type PopoverContentInteractOutsideEvent,
17
+ toLocalizedString,
18
+ Toolbar,
19
+ useTranslation,
20
+ } from '@dxos/react-ui';
21
+ import { Menu } from '@dxos/react-ui-menu';
10
22
 
11
- import { DeckCapabilities } from '../../capabilities';
23
+ import { useDeckState } from '../../hooks';
24
+ import { meta } from '../../meta';
12
25
 
13
26
  export type DeckPopoverRootProps = PropsWithChildren<{}>;
14
27
 
@@ -21,32 +34,32 @@ type DeckPopoverContextValue = {
21
34
  const [DeckPopoverProvider, useDeckPopoverContext] = createContext<DeckPopoverContextValue>('DeckPopover');
22
35
 
23
36
  export const PopoverRoot = ({ children }: DeckPopoverRootProps) => {
24
- const layout = useCapability(DeckCapabilities.MutableDeckState);
37
+ const { state } = useDeckState();
25
38
  const virtualRef = useRef<HTMLButtonElement | null>(null);
26
39
  const [virtualIter, setVirtualIter] = useState(0);
27
40
  const [open, setOpen] = useState(false);
28
41
  const debounceRef = useRef<NodeJS.Timeout | null>(null);
29
42
 
30
43
  // TODO(thure): This is a workaround for the race condition between displaying a Popover and either rendering
31
- // the anchor further down the tree or measuring the virtual triggers client rect.
44
+ // the anchor further down the tree or measuring the virtual trigger's client rect.
32
45
  useEffect(() => {
33
46
  setOpen(false);
34
- if (layout.popoverOpen) {
47
+ if (state.popoverOpen) {
35
48
  if (debounceRef.current) {
36
49
  clearTimeout(debounceRef.current);
37
50
  }
38
- if (layout.popoverAnchor && virtualRef.current !== layout.popoverAnchor) {
39
- virtualRef.current = layout.popoverAnchor ?? null;
51
+ if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {
52
+ virtualRef.current = state.popoverAnchor ?? null;
40
53
  setVirtualIter((iter) => iter + 1);
41
54
  }
42
55
  debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);
43
56
  }
44
- }, [layout.popoverOpen, layout.popoverAnchorId, layout.popoverAnchor, layout.popoverContent]);
57
+ }, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);
45
58
 
46
59
  return (
47
60
  <DeckPopoverProvider setOpen={setOpen}>
48
61
  <Popover.Root modal={false} open={open}>
49
- {layout.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}
62
+ {state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}
50
63
  {children}
51
64
  </Popover.Root>
52
65
  </DeckPopoverProvider>
@@ -54,10 +67,33 @@ export const PopoverRoot = ({ children }: DeckPopoverRootProps) => {
54
67
  };
55
68
 
56
69
  export const PopoverContent = () => {
57
- const layout = useCapability(DeckCapabilities.MutableDeckState);
70
+ const { t } = useTranslation(meta.id);
71
+ const { state, updateEphemeral } = useDeckState();
58
72
  const { setOpen } = useDeckPopoverContext('PopoverContent');
73
+ const popoverSubject = state.popoverContent?.subject;
74
+ const isObjectPopover = Obj.isObject(popoverSubject);
75
+ const objectMenuItems = useObjectMenuItems(popoverSubject);
76
+ const icon = isObjectPopover
77
+ ? Function.pipe(
78
+ Obj.getSchema(popoverSubject),
79
+ Option.fromNullable,
80
+ Option.flatMap(Annotation.IconAnnotation.get),
81
+ Option.map(({ icon }) => icon),
82
+ Option.getOrElse(() => 'ph--placeholder--regular'),
83
+ )
84
+ : undefined;
85
+ const handleClose = useCallback(() => {
86
+ setOpen(false);
87
+ updateEphemeral((state) => ({
88
+ ...state,
89
+ popoverOpen: false,
90
+ popoverAnchor: undefined,
91
+ popoverAnchorId: undefined,
92
+ popoverSide: undefined,
93
+ }));
94
+ }, [updateEphemeral]);
59
95
 
60
- const handleClose = useCallback(
96
+ const handleInteractOutside = useCallback(
61
97
  (event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {
62
98
  if (
63
99
  // TODO(thure): CodeMirror should not focus itself when it updates.
@@ -66,27 +102,44 @@ export const PopoverContent = () => {
66
102
  ) {
67
103
  event.preventDefault();
68
104
  } else {
69
- setOpen(false);
70
- layout.popoverOpen = false;
71
- layout.popoverAnchor = undefined;
72
- layout.popoverAnchorId = undefined;
73
- layout.popoverSide = undefined;
105
+ handleClose();
74
106
  }
75
107
  },
76
- [setOpen],
108
+ [handleClose],
77
109
  );
78
110
 
79
111
  return (
80
112
  <Popover.Portal>
81
113
  <Popover.Content
82
- side={layout.popoverSide}
114
+ side={state.popoverSide}
83
115
  sticky='always'
84
116
  hideWhenDetached
85
- onInteractOutside={handleClose}
86
- onEscapeKeyDown={handleClose}
117
+ onInteractOutside={handleInteractOutside}
118
+ onEscapeKeyDown={handleInteractOutside}
87
119
  >
88
120
  <Popover.Viewport>
89
- <Surface role='card--popover' data={layout.popoverContent} limit={1} />
121
+ {/* TODO(burdon): Set/disable column context. */}
122
+ {state.popoverKind === 'base' && <Surface.Surface role='popover' data={state.popoverContent} limit={1} />}
123
+ {state.popoverKind === 'card' && (
124
+ <Menu.Root>
125
+ <Card.Root border={false} classNames='dx-card-popover'>
126
+ <Card.Toolbar>
127
+ {icon ? <Card.Icon icon={icon} /> : <Card.IconBlock />}
128
+ {state.popoverTitle ? <Card.Title>{toLocalizedString(state.popoverTitle, t)}</Card.Title> : <span />}
129
+ <Menu.Trigger asChild disabled={!objectMenuItems.length}>
130
+ <Toolbar.IconButton
131
+ iconOnly
132
+ variant='ghost'
133
+ icon='ph--dots-three-vertical--regular'
134
+ label='Actions'
135
+ />
136
+ </Menu.Trigger>
137
+ <Menu.Content items={objectMenuItems} />
138
+ </Card.Toolbar>
139
+ <Surface.Surface role='card--content' data={state.popoverContent} limit={1} />
140
+ </Card.Root>
141
+ </Menu.Root>
142
+ )}
90
143
  </Popover.Viewport>
91
144
  <Popover.Arrow />
92
145
  </Popover.Content>
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { Surface } from '@dxos/app-framework/react';
7
+ import { Surface } from '@dxos/app-framework/ui';
8
8
  import { useLandmarkMover } from '@dxos/react-ui';
9
9
 
10
10
  export const StatusBar = ({ showHints }: { showHints?: boolean }) => {
@@ -12,11 +12,11 @@ export const StatusBar = ({ showHints }: { showHints?: boolean }) => {
12
12
  return (
13
13
  <div
14
14
  role='contentinfo'
15
- className='fixed block-end-0 inset-inline-0 bs-[--statusbar-size] border-bs border-separator z-[2] flex text-description'
15
+ className='fixed bottom-0 inset-x-0 h-(--dx-statusbar-size) border-y border-separator z-[2] flex text-description'
16
16
  {...mover}
17
17
  >
18
- {showHints && <Surface role='hints' limit={1} />}
19
- <Surface role='status-bar' limit={1} />
18
+ {showHints && <Surface.Surface role='hints' limit={1} />}
19
+ <Surface.Surface role='status-bar' limit={1} />
20
20
  </div>
21
21
  );
22
22
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { type LayoutAction } from '@dxos/app-framework';
7
+ import { type LayoutOperation } from '@dxos/app-toolkit';
8
8
  import {
9
9
  Button,
10
10
  Icon,
@@ -28,7 +28,7 @@ export const Toast = ({
28
28
  closeLabel,
29
29
  onAction,
30
30
  onOpenChange,
31
- }: LayoutAction.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {
31
+ }: LayoutOperation.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {
32
32
  const { t } = useTranslation(meta.id);
33
33
 
34
34
  return (
@@ -61,7 +61,7 @@ export const Toast = ({
61
61
  };
62
62
 
63
63
  export type ToasterProps = {
64
- toasts?: LayoutAction.Toast[];
64
+ toasts?: LayoutOperation.Toast[];
65
65
  onDismissToast?: (id: string) => void;
66
66
  };
67
67
 
@@ -72,7 +72,7 @@ export const Toaster = ({ toasts, onDismissToast }: ToasterProps) => {
72
72
  <Toast
73
73
  {...toast}
74
74
  key={toast.id}
75
- onOpenChange={(open) => {
75
+ onOpenChange={(open: boolean) => {
76
76
  if (!open) {
77
77
  onDismissToast?.(toast.id);
78
78
  }
@@ -5,20 +5,30 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
8
+ import { Capability, Plugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { AttentionPlugin } from '@dxos/plugin-attention';
11
- import { GraphPlugin } from '@dxos/plugin-graph';
12
- import { withTheme } from '@dxos/react-ui/testing';
10
+ import { AppActivationEvents } from '@dxos/app-toolkit';
11
+ import { corePlugins } from '@dxos/plugin-testing';
12
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
13
13
  import { Stack } from '@dxos/react-ui-stack';
14
14
 
15
- import { DeckStateFactory } from '../../capabilities';
15
+ import { DeckState } from '../../capabilities';
16
+ import { meta as pluginMeta } from '../../meta';
16
17
  import { translations } from '../../translations';
17
18
 
18
19
  import { Plank } from './Plank';
19
20
 
21
+ const TestPlugin = Plugin.define(pluginMeta).pipe(
22
+ Plugin.addModule({
23
+ id: Capability.getModuleTag(DeckState),
24
+ activatesOn: AppActivationEvents.AppGraphReady,
25
+ activate: () => DeckState(),
26
+ }),
27
+ Plugin.make,
28
+ );
29
+
20
30
  const meta = {
21
- title: 'plugins/plugin-deck/Plank',
31
+ title: 'plugins/plugin-deck/components/Plank',
22
32
  component: Plank,
23
33
  render: (args) => {
24
34
  return (
@@ -28,10 +38,10 @@ const meta = {
28
38
  );
29
39
  },
30
40
  decorators: [
31
- withTheme,
41
+ withTheme(),
42
+ withLayout({ layout: 'fullscreen' }),
32
43
  withPluginManager({
33
- plugins: [AttentionPlugin(), SettingsPlugin(), IntentPlugin(), GraphPlugin()],
34
- capabilities: () => DeckStateFactory(),
44
+ plugins: [...corePlugins(), TestPlugin()],
35
45
  }),
36
46
  ],
37
47
  parameters: {