@dxos/plugin-space 0.8.4-main.3f58842 → 0.8.4-main.548089c

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 (363) hide show
  1. package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-ABGFK4VO.mjs} +10 -10
  2. package/dist/lib/browser/CollectionArticle-ABGFK4VO.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-G4BCSFFA.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-G4BCSFFA.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-builder-7CZZJS3S.mjs → app-graph-builder-FFPJHWFB.mjs} +124 -75
  10. package/dist/lib/browser/app-graph-builder-FFPJHWFB.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-QMWE2YE4.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-QMWE2YE4.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-XUYKJUU7.mjs → chunk-I4W2BHA2.mjs} +122 -61
  14. package/dist/lib/browser/chunk-I4W2BHA2.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-K5J7ZB5P.mjs +20 -0
  16. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-K6TOP4E6.mjs +167 -0
  18. package/dist/lib/browser/chunk-K6TOP4E6.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-SGTQ52SU.mjs → chunk-M2Z6D4ZI.mjs} +32 -21
  20. package/dist/lib/browser/chunk-M2Z6D4ZI.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-V7MJSSBQ.mjs → chunk-MHXNG2X2.mjs} +587 -513
  22. package/dist/lib/browser/chunk-MHXNG2X2.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-OLBBSOVI.mjs} +30 -17
  24. package/dist/lib/browser/chunk-OLBBSOVI.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  26. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  28. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-NAXTPQXE.mjs} +6 -6
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +88 -88
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-TIXVDYN7.mjs → intent-resolver-WLFWCHDH.mjs} +87 -85
  34. package/dist/lib/browser/intent-resolver-WLFWCHDH.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-BPPTUFLV.mjs +30 -0
  37. package/dist/lib/browser/react-root-BPPTUFLV.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-TPNLWJJH.mjs → react-surface-3KTOA5PM.mjs} +81 -104
  39. package/dist/lib/browser/react-surface-3KTOA5PM.mjs.map +7 -0
  40. package/dist/lib/browser/{schema-defs-Z6FC4AHC.mjs → schema-defs-XCNOO2WT.mjs} +5 -5
  41. package/dist/lib/browser/schema-defs-XCNOO2WT.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-4IMP5RYT.mjs → settings-WKLGKUHQ.mjs} +5 -5
  43. package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-WKLGKUHQ.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-XVW7I5MQ.mjs} +21 -18
  45. package/dist/lib/browser/spaces-ready-XVW7I5MQ.mjs.map +7 -0
  46. package/dist/lib/browser/{state-QYZAB45H.mjs → state-Q7YRE5KG.mjs} +7 -7
  47. package/dist/lib/browser/state-Q7YRE5KG.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +2 -2
  49. package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-G3V4QXPI.mjs} +10 -10
  50. package/dist/lib/node-esm/CollectionArticle-G3V4QXPI.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs.map +7 -0
  57. package/dist/lib/node-esm/{app-graph-builder-KGIGWC72.mjs → app-graph-builder-3BTVV7LE.mjs} +124 -75
  58. package/dist/lib/node-esm/app-graph-builder-3BTVV7LE.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-BU7KO2G5.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-BU7KO2G5.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-JH6F4C3I.mjs → chunk-2PN7QNGV.mjs} +32 -21
  62. package/dist/lib/node-esm/chunk-2PN7QNGV.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  64. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-FAWIRIP4.mjs +168 -0
  66. package/dist/lib/node-esm/chunk-FAWIRIP4.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  68. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-4AOMYKDE.mjs → chunk-HQMFTMJE.mjs} +122 -61
  70. package/dist/lib/node-esm/chunk-HQMFTMJE.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-6X5DLJM5.mjs → chunk-MI4A5XUX.mjs} +587 -513
  72. package/dist/lib/node-esm/chunk-MI4A5XUX.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-P442DOQ3.mjs → chunk-WC4VBFMA.mjs} +30 -17
  74. package/dist/lib/node-esm/chunk-WC4VBFMA.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs +21 -0
  76. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-OXLKCJE3.mjs} +6 -6
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +88 -88
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-MHGHRGDT.mjs → intent-resolver-QHH5SXLC.mjs} +87 -85
  82. package/dist/lib/node-esm/intent-resolver-QHH5SXLC.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-KW3TGJGY.mjs → react-root-QRONKFKI.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-QRONKFKI.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-UUIUUD6P.mjs → react-surface-OZBWNTW2.mjs} +81 -104
  87. package/dist/lib/node-esm/react-surface-OZBWNTW2.mjs.map +7 -0
  88. package/dist/lib/node-esm/{schema-defs-WHJM7UZE.mjs → schema-defs-5TDB7T5J.mjs} +5 -5
  89. package/dist/lib/node-esm/schema-defs-5TDB7T5J.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-SAOBPND3.mjs → settings-RBB5633M.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-RBB5633M.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-J6RWPI2X.mjs} +21 -18
  93. package/dist/lib/node-esm/spaces-ready-J6RWPI2X.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-ZVEHQ4BJ.mjs → state-362I5BMK.mjs} +7 -7
  95. package/dist/lib/node-esm/state-362I5BMK.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +2 -2
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  102. package/dist/types/src/capabilities/capabilities.d.ts +7 -6
  103. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  105. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/index.d.ts +11 -12
  107. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  111. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/schema-defs.d.ts +1 -1
  115. package/dist/types/src/capabilities/schema-defs.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/settings.d.ts +1 -1
  117. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  118. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/state.d.ts +1 -1
  120. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  121. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  122. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  123. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  124. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  125. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -3
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1694 -4
  129. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +7 -5
  131. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  132. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  133. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  134. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  135. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  136. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  137. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  138. package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +3 -2
  139. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1697 -0
  141. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts.map +1 -0
  142. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  143. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  144. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  145. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  146. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  147. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  148. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  149. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  150. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  151. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  152. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  153. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  154. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  155. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  156. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  157. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1530 -0
  158. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +1 -1
  160. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  161. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  163. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  164. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  165. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  166. package/dist/types/src/components/RecordArticle.stories.d.ts +1697 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  168. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  169. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  171. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  172. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  173. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1527 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  177. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  179. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  181. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1527 -4
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  184. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1528 -5
  186. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  187. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  188. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  189. package/dist/types/src/components/index.d.ts +10 -11
  190. package/dist/types/src/components/index.d.ts.map +1 -1
  191. package/dist/types/src/events.d.ts.map +1 -1
  192. package/dist/types/src/helpers/index.d.ts +2 -0
  193. package/dist/types/src/helpers/index.d.ts.map +1 -0
  194. package/dist/types/src/helpers/query.d.ts +8 -0
  195. package/dist/types/src/helpers/query.d.ts.map +1 -0
  196. package/dist/types/src/helpers/query.test.d.ts +2 -0
  197. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  198. package/dist/types/src/hooks/index.d.ts +1 -0
  199. package/dist/types/src/hooks/index.d.ts.map +1 -1
  200. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  202. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  203. package/dist/types/src/hooks/usePath.d.ts +1 -1
  204. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  206. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  207. package/dist/types/src/index.d.ts +1 -0
  208. package/dist/types/src/index.d.ts.map +1 -1
  209. package/dist/types/src/meta.d.ts +0 -1
  210. package/dist/types/src/meta.d.ts.map +1 -1
  211. package/dist/types/src/translations.d.ts +1326 -26
  212. package/dist/types/src/translations.d.ts.map +1 -1
  213. package/dist/types/src/types/types.d.ts +78 -96
  214. package/dist/types/src/types/types.d.ts.map +1 -1
  215. package/dist/types/src/util.d.ts +16 -11
  216. package/dist/types/src/util.d.ts.map +1 -1
  217. package/dist/types/tsconfig.tsbuildinfo +1 -1
  218. package/package.json +66 -59
  219. package/src/SpacePlugin.ts +230 -220
  220. package/src/capabilities/app-graph-builder.ts +201 -117
  221. package/src/capabilities/app-graph-serializer.ts +12 -12
  222. package/src/capabilities/capabilities.ts +19 -13
  223. package/src/capabilities/identity-created.ts +3 -3
  224. package/src/capabilities/index.ts +0 -1
  225. package/src/capabilities/intent-resolver.ts +81 -64
  226. package/src/capabilities/react-root.tsx +6 -4
  227. package/src/capabilities/react-surface.tsx +78 -140
  228. package/src/capabilities/schema-defs.ts +3 -2
  229. package/src/capabilities/spaces-ready.ts +16 -10
  230. package/src/capabilities/state.ts +5 -4
  231. package/src/components/AwaitingObject.tsx +12 -14
  232. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  233. package/src/components/CollectionSection.tsx +8 -6
  234. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  235. package/src/components/CreateDialog/CreateObjectDialog.tsx +51 -33
  236. package/src/components/CreateDialog/CreateObjectPanel.tsx +24 -13
  237. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  238. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  239. package/src/components/JoinDialog/index.ts +5 -0
  240. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  241. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
  242. package/src/components/MembersContainer/index.ts +5 -0
  243. package/src/components/MenuFooter.tsx +2 -2
  244. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  245. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  246. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  247. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
  248. package/src/components/ObjectRenamePopover/index.ts +5 -0
  249. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +4 -3
  250. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  251. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  252. package/src/components/ObjectSettings/ForeignKeys.tsx +4 -4
  253. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  254. package/src/components/ObjectSettings/index.ts +3 -1
  255. package/src/components/RecordArticle.stories.tsx +115 -0
  256. package/src/components/RecordArticle.tsx +114 -0
  257. package/src/components/SchemaContainer.tsx +25 -28
  258. package/src/components/SpacePluginSettings.tsx +16 -11
  259. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
  260. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
  261. package/src/components/SpacePresence/index.ts +5 -0
  262. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  263. package/src/components/SpaceRenamePopover/index.ts +5 -0
  264. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  265. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +49 -28
  266. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  267. package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
  268. package/src/components/SyncStatus/SyncStatus.tsx +109 -12
  269. package/src/components/ViewEditor.tsx +51 -23
  270. package/src/components/index.ts +7 -7
  271. package/src/events.ts +7 -7
  272. package/src/helpers/index.ts +5 -0
  273. package/src/helpers/query.test.ts +24 -0
  274. package/src/helpers/query.ts +158 -0
  275. package/src/hooks/index.ts +1 -0
  276. package/src/hooks/useActiveSpace.ts +3 -2
  277. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  278. package/src/hooks/usePath.ts +1 -1
  279. package/src/hooks/useTypeOptions.ts +59 -0
  280. package/src/index.ts +1 -0
  281. package/src/meta.ts +6 -3
  282. package/src/translations.ts +29 -14
  283. package/src/types/types.ts +31 -22
  284. package/src/util.tsx +131 -66
  285. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  286. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +0 -88
  287. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +0 -7
  288. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs.map +0 -7
  289. package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-CEFHNVU7.mjs +0 -20
  291. package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  293. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
  295. package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-V7MJSSBQ.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-VLBRSGJ2.mjs +0 -94
  300. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +0 -7
  302. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  303. package/dist/lib/browser/intent-resolver-TIXVDYN7.mjs.map +0 -7
  304. package/dist/lib/browser/react-root-N2J7TDRX.mjs +0 -29
  305. package/dist/lib/browser/react-root-N2J7TDRX.mjs.map +0 -7
  306. package/dist/lib/browser/react-surface-TPNLWJJH.mjs.map +0 -7
  307. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs.map +0 -7
  308. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  309. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  310. package/dist/lib/browser/spaces-ready-TOPG6IV4.mjs.map +0 -7
  311. package/dist/lib/browser/state-QYZAB45H.mjs.map +0 -7
  312. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  313. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +0 -89
  314. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +0 -7
  315. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs.map +0 -7
  316. package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
  318. package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
  319. package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
  320. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
  321. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +0 -7
  322. package/dist/lib/node-esm/chunk-6X5DLJM5.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  324. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs +0 -96
  328. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
  329. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  330. package/dist/lib/node-esm/intent-resolver-MHGHRGDT.mjs.map +0 -7
  331. package/dist/lib/node-esm/react-root-KW3TGJGY.mjs.map +0 -7
  332. package/dist/lib/node-esm/react-surface-UUIUUD6P.mjs.map +0 -7
  333. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs.map +0 -7
  334. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  335. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  336. package/dist/lib/node-esm/spaces-ready-HIUKNDZK.mjs.map +0 -7
  337. package/dist/lib/node-esm/state-ZVEHQ4BJ.mjs.map +0 -7
  338. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  339. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  340. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  341. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  342. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  343. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  344. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  345. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  346. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  347. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  348. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  349. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  350. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  351. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  352. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  353. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  354. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  355. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  356. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  357. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  358. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  359. package/src/capabilities/schema-tool.test.ts +0 -44
  360. package/src/capabilities/schema-tools.ts +0 -125
  361. package/src/components/MembersContainer.stories.tsx +0 -30
  362. package/src/components/ObjectDetailsPanel.tsx +0 -77
  363. package/src/components/PersistenceStatus.tsx +0 -83
@@ -2,80 +2,64 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema } from 'effect';
6
- import React, { useCallback, useMemo } from 'react';
5
+ import type * as Schema from 'effect/Schema';
6
+ import React, { useCallback } from 'react';
7
7
 
8
- import {
9
- Capabilities,
10
- contributes,
11
- createSurface,
12
- Surface,
13
- useCapabilities,
14
- useCapability,
15
- useLayout,
16
- } from '@dxos/app-framework';
17
- import { Obj, Type } from '@dxos/echo';
8
+ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
9
+ import { Surface, useCapability, useLayout } from '@dxos/app-framework/react';
10
+ import { Obj } from '@dxos/echo';
18
11
  import { findAnnotation } from '@dxos/effect';
19
12
  import { SettingsStore } from '@dxos/local-storage';
20
- import { ClientCapabilities } from '@dxos/plugin-client';
21
- import { useClient } from '@dxos/react-client';
22
- import {
23
- fullyQualifiedId,
24
- getSpace,
25
- isLiveObject,
26
- isSpace,
27
- parseId,
28
- SpaceState,
29
- useSpace,
30
- type Space,
31
- } from '@dxos/react-client/echo';
32
- import { Input, useTranslation } from '@dxos/react-ui';
13
+ import { type Space, SpaceState, getSpace, isLiveObject, isSpace, parseId, useSpace } from '@dxos/react-client/echo';
14
+ import { Input } from '@dxos/react-ui';
33
15
  import { type InputProps, SelectInput } from '@dxos/react-ui-form';
34
16
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
35
- import { DataType, type TypenameAnnotation, TypenameAnnotationId } from '@dxos/schema';
17
+ import { Collection, type TypenameAnnotation, TypenameAnnotationId, View } from '@dxos/schema';
36
18
  import { type JoinPanelProps } from '@dxos/shell/react';
37
19
 
38
- import { SpaceCapabilities } from './capabilities';
20
+ // TODO(burdon): Component name standard: NounVerbComponent.
39
21
  import {
40
- CollectionMain,
41
- CollectionSection,
42
22
  CREATE_OBJECT_DIALOG,
43
23
  CREATE_SPACE_DIALOG,
24
+ CollectionArticle,
25
+ CollectionSection,
44
26
  CreateObjectDialog,
27
+ type CreateObjectDialogProps,
45
28
  CreateSpaceDialog,
46
29
  InlineSyncStatus,
47
30
  JOIN_DIALOG,
48
31
  JoinDialog,
49
32
  MembersContainer,
50
33
  MenuFooter,
34
+ OBJECT_RENAME_POPOVER,
51
35
  ObjectDetailsPanel,
36
+ ObjectRenamePopover,
52
37
  ObjectSettingsContainer,
53
- POPOVER_RENAME_OBJECT,
54
- POPOVER_RENAME_SPACE,
55
- PopoverRenameObject,
56
- PopoverRenameSpace,
38
+ RecordArticle,
39
+ SPACE_RENAME_POPOVER,
57
40
  SchemaContainer,
58
41
  SmallPresenceLive,
59
42
  SpacePluginSettings,
60
43
  SpacePresence,
44
+ SpaceRenamePopover,
61
45
  SpaceSettingsContainer,
62
46
  SyncStatus,
63
47
  ViewEditor,
64
- type CreateObjectDialogProps,
65
48
  } from '../components';
66
- import { SPACE_PLUGIN } from '../meta';
49
+ import { useTypeOptions } from '../hooks';
50
+ import { meta } from '../meta';
67
51
  import { HueAnnotationId, IconAnnotationId, type SpaceSettingsProps } from '../types';
68
52
 
53
+ import { SpaceCapabilities } from './capabilities';
54
+
69
55
  type ReactSurfaceOptions = {
70
56
  createInvitationUrl: (invitationCode: string) => string;
71
57
  };
72
58
 
73
- const OMIT = [DataType.Collection.typename, DataType.QueryCollection.typename];
74
-
75
59
  export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
76
60
  contributes(Capabilities.ReactSurface, [
77
61
  createSurface({
78
- id: `${SPACE_PLUGIN}/article`,
62
+ id: `${meta.id}/article`,
79
63
  role: 'article',
80
64
  filter: (data): data is { subject: Space } =>
81
65
  // TODO(wittjosiah): Need to avoid shotgun parsing space state everywhere.
@@ -84,7 +68,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
84
68
  <Surface
85
69
  data={{
86
70
  id: data.subject.id,
87
- subject: data.subject.properties[DataType.Collection.typename]?.target,
71
+ subject: data.subject.properties[Collection.Collection.typename]?.target,
88
72
  }}
89
73
  role={role}
90
74
  {...rest}
@@ -92,29 +76,36 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
92
76
  ),
93
77
  }),
94
78
  createSurface({
95
- id: `${SPACE_PLUGIN}/collection-fallback`,
79
+ id: `${meta.id}/record-article`,
96
80
  role: 'article',
97
81
  position: 'fallback',
98
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
99
- component: ({ data }) => <CollectionMain collection={data.subject} />,
82
+ filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
83
+ component: ({ data }) => <RecordArticle object={data.subject} />,
100
84
  }),
101
85
  createSurface({
102
- id: `${SPACE_PLUGIN}/plugin-settings`,
86
+ id: `${meta.id}/collection-fallback`,
87
+ role: 'article',
88
+ position: 'fallback',
89
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
90
+ component: ({ data }) => <CollectionArticle object={data.subject} />,
91
+ }),
92
+ createSurface({
93
+ id: `${meta.id}/plugin-settings`,
103
94
  role: 'article',
104
95
  filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
105
- data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
96
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
106
97
  component: ({ data: { subject } }) => <SpacePluginSettings settings={subject.value} />,
107
98
  }),
108
99
  createSurface({
109
- id: `${SPACE_PLUGIN}/companion/object-settings`,
100
+ id: `${meta.id}/companion/object-settings`,
110
101
  role: 'article',
111
102
  filter: (data): data is { companionTo: Obj.Any } => Obj.isObject(data.companionTo) && data.subject === 'settings',
112
103
  component: ({ data, role }) => <ObjectSettingsContainer object={data.companionTo} role={role} />,
113
104
  }),
114
105
  createSurface({
115
- id: `${SPACE_PLUGIN}/space-settings-properties`,
106
+ id: `${meta.id}/space-settings-properties`,
116
107
  role: 'article',
117
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/properties`,
108
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/properties`,
118
109
  component: () => {
119
110
  const layout = useLayout();
120
111
  const { spaceId } = parseId(layout.workspace);
@@ -127,10 +118,10 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
127
118
  },
128
119
  }),
129
120
  createSurface({
130
- id: `${SPACE_PLUGIN}/space-settings-members`,
121
+ id: `${meta.id}/space-settings-members`,
131
122
  role: 'article',
132
123
  position: 'hoist',
133
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/members`,
124
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/members`,
134
125
  component: () => {
135
126
  const layout = useLayout();
136
127
  const { spaceId } = parseId(layout.workspace);
@@ -143,9 +134,9 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
143
134
  },
144
135
  }),
145
136
  createSurface({
146
- id: `${SPACE_PLUGIN}/space-settings-schema`,
137
+ id: `${meta.id}/space-settings-schema`,
147
138
  role: 'article',
148
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/schema`,
139
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/schema`,
149
140
  component: () => {
150
141
  const layout = useLayout();
151
142
  const { spaceId } = parseId(layout.workspace);
@@ -158,14 +149,14 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
158
149
  },
159
150
  }),
160
151
  createSurface({
161
- id: `${SPACE_PLUGIN}/selected-objects`,
152
+ id: `${meta.id}/selected-objects`,
162
153
  role: 'article',
163
- filter: (data): data is { companionTo: DataType.View; subject: 'selected-objects' } =>
164
- Obj.instanceOf(DataType.View, data.companionTo) && data.subject === 'selected-objects',
154
+ filter: (data): data is { companionTo: View.View; subject: 'selected-objects' } =>
155
+ Obj.instanceOf(View.View, data.companionTo) && data.subject === 'selected-objects',
165
156
  component: ({ data }) => (
166
157
  <ObjectDetailsPanel
167
- key={fullyQualifiedId(data.companionTo)}
168
- objectId={fullyQualifiedId(data.companionTo)}
158
+ key={Obj.getDXN(data.companionTo).toString()}
159
+ objectId={Obj.getDXN(data.companionTo).toString()}
169
160
  view={data.companionTo}
170
161
  />
171
162
  ),
@@ -189,49 +180,53 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
189
180
  component: ({ data }) => <CreateObjectDialog {...data.props} />,
190
181
  }),
191
182
  createSurface({
192
- id: `${SPACE_PLUGIN}/create-initial-space-form-[hue]`,
183
+ id: `${meta.id}/create-initial-space-form-[hue]`,
193
184
  role: 'form-input',
194
185
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
195
186
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, HueAnnotationId);
196
187
  return !!annotation;
197
188
  },
198
189
  component: ({ data: _, ...inputProps }) => {
199
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
190
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
200
191
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange]);
201
192
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
202
193
  return (
203
194
  <Input.Root>
204
195
  <Input.Label>{label}</Input.Label>
205
- <HuePicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
196
+ <HuePicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
206
197
  </Input.Root>
207
198
  );
208
199
  },
209
200
  }),
210
201
  createSurface({
211
- id: `${SPACE_PLUGIN}/create-initial-space-form-[icon]`,
202
+ id: `${meta.id}/create-initial-space-form-[icon]`,
212
203
  role: 'form-input',
213
204
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
214
205
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, IconAnnotationId);
215
206
  return !!annotation;
216
207
  },
217
208
  component: ({ data: _, ...inputProps }) => {
218
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
209
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
219
210
  const handleChange = useCallback((nextIcon: string) => onValueChange(type, nextIcon), [onValueChange]);
220
211
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
221
212
  return (
222
213
  <Input.Root>
223
214
  <Input.Label>{label}</Input.Label>
224
- <IconPicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
215
+ <IconPicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
225
216
  </Input.Root>
226
217
  );
227
218
  },
228
219
  }),
229
220
  createSurface({
230
- id: `${SPACE_PLUGIN}/typename-form-input`,
221
+ id: `${meta.id}/typename-form-input`,
231
222
  role: 'form-input',
232
223
  filter: (
233
224
  data,
234
- ): data is { prop: string; schema: Schema.Schema<any>; target: Space | DataType.Collection | undefined } => {
225
+ ): data is {
226
+ prop: string;
227
+ schema: Schema.Schema<any>;
228
+ target: Space | Collection.Collection | undefined;
229
+ } => {
235
230
  if (data.prop !== 'typename') {
236
231
  return false;
237
232
  }
@@ -240,98 +235,41 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
240
235
  return !!annotation;
241
236
  },
242
237
  component: ({ data: { schema, target }, ...inputProps }) => {
243
- const { t } = useTranslation();
244
- const client = useClient();
245
238
  const props = inputProps as any as InputProps;
246
239
  const space = isSpace(target) ? target : getSpace(target);
247
- if (!space) {
248
- return null;
249
- }
250
-
251
240
  const annotation = findAnnotation<TypenameAnnotation[]>(schema.ast, TypenameAnnotationId)!;
252
-
253
- const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
254
- const whitelistedTypenames = useMemo(
255
- () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => Type.getTypename(type)))),
256
- [schemaWhitelists],
257
- );
258
-
259
- const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
260
- const objectFormTypenames = useMemo(
261
- () =>
262
- new Set(
263
- objectForms
264
- .map((form) => Type.getTypename(form.objectSchema))
265
- // TODO(wittjosiah): Remove.
266
- .filter((typename) => !OMIT.includes(typename) && !typename.endsWith('View')),
267
- ),
268
- [objectForms],
269
- );
270
-
271
- const fixed = client.graph.schemaRegistry.schemas.filter((schema) => {
272
- const limitedStatic =
273
- annotation.includes('limited-static') && whitelistedTypenames.has(Type.getTypename(schema));
274
- const unusedStatic =
275
- annotation.includes('unused-static') &&
276
- whitelistedTypenames.has(Type.getTypename(schema)) &&
277
- !space.properties.staticRecords?.includes(Type.getTypename(schema));
278
- const objectForm = annotation.includes('object-form') && objectFormTypenames.has(Type.getTypename(schema));
279
- return annotation.includes('static') || limitedStatic || unusedStatic || objectForm;
280
- });
281
- const dynamic = space?.db.schemaRegistry.query().runSync();
282
- const typenames = Array.from(
283
- new Set<string>([
284
- ...(annotation.includes('limited-static') ||
285
- annotation.includes('unused-static') ||
286
- annotation.includes('static') ||
287
- annotation.includes('object-form')
288
- ? fixed.map((schema) => Type.getTypename(schema))
289
- : []),
290
- ...(annotation.includes('dynamic') ? dynamic.map((schema) => schema.typename) : []),
291
- ]),
292
- ).sort();
293
-
294
- const options = useMemo(
295
- () =>
296
- typenames
297
- .map((typename) => ({
298
- value: typename,
299
- label: t('typename label', { ns: typename, defaultValue: typename }),
300
- }))
301
- .toSorted((a, b) => a.label.localeCompare(b.label)),
302
- [t, typenames],
303
- );
241
+ const options = useTypeOptions({ space, annotation });
304
242
 
305
243
  return <SelectInput {...props} options={options} />;
306
244
  },
307
245
  }),
308
246
  createSurface({
309
- id: `${SPACE_PLUGIN}/object-settings`,
247
+ id: `${meta.id}/object-settings`,
310
248
  role: 'object-settings',
311
- filter: (data): data is { subject: DataType.View } => Obj.instanceOf(DataType.View, data.subject),
249
+ filter: (data): data is { subject: View.View } => Obj.instanceOf(View.View, data.subject),
312
250
  component: ({ data }) => <ViewEditor view={data.subject} />,
313
251
  }),
314
252
  createSurface({
315
- id: POPOVER_RENAME_SPACE,
253
+ id: SPACE_RENAME_POPOVER,
316
254
  role: 'card--popover',
317
- filter: (data): data is { props: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.props),
318
- component: ({ data }) => <PopoverRenameSpace space={data.props} />,
255
+ filter: (data): data is { props: Space } => data.component === SPACE_RENAME_POPOVER && isSpace(data.props),
256
+ component: ({ data }) => <SpaceRenamePopover space={data.props} />,
319
257
  }),
320
258
  createSurface({
321
- id: POPOVER_RENAME_OBJECT,
259
+ id: OBJECT_RENAME_POPOVER,
322
260
  role: 'card--popover',
323
261
  filter: (data): data is { props: Obj.Any } =>
324
- data.component === POPOVER_RENAME_OBJECT && isLiveObject(data.props),
325
- component: ({ data }) => <PopoverRenameObject object={data.props} />,
262
+ data.component === OBJECT_RENAME_POPOVER && isLiveObject(data.props),
263
+ component: ({ data }) => <ObjectRenamePopover object={data.props} />,
326
264
  }),
327
265
  createSurface({
328
- id: `${SPACE_PLUGIN}/menu-footer`,
266
+ id: `${meta.id}/menu-footer`,
329
267
  role: 'menu-footer',
330
268
  filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
331
269
  component: ({ data }) => <MenuFooter object={data.subject} />,
332
270
  }),
333
271
  createSurface({
334
- id: `${SPACE_PLUGIN}/navtree-presence`,
272
+ id: `${meta.id}/navtree-presence`,
335
273
  role: 'navtree-item-end',
336
274
  filter: (data): data is { id: string; subject: Obj.Any; open?: boolean } =>
337
275
  typeof data.id === 'string' && Obj.isObject(data.subject),
@@ -343,7 +281,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
343
281
  }),
344
282
  // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
345
283
  createSurface({
346
- id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
284
+ id: `${meta.id}/navtree-presence-fallback`,
347
285
  role: 'navtree-item-end',
348
286
  position: 'fallback',
349
287
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
@@ -351,13 +289,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
351
289
  }),
352
290
  // TODO(wittjosiah): Broken?
353
291
  createSurface({
354
- id: `${SPACE_PLUGIN}/navtree-sync-status`,
292
+ id: `${meta.id}/navtree-sync-status`,
355
293
  role: 'navtree-item-end',
356
294
  filter: (data): data is { subject: Space; open?: boolean } => isSpace(data.subject),
357
295
  component: ({ data }) => <InlineSyncStatus space={data.subject} open={data.open} />,
358
296
  }),
359
297
  createSurface({
360
- id: `${SPACE_PLUGIN}/navbar-presence`,
298
+ id: `${meta.id}/navbar-presence`,
361
299
  role: 'navbar-end',
362
300
  position: 'hoist',
363
301
  filter: (data): data is { subject: Space | Obj.Any } => isSpace(data.subject) || Obj.isObject(data.subject),
@@ -365,7 +303,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
365
303
  const space = isSpace(data.subject) ? data.subject : getSpace(data.subject);
366
304
  const object = isSpace(data.subject)
367
305
  ? data.subject.state.get() === SpaceState.SPACE_READY
368
- ? (space?.properties[DataType.Collection.typename]?.target as DataType.Collection)
306
+ ? (space?.properties[Collection.Collection.typename]?.target as Collection.Collection)
369
307
  : undefined
370
308
  : data.subject;
371
309
 
@@ -373,13 +311,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
373
311
  },
374
312
  }),
375
313
  createSurface({
376
- id: `${SPACE_PLUGIN}/collection-section`,
314
+ id: `${meta.id}/collection-section`,
377
315
  role: 'section',
378
- filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
379
- component: ({ data }) => <CollectionSection collection={data.subject} />,
316
+ filter: (data): data is { subject: Collection.Collection } => Obj.instanceOf(Collection.Collection, data.subject),
317
+ component: ({ data }) => <CollectionSection object={data.subject} />,
380
318
  }),
381
319
  createSurface({
382
- id: `${SPACE_PLUGIN}/status`,
320
+ id: `${meta.id}/status`,
383
321
  role: 'status',
384
322
  component: () => <SyncStatus />,
385
323
  }),
@@ -2,12 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
5
+ import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
6
6
  import { ClientCapabilities } from '@dxos/plugin-client';
7
7
 
8
- import { SpaceCapabilities } from './capabilities';
9
8
  import { type ObjectForm } from '../types';
10
9
 
10
+ import { SpaceCapabilities } from './capabilities';
11
+
11
12
  export default (context: PluginContext) => {
12
13
  const registry = context.getCapability(Capabilities.RxRegistry);
13
14
  const client = context.getCapability(ClientCapabilities.Client);
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
5
+ import * as Option from 'effect/Option';
6
6
 
7
- import { contributes, createIntent, Capabilities, LayoutAction, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, LayoutAction, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
8
8
  import { SubscriptionList } from '@dxos/async';
9
9
  import { Filter, Obj, Type } from '@dxos/echo';
10
10
  import { scheduledEffect } from '@dxos/echo-signals/core';
@@ -14,16 +14,20 @@ import { ClientCapabilities } from '@dxos/plugin-client';
14
14
  import { DeckCapabilities } from '@dxos/plugin-deck';
15
15
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
16
16
  import { PublicKey } from '@dxos/react-client';
17
- import { FQ_ID_LENGTH, parseFullyQualifiedId, SpaceState } from '@dxos/react-client/echo';
17
+ import { SpaceState, parseId } from '@dxos/react-client/echo';
18
18
  import { ComplexMap, reduceGroupBy } from '@dxos/util';
19
19
 
20
- import { SpaceCapabilities } from './capabilities';
21
20
  import { SpaceAction } from '../types';
22
21
  import { COMPOSER_SPACE_LOCK, SHARED } from '../util';
23
22
 
23
+ import { SpaceCapabilities } from './capabilities';
24
+
24
25
  const ACTIVE_NODE_BROADCAST_INTERVAL = 30_000;
25
26
  const WAIT_FOR_OBJECT_TIMEOUT = 5_000;
26
27
 
28
+ // E.g., dxn:echo:BA25QRC2FEWCSAMRP4RZL65LWJ7352CKE:01J00J9B45YHYSGZQTQMSKMGJ6
29
+ const ECHO_DXN_LENGTH = 3 + 1 + 4 + 1 + 33 + 1 + 26;
30
+
27
31
  export default async (context: PluginContext) => {
28
32
  const subscriptions = new SubscriptionList();
29
33
  const spaceSubscriptions = new SubscriptionList();
@@ -66,12 +70,14 @@ export default async (context: PluginContext) => {
66
70
  return;
67
71
  }
68
72
 
69
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
70
- if (!node && active[0].length === FQ_ID_LENGTH) {
73
+ const id = active[0];
74
+ const node = graph.getNode(id).pipe(Option.getOrNull);
75
+ if (!node && id.length === ECHO_DXN_LENGTH) {
76
+ void graph.initialize(id);
71
77
  const timeout = setTimeout(async () => {
72
- const node = graph.getNode(active[0]).pipe(Option.getOrNull);
78
+ const node = graph.getNode(id).pipe(Option.getOrNull);
73
79
  if (!node) {
74
- await dispatch(createIntent(SpaceAction.WaitForObject, { id: active[0] }));
80
+ await dispatch(createIntent(SpaceAction.WaitForObject, { id }));
75
81
  }
76
82
  }, WAIT_FOR_OBJECT_TIMEOUT);
77
83
 
@@ -114,7 +120,7 @@ export default async (context: PluginContext) => {
114
120
  // Group parts by space for efficient messaging.
115
121
  const idsBySpace = reduceGroupBy(active, (id) => {
116
122
  try {
117
- const [spaceId] = parseFullyQualifiedId(id);
123
+ const { spaceId } = parseId(id);
118
124
  return spaceId;
119
125
  } catch {
120
126
  return null;
@@ -123,7 +129,7 @@ export default async (context: PluginContext) => {
123
129
 
124
130
  const removedBySpace = reduceGroupBy(inactive, (id) => {
125
131
  try {
126
- const [spaceId] = parseFullyQualifiedId(id);
132
+ const { spaceId } = parseId(id);
127
133
  return spaceId;
128
134
  } catch {
129
135
  return null;
@@ -4,17 +4,18 @@
4
4
 
5
5
  import { effect } from '@preact/signals-core';
6
6
 
7
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
7
+ import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { LocalStorageStore } from '@dxos/local-storage';
10
10
  import { ComplexMap } from '@dxos/util';
11
11
 
12
- import { SpaceCapabilities } from './capabilities';
13
- import { SPACE_PLUGIN } from '../meta';
12
+ import { meta } from '../meta';
14
13
  import { type PluginState } from '../types';
15
14
 
15
+ import { SpaceCapabilities } from './capabilities';
16
+
16
17
  export default (context: PluginContext) => {
17
- const state = new LocalStorageStore<PluginState>(SPACE_PLUGIN, {
18
+ const state = new LocalStorageStore<PluginState>(meta.id, {
18
19
  awaiting: undefined,
19
20
  spaceNames: {},
20
21
  viewersByObject: {},
@@ -4,23 +4,25 @@
4
4
 
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher, useLayout } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher, useLayout } from '@dxos/app-framework/react';
9
+ import { Obj } from '@dxos/echo';
8
10
  import { useClient } from '@dxos/react-client';
9
- import { Filter, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';
11
+ import { Filter, useQuery } from '@dxos/react-client/echo';
10
12
  import { Button, Icon, Toast, useTranslation } from '@dxos/react-ui';
11
13
 
12
- import { SPACE_PLUGIN } from '../meta';
14
+ import { meta } from '../meta';
13
15
  import { SpaceAction } from '../types';
14
16
 
15
- const WAIT_FOR_OBJECT_TIMEOUT = 180e3; // 3 minutes
16
- const TOAST_TIMEOUT = 240e3; // 4 minutes
17
+ const WAIT_FOR_OBJECT_TIMEOUT = 3 * 60 * 1_000;
18
+ const TOAST_TIMEOUT = 4 * 60 * 1_000;
17
19
 
18
20
  export const AwaitingObject = ({ id }: { id: string }) => {
21
+ const { t } = useTranslation(meta.id);
22
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
19
23
  const [open, setOpen] = useState(true);
20
24
  const [waiting, setWaiting] = useState(true);
21
25
  const [found, setFound] = useState(false);
22
- const { t } = useTranslation(SPACE_PLUGIN);
23
- const { dispatchPromise: dispatch } = useIntentDispatcher();
24
26
  const layout = useLayout();
25
27
 
26
28
  const client = useClient();
@@ -31,17 +33,13 @@ export const AwaitingObject = ({ id }: { id: string }) => {
31
33
  return;
32
34
  }
33
35
 
34
- const timeout = setTimeout(() => {
35
- setWaiting(false);
36
- }, WAIT_FOR_OBJECT_TIMEOUT);
37
-
38
- () => clearTimeout(timeout);
36
+ const timeout = setTimeout(() => setWaiting(false), WAIT_FOR_OBJECT_TIMEOUT);
37
+ return () => clearTimeout(timeout);
39
38
  }, [id]);
40
39
 
41
40
  useEffect(() => {
42
- if (objects.findIndex((object) => fullyQualifiedId(object) === id) > -1) {
41
+ if (objects.findIndex((object) => Obj.getDXN(object).toString() === id) > -1) {
43
42
  setFound(true);
44
-
45
43
  if (layout.active.includes(id)) {
46
44
  setOpen(false);
47
45
  }
@@ -4,14 +4,15 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
7
8
  import { useTranslation } from '@dxos/react-ui';
8
9
  import { baseSurface, descriptionMessage, mx } from '@dxos/react-ui-theme';
9
- import { type DataType } from '@dxos/schema';
10
+ import { type Collection } from '@dxos/schema';
10
11
 
11
- import { SPACE_PLUGIN } from '../meta';
12
+ import { meta } from '../meta';
12
13
 
13
- export const CollectionMain = ({ collection }: { collection: DataType.Collection }) => {
14
- const { t } = useTranslation(SPACE_PLUGIN);
14
+ export const CollectionArticle = ({ object }: SurfaceComponentProps<Collection.Collection>) => {
15
+ const { t } = useTranslation(meta.id);
15
16
 
16
17
  return (
17
18
  <div
@@ -23,10 +24,10 @@ export const CollectionMain = ({ collection }: { collection: DataType.Collection
23
24
  role='alert'
24
25
  className={mx(descriptionMessage, 'rounded-md p-8 font-normal text-lg max-is-[24rem] break-words')}
25
26
  >
26
- {collection.name ?? t('unnamed collection label')}
27
+ {object.name ?? t('unnamed collection label')}
27
28
  </p>
28
29
  </div>
29
30
  );
30
31
  };
31
32
 
32
- export default CollectionMain;
33
+ export default CollectionArticle;
@@ -4,17 +4,19 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
7
8
  import { useTranslation } from '@dxos/react-ui';
8
- import { type DataType } from '@dxos/schema';
9
+ import { type Collection } from '@dxos/schema';
9
10
 
10
- import { SPACE_PLUGIN } from '../meta';
11
+ import { meta } from '../meta';
12
+
13
+ export const CollectionSection = ({ role, object }: SurfaceComponentProps<Collection.Collection>) => {
14
+ const { t } = useTranslation(meta.id);
11
15
 
12
- export const CollectionSection = ({ collection }: { collection: DataType.Collection }) => {
13
- const { t } = useTranslation(SPACE_PLUGIN);
14
16
  // TODO(wittjosiah): Better placeholder.
15
17
  return (
16
- <div className='min-bs-[3.5rem] grid grid-rows-subgrid grid-cols-subgrid items-center'>
17
- <span className='truncate'>{collection.name ?? t('unnamed collection label')}</span>
18
+ <div role={role} className='min-bs-[3.5rem] grid grid-rows-subgrid grid-cols-subgrid items-center'>
19
+ <span className='truncate'>{object.name ?? t('unnamed collection label')}</span>
18
20
  </div>
19
21
  );
20
22
  };