@dxos/plugin-space 0.10.0 → 0.11.1

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 (646) hide show
  1. package/PLUGIN.mdl +11 -0
  2. package/dist/lib/SpacePlugin.mjs +2 -0
  3. package/dist/lib/SpacePlugin.node.mjs +628 -0
  4. package/dist/lib/SpacePlugin.node.mjs.map +1 -0
  5. package/dist/lib/SpacePlugin.workerd.mjs +26 -0
  6. package/dist/lib/SpacePlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities/node.mjs +10 -0
  8. package/dist/lib/capabilities/node.mjs.map +1 -0
  9. package/dist/lib/capabilities.mjs +24 -0
  10. package/dist/lib/capabilities.mjs.map +1 -0
  11. package/dist/lib/chunk-CollectionArticle.mjs +90 -0
  12. package/dist/lib/chunk-CollectionArticle.mjs.map +1 -0
  13. package/dist/lib/chunk-CollectionSection.mjs +21 -0
  14. package/dist/lib/chunk-CollectionSection.mjs.map +1 -0
  15. package/dist/lib/chunk-CreateObjectDialog.mjs +178 -0
  16. package/dist/lib/chunk-CreateObjectDialog.mjs.map +1 -0
  17. package/dist/lib/chunk-CreateSpaceDialog.mjs +68 -0
  18. package/dist/lib/chunk-CreateSpaceDialog.mjs.map +1 -0
  19. package/dist/lib/chunk-DefaultProperties.mjs +59 -0
  20. package/dist/lib/chunk-DefaultProperties.mjs.map +1 -0
  21. package/dist/lib/chunk-ImportSpaceDialog.mjs +58 -0
  22. package/dist/lib/chunk-ImportSpaceDialog.mjs.map +1 -0
  23. package/dist/lib/chunk-InlineSyncStatus.mjs +37 -0
  24. package/dist/lib/chunk-InlineSyncStatus.mjs.map +1 -0
  25. package/dist/lib/chunk-JoinDialog.mjs +65 -0
  26. package/dist/lib/chunk-JoinDialog.mjs.map +1 -0
  27. package/dist/lib/chunk-MembersContainer.mjs +263 -0
  28. package/dist/lib/chunk-MembersContainer.mjs.map +1 -0
  29. package/dist/lib/chunk-MergePreview.mjs +91 -0
  30. package/dist/lib/chunk-MergePreview.mjs.map +1 -0
  31. package/dist/lib/chunk-ObjectCardStack.mjs +68 -0
  32. package/dist/lib/chunk-ObjectCardStack.mjs.map +1 -0
  33. package/dist/lib/chunk-RecordArticle.mjs +106 -0
  34. package/dist/lib/chunk-RecordArticle.mjs.map +1 -0
  35. package/dist/lib/chunk-RelatedArticle.mjs +71 -0
  36. package/dist/lib/chunk-RelatedArticle.mjs.map +1 -0
  37. package/dist/lib/chunk-RenamePopover.mjs +94 -0
  38. package/dist/lib/chunk-RenamePopover.mjs.map +1 -0
  39. package/dist/lib/chunk-SchemaContainer.mjs +53 -0
  40. package/dist/lib/chunk-SchemaContainer.mjs.map +1 -0
  41. package/dist/lib/chunk-SmallPresenceLive.mjs +2 -0
  42. package/dist/lib/chunk-SpaceHomeArticle.mjs +82 -0
  43. package/dist/lib/chunk-SpaceHomeArticle.mjs.map +1 -0
  44. package/dist/lib/chunk-SpaceHomeDashboard.mjs +96 -0
  45. package/dist/lib/chunk-SpaceHomeDashboard.mjs.map +1 -0
  46. package/dist/lib/chunk-SpaceHomeRecent.mjs +79 -0
  47. package/dist/lib/chunk-SpaceHomeRecent.mjs.map +1 -0
  48. package/dist/lib/chunk-SpacePlugin.mjs +97 -0
  49. package/dist/lib/chunk-SpacePlugin.mjs.map +1 -0
  50. package/dist/lib/chunk-SpacePresence.mjs +155 -0
  51. package/dist/lib/chunk-SpacePresence.mjs.map +1 -0
  52. package/dist/lib/chunk-SpaceSettings.mjs +63 -0
  53. package/dist/lib/chunk-SpaceSettings.mjs.map +1 -0
  54. package/dist/lib/chunk-SpaceSettingsContainer.mjs +278 -0
  55. package/dist/lib/chunk-SpaceSettingsContainer.mjs.map +1 -0
  56. package/dist/lib/chunk-SyncStatus.mjs +166 -0
  57. package/dist/lib/chunk-SyncStatus.mjs.map +1 -0
  58. package/dist/lib/chunk-TypeArticle.mjs +469 -0
  59. package/dist/lib/chunk-TypeArticle.mjs.map +1 -0
  60. package/dist/lib/chunk-ViewEditor.mjs +78 -0
  61. package/dist/lib/chunk-ViewEditor.mjs.map +1 -0
  62. package/dist/lib/chunk-add-object.mjs +74 -0
  63. package/dist/lib/chunk-add-object.mjs.map +1 -0
  64. package/dist/lib/chunk-add-relation.mjs +16 -0
  65. package/dist/lib/chunk-add-relation.mjs.map +1 -0
  66. package/dist/lib/chunk-add-type.mjs +41 -0
  67. package/dist/lib/chunk-add-type.mjs.map +1 -0
  68. package/dist/lib/chunk-app-graph-builder.mjs +1056 -0
  69. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  70. package/dist/lib/chunk-close.mjs +11 -0
  71. package/dist/lib/chunk-close.mjs.map +1 -0
  72. package/dist/lib/chunk-collection-path.mjs +65 -0
  73. package/dist/lib/chunk-collection-path.mjs.map +1 -0
  74. package/dist/lib/chunk-create-object.mjs +80 -0
  75. package/dist/lib/chunk-create-object.mjs.map +1 -0
  76. package/dist/lib/chunk-create.mjs +62 -0
  77. package/dist/lib/chunk-create.mjs.map +1 -0
  78. package/dist/lib/chunk-definitions.mjs +466 -0
  79. package/dist/lib/chunk-definitions.mjs.map +1 -0
  80. package/dist/lib/chunk-delete-field.mjs +52 -0
  81. package/dist/lib/chunk-delete-field.mjs.map +1 -0
  82. package/dist/lib/chunk-delete.mjs +11 -0
  83. package/dist/lib/chunk-delete.mjs.map +1 -0
  84. package/dist/lib/chunk-duplicate-object.mjs +11 -0
  85. package/dist/lib/chunk-duplicate-object.mjs.map +1 -0
  86. package/dist/lib/chunk-errors.mjs +10 -0
  87. package/dist/lib/chunk-errors.mjs.map +1 -0
  88. package/dist/lib/chunk-export-space.mjs +24 -0
  89. package/dist/lib/chunk-export-space.mjs.map +1 -0
  90. package/dist/lib/chunk-find-duplicates.mjs +19 -0
  91. package/dist/lib/chunk-find-duplicates.mjs.map +1 -0
  92. package/dist/lib/chunk-get-share-link.mjs +29 -0
  93. package/dist/lib/chunk-get-share-link.mjs.map +1 -0
  94. package/dist/lib/chunk-helpers.mjs +14 -0
  95. package/dist/lib/chunk-helpers.mjs.map +1 -0
  96. package/dist/lib/chunk-identity-created.mjs +26 -0
  97. package/dist/lib/chunk-identity-created.mjs.map +1 -0
  98. package/dist/lib/chunk-import-space.mjs +16 -0
  99. package/dist/lib/chunk-import-space.mjs.map +1 -0
  100. package/dist/lib/chunk-join.mjs +35 -0
  101. package/dist/lib/chunk-join.mjs.map +1 -0
  102. package/dist/lib/chunk-merge-duplicates.mjs +62 -0
  103. package/dist/lib/chunk-merge-duplicates.mjs.map +1 -0
  104. package/dist/lib/{neutral/chunk-5ZZS3KMK.mjs → chunk-meta.mjs} +15 -24
  105. package/dist/lib/chunk-meta.mjs.map +1 -0
  106. package/dist/lib/chunk-migrate.mjs +45 -0
  107. package/dist/lib/chunk-migrate.mjs.map +1 -0
  108. package/dist/lib/chunk-navigation-handler.mjs +63 -0
  109. package/dist/lib/chunk-navigation-handler.mjs.map +1 -0
  110. package/dist/lib/chunk-navigation-target-resolver.mjs +79 -0
  111. package/dist/lib/chunk-navigation-target-resolver.mjs.map +1 -0
  112. package/dist/lib/chunk-open-create-object.mjs +32 -0
  113. package/dist/lib/chunk-open-create-object.mjs.map +1 -0
  114. package/dist/lib/chunk-open-create-space.mjs +16 -0
  115. package/dist/lib/chunk-open-create-space.mjs.map +1 -0
  116. package/dist/lib/chunk-open-import-space.mjs +16 -0
  117. package/dist/lib/chunk-open-import-space.mjs.map +1 -0
  118. package/dist/lib/chunk-open-members.mjs +15 -0
  119. package/dist/lib/chunk-open-members.mjs.map +1 -0
  120. package/dist/lib/chunk-open-settings.mjs +15 -0
  121. package/dist/lib/chunk-open-settings.mjs.map +1 -0
  122. package/dist/lib/chunk-open.mjs +11 -0
  123. package/dist/lib/chunk-open.mjs.map +1 -0
  124. package/dist/lib/chunk-operation-handler.mjs +13 -0
  125. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  126. package/dist/lib/chunk-react-root.mjs +20 -0
  127. package/dist/lib/chunk-react-root.mjs.map +1 -0
  128. package/dist/lib/chunk-react-surface.mjs +384 -0
  129. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  130. package/dist/lib/chunk-remove-objects.mjs +83 -0
  131. package/dist/lib/chunk-remove-objects.mjs.map +1 -0
  132. package/dist/lib/chunk-rename-object.mjs +18 -0
  133. package/dist/lib/chunk-rename-object.mjs.map +1 -0
  134. package/dist/lib/chunk-rename.mjs +18 -0
  135. package/dist/lib/chunk-rename.mjs.map +1 -0
  136. package/dist/lib/chunk-repair.mjs +28 -0
  137. package/dist/lib/chunk-repair.mjs.map +1 -0
  138. package/dist/lib/chunk-restore-field.mjs +50 -0
  139. package/dist/lib/chunk-restore-field.mjs.map +1 -0
  140. package/dist/lib/chunk-restore-objects.mjs +33 -0
  141. package/dist/lib/chunk-restore-objects.mjs.map +1 -0
  142. package/dist/lib/chunk-settings.mjs +23 -0
  143. package/dist/lib/chunk-settings.mjs.map +1 -0
  144. package/dist/lib/chunk-share.mjs +23 -0
  145. package/dist/lib/chunk-share.mjs.map +1 -0
  146. package/dist/lib/chunk-snapshot.mjs +24 -0
  147. package/dist/lib/chunk-snapshot.mjs.map +1 -0
  148. package/dist/lib/chunk-spaces-ready.mjs +242 -0
  149. package/dist/lib/chunk-spaces-ready.mjs.map +1 -0
  150. package/dist/lib/chunk-state.mjs +48 -0
  151. package/dist/lib/chunk-state.mjs.map +1 -0
  152. package/dist/lib/chunk-types.mjs +56 -0
  153. package/dist/lib/chunk-types.mjs.map +1 -0
  154. package/dist/lib/chunk-undo-mappings.mjs +40 -0
  155. package/dist/lib/chunk-undo-mappings.mjs.map +1 -0
  156. package/dist/lib/chunk-util.mjs +34 -0
  157. package/dist/lib/chunk-util.mjs.map +1 -0
  158. package/dist/lib/chunk-wait-for-object.mjs +16 -0
  159. package/dist/lib/chunk-wait-for-object.mjs.map +1 -0
  160. package/dist/lib/components.mjs +329 -0
  161. package/dist/lib/components.mjs.map +1 -0
  162. package/dist/lib/{neutral/chunk-C2ULK22J.mjs → constants.mjs} +5 -10
  163. package/dist/lib/constants.mjs.map +1 -0
  164. package/dist/lib/containers.mjs +31 -0
  165. package/dist/lib/containers.mjs.map +1 -0
  166. package/dist/lib/hooks.mjs +185 -0
  167. package/dist/lib/hooks.mjs.map +1 -0
  168. package/dist/lib/index.mjs +7 -0
  169. package/dist/lib/meta.mjs +2 -0
  170. package/dist/lib/operations.mjs +8 -0
  171. package/dist/lib/operations.mjs.map +1 -0
  172. package/dist/lib/plugin.mjs +9 -0
  173. package/dist/lib/plugin.mjs.map +1 -0
  174. package/dist/lib/testing.mjs +2 -0
  175. package/dist/lib/translations.mjs +350 -0
  176. package/dist/lib/translations.mjs.map +1 -0
  177. package/dist/lib/types.mjs +60 -0
  178. package/dist/lib/types.mjs.map +1 -0
  179. package/dist/types/src/SpacePlugin.workerd.d.ts.map +1 -1
  180. package/dist/types/src/capabilities/SpaceFormFields.d.ts +10 -0
  181. package/dist/types/src/capabilities/SpaceFormFields.d.ts.map +1 -0
  182. package/dist/types/src/capabilities/SpaceSurfaces.d.ts +50 -0
  183. package/dist/types/src/capabilities/SpaceSurfaces.d.ts.map +1 -0
  184. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  185. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +6 -1
  186. package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -1
  187. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts +1 -1
  188. package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts.map +1 -1
  189. package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts +7 -1
  190. package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts.map +1 -1
  191. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts +2 -7
  192. package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts.map +1 -1
  193. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +3 -2
  194. package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -1
  195. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +5 -0
  196. package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -1
  197. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  198. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  199. package/dist/types/src/capabilities/index.d.ts +1 -1
  200. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  201. package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts +3 -1
  202. package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
  203. package/dist/types/src/capabilities/navigation-target-resolver.d.ts +5 -0
  204. package/dist/types/src/capabilities/navigation-target-resolver.d.ts.map +1 -0
  205. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  206. package/dist/types/src/capabilities/react-root.d.ts +1 -1
  207. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  208. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  209. package/dist/types/src/capabilities/repair.d.ts +1 -1
  210. package/dist/types/src/capabilities/settings.d.ts +1 -1
  211. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  212. package/dist/types/src/capabilities/state.d.ts +1 -1
  213. package/dist/types/src/capabilities/try-get-view.d.ts +7 -0
  214. package/dist/types/src/capabilities/try-get-view.d.ts.map +1 -0
  215. package/dist/types/src/capabilities/undo-mappings.d.ts +1 -1
  216. package/dist/types/src/collection-path.d.ts +28 -0
  217. package/dist/types/src/collection-path.d.ts.map +1 -0
  218. package/dist/types/src/collection-path.test.d.ts +2 -0
  219. package/dist/types/src/collection-path.test.d.ts.map +1 -0
  220. package/dist/types/src/commands/space/export/export.d.ts +23 -0
  221. package/dist/types/src/commands/space/export/export.d.ts.map +1 -0
  222. package/dist/types/src/commands/space/export/export.test.d.ts +2 -0
  223. package/dist/types/src/commands/space/export/export.test.d.ts.map +1 -0
  224. package/dist/types/src/commands/space/export/index.d.ts +2 -0
  225. package/dist/types/src/commands/space/export/index.d.ts.map +1 -0
  226. package/dist/types/src/commands/space/import/import.d.ts +17 -0
  227. package/dist/types/src/commands/space/import/import.d.ts.map +1 -0
  228. package/dist/types/src/commands/space/import/import.test.d.ts +2 -0
  229. package/dist/types/src/commands/space/import/import.test.d.ts.map +1 -0
  230. package/dist/types/src/commands/space/import/index.d.ts +2 -0
  231. package/dist/types/src/commands/space/import/index.d.ts.map +1 -0
  232. package/dist/types/src/commands/space/index.d.ts +8 -1
  233. package/dist/types/src/commands/space/index.d.ts.map +1 -1
  234. package/dist/types/src/components/AwaitingObject/AwaitingObject.d.ts.map +1 -1
  235. package/dist/types/src/components/SyncStatus/status.d.ts +7 -4
  236. package/dist/types/src/components/SyncStatus/status.d.ts.map +1 -1
  237. package/dist/types/src/components/SyncStatus/status.test.d.ts +2 -0
  238. package/dist/types/src/components/SyncStatus/status.test.d.ts.map +1 -0
  239. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +4 -4
  240. package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -1
  241. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts +4 -1
  242. package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts.map +1 -1
  243. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts +4 -1
  244. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
  245. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts +420 -9
  246. package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  247. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts +4 -1
  248. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
  249. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts +423 -10
  250. package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts.map +1 -1
  251. package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts +4 -1
  252. package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts.map +1 -1
  253. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts +5 -2
  254. package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -1
  255. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts +4 -1
  256. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
  257. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +423 -10
  258. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
  259. package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts +4 -1
  260. package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts.map +1 -1
  261. package/dist/types/src/containers/MergePreview/MergePreview.d.ts +16 -0
  262. package/dist/types/src/containers/MergePreview/MergePreview.d.ts.map +1 -0
  263. package/dist/types/src/containers/MergePreview/index.d.ts +2 -0
  264. package/dist/types/src/containers/MergePreview/index.d.ts.map +1 -0
  265. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts +3 -2
  266. package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts.map +1 -1
  267. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts +4 -1
  268. package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -1
  269. package/dist/types/src/containers/RecordArticle/RecordArticle.stories.d.ts.map +1 -1
  270. package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts +4 -1
  271. package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts.map +1 -1
  272. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts +4 -4
  273. package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts.map +1 -1
  274. package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts +4 -7
  275. package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts.map +1 -1
  276. package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts +7 -0
  277. package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts.map +1 -0
  278. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts +4 -11
  279. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts.map +1 -1
  280. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts +14 -0
  281. package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts.map +1 -0
  282. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts +15 -0
  283. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts.map +1 -0
  284. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts +20 -0
  285. package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts.map +1 -0
  286. package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts +2 -0
  287. package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts.map +1 -0
  288. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts +5 -8
  289. package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts.map +1 -1
  290. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts +7 -4
  291. package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -1
  292. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +419 -9
  293. package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
  294. package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts +4 -1
  295. package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts.map +1 -1
  296. package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts +423 -10
  297. package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts.map +1 -1
  298. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +419 -9
  299. package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
  300. package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts +7 -2
  301. package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts.map +1 -1
  302. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +434 -11
  303. package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  304. package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts +14 -0
  305. package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts.map +1 -0
  306. package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts +45 -0
  307. package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts.map +1 -0
  308. package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts +19 -0
  309. package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts.map +1 -0
  310. package/dist/types/src/containers/TypeArticle/index.d.ts +2 -0
  311. package/dist/types/src/containers/TypeArticle/index.d.ts.map +1 -0
  312. package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts +34 -0
  313. package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts.map +1 -0
  314. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts +4 -1
  315. package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -1
  316. package/dist/types/src/containers/index.d.ts +3 -2
  317. package/dist/types/src/containers/index.d.ts.map +1 -1
  318. package/dist/types/src/errors.d.ts +30 -0
  319. package/dist/types/src/errors.d.ts.map +1 -1
  320. package/dist/types/src/hooks/index.d.ts +2 -0
  321. package/dist/types/src/hooks/index.d.ts.map +1 -1
  322. package/dist/types/src/hooks/useEdgeStatus.d.ts +6 -0
  323. package/dist/types/src/hooks/useEdgeStatus.d.ts.map +1 -0
  324. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  325. package/dist/types/src/hooks/useStalled.d.ts +13 -0
  326. package/dist/types/src/hooks/useStalled.d.ts.map +1 -0
  327. package/dist/types/src/operations/create.d.ts.map +1 -1
  328. package/dist/types/src/operations/definitions.d.ts +29 -1
  329. package/dist/types/src/operations/definitions.d.ts.map +1 -1
  330. package/dist/types/src/operations/find-duplicates.d.ts +5 -0
  331. package/dist/types/src/operations/find-duplicates.d.ts.map +1 -0
  332. package/dist/types/src/operations/helpers.d.ts +3 -0
  333. package/dist/types/src/operations/helpers.d.ts.map +1 -1
  334. package/dist/types/src/operations/index.d.ts.map +1 -1
  335. package/dist/types/src/operations/join.d.ts.map +1 -1
  336. package/dist/types/src/operations/merge-duplicates.d.ts +5 -0
  337. package/dist/types/src/operations/merge-duplicates.d.ts.map +1 -0
  338. package/dist/types/src/operations/open-settings.d.ts.map +1 -1
  339. package/dist/types/src/operations/remove-objects.d.ts.map +1 -1
  340. package/dist/types/src/translations.d.ts +419 -9
  341. package/dist/types/src/translations.d.ts.map +1 -1
  342. package/dist/types/src/type-section-path.d.ts +22 -0
  343. package/dist/types/src/type-section-path.d.ts.map +1 -0
  344. package/dist/types/src/type-section-path.test.d.ts +2 -0
  345. package/dist/types/src/type-section-path.test.d.ts.map +1 -0
  346. package/dist/types/src/types/capabilities.d.ts +22 -2
  347. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  348. package/dist/types/src/types/surface.d.ts +4 -4
  349. package/dist/types/src/types/surface.d.ts.map +1 -1
  350. package/dist/types/src/types/types.d.ts +6 -0
  351. package/dist/types/src/types/types.d.ts.map +1 -1
  352. package/dist/types/tsconfig.tsbuildinfo +1 -1
  353. package/package.json +87 -72
  354. package/src/SpacePlugin.ts +6 -6
  355. package/src/SpacePlugin.workerd.ts +3 -1
  356. package/src/capabilities/SpaceFormFields.tsx +72 -0
  357. package/src/capabilities/SpaceSurfaces.tsx +219 -0
  358. package/src/capabilities/app-graph-builder/extensions/collections.ts +74 -21
  359. package/src/capabilities/app-graph-builder/extensions/companions.ts +10 -5
  360. package/src/capabilities/app-graph-builder/extensions/database.ts +64 -57
  361. package/src/capabilities/app-graph-builder/extensions/settings.ts +23 -13
  362. package/src/capabilities/app-graph-builder/extensions/shared.ts +3 -2
  363. package/src/capabilities/app-graph-builder/extensions/spaces.ts +6 -7
  364. package/src/capabilities/create-object.ts +1 -14
  365. package/src/capabilities/index.ts +4 -1
  366. package/src/capabilities/navigation-handler/navigation-handler.ts +27 -7
  367. package/src/capabilities/navigation-target-resolver.ts +77 -0
  368. package/src/capabilities/react-surface.ts +274 -0
  369. package/src/capabilities/spaces-ready.ts +31 -18
  370. package/src/capabilities/state.ts +3 -1
  371. package/src/capabilities/try-get-view.ts +24 -0
  372. package/src/collection-path.test.ts +161 -0
  373. package/src/collection-path.ts +97 -0
  374. package/src/commands/space/export/export.test.ts +68 -0
  375. package/src/commands/space/export/export.ts +118 -0
  376. package/src/commands/space/export/index.ts +5 -0
  377. package/src/commands/space/import/import.test.ts +80 -0
  378. package/src/commands/space/import/import.ts +65 -0
  379. package/src/commands/space/import/index.ts +5 -0
  380. package/src/commands/space/index.ts +16 -1
  381. package/src/components/AwaitingObject/AwaitingObject.tsx +10 -4
  382. package/src/components/CreateObjectPanel/CreateObjectPanel.tsx +16 -18
  383. package/src/components/SyncStatus/status.test.ts +49 -0
  384. package/src/components/SyncStatus/status.ts +25 -12
  385. package/src/containers/CollectionArticle/CollectionArticle.tsx +5 -3
  386. package/src/containers/CollectionSection/CollectionSection.tsx +2 -0
  387. package/src/containers/CreateObjectDialog/CreateObjectDialog.stories.tsx +18 -4
  388. package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +13 -17
  389. package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +28 -19
  390. package/src/containers/DefaultProperties/DefaultProperties.tsx +4 -2
  391. package/src/containers/ImportSpaceDialog/ImportSpaceDialog.tsx +4 -2
  392. package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +7 -17
  393. package/src/containers/JoinDialog/JoinDialog.tsx +5 -3
  394. package/src/containers/MembersContainer/MembersContainer.tsx +2 -0
  395. package/src/containers/MergePreview/MergePreview.tsx +90 -0
  396. package/src/containers/MergePreview/index.ts +5 -0
  397. package/src/containers/ObjectCardStack/ObjectCardStack.tsx +46 -43
  398. package/src/containers/RecordArticle/RecordArticle.stories.tsx +2 -1
  399. package/src/containers/RecordArticle/RecordArticle.tsx +8 -4
  400. package/src/containers/RelatedArticle/RelatedArticle.tsx +7 -3
  401. package/src/containers/RenamePopover/RenamePopover.tsx +2 -0
  402. package/src/containers/SchemaContainer/SchemaContainer.tsx +4 -17
  403. package/src/containers/SchemaContainer/use-query-space-types.ts +28 -0
  404. package/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.tsx +116 -0
  405. package/src/containers/SpaceHomeArticle/SpaceHomeArticle.tsx +6 -5
  406. package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.tsx +99 -0
  407. package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.tsx +109 -0
  408. package/src/containers/SpaceHomeDashboard/index.ts +5 -0
  409. package/src/containers/SpaceHomeRecent/SpaceHomeRecent.tsx +17 -15
  410. package/src/containers/SpacePresence/SpacePresence.stories.tsx +4 -4
  411. package/src/containers/SpacePresence/SpacePresence.tsx +37 -36
  412. package/src/containers/SpaceSettings/SpaceSettings.tsx +3 -1
  413. package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +7 -2
  414. package/src/containers/SyncStatus/SyncStatus.stories.tsx +80 -1
  415. package/src/containers/SyncStatus/SyncStatus.tsx +36 -46
  416. package/src/containers/TypeArticle/TypeArticle.stories.tsx +249 -0
  417. package/src/containers/TypeArticle/TypeArticle.tsx +362 -0
  418. package/src/containers/TypeArticle/duplicatesGroup.tsx +150 -0
  419. package/src/containers/TypeArticle/index.ts +5 -0
  420. package/src/containers/TypeArticle/useDuplicates.ts +119 -0
  421. package/src/containers/ViewEditor/ViewEditor.tsx +3 -1
  422. package/src/containers/index.ts +3 -2
  423. package/src/errors.ts +6 -0
  424. package/src/hooks/index.ts +2 -0
  425. package/src/hooks/useEdgeStatus.ts +40 -0
  426. package/src/hooks/useInputSurfaceLookup.tsx +5 -4
  427. package/src/hooks/useRelatedObjects.ts +1 -1
  428. package/src/hooks/useStalled.ts +39 -0
  429. package/src/operations/add-object.ts +7 -7
  430. package/src/operations/create.ts +11 -3
  431. package/src/operations/definitions.ts +54 -1
  432. package/src/operations/find-duplicates.ts +33 -0
  433. package/src/operations/get-share-link.ts +1 -1
  434. package/src/operations/helpers.ts +11 -0
  435. package/src/operations/index.ts +2 -0
  436. package/src/operations/join.ts +6 -5
  437. package/src/operations/merge-duplicates.ts +51 -0
  438. package/src/operations/open-members.ts +3 -3
  439. package/src/operations/open-settings.ts +5 -3
  440. package/src/operations/remove-objects.ts +42 -3
  441. package/src/translations.ts +52 -11
  442. package/src/type-section-path.test.ts +48 -0
  443. package/src/type-section-path.ts +39 -0
  444. package/src/types/capabilities.ts +26 -2
  445. package/src/types/surface.ts +4 -8
  446. package/src/types/types.ts +7 -0
  447. package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs +0 -93
  448. package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs.map +0 -7
  449. package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs +0 -19
  450. package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs.map +0 -7
  451. package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs +0 -221
  452. package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs.map +0 -7
  453. package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs +0 -61
  454. package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs.map +0 -7
  455. package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs +0 -58
  456. package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs.map +0 -7
  457. package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs +0 -64
  458. package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs.map +0 -7
  459. package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs +0 -49
  460. package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs.map +0 -7
  461. package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs +0 -97
  462. package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs.map +0 -7
  463. package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs +0 -231
  464. package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs.map +0 -7
  465. package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs +0 -33
  466. package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs.map +0 -7
  467. package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs +0 -55
  468. package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs.map +0 -7
  469. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs +0 -102
  470. package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs.map +0 -7
  471. package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs +0 -69
  472. package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs.map +0 -7
  473. package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs +0 -104
  474. package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs.map +0 -7
  475. package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs +0 -53
  476. package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs.map +0 -7
  477. package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs +0 -8
  478. package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs.map +0 -7
  479. package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs +0 -78
  480. package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs.map +0 -7
  481. package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs +0 -89
  482. package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs.map +0 -7
  483. package/dist/lib/neutral/SpacePlugin.mjs +0 -10
  484. package/dist/lib/neutral/SpacePlugin.mjs.map +0 -7
  485. package/dist/lib/neutral/SpacePlugin.node.mjs +0 -838
  486. package/dist/lib/neutral/SpacePlugin.node.mjs.map +0 -7
  487. package/dist/lib/neutral/SpacePlugin.workerd.mjs +0 -34
  488. package/dist/lib/neutral/SpacePlugin.workerd.mjs.map +0 -7
  489. package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs +0 -11
  490. package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs.map +0 -7
  491. package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs +0 -60
  492. package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs.map +0 -7
  493. package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs +0 -279
  494. package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs.map +0 -7
  495. package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs +0 -147
  496. package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs.map +0 -7
  497. package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs +0 -143
  498. package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs.map +0 -7
  499. package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs +0 -101
  500. package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs.map +0 -7
  501. package/dist/lib/neutral/add-object-H2N4AOQJ.mjs +0 -77
  502. package/dist/lib/neutral/add-object-H2N4AOQJ.mjs.map +0 -7
  503. package/dist/lib/neutral/add-relation-BGTLART5.mjs +0 -26
  504. package/dist/lib/neutral/add-relation-BGTLART5.mjs.map +0 -7
  505. package/dist/lib/neutral/add-type-JIDLRANR.mjs +0 -57
  506. package/dist/lib/neutral/add-type-JIDLRANR.mjs.map +0 -7
  507. package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs +0 -1332
  508. package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs.map +0 -7
  509. package/dist/lib/neutral/capabilities/index.mjs +0 -46
  510. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  511. package/dist/lib/neutral/capabilities/node.mjs +0 -15
  512. package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
  513. package/dist/lib/neutral/chunk-52ASDNRA.mjs +0 -41
  514. package/dist/lib/neutral/chunk-52ASDNRA.mjs.map +0 -7
  515. package/dist/lib/neutral/chunk-5ZZS3KMK.mjs.map +0 -7
  516. package/dist/lib/neutral/chunk-C2ULK22J.mjs.map +0 -7
  517. package/dist/lib/neutral/chunk-F5KLUP2P.mjs +0 -115
  518. package/dist/lib/neutral/chunk-F5KLUP2P.mjs.map +0 -7
  519. package/dist/lib/neutral/chunk-G2KHP7FX.mjs +0 -8
  520. package/dist/lib/neutral/chunk-G2KHP7FX.mjs.map +0 -7
  521. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  522. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  523. package/dist/lib/neutral/chunk-LMUG6PEJ.mjs +0 -572
  524. package/dist/lib/neutral/chunk-LMUG6PEJ.mjs.map +0 -7
  525. package/dist/lib/neutral/chunk-RAAHDTVF.mjs +0 -167
  526. package/dist/lib/neutral/chunk-RAAHDTVF.mjs.map +0 -7
  527. package/dist/lib/neutral/chunk-SPWAMXNR.mjs +0 -131
  528. package/dist/lib/neutral/chunk-SPWAMXNR.mjs.map +0 -7
  529. package/dist/lib/neutral/chunk-U5WTDOMV.mjs +0 -8
  530. package/dist/lib/neutral/chunk-U5WTDOMV.mjs.map +0 -7
  531. package/dist/lib/neutral/chunk-V7JALUM3.mjs +0 -9
  532. package/dist/lib/neutral/chunk-V7JALUM3.mjs.map +0 -7
  533. package/dist/lib/neutral/close-5WEQZRNK.mjs +0 -17
  534. package/dist/lib/neutral/close-5WEQZRNK.mjs.map +0 -7
  535. package/dist/lib/neutral/components/index.mjs +0 -401
  536. package/dist/lib/neutral/components/index.mjs.map +0 -7
  537. package/dist/lib/neutral/constants.mjs +0 -16
  538. package/dist/lib/neutral/constants.mjs.map +0 -7
  539. package/dist/lib/neutral/containers/index.mjs +0 -55
  540. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  541. package/dist/lib/neutral/create-QZ47FHQU.mjs +0 -75
  542. package/dist/lib/neutral/create-QZ47FHQU.mjs.map +0 -7
  543. package/dist/lib/neutral/create-object-ZU6FZW5X.mjs +0 -96
  544. package/dist/lib/neutral/create-object-ZU6FZW5X.mjs.map +0 -7
  545. package/dist/lib/neutral/delete-SPCU2VFM.mjs +0 -17
  546. package/dist/lib/neutral/delete-SPCU2VFM.mjs.map +0 -7
  547. package/dist/lib/neutral/delete-field-TAKJVEAD.mjs +0 -42
  548. package/dist/lib/neutral/delete-field-TAKJVEAD.mjs.map +0 -7
  549. package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs +0 -17
  550. package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs.map +0 -7
  551. package/dist/lib/neutral/export-space-S5SCAL4M.mjs +0 -34
  552. package/dist/lib/neutral/export-space-S5SCAL4M.mjs.map +0 -7
  553. package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs +0 -41
  554. package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs.map +0 -7
  555. package/dist/lib/neutral/hooks/index.mjs +0 -133
  556. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  557. package/dist/lib/neutral/identity-created-BEYMLBK4.mjs +0 -32
  558. package/dist/lib/neutral/identity-created-BEYMLBK4.mjs.map +0 -7
  559. package/dist/lib/neutral/import-space-LJQK3KT7.mjs +0 -28
  560. package/dist/lib/neutral/import-space-LJQK3KT7.mjs.map +0 -7
  561. package/dist/lib/neutral/index.mjs +0 -62
  562. package/dist/lib/neutral/index.mjs.map +0 -7
  563. package/dist/lib/neutral/join-FSODYIOC.mjs +0 -54
  564. package/dist/lib/neutral/join-FSODYIOC.mjs.map +0 -7
  565. package/dist/lib/neutral/meta.json +0 -1
  566. package/dist/lib/neutral/meta.mjs +0 -8
  567. package/dist/lib/neutral/meta.mjs.map +0 -7
  568. package/dist/lib/neutral/migrate-WHM6LU7L.mjs +0 -52
  569. package/dist/lib/neutral/migrate-WHM6LU7L.mjs.map +0 -7
  570. package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs +0 -44
  571. package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs.map +0 -7
  572. package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs +0 -82
  573. package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs.map +0 -7
  574. package/dist/lib/neutral/open-JCXTL3SK.mjs +0 -17
  575. package/dist/lib/neutral/open-JCXTL3SK.mjs.map +0 -7
  576. package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs +0 -42
  577. package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs.map +0 -7
  578. package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs +0 -24
  579. package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs.map +0 -7
  580. package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs +0 -24
  581. package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs.map +0 -7
  582. package/dist/lib/neutral/open-members-MLLBHKUU.mjs +0 -23
  583. package/dist/lib/neutral/open-members-MLLBHKUU.mjs.map +0 -7
  584. package/dist/lib/neutral/open-settings-DTPZF4U4.mjs +0 -23
  585. package/dist/lib/neutral/open-settings-DTPZF4U4.mjs.map +0 -7
  586. package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs +0 -13
  587. package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs.map +0 -7
  588. package/dist/lib/neutral/operations/index.mjs +0 -13
  589. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  590. package/dist/lib/neutral/plugin.mjs +0 -18
  591. package/dist/lib/neutral/plugin.mjs.map +0 -7
  592. package/dist/lib/neutral/react-root-YLYRCSAZ.mjs +0 -23
  593. package/dist/lib/neutral/react-root-YLYRCSAZ.mjs.map +0 -7
  594. package/dist/lib/neutral/react-surface-LRA7GIFN.mjs +0 -367
  595. package/dist/lib/neutral/react-surface-LRA7GIFN.mjs.map +0 -7
  596. package/dist/lib/neutral/remove-objects-WEO66EDS.mjs +0 -55
  597. package/dist/lib/neutral/remove-objects-WEO66EDS.mjs.map +0 -7
  598. package/dist/lib/neutral/rename-Q6UNCBIM.mjs +0 -26
  599. package/dist/lib/neutral/rename-Q6UNCBIM.mjs.map +0 -7
  600. package/dist/lib/neutral/rename-object-2UCEGU7U.mjs +0 -26
  601. package/dist/lib/neutral/rename-object-2UCEGU7U.mjs.map +0 -7
  602. package/dist/lib/neutral/repair-HMH476U3.mjs +0 -32
  603. package/dist/lib/neutral/repair-HMH476U3.mjs.map +0 -7
  604. package/dist/lib/neutral/restore-field-6CQAFOXY.mjs +0 -40
  605. package/dist/lib/neutral/restore-field-6CQAFOXY.mjs.map +0 -7
  606. package/dist/lib/neutral/restore-objects-3VINLP7C.mjs +0 -39
  607. package/dist/lib/neutral/restore-objects-3VINLP7C.mjs.map +0 -7
  608. package/dist/lib/neutral/settings-5IBSYBVU.mjs +0 -28
  609. package/dist/lib/neutral/settings-5IBSYBVU.mjs.map +0 -7
  610. package/dist/lib/neutral/share-A4WPILNF.mjs +0 -31
  611. package/dist/lib/neutral/share-A4WPILNF.mjs.map +0 -7
  612. package/dist/lib/neutral/snapshot-HBYMAPA7.mjs +0 -30
  613. package/dist/lib/neutral/snapshot-HBYMAPA7.mjs.map +0 -7
  614. package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs +0 -281
  615. package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs.map +0 -7
  616. package/dist/lib/neutral/state-KMH2NUAL.mjs +0 -55
  617. package/dist/lib/neutral/state-KMH2NUAL.mjs.map +0 -7
  618. package/dist/lib/neutral/testing.mjs +0 -8
  619. package/dist/lib/neutral/testing.mjs.map +0 -7
  620. package/dist/lib/neutral/translations.mjs +0 -315
  621. package/dist/lib/neutral/translations.mjs.map +0 -7
  622. package/dist/lib/neutral/types/index.mjs +0 -40
  623. package/dist/lib/neutral/types/index.mjs.map +0 -7
  624. package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs +0 -68
  625. package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs.map +0 -7
  626. package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs +0 -23
  627. package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs.map +0 -7
  628. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
  629. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  630. package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts +0 -6
  631. package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts.map +0 -1
  632. package/dist/types/src/containers/MenuFooter/index.d.ts +0 -2
  633. package/dist/types/src/containers/MenuFooter/index.d.ts.map +0 -1
  634. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts +0 -16
  635. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts.map +0 -1
  636. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts +0 -21
  637. package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts.map +0 -1
  638. package/dist/types/src/containers/TypeCollectionArticle/index.d.ts +0 -2
  639. package/dist/types/src/containers/TypeCollectionArticle/index.d.ts.map +0 -1
  640. package/src/capabilities/navigation-resolver.ts +0 -94
  641. package/src/capabilities/react-surface.tsx +0 -395
  642. package/src/containers/MenuFooter/MenuFooter.tsx +0 -33
  643. package/src/containers/MenuFooter/index.ts +0 -5
  644. package/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.tsx +0 -116
  645. package/src/containers/TypeCollectionArticle/TypeCollectionArticle.tsx +0 -162
  646. package/src/containers/TypeCollectionArticle/index.ts +0 -5
@@ -0,0 +1,249 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom } from '@effect-atom/atom';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Schema from 'effect/Schema';
9
+ import React from 'react';
10
+
11
+ import { Capabilities, Capability } from '@dxos/app-framework';
12
+ import { withPluginManager } from '@dxos/app-framework/testing';
13
+ import { useAtomCapability } from '@dxos/app-framework/ui';
14
+ import { AppCapabilities } from '@dxos/app-toolkit';
15
+ import { AppAnnotation } from '@dxos/app-toolkit';
16
+ import { Annotation, Collection, DXN, Obj, Ref, Type } from '@dxos/echo';
17
+ import { LabelAnnotation } from '@dxos/echo/Annotation';
18
+ import { organizationIdentitySpec, personIdentitySpec } from '@dxos/extractor-lib';
19
+ import { PublicKey } from '@dxos/keys';
20
+ import { ClientPlugin } from '@dxos/plugin-client/testing';
21
+ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
22
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
23
+ import { type Space, useSpaces } from '@dxos/react-client/echo';
24
+ import { Loading, withLayout } from '@dxos/react-ui/testing';
25
+ import { CardAnnotation } from '@dxos/schema';
26
+ import { Organization, Person } from '@dxos/types';
27
+ import { ComplexMap } from '@dxos/util';
28
+
29
+ import { translations } from '#translations';
30
+
31
+ import { SpaceOperationHandlerSet } from '../../operations';
32
+ import { SpaceCapabilities } from '../../types';
33
+ import { MergePreview } from '../MergePreview/MergePreview';
34
+ import { ObjectCardStack } from '../ObjectCardStack/ObjectCardStack';
35
+ import { TypeArticle } from './TypeArticle';
36
+
37
+ /**
38
+ * Type that opts in to a content preview card via `CardAnnotation`.
39
+ */
40
+ class CardType extends Type.makeObject<CardType>(DXN.make('org.dxos.type.test.cardType', '0.1.0'))(
41
+ Schema.Struct({
42
+ name: Schema.optional(Schema.String),
43
+ description: Schema.optional(Schema.String),
44
+ }).pipe(
45
+ LabelAnnotation.set(['name']),
46
+ Annotation.IconAnnotation.set({ icon: 'ph--cards--regular', hue: 'emerald' }),
47
+ CardAnnotation.set(true),
48
+ ),
49
+ ) {}
50
+
51
+ /**
52
+ * Seed people covering every branch of the duplicate scan:
53
+ * - Alice: three records sharing one address, in two different cases (email identity);
54
+ * - Bob: two records with no shared address, chained through a Google resource name (foreign-key
55
+ * identity) — the F2 case where mail sync and contacts sync each made their own Person;
56
+ * - the two role inboxes: same display name, different addresses — deliberately NOT duplicates;
57
+ * - Dana: unique, so the list always has a non-duplicate to compare against.
58
+ */
59
+ const GOOGLE = 'google.com/contacts';
60
+
61
+ const seedPeople = (space: Space) => {
62
+ // Stories create their space through the raw client API, which skips the space-plugin create flow;
63
+ // without a root collection `RemoveObjects` (the table's Delete button) fails its invariant. The
64
+ // collection is added before the annotation: `db.add` inside an `Obj.update` callback is a write
65
+ // during a write.
66
+ const rootCollection = space.db.add(Collection.make());
67
+ Obj.update(space.properties, (properties) => {
68
+ Annotation.set(properties, AppAnnotation.RootCollectionAnnotation, Ref.make(rootCollection));
69
+ });
70
+
71
+ space.db.add(
72
+ Person.make({
73
+ fullName: 'Alice Andrews',
74
+ emails: [{ value: 'alice@dxos.org' }],
75
+ }),
76
+ );
77
+ space.db.add(
78
+ Person.make({
79
+ fullName: 'Alice A.',
80
+ jobTitle: 'Engineer',
81
+ emails: [{ value: 'ALICE@dxos.org' }],
82
+ }),
83
+ );
84
+ space.db.add(
85
+ Person.make({
86
+ fullName: 'A. Andrews',
87
+ emails: [{ value: 'alice@dxos.org' }, { value: 'alice@personal.com' }],
88
+ phoneNumbers: [{ value: '+1 (415) 555-0100' }],
89
+ }),
90
+ );
91
+
92
+ space.db.add(
93
+ Person.make({
94
+ [Obj.Meta]: { keys: [{ source: GOOGLE, id: 'people/c1' }] },
95
+ fullName: 'Bob Brown',
96
+ emails: [{ value: 'bob@dxos.org' }],
97
+ }),
98
+ );
99
+ space.db.add(
100
+ Person.make({
101
+ [Obj.Meta]: { keys: [{ source: GOOGLE, id: 'people/c1' }] },
102
+ fullName: 'Robert Brown',
103
+ emails: [{ value: 'robert@personal.com' }],
104
+ notes: 'Synced from Google Contacts.',
105
+ }),
106
+ );
107
+
108
+ space.db.add(Person.make({ fullName: 'DXOS', emails: [{ value: 'no-reply@dxos.org' }] }));
109
+ space.db.add(Person.make({ fullName: 'DXOS via TestFlight', emails: [{ value: 'testflight@email.apple.com' }] }));
110
+ space.db.add(Person.make({ fullName: 'Dana Diaz', emails: [{ value: 'dana@example.com' }] }));
111
+
112
+ space.db.add(Organization.make({ name: 'DXOS', website: 'dxos.org' }));
113
+ };
114
+
115
+ type StoryArgs = {
116
+ type: Type.AnyObj;
117
+ count?: number;
118
+ };
119
+
120
+ const DefaultStory = ({ type }: StoryArgs) => {
121
+ const spaces = useSpaces();
122
+ const space = spaces[spaces.length - 1];
123
+ if (!space) {
124
+ return <Loading />;
125
+ }
126
+
127
+ return (
128
+ <div role='none' className='w-full grid grid-cols-2'>
129
+ <TypeArticle role='article' space={space} type={type} attendableId='story' />
130
+ <StoryCompanion space={space} type={type} />
131
+ </div>
132
+ );
133
+ };
134
+
135
+ /**
136
+ * Stand-in for the deck's Selected companion plank, mirroring the branch in `react-surface.tsx`:
137
+ * a staged merge takes the panel over, otherwise it shows the selected objects. Without it the
138
+ * merge preview has nowhere to render and the review cannot be walked end to end in a story.
139
+ */
140
+ const StoryCompanion = ({ space, type }: { space: Space; type: Type.AnyObj }) => {
141
+ const { mergePreview } = useAtomCapability(SpaceCapabilities.EphemeralState);
142
+ if (mergePreview?.typeUri === Type.getURI(type)) {
143
+ return <MergePreview type={type} spaceId={space.id} preview={mergePreview} />;
144
+ }
145
+
146
+ return <ObjectCardStack objectId={Type.getURI(type)} db={space.db} type={type} />;
147
+ };
148
+
149
+ /** Ephemeral state the toolbar and the merge preview read; normally contributed by `state.ts`. */
150
+ const ephemeralState = () =>
151
+ Atom.make<SpaceCapabilities.SpaceEphemeralState>({
152
+ awaiting: undefined,
153
+ sdkMigrationRunning: {},
154
+ navigableCollections: false,
155
+ viewersByObject: {},
156
+ viewersByIdentity: new ComplexMap<PublicKey, Set<string>>(PublicKey.hash),
157
+ mergePreview: undefined,
158
+ lastMergeAt: undefined,
159
+ }).pipe(Atom.keepAlive);
160
+
161
+ const meta = {
162
+ title: 'plugins/plugin-space/containers/TypeArticle',
163
+ render: DefaultStory,
164
+ decorators: [
165
+ withLayout({ layout: 'fullscreen' }),
166
+ withPluginManager<StoryArgs>(({ args: { count = 10 } }) => ({
167
+ capabilities: [
168
+ Capability.contributes(AppCapabilities.Translations, translations),
169
+ // The Duplicates tab is driven by real operations, so the story registers the handler set
170
+ // and the state atom the space plugin would normally contribute.
171
+ Capability.contributes(Capabilities.OperationHandler, SpaceOperationHandlerSet),
172
+ Capability.contributes(SpaceCapabilities.EphemeralState, ephemeralState()),
173
+ // plugin-inbox contributes these in the app (it owns the types this materialises); the story
174
+ // runs no plugins that would.
175
+ Capability.contributes(SpaceCapabilities.IdentitySpec, personIdentitySpec),
176
+ Capability.contributes(SpaceCapabilities.IdentitySpec, organizationIdentitySpec),
177
+ ],
178
+ plugins: [
179
+ ...corePlugins(),
180
+ StorybookPlugin({}),
181
+ PreviewPlugin(),
182
+ ClientPlugin({
183
+ types: [CardType, Collection.Collection, Person.Person, Organization.Organization],
184
+ onClientInitialized: ({ client }) =>
185
+ Effect.gen(function* () {
186
+ yield* Effect.promise(() => client.halo.createIdentity());
187
+ const space = yield* Effect.promise(() => client.spaces.create());
188
+ yield* Effect.promise(() => space.waitUntilReady());
189
+
190
+ seedPeople(space);
191
+ for (let i = 0; i < count; i++) {
192
+ space.db.add(
193
+ Obj.make(CardType, { name: `Card ${i + 1}`, description: `Preview body for card ${i + 1}.` }),
194
+ );
195
+ }
196
+
197
+ // The scan queries the space, so the seed must be indexed before the tab is opened.
198
+ yield* Effect.promise(() => space.db.flush({ indexes: true }));
199
+ }),
200
+ }),
201
+ ],
202
+ })),
203
+ ],
204
+ parameters: {
205
+ layout: 'fullscreen',
206
+ },
207
+ } satisfies Meta<typeof DefaultStory>;
208
+
209
+ export default meta;
210
+
211
+ type Story = StoryObj<typeof meta>;
212
+
213
+ export const Default: Story = {
214
+ args: {
215
+ type: CardType,
216
+ count: 8,
217
+ },
218
+ };
219
+
220
+ /**
221
+ * Person, whose identity rule (email + foreign key) is registered — so the toolbar offers the
222
+ * Duplicates tab. Selection and the merge preview both surface in the companion beside the article.
223
+ *
224
+ * Test:
225
+ * 1. Switch to the third toolbar tab (the copy icon). The filter is replaced by
226
+ * Merge / Skip / a `1 / 2` counter / arrows.
227
+ * 2. The masonry shows the first group only: the three Alice records (they share `alice@dxos.org`,
228
+ * one of them cased `ALICE@`).
229
+ * 3. Click a card. It becomes current and the companion shows its form. Click again to deselect.
230
+ * 4. Press the right arrow. The counter reads `2 / 2` and the two Bob records appear — they share
231
+ * no address, and are grouped only by the Google resource name on both.
232
+ * 5. Press the left arrow to return to group 1, then press Merge. The companion swaps to the merge
233
+ * preview: `fullName` is `Alice Andrews` (the oldest record wins), `jobTitle` is `Engineer`
234
+ * (filled from a later record), and `emails` lists `alice@dxos.org` once — lower-cased — plus
235
+ * `alice@personal.com`.
236
+ * 6. Edit `nickname` in the preview form, then press Confirm merge. The article returns to the
237
+ * scan, the counter reads `1 / 1`, and only the Bob group remains.
238
+ * 7. Switch to the Cards tab. There are now six people, not eight: one Alice carrying every merged
239
+ * field plus your nickname edit.
240
+ * 8. Switch to the Table tab and check two rows. A `Delete 2 objects` button appears in the
241
+ * toolbar.
242
+ * 9. Confirm the two role inboxes (`DXOS` and `DXOS via TestFlight`) were never offered as a
243
+ * group — same display name, different addresses, correctly left alone.
244
+ */
245
+ export const Duplicates: Story = {
246
+ args: {
247
+ type: Person.Person,
248
+ },
249
+ };
@@ -0,0 +1,362 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Option from 'effect/Option';
6
+ import React, { type PropsWithChildren, useCallback, useMemo, useState } from 'react';
7
+
8
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
9
+ import { GraphPath, LayoutOperation } from '@dxos/app-toolkit';
10
+ import { AppSurface } from '@dxos/app-toolkit/ui';
11
+ import { Filter, Obj, Type } from '@dxos/echo';
12
+ import { useObject, useQuery } from '@dxos/echo-react';
13
+ import { type Space } from '@dxos/react-client/echo';
14
+ import { Card, Focus, Icon, Panel, useTranslation } from '@dxos/react-ui';
15
+ import { useSelection, useSelectionActions } from '@dxos/react-ui-attention';
16
+ import { Empty } from '@dxos/react-ui-list';
17
+ import { Masonry } from '@dxos/react-ui-masonry';
18
+ import { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';
19
+ import { SearchList, useSearchListResults } from '@dxos/react-ui-search';
20
+ import { DynamicTable, type TableRowAction } from '@dxos/react-ui-table';
21
+ import { Tabs } from '@dxos/react-ui-tabs';
22
+ import { CardAnnotation } from '@dxos/schema';
23
+ import { getStyles, mx } from '@dxos/ui-theme';
24
+
25
+ import { meta } from '#meta';
26
+
27
+ import { SpaceOperation } from '../../operations';
28
+ import { useDuplicatesGroup } from './duplicatesGroup';
29
+ import { useDuplicates } from './useDuplicates';
30
+
31
+ /** Sidebar layout modes for a type article. */
32
+ type Layout = 'masonry' | 'table' | 'duplicates';
33
+
34
+ const LAYOUTS: { value: Layout; icon: string }[] = [
35
+ {
36
+ value: 'masonry',
37
+ icon: 'ph--squares-four--regular',
38
+ },
39
+ {
40
+ value: 'table',
41
+ icon: 'ph--table--regular',
42
+ },
43
+ {
44
+ value: 'duplicates',
45
+ icon: 'ph--copy--regular',
46
+ },
47
+ ];
48
+
49
+ export type TypeArticleProps = {
50
+ role?: string;
51
+ space: Space;
52
+ type: Type.AnyEntity;
53
+ attendableId: string;
54
+ };
55
+
56
+ /**
57
+ * List view rendered when a type node is selected: a toolbar with a Masonry/Table layout switch and a
58
+ * text filter over every object of the type. Selecting an item opens it as a sibling plank.
59
+ *
60
+ * Objects are not enumerated in the nav tree; each navigated object becomes a hidden child of the
61
+ * type node resolved on demand.
62
+ */
63
+ export const TypeArticle = ({ role, space, type, attendableId }: TypeArticleProps) => {
64
+ const { t } = useTranslation(meta.profile.key);
65
+ const { invokePromise } = useOperationInvoker();
66
+ const [layout, setLayout] = useState<Layout>('masonry');
67
+ const typeUri = Type.getURI(type);
68
+ const objects = useQuery(space.db, Filter.type(typeUri));
69
+
70
+ // Text filter over the object labels; feeds both the masonry tiles and the table rows.
71
+ const { results, handleSearch } = useSearchListResults<Obj.Unknown>({
72
+ items: objects,
73
+ extract: (object) => Obj.getLabel(object) ?? '',
74
+ });
75
+
76
+ // Selection is keyed by the type's own URI — the same id the 'selected-objects' companion resolves
77
+ // from its `companionTo` (see react-surface.tsx), so cards, table rows and the companion agree.
78
+ const selectedIds = useSelection(typeUri, 'multi');
79
+ const { multi: setSelectedObjects, toggle: toggleSelected } = useSelectionActions(typeUri);
80
+
81
+ // TODO(burdon): Factor out as an aspect?
82
+ const duplicates = useDuplicates({ space, type, objects, enabled: layout === 'duplicates' });
83
+ const duplicatesGroup = useDuplicatesGroup({
84
+ typeUri,
85
+ typename: Type.getTypename(type),
86
+ duplicates,
87
+ });
88
+
89
+ // Duplicates is offered only for types some plugin registered an identity rule for:
90
+ // there is nothing to scan otherwise.
91
+ const layouts = useMemo(
92
+ () => LAYOUTS.filter(({ value }) => value !== 'duplicates' || duplicates.spec),
93
+ [duplicates.spec],
94
+ );
95
+
96
+ const handleOpen = useCallback(
97
+ (object: Obj.Unknown) => {
98
+ const id = Obj.getURI(object);
99
+ void invokePromise(LayoutOperation.Select, { contextId: attendableId, subject: { mode: 'single', id } });
100
+ void invokePromise(LayoutOperation.Open, {
101
+ // Open under the node being viewed rather than the object's canonical type path, so an object
102
+ // reached from a type section opens within that section. Identical for a database type node,
103
+ // whose object path already is `<typeNode>/<id>`.
104
+ subject: [GraphPath.getCollectionObjectPath(attendableId, object.id)],
105
+ pivotId: attendableId,
106
+ disposition: 'add',
107
+ navigation: 'immediate',
108
+ });
109
+ },
110
+ [attendableId, invokePromise],
111
+ );
112
+
113
+ const handleDelete = useCallback((object: Obj.Unknown) => {
114
+ Obj.getDatabase(object)?.remove(object);
115
+ }, []);
116
+
117
+ // Undoable removal of every checked row, so a mis-click on a multi-row delete is recoverable.
118
+ const handleDeleteSelected = useCallback(() => {
119
+ const selected = objects.filter((object) => selectedIds.includes(object.id));
120
+ if (selected.length > 0) {
121
+ void invokePromise(SpaceOperation.RemoveObjects, { objects: selected }, { spaceId: space.id });
122
+ setSelectedObjects([]);
123
+ }
124
+ }, [objects, selectedIds, invokePromise, space.id, setSelectedObjects]);
125
+
126
+ // Stable identity: `DynamicTable` rebuilds its model whenever `features` changes, so an inline
127
+ // literal here would discard and re-seed the table's selection on every render.
128
+ const tableFeatures = useMemo(
129
+ () => ({
130
+ selection: { enabled: true, mode: 'multiple' as const },
131
+ dataEditable: true,
132
+ schemaEditable: false,
133
+ pinColumns: 1,
134
+ }),
135
+ [],
136
+ );
137
+
138
+ // Table rows are editable, so opening a row is a deliberate row action rather than `onRowClick`
139
+ // (which would fire on every cell click and fight with in-cell editing).
140
+ const rowActions = useMemo(
141
+ (): TableRowAction[] => [{ id: 'open', label: ['open-object.label', { ns: meta.profile.key }] }],
142
+ [],
143
+ );
144
+
145
+ const handleRowAction = useCallback(
146
+ (actionId: string, object: Obj.Unknown) => {
147
+ if (actionId === 'open') {
148
+ handleOpen(object);
149
+ }
150
+ },
151
+ [handleOpen],
152
+ );
153
+
154
+ // One action graph for the whole toolbar: the mode-specific actions first, then the layout toggle.
155
+ // Composing several `Toolbar.Root`s instead would each need their own roving-focus group and would
156
+ // fight over the row's width.
157
+ const menuActions = useMenuBuilder(
158
+ () =>
159
+ MenuBuilder.make()
160
+ .subgraph(layout === 'duplicates' && duplicatesGroup)
161
+ .subgraph(
162
+ layout === 'table' &&
163
+ selectedIds.length > 0 &&
164
+ ((builder) => {
165
+ builder.action(
166
+ 'delete-selected',
167
+ {
168
+ label: ['delete-selected.label', { ns: meta.profile.key, count: selectedIds.length }],
169
+ icon: 'ph--trash--regular',
170
+ },
171
+ handleDeleteSelected,
172
+ );
173
+ }),
174
+ )
175
+ .separator()
176
+ .group(
177
+ 'layout',
178
+ {
179
+ variant: 'toggleGroup',
180
+ selectCardinality: 'single',
181
+ value: layout,
182
+ label: ['layout.label', { ns: meta.profile.key }],
183
+ },
184
+ (group) => {
185
+ layouts.forEach(({ value, icon }) => {
186
+ group.action(value, { label: [`layout-${value}.label`, { ns: meta.profile.key }], icon }, () =>
187
+ setLayout(value),
188
+ );
189
+ });
190
+ },
191
+ )
192
+ .build(),
193
+ [layout, layouts, selectedIds.length, duplicatesGroup, handleDeleteSelected],
194
+ );
195
+
196
+ // The card grid backs two layouts — every object for `masonry`, only the group under review for
197
+ // `duplicates` — so the items are resolved here and the grid itself is declared once.
198
+ const tiles = layout === 'duplicates' ? duplicates.current : results;
199
+ const tileItems = useMemo<TileData[]>(
200
+ () =>
201
+ tiles.map((object) => ({
202
+ object,
203
+ current: selectedIds.includes(object.id),
204
+ onSelect: toggleSelected,
205
+ onOpen: handleOpen,
206
+ onDelete: Obj.getParent(object) ? undefined : handleDelete,
207
+ })),
208
+ [tiles, selectedIds, toggleSelected, handleOpen, handleDelete],
209
+ );
210
+
211
+ // A type with no objects at all has nothing for any layout to show; past that each layout says
212
+ // when it is empty for its own reason.
213
+ const noObjects = objects.length === 0 ? t('type-collection-empty.message') : undefined;
214
+ const noResults = noObjects ?? (results.length === 0 ? t('search-no-results.message') : undefined);
215
+ const noDuplicates =
216
+ noObjects ??
217
+ (duplicates.current.length === 0
218
+ ? duplicates.scanning
219
+ ? t('duplicates-scanning.message')
220
+ : t('duplicates-none.message')
221
+ : undefined);
222
+
223
+ return (
224
+ <SearchList.Root onSearch={handleSearch}>
225
+ <Tabs.Root asChild value={layout} onValueChange={(value) => setLayout(value as Layout)}>
226
+ <Panel.Root role={role}>
227
+ <Panel.Toolbar classNames={mx('grid', layout !== 'duplicates' && 'grid-cols-[1fr_auto]')}>
228
+ {layout !== 'duplicates' && <SearchList.Input placeholder={t('search-placeholder.label')} />}
229
+ <Menu.Root {...menuActions} attendableId={attendableId} alwaysActive>
230
+ <Menu.Toolbar />
231
+ </Menu.Root>
232
+ </Panel.Toolbar>
233
+ <Panel.Content>
234
+ <LayoutPanel value='masonry' empty={noResults}>
235
+ <Masonry.Root Tile={TileAdapter}>
236
+ <Masonry.Content>
237
+ <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />
238
+ </Masonry.Content>
239
+ </Masonry.Root>
240
+ </LayoutPanel>
241
+ <LayoutPanel value='table' empty={noResults}>
242
+ <DynamicTable
243
+ type={type}
244
+ rows={results}
245
+ features={tableFeatures}
246
+ rowActions={rowActions}
247
+ // Seed from the shared selection so switching card → table keeps what was selected;
248
+ // the table otherwise starts from its own empty model.
249
+ selection={selectedIds}
250
+ onRowAction={handleRowAction}
251
+ onSelectionChanged={setSelectedObjects}
252
+ />
253
+ </LayoutPanel>
254
+ {duplicates.spec && (
255
+ <LayoutPanel value='duplicates' empty={noDuplicates}>
256
+ <Masonry.Root Tile={TileAdapter}>
257
+ <Masonry.Content>
258
+ <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />
259
+ </Masonry.Content>
260
+ </Masonry.Root>
261
+ </LayoutPanel>
262
+ )}
263
+ </Panel.Content>
264
+ <Panel.Statusbar classNames='flex items-center p-1 border-t border-subdued-separator'>
265
+ {t('item-count.label', { count: tileItems.length })}
266
+ </Panel.Statusbar>
267
+ </Panel.Root>
268
+ </Tabs.Root>
269
+ </SearchList.Root>
270
+ );
271
+ };
272
+
273
+ /** One layout's content, or the message standing in for it when the layout has nothing to show. */
274
+ const LayoutPanel = ({ value, empty, children }: PropsWithChildren<{ value: Layout; empty?: string }>) => (
275
+ <Tabs.Panel value={value} classNames='contents'>
276
+ {empty ? <Empty classNames='h-full' label={empty} /> : children}
277
+ </Tabs.Panel>
278
+ );
279
+
280
+ type TileData = {
281
+ object: Obj.Unknown;
282
+ current: boolean;
283
+ onSelect: (id: string) => void;
284
+ onOpen: (object: Obj.Unknown) => void;
285
+ onDelete?: (object: Obj.Unknown) => void;
286
+ };
287
+
288
+ const TileAdapter = ({ data }: { data: TileData | undefined; index: number }) => {
289
+ if (!data?.object) {
290
+ return null;
291
+ }
292
+
293
+ return <ObjectTile {...data} />;
294
+ };
295
+
296
+ /** Selectable header-only card for a single object. */
297
+ const ObjectTile = ({ object, current, onSelect, onOpen, onDelete }: TileData) => {
298
+ const { t } = useTranslation(meta.profile.key);
299
+ // Subscribe so the label re-renders when the object changes.
300
+ const [live] = useObject(object);
301
+ const typename = Obj.getTypename(live);
302
+ const label =
303
+ Obj.getLabel(live) ||
304
+ t('object-name.placeholder', { ns: typename ?? meta.profile.key, defaultValue: t('object-name.placeholder') });
305
+
306
+ const iconAnnotation = Obj.getIcon(live);
307
+ const icon = iconAnnotation?.icon ?? 'ph--circle-dashed--regular';
308
+ const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : undefined;
309
+
310
+ // Render a content preview body only for types that opt in via `CardAnnotation`.
311
+ const type = Obj.getType(object);
312
+ const showCardContent = !!type && Option.getOrElse(CardAnnotation.get(Type.getSchema(type)), () => false);
313
+ const cardData = useMemo<AppSurface.ObjectCardData>(() => ({ subject: object }), [object]);
314
+
315
+ // `Focus.Item` calls `onCurrentChange` on click and on Enter. A card click toggles selection —
316
+ // the companion follows the selection, so navigating away on every click would fight the review
317
+ // workflow; opening stays available from the card menu.
318
+ const handleCurrentChange = useCallback(() => onSelect(object.id), [onSelect, object]);
319
+
320
+ const menuItems = useMemo(
321
+ () => [
322
+ {
323
+ icon: 'ph--arrow-square-out--regular',
324
+ label: t('open-object.label', {
325
+ ns: typename ?? meta.profile.key,
326
+ defaultValue: t('open-object.label'),
327
+ }),
328
+ onClick: () => onOpen(object),
329
+ },
330
+ ...(onDelete
331
+ ? [
332
+ {
333
+ icon: 'ph--trash--regular',
334
+ label: t('delete-object.label', {
335
+ ns: typename ?? meta.profile.key,
336
+ defaultValue: t('delete-object.label'),
337
+ }),
338
+ onClick: () => onDelete(object),
339
+ },
340
+ ]
341
+ : []),
342
+ ],
343
+ [t, typename, onOpen, onDelete, object],
344
+ );
345
+
346
+ return (
347
+ <Focus.Item asChild current={current} onCurrentChange={handleCurrentChange}>
348
+ <Card.Root fullWidth classNames={['dx-hover cursor-pointer', current && 'dx-current']}>
349
+ <Card.Header>
350
+ <Card.Block>
351
+ <Icon icon={icon} classNames={iconStyles?.text} />
352
+ </Card.Block>
353
+ <Card.Title>{label}</Card.Title>
354
+ {menuItems.length > 0 && <Card.Menu items={menuItems} />}
355
+ </Card.Header>
356
+ {showCardContent && <Surface.Surface type={AppSurface.CardContent} data={cardData} limit={1} />}
357
+ </Card.Root>
358
+ </Focus.Item>
359
+ );
360
+ };
361
+
362
+ TypeArticle.displayName = 'TypeArticle';