@dxos/plugin-space 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (326) hide show
  1. package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs +315 -0
  2. package/dist/lib/browser/app-graph-builder-GMFCSOLG.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-VRU57AEZ.mjs → app-graph-serializer-DSF2U3A5.mjs} +10 -10
  4. package/dist/lib/browser/app-graph-serializer-DSF2U3A5.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-UBSVH2NQ.mjs → chunk-5BDV575R.mjs} +10 -21
  6. package/dist/lib/browser/chunk-5BDV575R.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-AYW4IDRT.mjs +275 -0
  8. package/dist/lib/browser/chunk-AYW4IDRT.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-43UQWMD3.mjs → chunk-JZXWPMLA.mjs} +740 -390
  10. package/dist/lib/browser/chunk-JZXWPMLA.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-IQFFOAWD.mjs → chunk-LO5UL6RU.mjs} +173 -78
  12. package/dist/lib/browser/chunk-LO5UL6RU.mjs.map +7 -0
  13. package/dist/lib/browser/{identity-created-ANRJHNMQ.mjs → identity-created-JR7BNXFH.mjs} +5 -5
  14. package/dist/lib/browser/identity-created-JR7BNXFH.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +47 -30
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-KRINV5QI.mjs → intent-resolver-RKYILWWQ.mjs} +106 -98
  18. package/dist/lib/browser/intent-resolver-RKYILWWQ.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-root-J3SP2HVW.mjs → react-root-6H7NX2M2.mjs} +4 -5
  21. package/dist/lib/{node-esm/react-root-S2LW4FS7.mjs.map → browser/react-root-6H7NX2M2.mjs.map} +1 -1
  22. package/dist/lib/browser/{react-surface-J7T2IMH4.mjs → react-surface-7AGLOVMK.mjs} +53 -120
  23. package/dist/lib/browser/react-surface-7AGLOVMK.mjs.map +7 -0
  24. package/dist/lib/browser/schema-FHTA26SW.mjs +24 -0
  25. package/dist/lib/browser/schema-FHTA26SW.mjs.map +7 -0
  26. package/dist/lib/browser/{schema-tools-MYC4LTQD.mjs → schema-tools-YAXPRIXP.mjs} +22 -22
  27. package/dist/lib/browser/schema-tools-YAXPRIXP.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-G24447B7.mjs → settings-PJPTJUPE.mjs} +4 -4
  29. package/dist/lib/browser/settings-PJPTJUPE.mjs.map +7 -0
  30. package/dist/lib/browser/{spaces-ready-5I3RKYTT.mjs → spaces-ready-BSSP7HHG.mjs} +17 -18
  31. package/dist/lib/browser/spaces-ready-BSSP7HHG.mjs.map +7 -0
  32. package/dist/lib/browser/{state-SI4B5GHC.mjs → state-X7VLCC6E.mjs} +4 -2
  33. package/dist/lib/browser/state-X7VLCC6E.mjs.map +7 -0
  34. package/dist/lib/browser/types/index.mjs +1 -7
  35. package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs +318 -0
  36. package/dist/lib/node/app-graph-builder-DPY7AUZE.cjs.map +7 -0
  37. package/dist/lib/node/{app-graph-serializer-VLBCR3IX.cjs → app-graph-serializer-JELGJUAY.cjs} +22 -22
  38. package/dist/lib/node/app-graph-serializer-JELGJUAY.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-MXBE2VET.cjs → chunk-3GKCNADA.cjs} +751 -412
  40. package/dist/lib/node/chunk-3GKCNADA.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-5YHUQJVB.cjs → chunk-PU2EYH4E.cjs} +14 -25
  42. package/dist/lib/node/chunk-PU2EYH4E.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-SCATWJKX.cjs → chunk-TUZWEPGX.cjs} +198 -100
  44. package/dist/lib/node/chunk-TUZWEPGX.cjs.map +7 -0
  45. package/dist/lib/node/chunk-WDEIFDTX.cjs +300 -0
  46. package/dist/lib/node/chunk-WDEIFDTX.cjs.map +7 -0
  47. package/dist/lib/node/{identity-created-NIPYGVG3.cjs → identity-created-XU4HFV2T.cjs} +7 -7
  48. package/dist/lib/node/identity-created-XU4HFV2T.cjs.map +7 -0
  49. package/dist/lib/node/index.cjs +97 -79
  50. package/dist/lib/node/index.cjs.map +3 -3
  51. package/dist/lib/node/{intent-resolver-MJVRY6YE.cjs → intent-resolver-VJ7YV74L.cjs} +151 -144
  52. package/dist/lib/node/intent-resolver-VJ7YV74L.cjs.map +7 -0
  53. package/dist/lib/node/meta.json +1 -1
  54. package/dist/lib/node/{react-root-M4BZ6VXB.cjs → react-root-TEL5RW3N.cjs} +8 -9
  55. package/dist/lib/node/{react-root-M4BZ6VXB.cjs.map → react-root-TEL5RW3N.cjs.map} +1 -1
  56. package/dist/lib/node/{react-surface-RYKSYYKM.cjs → react-surface-2H3S5TY5.cjs} +75 -142
  57. package/dist/lib/node/react-surface-2H3S5TY5.cjs.map +7 -0
  58. package/dist/lib/node/{schema-defs-2HJLXSNK.cjs → schema-PPJ5BZ3A.cjs} +11 -13
  59. package/dist/lib/node/schema-PPJ5BZ3A.cjs.map +7 -0
  60. package/dist/lib/node/{schema-tools-OE3MFYYH.cjs → schema-tools-BLIMOZYY.cjs} +24 -24
  61. package/dist/lib/node/schema-tools-BLIMOZYY.cjs.map +7 -0
  62. package/dist/lib/node/{settings-AFWO4AWK.cjs → settings-WVFP2UEP.cjs} +7 -7
  63. package/dist/lib/node/settings-WVFP2UEP.cjs.map +7 -0
  64. package/dist/lib/node/{spaces-ready-BMPXSFHF.cjs → spaces-ready-7DNZSUOG.cjs} +24 -25
  65. package/dist/lib/node/spaces-ready-7DNZSUOG.cjs.map +7 -0
  66. package/dist/lib/node/{state-L2ZSDKLS.cjs → state-5KX6WBJH.cjs} +7 -5
  67. package/dist/lib/node/state-5KX6WBJH.cjs.map +7 -0
  68. package/dist/lib/node/types/index.cjs +12 -18
  69. package/dist/lib/node/types/index.cjs.map +2 -2
  70. package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs +316 -0
  71. package/dist/lib/node-esm/app-graph-builder-42IGWRPL.mjs.map +7 -0
  72. package/dist/lib/node-esm/{app-graph-serializer-GEUYYXKD.mjs → app-graph-serializer-FXONFKOE.mjs} +10 -10
  73. package/dist/lib/node-esm/app-graph-serializer-FXONFKOE.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-5NIBYPVF.mjs → chunk-3ZOUV4DF.mjs} +10 -21
  75. package/dist/lib/node-esm/chunk-3ZOUV4DF.mjs.map +7 -0
  76. package/dist/lib/node-esm/{chunk-FI3WV22Y.mjs → chunk-BEWBZ4Q4.mjs} +740 -390
  77. package/dist/lib/node-esm/chunk-BEWBZ4Q4.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-FC4UHDPL.mjs +276 -0
  79. package/dist/lib/node-esm/chunk-FC4UHDPL.mjs.map +7 -0
  80. package/dist/lib/node-esm/{chunk-S2W6HS4A.mjs → chunk-ZGLK25WQ.mjs} +173 -78
  81. package/dist/lib/node-esm/chunk-ZGLK25WQ.mjs.map +7 -0
  82. package/dist/lib/node-esm/{identity-created-O5X2FFWU.mjs → identity-created-WJKAS2PV.mjs} +5 -5
  83. package/dist/lib/node-esm/identity-created-WJKAS2PV.mjs.map +7 -0
  84. package/dist/lib/node-esm/index.mjs +47 -30
  85. package/dist/lib/node-esm/index.mjs.map +3 -3
  86. package/dist/lib/node-esm/{intent-resolver-JT6EB47M.mjs → intent-resolver-ZFNSA4CM.mjs} +106 -98
  87. package/dist/lib/node-esm/intent-resolver-ZFNSA4CM.mjs.map +7 -0
  88. package/dist/lib/node-esm/meta.json +1 -1
  89. package/dist/lib/node-esm/{react-root-S2LW4FS7.mjs → react-root-PRBJMWLQ.mjs} +4 -5
  90. package/dist/lib/node-esm/{react-surface-ZNNMO7QQ.mjs → react-surface-RCZG2PNF.mjs} +53 -120
  91. package/dist/lib/node-esm/react-surface-RCZG2PNF.mjs.map +7 -0
  92. package/dist/lib/node-esm/schema-OUZKVYM5.mjs +25 -0
  93. package/dist/lib/node-esm/schema-OUZKVYM5.mjs.map +7 -0
  94. package/dist/lib/node-esm/{schema-tools-YTJLA3NQ.mjs → schema-tools-IU7EX5A5.mjs} +22 -22
  95. package/dist/lib/node-esm/schema-tools-IU7EX5A5.mjs.map +7 -0
  96. package/dist/lib/node-esm/{settings-MJVSCOI4.mjs → settings-FJZPC2TV.mjs} +4 -4
  97. package/dist/lib/node-esm/settings-FJZPC2TV.mjs.map +7 -0
  98. package/dist/lib/node-esm/{spaces-ready-XKG57SL5.mjs → spaces-ready-7X5PGB2V.mjs} +17 -18
  99. package/dist/lib/node-esm/spaces-ready-7X5PGB2V.mjs.map +7 -0
  100. package/dist/lib/node-esm/{state-QUDYGEU6.mjs → state-Z6E2YTNC.mjs} +4 -2
  101. package/dist/lib/node-esm/state-Z6E2YTNC.mjs.map +7 -0
  102. package/dist/lib/node-esm/types/index.mjs +1 -7
  103. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts +179 -2
  105. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/app-graph-serializer.d.ts +2 -2
  107. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/identity-created.d.ts +2 -2
  109. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/index.d.ts +184 -9
  111. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/intent-resolver.d.ts +3 -4
  113. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/schema-tools.d.ts +2 -2
  116. package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/schema.d.ts +4 -0
  118. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/spaces-ready.d.ts +2 -2
  120. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/state.d.ts +2 -2
  122. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  123. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  124. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  125. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -2
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  129. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  130. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  131. package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
  132. package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -1
  133. package/dist/types/src/components/MenuFooter.d.ts +2 -2
  134. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  135. package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.d.ts +2 -2
  136. package/dist/types/src/components/ObjectSettingsContainer/AdvancedObjectSettings.d.ts.map +1 -0
  137. package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.d.ts +2 -2
  138. package/dist/types/src/components/ObjectSettingsContainer/BaseObjectSettings.d.ts.map +1 -0
  139. package/dist/types/src/components/ObjectSettingsContainer/ForeignKeys.d.ts.map +1 -0
  140. package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.d.ts +2 -2
  141. package/dist/types/src/components/ObjectSettingsContainer/ObjectSettingsContainer.d.ts.map +1 -0
  142. package/dist/types/src/components/ObjectSettingsContainer/index.d.ts.map +1 -0
  143. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  144. package/dist/types/src/components/PopoverAddSpace.d.ts +4 -0
  145. package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -0
  146. package/dist/types/src/components/PopoverRenameObject.d.ts +2 -2
  147. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  148. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  149. package/dist/types/src/components/ShareSpaceButton.d.ts +9 -0
  150. package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -0
  151. package/dist/types/src/components/ShareSpaceButton.stories.d.ts +10 -0
  152. package/dist/types/src/components/ShareSpaceButton.stories.d.ts.map +1 -0
  153. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  154. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  155. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts +7 -0
  157. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.d.ts.map +1 -0
  158. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts +7 -0
  159. package/dist/types/src/components/SpaceSettings/SpacePropertiesForm.stories.d.ts.map +1 -0
  160. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +2 -0
  161. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  162. package/dist/types/src/components/SpaceSettings/index.d.ts +1 -0
  163. package/dist/types/src/components/SpaceSettings/index.d.ts.map +1 -1
  164. package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
  165. package/dist/types/src/components/SyncStatus/Space.d.ts +13 -0
  166. package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -0
  167. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +8 -1
  168. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  169. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +9 -0
  170. package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -0
  171. package/dist/types/src/components/SyncStatus/save-tracker.d.ts.map +1 -1
  172. package/dist/types/src/components/SyncStatus/status.d.ts.map +1 -1
  173. package/dist/types/src/components/SyncStatus/sync-state.d.ts +18 -0
  174. package/dist/types/src/components/SyncStatus/sync-state.d.ts.map +1 -0
  175. package/dist/types/src/components/index.d.ts +3 -2
  176. package/dist/types/src/components/index.d.ts.map +1 -1
  177. package/dist/types/src/hooks/index.d.ts +0 -2
  178. package/dist/types/src/hooks/index.d.ts.map +1 -1
  179. package/dist/types/src/hooks/usePath.d.ts +2 -3
  180. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  181. package/dist/types/src/index.d.ts +0 -1
  182. package/dist/types/src/index.d.ts.map +1 -1
  183. package/dist/types/src/translations.d.ts +242 -17
  184. package/dist/types/src/translations.d.ts.map +1 -1
  185. package/dist/types/src/types/collection.d.ts +8 -9
  186. package/dist/types/src/types/collection.d.ts.map +1 -1
  187. package/dist/types/src/types/thread.d.ts +110 -205
  188. package/dist/types/src/types/thread.d.ts.map +1 -1
  189. package/dist/types/src/types/types.d.ts +146 -157
  190. package/dist/types/src/types/types.d.ts.map +1 -1
  191. package/dist/types/src/util.d.ts +20 -36
  192. package/dist/types/src/util.d.ts.map +1 -1
  193. package/dist/types/tsconfig.tsbuildinfo +1 -1
  194. package/package.json +44 -51
  195. package/src/SpacePlugin.tsx +20 -11
  196. package/src/capabilities/app-graph-builder.ts +230 -377
  197. package/src/capabilities/app-graph-serializer.ts +8 -8
  198. package/src/capabilities/identity-created.ts +5 -5
  199. package/src/capabilities/index.ts +2 -2
  200. package/src/capabilities/intent-resolver.ts +110 -94
  201. package/src/capabilities/react-surface.tsx +50 -111
  202. package/src/capabilities/schema-tool.test.ts +3 -2
  203. package/src/capabilities/schema-tools.ts +25 -25
  204. package/src/capabilities/schema.ts +27 -0
  205. package/src/capabilities/settings.ts +2 -2
  206. package/src/capabilities/spaces-ready.ts +14 -16
  207. package/src/capabilities/state.ts +5 -3
  208. package/src/components/AwaitingObject.tsx +1 -1
  209. package/src/components/CollectionMain.tsx +5 -2
  210. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +4 -4
  211. package/src/components/CreateDialog/CreateObjectDialog.tsx +4 -4
  212. package/src/components/CreateDialog/CreateObjectPanel.tsx +25 -3
  213. package/src/components/CreateDialog/CreateSpaceDialog.tsx +3 -6
  214. package/src/components/MembersContainer.stories.tsx +5 -1
  215. package/src/components/MembersContainer.tsx +54 -80
  216. package/src/components/MenuFooter.tsx +2 -2
  217. package/src/components/{ObjectSettings → ObjectSettingsContainer}/AdvancedObjectSettings.tsx +2 -2
  218. package/src/components/{ObjectSettings → ObjectSettingsContainer}/BaseObjectSettings.tsx +2 -2
  219. package/src/components/{ObjectSettings → ObjectSettingsContainer}/ObjectSettingsContainer.tsx +4 -4
  220. package/src/components/PersistenceStatus.tsx +14 -11
  221. package/src/components/PopoverAddSpace.tsx +46 -0
  222. package/src/components/PopoverRenameObject.tsx +8 -14
  223. package/src/components/PopoverRenameSpace.tsx +0 -8
  224. package/src/components/ShareSpaceButton.stories.tsx +27 -0
  225. package/src/components/ShareSpaceButton.tsx +32 -0
  226. package/src/components/SpacePluginSettings.tsx +2 -27
  227. package/src/components/SpacePresence.stories.tsx +1 -1
  228. package/src/components/SpacePresence.tsx +65 -60
  229. package/src/components/SpaceSettings/{SpaceSettingsContainer.stories.tsx → SpacePropertiesForm.stories.tsx} +6 -6
  230. package/src/components/SpaceSettings/SpacePropertiesForm.tsx +136 -0
  231. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +39 -159
  232. package/src/components/SpaceSettings/index.ts +1 -0
  233. package/src/components/SyncStatus/InlineSyncStatus.tsx +24 -15
  234. package/src/components/SyncStatus/Space.tsx +133 -0
  235. package/src/components/SyncStatus/SyncStatus.tsx +69 -6
  236. package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +89 -0
  237. package/src/components/SyncStatus/sync-state.ts +101 -0
  238. package/src/components/index.ts +3 -2
  239. package/src/hooks/index.ts +0 -2
  240. package/src/hooks/usePath.ts +6 -9
  241. package/src/index.ts +0 -1
  242. package/src/translations.ts +7 -19
  243. package/src/types/collection.ts +4 -6
  244. package/src/types/thread.ts +8 -14
  245. package/src/types/types.ts +101 -115
  246. package/src/util.tsx +172 -75
  247. package/dist/lib/browser/app-graph-builder-7X3SIPCD.mjs +0 -328
  248. package/dist/lib/browser/app-graph-builder-7X3SIPCD.mjs.map +0 -7
  249. package/dist/lib/browser/app-graph-serializer-VRU57AEZ.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-43UQWMD3.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-AR5R2F6B.mjs +0 -88
  252. package/dist/lib/browser/chunk-AR5R2F6B.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-CY35NLWL.mjs +0 -296
  254. package/dist/lib/browser/chunk-CY35NLWL.mjs.map +0 -7
  255. package/dist/lib/browser/chunk-IQFFOAWD.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-UBSVH2NQ.mjs.map +0 -7
  257. package/dist/lib/browser/identity-created-ANRJHNMQ.mjs.map +0 -7
  258. package/dist/lib/browser/intent-resolver-KRINV5QI.mjs.map +0 -7
  259. package/dist/lib/browser/react-surface-J7T2IMH4.mjs.map +0 -7
  260. package/dist/lib/browser/schema-defs-OCBY7APN.mjs +0 -26
  261. package/dist/lib/browser/schema-defs-OCBY7APN.mjs.map +0 -7
  262. package/dist/lib/browser/schema-tools-MYC4LTQD.mjs.map +0 -7
  263. package/dist/lib/browser/settings-G24447B7.mjs.map +0 -7
  264. package/dist/lib/browser/spaces-ready-5I3RKYTT.mjs.map +0 -7
  265. package/dist/lib/browser/state-SI4B5GHC.mjs.map +0 -7
  266. package/dist/lib/node/app-graph-builder-C2ISDMSL.cjs +0 -328
  267. package/dist/lib/node/app-graph-builder-C2ISDMSL.cjs.map +0 -7
  268. package/dist/lib/node/app-graph-serializer-VLBCR3IX.cjs.map +0 -7
  269. package/dist/lib/node/chunk-5YHUQJVB.cjs.map +0 -7
  270. package/dist/lib/node/chunk-DQN4ZQDW.cjs +0 -119
  271. package/dist/lib/node/chunk-DQN4ZQDW.cjs.map +0 -7
  272. package/dist/lib/node/chunk-K6ZO4WDJ.cjs +0 -324
  273. package/dist/lib/node/chunk-K6ZO4WDJ.cjs.map +0 -7
  274. package/dist/lib/node/chunk-MXBE2VET.cjs.map +0 -7
  275. package/dist/lib/node/chunk-SCATWJKX.cjs.map +0 -7
  276. package/dist/lib/node/identity-created-NIPYGVG3.cjs.map +0 -7
  277. package/dist/lib/node/intent-resolver-MJVRY6YE.cjs.map +0 -7
  278. package/dist/lib/node/react-surface-RYKSYYKM.cjs.map +0 -7
  279. package/dist/lib/node/schema-defs-2HJLXSNK.cjs.map +0 -7
  280. package/dist/lib/node/schema-tools-OE3MFYYH.cjs.map +0 -7
  281. package/dist/lib/node/settings-AFWO4AWK.cjs.map +0 -7
  282. package/dist/lib/node/spaces-ready-BMPXSFHF.cjs.map +0 -7
  283. package/dist/lib/node/state-L2ZSDKLS.cjs.map +0 -7
  284. package/dist/lib/node-esm/app-graph-builder-WVCQZ324.mjs +0 -329
  285. package/dist/lib/node-esm/app-graph-builder-WVCQZ324.mjs.map +0 -7
  286. package/dist/lib/node-esm/app-graph-serializer-GEUYYXKD.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-5NIBYPVF.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-CLRCW6PU.mjs +0 -297
  289. package/dist/lib/node-esm/chunk-CLRCW6PU.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-FI3WV22Y.mjs.map +0 -7
  291. package/dist/lib/node-esm/chunk-HNKAG5CX.mjs +0 -90
  292. package/dist/lib/node-esm/chunk-HNKAG5CX.mjs.map +0 -7
  293. package/dist/lib/node-esm/chunk-S2W6HS4A.mjs.map +0 -7
  294. package/dist/lib/node-esm/identity-created-O5X2FFWU.mjs.map +0 -7
  295. package/dist/lib/node-esm/intent-resolver-JT6EB47M.mjs.map +0 -7
  296. package/dist/lib/node-esm/react-surface-ZNNMO7QQ.mjs.map +0 -7
  297. package/dist/lib/node-esm/schema-defs-B74N3GQ5.mjs +0 -27
  298. package/dist/lib/node-esm/schema-defs-B74N3GQ5.mjs.map +0 -7
  299. package/dist/lib/node-esm/schema-tools-YTJLA3NQ.mjs.map +0 -7
  300. package/dist/lib/node-esm/settings-MJVSCOI4.mjs.map +0 -7
  301. package/dist/lib/node-esm/spaces-ready-XKG57SL5.mjs.map +0 -7
  302. package/dist/lib/node-esm/state-QUDYGEU6.mjs.map +0 -7
  303. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  304. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  305. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  306. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  307. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  308. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  309. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  310. package/dist/types/src/components/SchemaContainer.d.ts +0 -13
  311. package/dist/types/src/components/SchemaContainer.d.ts.map +0 -1
  312. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +0 -7
  313. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +0 -1
  314. package/dist/types/src/hooks/useActiveSpace.d.ts +0 -4
  315. package/dist/types/src/hooks/useActiveSpace.d.ts.map +0 -1
  316. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +0 -14
  317. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +0 -1
  318. package/src/capabilities/schema-defs.ts +0 -30
  319. package/src/components/SchemaContainer.tsx +0 -59
  320. package/src/hooks/useActiveSpace.ts +0 -20
  321. package/src/hooks/useInputSurfaceLookup.tsx +0 -31
  322. /package/dist/lib/{browser/react-root-J3SP2HVW.mjs.map → node-esm/react-root-PRBJMWLQ.mjs.map} +0 -0
  323. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.d.ts +0 -0
  324. /package/dist/types/src/components/{ObjectSettings → ObjectSettingsContainer}/index.d.ts +0 -0
  325. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/ForeignKeys.tsx +0 -0
  326. /package/src/components/{ObjectSettings → ObjectSettingsContainer}/index.ts +0 -0
@@ -2,8 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
6
- import React, { forwardRef, useCallback, useEffect, useState } from 'react';
5
+ import React, { useCallback, useEffect, useState } from 'react';
7
6
 
8
7
  import { useAppGraph, useCapability } from '@dxos/app-framework';
9
8
  import { generateName } from '@dxos/display-name';
@@ -17,12 +16,10 @@ import {
17
16
  type Size,
18
17
  type ThemedClassName,
19
18
  Tooltip,
20
- Popover,
21
19
  useTranslation,
22
20
  List,
23
21
  ListItem,
24
22
  useDefaultValue,
25
- type DxAvatar,
26
23
  } from '@dxos/react-ui';
27
24
  import { AttentionGlyph, useAttended, useAttention, type AttentionGlyphProps } from '@dxos/react-ui-attention';
28
25
  import { ComplexMap, keyToFallback } from '@dxos/util';
@@ -117,38 +114,40 @@ export const FullPresence = (props: MemberPresenceProps) => {
117
114
  return (
118
115
  <div className='dx-avatar-group' data-testid='spacePlugin.presence'>
119
116
  {members.slice(0, 3).map((member, i) => (
120
- <Tooltip.Trigger
121
- key={member.identity.identityKey.toHex()}
122
- side='bottom'
123
- content={getName(member.identity)}
124
- className='grid focus:outline-none'
125
- >
126
- <PresenceAvatar
127
- identity={member.identity}
128
- match={member.currentlyAttended} // TODO(Zan): Match always true now we're showing 'members viewing current object'.
129
- index={members.length - i}
130
- onClick={() => onMemberClick?.(member)}
131
- size={size}
132
- />
133
- </Tooltip.Trigger>
117
+ <Tooltip.Root key={member.identity.identityKey.toHex()}>
118
+ <Tooltip.Trigger>
119
+ <PrensenceAvatar
120
+ identity={member.identity}
121
+ match={member.currentlyAttended} // TODO(Zan): Match always true now we're showing 'members viewing current object'.
122
+ index={members.length - i}
123
+ onClick={() => onMemberClick?.(member)}
124
+ size={size}
125
+ />
126
+ </Tooltip.Trigger>
127
+ <Tooltip.Portal>
128
+ <Tooltip.Content side='bottom'>
129
+ <span>{getName(member.identity)}</span>
130
+ <Tooltip.Arrow />
131
+ </Tooltip.Content>
132
+ </Tooltip.Portal>
133
+ </Tooltip.Root>
134
134
  ))}
135
135
 
136
136
  {members.length > 3 && (
137
- <Popover.Root>
138
- <Popover.Trigger className='grid focus:outline-none'>
137
+ <Tooltip.Root>
138
+ <Tooltip.Trigger>
139
139
  <Avatar.Root>
140
140
  {/* TODO(wittjosiah): Make text fit. */}
141
141
  <Avatar.Content
142
142
  status='inactive'
143
143
  style={{ zIndex: members.length - 4 }}
144
144
  fallback={`+${members.length - 3}`}
145
- size={size}
146
145
  />
147
146
  </Avatar.Root>
148
- </Popover.Trigger>
149
- <Popover.Portal>
150
- <Popover.Content side='bottom'>
151
- <Popover.Arrow />
147
+ </Tooltip.Trigger>
148
+ <Tooltip.Portal>
149
+ <Tooltip.Content side='bottom'>
150
+ <Tooltip.Arrow />
152
151
  <List classNames='max-h-56 overflow-y-auto'>
153
152
  {members.map((member) => (
154
153
  <ListItem.Root
@@ -158,13 +157,13 @@ export const FullPresence = (props: MemberPresenceProps) => {
158
157
  data-testid='identity-list-item'
159
158
  >
160
159
  {/* TODO(Zan): Match always true now we're showing 'members viewing current object'. */}
161
- <PresenceAvatar identity={member.identity} size={size} showName match={member.currentlyAttended} />
160
+ <PrensenceAvatar identity={member.identity} size={size} showName match={member.currentlyAttended} />
162
161
  </ListItem.Root>
163
162
  ))}
164
163
  </List>
165
- </Popover.Content>
166
- </Popover.Portal>
167
- </Popover.Root>
164
+ </Tooltip.Content>
165
+ </Tooltip.Portal>
166
+ </Tooltip.Root>
168
167
  )}
169
168
  </div>
170
169
  );
@@ -178,28 +177,26 @@ type PresenceAvatarProps = Pick<AvatarContentProps, 'size'> & {
178
177
  onClick?: () => void;
179
178
  };
180
179
 
181
- const PresenceAvatar = forwardRef<DxAvatar, PresenceAvatarProps>(
182
- ({ identity, showName, match, index, onClick, size }, forwardedRef) => {
183
- const status = match ? 'current' : 'active';
184
- const fallbackValue = keyToFallback(identity.identityKey);
185
- return (
186
- <Avatar.Root>
187
- <Avatar.Content
188
- status={status}
189
- hue={identity.profile?.data?.hue || fallbackValue.hue}
190
- data-testid='spacePlugin.presence.member'
191
- data-status={status}
192
- size={size}
193
- {...(index ? { style: { zIndex: index } } : {})}
194
- onClick={onClick}
195
- fallback={identity.profile?.data?.emoji || fallbackValue.emoji}
196
- ref={forwardedRef}
197
- />
198
- <Avatar.Label classNames={showName ? 'text-sm truncate pli-2' : 'sr-only'}>{getName(identity)}</Avatar.Label>
199
- </Avatar.Root>
200
- );
201
- },
202
- );
180
+ const PrensenceAvatar = ({ identity, showName, match, index, onClick, size }: PresenceAvatarProps) => {
181
+ const status = match ? 'current' : 'active';
182
+ const fallbackValue = keyToFallback(identity.identityKey);
183
+ return (
184
+ <Avatar.Root>
185
+ <Avatar.Content
186
+ status={status}
187
+ hue={identity.profile?.data?.hue || fallbackValue.hue}
188
+ data-testid='spacePlugin.presence.member'
189
+ data-status={status}
190
+ size={size}
191
+ classNames='mbs-2 mie-4'
192
+ {...(index ? { style: { zIndex: index } } : {})}
193
+ onClick={() => onClick?.()}
194
+ fallback={identity.profile?.data?.emoji || fallbackValue.emoji}
195
+ />
196
+ <Avatar.Label classNames={showName ? 'text-sm truncate pli-2' : 'sr-only'}>{getName(identity)}</Avatar.Label>
197
+ </Avatar.Root>
198
+ );
199
+ };
203
200
 
204
201
  export type SmallPresenceLiveProps = {
205
202
  id?: string;
@@ -218,7 +215,7 @@ export const SmallPresenceLive = ({ id, open, viewers }: SmallPresenceLiveProps)
218
215
  const attended = useAttended();
219
216
  const startOfAttention = attended.at(-1);
220
217
  const path = usePath(graph, startOfAttention);
221
- const containsAttended = !open && !isAttended && id && Option.isSome(path) ? path.value.includes(id) : false;
218
+ const containsAttended = !open && !isAttended && id && path ? path.includes(id) : false;
222
219
 
223
220
  const getActiveViewers = (viewers: ComplexMap<PublicKey, ObjectViewerProps>): ObjectViewerProps[] => {
224
221
  const moment = Date.now();
@@ -250,13 +247,21 @@ export const SmallPresence = ({ count = 0, attended, containsAttended }: SmallPr
250
247
  const { t } = useTranslation(SPACE_PLUGIN);
251
248
 
252
249
  return (
253
- <Tooltip.Trigger asChild content={t('presence label', { count })} side='bottom'>
254
- <AttentionGlyph
255
- attended={attended}
256
- containsAttended={containsAttended}
257
- presence={count > 1 ? 'many' : count === 1 ? 'one' : 'none'}
258
- classNames='self-center mie-1'
259
- />
260
- </Tooltip.Trigger>
250
+ <Tooltip.Root>
251
+ <Tooltip.Trigger asChild>
252
+ <AttentionGlyph
253
+ attended={attended}
254
+ containsAttended={containsAttended}
255
+ presence={count > 1 ? 'many' : count === 1 ? 'one' : 'none'}
256
+ classNames='self-center mie-1'
257
+ />
258
+ </Tooltip.Trigger>
259
+ <Tooltip.Portal>
260
+ <Tooltip.Content side='bottom'>
261
+ <span>{t('presence label', { count })}</span>
262
+ <Tooltip.Arrow />
263
+ </Tooltip.Content>
264
+ </Tooltip.Portal>
265
+ </Tooltip.Root>
261
266
  );
262
267
  };
@@ -10,21 +10,21 @@ import React from 'react';
10
10
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
11
  import { withTheme } from '@dxos/storybook-utils';
12
12
 
13
- import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
13
+ import { SpacePropertiesForm, type SpacePropertiesFormProps } from './SpacePropertiesForm';
14
14
  import translations from '../../translations';
15
15
 
16
- const Story = (args: Partial<SpaceSettingsContainerProps>) => {
16
+ const Story = (args: Partial<SpacePropertiesFormProps>) => {
17
17
  const { space } = useClientProvider();
18
18
  return (
19
19
  <div role='none' className='p-2 border border-primary-500 rounded'>
20
- <SpaceSettingsContainer {...args} space={space!} />
20
+ <SpacePropertiesForm {...args} space={space!} />
21
21
  </div>
22
22
  );
23
23
  };
24
24
 
25
25
  const meta: Meta = {
26
- title: 'plugins/plugin-space/SpaceSettingsContainer',
27
- component: SpaceSettingsContainer,
26
+ title: 'plugins/plugin-space/SpacePropertiesForm',
27
+ component: SpacePropertiesForm,
28
28
  render: Story,
29
29
  decorators: [withClientProvider({ createIdentity: true, createSpace: true }), withTheme],
30
30
  parameters: {
@@ -35,4 +35,4 @@ const meta: Meta = {
35
35
 
36
36
  export default meta;
37
37
 
38
- export const Default: StoryObj<typeof SpaceSettingsContainer> = {};
38
+ export const Default: StoryObj<typeof SpacePropertiesForm> = {};
@@ -0,0 +1,136 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Schema as S } from 'effect';
6
+ import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
+
8
+ import { log } from '@dxos/log';
9
+ import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
10
+ import { type Space } from '@dxos/react-client/echo';
11
+ import { Input, useTranslation } from '@dxos/react-ui';
12
+ import { Form, type InputComponent, ControlItem, ControlItemInput } from '@dxos/react-ui-form';
13
+ import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
14
+
15
+ import { SPACE_PLUGIN } from '../../meta';
16
+ import { SpaceForm } from '../../types';
17
+
18
+ export type SpacePropertiesFormProps = {
19
+ space: Space;
20
+ };
21
+
22
+ export const SpacePropertiesForm = ({ space }: SpacePropertiesFormProps) => {
23
+ const { t } = useTranslation(SPACE_PLUGIN);
24
+
25
+ const [edgeReplication, setEdgeReplication] = useState(
26
+ space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED,
27
+ );
28
+ const toggleEdgeReplication = useCallback(
29
+ async (next: boolean) => {
30
+ setEdgeReplication(next);
31
+ await space?.internal
32
+ .setEdgeReplicationPreference(next ? EdgeReplicationSetting.ENABLED : EdgeReplicationSetting.DISABLED)
33
+ .catch((err: unknown) => {
34
+ log.catch(err);
35
+ setEdgeReplication(!next);
36
+ });
37
+ },
38
+ [space],
39
+ );
40
+
41
+ const handleSave = useCallback(
42
+ (properties: S.Schema.Type<typeof SpaceForm>) => {
43
+ void toggleEdgeReplication(properties.edgeReplication);
44
+ if (properties.name !== space.properties.name) {
45
+ space.properties.name = properties.name;
46
+ }
47
+ if (properties.icon !== space.properties.icon) {
48
+ space.properties.icon = properties.icon;
49
+ }
50
+ if (properties.hue !== space.properties.hue) {
51
+ space.properties.hue = properties.hue;
52
+ }
53
+ },
54
+ [space, toggleEdgeReplication],
55
+ );
56
+
57
+ const values = useMemo(
58
+ () => ({
59
+ name: space.properties.name,
60
+ icon: space.properties.icon,
61
+ hue: space.properties.hue,
62
+ edgeReplication,
63
+ }),
64
+ [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication],
65
+ );
66
+
67
+ const customElements: Partial<Record<string, InputComponent>> = useMemo(
68
+ () => ({
69
+ name: ({ type, label, getValue, onValueChange }) => {
70
+ const handleChange = useCallback(
71
+ ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
72
+ [onValueChange, type],
73
+ );
74
+ return (
75
+ <ControlItemInput title={label} description={t('display name description')}>
76
+ <Input.TextInput
77
+ value={getValue()}
78
+ onChange={handleChange}
79
+ placeholder={t('display name input placeholder')}
80
+ classNames='min-is-64'
81
+ />
82
+ </ControlItemInput>
83
+ );
84
+ },
85
+ icon: ({ type, label, getValue, onValueChange }) => {
86
+ const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);
87
+ const handleEmojiReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
88
+ return (
89
+ <ControlItem title={label} description={t('icon description')}>
90
+ <IconPicker
91
+ value={getValue()}
92
+ onChange={handleChange}
93
+ onReset={handleEmojiReset}
94
+ classNames='justify-self-end'
95
+ iconSize={5}
96
+ />
97
+ </ControlItem>
98
+ );
99
+ },
100
+ hue: ({ type, label, getValue, onValueChange }) => {
101
+ const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
102
+ const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
103
+ return (
104
+ <ControlItem title={label} description={t('hue description')}>
105
+ <HuePicker
106
+ value={getValue()}
107
+ onChange={handleChange}
108
+ onReset={handleHueReset}
109
+ classNames='[--hue-preview-size:1.25rem] justify-self-end'
110
+ />
111
+ </ControlItem>
112
+ );
113
+ },
114
+ edgeReplication: ({ type, label, getValue, onValueChange }) => {
115
+ const handleChange = useCallback((checked: boolean) => onValueChange(type, checked), [onValueChange, type]);
116
+ return (
117
+ <ControlItemInput title={label} description={t('edge replication description')}>
118
+ <Input.Switch checked={getValue()} onCheckedChange={handleChange} classNames='justify-self-end' />
119
+ </ControlItemInput>
120
+ );
121
+ },
122
+ }),
123
+ [t],
124
+ );
125
+
126
+ return (
127
+ <Form
128
+ schema={SpaceForm}
129
+ values={values}
130
+ autoSave
131
+ onSave={handleSave}
132
+ Custom={customElements}
133
+ classNames='p-0 container-max-width [&_[role="form"]]:grid [&_[role="form"]]:grid-cols-1 md:[&_[role="form"]]:grid-cols-[1fr_min-content] [&_[role="form"]]:gap-4'
134
+ />
135
+ );
136
+ };
@@ -2,182 +2,62 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { pipe, Schema } from 'effect';
6
- import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
5
+ import React, { useCallback, useMemo } from 'react';
7
6
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
9
- import { log } from '@dxos/log';
10
- import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
- 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 {
15
- Form,
16
- type InputComponent,
17
- ControlItem,
18
- ControlItemInput,
19
- ControlSection,
20
- ControlPage,
21
- } from '@dxos/react-ui-form';
22
- import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
7
+ import { Surface, useCapabilities, useCapability } from '@dxos/app-framework';
8
+ import { type Space } from '@dxos/react-client/echo';
9
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
10
+ import { ControlSectionHeading } from '@dxos/react-ui-form';
11
+ import { Accordion } from '@dxos/react-ui-list';
23
12
  import { StackItem } from '@dxos/react-ui-stack';
13
+ import { byPosition } from '@dxos/util';
24
14
 
15
+ import { SpaceCapabilities } from '../../capabilities';
25
16
  import { SPACE_PLUGIN } from '../../meta';
26
- import { SpaceAction, SpaceForm } from '../../types';
27
17
 
28
- const FormSchema = SpaceForm.pipe(
29
- Schema.extend(Schema.Struct({ archived: Schema.Boolean.annotations({ title: 'Archive space' }) })),
30
- );
18
+ export const SPACE_SETTINGS_DIALOG = `${SPACE_PLUGIN}/SpaceSettingsDialog`;
19
+
20
+ export type SpaceSettingsTab = 'members' | 'settings';
31
21
 
32
22
  export type SpaceSettingsContainerProps = {
33
23
  space: Space;
34
24
  };
35
25
 
36
- // TODO(wittjosiah): Handle space migrations here?
37
26
  export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) => {
38
27
  const { t } = useTranslation(SPACE_PLUGIN);
39
- const { dispatchPromise: dispatch } = useIntentDispatcher();
40
- const client = useClient();
41
- const archived = useMulticastObservable(space.state) === SpaceState.SPACE_INACTIVE;
42
- const [edgeReplication, setEdgeReplication] = useState(
43
- space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED,
44
- );
45
- const toggleEdgeReplication = useCallback(
46
- async (next: boolean) => {
47
- setEdgeReplication(next);
48
- await space?.internal
49
- .setEdgeReplicationPreference(next ? EdgeReplicationSetting.ENABLED : EdgeReplicationSetting.DISABLED)
50
- .catch((err: unknown) => {
51
- log.catch(err);
52
- setEdgeReplication(!next);
53
- });
54
- },
55
- [space],
56
- );
28
+ const state = useCapability(SpaceCapabilities.MutableState);
29
+ const items = useCapabilities(SpaceCapabilities.SettingsSection).toSorted(byPosition);
30
+ const data = useMemo(() => ({ subject: space }), [space]);
57
31
 
58
- const handleSave = useCallback(
59
- (properties: Schema.Schema.Type<typeof FormSchema>) => {
60
- void toggleEdgeReplication(properties.edgeReplication);
61
- if (properties.name !== space.properties.name) {
62
- space.properties.name = properties.name;
63
- }
64
- if (properties.icon !== space.properties.icon) {
65
- space.properties.icon = properties.icon;
66
- }
67
- if (properties.hue !== space.properties.hue) {
68
- space.properties.hue = properties.hue;
69
- }
70
- if (properties.archived && !archived) {
71
- void dispatch(
72
- pipe(
73
- createIntent(SpaceAction.Close, { space }),
74
- chain(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: client.spaces.default.id }),
75
- ),
76
- );
77
- } else if (!properties.archived && archived) {
78
- void dispatch(createIntent(SpaceAction.Open, { space }));
79
- }
32
+ const handleOpenSectionChange = useCallback(
33
+ (sections: string[]) => {
34
+ state.spaceSettingsOpenSections.splice(0, state.spaceSettingsOpenSections.length, ...sections);
80
35
  },
81
- [space, toggleEdgeReplication, archived],
82
- );
83
-
84
- const values = useMemo(
85
- () => ({
86
- name: space.properties.name,
87
- icon: space.properties.icon,
88
- hue: space.properties.hue,
89
- edgeReplication,
90
- archived,
91
- }),
92
- [space.properties.name, space.properties.icon, space.properties.hue, edgeReplication, archived],
93
- );
94
-
95
- const customElements: Partial<Record<string, InputComponent>> = useMemo(
96
- () => ({
97
- name: ({ type, label, getValue, onValueChange }) => {
98
- const handleChange = useCallback(
99
- ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
100
- [onValueChange, type],
101
- );
102
- return (
103
- <ControlItemInput title={label} description={t('display name description')}>
104
- <Input.TextInput
105
- value={getValue()}
106
- onChange={handleChange}
107
- placeholder={t('display name input placeholder')}
108
- classNames='min-is-64'
109
- />
110
- </ControlItemInput>
111
- );
112
- },
113
- 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]);
116
- return (
117
- <ControlItem title={label} description={t('icon description')}>
118
- <IconPicker
119
- value={getValue()}
120
- onChange={handleChange}
121
- onReset={handleEmojiReset}
122
- classNames='justify-self-end'
123
- iconSize={5}
124
- />
125
- </ControlItem>
126
- );
127
- },
128
- hue: ({ type, label, getValue, onValueChange }) => {
129
- const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
130
- const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
131
- return (
132
- <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
- />
139
- </ControlItem>
140
- );
141
- },
142
- edgeReplication: ({ type, label, getValue, onValueChange }) => {
143
- const handleChange = useCallback((checked: boolean) => onValueChange(type, checked), [onValueChange, type]);
144
- return (
145
- <ControlItemInput title={label} description={t('edge replication description')}>
146
- <Input.Switch checked={getValue()} onCheckedChange={handleChange} classNames='justify-self-end' />
147
- </ControlItemInput>
148
- );
149
- },
150
- archived: ({ type, label, getValue, onValueChange }) => {
151
- const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
152
- return (
153
- <ControlItemInput title={label} description={t('archive space description')}>
154
- <Button disabled={space === client.spaces.default} onClick={handleChange}>
155
- {getValue() ? t('unarchive space label') : t('archive space label')}
156
- </Button>
157
- </ControlItemInput>
158
- );
159
- },
160
- }),
161
- [t, space],
36
+ [state],
162
37
  );
163
38
 
164
39
  return (
165
- <StackItem.Content classNames='block overflow-y-auto pli-2'>
166
- <ControlPage>
167
- <ControlSection
168
- title={t('space properties settings verbose label', { ns: SPACE_PLUGIN })}
169
- description={t('space properties settings description', { ns: SPACE_PLUGIN })}
170
- >
171
- <Form
172
- schema={FormSchema}
173
- values={values}
174
- autoSave
175
- onSave={handleSave}
176
- Custom={customElements}
177
- classNames='p-0 container-max-width [&_[role="form"]]:grid [&_[role="form"]]:grid-cols-1 md:[&_[role="form"]]:grid-cols-[1fr_min-content] [&_[role="form"]]:gap-4'
178
- />
179
- </ControlSection>
180
- </ControlPage>
40
+ <StackItem.Content classNames='p-2 block overflow-y-auto'>
41
+ <Accordion.Root<SpaceCapabilities.SettingsSection>
42
+ items={items}
43
+ value={state.spaceSettingsOpenSections}
44
+ onValueChange={handleOpenSectionChange}
45
+ >
46
+ {({ items }) => (
47
+ <>
48
+ {items.map((item) => (
49
+ <Accordion.Item key={item.id} item={item} classNames='container-max-width'>
50
+ <Accordion.ItemHeader classNames='pie-6' asChild>
51
+ <ControlSectionHeading title={toLocalizedString(item.label, t)} />
52
+ </Accordion.ItemHeader>
53
+ <Accordion.ItemBody>
54
+ <Surface role={`space-settings--${item.id}`} data={data} />
55
+ </Accordion.ItemBody>
56
+ </Accordion.Item>
57
+ ))}
58
+ </>
59
+ )}
60
+ </Accordion.Root>
181
61
  </StackItem.Content>
182
62
  );
183
63
  };
@@ -2,4 +2,5 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './SpacePropertiesForm';
5
6
  export * from './SpaceSettingsContainer';
@@ -2,23 +2,24 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
6
5
  import React, { useEffect, useState } from 'react';
7
6
 
8
7
  import { useAppGraph } from '@dxos/app-framework';
9
- import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
8
+ import { QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
10
9
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
10
  import { useClient } from '@dxos/react-client';
12
- import { type Space, useSpaceSyncState } from '@dxos/react-client/echo';
11
+ import { type Space } from '@dxos/react-client/echo';
13
12
  import { Tooltip, useTranslation } from '@dxos/react-ui';
14
13
  import { AttentionGlyph, useAttended, useAttention } from '@dxos/react-ui-attention';
15
14
 
15
+ import { useSpaceSyncState } from './sync-state';
16
16
  import { usePath } from '../../hooks';
17
17
  import { SPACE_PLUGIN } from '../../meta';
18
18
 
19
- const useEdgeStatus = (): EdgeStatus => {
20
- const [status, setStatus] = useState(EdgeStatus.NOT_CONNECTED);
19
+ const useEdgeStatus = (): QueryEdgeStatusResponse.EdgeStatus => {
20
+ const [status, setStatus] = useState(QueryEdgeStatusResponse.EdgeStatus.NOT_CONNECTED);
21
21
  const client = useClient();
22
+
22
23
  useEffect(() => {
23
24
  client.services.services.EdgeAgentService?.queryEdgeStatus().subscribe(({ status }) => {
24
25
  setStatus(status);
@@ -41,22 +42,30 @@ export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean
41
42
  const attended = useAttended();
42
43
  const startOfAttention = attended.at(-1);
43
44
  const path = usePath(graph, startOfAttention);
44
- const containsAttended = !open && !isAttended && id && Option.isSome(path) ? path.value.includes(id) : false;
45
+ const containsAttended = !open && !isAttended && id && path ? path.includes(id) : false;
45
46
 
46
- const connectedToEdge = useEdgeStatus() === EdgeStatus.CONNECTED;
47
+ const connectedToEdge = useEdgeStatus() === QueryEdgeStatusResponse.EdgeStatus.CONNECTED;
47
48
  // TODO(wittjosiah): This is not reactive.
48
49
  const edgeSyncEnabled = space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED;
49
50
  const syncState = useSpaceSyncState(space);
50
51
  const syncing = connectedToEdge && edgeSyncEnabled && syncState && syncState.missingOnLocal > 0;
51
52
 
52
53
  return (
53
- <Tooltip.Trigger asChild content={t('syncing label')} side='bottom'>
54
- <AttentionGlyph
55
- syncing={syncing}
56
- attended={isAttended}
57
- containsAttended={containsAttended}
58
- classNames='self-center mie-1'
59
- />
60
- </Tooltip.Trigger>
54
+ <Tooltip.Root>
55
+ <Tooltip.Trigger asChild>
56
+ <AttentionGlyph
57
+ syncing={syncing}
58
+ attended={isAttended}
59
+ containsAttended={containsAttended}
60
+ classNames='self-center mie-1'
61
+ />
62
+ </Tooltip.Trigger>
63
+ <Tooltip.Portal>
64
+ <Tooltip.Content side='bottom' classNames='z-[70]'>
65
+ <span>{t('syncing label')}</span>
66
+ <Tooltip.Arrow />
67
+ </Tooltip.Content>
68
+ </Tooltip.Portal>
69
+ </Tooltip.Root>
61
70
  );
62
71
  };