@dxos/plugin-space 0.8.4-staging.60fe92afc8 → 0.9.1-main.c7dcc2e112

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 (368) hide show
  1. package/dist/lib/neutral/{CollectionArticle-S3OF5KJ7.mjs → CollectionArticle-BMH7SZ7Q.mjs} +9 -12
  2. package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs.map +7 -0
  3. package/dist/lib/neutral/{CollectionSection-A5WRHE5Z.mjs → CollectionSection-BLYTGOKH.mjs} +2 -2
  4. package/dist/lib/neutral/{CollectionSection-A5WRHE5Z.mjs.map → CollectionSection-BLYTGOKH.mjs.map} +3 -3
  5. package/dist/lib/neutral/{CreateObjectDialog-66R3K6I3.mjs → CreateObjectDialog-4VMOUKM7.mjs} +10 -10
  6. package/dist/lib/neutral/CreateObjectDialog-4VMOUKM7.mjs.map +7 -0
  7. package/dist/lib/neutral/{CreateSpaceDialog-CDGSEIJB.mjs → CreateSpaceDialog-WWNUTLVK.mjs} +6 -6
  8. package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs.map +7 -0
  9. package/dist/lib/neutral/{ImportSpaceDialog-7GKV4OTF.mjs → ImportSpaceDialog-CSSRTFAO.mjs} +4 -4
  10. package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs.map +7 -0
  11. package/dist/lib/neutral/{InlineSyncStatus-TBJKZCH7.mjs → InlineSyncStatus-UOUTAPCU.mjs} +4 -4
  12. package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs.map +7 -0
  13. package/dist/lib/neutral/{JoinDialog-SSFKRFTJ.mjs → JoinDialog-QZGNRJ4P.mjs} +16 -9
  14. package/dist/lib/neutral/JoinDialog-QZGNRJ4P.mjs.map +7 -0
  15. package/dist/lib/neutral/{MembersContainer-KMCQDWCS.mjs → MembersContainer-OWCAMBKS.mjs} +5 -5
  16. package/dist/lib/neutral/MembersContainer-OWCAMBKS.mjs.map +7 -0
  17. package/dist/lib/neutral/{MenuFooter-5JT7V5FZ.mjs → MenuFooter-QCNFUIAO.mjs} +6 -6
  18. package/dist/lib/neutral/MenuFooter-QCNFUIAO.mjs.map +7 -0
  19. package/dist/lib/neutral/{ObjectCardStack-IXNU3HEN.mjs → ObjectCardStack-DHVDRNRK.mjs} +4 -4
  20. package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs.map +7 -0
  21. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs +102 -0
  22. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs.map +7 -0
  23. package/dist/lib/neutral/{RelatedArticle-YDNGUDAJ.mjs → RelatedArticle-YRCRBIYU.mjs} +11 -9
  24. package/dist/lib/neutral/RelatedArticle-YRCRBIYU.mjs.map +7 -0
  25. package/dist/lib/neutral/RenamePopover-XBZAKNM7.mjs +96 -0
  26. package/dist/lib/neutral/RenamePopover-XBZAKNM7.mjs.map +7 -0
  27. package/dist/lib/neutral/{SchemaContainer-Q4BP6X2M.mjs → SchemaContainer-2NK5YB5O.mjs} +2 -2
  28. package/dist/lib/neutral/SchemaContainer-2NK5YB5O.mjs.map +7 -0
  29. package/dist/lib/neutral/{SmallPresenceLive-GUF4WLUC.mjs → SmallPresenceLive-L4H7WJOA.mjs} +2 -2
  30. package/dist/lib/neutral/SpaceHomeArticle-ZV7EERLS.mjs +78 -0
  31. package/dist/lib/neutral/SpaceHomeArticle-ZV7EERLS.mjs.map +7 -0
  32. package/dist/lib/neutral/SpaceHomeRecent-ZR4LIIUD.mjs +83 -0
  33. package/dist/lib/neutral/SpaceHomeRecent-ZR4LIIUD.mjs.map +7 -0
  34. package/dist/lib/neutral/SpacePlugin.mjs +1 -1
  35. package/dist/lib/neutral/SpacePlugin.node.mjs +4 -4
  36. package/dist/lib/neutral/SpacePlugin.node.mjs.map +3 -3
  37. package/dist/lib/neutral/{SpacePresence-ACEXUS3N.mjs → SpacePresence-PDTEDHDE.mjs} +2 -2
  38. package/dist/lib/neutral/{SpaceSettings-YAHBOY5T.mjs → SpaceSettings-IVTCSLNT.mjs} +6 -6
  39. package/dist/lib/neutral/SpaceSettings-IVTCSLNT.mjs.map +7 -0
  40. package/dist/lib/neutral/{SpaceSettingsContainer-IB34TEOB.mjs → SpaceSettingsContainer-QAFQ4LWC.mjs} +8 -8
  41. package/dist/lib/neutral/SpaceSettingsContainer-QAFQ4LWC.mjs.map +7 -0
  42. package/dist/lib/neutral/{SyncStatus-CWOXWDDZ.mjs → SyncStatus-J7CHLO5O.mjs} +3 -3
  43. package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs.map +7 -0
  44. package/dist/lib/neutral/{add-object-QYOMCBJA.mjs → add-object-S64XELC3.mjs} +10 -10
  45. package/dist/lib/neutral/add-object-S64XELC3.mjs.map +7 -0
  46. package/dist/lib/neutral/{add-relation-HV3VCMJG.mjs → add-relation-GWSE42BU.mjs} +3 -3
  47. package/dist/lib/neutral/{add-type-CZVKSEIW.mjs → add-type-C3KYE6PI.mjs} +3 -3
  48. package/dist/lib/neutral/{app-graph-builder-SQGCUCDO.mjs → app-graph-builder-TMAD2ZTH.mjs} +128 -71
  49. package/dist/lib/neutral/app-graph-builder-TMAD2ZTH.mjs.map +7 -0
  50. package/dist/lib/neutral/capabilities/index.mjs +13 -15
  51. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  52. package/dist/lib/neutral/capabilities/node.mjs +2 -2
  53. package/dist/lib/neutral/{chunk-EEXRKYOD.mjs → chunk-2LTGSUGQ.mjs} +2 -2
  54. package/dist/lib/neutral/{chunk-EEXRKYOD.mjs.map → chunk-2LTGSUGQ.mjs.map} +2 -2
  55. package/dist/lib/neutral/chunk-2RPQHHD7.mjs +17 -0
  56. package/dist/lib/neutral/chunk-2RPQHHD7.mjs.map +7 -0
  57. package/dist/lib/neutral/chunk-5ZZS3KMK.mjs +46 -0
  58. package/dist/lib/neutral/chunk-5ZZS3KMK.mjs.map +7 -0
  59. package/dist/lib/neutral/{chunk-K34BPPQE.mjs → chunk-DSYEB2UN.mjs} +29 -17
  60. package/dist/lib/neutral/chunk-DSYEB2UN.mjs.map +7 -0
  61. package/dist/lib/neutral/{chunk-YY62663T.mjs → chunk-F2VJ6VBV.mjs} +3 -3
  62. package/dist/lib/neutral/chunk-F2VJ6VBV.mjs.map +7 -0
  63. package/dist/lib/neutral/{chunk-JHZGRYGS.mjs → chunk-G2KHP7FX.mjs} +2 -2
  64. package/dist/lib/neutral/{chunk-JHZGRYGS.mjs.map → chunk-G2KHP7FX.mjs.map} +2 -2
  65. package/dist/lib/neutral/chunk-I5JXVBXX.mjs +8 -0
  66. package/dist/lib/neutral/{chunk-BBQR23DW.mjs → chunk-LY6XK5MV.mjs} +105 -128
  67. package/dist/lib/neutral/chunk-LY6XK5MV.mjs.map +7 -0
  68. package/dist/lib/neutral/{chunk-7WUJENBF.mjs → chunk-PSCIOT7Q.mjs} +4 -4
  69. package/dist/lib/neutral/chunk-PSCIOT7Q.mjs.map +7 -0
  70. package/dist/lib/neutral/{close-FGQN37PK.mjs → close-YZHFYPUN.mjs} +3 -3
  71. package/dist/lib/neutral/components/index.mjs +7 -7
  72. package/dist/lib/neutral/components/index.mjs.map +3 -3
  73. package/dist/lib/neutral/containers/index.mjs +23 -21
  74. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  75. package/dist/lib/neutral/{create-EPIFSRJA.mjs → create-XKU2W6QC.mjs} +6 -6
  76. package/dist/lib/neutral/create-XKU2W6QC.mjs.map +7 -0
  77. package/dist/lib/neutral/{delete-LIA5M3WI.mjs → delete-EFM7CAVO.mjs} +3 -3
  78. package/dist/lib/neutral/{delete-field-ZIGFXFHY.mjs → delete-field-ONAPFFO5.mjs} +3 -3
  79. package/dist/lib/neutral/{duplicate-object-X37FM6PW.mjs → duplicate-object-OJRPFV5I.mjs} +3 -3
  80. package/dist/lib/neutral/{export-space-VWJHVXWF.mjs → export-space-M5RNVUQX.mjs} +3 -3
  81. package/dist/lib/neutral/{get-share-link-3LEA5FSK.mjs → get-share-link-FUQBJPSQ.mjs} +4 -4
  82. package/dist/lib/neutral/hooks/index.mjs +16 -4
  83. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  84. package/dist/lib/neutral/{identity-created-57RML5XT.mjs → identity-created-QMV4DANW.mjs} +4 -4
  85. package/dist/lib/neutral/identity-created-QMV4DANW.mjs.map +7 -0
  86. package/dist/lib/neutral/{import-space-Y5L3QE3C.mjs → import-space-L3AUIARM.mjs} +3 -3
  87. package/dist/lib/neutral/index.mjs +12 -6
  88. package/dist/lib/neutral/{join-Z5K4OAIG.mjs → join-VY3QYBU7.mjs} +4 -4
  89. package/dist/lib/neutral/meta.json +1 -1
  90. package/dist/lib/neutral/meta.mjs +1 -1
  91. package/dist/lib/neutral/{migrate-G7I52UKD.mjs → migrate-WPUISBC4.mjs} +3 -3
  92. package/dist/lib/neutral/{navigation-handler-QQJYEMAS.mjs → navigation-handler-IKXZGMII.mjs} +4 -4
  93. package/dist/lib/neutral/{navigation-resolver-IFVQRCGU.mjs → navigation-resolver-VBPGMFCE.mjs} +7 -7
  94. package/dist/lib/neutral/navigation-resolver-VBPGMFCE.mjs.map +7 -0
  95. package/dist/lib/neutral/{open-CPWVZSI4.mjs → open-RRYULTSY.mjs} +3 -3
  96. package/dist/lib/neutral/{open-create-object-4LN4PR6N.mjs → open-create-object-BRUVFZSY.mjs} +4 -4
  97. package/dist/lib/neutral/{open-create-space-VPAW3F2T.mjs → open-create-space-ARLQWW65.mjs} +4 -4
  98. package/dist/lib/neutral/{open-import-space-VLQ5V55H.mjs → open-import-space-65H57JXX.mjs} +4 -4
  99. package/dist/lib/neutral/{open-members-BEXOSSBS.mjs → open-members-677P6KD3.mjs} +6 -6
  100. package/dist/lib/neutral/open-members-677P6KD3.mjs.map +7 -0
  101. package/dist/lib/neutral/{open-settings-RHDBW2K5.mjs → open-settings-PRBSGO6D.mjs} +6 -6
  102. package/dist/lib/neutral/open-settings-PRBSGO6D.mjs.map +7 -0
  103. package/dist/lib/neutral/operations/index.mjs +3 -3
  104. package/dist/lib/neutral/plugin.mjs +4 -4
  105. package/dist/lib/neutral/{react-root-2DJPZQT4.mjs → react-root-YLYRCSAZ.mjs} +2 -2
  106. package/dist/lib/neutral/{react-root-2DJPZQT4.mjs.map → react-root-YLYRCSAZ.mjs.map} +3 -3
  107. package/dist/lib/neutral/{react-surface-LYCTOQLY.mjs → react-surface-5EQ6X4CL.mjs} +48 -70
  108. package/dist/lib/neutral/react-surface-5EQ6X4CL.mjs.map +7 -0
  109. package/dist/lib/neutral/{remove-objects-OWDMA4IF.mjs → remove-objects-PWJJI36V.mjs} +5 -5
  110. package/dist/lib/neutral/remove-objects-PWJJI36V.mjs.map +7 -0
  111. package/dist/lib/neutral/{rename-SR6BBSPU.mjs → rename-4727PKI4.mjs} +8 -7
  112. package/dist/lib/neutral/rename-4727PKI4.mjs.map +7 -0
  113. package/dist/lib/neutral/{rename-object-5H6E5AOX.mjs → rename-object-FXUAB5FN.mjs} +8 -7
  114. package/dist/lib/neutral/rename-object-FXUAB5FN.mjs.map +7 -0
  115. package/dist/lib/neutral/{repair-PSYRVSJ6.mjs → repair-HMH476U3.mjs} +3 -3
  116. package/dist/lib/neutral/repair-HMH476U3.mjs.map +7 -0
  117. package/dist/lib/neutral/{restore-field-UHDG2ZQM.mjs → restore-field-3ICSIHGA.mjs} +3 -3
  118. package/dist/lib/neutral/{restore-objects-2UD5P6OC.mjs → restore-objects-V2BTEWN3.mjs} +3 -3
  119. package/dist/lib/neutral/{settings-Q32EQCHX.mjs → settings-5IBSYBVU.mjs} +3 -3
  120. package/dist/lib/neutral/{settings-Q32EQCHX.mjs.map → settings-5IBSYBVU.mjs.map} +3 -3
  121. package/dist/lib/neutral/{share-5Y4NZA75.mjs → share-ZOZPAUGI.mjs} +3 -3
  122. package/dist/lib/neutral/{snapshot-H3HKOFVP.mjs → snapshot-ZC5PU55W.mjs} +3 -3
  123. package/dist/lib/neutral/{spaces-ready-GBF72QJH.mjs → spaces-ready-EXPCJD4N.mjs} +11 -11
  124. package/dist/lib/neutral/spaces-ready-EXPCJD4N.mjs.map +7 -0
  125. package/dist/lib/neutral/{state-DPBOZRAW.mjs → state-KMH2NUAL.mjs} +2 -2
  126. package/dist/lib/neutral/state-KMH2NUAL.mjs.map +7 -0
  127. package/dist/lib/neutral/testing.mjs +1 -1
  128. package/dist/lib/neutral/translations.mjs +4 -2
  129. package/dist/lib/neutral/translations.mjs.map +3 -3
  130. package/dist/lib/neutral/types/index.mjs +9 -3
  131. package/dist/lib/neutral/{undo-mappings-OBRQOYN4.mjs → undo-mappings-P43EAUGI.mjs} +5 -5
  132. package/dist/lib/neutral/{undo-mappings-OBRQOYN4.mjs.map → undo-mappings-P43EAUGI.mjs.map} +3 -3
  133. package/dist/lib/neutral/{wait-for-object-3TAWUWTP.mjs → wait-for-object-WURK2SLQ.mjs} +3 -3
  134. package/dist/types/dx.config.d.ts +28 -0
  135. package/dist/types/dx.config.d.ts.map +1 -0
  136. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  137. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +12 -0
  138. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -1
  139. package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts.map +1 -1
  140. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +0 -1
  141. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +13 -1
  143. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +1 -1
  145. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/index.d.ts +10 -54
  147. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  148. package/dist/types/src/capabilities/navigation-handler/index.d.ts +1 -1
  149. package/dist/types/src/capabilities/navigation-handler/index.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -1
  151. package/dist/types/src/capabilities/node.d.ts +3 -33
  152. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  153. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  154. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  155. package/dist/types/src/commands/database/add.d.ts.map +1 -1
  156. package/dist/types/src/commands/queue/query.d.ts.map +1 -1
  157. package/dist/types/src/components/SpaceSettings/SpaceSettings.stories.d.ts +20 -0
  158. package/dist/types/src/components/SpaceSettings/SpaceSettings.stories.d.ts.map +1 -1
  159. package/dist/types/src/constants.d.ts +1 -2
  160. package/dist/types/src/constants.d.ts.map +1 -1
  161. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
  162. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts +20 -0
  163. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  164. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
  165. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts +20 -0
  166. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts.map +1 -1
  167. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
  168. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +20 -0
  169. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
  170. package/dist/types/src/containers/ObjectProperties/ObjectProperties.d.ts +1 -1
  171. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -1
  172. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts +12 -0
  173. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts.map +1 -0
  174. package/dist/types/src/containers/RenamePopover/index.d.ts +3 -0
  175. package/dist/types/src/containers/RenamePopover/index.d.ts.map +1 -0
  176. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts +15 -0
  177. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts.map +1 -0
  178. package/dist/types/src/containers/SpaceHomeArticle/index.d.ts +2 -0
  179. package/dist/types/src/containers/SpaceHomeArticle/index.d.ts.map +1 -0
  180. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts +22 -0
  181. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts.map +1 -0
  182. package/dist/types/src/containers/SpaceHomeRecent/index.d.ts +2 -0
  183. package/dist/types/src/containers/SpaceHomeRecent/index.d.ts.map +1 -0
  184. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +20 -0
  185. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
  186. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +20 -0
  187. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
  188. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +20 -0
  189. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  190. package/dist/types/src/containers/index.d.ts +3 -2
  191. package/dist/types/src/containers/index.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useRelatedObjects.d.ts.map +1 -1
  194. package/dist/types/src/meta.d.ts +28 -2
  195. package/dist/types/src/meta.d.ts.map +1 -1
  196. package/dist/types/src/operations/add-object.d.ts.map +1 -1
  197. package/dist/types/src/operations/helpers.d.ts.map +1 -1
  198. package/dist/types/src/operations/remove-objects.d.ts.map +1 -1
  199. package/dist/types/src/operations/rename-object.d.ts.map +1 -1
  200. package/dist/types/src/operations/rename.d.ts.map +1 -1
  201. package/dist/types/src/translations.d.ts +20 -0
  202. package/dist/types/src/translations.d.ts.map +1 -1
  203. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  204. package/dist/types/src/types/events.d.ts.map +1 -1
  205. package/dist/types/src/types/form.d.ts +7 -1
  206. package/dist/types/src/types/form.d.ts.map +1 -1
  207. package/dist/types/src/types/index.d.ts +1 -0
  208. package/dist/types/src/types/index.d.ts.map +1 -1
  209. package/dist/types/src/types/surface.d.ts +26 -0
  210. package/dist/types/src/types/surface.d.ts.map +1 -0
  211. package/dist/types/src/types/types.d.ts +7 -0
  212. package/dist/types/src/types/types.d.ts.map +1 -1
  213. package/dist/types/src/util.d.ts.map +1 -1
  214. package/dist/types/tsconfig.tsbuildinfo +1 -1
  215. package/dx.config.ts +35 -0
  216. package/package.json +51 -50
  217. package/src/SpacePlugin.test.ts +1 -1
  218. package/src/SpacePlugin.ts +1 -7
  219. package/src/capabilities/app-graph-builder/extensions/collections.ts +44 -24
  220. package/src/capabilities/app-graph-builder/extensions/companions.ts +3 -3
  221. package/src/capabilities/app-graph-builder/extensions/database.ts +17 -14
  222. package/src/capabilities/app-graph-builder/extensions/settings.ts +9 -9
  223. package/src/capabilities/app-graph-builder/extensions/shared.ts +5 -20
  224. package/src/capabilities/app-graph-builder/extensions/spaces.ts +49 -26
  225. package/src/capabilities/identity-created.ts +3 -3
  226. package/src/capabilities/index.ts +0 -1
  227. package/src/capabilities/navigation-resolver.ts +6 -13
  228. package/src/capabilities/react-root.tsx +1 -1
  229. package/src/capabilities/react-surface.tsx +58 -88
  230. package/src/capabilities/repair.ts +4 -2
  231. package/src/capabilities/settings.ts +2 -2
  232. package/src/capabilities/spaces-ready.ts +8 -15
  233. package/src/capabilities/state.ts +1 -1
  234. package/src/capabilities/undo-mappings.ts +3 -3
  235. package/src/commands/database/add.ts +4 -2
  236. package/src/commands/queue/query.ts +4 -3
  237. package/src/components/AwaitingObject/AwaitingObject.tsx +1 -1
  238. package/src/components/CreateObjectPanel/CreateObjectPanel.tsx +2 -2
  239. package/src/components/ForeignKeys/ForeignKeys.tsx +1 -1
  240. package/src/components/SpaceSettings/SpaceSettings.tsx +3 -3
  241. package/src/constants.ts +5 -6
  242. package/src/containers/CollectionArticle/CollectionArticle.tsx +10 -6
  243. package/src/containers/CollectionSection/CollectionSection.tsx +1 -1
  244. package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +10 -7
  245. package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +5 -5
  246. package/src/containers/ImportSpaceDialog/ImportSpaceDialog.tsx +3 -3
  247. package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +3 -3
  248. package/src/containers/JoinDialog/JoinDialog.tsx +13 -11
  249. package/src/containers/MembersContainer/MembersContainer.tsx +5 -5
  250. package/src/containers/MenuFooter/MenuFooter.tsx +3 -3
  251. package/src/containers/ObjectCardStack/ObjectCardStack.tsx +3 -3
  252. package/src/containers/RecordArticle/RecordArticle.tsx +67 -8
  253. package/src/containers/RelatedArticle/RelatedArticle.tsx +17 -13
  254. package/src/containers/RenamePopover/RenamePopover.tsx +112 -0
  255. package/src/containers/RenamePopover/index.ts +6 -0
  256. package/src/containers/SchemaContainer/SchemaContainer.tsx +1 -1
  257. package/src/containers/SpaceHomeArticle/SpaceHomeArticle.tsx +100 -0
  258. package/src/containers/SpaceHomeArticle/index.ts +5 -0
  259. package/src/containers/SpaceHomeRecent/SpaceHomeRecent.tsx +101 -0
  260. package/src/containers/SpaceHomeRecent/index.ts +5 -0
  261. package/src/containers/SpacePresence/SpacePresence.tsx +1 -1
  262. package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +7 -7
  263. package/src/containers/SyncStatus/SyncStatus.tsx +2 -2
  264. package/src/containers/index.ts +3 -2
  265. package/src/hooks/useInputSurfaceLookup.tsx +3 -2
  266. package/src/hooks/useRelatedObjects.ts +13 -1
  267. package/src/meta.ts +2 -27
  268. package/src/operations/add-object.ts +7 -14
  269. package/src/operations/create.ts +2 -2
  270. package/src/operations/definitions.ts +1 -1
  271. package/src/operations/helpers.ts +1 -1
  272. package/src/operations/open-members.ts +3 -3
  273. package/src/operations/open-settings.ts +3 -3
  274. package/src/operations/remove-objects.ts +3 -2
  275. package/src/operations/rename-object.ts +3 -2
  276. package/src/operations/rename.ts +3 -2
  277. package/src/translations.ts +3 -1
  278. package/src/types/capabilities.ts +8 -8
  279. package/src/types/events.ts +5 -5
  280. package/src/types/form.ts +5 -1
  281. package/src/types/index.ts +1 -0
  282. package/src/types/surface.ts +31 -0
  283. package/src/types/types.ts +9 -1
  284. package/src/util.ts +3 -3
  285. package/dist/lib/neutral/CollectionArticle-S3OF5KJ7.mjs.map +0 -7
  286. package/dist/lib/neutral/CreateObjectDialog-66R3K6I3.mjs.map +0 -7
  287. package/dist/lib/neutral/CreateSpaceDialog-CDGSEIJB.mjs.map +0 -7
  288. package/dist/lib/neutral/EntityRenamePopover-MYSW262F.mjs +0 -59
  289. package/dist/lib/neutral/EntityRenamePopover-MYSW262F.mjs.map +0 -7
  290. package/dist/lib/neutral/ImportSpaceDialog-7GKV4OTF.mjs.map +0 -7
  291. package/dist/lib/neutral/InlineSyncStatus-TBJKZCH7.mjs.map +0 -7
  292. package/dist/lib/neutral/JoinDialog-SSFKRFTJ.mjs.map +0 -7
  293. package/dist/lib/neutral/MembersContainer-KMCQDWCS.mjs.map +0 -7
  294. package/dist/lib/neutral/MenuFooter-5JT7V5FZ.mjs.map +0 -7
  295. package/dist/lib/neutral/ObjectCardStack-IXNU3HEN.mjs.map +0 -7
  296. package/dist/lib/neutral/RecordArticle-QWGH25NT.mjs +0 -51
  297. package/dist/lib/neutral/RecordArticle-QWGH25NT.mjs.map +0 -7
  298. package/dist/lib/neutral/RelatedArticle-YDNGUDAJ.mjs.map +0 -7
  299. package/dist/lib/neutral/SchemaContainer-Q4BP6X2M.mjs.map +0 -7
  300. package/dist/lib/neutral/SpaceRenamePopover-KFWL4CTJ.mjs +0 -56
  301. package/dist/lib/neutral/SpaceRenamePopover-KFWL4CTJ.mjs.map +0 -7
  302. package/dist/lib/neutral/SpaceSettings-YAHBOY5T.mjs.map +0 -7
  303. package/dist/lib/neutral/SpaceSettingsContainer-IB34TEOB.mjs.map +0 -7
  304. package/dist/lib/neutral/SyncStatus-CWOXWDDZ.mjs.map +0 -7
  305. package/dist/lib/neutral/add-object-QYOMCBJA.mjs.map +0 -7
  306. package/dist/lib/neutral/app-graph-builder-SQGCUCDO.mjs.map +0 -7
  307. package/dist/lib/neutral/app-graph-serializer-IBPPU5VR.mjs +0 -81
  308. package/dist/lib/neutral/app-graph-serializer-IBPPU5VR.mjs.map +0 -7
  309. package/dist/lib/neutral/chunk-4RTSNTDC.mjs +0 -37
  310. package/dist/lib/neutral/chunk-4RTSNTDC.mjs.map +0 -7
  311. package/dist/lib/neutral/chunk-7WUJENBF.mjs.map +0 -7
  312. package/dist/lib/neutral/chunk-B7DBIARR.mjs +0 -8
  313. package/dist/lib/neutral/chunk-BBQR23DW.mjs.map +0 -7
  314. package/dist/lib/neutral/chunk-F5MESIRH.mjs +0 -19
  315. package/dist/lib/neutral/chunk-F5MESIRH.mjs.map +0 -7
  316. package/dist/lib/neutral/chunk-K34BPPQE.mjs.map +0 -7
  317. package/dist/lib/neutral/chunk-YY62663T.mjs.map +0 -7
  318. package/dist/lib/neutral/create-EPIFSRJA.mjs.map +0 -7
  319. package/dist/lib/neutral/identity-created-57RML5XT.mjs.map +0 -7
  320. package/dist/lib/neutral/navigation-resolver-IFVQRCGU.mjs.map +0 -7
  321. package/dist/lib/neutral/open-members-BEXOSSBS.mjs.map +0 -7
  322. package/dist/lib/neutral/open-settings-RHDBW2K5.mjs.map +0 -7
  323. package/dist/lib/neutral/react-surface-LYCTOQLY.mjs.map +0 -7
  324. package/dist/lib/neutral/remove-objects-OWDMA4IF.mjs.map +0 -7
  325. package/dist/lib/neutral/rename-SR6BBSPU.mjs.map +0 -7
  326. package/dist/lib/neutral/rename-object-5H6E5AOX.mjs.map +0 -7
  327. package/dist/lib/neutral/repair-PSYRVSJ6.mjs.map +0 -7
  328. package/dist/lib/neutral/spaces-ready-GBF72QJH.mjs.map +0 -7
  329. package/dist/lib/neutral/state-DPBOZRAW.mjs.map +0 -7
  330. package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -5
  331. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
  332. package/dist/types/src/containers/EntityRenamePopover/EntityRenamePopover.d.ts +0 -7
  333. package/dist/types/src/containers/EntityRenamePopover/EntityRenamePopover.d.ts.map +0 -1
  334. package/dist/types/src/containers/EntityRenamePopover/index.d.ts +0 -2
  335. package/dist/types/src/containers/EntityRenamePopover/index.d.ts.map +0 -1
  336. package/dist/types/src/containers/SpaceRenamePopover/SpaceRenamePopover.d.ts +0 -7
  337. package/dist/types/src/containers/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +0 -1
  338. package/dist/types/src/containers/SpaceRenamePopover/index.d.ts +0 -2
  339. package/dist/types/src/containers/SpaceRenamePopover/index.d.ts.map +0 -1
  340. package/src/capabilities/app-graph-serializer.ts +0 -85
  341. package/src/containers/EntityRenamePopover/EntityRenamePopover.tsx +0 -52
  342. package/src/containers/EntityRenamePopover/index.ts +0 -5
  343. package/src/containers/SpaceRenamePopover/SpaceRenamePopover.tsx +0 -54
  344. package/src/containers/SpaceRenamePopover/index.ts +0 -5
  345. /package/dist/lib/neutral/{SmallPresenceLive-GUF4WLUC.mjs.map → SmallPresenceLive-L4H7WJOA.mjs.map} +0 -0
  346. /package/dist/lib/neutral/{SpacePresence-ACEXUS3N.mjs.map → SpacePresence-PDTEDHDE.mjs.map} +0 -0
  347. /package/dist/lib/neutral/{add-relation-HV3VCMJG.mjs.map → add-relation-GWSE42BU.mjs.map} +0 -0
  348. /package/dist/lib/neutral/{add-type-CZVKSEIW.mjs.map → add-type-C3KYE6PI.mjs.map} +0 -0
  349. /package/dist/lib/neutral/{chunk-B7DBIARR.mjs.map → chunk-I5JXVBXX.mjs.map} +0 -0
  350. /package/dist/lib/neutral/{close-FGQN37PK.mjs.map → close-YZHFYPUN.mjs.map} +0 -0
  351. /package/dist/lib/neutral/{delete-LIA5M3WI.mjs.map → delete-EFM7CAVO.mjs.map} +0 -0
  352. /package/dist/lib/neutral/{delete-field-ZIGFXFHY.mjs.map → delete-field-ONAPFFO5.mjs.map} +0 -0
  353. /package/dist/lib/neutral/{duplicate-object-X37FM6PW.mjs.map → duplicate-object-OJRPFV5I.mjs.map} +0 -0
  354. /package/dist/lib/neutral/{export-space-VWJHVXWF.mjs.map → export-space-M5RNVUQX.mjs.map} +0 -0
  355. /package/dist/lib/neutral/{get-share-link-3LEA5FSK.mjs.map → get-share-link-FUQBJPSQ.mjs.map} +0 -0
  356. /package/dist/lib/neutral/{import-space-Y5L3QE3C.mjs.map → import-space-L3AUIARM.mjs.map} +0 -0
  357. /package/dist/lib/neutral/{join-Z5K4OAIG.mjs.map → join-VY3QYBU7.mjs.map} +0 -0
  358. /package/dist/lib/neutral/{migrate-G7I52UKD.mjs.map → migrate-WPUISBC4.mjs.map} +0 -0
  359. /package/dist/lib/neutral/{navigation-handler-QQJYEMAS.mjs.map → navigation-handler-IKXZGMII.mjs.map} +0 -0
  360. /package/dist/lib/neutral/{open-CPWVZSI4.mjs.map → open-RRYULTSY.mjs.map} +0 -0
  361. /package/dist/lib/neutral/{open-create-object-4LN4PR6N.mjs.map → open-create-object-BRUVFZSY.mjs.map} +0 -0
  362. /package/dist/lib/neutral/{open-create-space-VPAW3F2T.mjs.map → open-create-space-ARLQWW65.mjs.map} +0 -0
  363. /package/dist/lib/neutral/{open-import-space-VLQ5V55H.mjs.map → open-import-space-65H57JXX.mjs.map} +0 -0
  364. /package/dist/lib/neutral/{restore-field-UHDG2ZQM.mjs.map → restore-field-3ICSIHGA.mjs.map} +0 -0
  365. /package/dist/lib/neutral/{restore-objects-2UD5P6OC.mjs.map → restore-objects-V2BTEWN3.mjs.map} +0 -0
  366. /package/dist/lib/neutral/{share-5Y4NZA75.mjs.map → share-ZOZPAUGI.mjs.map} +0 -0
  367. /package/dist/lib/neutral/{snapshot-H3HKOFVP.mjs.map → snapshot-ZC5PU55W.mjs.map} +0 -0
  368. /package/dist/lib/neutral/{wait-for-object-3TAWUWTP.mjs.map → wait-for-object-WURK2SLQ.mjs.map} +0 -0
@@ -2,17 +2,22 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React from 'react';
5
+ import React, { useMemo } from 'react';
6
6
 
7
7
  import { Surface } from '@dxos/app-framework/ui';
8
- import { AppSurface } from '@dxos/app-toolkit/ui';
9
- import { Obj, Type } from '@dxos/echo';
10
- import { Card, Input, Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';
8
+ import { AppSurface, useObjectMenuItems } from '@dxos/app-toolkit/ui';
9
+ import { Entity, Obj, Type } from '@dxos/echo';
10
+ import { Card, Icon, IconButton, Input, Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';
11
+ import { Masonry } from '@dxos/react-ui-masonry';
12
+ import { Menu } from '@dxos/react-ui-menu';
13
+ import { mx } from '@dxos/ui-theme';
11
14
 
15
+ import { useRelatedObjects } from '#hooks';
12
16
  import { meta } from '#meta';
17
+ import { Prompts } from '#types';
13
18
 
14
19
  export const RecordArticle = ({ role, subject }: AppSurface.ObjectArticleProps) => {
15
- const { t } = useTranslation(meta.id);
20
+ const { t } = useTranslation(meta.profile.key);
16
21
  // Obj.getType fails for database-registered (dynamic) schemas due to DXN mismatch;
17
22
  // fall back to typename query which matches TypeSchema.typename.
18
23
  const db = Obj.getDatabase(subject);
@@ -30,6 +35,9 @@ export const RecordArticle = ({ role, subject }: AppSurface.ObjectArticleProps)
30
35
  ? 'ph--cube--regular'
31
36
  : (Obj.getIcon(subject)?.icon ?? 'ph--circle-dashed--regular');
32
37
 
38
+ const related = useRelatedObjects(db, subject, { references: true, relations: true });
39
+ const singleColumn = related.length === 1;
40
+
33
41
  return (
34
42
  <Panel.Root role={role}>
35
43
  <Panel.Toolbar asChild>
@@ -40,11 +48,13 @@ export const RecordArticle = ({ role, subject }: AppSurface.ObjectArticleProps)
40
48
  <ScrollArea.Viewport classNames='p-4 space-y-4'>
41
49
  <Card.Root classNames='dx-card-max-width'>
42
50
  <Card.Header>
43
- <Card.Icon icon={icon} />
51
+ <Card.Block>
52
+ <Icon icon={icon} />
53
+ </Card.Block>
44
54
  <Card.Title>{Obj.getLabel(subject, { fallback: 'typename' })}</Card.Title>
45
55
  </Card.Header>
46
56
  <Card.Body>
47
- <Surface.Surface type={AppSurface.Card} data={{ subject }} limit={1} />
57
+ <Surface.Surface type={AppSurface.CardContent} data={{ subject }} limit={1} />
48
58
  </Card.Body>
49
59
  </Card.Root>
50
60
 
@@ -53,11 +63,60 @@ export const RecordArticle = ({ role, subject }: AppSurface.ObjectArticleProps)
53
63
  <Input.Root>
54
64
  <Input.Label>{t('related-actions.label')}</Input.Label>
55
65
  </Input.Root>
56
- <Surface.Surface role='prompts' data={{ subject }} limit={1} />
66
+ <Surface.Surface type={Prompts} data={{ subject, attendableId: subject.id }} limit={1} />
57
67
  </div>
68
+
69
+ {related.length > 0 && (
70
+ <div
71
+ className={mx('dx-expander flex flex-col gap-form-gap', singleColumn ? 'dx-card-max-width' : 'w-full')}
72
+ >
73
+ <Input.Root>
74
+ <Input.Label>{t('related-objects.label')}</Input.Label>
75
+ </Input.Root>
76
+ <Masonry.Root Tile={ObjectCard} columns={singleColumn ? 1 : undefined}>
77
+ <Masonry.Content>
78
+ <Masonry.Viewport items={related} />
79
+ </Masonry.Content>
80
+ </Masonry.Root>
81
+ </div>
82
+ )}
58
83
  </ScrollArea.Viewport>
59
84
  </ScrollArea.Root>
60
85
  </Panel.Content>
61
86
  </Panel.Root>
62
87
  );
63
88
  };
89
+
90
+ const ObjectCard = ({ data: subject, classNames }: { data: Entity.Unknown; classNames?: string }) => {
91
+ const { t } = useTranslation(meta.profile.key);
92
+ const data = useMemo(() => ({ subject }), [subject]);
93
+ const icon = Entity.getIcon(subject)?.icon ?? 'ph--circle-dashed--regular';
94
+ const menuItems = useObjectMenuItems(subject);
95
+
96
+ return (
97
+ <Menu.Root>
98
+ <Card.Root classNames={classNames}>
99
+ <Card.Header>
100
+ <Card.Block>
101
+ <Icon icon={icon} />
102
+ </Card.Block>
103
+ <Card.Title>{Entity.getLabel(subject, { fallback: 'typename' })}</Card.Title>
104
+ <Card.Block end>
105
+ <Menu.Trigger asChild disabled={!menuItems?.length}>
106
+ <IconButton
107
+ iconOnly
108
+ variant='ghost'
109
+ icon='ph--dots-three-vertical--regular'
110
+ label={t('more-actions.label')}
111
+ />
112
+ </Menu.Trigger>
113
+ <Menu.Content items={menuItems} />
114
+ </Card.Block>
115
+ </Card.Header>
116
+ <Card.Body>
117
+ <Surface.Surface type={AppSurface.CardContent} data={data} limit={1} />
118
+ </Card.Body>
119
+ </Card.Root>
120
+ </Menu.Root>
121
+ );
122
+ };
@@ -7,7 +7,7 @@ import React, { useMemo } from 'react';
7
7
  import { Surface } from '@dxos/app-framework/ui';
8
8
  import { AppSurface, useObjectMenuItems } from '@dxos/app-toolkit/ui';
9
9
  import { Entity, Obj } from '@dxos/echo';
10
- import { Card, Panel, Toolbar, useTranslation } from '@dxos/react-ui';
10
+ import { Card, Icon, IconButton, Panel, Toolbar, useTranslation } from '@dxos/react-ui';
11
11
  import { Masonry } from '@dxos/react-ui-masonry';
12
12
  import { Menu } from '@dxos/react-ui-menu';
13
13
 
@@ -42,7 +42,7 @@ export const RelatedArticle = ({ role, companionTo }: RelatedArticleProps) => {
42
42
 
43
43
  /** Masonry tile renderer for a related entity. */
44
44
  const ObjectCard = ({ data: subject, classNames }: { data: Entity.Unknown; classNames?: string }) => {
45
- const { t } = useTranslation(meta.id);
45
+ const { t } = useTranslation(meta.profile.key);
46
46
  const data = useMemo(() => ({ subject }), [subject]);
47
47
  const icon = Entity.getIcon(subject)?.icon ?? 'ph--circle-dashed--regular';
48
48
 
@@ -53,20 +53,24 @@ const ObjectCard = ({ data: subject, classNames }: { data: Entity.Unknown; class
53
53
  <Menu.Root>
54
54
  <Card.Root classNames={classNames}>
55
55
  <Card.Header>
56
- <Card.Icon icon={icon} />
56
+ <Card.Block>
57
+ <Icon icon={icon} />
58
+ </Card.Block>
57
59
  <Card.Title>{Entity.getLabel(subject, { fallback: 'typename' })}</Card.Title>
58
- <Menu.Trigger asChild disabled={!menuItems?.length}>
59
- <Toolbar.IconButton
60
- iconOnly
61
- variant='ghost'
62
- icon='ph--dots-three-vertical--regular'
63
- label={t('more-actions.label')}
64
- />
65
- </Menu.Trigger>
66
- <Menu.Content items={menuItems} />
60
+ <Card.Block end>
61
+ <Menu.Trigger asChild disabled={!menuItems?.length}>
62
+ <IconButton
63
+ iconOnly
64
+ variant='ghost'
65
+ icon='ph--dots-three-vertical--regular'
66
+ label={t('more-actions.label')}
67
+ />
68
+ </Menu.Trigger>
69
+ <Menu.Content items={menuItems} />
70
+ </Card.Block>
67
71
  </Card.Header>
68
72
  <Card.Body>
69
- <Surface.Surface type={AppSurface.Card} data={data} limit={1} />
73
+ <Surface.Surface type={AppSurface.CardContent} data={data} limit={1} />
70
74
  </Card.Body>
71
75
  </Card.Root>
72
76
  </Menu.Root>
@@ -0,0 +1,112 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
6
+
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { LayoutOperation } from '@dxos/app-toolkit';
9
+ import { Entity, Obj } from '@dxos/echo';
10
+ import { log } from '@dxos/log';
11
+ import { type Space, isSpace } from '@dxos/react-client/echo';
12
+ import { Input, useTranslation } from '@dxos/react-ui';
13
+
14
+ import { meta } from '#meta';
15
+
16
+ export type RenameSubject = Space | Entity.Unknown;
17
+
18
+ const getName = (subject: RenameSubject): string =>
19
+ (isSpace(subject) ? subject.properties.name : Entity.getLabel(subject)) ?? '';
20
+
21
+ const setName = (subject: RenameSubject, name: string): void => {
22
+ if (isSpace(subject)) {
23
+ Obj.update(subject.properties, (properties) => {
24
+ properties.name = name;
25
+ });
26
+ } else {
27
+ Entity.update(subject, () => Entity.setLabel(subject, name));
28
+ }
29
+ };
30
+
31
+ export type RenamePopoverProps = { subject: RenameSubject };
32
+
33
+ /**
34
+ * Inline rename popover anchored to a navtree row. Commits on Enter or when dismissed; Escape cancels.
35
+ */
36
+ export const RenamePopover = ({ subject }: RenamePopoverProps) => {
37
+ const { t } = useTranslation(meta.profile.key);
38
+ const space = isSpace(subject);
39
+ const { invokePromise } = useOperationInvoker();
40
+ const [name, setNameState] = useState(() => getName(subject));
41
+
42
+ // Commit the latest value when the popover is dismissed (Enter, click-outside, or blur), unless cancelled.
43
+ const nameRef = useRef(name);
44
+ nameRef.current = name;
45
+ const initialNameRef = useRef(name);
46
+ const cancelledRef = useRef(false);
47
+ // Enter commits then closes, which unmounts and runs the dismissal cleanup; guard against a duplicate write.
48
+ const committedRef = useRef(false);
49
+
50
+ const write = useCallback(() => {
51
+ try {
52
+ if (!cancelledRef.current && nameRef.current !== initialNameRef.current) {
53
+ setName(subject, nameRef.current);
54
+ }
55
+ } catch (err) {
56
+ log.error('Failed to rename', { err });
57
+ }
58
+ }, [subject]);
59
+
60
+ const commit = useCallback(() => {
61
+ if (!committedRef.current) {
62
+ committedRef.current = true;
63
+ write();
64
+ }
65
+ }, [write]);
66
+
67
+ // Commit the latest value on dismissal (click-outside/blur) when the component unmounts, unless Enter
68
+ // already committed or Escape cancelled. This must not set committedRef: under StrictMode the mount-time
69
+ // setup/cleanup/setup cycle runs this cleanup before any interaction, and flipping the guard there would
70
+ // suppress the real Enter commit.
71
+ useEffect(
72
+ () => () => {
73
+ if (!committedRef.current) {
74
+ write();
75
+ }
76
+ },
77
+ [write],
78
+ );
79
+
80
+ const close = useCallback(() => {
81
+ void invokePromise(LayoutOperation.UpdatePopover, { anchorId: '', state: false });
82
+ }, [invokePromise]);
83
+
84
+ return (
85
+ <div className='p-2'>
86
+ <Input.Root>
87
+ <Input.Label srOnly>{t(space ? 'space-name.label' : 'object-name.label')}</Input.Label>
88
+ <Input.TextInput
89
+ autoFocus
90
+ value={name}
91
+ placeholder={t(space ? 'unnamed-space.label' : 'object.placeholder')}
92
+ data-testid='spacePlugin.rename.input'
93
+ onChange={({ target: { value } }) => setNameState(value)}
94
+ onFocus={(event) => event.target.select()}
95
+ onKeyDown={(event) => {
96
+ if (event.key === 'Enter') {
97
+ commit();
98
+ close();
99
+ } else if (event.key === 'Escape') {
100
+ // Own the dismissal so it does not also bubble to the deck popover's escape handler,
101
+ // whose divergent teardown leaves stale state that makes the next open flicker.
102
+ event.preventDefault();
103
+ event.stopPropagation();
104
+ cancelledRef.current = true;
105
+ close();
106
+ }
107
+ }}
108
+ />
109
+ </Input.Root>
110
+ </div>
111
+ );
112
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { RenamePopover as default } from './RenamePopover';
6
+ export type { RenamePopoverProps, RenameSubject } from './RenamePopover';
@@ -14,7 +14,7 @@ import { mx } from '@dxos/ui-theme';
14
14
  import { meta } from '#meta';
15
15
 
16
16
  export const SchemaContainer = ({ space }: AppSurface.SpaceArticleProps) => {
17
- const { t } = useTranslation(meta.id);
17
+ const { t } = useTranslation(meta.profile.key);
18
18
  const types = useQuerySpaceTypes(space);
19
19
 
20
20
  return (
@@ -0,0 +1,100 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback } from 'react';
6
+
7
+ import { Surface } from '@dxos/app-framework/ui';
8
+ import { type AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';
9
+ import { useActionRunner } from '@dxos/plugin-graph';
10
+ import { Column, Panel, ScrollArea } from '@dxos/react-ui';
11
+ import {
12
+ type ActionExecutor,
13
+ type ActionGraphProps,
14
+ Menu,
15
+ MenuBuilder,
16
+ graphActions,
17
+ useMenuBuilder,
18
+ } from '@dxos/react-ui-menu';
19
+
20
+ import { meta } from '#meta';
21
+ import { SpaceHomeContent, SpaceHomePinBottom } from '#types';
22
+
23
+ export type SpaceHomeArticleProps = AppSurface.SpaceArticleProps;
24
+
25
+ /**
26
+ * Per-space Home article shell. Owns only the chrome: a toolbar sourced from graph actions
27
+ * contributed with `disposition: 'toolbar'` (e.g. Start tour / Hide Welcome from plugin-support),
28
+ * and a Column layout that delegates its body to surface contributors:
29
+ *
30
+ * - `space-home-content`: scrollable region (Welcome panel, recent-objects masonry, starter prompts).
31
+ * - `space-home-pin-bottom`: pinned region (assistant prompt), capped at one contributor.
32
+ *
33
+ * The Space is read from `data.subject` (the Home node carries the Space as its data).
34
+ */
35
+ export const SpaceHomeArticle = ({ role, attendableId, space }: SpaceHomeArticleProps) => {
36
+ const { actions, onAction } = useMenuActions(attendableId);
37
+
38
+ return (
39
+ <Panel.Root role={role}>
40
+ <Menu.Root {...actions} attendableId={attendableId} onAction={onAction}>
41
+ <Panel.Toolbar asChild>
42
+ <Menu.Toolbar />
43
+ </Panel.Toolbar>
44
+ </Menu.Root>
45
+ <Panel.Content asChild>
46
+ <Column.Root style={{ gridTemplateRows: 'minmax(0,1fr) auto' }}>
47
+ <ScrollArea.Root orientation='vertical' centered padding>
48
+ <ScrollArea.Viewport>
49
+ <div className='dx-document flex flex-col gap-4 py-4'>
50
+ <Surface.Surface type={SpaceHomeContent} data={{ space }} />
51
+ </div>
52
+ </ScrollArea.Viewport>
53
+ </ScrollArea.Root>
54
+ <Column.Center classNames='dx-document pb-4'>
55
+ <Surface.Surface type={SpaceHomePinBottom} data={{ space }} limit={1} />
56
+ </Column.Center>
57
+ </Column.Root>
58
+ </Panel.Content>
59
+ </Panel.Root>
60
+ );
61
+ };
62
+
63
+ //
64
+ // Hooks
65
+ //
66
+
67
+ /**
68
+ * Builds the toolbar from contributed graph actions for the Home node. Actions opt into the
69
+ * toolbar via `disposition: 'toolbar'`; the Home shell contributes none itself, so the toolbar
70
+ * is empty unless another plugin (e.g. plugin-support's tour/welcome actions) contributes.
71
+ */
72
+ const useMenuActions = (
73
+ attendableId?: string,
74
+ ): { actions: ReturnType<typeof useMenuBuilder>; onAction: ActionExecutor } => {
75
+ const { graph } = useAppGraph();
76
+ const runAction = useActionRunner();
77
+
78
+ const menuActions = useMenuBuilder(
79
+ (get): ActionGraphProps => {
80
+ if (!attendableId) {
81
+ return MenuBuilder.make().build();
82
+ }
83
+ return MenuBuilder.make()
84
+ .subgraph(
85
+ graphActions(graph, get, attendableId, { filter: (action) => action.properties.disposition === 'toolbar' }),
86
+ )
87
+ .build();
88
+ },
89
+ [graph, attendableId],
90
+ );
91
+
92
+ const onAction: ActionExecutor = useCallback(
93
+ (action) => {
94
+ void runAction(action, { caller: meta.profile.key });
95
+ },
96
+ [runAction],
97
+ );
98
+
99
+ return { actions: menuActions, onAction };
100
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { SpaceHomeArticle as default } from './SpaceHomeArticle';
@@ -0,0 +1,101 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Option from 'effect/Option';
6
+ import React, { useCallback, useMemo } from 'react';
7
+
8
+ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
9
+ import { AppCapabilities, LayoutOperation, Paths } from '@dxos/app-toolkit';
10
+ import { Collection, Filter, Obj, Order, Query, Type } from '@dxos/echo';
11
+ import { HiddenAnnotation, getTypeAnnotation } from '@dxos/echo/Annotation';
12
+ import { Kind as EntityKind } from '@dxos/echo/Entity';
13
+ import { type Space, useQuery } from '@dxos/react-client/echo';
14
+ import { Card, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
15
+ import { Masonry } from '@dxos/react-ui-masonry';
16
+ import { getStyles } from '@dxos/ui-theme';
17
+
18
+ import { meta } from '#meta';
19
+
20
+ /** Number of recently-modified objects to surface as cards. */
21
+ const RECENT_LIMIT = 10;
22
+
23
+ type SpaceScopedProps = {
24
+ space?: Space;
25
+ };
26
+
27
+ /**
28
+ * Recent-objects region for the Home article. Queries the most-recently-modified objects of
29
+ * registered, non-hidden, non-relation, non-collection types and renders them as a Masonry of
30
+ * tiles. Renders nothing (no heading) when the space has no recent objects — the starter-prompt
31
+ * contributor (plugin-assistant) fills the empty state instead.
32
+ */
33
+ export const SpaceHomeRecent = ({ space }: SpaceScopedProps) => {
34
+ const { t } = useTranslation(meta.profile.key);
35
+
36
+ const schemas = useCapabilities(AppCapabilities.Schema);
37
+ const filter = useMemo(() => {
38
+ const collectionTypename = Type.getTypename(Collection.Collection);
39
+ const types = schemas
40
+ .flat()
41
+ .filter(Type.isType)
42
+ .filter((type) => getTypeAnnotation(Type.getSchema(type))?.kind !== EntityKind.Relation)
43
+ .filter((type) => !HiddenAnnotation.get(Type.getSchema(type)).pipe(Option.getOrElse(() => false)))
44
+ .filter((type) => Type.getTypename(type) !== collectionTypename);
45
+ return types.length > 0 ? Filter.or(...types.map((type) => Filter.type(type))) : undefined;
46
+ }, [schemas]);
47
+
48
+ const query = useMemo(
49
+ () =>
50
+ Query.select(filter ?? Filter.everything())
51
+ .orderBy(Order.updated('desc'))
52
+ .limit(RECENT_LIMIT),
53
+ [filter],
54
+ );
55
+ const recent = useQuery(filter && space ? space.db : undefined, query);
56
+
57
+ if (recent.length === 0) {
58
+ return null;
59
+ }
60
+
61
+ return (
62
+ <>
63
+ <h2 className='text-sm font-medium text-description'>{t('space-home.recent.heading')}</h2>
64
+ <Masonry.Root Tile={RecentObjectTile}>
65
+ <Masonry.Content padding={false}>
66
+ <Masonry.Viewport classNames='py-2' items={recent} getId={(object) => object.id} />
67
+ </Masonry.Content>
68
+ </Masonry.Root>
69
+ </>
70
+ );
71
+ };
72
+
73
+ const RecentObjectTile = ({ data }: { data: Obj.Unknown; index: number }) => {
74
+ const { invokePromise } = useOperationInvoker();
75
+ const { t } = useTranslation(meta.profile.key);
76
+ const typename = Obj.getTypename(data);
77
+ const label = toLocalizedString(
78
+ Obj.getLabel(data) ?? (typename ? ['object-name.placeholder', { ns: typename, defaultValue: 'New item' }] : ''),
79
+ t,
80
+ );
81
+ const iconAnnotation = Obj.getIcon(data);
82
+ const icon = iconAnnotation?.icon ?? 'ph--circle-dashed--regular';
83
+ const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : undefined;
84
+
85
+ const handleClick = useCallback(() => {
86
+ void invokePromise(LayoutOperation.Open, { subject: [Paths.getObjectPathFromObject(data)] });
87
+ }, [invokePromise, data]);
88
+
89
+ return (
90
+ <Card.Root role='button' classNames='cursor-pointer' onClick={handleClick}>
91
+ <Card.Header>
92
+ <Card.Block>
93
+ <Icon icon={icon} classNames={iconStyles?.text} />
94
+ </Card.Block>
95
+ <Card.Title>{label}</Card.Title>
96
+ </Card.Header>
97
+ </Card.Root>
98
+ );
99
+ };
100
+
101
+ RecentObjectTile.displayName = 'RecentObjectTile';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { SpaceHomeRecent as default } from './SpaceHomeRecent';
@@ -246,7 +246,7 @@ export type SmallPresenceProps = {
246
246
  } & Pick<AttentionGlyphProps, 'attended' | 'containsAttended'>;
247
247
 
248
248
  export const SmallPresence = ({ count = 0, attended, containsAttended }: SmallPresenceProps) => {
249
- const { t } = useTranslation(meta.id);
249
+ const { t } = useTranslation(meta.profile.key);
250
250
 
251
251
  return (
252
252
  <Tooltip.Trigger asChild content={t('presence.label', { count })} side='bottom'>
@@ -6,7 +6,7 @@ import * as Schema from 'effect/Schema';
6
6
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
7
 
8
8
  import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
9
- import { getPersonalSpace, getSpacePath, isPersonalSpace, LayoutOperation } from '@dxos/app-toolkit';
9
+ import { AppSpace, Paths, LayoutOperation } from '@dxos/app-toolkit';
10
10
  import { AppSurface } from '@dxos/app-toolkit/ui';
11
11
  import { Obj } from '@dxos/echo';
12
12
  import { log } from '@dxos/log';
@@ -25,7 +25,7 @@ const SpaceFormSchema = SpaceForm;
25
25
 
26
26
  // TODO(wittjosiah): Handle space migrations here?
27
27
  export const SpaceSettingsContainer = ({ space }: AppSurface.SpaceArticleProps) => {
28
- const { t } = useTranslation(meta.id);
28
+ const { t } = useTranslation(meta.profile.key);
29
29
  const { invokePromise } = useOperationInvoker();
30
30
  const client = useClient();
31
31
  const [edgeReplication, setEdgeReplication] = useState(
@@ -78,7 +78,7 @@ export const SpaceSettingsContainer = ({ space }: AppSurface.SpaceArticleProps)
78
78
  [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication],
79
79
  );
80
80
 
81
- const personal = isPersonalSpace(space);
81
+ const personal = AppSpace.isPersonalSpace(space);
82
82
 
83
83
  const fieldMap = useMemo<FormFieldMap>(
84
84
  () => ({
@@ -146,7 +146,7 @@ export const SpaceSettingsContainer = ({ space }: AppSurface.SpaceArticleProps)
146
146
 
147
147
  const repairs = useCapabilities(SpaceCapabilities.Repair);
148
148
  const handleRepair = useCallback(async () => {
149
- await Promise.all(repairs.map((repair) => repair({ space, isDefault: isPersonalSpace(space) })));
149
+ await Promise.all(repairs.map((repair) => repair({ space, isDefault: AppSpace.isPersonalSpace(space) })));
150
150
  }, [space, repairs]);
151
151
 
152
152
  const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
@@ -155,9 +155,9 @@ export const SpaceSettingsContainer = ({ space }: AppSurface.SpaceArticleProps)
155
155
  try {
156
156
  await invokePromise(SpaceOperation.Delete, { space });
157
157
  setDeleteConfirmOpen(false);
158
- const personalSpace = getPersonalSpace(client);
158
+ const personalSpace = AppSpace.getPersonalSpace(client);
159
159
  if (personalSpace) {
160
- void invokePromise(LayoutOperation.SwitchWorkspace, { subject: getSpacePath(personalSpace.id) });
160
+ void invokePromise(LayoutOperation.SwitchWorkspace, { subject: Paths.getSpacePath(personalSpace.id) });
161
161
  }
162
162
  } catch (err) {
163
163
  log.catch(err, { stage: 'delete: invocation rejected', spaceId: space.id });
@@ -174,7 +174,7 @@ export const SpaceSettingsContainer = ({ space }: AppSurface.SpaceArticleProps)
174
174
  <Settings.Viewport>
175
175
  <Settings.Section
176
176
  title={t('space-properties-settings-verbose.label')}
177
- description={t('space-properties-settings.description', { ns: meta.id })}
177
+ description={t('space-properties-settings.description', { ns: meta.profile.key })}
178
178
  >
179
179
  <Form.Root
180
180
  key={space.id}
@@ -30,7 +30,7 @@ export const SyncStatus = () => {
30
30
  };
31
31
 
32
32
  export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: boolean }) => {
33
- const { t } = useTranslation(meta.id);
33
+ const { t } = useTranslation(meta.profile.key);
34
34
  const summary = getSyncSummary(state);
35
35
  const offline = Object.values(state).length === 0;
36
36
  const needsToUpload = summary.differentDocuments > 0 || summary.missingOnRemote > 0;
@@ -79,7 +79,7 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
79
79
  };
80
80
 
81
81
  const EdgeConnectionPopover = () => {
82
- const { t } = useTranslation(meta.id);
82
+ const { t } = useTranslation(meta.profile.key);
83
83
  const client = useClient();
84
84
  const { status } = useStream(
85
85
  () => client.services.services.EdgeAgentService!.queryEdgeStatus(),
@@ -17,13 +17,14 @@ export const MembersContainer: ComponentType<any> = lazy(() => import('./Members
17
17
  export const MenuFooter: ComponentType<any> = lazy(() => import('./MenuFooter'));
18
18
  export const ObjectCardStack: ComponentType<any> = lazy(() => import('./ObjectCardStack'));
19
19
  export const ObjectProperties: ComponentType<any> = lazy(() => import('./ObjectProperties'));
20
- export const EntityRenamePopover: ComponentType<any> = lazy(() => import('./EntityRenamePopover'));
21
20
  export const RecordArticle: ComponentType<any> = lazy(() => import('./RecordArticle'));
22
21
  export const RelatedArticle: ComponentType<any> = lazy(() => import('./RelatedArticle'));
22
+ export const RenamePopover: ComponentType<any> = lazy(() => import('./RenamePopover'));
23
23
  export const SchemaContainer: ComponentType<any> = lazy(() => import('./SchemaContainer'));
24
24
  export const SmallPresenceLive: ComponentType<any> = lazy(() => import('./SmallPresenceLive'));
25
25
  export const SpacePresence: ComponentType<any> = lazy(() => import('./SpacePresence'));
26
- export const SpaceRenamePopover: ComponentType<any> = lazy(() => import('./SpaceRenamePopover'));
26
+ export const SpaceHomeArticle: ComponentType<any> = lazy(() => import('./SpaceHomeArticle'));
27
+ export const SpaceHomeRecent: ComponentType<any> = lazy(() => import('./SpaceHomeRecent'));
27
28
  export const SpaceSettingsContainer: ComponentType<any> = lazy(() => import('./SpaceSettingsContainer'));
28
29
  export const SyncStatus: ComponentType<any> = lazy(() => import('./SyncStatus'));
29
30
  export const ViewEditor: ComponentType<any> = lazy(() => import('./ViewEditor'));
@@ -5,6 +5,7 @@
5
5
  import React, { useCallback } from 'react';
6
6
 
7
7
  import { Surface, usePluginManager } from '@dxos/app-framework/ui';
8
+ import { AppSurface } from '@dxos/app-toolkit/ui';
8
9
  import { type FormFieldProvider } from '@dxos/react-ui-form';
9
10
 
10
11
  /**
@@ -25,8 +26,8 @@ export const useInputSurfaceLookup = (baseData?: Record<string, any>): FormField
25
26
  ...baseData,
26
27
  };
27
28
  const { type: _fieldPropertyAstExcluded, ...surfaceFieldProps } = fieldProps as Record<string, any>;
28
- if (Surface.isAvailable(pluginManager.capabilities, { role: 'form-input', data })) {
29
- return <Surface.Surface role='form-input' data={data} {...surfaceFieldProps} />;
29
+ if (Surface.isAvailable(pluginManager.capabilities, { type: AppSurface.FormInput, data })) {
30
+ return <Surface.Surface type={AppSurface.FormInput} data={data} {...surfaceFieldProps} />;
30
31
  }
31
32
  },
32
33
  [pluginManager, baseData],
@@ -2,9 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import * as Option from 'effect/Option';
5
6
  import { useMemo } from 'react';
6
7
 
7
- import { type Database, Entity, Filter, Obj, Ref, Relation } from '@dxos/echo';
8
+ import { type Database, Entity, Filter, Obj, Ref, Relation, Type } from '@dxos/echo';
9
+ import { HiddenAnnotation } from '@dxos/echo/Annotation';
8
10
  import { useQuery } from '@dxos/react-client/echo';
9
11
  import { isNonNullable } from '@dxos/util';
10
12
 
@@ -74,6 +76,16 @@ export const useRelatedObjects = (
74
76
  // TODO(burdon): Configure.
75
77
  .filter((obj) => Entity.getTypename(obj) !== 'org.dxos.type.text')
76
78
  .filter((obj) => Entity.getTypename(obj) !== 'org.dxos.type.assistant.chat')
79
+ .filter((obj) => {
80
+ if (!Obj.isObject(obj)) {
81
+ return true;
82
+ }
83
+ const typeEntity = Obj.getType(obj);
84
+ if (!typeEntity) {
85
+ return true;
86
+ }
87
+ return !HiddenAnnotation.get(Type.getSchema(typeEntity)).pipe(Option.getOrElse(() => false));
88
+ })
77
89
  );
78
90
  }, [subject, objects, options.references, options.relations]);
79
91
  };