@dxos/plugin-deck 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (329) hide show
  1. package/dist/lib/browser/Banner-DR6B7XTO.mjs +15 -0
  2. package/dist/lib/browser/Banner-DR6B7XTO.mjs.map +7 -0
  3. package/dist/lib/browser/DeckSettings-HB5TKG2F.mjs +96 -0
  4. package/dist/lib/browser/DeckSettings-HB5TKG2F.mjs.map +7 -0
  5. package/dist/lib/browser/app-graph-builder-22XAL7YE.mjs +123 -0
  6. package/dist/lib/browser/app-graph-builder-22XAL7YE.mjs.map +7 -0
  7. package/dist/lib/browser/check-app-scheme-ZV3QWNNZ.mjs +33 -0
  8. package/dist/lib/browser/check-app-scheme-ZV3QWNNZ.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BJDEG7YZ.mjs +74 -0
  10. package/dist/lib/browser/chunk-BJDEG7YZ.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-FBL4WVYZ.mjs +16 -0
  12. package/dist/lib/browser/chunk-FBL4WVYZ.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-OAPMV5ZR.mjs +280 -0
  14. package/dist/lib/browser/chunk-OAPMV5ZR.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-Q4GUCIRE.mjs +200 -0
  16. package/dist/lib/browser/chunk-Q4GUCIRE.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-SKBPLX5T.mjs +81 -0
  18. package/dist/lib/browser/chunk-SKBPLX5T.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-YGOOWRJE.mjs +1390 -0
  20. package/dist/lib/browser/chunk-YGOOWRJE.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +91 -74
  22. package/dist/lib/browser/index.mjs.map +4 -4
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/operation-resolver-BLZGJWLO.mjs +580 -0
  25. package/dist/lib/browser/operation-resolver-BLZGJWLO.mjs.map +7 -0
  26. package/dist/lib/browser/react-root-4ESZAM6D.mjs +49 -0
  27. package/dist/lib/browser/react-root-4ESZAM6D.mjs.map +7 -0
  28. package/dist/lib/browser/react-surface-KYQGCALN.mjs +44 -0
  29. package/dist/lib/browser/react-surface-KYQGCALN.mjs.map +7 -0
  30. package/dist/lib/browser/settings-RY2TBSGP.mjs +40 -0
  31. package/dist/lib/browser/settings-RY2TBSGP.mjs.map +7 -0
  32. package/dist/lib/browser/state-CSTTMJ43.mjs +106 -0
  33. package/dist/lib/browser/state-CSTTMJ43.mjs.map +7 -0
  34. package/dist/lib/browser/toolkit-EONRPYA5.mjs +55 -0
  35. package/dist/lib/browser/toolkit-EONRPYA5.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +14 -6
  37. package/dist/lib/browser/url-handler-EM3SYHHX.mjs +95 -0
  38. package/dist/lib/browser/url-handler-EM3SYHHX.mjs.map +7 -0
  39. package/dist/lib/node-esm/Banner-HR7DPUZU.mjs +16 -0
  40. package/dist/lib/node-esm/Banner-HR7DPUZU.mjs.map +7 -0
  41. package/dist/lib/node-esm/DeckSettings-MWTR7HU2.mjs +97 -0
  42. package/dist/lib/node-esm/DeckSettings-MWTR7HU2.mjs.map +7 -0
  43. package/dist/lib/node-esm/app-graph-builder-GNNNCWGN.mjs +124 -0
  44. package/dist/lib/node-esm/app-graph-builder-GNNNCWGN.mjs.map +7 -0
  45. package/dist/lib/node-esm/check-app-scheme-ZNISVRFH.mjs +34 -0
  46. package/dist/lib/node-esm/check-app-scheme-ZNISVRFH.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-EGFOT3DE.mjs +18 -0
  50. package/dist/lib/node-esm/chunk-EGFOT3DE.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-IR6ODCNC.mjs +83 -0
  52. package/dist/lib/node-esm/chunk-IR6ODCNC.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-L2NPJPGL.mjs +281 -0
  54. package/dist/lib/node-esm/chunk-L2NPJPGL.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-O4IOJICP.mjs +201 -0
  56. package/dist/lib/node-esm/chunk-O4IOJICP.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-Z43MBISY.mjs +1391 -0
  58. package/dist/lib/node-esm/chunk-Z43MBISY.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +186 -0
  60. package/dist/lib/node-esm/index.mjs.map +7 -0
  61. package/dist/lib/node-esm/meta.json +1 -0
  62. package/dist/lib/node-esm/operation-resolver-5BYDNQND.mjs +581 -0
  63. package/dist/lib/node-esm/operation-resolver-5BYDNQND.mjs.map +7 -0
  64. package/dist/lib/node-esm/react-root-YO7IIC75.mjs +50 -0
  65. package/dist/lib/node-esm/react-root-YO7IIC75.mjs.map +7 -0
  66. package/dist/lib/node-esm/react-surface-G7VRKT4U.mjs +45 -0
  67. package/dist/lib/node-esm/react-surface-G7VRKT4U.mjs.map +7 -0
  68. package/dist/lib/node-esm/settings-GYLWWOBK.mjs +41 -0
  69. package/dist/lib/node-esm/settings-GYLWWOBK.mjs.map +7 -0
  70. package/dist/lib/node-esm/state-RQXTBWUX.mjs +107 -0
  71. package/dist/lib/node-esm/state-RQXTBWUX.mjs.map +7 -0
  72. package/dist/lib/node-esm/toolkit-EU3Z2R4H.mjs +56 -0
  73. package/dist/lib/node-esm/toolkit-EU3Z2R4H.mjs.map +7 -0
  74. package/dist/lib/node-esm/types/index.mjs +41 -0
  75. package/dist/lib/node-esm/url-handler-VUK2LBJV.mjs +96 -0
  76. package/dist/lib/node-esm/url-handler-VUK2LBJV.mjs.map +7 -0
  77. package/dist/types/src/DeckPlugin.d.ts +2 -1
  78. package/dist/types/src/DeckPlugin.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  80. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +5 -0
  84. package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/check-app-scheme/index.d.ts +3 -0
  86. package/dist/types/src/capabilities/check-app-scheme/index.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/index.d.ts +8 -13
  88. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  90. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  92. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
  94. package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
  96. package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  98. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  100. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/settings/index.d.ts +19 -0
  102. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/settings/settings.d.ts +22 -0
  104. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/state/index.d.ts +172 -0
  106. package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/state/state.d.ts +175 -0
  108. package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/toolkit/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/toolkit/toolkit.d.ts +27 -0
  112. package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/tools/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/tools/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/tools/tools.d.ts +12 -0
  116. package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/url-handler/index.d.ts +3 -0
  118. package/dist/types/src/capabilities/url-handler/index.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/url-handler/url-handler.d.ts +5 -0
  120. package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -0
  121. package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
  122. package/dist/types/src/components/DeckLayout/Banner.d.ts.map +1 -1
  123. package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +1 -1
  124. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts +2 -3
  125. package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
  126. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +75 -0
  127. package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/DeckLayout/DeckMain.d.ts +3 -0
  129. package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -0
  130. package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
  131. package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +1 -1
  132. package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
  133. package/dist/types/src/components/DeckLayout/Toast.d.ts +7 -2
  134. package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
  135. package/dist/types/src/components/Plank/Plank.d.ts +6 -6
  136. package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
  137. package/dist/types/src/components/Plank/Plank.stories.d.ts +105 -5
  138. package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/Plank/PlankControls.d.ts +1 -1
  140. package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
  141. package/dist/types/src/components/Plank/PlankError.d.ts +6 -4
  142. package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
  143. package/dist/types/src/components/Plank/PlankHeading.d.ts +3 -3
  144. package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
  145. package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
  146. package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +1 -1
  147. package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +1 -1
  148. package/dist/types/src/components/fragments.d.ts +4 -1
  149. package/dist/types/src/components/fragments.d.ts.map +1 -1
  150. package/dist/types/src/components/index.d.ts +0 -1
  151. package/dist/types/src/components/index.d.ts.map +1 -1
  152. package/dist/types/src/containers/Banner/Banner.d.ts +2 -0
  153. package/dist/types/src/containers/Banner/Banner.d.ts.map +1 -0
  154. package/dist/types/src/containers/Banner/index.d.ts +3 -0
  155. package/dist/types/src/containers/Banner/index.d.ts.map +1 -0
  156. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts +8 -0
  157. package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
  158. package/dist/types/src/containers/DeckSettings/index.d.ts +3 -0
  159. package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
  160. package/dist/types/src/containers/index.d.ts +4 -0
  161. package/dist/types/src/containers/index.d.ts.map +1 -0
  162. package/dist/types/src/hooks/index.d.ts +2 -0
  163. package/dist/types/src/hooks/index.d.ts.map +1 -1
  164. package/dist/types/src/hooks/useDeckCompanions.d.ts +3 -3
  165. package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
  166. package/dist/types/src/hooks/useDeckState.d.ts +17 -0
  167. package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
  168. package/dist/types/src/hooks/useHoistStatusbar.d.ts +1 -1
  169. package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +1 -1
  170. package/dist/types/src/hooks/useMainSize.d.ts +2 -2
  171. package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
  172. package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
  174. package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
  175. package/dist/types/src/index.d.ts +1 -2
  176. package/dist/types/src/index.d.ts.map +1 -1
  177. package/dist/types/src/meta.d.ts +2 -3
  178. package/dist/types/src/meta.d.ts.map +1 -1
  179. package/dist/types/src/translations.d.ts +4 -1
  180. package/dist/types/src/translations.d.ts.map +1 -1
  181. package/dist/types/src/{capabilities → types}/capabilities.d.ts +96 -90
  182. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  183. package/dist/types/src/types/events.d.ts +7 -0
  184. package/dist/types/src/types/events.d.ts.map +1 -0
  185. package/dist/types/src/types/index.d.ts +2 -0
  186. package/dist/types/src/types/index.d.ts.map +1 -1
  187. package/dist/types/src/types/schema.d.ts +96 -34
  188. package/dist/types/src/types/schema.d.ts.map +1 -1
  189. package/dist/types/src/util/set-active.d.ts +18 -3
  190. package/dist/types/src/util/set-active.d.ts.map +1 -1
  191. package/dist/types/tsconfig.tsbuildinfo +1 -1
  192. package/package.json +58 -46
  193. package/src/DeckPlugin.ts +46 -61
  194. package/src/capabilities/app-graph-builder/app-graph-builder.ts +119 -0
  195. package/src/capabilities/app-graph-builder/index.ts +7 -0
  196. package/src/capabilities/check-app-scheme/check-app-scheme.ts +45 -0
  197. package/src/capabilities/check-app-scheme/index.ts +7 -0
  198. package/src/capabilities/index.ts +9 -13
  199. package/src/capabilities/operation-resolver/index.ts +10 -0
  200. package/src/capabilities/operation-resolver/operation-resolver.ts +560 -0
  201. package/src/capabilities/react-root/index.ts +7 -0
  202. package/src/capabilities/react-root/react-root.tsx +47 -0
  203. package/src/capabilities/react-surface/index.ts +7 -0
  204. package/src/capabilities/react-surface/react-surface.tsx +38 -0
  205. package/src/capabilities/settings/index.ts +7 -0
  206. package/src/capabilities/settings/settings.ts +39 -0
  207. package/src/capabilities/state/index.ts +7 -0
  208. package/src/capabilities/state/state.ts +105 -0
  209. package/src/capabilities/toolkit/index.ts +7 -0
  210. package/src/capabilities/toolkit/toolkit.ts +64 -0
  211. package/src/capabilities/tools/index.ts +7 -0
  212. package/src/capabilities/tools/tools.ts +91 -0
  213. package/src/capabilities/url-handler/index.ts +7 -0
  214. package/src/capabilities/url-handler/url-handler.ts +96 -0
  215. package/src/components/DeckLayout/ActiveNode.tsx +3 -2
  216. package/src/components/DeckLayout/Banner.tsx +12 -12
  217. package/src/components/DeckLayout/ContentEmpty.tsx +6 -7
  218. package/src/components/DeckLayout/DeckLayout.stories.tsx +53 -0
  219. package/src/components/DeckLayout/DeckLayout.tsx +18 -285
  220. package/src/components/DeckLayout/DeckMain.tsx +287 -0
  221. package/src/components/DeckLayout/Dialog.tsx +22 -13
  222. package/src/components/DeckLayout/Fallback.tsx +4 -8
  223. package/src/components/DeckLayout/Popover.tsx +70 -32
  224. package/src/components/DeckLayout/StatusBar.tsx +4 -4
  225. package/src/components/DeckLayout/Toast.tsx +30 -5
  226. package/src/components/Plank/Plank.stories.tsx +26 -17
  227. package/src/components/Plank/Plank.tsx +103 -67
  228. package/src/components/Plank/PlankControls.tsx +12 -14
  229. package/src/components/Plank/PlankError.tsx +33 -18
  230. package/src/components/Plank/PlankHeading.tsx +42 -48
  231. package/src/components/Plank/PlankLoading.tsx +1 -1
  232. package/src/components/Sidebar/ComplementarySidebar.tsx +77 -45
  233. package/src/components/Sidebar/Sidebar.tsx +9 -9
  234. package/src/components/Sidebar/SidebarButton.tsx +40 -33
  235. package/src/components/fragments.ts +10 -5
  236. package/src/components/index.ts +0 -1
  237. package/src/containers/Banner/Banner.tsx +5 -0
  238. package/src/containers/Banner/index.ts +7 -0
  239. package/src/containers/DeckSettings/DeckSettings.tsx +113 -0
  240. package/src/containers/DeckSettings/index.ts +7 -0
  241. package/src/containers/index.ts +8 -0
  242. package/src/hooks/index.ts +2 -0
  243. package/src/hooks/useCompanions.ts +2 -2
  244. package/src/hooks/useDeckCompanions.ts +7 -5
  245. package/src/hooks/useDeckState.ts +82 -0
  246. package/src/hooks/useHoistStatusbar.ts +4 -5
  247. package/src/hooks/useMainSize.ts +2 -2
  248. package/src/hooks/useNodeActionExpander.ts +4 -4
  249. package/src/hooks/useSelectedCompanion.ts +38 -0
  250. package/src/index.ts +1 -2
  251. package/src/meta.ts +8 -5
  252. package/src/translations.ts +4 -1
  253. package/src/types/capabilities.ts +33 -0
  254. package/src/types/events.ts +21 -0
  255. package/src/types/index.ts +2 -0
  256. package/src/types/schema.ts +96 -21
  257. package/src/util/layoutAppliesTopbar.ts +1 -1
  258. package/src/util/overscroll.ts +3 -3
  259. package/src/util/set-active.ts +49 -29
  260. package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs +0 -152
  261. package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs.map +0 -7
  262. package/dist/lib/browser/check-app-scheme-57U62A3A.mjs +0 -32
  263. package/dist/lib/browser/check-app-scheme-57U62A3A.mjs.map +0 -7
  264. package/dist/lib/browser/chunk-CNTGBCMK.mjs +0 -145
  265. package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
  266. package/dist/lib/browser/chunk-D7KTFCUV.mjs +0 -1494
  267. package/dist/lib/browser/chunk-D7KTFCUV.mjs.map +0 -7
  268. package/dist/lib/browser/chunk-F5BQOOEG.mjs +0 -160
  269. package/dist/lib/browser/chunk-F5BQOOEG.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-JFTXENFN.mjs +0 -129
  271. package/dist/lib/browser/chunk-JFTXENFN.mjs.map +0 -7
  272. package/dist/lib/browser/chunk-M57WD3V6.mjs +0 -16
  273. package/dist/lib/browser/chunk-M57WD3V6.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-QDZO4AJ4.mjs +0 -127
  275. package/dist/lib/browser/chunk-QDZO4AJ4.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-Z5KITAZW.mjs +0 -13
  277. package/dist/lib/browser/chunk-Z5KITAZW.mjs.map +0 -7
  278. package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs +0 -521
  279. package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs.map +0 -7
  280. package/dist/lib/browser/react-root-PO64J7ML.mjs +0 -43
  281. package/dist/lib/browser/react-root-PO64J7ML.mjs.map +0 -7
  282. package/dist/lib/browser/react-surface-E45YOVF5.mjs +0 -40
  283. package/dist/lib/browser/react-surface-E45YOVF5.mjs.map +0 -7
  284. package/dist/lib/browser/settings-6AJZPZPM.mjs +0 -29
  285. package/dist/lib/browser/settings-6AJZPZPM.mjs.map +0 -7
  286. package/dist/lib/browser/state-MVDYX77Y.mjs +0 -12
  287. package/dist/lib/browser/tools-TKQDPCHJ.mjs +0 -88
  288. package/dist/lib/browser/tools-TKQDPCHJ.mjs.map +0 -7
  289. package/dist/lib/browser/url-handler-7L7M6IKH.mjs +0 -70
  290. package/dist/lib/browser/url-handler-7L7M6IKH.mjs.map +0 -7
  291. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  292. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  293. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  294. package/dist/types/src/capabilities/check-app-scheme.d.ts +0 -4
  295. package/dist/types/src/capabilities/check-app-scheme.d.ts.map +0 -1
  296. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  297. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  298. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  299. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  300. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  301. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  302. package/dist/types/src/capabilities/settings.d.ts +0 -4
  303. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  304. package/dist/types/src/capabilities/state.d.ts +0 -101
  305. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  306. package/dist/types/src/capabilities/tools.d.ts +0 -11
  307. package/dist/types/src/capabilities/tools.d.ts.map +0 -1
  308. package/dist/types/src/capabilities/url-handler.d.ts +0 -4
  309. package/dist/types/src/capabilities/url-handler.d.ts.map +0 -1
  310. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +0 -6
  311. package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
  312. package/dist/types/src/components/DeckSettings/index.d.ts +0 -2
  313. package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
  314. package/dist/types/src/events.d.ts +0 -4
  315. package/dist/types/src/events.d.ts.map +0 -1
  316. package/src/capabilities/app-graph-builder.ts +0 -141
  317. package/src/capabilities/capabilities.ts +0 -14
  318. package/src/capabilities/check-app-scheme.ts +0 -40
  319. package/src/capabilities/intent-resolver.ts +0 -468
  320. package/src/capabilities/react-root.tsx +0 -38
  321. package/src/capabilities/react-surface.tsx +0 -30
  322. package/src/capabilities/settings.ts +0 -26
  323. package/src/capabilities/state.ts +0 -104
  324. package/src/capabilities/tools.ts +0 -81
  325. package/src/capabilities/url-handler.ts +0 -59
  326. package/src/components/DeckSettings/DeckSettings.tsx +0 -88
  327. package/src/components/DeckSettings/index.ts +0 -5
  328. package/src/events.ts +0 -11
  329. /package/dist/lib/{browser/state-MVDYX77Y.mjs.map → node-esm/types/index.mjs.map} +0 -0
@@ -5,21 +5,17 @@
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
- import { DECK_PLUGIN } from '../../meta';
9
+ import { meta } from '../../meta';
11
10
 
12
11
  export const Fallback = () => {
13
- const { t } = useTranslation(DECK_PLUGIN);
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-error-400/50 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,16 @@
3
3
  //
4
4
 
5
5
  import { createContext } from '@radix-ui/react-context';
6
- import React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import React, { type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
- import { Surface, useCapability } from '@dxos/app-framework';
9
- import { Popover, type PopoverContentInteractOutsideEvent } from '@dxos/react-ui';
8
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
9
+ import { LayoutOperation } from '@dxos/app-toolkit';
10
+ import { useObjectNavigate } from '@dxos/app-toolkit/ui';
11
+ import { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';
12
+ import { Card } from '@dxos/react-ui';
10
13
 
11
- import { DeckCapabilities } from '../../capabilities';
14
+ import { useDeckState } from '../../hooks';
15
+ import { meta } from '../../meta';
12
16
 
13
17
  export type DeckPopoverRootProps = PropsWithChildren<{}>;
14
18
 
@@ -21,43 +25,61 @@ type DeckPopoverContextValue = {
21
25
  const [DeckPopoverProvider, useDeckPopoverContext] = createContext<DeckPopoverContextValue>('DeckPopover');
22
26
 
23
27
  export const PopoverRoot = ({ children }: DeckPopoverRootProps) => {
24
- const layout = useCapability(DeckCapabilities.MutableDeckState);
28
+ const { state } = useDeckState();
25
29
  const virtualRef = useRef<HTMLButtonElement | null>(null);
26
30
  const [virtualIter, setVirtualIter] = useState(0);
27
31
  const [open, setOpen] = useState(false);
28
32
  const debounceRef = useRef<NodeJS.Timeout | null>(null);
29
33
 
30
34
  // 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.
35
+ // the anchor further down the tree or measuring the virtual trigger's client rect.
32
36
  useEffect(() => {
33
37
  setOpen(false);
34
- if (layout.popoverOpen) {
38
+ if (state.popoverOpen) {
35
39
  if (debounceRef.current) {
36
40
  clearTimeout(debounceRef.current);
37
41
  }
38
- if (layout.popoverAnchor && virtualRef.current !== layout.popoverAnchor) {
39
- virtualRef.current = layout.popoverAnchor ?? null;
42
+ if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {
43
+ virtualRef.current = state.popoverAnchor ?? null;
40
44
  setVirtualIter((iter) => iter + 1);
41
45
  }
42
46
  debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);
43
47
  }
44
- }, [layout.popoverOpen, layout.popoverAnchorId, layout.popoverAnchor, layout.popoverContent]);
48
+ }, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);
45
49
 
46
50
  return (
47
51
  <DeckPopoverProvider setOpen={setOpen}>
48
52
  <Popover.Root modal={false} open={open}>
49
- {layout.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}
53
+ {state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}
50
54
  {children}
51
55
  </Popover.Root>
52
56
  </DeckPopoverProvider>
53
57
  );
54
58
  };
55
59
 
60
+ // Extracts the subject from popover content if it has one, otherwise returns the content as-is.
61
+ const getPopoverSubject = (content: unknown): unknown =>
62
+ content && typeof content === 'object' && 'subject' in content ? (content as { subject: unknown }).subject : content;
63
+
56
64
  export const PopoverContent = () => {
57
- const layout = useCapability(DeckCapabilities.MutableDeckState);
65
+ const { t } = useTranslation(meta.id);
66
+ const { state, updateEphemeral } = useDeckState();
58
67
  const { setOpen } = useDeckPopoverContext('PopoverContent');
68
+ const { invokeSync } = useOperationInvoker();
69
+ const handleNavigate = useObjectNavigate(getPopoverSubject(state.popoverContent));
70
+
71
+ const handleClose = useCallback(() => {
72
+ setOpen(false);
73
+ updateEphemeral((state) => ({
74
+ ...state,
75
+ popoverOpen: false,
76
+ popoverAnchor: undefined,
77
+ popoverAnchorId: undefined,
78
+ popoverSide: undefined,
79
+ }));
80
+ }, [updateEphemeral]);
59
81
 
60
- const handleClose = useCallback(
82
+ const handleInteractOutside = useCallback(
61
83
  (event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {
62
84
  if (
63
85
  // TODO(thure): CodeMirror should not focus itself when it updates.
@@ -66,36 +88,52 @@ export const PopoverContent = () => {
66
88
  ) {
67
89
  event.preventDefault();
68
90
  } else {
69
- setOpen(false);
70
- layout.popoverOpen = false;
71
- layout.popoverAnchor = undefined;
72
- layout.popoverAnchorId = undefined;
73
- layout.popoverSide = undefined;
91
+ handleClose();
74
92
  }
75
93
  },
76
- [setOpen],
94
+ [handleClose],
77
95
  );
78
96
 
79
- const collisionBoundaries: HTMLElement[] = useMemo(() => {
80
- const closest = layout.popoverAnchor?.closest('[data-popover-collision-boundary]') as
81
- | HTMLElement
82
- | null
83
- | undefined;
84
- return closest ? [closest] : [];
85
- }, [layout.popoverAnchor]);
86
-
87
97
  return (
88
98
  <Popover.Portal>
89
99
  <Popover.Content
90
- side={layout.popoverSide}
91
- onInteractOutside={handleClose}
92
- onEscapeKeyDown={handleClose}
93
- collisionBoundary={collisionBoundaries}
100
+ side={state.popoverSide}
94
101
  sticky='always'
95
102
  hideWhenDetached
103
+ onInteractOutside={handleInteractOutside}
104
+ onEscapeKeyDown={handleInteractOutside}
96
105
  >
97
106
  <Popover.Viewport>
98
- <Surface role='card--popover' data={layout.popoverContent} limit={1} />
107
+ {/* TODO(burdon): Set/disable column context. */}
108
+ {state.popoverKind === 'base' && <Surface.Surface role='popover' data={state.popoverContent} limit={1} />}
109
+ {state.popoverKind === 'card' && (
110
+ <Card.Root border={false} classNames='dx-card-popover'>
111
+ <Card.Toolbar>
112
+ {/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}
113
+ {state.popoverContentRef ? (
114
+ <Card.ToolbarIconButton
115
+ icon='ph--arrow-square-out--regular'
116
+ iconOnly
117
+ label={t('open item label')}
118
+ onClick={() => {
119
+ invokeSync(LayoutOperation.Open, {
120
+ subject: [state.popoverContentRef!],
121
+ });
122
+ }}
123
+ />
124
+ ) : (
125
+ <div />
126
+ )}
127
+ {state.popoverTitle ? (
128
+ <Card.Title onClick={handleNavigate}>{toLocalizedString(state.popoverTitle, t)}</Card.Title>
129
+ ) : (
130
+ <span />
131
+ )}
132
+ <Card.CloseIconButton onClick={handleClose} />
133
+ </Card.Toolbar>
134
+ <Surface.Surface role='card--content' data={state.popoverContent} limit={1} />
135
+ </Card.Root>
136
+ )}
99
137
  </Popover.Viewport>
100
138
  <Popover.Arrow />
101
139
  </Popover.Content>
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { Surface } from '@dxos/app-framework';
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,
@@ -14,7 +14,7 @@ import {
14
14
  useTranslation,
15
15
  } from '@dxos/react-ui';
16
16
 
17
- import { DECK_PLUGIN } from '../../meta';
17
+ import { meta } from '../../meta';
18
18
 
19
19
  // TODO(wittjosiah): Render remaining duration as a progress bar within the toast.
20
20
  export const Toast = ({
@@ -28,14 +28,14 @@ export const Toast = ({
28
28
  closeLabel,
29
29
  onAction,
30
30
  onOpenChange,
31
- }: LayoutAction.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {
32
- const { t } = useTranslation(DECK_PLUGIN);
31
+ }: LayoutOperation.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {
32
+ const { t } = useTranslation(meta.id);
33
33
 
34
34
  return (
35
35
  <NaturalToast.Root data-testid={id} defaultOpen duration={duration} onOpenChange={onOpenChange}>
36
36
  <NaturalToast.Body>
37
37
  <NaturalToast.Title classNames='items-center'>
38
- {icon && <Icon icon={icon} size={5} classNames='inline mr-1' />}
38
+ {icon && <Icon icon={icon} classNames='inline mr-1' />}
39
39
  {title && <span>{toLocalizedString(title, t)}</span>}
40
40
  </NaturalToast.Title>
41
41
  {description && (
@@ -59,3 +59,28 @@ export const Toast = ({
59
59
  </NaturalToast.Root>
60
60
  );
61
61
  };
62
+
63
+ export type ToasterProps = {
64
+ toasts?: LayoutOperation.Toast[];
65
+ onDismissToast?: (id: string) => void;
66
+ };
67
+
68
+ export const Toaster = ({ toasts, onDismissToast }: ToasterProps) => {
69
+ return (
70
+ <>
71
+ {toasts?.map((toast) => (
72
+ <Toast
73
+ {...toast}
74
+ key={toast.id}
75
+ onOpenChange={(open: boolean) => {
76
+ if (!open) {
77
+ onDismissToast?.(toast.id);
78
+ }
79
+
80
+ return open;
81
+ }}
82
+ />
83
+ ))}
84
+ </>
85
+ );
86
+ };
@@ -2,24 +2,33 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
8
+ import { Capability, Plugin } from '@dxos/app-framework';
11
9
  import { withPluginManager } from '@dxos/app-framework/testing';
12
- import { AttentionPlugin } from '@dxos/plugin-attention';
13
- import { GraphPlugin } from '@dxos/plugin-graph';
10
+ import { AppActivationEvents } from '@dxos/app-toolkit';
11
+ import { corePlugins } from '@dxos/plugin-testing';
12
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
14
13
  import { Stack } from '@dxos/react-ui-stack';
15
- import { withTheme, withLayout } from '@dxos/storybook-utils';
16
14
 
17
- import { Plank, type PlankProps } from './Plank';
18
- import { DeckStateFactory } from '../../capabilities';
15
+ import { DeckState } from '../../capabilities';
16
+ import { meta as pluginMeta } from '../../meta';
19
17
  import { translations } from '../../translations';
20
18
 
21
- const meta: Meta<PlankProps> = {
22
- title: 'plugins/plugin-deck/Plank',
19
+ import { Plank } from './Plank';
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
+
30
+ const meta = {
31
+ title: 'plugins/plugin-deck/components/Plank',
23
32
  component: Plank,
24
33
  render: (args) => {
25
34
  return (
@@ -29,21 +38,21 @@ const meta: Meta<PlankProps> = {
29
38
  );
30
39
  },
31
40
  decorators: [
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
- withTheme,
37
- withLayout({ fullscreen: true }),
38
46
  ],
39
47
  parameters: {
48
+ layout: 'fullscreen',
40
49
  translations,
41
50
  },
42
- };
51
+ } satisfies Meta<typeof Plank>;
43
52
 
44
53
  export default meta;
45
54
 
46
- type Story = StoryObj<PlankProps>;
55
+ type Story = StoryObj<typeof meta>;
47
56
 
48
57
  // TODO(burdon): Need to define surface provider?
49
58
  export const Default: Story = {
@@ -2,6 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { useFocusFinders } from '@fluentui/react-tabster';
5
6
  import React, {
6
7
  type KeyboardEvent,
7
8
  type PropsWithChildren,
@@ -12,33 +13,32 @@ import React, {
12
13
  useRef,
13
14
  } from 'react';
14
15
 
15
- import {
16
- LayoutAction,
17
- Surface,
18
- createIntent,
19
- useCapability,
20
- useAppGraph,
21
- useIntentDispatcher,
22
- } from '@dxos/app-framework';
16
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
17
+ import { LayoutOperation } from '@dxos/app-toolkit';
18
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
23
19
  import { debounce } from '@dxos/async';
24
- import { useNode, type Node } from '@dxos/plugin-graph';
20
+ import { type Node, useNode } from '@dxos/plugin-graph';
25
21
  import { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from '@dxos/react-ui-attention';
26
22
  import { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';
27
- import { mainIntrinsicSize, mx } from '@dxos/react-ui-theme';
23
+ import { mainIntrinsicSize, mx } from '@dxos/ui-theme';
28
24
 
29
- import { PlankContentError, PlankError } from './PlankError';
25
+ import { useCompanions, useDeckState, useMainSize, useSelectedCompanion } from '../../hooks';
26
+ import { parseEntryId } from '../../layout';
27
+ import { DeckOperation, type DeckSettingsProps, type LayoutMode, type ResolvedPart } from '../../types';
28
+
29
+ import { PlankError, PlankErrorFallback } from './PlankError';
30
30
  import { PlankHeading } from './PlankHeading';
31
31
  import { PlankLoading } from './PlankLoading';
32
- import { DeckCapabilities } from '../../capabilities';
33
- import { useMainSize, useCompanions } from '../../hooks';
34
- import { parseEntryId } from '../../layout';
35
- import { DeckAction, type LayoutMode, type ResolvedPart, type DeckSettingsProps } from '../../types';
36
32
 
37
33
  const UNKNOWN_ID = 'unknown_id';
38
34
 
35
+ //
36
+ // Plank
37
+ //
38
+
39
39
  export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path' | 'order' | 'active' | 'settings'> & {
40
40
  id?: string;
41
- companionId?: string;
41
+ companionVariant?: string;
42
42
  };
43
43
 
44
44
  // TODO(burdon): Factor out conditional rendering.
@@ -49,25 +49,31 @@ export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path
49
49
  // benefits. I think where we anticipate users will definitely want to quickly switch between showing and hiding entire
50
50
  // articles, over the (again probably large) performance benefit that unmounting them would confer, we can mount and
51
51
  // hide them, but I think that scenario in its most unambiguous form is probably rare. You could extrapolate
52
- // the scenario to include all potential planks such as companions, which we could keep mounted and hidden, but I
53
- // dont think the resulting performance would be acceptable. I think the real issue is perceived performance which
52
+ // the scenario to include all "potential" planks such as companions, which we could keep mounted and hidden, but I
53
+ // don't think the resulting performance would be acceptable. I think the real issue is "perceived performance" which
54
54
  // has mitigations that are in between mounting and un-mounting since both of those have tradeoffs; we may need one or more
55
- // partially-mounted experiences, like loading skeletons at the simple end, or screenshots of sleeping planks at
55
+ // "partially-mounted" experiences, like loading skeletons at the simple end, or screenshots of "sleeping" planks at
56
56
  // the advanced end.
57
57
 
58
58
  /**
59
59
  * A Plank is the main container for surfaces within a Deck.
60
60
  * It may be paired with a companion plank that enables the user to select one of multiple companion surfaces.
61
61
  */
62
- export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProps) => {
62
+ export const Plank = memo(({ id = UNKNOWN_ID, companionVariant, ...props }: PlankProps) => {
63
63
  const { graph } = useAppGraph();
64
64
  const node = useNode(graph, id);
65
65
  const companions = useCompanions(id);
66
- const currentCompanion = companions.find(({ id }) => id === companionId);
67
- const hasCompanion = !!(companionId && currentCompanion);
66
+ const { companionId } = useSelectedCompanion(companions, companionVariant);
67
+ const resolvedCompanionId = companionVariant ? companionId : undefined;
68
+ const currentCompanion = companions.find(({ id }) => id === resolvedCompanionId);
69
+ const hasCompanion = !!(resolvedCompanionId && currentCompanion);
68
70
 
69
71
  return (
70
- <PlankContainer solo={props.part === 'solo'} companion={hasCompanion}>
72
+ <PlankContainer
73
+ solo={props.part === 'solo'}
74
+ companion={hasCompanion}
75
+ encapsulate={!!props.settings?.encapsulatedPlanks}
76
+ >
71
77
  <PlankComponent
72
78
  id={id}
73
79
  node={node}
@@ -78,7 +84,7 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
78
84
  />
79
85
  {hasCompanion && (
80
86
  <PlankComponent
81
- id={companionId}
87
+ id={resolvedCompanionId}
82
88
  node={currentCompanion}
83
89
  primary={node}
84
90
  companions={companions}
@@ -91,7 +97,13 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
91
97
  );
92
98
  });
93
99
 
94
- const PlankContainer = ({ children, solo, companion }: PropsWithChildren<{ solo: boolean; companion: boolean }>) => {
100
+ //
101
+ // PlankContainer
102
+ //
103
+
104
+ type PlankContainerProps = PropsWithChildren<{ solo: boolean; companion: boolean; encapsulate: boolean }>;
105
+
106
+ const PlankContainer = ({ children, solo, companion, encapsulate }: PlankContainerProps) => {
95
107
  const sizeAttrs = useMainSize();
96
108
  if (!solo) {
97
109
  return children;
@@ -101,7 +113,14 @@ const PlankContainer = ({ children, solo, companion }: PropsWithChildren<{ solo:
101
113
  return (
102
114
  <div
103
115
  role='none'
104
- className={mx('absolute inset-0 grid', companion && 'grid-cols-[1fr_1fr]', railGridHorizontal, mainIntrinsicSize)}
116
+ data-popover-collision-boundary={true}
117
+ className={mx(
118
+ 'absolute inset-(--main-spacing) grid',
119
+ encapsulate && 'border border-separator rounded-sm overflow-hidden',
120
+ companion && 'grid-cols-[6fr_4fr]', // TODO(burdon): Resize.
121
+ railGridHorizontal,
122
+ mainIntrinsicSize,
123
+ )}
105
124
  {...sizeAttrs}
106
125
  >
107
126
  {children}
@@ -109,6 +128,10 @@ const PlankContainer = ({ children, solo, companion }: PropsWithChildren<{ solo:
109
128
  );
110
129
  };
111
130
 
131
+ //
132
+ // PlankComponent
133
+ //
134
+
112
135
  type PlankComponentProps = {
113
136
  layoutMode: LayoutMode;
114
137
  id: string;
@@ -116,11 +139,10 @@ type PlankComponentProps = {
116
139
  path?: string[];
117
140
  order?: number;
118
141
  active?: string[];
119
- // TODO(burdon): Change to role?
120
142
  companioned?: 'primary' | 'companion';
121
- node?: Node;
122
- primary?: Node;
123
- companions?: Node[];
143
+ node?: Node.Node;
144
+ primary?: Node.Node;
145
+ companions?: Node.Node[];
124
146
  settings?: DeckSettingsProps;
125
147
  };
126
148
 
@@ -138,8 +160,10 @@ const PlankComponent = memo(
138
160
  companions,
139
161
  settings,
140
162
  }: PlankComponentProps) => {
141
- const { dispatchPromise: dispatch } = useIntentDispatcher();
142
- const { deck, popoverAnchorId, scrollIntoView } = useCapability(DeckCapabilities.DeckState);
163
+ const { invokePromise } = useOperationInvoker();
164
+ const { state, deck } = useDeckState();
165
+ const { popoverAnchorId, scrollIntoView } = state;
166
+ const { findFirstFocusable } = useFocusFinders();
143
167
  const canResize = layoutMode === 'deck';
144
168
 
145
169
  const attentionAttrs = useAttentionAttributes(primary?.id ?? id);
@@ -156,29 +180,32 @@ const PlankComponent = memo(
156
180
 
157
181
  const handleSizeChange = useCallback(
158
182
  debounce((nextSize: number) => {
159
- return dispatch(createIntent(DeckAction.UpdatePlankSize, { id: sizeKey, size: nextSize }));
183
+ return invokePromise(DeckOperation.UpdatePlankSize, { id: sizeKey, size: nextSize });
160
184
  }, 200),
161
- [dispatch, sizeKey],
185
+ [invokePromise, sizeKey],
162
186
  );
163
187
 
164
- // TODO(thure): Tabsters focus group should handle moving focus to Main, but something is blocking it.
188
+ // TODO(thure): Tabster's focus group should handle moving focus to Main, but something is blocking it.
165
189
  const handleKeyDown = useCallback((event: KeyboardEvent) => {
166
- if (event.target === event.currentTarget && event.key === 'Escape') {
167
- rootElement.current?.closest('main')?.focus();
190
+ if (event.target === event.currentTarget) {
191
+ switch (event.key) {
192
+ case 'Escape':
193
+ rootElement.current?.closest('main')?.focus();
194
+ break;
195
+ case 'Enter':
196
+ rootElement.current && findFirstFocusable(rootElement.current)?.focus();
197
+ break;
198
+ }
168
199
  }
169
200
  }, []);
170
201
 
171
202
  useLayoutEffect(() => {
172
203
  if (scrollIntoView === id) {
173
- // TODO(wittjosiah): When focused on page load, the focus is always visible.
174
- // Forcing focus to something smaller than the plank prevents large focus ring in the interim.
175
- const focusable = rootElement.current?.querySelector('button') || rootElement.current;
176
- focusable?.focus({ preventScroll: true });
177
- layoutMode === 'deck' && focusable?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
204
+ layoutMode === 'deck' && rootElement.current?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
178
205
  // Clear the scroll into view state once it has been actioned.
179
- void dispatch(createIntent(LayoutAction.ScrollIntoView, { part: 'current', subject: undefined }));
206
+ void invokePromise(LayoutOperation.ScrollIntoView, { subject: undefined });
180
207
  }
181
- }, [id, scrollIntoView, layoutMode]);
208
+ }, [id, scrollIntoView, layoutMode, invokePromise]);
182
209
 
183
210
  const isSolo = layoutMode.startsWith('solo') && part === 'solo';
184
211
  const isAttendable =
@@ -189,34 +216,42 @@ const PlankComponent = memo(
189
216
  const data = useMemo(
190
217
  () =>
191
218
  node && {
219
+ attendableId: id,
192
220
  subject: node.data,
193
221
  companionTo: primary?.data,
222
+ properties: node.properties,
194
223
  variant,
195
224
  path,
196
225
  popoverAnchorId,
197
226
  },
198
- [node, node?.data, path, popoverAnchorId, primary?.data, variant],
227
+ [node, node?.data, node?.properties, path, popoverAnchorId, primary?.data, variant],
199
228
  );
200
229
 
201
230
  // TODO(wittjosiah): Change prop to accept a component.
202
231
  const placeholder = useMemo(() => <PlankLoading />, []);
203
232
 
204
233
  const Root = part.startsWith('solo') ? 'article' : StackItem.Root;
234
+ const fullscreen = layoutMode === 'solo--fullscreen';
205
235
  const className = mx(
206
- 'attention-surface relative dx-focus-ring-inset-over-all density-coarse',
207
- isSolo && mainIntrinsicSize,
208
- isSolo && railGridHorizontal,
236
+ 'dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-coarse',
209
237
  isSolo && 'absolute inset-0',
238
+ isSolo && mainIntrinsicSize,
239
+ railGridHorizontal,
210
240
  part.startsWith('solo') && 'grid',
211
- part === 'deck' && (companioned === 'companion' ? '!border-separator border-ie' : '!border-separator border-li'),
212
- part.startsWith('solo-') && 'row-span-2 grid-rows-subgrid min-is-0',
213
- part === 'solo-companion' && '!border-separator border-is',
241
+ part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-w-0',
242
+ fullscreen && 'grid-rows-1',
243
+ part === 'deck' && (companioned === 'companion' ? 'border-separator! border-e' : 'border-separator! border-x'),
244
+ part === 'solo-companion' && 'border-separator! border-s',
245
+ settings?.encapsulatedPlanks &&
246
+ !part.startsWith('solo') &&
247
+ 'mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden',
214
248
  );
215
249
 
216
250
  return (
217
251
  <Root
218
252
  ref={rootElement}
219
253
  data-testid='deck.plank'
254
+ data-popover-collision-boundary={true}
220
255
  tabIndex={0}
221
256
  {...(part.startsWith('solo')
222
257
  ? ({ ...sizeAttrs, className } as any)
@@ -233,32 +268,33 @@ const PlankComponent = memo(
233
268
  >
234
269
  {node ? (
235
270
  <>
236
- <PlankHeading
237
- id={id}
238
- part={part.startsWith('solo-') ? 'solo' : part}
239
- node={node}
240
- layoutMode={layoutMode}
241
- deckEnabled={settings?.enableDeck}
242
- canIncrementStart={canIncrementStart}
243
- canIncrementEnd={canIncrementEnd}
244
- popoverAnchorId={popoverAnchorId}
245
- primaryId={primary?.id}
246
- companioned={companioned}
247
- companions={companions}
248
- />
249
- <Surface
271
+ {!fullscreen && (
272
+ <PlankHeading
273
+ id={id}
274
+ part={part.startsWith('solo-') ? 'solo' : part}
275
+ node={node}
276
+ layoutMode={layoutMode}
277
+ deckEnabled={settings?.enableDeck}
278
+ canIncrementStart={canIncrementStart}
279
+ canIncrementEnd={canIncrementEnd}
280
+ popoverAnchorId={popoverAnchorId}
281
+ primaryId={primary?.id}
282
+ companioned={companioned}
283
+ companions={companions}
284
+ />
285
+ )}
286
+ <Surface.Surface
250
287
  key={node.id}
251
288
  role='article'
252
289
  data={data}
253
290
  limit={1}
254
- fallback={PlankContentError}
291
+ fallback={PlankErrorFallback}
255
292
  placeholder={placeholder}
256
293
  />
257
294
  </>
258
295
  ) : (
259
296
  <PlankError id={id} part={part} />
260
297
  )}
261
-
262
298
  {canResize && <StackItem.ResizeHandle />}
263
299
  </Root>
264
300
  );