@dxos/plugin-space 0.8.4-main.406dc2a → 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 (293) hide show
  1. package/dist/lib/browser/{CollectionMain-AX7KKXWP.mjs → CollectionArticle-ABGFK4VO.mjs} +8 -8
  2. package/dist/lib/browser/CollectionArticle-ABGFK4VO.mjs.map +7 -0
  3. package/dist/lib/browser/{ObjectDetailsPanel-MQBHG666.mjs → ObjectDetailsPanel-2BRUBHP6.mjs} +16 -20
  4. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs.map +7 -0
  5. package/dist/lib/browser/{ObjectSettings-KNUZFCGS.mjs → ObjectSettings-5LLWCVEK.mjs} +33 -40
  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-3R5GGT46.mjs → app-graph-builder-FFPJHWFB.mjs} +53 -45
  10. package/dist/lib/browser/app-graph-builder-FFPJHWFB.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-25Z5BG22.mjs → app-graph-serializer-QMWE2YE4.mjs} +10 -10
  12. package/dist/lib/browser/app-graph-serializer-QMWE2YE4.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-OV6D543A.mjs → chunk-I4W2BHA2.mjs} +36 -30
  14. package/dist/lib/browser/chunk-I4W2BHA2.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-RLI2IAHK.mjs → chunk-K5J7ZB5P.mjs} +2 -2
  16. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-7XOTWRZ3.mjs → chunk-K6TOP4E6.mjs} +19 -18
  18. package/dist/lib/browser/chunk-K6TOP4E6.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-WS2PJDES.mjs → chunk-M2Z6D4ZI.mjs} +12 -11
  20. package/dist/lib/browser/chunk-M2Z6D4ZI.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-522KZGQF.mjs → chunk-MHXNG2X2.mjs} +487 -381
  22. package/dist/lib/browser/chunk-MHXNG2X2.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-PTGRQQ6J.mjs → chunk-OLBBSOVI.mjs} +23 -13
  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-EIXZABXD.mjs → chunk-WJXU4GKV.mjs} +2 -2
  28. package/dist/lib/browser/{identity-created-PW2BA46S.mjs → identity-created-NAXTPQXE.mjs} +3 -3
  29. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  30. package/dist/lib/browser/index.mjs +63 -46
  31. package/dist/lib/browser/index.mjs.map +3 -3
  32. package/dist/lib/browser/{intent-resolver-ICGUSVH6.mjs → intent-resolver-WLFWCHDH.mjs} +53 -58
  33. package/dist/lib/browser/intent-resolver-WLFWCHDH.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/{react-root-H56QN474.mjs → react-root-BPPTUFLV.mjs} +9 -8
  36. package/dist/lib/browser/react-root-BPPTUFLV.mjs.map +7 -0
  37. package/dist/lib/browser/{react-surface-VOE2ILKO.mjs → react-surface-3KTOA5PM.mjs} +37 -40
  38. package/dist/lib/browser/react-surface-3KTOA5PM.mjs.map +7 -0
  39. package/dist/lib/browser/{schema-defs-7R7RKCAE.mjs → schema-defs-XCNOO2WT.mjs} +3 -3
  40. package/dist/lib/browser/{settings-OBFJ67ZG.mjs → settings-WKLGKUHQ.mjs} +3 -3
  41. package/dist/lib/browser/{spaces-ready-MFIVK6I6.mjs → spaces-ready-XVW7I5MQ.mjs} +12 -11
  42. package/dist/lib/browser/spaces-ready-XVW7I5MQ.mjs.map +7 -0
  43. package/dist/lib/browser/{state-LSPRFIRO.mjs → state-Q7YRE5KG.mjs} +3 -3
  44. package/dist/lib/browser/types/index.mjs +2 -2
  45. package/dist/lib/node-esm/{CollectionMain-EU57SRYK.mjs → CollectionArticle-G3V4QXPI.mjs} +8 -8
  46. package/dist/lib/node-esm/CollectionArticle-G3V4QXPI.mjs.map +7 -0
  47. package/dist/lib/node-esm/{ObjectDetailsPanel-NABA2S56.mjs → ObjectDetailsPanel-6PZQIQG3.mjs} +16 -20
  48. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs.map +7 -0
  49. package/dist/lib/node-esm/{ObjectSettings-GXGTITF5.mjs → ObjectSettings-OQSBOH7K.mjs} +33 -40
  50. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs.map +7 -0
  51. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs +117 -0
  52. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs.map +7 -0
  53. package/dist/lib/node-esm/{app-graph-builder-VGRMD5TP.mjs → app-graph-builder-3BTVV7LE.mjs} +53 -45
  54. package/dist/lib/node-esm/app-graph-builder-3BTVV7LE.mjs.map +7 -0
  55. package/dist/lib/node-esm/{app-graph-serializer-U4GHXWRG.mjs → app-graph-serializer-BU7KO2G5.mjs} +10 -10
  56. package/dist/lib/node-esm/app-graph-serializer-BU7KO2G5.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-4F25JKVT.mjs → chunk-2PN7QNGV.mjs} +12 -11
  58. package/dist/lib/node-esm/chunk-2PN7QNGV.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  60. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-PAAWJ4RE.mjs → chunk-FAWIRIP4.mjs} +19 -18
  62. package/dist/lib/node-esm/chunk-FAWIRIP4.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-SVFKU7EW.mjs → chunk-H4JILUJK.mjs} +2 -2
  64. package/dist/lib/node-esm/{chunk-TNUWML33.mjs → chunk-HQMFTMJE.mjs} +36 -30
  65. package/dist/lib/node-esm/chunk-HQMFTMJE.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-DG5YEEPZ.mjs → chunk-MI4A5XUX.mjs} +487 -381
  67. package/dist/lib/node-esm/chunk-MI4A5XUX.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-HAKW2RFD.mjs → chunk-WC4VBFMA.mjs} +23 -13
  69. package/dist/lib/node-esm/chunk-WC4VBFMA.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-H5UPFRRH.mjs → chunk-Z7BB6HC2.mjs} +2 -2
  71. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs.map +7 -0
  72. package/dist/lib/node-esm/{identity-created-MWTLGQRU.mjs → identity-created-OXLKCJE3.mjs} +3 -3
  73. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  74. package/dist/lib/node-esm/index.mjs +63 -46
  75. package/dist/lib/node-esm/index.mjs.map +3 -3
  76. package/dist/lib/node-esm/{intent-resolver-KVB2A4YC.mjs → intent-resolver-QHH5SXLC.mjs} +53 -58
  77. package/dist/lib/node-esm/intent-resolver-QHH5SXLC.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-root-56PGW5PH.mjs → react-root-QRONKFKI.mjs} +9 -8
  80. package/dist/lib/node-esm/react-root-QRONKFKI.mjs.map +7 -0
  81. package/dist/lib/node-esm/{react-surface-NYEQ23A4.mjs → react-surface-OZBWNTW2.mjs} +37 -40
  82. package/dist/lib/node-esm/react-surface-OZBWNTW2.mjs.map +7 -0
  83. package/dist/lib/node-esm/{schema-defs-RYG5DSUE.mjs → schema-defs-5TDB7T5J.mjs} +3 -3
  84. package/dist/lib/node-esm/{settings-QGWWNMMZ.mjs → settings-RBB5633M.mjs} +3 -3
  85. package/dist/lib/node-esm/{spaces-ready-TC27M7MP.mjs → spaces-ready-J6RWPI2X.mjs} +12 -11
  86. package/dist/lib/node-esm/spaces-ready-J6RWPI2X.mjs.map +7 -0
  87. package/dist/lib/node-esm/{state-TCGOPLRO.mjs → state-362I5BMK.mjs} +3 -3
  88. package/dist/lib/node-esm/types/index.mjs +2 -2
  89. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  92. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  97. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  98. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  99. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  100. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  101. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  102. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  103. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +91 -1
  104. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +2 -2
  106. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  107. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  108. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  109. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  110. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  111. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  112. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1697 -0
  113. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → MembersContainer/MembersContainer.stories.d.ts.map} +1 -1
  114. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  115. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  116. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +2 -2
  117. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -1
  118. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -1
  119. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  120. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  121. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  122. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  123. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +1 -1
  124. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  125. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +91 -1
  126. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  128. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  129. package/dist/types/src/components/{MembersContainer.stories.d.ts → RecordArticle.stories.d.ts} +92 -2
  130. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  131. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  132. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  133. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  134. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  135. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  136. package/dist/types/src/components/{SpacePresence.stories.d.ts → SpacePresence/SpacePresence.stories.d.ts} +91 -1
  137. package/dist/types/src/components/{SpacePresence.stories.d.ts.map → SpacePresence/SpacePresence.stories.d.ts.map} +1 -1
  138. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  139. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  140. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  141. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  142. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  143. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  144. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +91 -1
  146. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  148. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +92 -2
  149. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  151. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  152. package/dist/types/src/components/index.d.ts +9 -16
  153. package/dist/types/src/components/index.d.ts.map +1 -1
  154. package/dist/types/src/helpers/index.d.ts +2 -0
  155. package/dist/types/src/helpers/index.d.ts.map +1 -0
  156. package/dist/types/src/helpers/query.d.ts +8 -0
  157. package/dist/types/src/helpers/query.d.ts.map +1 -0
  158. package/dist/types/src/helpers/query.test.d.ts +2 -0
  159. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  160. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  161. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  162. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +1 -0
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/meta.d.ts.map +1 -1
  166. package/dist/types/src/translations.d.ts +91 -1
  167. package/dist/types/src/translations.d.ts.map +1 -1
  168. package/dist/types/src/types/types.d.ts +2 -2
  169. package/dist/types/src/types/types.d.ts.map +1 -1
  170. package/dist/types/src/util.d.ts +6 -4
  171. package/dist/types/src/util.d.ts.map +1 -1
  172. package/dist/types/tsconfig.tsbuildinfo +1 -1
  173. package/package.json +53 -51
  174. package/src/SpacePlugin.ts +49 -25
  175. package/src/capabilities/app-graph-builder.ts +86 -60
  176. package/src/capabilities/app-graph-serializer.ts +5 -5
  177. package/src/capabilities/capabilities.ts +2 -2
  178. package/src/capabilities/identity-created.ts +2 -2
  179. package/src/capabilities/intent-resolver.ts +46 -41
  180. package/src/capabilities/react-root.tsx +2 -1
  181. package/src/capabilities/react-surface.tsx +35 -40
  182. package/src/capabilities/spaces-ready.ts +7 -4
  183. package/src/components/AwaitingObject.tsx +11 -13
  184. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +5 -4
  185. package/src/components/CollectionSection.tsx +6 -4
  186. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +6 -6
  187. package/src/components/CreateDialog/CreateObjectDialog.tsx +29 -22
  188. package/src/components/CreateDialog/CreateObjectPanel.tsx +2 -2
  189. package/src/components/CreateDialog/CreateSpaceDialog.tsx +25 -7
  190. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +21 -5
  191. package/src/components/JoinDialog/index.ts +5 -0
  192. package/src/components/{MembersContainer.stories.tsx → MembersContainer/MembersContainer.stories.tsx} +1 -1
  193. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +11 -9
  194. package/src/components/MembersContainer/index.ts +5 -0
  195. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +2 -3
  196. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +9 -12
  197. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +5 -5
  198. package/src/components/ObjectRenamePopover/index.ts +5 -0
  199. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +6 -6
  200. package/src/components/ObjectSettings/BaseObjectSettings.tsx +34 -40
  201. package/src/components/ObjectSettings/ForeignKeys.tsx +1 -1
  202. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +1 -1
  203. package/src/components/RecordArticle.stories.tsx +115 -0
  204. package/src/components/RecordArticle.tsx +114 -0
  205. package/src/components/SchemaContainer.tsx +21 -24
  206. package/src/components/SpacePluginSettings.tsx +8 -2
  207. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +1 -1
  208. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +14 -9
  209. package/src/components/SpacePresence/index.ts +5 -0
  210. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +6 -5
  211. package/src/components/SpaceRenamePopover/index.ts +5 -0
  212. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +33 -13
  213. package/src/components/SyncStatus/InlineSyncStatus.tsx +1 -1
  214. package/src/components/SyncStatus/SyncStatus.stories.tsx +3 -2
  215. package/src/components/SyncStatus/SyncStatus.tsx +45 -36
  216. package/src/components/ViewEditor.tsx +51 -17
  217. package/src/components/index.ts +6 -7
  218. package/src/helpers/index.ts +5 -0
  219. package/src/helpers/query.test.ts +24 -0
  220. package/src/helpers/query.ts +158 -0
  221. package/src/hooks/useActiveSpace.ts +2 -1
  222. package/src/hooks/useInputSurfaceLookup.tsx +7 -2
  223. package/src/hooks/useTypeOptions.ts +3 -3
  224. package/src/index.ts +1 -0
  225. package/src/meta.ts +5 -0
  226. package/src/translations.ts +22 -10
  227. package/src/types/types.ts +11 -10
  228. package/src/util.tsx +44 -36
  229. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs.map +0 -7
  230. package/dist/lib/browser/ObjectDetailsPanel-MQBHG666.mjs.map +0 -7
  231. package/dist/lib/browser/ObjectSettings-KNUZFCGS.mjs.map +0 -7
  232. package/dist/lib/browser/RecordMain-H4DVHICS.mjs +0 -116
  233. package/dist/lib/browser/RecordMain-H4DVHICS.mjs.map +0 -7
  234. package/dist/lib/browser/app-graph-builder-3R5GGT46.mjs.map +0 -7
  235. package/dist/lib/browser/app-graph-serializer-25Z5BG22.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-522KZGQF.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-7XOTWRZ3.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-IRKDREHY.mjs +0 -11
  239. package/dist/lib/browser/chunk-IRKDREHY.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-OV6D543A.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-PTGRQQ6J.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-RLI2IAHK.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-WS2PJDES.mjs.map +0 -7
  244. package/dist/lib/browser/identity-created-PW2BA46S.mjs.map +0 -7
  245. package/dist/lib/browser/intent-resolver-ICGUSVH6.mjs.map +0 -7
  246. package/dist/lib/browser/react-root-H56QN474.mjs.map +0 -7
  247. package/dist/lib/browser/react-surface-VOE2ILKO.mjs.map +0 -7
  248. package/dist/lib/browser/spaces-ready-MFIVK6I6.mjs.map +0 -7
  249. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs.map +0 -7
  250. package/dist/lib/node-esm/ObjectDetailsPanel-NABA2S56.mjs.map +0 -7
  251. package/dist/lib/node-esm/ObjectSettings-GXGTITF5.mjs.map +0 -7
  252. package/dist/lib/node-esm/RecordMain-MYFTAQ2U.mjs +0 -117
  253. package/dist/lib/node-esm/RecordMain-MYFTAQ2U.mjs.map +0 -7
  254. package/dist/lib/node-esm/app-graph-builder-VGRMD5TP.mjs.map +0 -7
  255. package/dist/lib/node-esm/app-graph-serializer-U4GHXWRG.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-4F25JKVT.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-DG5YEEPZ.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-H5UPFRRH.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-HAKW2RFD.mjs.map +0 -7
  260. package/dist/lib/node-esm/chunk-MWNATOXL.mjs +0 -13
  261. package/dist/lib/node-esm/chunk-MWNATOXL.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-PAAWJ4RE.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-TNUWML33.mjs.map +0 -7
  264. package/dist/lib/node-esm/identity-created-MWTLGQRU.mjs.map +0 -7
  265. package/dist/lib/node-esm/intent-resolver-KVB2A4YC.mjs.map +0 -7
  266. package/dist/lib/node-esm/react-root-56PGW5PH.mjs.map +0 -7
  267. package/dist/lib/node-esm/react-surface-NYEQ23A4.mjs.map +0 -7
  268. package/dist/lib/node-esm/spaces-ready-TC27M7MP.mjs.map +0 -7
  269. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  270. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  271. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  272. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  273. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  274. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  275. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  276. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  277. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  278. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  279. package/dist/types/src/components/RecordMain.d.ts +0 -7
  280. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  281. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  282. package/src/components/PersistenceStatus.tsx +0 -83
  283. package/src/components/RecordMain.tsx +0 -87
  284. /package/dist/lib/browser/{chunk-EIXZABXD.mjs.map → chunk-WJXU4GKV.mjs.map} +0 -0
  285. /package/dist/lib/browser/{schema-defs-7R7RKCAE.mjs.map → schema-defs-XCNOO2WT.mjs.map} +0 -0
  286. /package/dist/lib/browser/{settings-OBFJ67ZG.mjs.map → settings-WKLGKUHQ.mjs.map} +0 -0
  287. /package/dist/lib/browser/{state-LSPRFIRO.mjs.map → state-Q7YRE5KG.mjs.map} +0 -0
  288. /package/dist/lib/node-esm/{chunk-SVFKU7EW.mjs.map → chunk-H4JILUJK.mjs.map} +0 -0
  289. /package/dist/lib/node-esm/{schema-defs-RYG5DSUE.mjs.map → schema-defs-5TDB7T5J.mjs.map} +0 -0
  290. /package/dist/lib/node-esm/{settings-QGWWNMMZ.mjs.map → settings-RBB5633M.mjs.map} +0 -0
  291. /package/dist/lib/node-esm/{state-TCGOPLRO.mjs.map → state-362I5BMK.mjs.map} +0 -0
  292. /package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +0 -0
  293. /package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +0 -0
@@ -4,7 +4,8 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { useClient } from '@dxos/react-client';
9
10
  import { useSpaces } from '@dxos/react-client/echo';
10
11
  import { IconButton, Input, List, ListItem, toLocalizedString, useTranslation } from '@dxos/react-ui';
@@ -36,7 +37,12 @@ export const SpacePluginSettings = ({ settings }: { settings: SpaceSettingsProps
36
37
  <ListItem.Root key={space.id} classNames='is-full items-center'>
37
38
  {/* TODO(burdon): Should auto center and truncate; NOTE truncate doesn't work with flex grow. */}
38
39
  <ListItem.Heading classNames='grow truncate !min-bs-0'>
39
- {toLocalizedString(getSpaceDisplayName(space, { personal: space === client.spaces.default }), t)}
40
+ {toLocalizedString(
41
+ getSpaceDisplayName(space, {
42
+ personal: space === client.spaces.default,
43
+ }),
44
+ t,
45
+ )}
40
46
  </ListItem.Heading>
41
47
  <IconButton
42
48
  icon='ph--faders--regular'
@@ -9,7 +9,7 @@ import { IdentityDid, PublicKey } from '@dxos/keys';
9
9
  import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
10
10
  import { withTheme } from '@dxos/react-ui/testing';
11
11
 
12
- import { translations } from '../translations';
12
+ import { translations } from '../../translations';
13
13
 
14
14
  import { FullPresence, type Member, type MemberPresenceProps, SmallPresence } from './SpacePresence';
15
15
 
@@ -5,11 +5,11 @@
5
5
  import * as Option from 'effect/Option';
6
6
  import React, { forwardRef, useCallback, useEffect, useState } from 'react';
7
7
 
8
- import { useAppGraph, useCapability } from '@dxos/app-framework';
8
+ import { useAppGraph, useCapability } from '@dxos/app-framework/react';
9
9
  import { generateName } from '@dxos/display-name';
10
- import { type Type } from '@dxos/echo';
10
+ import { Obj, type Type } from '@dxos/echo';
11
11
  import { PublicKey, useClient } from '@dxos/react-client';
12
- import { type SpaceMember, fullyQualifiedId, getSpace, useMembers } from '@dxos/react-client/echo';
12
+ import { type SpaceMember, getSpace, useMembers } from '@dxos/react-client/echo';
13
13
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
14
14
  import {
15
15
  Avatar,
@@ -27,10 +27,10 @@ import {
27
27
  import { AttentionGlyph, type AttentionGlyphProps, useAttended, useAttention } from '@dxos/react-ui-attention';
28
28
  import { ComplexMap, keyToFallback } from '@dxos/util';
29
29
 
30
- import { SpaceCapabilities } from '../capabilities';
31
- import { usePath } from '../hooks';
32
- import { meta } from '../meta';
33
- import type { ObjectViewerProps } from '../types';
30
+ import { SpaceCapabilities } from '../../capabilities';
31
+ import { usePath } from '../../hooks';
32
+ import { meta } from '../../meta';
33
+ import { type ObjectViewerProps } from '../../types';
34
34
 
35
35
  // TODO(thure): Get/derive these values from protocol
36
36
  const REFRESH_INTERVAL = 5000;
@@ -42,7 +42,12 @@ const noViewers = new ComplexMap<PublicKey, ObjectViewerProps>(PublicKey.hash);
42
42
  // TODO(wittjosiah): Factor out?
43
43
  const getName = (identity: Identity) => identity.profile?.displayName ?? generateName(identity.identityKey.toHex());
44
44
 
45
- export const SpacePresence = ({ object, spaceKey }: { object: Type.Expando; spaceKey?: PublicKey }) => {
45
+ export type SpacePresenceProps = {
46
+ object: Type.Expando;
47
+ spaceKey?: PublicKey;
48
+ };
49
+
50
+ export const SpacePresence = ({ object, spaceKey }: SpacePresenceProps) => {
46
51
  // TODO(wittjosiah): Doesn't need to be mutable but readonly type messes with ComplexMap.
47
52
  const spaceState = useCapability(SpaceCapabilities.MutableState);
48
53
  const client = useClient();
@@ -70,7 +75,7 @@ export const SpacePresence = ({ object, spaceKey }: { object: Type.Expando; spac
70
75
  return null;
71
76
  }
72
77
 
73
- const currentObjectViewers = spaceState.viewersByObject[fullyQualifiedId(object)] ?? noViewers;
78
+ const currentObjectViewers = spaceState.viewersByObject[Obj.getDXN(object).toString()] ?? noViewers;
74
79
 
75
80
  const membersForObject = spaceMembers
76
81
  .filter((member) => memberOnline(member) && memberIsNotSelf(member))
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './SpacePresence';
@@ -4,15 +4,16 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
- import { type Space } from '@dxos/react-client/echo';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
9
+ import { type Space } from '@dxos/client/echo';
9
10
  import { Button, Input, Popover, useTranslation } from '@dxos/react-ui';
10
11
 
11
- import { meta } from '../meta';
12
+ import { meta } from '../../meta';
12
13
 
13
- export const POPOVER_RENAME_SPACE = `${meta.id}/PopoverRenameSpace`;
14
+ export const SPACE_RENAME_POPOVER = `${meta.id}/SpaceRenamePopover`;
14
15
 
15
- export const PopoverRenameSpace = ({ space }: { space: Space }) => {
16
+ export const SpaceRenamePopover = ({ space }: { space: Space }) => {
16
17
  const { t } = useTranslation(meta.id);
17
18
  const doneButton = useRef<HTMLButtonElement>(null);
18
19
  const [name, setName] = useState(space.properties.name ?? '');
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './SpaceRenamePopover';
@@ -6,12 +6,13 @@ import * as Function from 'effect/Function';
6
6
  import * as Schema from 'effect/Schema';
7
7
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
8
8
 
9
- import { LayoutAction, chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
+ import { LayoutAction, chain, createIntent } from '@dxos/app-framework';
10
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
10
11
  import { log } from '@dxos/log';
11
12
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
12
13
  import { useClient } from '@dxos/react-client';
13
14
  import { type Space, SpaceState } from '@dxos/react-client/echo';
14
- import { Button, Input, useMulticastObservable, useTranslation } from '@dxos/react-ui';
15
+ import { Button, Input, useFileDownload, useMulticastObservable, useTranslation } from '@dxos/react-ui';
15
16
  import {
16
17
  ControlItem,
17
18
  ControlItemInput,
@@ -27,7 +28,11 @@ import { meta } from '../../meta';
27
28
  import { SpaceAction, SpaceForm } from '../../types';
28
29
 
29
30
  const FormSchema = SpaceForm.pipe(
30
- Schema.extend(Schema.Struct({ archived: Schema.Boolean.annotations({ title: 'Archive space' }) })),
31
+ Schema.extend(
32
+ Schema.Struct({
33
+ archived: Schema.Boolean.annotations({ title: 'Archive Space' }),
34
+ }),
35
+ ),
31
36
  );
32
37
 
33
38
  export type SpaceSettingsContainerProps = {
@@ -72,7 +77,10 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
72
77
  void dispatch(
73
78
  Function.pipe(
74
79
  createIntent(SpaceAction.Close, { space }),
75
- chain(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: client.spaces.default.id }),
80
+ chain(LayoutAction.SwitchWorkspace, {
81
+ part: 'workspace',
82
+ subject: client.spaces.default.id,
83
+ }),
76
84
  ),
77
85
  );
78
86
  } else if (!properties.archived && archived) {
@@ -121,7 +129,6 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
121
129
  onChange={handleChange}
122
130
  onReset={handleReset}
123
131
  classNames='justify-self-end'
124
- iconSize={5}
125
132
  />
126
133
  </ControlItem>
127
134
  );
@@ -131,12 +138,7 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
131
138
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
132
139
  return (
133
140
  <ControlItem title={label} description={t('hue description')}>
134
- <HuePicker
135
- value={getValue()}
136
- onChange={handleChange}
137
- onReset={handleReset}
138
- classNames='[--hue-preview-size:1.25rem] justify-self-end'
139
- />
141
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleReset} classNames='justify-self-end' />
140
142
  </ControlItem>
141
143
  );
142
144
  },
@@ -152,7 +154,11 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
152
154
  const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
153
155
  return (
154
156
  <ControlItemInput title={label} description={t('archive space description')}>
155
- <Button disabled={space === client.spaces.default} onClick={handleChange}>
157
+ <Button
158
+ disabled={space === client.spaces.default}
159
+ variant={getValue() ? 'default' : 'destructive'}
160
+ onClick={handleChange}
161
+ >
156
162
  {getValue() ? t('unarchive space label') : t('archive space label')}
157
163
  </Button>
158
164
  </ControlItemInput>
@@ -162,12 +168,20 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
162
168
  [t, space],
163
169
  );
164
170
 
171
+ const download = useFileDownload();
172
+ const handleBackup = useCallback(async () => {
173
+ const archive = await space.internal.export();
174
+ download(new Blob([archive.contents as Uint8Array<ArrayBuffer>]), archive.filename);
175
+ }, [space, download]);
176
+
165
177
  return (
166
178
  <StackItem.Content scrollable>
167
179
  <ControlPage>
168
180
  <ControlSection
169
181
  title={t('space properties settings verbose label', { ns: meta.id })}
170
- description={t('space properties settings description', { ns: meta.id })}
182
+ description={t('space properties settings description', {
183
+ ns: meta.id,
184
+ })}
171
185
  >
172
186
  <Form
173
187
  schema={FormSchema}
@@ -179,6 +193,12 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
179
193
  classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'
180
194
  />
181
195
  </ControlSection>
196
+ <ControlItemInput
197
+ title={t('backup space label', { ns: meta.id })}
198
+ description={t('backup space description', { ns: meta.id })}
199
+ >
200
+ <Button onClick={handleBackup}>{t('download backup')}</Button>
201
+ </ControlItemInput>
182
202
  </ControlPage>
183
203
  </StackItem.Content>
184
204
  );
@@ -5,7 +5,7 @@
5
5
  import * as Option from 'effect/Option';
6
6
  import React, { useEffect, useState } from 'react';
7
7
 
8
- import { useAppGraph } from '@dxos/app-framework';
8
+ import { useAppGraph } from '@dxos/app-framework/react';
9
9
  import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
10
10
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
11
  import { useClient } from '@dxos/react-client';
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
+ import { withClientProvider } from '@dxos/react-client/testing';
7
8
  import { withTheme } from '@dxos/react-ui/testing';
8
9
 
9
10
  import { translations } from '../../translations';
@@ -13,10 +14,10 @@ import { SyncStatusIndicator } from './SyncStatus';
13
14
  const meta = {
14
15
  title: 'plugins/plugin-space/SyncStatusIndicator',
15
16
  component: SyncStatusIndicator,
16
- decorators: [withTheme],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
17
18
  parameters: {
18
- translations,
19
19
  layout: 'centered',
20
+ translations,
20
21
  },
21
22
  } satisfies Meta<typeof SyncStatusIndicator>;
22
23
 
@@ -6,12 +6,13 @@ import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { StatusBar } from '@dxos/plugin-status-bar';
8
8
  import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
9
- import type { QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { type QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
10
10
  import { useClient } from '@dxos/react-client';
11
11
  import { useStream } from '@dxos/react-client/devtools';
12
12
  import { type SpaceSyncStateMap, getSyncSummary, useSyncState } from '@dxos/react-client/echo';
13
13
  import { Icon, Popover, useTranslation } from '@dxos/react-ui';
14
- import { Unit } from '@dxos/util';
14
+ import { mx } from '@dxos/react-ui-theme';
15
+ import { Unit, type UnitFormat } from '@dxos/util';
15
16
 
16
17
  import { meta } from '../../meta';
17
18
 
@@ -24,12 +25,7 @@ export const SyncStatus = () => {
24
25
  const client = useClient();
25
26
  const state = useSyncState();
26
27
  const [saved, setSaved] = useState(true);
27
-
28
- useEffect(() => {
29
- return createClientSaveTracker(client, (state) => {
30
- setSaved(state === 'saved');
31
- });
32
- }, []);
28
+ useEffect(() => createClientSaveTracker(client, (state) => setSaved(state === 'saved')), []);
33
29
 
34
30
  return <SyncStatusIndicator state={state} saved={saved} />;
35
31
  };
@@ -57,7 +53,7 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
57
53
  }, [offline, needsToUpload, needsToDownload]);
58
54
 
59
55
  const title = t(`${status} label`);
60
- const icon = <Icon icon={getIcon(status)} size={4} classNames={classNames} />;
56
+ const icon = <Icon icon={getIcon(status)} classNames={classNames} />;
61
57
 
62
58
  return (
63
59
  <Popover.Root>
@@ -90,57 +86,70 @@ const EdgeConnectionPopover = () => {
90
86
  const isConnected = status?.state === EdgeStatus.ConnectionState.CONNECTED;
91
87
 
92
88
  return (
93
- <div className='p-3 min-w-[240px]'>
89
+ <div className='min-is-[240px] p-2'>
94
90
  {/* Connection Status Header */}
95
- <div className='flex items-center gap-2 mb-3 pb-2 border-b border-neutral-100 dark:border-neutral-800'>
96
- <div className={`w-2 h-2 rounded-full ${isConnected ? 'bg-success-500 animate-pulse' : 'bg-error-500'}`} />
97
- <span className='font-medium text-sm text-neutral-900 dark:text-neutral-100'>
98
- {isConnected ? t('Edge connected') : t('Edge disconnected')}
91
+ <div className='flex items-center gap-2 mbe-2'>
92
+ <Icon
93
+ icon={isConnected ? 'ph--check-circle--regular' : 'ph--warning-circle--regular'}
94
+ classNames={mx(isConnected ? 'text-successText' : 'text-errorText animate-pulse')}
95
+ />
96
+ <span className='font-medium text-sm'>
97
+ {isConnected ? t('sync edge connected label') : t('sync edge disconnected label')}
99
98
  </span>
100
99
  </div>
101
100
 
102
101
  {/* Connection Details */}
103
102
  {status?.state === EdgeStatus.ConnectionState.NOT_CONNECTED && (
104
- <div className='flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400'>
105
- <Icon icon='ph--cloud-x--regular' size={4} />
106
- <span>{t('No connection to edge service')}</span>
103
+ <div className='flex items-center gap-2 text-sm text-description'>
104
+ <Icon icon='ph--cloud-x--regular' />
105
+ <span>{t('sync no connection label')}</span>
107
106
  </div>
108
107
  )}
109
108
 
110
109
  {status?.state === EdgeStatus.ConnectionState.CONNECTED && (
111
110
  <div className='space-y-2'>
112
111
  {/* Latency */}
113
- <div className='flex items-center justify-between'>
114
- <div className='flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400'>
115
- <Icon icon='ph--timer--regular' size={4} />
116
- <span>{t('Latency')}</span>
112
+ <div className='flex items-center justify-between text-sm'>
113
+ <div className='flex items-center gap-2 text-description'>
114
+ <Icon icon='ph--timer--regular' />
115
+ <span>{t('sync latency label')}</span>
117
116
  </div>
118
- <span className='text-sm font-mono text-neutral-900 dark:text-neutral-100'>{status.rtt.toFixed(0)} ms</span>
117
+ <UnitValue value={status.rtt} format={Unit.Millisecond} />
119
118
  </div>
120
119
 
121
120
  {/* Upload Speed */}
122
- <div className='flex items-center justify-between'>
123
- <div className='flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400'>
124
- <Icon icon='ph--arrow-up--regular' size={4} />
125
- <span>{t('Upload')}</span>
121
+ <div className='flex items-center justify-between text-sm'>
122
+ <div className='flex items-center gap-2 text-description'>
123
+ <Icon icon='ph--arrow-up--regular' />
124
+ <span>{t('sync upload label')}</span>
126
125
  </div>
127
- <span className='text-sm font-mono text-neutral-900 dark:text-neutral-100'>
128
- {Unit.Kilobyte(status.rateBytesUp, 0)}/s
129
- </span>
126
+ <UnitValue value={status.rateBytesUp} format={Unit.Kilobyte} suffix='/s' />
130
127
  </div>
131
128
 
132
129
  {/* Download Speed */}
133
- <div className='flex items-center justify-between'>
134
- <div className='flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400'>
135
- <Icon icon='ph--arrow-down--regular' size={4} />
136
- <span>{t('Download')}</span>
130
+ <div className='flex items-center justify-between text-sm'>
131
+ <div className='flex items-center gap-2 text-sm text-description'>
132
+ <Icon icon='ph--arrow-down--regular' />
133
+ <span>{t('sync download label')}</span>
137
134
  </div>
138
- <span className='text-sm font-mono text-neutral-900 dark:text-neutral-100'>
139
- {Unit.Kilobyte(status.rateBytesDown, 0)}/s
140
- </span>
135
+ <UnitValue value={status.rateBytesDown} format={Unit.Kilobyte} suffix='/s' />
141
136
  </div>
142
137
  </div>
143
138
  )}
144
139
  </div>
145
140
  );
146
141
  };
142
+
143
+ // TODO(burdon): Factor out.
144
+ const UnitValue = ({ value: input, format, suffix }: { value: number; format: UnitFormat; suffix?: string }) => {
145
+ const { formattedValue, unit } = format(input);
146
+ return (
147
+ <span className='font-mono'>
148
+ {formattedValue}
149
+ <span className='mis-1 text-subdued'>
150
+ {unit.symbol}
151
+ {suffix}
152
+ </span>
153
+ </span>
154
+ );
155
+ };
@@ -2,34 +2,65 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback } from 'react';
5
+ import * as Schema from 'effect/Schema';
6
+ import React, { useCallback, useState } from 'react';
6
7
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
- import { type QueryAST, Type } from '@dxos/echo';
9
- import { invariant } from '@dxos/invariant';
8
+ import { createIntent } from '@dxos/app-framework';
9
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
10
+ import { DXN, Filter, Obj, Query, type QueryAST, Tag, Type } from '@dxos/echo';
10
11
  import { useClient } from '@dxos/react-client';
11
- import { getSpace, useSchema } from '@dxos/react-client/echo';
12
+ import { getSpace, useQuery } from '@dxos/react-client/echo';
13
+ import { useAsyncEffect } from '@dxos/react-ui';
12
14
  import { ViewEditor as NaturalViewEditor } from '@dxos/react-ui-form';
13
- import { type DataType, getTypenameFromQuery } from '@dxos/schema';
15
+ import { View } from '@dxos/schema';
14
16
 
17
+ import { resolveSchemaWithClientAndSpace } from '../helpers';
18
+ import { useTypeOptions } from '../hooks';
15
19
  import { SpaceAction } from '../types';
16
20
 
17
- type ViewEditorProps = { view: DataType.View };
21
+ export type ViewEditorProps = { view: View.View };
18
22
 
19
23
  export const ViewEditor = ({ view }: ViewEditorProps) => {
20
24
  const { dispatchPromise: dispatch } = useIntentDispatcher();
21
25
  const client = useClient();
22
26
  const space = getSpace(view);
23
- const typename = view.query ? getTypenameFromQuery(view.query.ast) : undefined;
24
- const schema = useSchema(client, space, typename);
27
+ const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>(() => Schema.Struct({}));
28
+ const tags = useQuery(space, Filter.type(Tag.Tag));
29
+ const types = useTypeOptions({ space, annotation: ['dynamic', 'limited-static', 'object-form'] });
25
30
 
26
- const handleUpdateQuery = useCallback(
27
- (newQuery: QueryAST.Query) => {
28
- invariant(schema);
29
- invariant(Type.isMutable(schema));
31
+ useAsyncEffect(async () => {
32
+ if (!view?.query || !space) {
33
+ return;
34
+ }
30
35
 
31
- view.query.ast = newQuery;
32
- schema.updateTypename(getTypenameFromQuery(newQuery));
36
+ const foundSchema = await resolveSchemaWithClientAndSpace(client, space, view.query.ast);
37
+ if (foundSchema && foundSchema !== schema) {
38
+ setSchema(() => foundSchema);
39
+ }
40
+ }, [client, space, view, schema]);
41
+
42
+ const handleQueryChanged = useCallback(
43
+ async (newQuery: QueryAST.Query, target?: string) => {
44
+ if (!view || !space) {
45
+ return;
46
+ }
47
+
48
+ const queue = target && DXN.tryParse(target) ? target : undefined;
49
+ const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);
50
+ view.query.ast = query.ast;
51
+ const newSchema = await resolveSchemaWithClientAndSpace(client, space, query.ast);
52
+ if (!newSchema) {
53
+ return;
54
+ }
55
+
56
+ const newView = View.make({
57
+ query,
58
+ jsonSchema: Type.toJsonSchema(newSchema),
59
+ presentation: Obj.make(Type.Expando, {}),
60
+ });
61
+ view.projection = Obj.getSnapshot(newView).projection;
62
+
63
+ setSchema(() => newSchema);
33
64
  },
34
65
  [view, schema],
35
66
  );
@@ -50,9 +81,12 @@ export const ViewEditor = ({ view }: ViewEditorProps) => {
50
81
  registry={space.db.schemaRegistry}
51
82
  schema={schema}
52
83
  view={view}
53
- onQueryChanged={Type.isMutable(schema) ? handleUpdateQuery : undefined}
54
- onDelete={Type.isMutable(schema) ? handleDelete : undefined}
84
+ mode='query'
55
85
  outerSpacing={false}
86
+ tags={tags}
87
+ types={types}
88
+ onQueryChanged={handleQueryChanged}
89
+ onDelete={Type.isMutable(schema) ? handleDelete : undefined}
56
90
  />
57
91
  );
58
92
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
5
+ import { type ComponentType, lazy } from 'react';
6
6
 
7
7
  export * from './AwaitingObject';
8
8
  export * from './CreateDialog';
@@ -10,9 +10,8 @@ export * from './CollectionSection';
10
10
  export * from './JoinDialog';
11
11
  export * from './MembersContainer';
12
12
  export * from './MenuFooter';
13
- export * from './PersistenceStatus';
14
- export * from './PopoverRenameObject';
15
- export * from './PopoverRenameSpace';
13
+ export * from './ObjectRenamePopover';
14
+ export * from './SpaceRenamePopover';
16
15
  export * from './SchemaContainer';
17
16
  export * from './SpacePresence';
18
17
  export * from './SpacePluginSettings';
@@ -20,7 +19,7 @@ export * from './SpaceSettings';
20
19
  export * from './SyncStatus';
21
20
  export * from './ViewEditor';
22
21
 
23
- export const CollectionMain = lazy(() => import('./CollectionMain'));
24
- export const ObjectDetailsPanel = lazy(() => import('./ObjectDetailsPanel'));
22
+ export const CollectionArticle = lazy(() => import('./CollectionArticle'));
23
+ export const ObjectDetailsPanel: ComponentType<any> = lazy(() => import('./ObjectDetailsPanel'));
25
24
  export const ObjectSettingsContainer = lazy(() => import('./ObjectSettings'));
26
- export const RecordMain = lazy(() => import('./RecordMain'));
25
+ export const RecordArticle = lazy(() => import('./RecordArticle'));
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './query';
@@ -0,0 +1,24 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from 'vitest';
6
+
7
+ import { evalQuery } from './query';
8
+
9
+ describe('evalQuery', () => {
10
+ it('should evaluate a query string', () => {
11
+ const query = evalQuery('Query.select(Filter.type(Person.Person))');
12
+ expect(query.ast).toMatchInlineSnapshot(`
13
+ {
14
+ "filter": {
15
+ "id": undefined,
16
+ "props": {},
17
+ "type": "object",
18
+ "typename": "dxn:type:dxos.org/type/Person:0.1.0",
19
+ },
20
+ "type": "select",
21
+ }
22
+ `);
23
+ });
24
+ });