@dxos/plugin-space 0.8.4-main.f9ba587 → 0.8.4-main.fffef41

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 (361) hide show
  1. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs +31 -0
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.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-SXDRWTTU.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-SXDRWTTU.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-DTM7BJ6D.mjs +528 -0
  10. package/dist/lib/browser/app-graph-builder-DTM7BJ6D.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-UKYMBX4O.mjs → app-graph-serializer-TIKXF43P.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-TIKXF43P.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-AFUOMLX6.mjs +167 -0
  14. package/dist/lib/browser/chunk-AFUOMLX6.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GVTXQCIW.mjs → chunk-CKACGS7T.mjs} +714 -571
  16. package/dist/lib/browser/chunk-CKACGS7T.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-K5J7ZB5P.mjs +20 -0
  18. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-WBSEOLEM.mjs → chunk-KFUMADZF.mjs} +301 -73
  20. package/dist/lib/browser/chunk-KFUMADZF.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-6VLSHG4A.mjs → chunk-VGKOXAPE.mjs} +87 -12
  22. package/dist/lib/browser/chunk-VGKOXAPE.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  24. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  26. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-S6NY637J.mjs → chunk-ZQMSGD5J.mjs} +95 -19
  28. package/dist/lib/browser/chunk-ZQMSGD5J.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 +148 -59
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-WK5WYFH3.mjs → intent-resolver-3FNTO3VW.mjs} +236 -68
  34. package/dist/lib/browser/intent-resolver-3FNTO3VW.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-Q7VBWBES.mjs +30 -0
  37. package/dist/lib/browser/react-root-Q7VBWBES.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-6C3YJNDK.mjs → react-surface-TTHS332A.mjs} +98 -100
  39. package/dist/lib/browser/react-surface-TTHS332A.mjs.map +7 -0
  40. package/dist/lib/browser/{schema-defs-K3B3OAH4.mjs → schema-defs-QPI2JU3X.mjs} +6 -6
  41. package/dist/lib/browser/schema-defs-QPI2JU3X.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-XNWYRWNM.mjs → settings-45PGPO2V.mjs} +5 -5
  43. package/dist/lib/browser/{settings-XNWYRWNM.mjs.map → settings-45PGPO2V.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-K7NSNBHM.mjs → spaces-ready-QCND4DVY.mjs} +21 -18
  45. package/dist/lib/browser/spaces-ready-QCND4DVY.mjs.map +7 -0
  46. package/dist/lib/browser/{state-522XTUR4.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/CollectionArticle-KHXYT3SH.mjs +32 -0
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.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-NACBH42P.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-NACBH42P.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-FBJFWI4H.mjs +529 -0
  58. package/dist/lib/node-esm/app-graph-builder-FBJFWI4H.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-LA3IZDXJ.mjs → app-graph-serializer-BESQZAYU.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-BESQZAYU.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-2THX6G4C.mjs → chunk-6VEONPNZ.mjs} +95 -19
  62. package/dist/lib/node-esm/chunk-6VEONPNZ.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-6ZQGZBEP.mjs +168 -0
  64. package/dist/lib/node-esm/chunk-6ZQGZBEP.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  66. package/dist/lib/node-esm/chunk-BDEFTL6K.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-HJJHLWKY.mjs → chunk-OK2L7N2F.mjs} +301 -73
  70. package/dist/lib/node-esm/chunk-OK2L7N2F.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SXD6T2N4.mjs → chunk-QBRPYAEL.mjs} +87 -12
  72. package/dist/lib/node-esm/chunk-QBRPYAEL.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-OUBADVJE.mjs → chunk-XGAMJC5C.mjs} +714 -571
  74. package/dist/lib/node-esm/chunk-XGAMJC5C.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 +148 -59
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-HSR27ME4.mjs → intent-resolver-6O5FSB7Z.mjs} +236 -68
  82. package/dist/lib/node-esm/intent-resolver-6O5FSB7Z.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-HUK3ANLV.mjs → react-root-K66W3FMA.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-K66W3FMA.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-AGAWX7DD.mjs → react-surface-Y7FTEIDF.mjs} +98 -100
  87. package/dist/lib/node-esm/react-surface-Y7FTEIDF.mjs.map +7 -0
  88. package/dist/lib/node-esm/{schema-defs-4MCDG4DV.mjs → schema-defs-ZS2D47XW.mjs} +6 -6
  89. package/dist/lib/node-esm/schema-defs-ZS2D47XW.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs → settings-6FO65BA6.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs.map → settings-6FO65BA6.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-UM2P3DCR.mjs → spaces-ready-P7CKVXBE.mjs} +21 -18
  93. package/dist/lib/node-esm/spaces-ready-P7CKVXBE.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-C4IOXPZP.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 +14 -7
  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 +5 -4
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1704 -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 +1707 -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/MenuFooter.d.ts.map +1 -1
  145. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  146. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  147. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  148. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  149. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  150. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  152. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  153. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  154. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  155. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  156. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  157. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  158. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1540 -0
  159. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  160. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +1 -1
  161. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  162. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  163. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  164. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  165. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  166. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts +1707 -0
  168. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  170. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  171. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  172. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  173. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1537 -0
  175. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  177. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  179. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  181. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1537 -4
  184. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +1 -1
  186. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  187. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1538 -5
  188. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  189. package/dist/types/src/components/SyncStatus/status.d.ts +5 -5
  190. package/dist/types/src/components/ViewEditor.d.ts +7 -0
  191. package/dist/types/src/components/ViewEditor.d.ts.map +1 -0
  192. package/dist/types/src/components/index.d.ts +11 -5
  193. package/dist/types/src/components/index.d.ts.map +1 -1
  194. package/dist/types/src/events.d.ts +1 -0
  195. package/dist/types/src/events.d.ts.map +1 -1
  196. package/dist/types/src/helpers/index.d.ts +2 -0
  197. package/dist/types/src/helpers/index.d.ts.map +1 -0
  198. package/dist/types/src/helpers/query.d.ts +8 -0
  199. package/dist/types/src/helpers/query.d.ts.map +1 -0
  200. package/dist/types/src/helpers/query.test.d.ts +2 -0
  201. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  202. package/dist/types/src/hooks/index.d.ts +1 -0
  203. package/dist/types/src/hooks/index.d.ts.map +1 -1
  204. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  206. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  207. package/dist/types/src/hooks/usePath.d.ts +1 -1
  208. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  209. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  210. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  211. package/dist/types/src/index.d.ts +1 -0
  212. package/dist/types/src/index.d.ts.map +1 -1
  213. package/dist/types/src/meta.d.ts +0 -1
  214. package/dist/types/src/meta.d.ts.map +1 -1
  215. package/dist/types/src/translations.d.ts +1382 -11
  216. package/dist/types/src/translations.d.ts.map +1 -1
  217. package/dist/types/src/types/types.d.ts +141 -66
  218. package/dist/types/src/types/types.d.ts.map +1 -1
  219. package/dist/types/src/util.d.ts +40 -10
  220. package/dist/types/src/util.d.ts.map +1 -1
  221. package/dist/types/tsconfig.tsbuildinfo +1 -1
  222. package/package.json +67 -61
  223. package/src/SpacePlugin.ts +232 -139
  224. package/src/capabilities/app-graph-builder.ts +335 -88
  225. package/src/capabilities/app-graph-serializer.ts +12 -12
  226. package/src/capabilities/capabilities.ts +21 -10
  227. package/src/capabilities/identity-created.ts +3 -3
  228. package/src/capabilities/index.ts +0 -1
  229. package/src/capabilities/intent-resolver.ts +191 -54
  230. package/src/capabilities/react-root.tsx +6 -4
  231. package/src/capabilities/react-surface.tsx +94 -119
  232. package/src/capabilities/schema-defs.ts +4 -3
  233. package/src/capabilities/spaces-ready.ts +16 -10
  234. package/src/capabilities/state.ts +5 -4
  235. package/src/components/AwaitingObject.tsx +16 -20
  236. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +8 -5
  237. package/src/components/CollectionSection.tsx +8 -6
  238. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  239. package/src/components/CreateDialog/CreateObjectDialog.tsx +76 -54
  240. package/src/components/CreateDialog/CreateObjectPanel.tsx +24 -13
  241. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  242. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  243. package/src/components/JoinDialog/index.ts +5 -0
  244. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  245. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +27 -24
  246. package/src/components/MembersContainer/index.ts +5 -0
  247. package/src/components/MenuFooter.tsx +4 -5
  248. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  249. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  250. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  251. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +11 -17
  252. package/src/components/ObjectRenamePopover/index.ts +5 -0
  253. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +4 -3
  254. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  255. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  256. package/src/components/ObjectSettings/ForeignKeys.tsx +4 -4
  257. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  258. package/src/components/ObjectSettings/index.ts +3 -1
  259. package/src/components/RecordArticle.stories.tsx +115 -0
  260. package/src/components/RecordArticle.tsx +114 -0
  261. package/src/components/SchemaContainer.tsx +25 -28
  262. package/src/components/SpacePluginSettings.tsx +16 -11
  263. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
  264. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
  265. package/src/components/SpacePresence/index.ts +5 -0
  266. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  267. package/src/components/SpaceRenamePopover/index.ts +5 -0
  268. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  269. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +49 -28
  270. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  271. package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
  272. package/src/components/SyncStatus/SyncStatus.tsx +110 -13
  273. package/src/components/SyncStatus/status.ts +4 -4
  274. package/src/components/ViewEditor.tsx +92 -0
  275. package/src/components/index.ts +10 -5
  276. package/src/events.ts +7 -6
  277. package/src/helpers/index.ts +5 -0
  278. package/src/helpers/query.test.ts +24 -0
  279. package/src/helpers/query.ts +158 -0
  280. package/src/hooks/index.ts +1 -0
  281. package/src/hooks/useActiveSpace.ts +3 -2
  282. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  283. package/src/hooks/usePath.ts +1 -1
  284. package/src/hooks/useTypeOptions.ts +59 -0
  285. package/src/index.ts +1 -0
  286. package/src/meta.ts +6 -3
  287. package/src/translations.ts +85 -7
  288. package/src/types/types.ts +94 -22
  289. package/src/util.tsx +297 -75
  290. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs +0 -363
  291. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs.map +0 -7
  292. package/dist/lib/browser/app-graph-serializer-UKYMBX4O.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-6VLSHG4A.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-C7KGJTAL.mjs +0 -18
  295. package/dist/lib/browser/chunk-C7KGJTAL.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  297. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-GVTXQCIW.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-S6NY637J.mjs.map +0 -7
  300. package/dist/lib/browser/chunk-VLBRSGJ2.mjs +0 -94
  301. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  302. package/dist/lib/browser/chunk-WBSEOLEM.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-XXIPJLJF.mjs +0 -19
  304. package/dist/lib/browser/chunk-XXIPJLJF.mjs.map +0 -7
  305. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  306. package/dist/lib/browser/intent-resolver-WK5WYFH3.mjs.map +0 -7
  307. package/dist/lib/browser/react-root-7S6FIC5G.mjs +0 -29
  308. package/dist/lib/browser/react-root-7S6FIC5G.mjs.map +0 -7
  309. package/dist/lib/browser/react-surface-6C3YJNDK.mjs.map +0 -7
  310. package/dist/lib/browser/schema-defs-K3B3OAH4.mjs.map +0 -7
  311. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  312. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  313. package/dist/lib/browser/spaces-ready-K7NSNBHM.mjs.map +0 -7
  314. package/dist/lib/browser/state-522XTUR4.mjs.map +0 -7
  315. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs +0 -364
  316. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs.map +0 -7
  317. package/dist/lib/node-esm/app-graph-serializer-LA3IZDXJ.mjs.map +0 -7
  318. package/dist/lib/node-esm/chunk-2THX6G4C.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-72QMMRKC.mjs +0 -19
  320. package/dist/lib/node-esm/chunk-72QMMRKC.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-AT7LGFER.mjs +0 -20
  322. package/dist/lib/node-esm/chunk-AT7LGFER.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-HJJHLWKY.mjs.map +0 -7
  324. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  325. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-OUBADVJE.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/chunk-SXD6T2N4.mjs.map +0 -7
  330. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  331. package/dist/lib/node-esm/intent-resolver-HSR27ME4.mjs.map +0 -7
  332. package/dist/lib/node-esm/react-root-HUK3ANLV.mjs.map +0 -7
  333. package/dist/lib/node-esm/react-surface-AGAWX7DD.mjs.map +0 -7
  334. package/dist/lib/node-esm/schema-defs-4MCDG4DV.mjs.map +0 -7
  335. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  336. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  337. package/dist/lib/node-esm/spaces-ready-UM2P3DCR.mjs.map +0 -7
  338. package/dist/lib/node-esm/state-C4IOXPZP.mjs.map +0 -7
  339. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  340. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  341. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  342. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  343. package/dist/types/src/components/CollectionMain.d.ts +0 -6
  344. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  345. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  346. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  347. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  348. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  349. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  350. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  351. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  352. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  353. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  354. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  355. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  356. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  357. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  358. package/src/capabilities/schema-tool.test.ts +0 -44
  359. package/src/capabilities/schema-tools.ts +0 -125
  360. package/src/components/MembersContainer.stories.tsx +0 -30
  361. package/src/components/PersistenceStatus.tsx +0 -84
@@ -2,31 +2,37 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { pipe, Schema } from 'effect';
5
+ import * as Function from 'effect/Function';
6
+ import * as Schema from 'effect/Schema';
6
7
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
8
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
9
+ import { LayoutAction, chain, createIntent } from '@dxos/app-framework';
10
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
9
11
  import { log } from '@dxos/log';
10
12
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
13
  import { useClient } from '@dxos/react-client';
12
- import { SpaceState, type Space } from '@dxos/react-client/echo';
13
- import { Button, Input, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
+ import { type Space, SpaceState } from '@dxos/react-client/echo';
15
+ import { Button, Input, useFileDownload, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
16
  import {
15
- Form,
16
- type InputComponent,
17
17
  ControlItem,
18
18
  ControlItemInput,
19
- ControlSection,
20
19
  ControlPage,
20
+ ControlSection,
21
+ Form,
22
+ type InputComponent,
21
23
  } from '@dxos/react-ui-form';
22
24
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
23
25
  import { StackItem } from '@dxos/react-ui-stack';
24
26
 
25
- import { SPACE_PLUGIN } from '../../meta';
27
+ import { meta } from '../../meta';
26
28
  import { SpaceAction, SpaceForm } from '../../types';
27
29
 
28
30
  const FormSchema = SpaceForm.pipe(
29
- 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
+ ),
30
36
  );
31
37
 
32
38
  export type SpaceSettingsContainerProps = {
@@ -35,7 +41,7 @@ export type SpaceSettingsContainerProps = {
35
41
 
36
42
  // TODO(wittjosiah): Handle space migrations here?
37
43
  export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) => {
38
- const { t } = useTranslation(SPACE_PLUGIN);
44
+ const { t } = useTranslation(meta.id);
39
45
  const { dispatchPromise: dispatch } = useIntentDispatcher();
40
46
  const client = useClient();
41
47
  const archived = useMulticastObservable(space.state) === SpaceState.SPACE_INACTIVE;
@@ -69,9 +75,12 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
69
75
  }
70
76
  if (properties.archived && !archived) {
71
77
  void dispatch(
72
- pipe(
78
+ Function.pipe(
73
79
  createIntent(SpaceAction.Close, { space }),
74
- chain(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: client.spaces.default.id }),
80
+ chain(LayoutAction.SwitchWorkspace, {
81
+ part: 'workspace',
82
+ subject: client.spaces.default.id,
83
+ }),
75
84
  ),
76
85
  );
77
86
  } else if (!properties.archived && archived) {
@@ -111,31 +120,25 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
111
120
  );
112
121
  },
113
122
  icon: ({ type, label, getValue, onValueChange }) => {
114
- const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);
115
- const handleEmojiReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
123
+ const handleChange = useCallback((icon: string) => onValueChange(type, icon), [onValueChange, type]);
124
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
116
125
  return (
117
126
  <ControlItem title={label} description={t('icon description')}>
118
127
  <IconPicker
119
128
  value={getValue()}
120
129
  onChange={handleChange}
121
- onReset={handleEmojiReset}
130
+ onReset={handleReset}
122
131
  classNames='justify-self-end'
123
- iconSize={5}
124
132
  />
125
133
  </ControlItem>
126
134
  );
127
135
  },
128
136
  hue: ({ type, label, getValue, onValueChange }) => {
129
137
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
130
- const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
138
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
131
139
  return (
132
140
  <ControlItem title={label} description={t('hue description')}>
133
- <HuePicker
134
- value={getValue()}
135
- onChange={handleChange}
136
- onReset={handleHueReset}
137
- classNames='[--hue-preview-size:1.25rem] justify-self-end'
138
- />
141
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleReset} classNames='justify-self-end' />
139
142
  </ControlItem>
140
143
  );
141
144
  },
@@ -151,7 +154,11 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
151
154
  const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
152
155
  return (
153
156
  <ControlItemInput title={label} description={t('archive space description')}>
154
- <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
+ >
155
162
  {getValue() ? t('unarchive space label') : t('archive space label')}
156
163
  </Button>
157
164
  </ControlItemInput>
@@ -161,12 +168,20 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
161
168
  [t, space],
162
169
  );
163
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
+
164
177
  return (
165
- <StackItem.Content classNames='block overflow-y-auto pli-2'>
178
+ <StackItem.Content scrollable>
166
179
  <ControlPage>
167
180
  <ControlSection
168
- title={t('space properties settings verbose label', { ns: SPACE_PLUGIN })}
169
- description={t('space properties settings description', { ns: SPACE_PLUGIN })}
181
+ title={t('space properties settings verbose label', { ns: meta.id })}
182
+ description={t('space properties settings description', {
183
+ ns: meta.id,
184
+ })}
170
185
  >
171
186
  <Form
172
187
  schema={FormSchema}
@@ -175,9 +190,15 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
175
190
  onSave={handleSave}
176
191
  Custom={customElements}
177
192
  outerSpacing={false}
178
- classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4'
193
+ classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'
179
194
  />
180
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>
181
202
  </ControlPage>
182
203
  </StackItem.Content>
183
204
  );
@@ -2,10 +2,10 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
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';
@@ -14,14 +14,14 @@ import { Tooltip, useTranslation } from '@dxos/react-ui';
14
14
  import { AttentionGlyph, useAttended, useAttention } from '@dxos/react-ui-attention';
15
15
 
16
16
  import { usePath } from '../../hooks';
17
- import { SPACE_PLUGIN } from '../../meta';
17
+ import { meta } from '../../meta';
18
18
 
19
- const useEdgeStatus = (): EdgeStatus => {
20
- const [status, setStatus] = useState(EdgeStatus.NOT_CONNECTED);
19
+ const useEdgeStatus = (): EdgeStatus.ConnectionState => {
20
+ const [status, setStatus] = useState(EdgeStatus.ConnectionState.NOT_CONNECTED);
21
21
  const client = useClient();
22
22
  useEffect(() => {
23
23
  client.services.services.EdgeAgentService?.queryEdgeStatus().subscribe(({ status }) => {
24
- setStatus(status);
24
+ setStatus(status.state);
25
25
  });
26
26
  }, [client]);
27
27
 
@@ -29,7 +29,7 @@ const useEdgeStatus = (): EdgeStatus => {
29
29
  };
30
30
 
31
31
  export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean }) => {
32
- const { t } = useTranslation(SPACE_PLUGIN);
32
+ const { t } = useTranslation(meta.id);
33
33
  const id = space.id;
34
34
  const { hasAttention, isAncestor, isRelated } = useAttention(id);
35
35
  const isAttended = hasAttention || isAncestor || isRelated;
@@ -43,7 +43,7 @@ export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean
43
43
  const path = usePath(graph, startOfAttention);
44
44
  const containsAttended = !open && !isAttended && id && Option.isSome(path) ? path.value.includes(id) : false;
45
45
 
46
- const connectedToEdge = useEdgeStatus() === EdgeStatus.CONNECTED;
46
+ const connectedToEdge = useEdgeStatus() === EdgeStatus.ConnectionState.CONNECTED;
47
47
  // TODO(wittjosiah): This is not reactive.
48
48
  const edgeSyncEnabled = space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED;
49
49
  const syncState = useSpaceSyncState(space);
@@ -2,28 +2,28 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
- import { withTheme } from '@dxos/storybook-utils';
7
+ import { withClientProvider } from '@dxos/react-client/testing';
8
+ import { withTheme } from '@dxos/react-ui/testing';
10
9
 
11
- import { SyncStatusIndicator } from './SyncStatus';
12
10
  import { translations } from '../../translations';
13
11
 
14
- const meta: Meta = {
12
+ import { SyncStatusIndicator } from './SyncStatus';
13
+
14
+ const meta = {
15
15
  title: 'plugins/plugin-space/SyncStatusIndicator',
16
16
  component: SyncStatusIndicator,
17
- decorators: [withTheme],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
18
18
  parameters: {
19
- translations,
20
19
  layout: 'centered',
20
+ translations,
21
21
  },
22
- };
22
+ } satisfies Meta<typeof SyncStatusIndicator>;
23
23
 
24
24
  export default meta;
25
25
 
26
- type Story = StoryObj<typeof SyncStatusIndicator>;
26
+ type Story = StoryObj<typeof meta>;
27
27
 
28
28
  export const Default: Story = {
29
29
  args: {
@@ -5,13 +5,19 @@
5
5
  import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { StatusBar } from '@dxos/plugin-status-bar';
8
+ import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { type QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
8
10
  import { useClient } from '@dxos/react-client';
9
- import { getSyncSummary, type SpaceSyncStateMap, useSyncState } from '@dxos/react-client/echo';
10
- import { Icon, useTranslation } from '@dxos/react-ui';
11
+ import { useStream } from '@dxos/react-client/devtools';
12
+ import { type SpaceSyncStateMap, getSyncSummary, useSyncState } from '@dxos/react-client/echo';
13
+ import { Icon, Popover, useTranslation } from '@dxos/react-ui';
14
+ import { mx } from '@dxos/react-ui-theme';
15
+ import { Unit, type UnitFormat } from '@dxos/util';
16
+
17
+ import { meta } from '../../meta';
11
18
 
12
19
  import { createClientSaveTracker } from './save-tracker';
13
20
  import { getIcon, getStatus } from './status';
14
- import { SPACE_PLUGIN } from '../../meta';
15
21
 
16
22
  const SYNC_STALLED_TIMEOUT = 5_000;
17
23
 
@@ -19,18 +25,13 @@ export const SyncStatus = () => {
19
25
  const client = useClient();
20
26
  const state = useSyncState();
21
27
  const [saved, setSaved] = useState(true);
22
-
23
- useEffect(() => {
24
- return createClientSaveTracker(client, (state) => {
25
- setSaved(state === 'saved');
26
- });
27
- }, []);
28
+ useEffect(() => createClientSaveTracker(client, (state) => setSaved(state === 'saved')), []);
28
29
 
29
30
  return <SyncStatusIndicator state={state} saved={saved} />;
30
31
  };
31
32
 
32
- export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: Boolean }) => {
33
- const { t } = useTranslation(SPACE_PLUGIN);
33
+ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: boolean }) => {
34
+ const { t } = useTranslation(meta.id);
34
35
  const summary = getSyncSummary(state);
35
36
  const offline = Object.values(state).length === 0;
36
37
  const needsToUpload = summary.differentDocuments > 0 || summary.missingOnRemote > 0;
@@ -52,7 +53,103 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
52
53
  }, [offline, needsToUpload, needsToDownload]);
53
54
 
54
55
  const title = t(`${status} label`);
55
- const icon = <Icon icon={getIcon(status)} size={4} classNames={classNames} />;
56
+ const icon = <Icon icon={getIcon(status)} classNames={classNames} />;
57
+
58
+ return (
59
+ <Popover.Root>
60
+ <Popover.Trigger asChild>
61
+ <StatusBar.Item title={title}>{icon}</StatusBar.Item>
62
+ </Popover.Trigger>
63
+ <Popover.Portal>
64
+ <Popover.Content>
65
+ <EdgeConnectionPopover />
66
+ <Popover.Arrow />
67
+ </Popover.Content>
68
+ </Popover.Portal>
69
+ </Popover.Root>
70
+ );
71
+ };
72
+
73
+ const useEdgeStatus = (): EdgeStatus | undefined => {
74
+ const client = useClient();
75
+ const { status } = useStream(
76
+ () => client.services.services.EdgeAgentService!.queryEdgeStatus(),
77
+ {} as QueryEdgeStatusResponse,
78
+ );
79
+ return status;
80
+ };
81
+
82
+ const EdgeConnectionPopover = () => {
83
+ const status = useEdgeStatus();
84
+ const { t } = useTranslation(meta.id);
85
+
86
+ const isConnected = status?.state === EdgeStatus.ConnectionState.CONNECTED;
87
+
88
+ return (
89
+ <div className='min-is-[240px] p-2'>
90
+ {/* Connection Status Header */}
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')}
98
+ </span>
99
+ </div>
100
+
101
+ {/* Connection Details */}
102
+ {status?.state === EdgeStatus.ConnectionState.NOT_CONNECTED && (
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>
106
+ </div>
107
+ )}
108
+
109
+ {status?.state === EdgeStatus.ConnectionState.CONNECTED && (
110
+ <div className='space-y-2'>
111
+ {/* Latency */}
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>
116
+ </div>
117
+ <UnitValue value={status.rtt} format={Unit.Millisecond} />
118
+ </div>
119
+
120
+ {/* Upload Speed */}
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>
125
+ </div>
126
+ <UnitValue value={status.rateBytesUp} format={Unit.Kilobyte} suffix='/s' />
127
+ </div>
128
+
129
+ {/* Download Speed */}
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>
134
+ </div>
135
+ <UnitValue value={status.rateBytesDown} format={Unit.Kilobyte} suffix='/s' />
136
+ </div>
137
+ </div>
138
+ )}
139
+ </div>
140
+ );
141
+ };
56
142
 
57
- return <StatusBar.Item title={title}>{icon}</StatusBar.Item>;
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
+ );
58
155
  };
@@ -10,10 +10,10 @@ export const getStatus = ({
10
10
  needsToUpload,
11
11
  needsToDownload,
12
12
  }: {
13
- offline: Boolean;
14
- saved: Boolean;
15
- needsToUpload: Boolean;
16
- needsToDownload: Boolean;
13
+ offline: boolean;
14
+ saved: boolean;
15
+ needsToUpload: boolean;
16
+ needsToDownload: boolean;
17
17
  }): Status => {
18
18
  if (!saved) {
19
19
  return 'saving locally';
@@ -0,0 +1,92 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import React, { useCallback, useState } from 'react';
7
+
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';
11
+ import { useClient } from '@dxos/react-client';
12
+ import { getSpace, useQuery } from '@dxos/react-client/echo';
13
+ import { useAsyncEffect } from '@dxos/react-ui';
14
+ import { ViewEditor as NaturalViewEditor } from '@dxos/react-ui-form';
15
+ import { View } from '@dxos/schema';
16
+
17
+ import { resolveSchemaWithClientAndSpace } from '../helpers';
18
+ import { useTypeOptions } from '../hooks';
19
+ import { SpaceAction } from '../types';
20
+
21
+ export type ViewEditorProps = { view: View.View };
22
+
23
+ export const ViewEditor = ({ view }: ViewEditorProps) => {
24
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
25
+ const client = useClient();
26
+ const space = getSpace(view);
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'] });
30
+
31
+ useAsyncEffect(async () => {
32
+ if (!view?.query || !space) {
33
+ return;
34
+ }
35
+
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);
64
+ },
65
+ [view, schema],
66
+ );
67
+
68
+ const handleDelete = useCallback(
69
+ (fieldId: string) => {
70
+ void dispatch(createIntent(SpaceAction.DeleteField, { view, fieldId }));
71
+ },
72
+ [dispatch, view],
73
+ );
74
+
75
+ if (!space || !schema) {
76
+ return null;
77
+ }
78
+
79
+ return (
80
+ <NaturalViewEditor
81
+ registry={space.db.schemaRegistry}
82
+ schema={schema}
83
+ view={view}
84
+ mode='query'
85
+ outerSpacing={false}
86
+ tags={tags}
87
+ types={types}
88
+ onQueryChanged={handleQueryChanged}
89
+ onDelete={Type.isMutable(schema) ? handleDelete : undefined}
90
+ />
91
+ );
92
+ };
@@ -2,19 +2,24 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { type ComponentType, lazy } from 'react';
6
+
5
7
  export * from './AwaitingObject';
6
8
  export * from './CreateDialog';
7
- export * from './CollectionMain';
8
9
  export * from './CollectionSection';
9
10
  export * from './JoinDialog';
10
11
  export * from './MembersContainer';
11
12
  export * from './MenuFooter';
12
- export * from './ObjectSettings';
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';
19
18
  export * from './SpaceSettings';
20
19
  export * from './SyncStatus';
20
+ export * from './ViewEditor';
21
+
22
+ export const CollectionArticle = lazy(() => import('./CollectionArticle'));
23
+ export const ObjectDetailsPanel: ComponentType<any> = lazy(() => import('./ObjectDetailsPanel'));
24
+ export const ObjectSettingsContainer = lazy(() => import('./ObjectSettings'));
25
+ export const RecordArticle = lazy(() => import('./RecordArticle'));
package/src/events.ts CHANGED
@@ -2,13 +2,14 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { defineEvent, Events } from '@dxos/app-framework';
5
+ import { Events, defineEvent } from '@dxos/app-framework';
6
6
 
7
- import { SPACE_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace SpaceEvents {
10
- export const StateReady = Events.createStateEvent(`${SPACE_PLUGIN}/event/state-ready`);
11
- export const SetupSettingsPanel = defineEvent(`${SPACE_PLUGIN}/event/setup-settings-panel`);
12
- export const DefaultSpaceReady = defineEvent(`${SPACE_PLUGIN}/event/default-space-ready`);
13
- export const SpaceCreated = defineEvent(`${SPACE_PLUGIN}/event/space-created`);
10
+ export const StateReady = Events.createStateEvent(`${meta.id}/event/state-ready`);
11
+ export const SetupSettingsPanel = defineEvent(`${meta.id}/event/setup-settings-panel`);
12
+ export const DefaultSpaceReady = defineEvent(`${meta.id}/event/default-space-ready`);
13
+ export const SpaceCreated = defineEvent(`${meta.id}/event/space-created`);
14
+ export const SchemaAdded = defineEvent(`${meta.id}/event/schema-added`);
14
15
  }
@@ -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
+ });