@dxos/plugin-space 0.7.5-labs.e27f9b9 → 0.7.5-main.2567c87

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 (177) hide show
  1. package/dist/lib/browser/{app-graph-builder-TTM2YZVS.mjs → app-graph-builder-F6XSETHX.mjs} +8 -10
  2. package/dist/lib/browser/app-graph-builder-F6XSETHX.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs → app-graph-serializer-FYJE23GN.mjs} +5 -5
  4. package/dist/lib/browser/{chunk-S5IGZNXJ.mjs → chunk-IZ7QKQ2E.mjs} +9 -14
  5. package/dist/lib/browser/chunk-IZ7QKQ2E.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-PQXZCNAU.mjs → chunk-SOXNANA6.mjs} +2 -3
  7. package/dist/lib/browser/{chunk-PQXZCNAU.mjs.map → chunk-SOXNANA6.mjs.map} +3 -3
  8. package/dist/lib/browser/{chunk-H2AR4OLP.mjs → chunk-SSJ772GK.mjs} +5 -9
  9. package/dist/lib/browser/chunk-SSJ772GK.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-ENRYFGYE.mjs → chunk-T36CIHPG.mjs} +3 -3
  11. package/dist/lib/browser/{chunk-RLZQJD47.mjs → chunk-UH5P4UL3.mjs} +2 -3
  12. package/dist/lib/browser/chunk-UH5P4UL3.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-YB3JWCPY.mjs → chunk-XXD33C4E.mjs} +250 -291
  14. package/dist/lib/browser/chunk-XXD33C4E.mjs.map +7 -0
  15. package/dist/lib/browser/{identity-created-VICTPQX7.mjs → identity-created-4Q4PFIC5.mjs} +3 -3
  16. package/dist/lib/browser/index.mjs +13 -14
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs +459 -0
  19. package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-root-YUF4IL5W.mjs → react-root-BDOPFJGJ.mjs} +6 -6
  22. package/dist/lib/browser/{react-surface-YIPKS26R.mjs → react-surface-EGOL2JBL.mjs} +33 -26
  23. package/dist/lib/browser/react-surface-EGOL2JBL.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-HN5UIYQO.mjs → settings-WF67QZSD.mjs} +3 -3
  25. package/dist/lib/browser/{spaces-ready-F57ITJDR.mjs → spaces-ready-WVU7US3C.mjs} +32 -31
  26. package/dist/lib/browser/spaces-ready-WVU7US3C.mjs.map +7 -0
  27. package/dist/lib/browser/{state-6DCY5YJP.mjs → state-MS4KYJWI.mjs} +3 -3
  28. package/dist/lib/browser/types/index.mjs +2 -4
  29. package/dist/lib/node/{app-graph-builder-6N4TEVHH.cjs → app-graph-builder-GKLVZ4PM.cjs} +56 -58
  30. package/dist/lib/node/app-graph-builder-GKLVZ4PM.cjs.map +7 -0
  31. package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs → app-graph-serializer-RMTU5YSC.cjs} +21 -21
  32. package/dist/lib/node/{chunk-UX3U4RU2.cjs → chunk-56NGXG2A.cjs} +8 -9
  33. package/dist/lib/node/chunk-56NGXG2A.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-MMXP2NHE.cjs → chunk-5D4RWKTV.cjs} +60 -65
  35. package/dist/lib/node/chunk-5D4RWKTV.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-HFBC3X66.cjs → chunk-AJRP7AD6.cjs} +251 -292
  37. package/dist/lib/node/chunk-AJRP7AD6.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-WZR6OAN3.cjs → chunk-AO4EW2RX.cjs} +5 -6
  39. package/dist/lib/node/{chunk-WZR6OAN3.cjs.map → chunk-AO4EW2RX.cjs.map} +3 -3
  40. package/dist/lib/node/{chunk-I2LRRRMV.cjs → chunk-UENH2YBM.cjs} +8 -8
  41. package/dist/lib/node/{chunk-SPCSJ2CY.cjs → chunk-YCBBGTFD.cjs} +9 -14
  42. package/dist/lib/node/chunk-YCBBGTFD.cjs.map +7 -0
  43. package/dist/lib/node/{identity-created-JNDKMFKI.cjs → identity-created-QQWX7WX3.cjs} +7 -7
  44. package/dist/lib/node/index.cjs +92 -93
  45. package/dist/lib/node/index.cjs.map +3 -3
  46. package/dist/lib/node/intent-resolver-3NI6AUAI.cjs +458 -0
  47. package/dist/lib/node/intent-resolver-3NI6AUAI.cjs.map +7 -0
  48. package/dist/lib/node/meta.json +1 -1
  49. package/dist/lib/node/{react-root-2WARZU2P.cjs → react-root-ZTR2J2I3.cjs} +12 -12
  50. package/dist/lib/node/{react-surface-QUY7D43M.cjs → react-surface-75KRPQYT.cjs} +76 -72
  51. package/dist/lib/node/react-surface-75KRPQYT.cjs.map +7 -0
  52. package/dist/lib/node/{settings-RBBL22DJ.cjs → settings-KOVSPA3S.cjs} +8 -8
  53. package/dist/lib/node/{spaces-ready-WHU4J6E5.cjs → spaces-ready-ILVGUHJH.cjs} +40 -39
  54. package/dist/lib/node/spaces-ready-ILVGUHJH.cjs.map +7 -0
  55. package/dist/lib/node/{state-WPZC4JXB.cjs → state-4UIOUKLJ.cjs} +8 -8
  56. package/dist/lib/node/types/index.cjs +16 -18
  57. package/dist/lib/node/types/index.cjs.map +2 -2
  58. package/dist/lib/node-esm/{app-graph-builder-MS6BI5EW.mjs → app-graph-builder-NEHQ5Z63.mjs} +8 -10
  59. package/dist/lib/node-esm/app-graph-builder-NEHQ5Z63.mjs.map +7 -0
  60. package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs → app-graph-serializer-UWWS5OVC.mjs} +5 -5
  61. package/dist/lib/node-esm/{chunk-LGL4A5B5.mjs → chunk-375RB3CZ.mjs} +2 -3
  62. package/dist/lib/node-esm/chunk-375RB3CZ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-77RE7Y5J.mjs → chunk-5QMAPAZD.mjs} +9 -14
  64. package/dist/lib/node-esm/chunk-5QMAPAZD.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs → chunk-7FUVU45N.mjs} +2 -3
  66. package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs.map → chunk-7FUVU45N.mjs.map} +3 -3
  67. package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs → chunk-E5DWIQ3N.mjs} +3 -3
  68. package/dist/lib/node-esm/{chunk-TIFAXTJ5.mjs → chunk-GVOPDPS2.mjs} +250 -291
  69. package/dist/lib/node-esm/chunk-GVOPDPS2.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-S6VAU6VJ.mjs → chunk-HTBGWQEU.mjs} +5 -9
  71. package/dist/lib/node-esm/chunk-HTBGWQEU.mjs.map +7 -0
  72. package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs → identity-created-HMNY2MPB.mjs} +3 -3
  73. package/dist/lib/node-esm/index.mjs +13 -14
  74. package/dist/lib/node-esm/index.mjs.map +3 -3
  75. package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs +460 -0
  76. package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs.map +7 -0
  77. package/dist/lib/node-esm/meta.json +1 -1
  78. package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs → react-root-OUPJA4RY.mjs} +6 -6
  79. package/dist/lib/node-esm/{react-surface-RH57RBYI.mjs → react-surface-7EVWCKIP.mjs} +33 -26
  80. package/dist/lib/node-esm/react-surface-7EVWCKIP.mjs.map +7 -0
  81. package/dist/lib/node-esm/{settings-VBAUB37B.mjs → settings-EDK6WI3V.mjs} +3 -3
  82. package/dist/lib/node-esm/{spaces-ready-ABADUX2P.mjs → spaces-ready-CH3W7OGN.mjs} +32 -31
  83. package/dist/lib/node-esm/spaces-ready-CH3W7OGN.mjs.map +7 -0
  84. package/dist/lib/node-esm/{state-5GH2D5U4.mjs → state-BMISGQ2O.mjs} +3 -3
  85. package/dist/lib/node-esm/types/index.mjs +2 -4
  86. package/dist/types/src/SpacePlugin.d.ts +1 -5
  87. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  89. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/capabilities.d.ts +0 -6
  91. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/index.d.ts +33 -34
  93. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -2
  95. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  98. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +3 -4
  99. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  100. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  101. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  102. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  103. package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
  104. package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
  105. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  106. package/dist/types/src/meta.d.ts +0 -1
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/types/types.d.ts +2 -5
  109. package/dist/types/src/types/types.d.ts.map +1 -1
  110. package/dist/types/src/util.d.ts.map +1 -1
  111. package/package.json +38 -39
  112. package/src/SpacePlugin.tsx +6 -11
  113. package/src/capabilities/app-graph-builder.ts +3 -4
  114. package/src/capabilities/capabilities.ts +1 -4
  115. package/src/capabilities/intent-resolver.ts +312 -410
  116. package/src/capabilities/react-surface.tsx +30 -22
  117. package/src/capabilities/spaces-ready.ts +21 -20
  118. package/src/components/AwaitingObject.tsx +5 -5
  119. package/src/components/CreateDialog/CreateObjectDialog.tsx +15 -15
  120. package/src/components/CreateDialog/CreateObjectPanel.tsx +114 -114
  121. package/src/components/CreateDialog/CreateSpaceDialog.tsx +8 -10
  122. package/src/components/JoinDialog.tsx +19 -27
  123. package/src/components/SpacePluginSettings.tsx +3 -3
  124. package/src/components/SpacePresence.stories.tsx +2 -2
  125. package/src/components/SpacePresence.tsx +3 -2
  126. package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +1 -16
  127. package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +4 -3
  128. package/src/components/SyncStatus/InlineSyncStatus.tsx +2 -2
  129. package/src/components/SyncStatus/SyncStatus.tsx +1 -2
  130. package/src/meta.ts +0 -1
  131. package/src/types/types.ts +3 -7
  132. package/src/util.tsx +4 -8
  133. package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +0 -7
  134. package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +0 -7
  135. package/dist/lib/browser/chunk-RLZQJD47.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-YB3JWCPY.mjs.map +0 -7
  138. package/dist/lib/browser/intent-resolver-SYYO26PR.mjs +0 -537
  139. package/dist/lib/browser/intent-resolver-SYYO26PR.mjs.map +0 -7
  140. package/dist/lib/browser/react-surface-YIPKS26R.mjs.map +0 -7
  141. package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +0 -7
  142. package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +0 -7
  143. package/dist/lib/node/chunk-HFBC3X66.cjs.map +0 -7
  144. package/dist/lib/node/chunk-MMXP2NHE.cjs.map +0 -7
  145. package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +0 -7
  146. package/dist/lib/node/chunk-UX3U4RU2.cjs.map +0 -7
  147. package/dist/lib/node/intent-resolver-2MFJV5A7.cjs +0 -536
  148. package/dist/lib/node/intent-resolver-2MFJV5A7.cjs.map +0 -7
  149. package/dist/lib/node/react-surface-QUY7D43M.cjs.map +0 -7
  150. package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +0 -7
  151. package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +0 -7
  152. package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +0 -7
  154. package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-TIFAXTJ5.mjs.map +0 -7
  156. package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs +0 -538
  157. package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs.map +0 -7
  158. package/dist/lib/node-esm/react-surface-RH57RBYI.mjs.map +0 -7
  159. package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +0 -7
  160. /package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs.map → app-graph-serializer-FYJE23GN.mjs.map} +0 -0
  161. /package/dist/lib/browser/{chunk-ENRYFGYE.mjs.map → chunk-T36CIHPG.mjs.map} +0 -0
  162. /package/dist/lib/browser/{identity-created-VICTPQX7.mjs.map → identity-created-4Q4PFIC5.mjs.map} +0 -0
  163. /package/dist/lib/browser/{react-root-YUF4IL5W.mjs.map → react-root-BDOPFJGJ.mjs.map} +0 -0
  164. /package/dist/lib/browser/{settings-HN5UIYQO.mjs.map → settings-WF67QZSD.mjs.map} +0 -0
  165. /package/dist/lib/browser/{state-6DCY5YJP.mjs.map → state-MS4KYJWI.mjs.map} +0 -0
  166. /package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs.map → app-graph-serializer-RMTU5YSC.cjs.map} +0 -0
  167. /package/dist/lib/node/{chunk-I2LRRRMV.cjs.map → chunk-UENH2YBM.cjs.map} +0 -0
  168. /package/dist/lib/node/{identity-created-JNDKMFKI.cjs.map → identity-created-QQWX7WX3.cjs.map} +0 -0
  169. /package/dist/lib/node/{react-root-2WARZU2P.cjs.map → react-root-ZTR2J2I3.cjs.map} +0 -0
  170. /package/dist/lib/node/{settings-RBBL22DJ.cjs.map → settings-KOVSPA3S.cjs.map} +0 -0
  171. /package/dist/lib/node/{state-WPZC4JXB.cjs.map → state-4UIOUKLJ.cjs.map} +0 -0
  172. /package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs.map → app-graph-serializer-UWWS5OVC.mjs.map} +0 -0
  173. /package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs.map → chunk-E5DWIQ3N.mjs.map} +0 -0
  174. /package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs.map → identity-created-HMNY2MPB.mjs.map} +0 -0
  175. /package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs.map → react-root-OUPJA4RY.mjs.map} +0 -0
  176. /package/dist/lib/node-esm/{settings-VBAUB37B.mjs.map → settings-EDK6WI3V.mjs.map} +0 -0
  177. /package/dist/lib/node-esm/{state-5GH2D5U4.mjs.map → state-BMISGQ2O.mjs.map} +0 -0
@@ -13,7 +13,6 @@ import {
13
13
  useCapabilities,
14
14
  usePluginManager,
15
15
  } from '@dxos/app-framework';
16
- import { SettingsStore } from '@dxos/local-storage';
17
16
  import { ClientCapabilities } from '@dxos/plugin-client';
18
17
  import {
19
18
  getSpace,
@@ -44,6 +43,7 @@ import {
44
43
  POPOVER_RENAME_SPACE,
45
44
  PopoverRenameObject,
46
45
  PopoverRenameSpace,
46
+ ShareSpaceButton,
47
47
  SmallPresenceLive,
48
48
  SPACE_SETTINGS_DIALOG,
49
49
  SpacePluginSettings,
@@ -56,6 +56,7 @@ import {
56
56
  } from '../components';
57
57
  import { SPACE_PLUGIN } from '../meta';
58
58
  import { CollectionType, type SpaceSettingsProps } from '../types';
59
+ import { COMPOSER_SPACE_LOCK } from '../util';
59
60
 
60
61
  type ReactSurfaceOptions = {
61
62
  createInvitationUrl: (invitationCode: string) => string;
@@ -80,7 +81,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
80
81
  createSurface({
81
82
  id: `${SPACE_PLUGIN}/collection-fallback`,
82
83
  role: 'article',
83
- position: 'fallback',
84
+ disposition: 'fallback',
84
85
  filter: (data): data is { subject: CollectionType } => data.subject instanceof CollectionType,
85
86
  component: ({ data }) => <CollectionMain collection={data.subject} />,
86
87
  }),
@@ -94,28 +95,28 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
94
95
  createSurface({
95
96
  id: `${SPACE_PLUGIN}/object-settings-base-panel`,
96
97
  role: 'complementary--settings',
97
- position: 'hoist',
98
+ disposition: 'hoist',
98
99
  filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
99
100
  component: ({ data }) => <BaseObjectSettings object={data.subject} />,
100
101
  }),
101
102
  createSurface({
102
103
  id: `${SPACE_PLUGIN}/object-settings-advanced-panel`,
103
104
  role: 'complementary--settings',
104
- position: 'fallback',
105
+ disposition: 'fallback',
105
106
  filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
106
107
  component: ({ data }) => <AdvancedObjectSettings object={data.subject} />,
107
108
  }),
108
109
  createSurface({
109
110
  id: SPACE_SETTINGS_DIALOG,
110
111
  role: 'dialog',
111
- filter: (data): data is { props: SpaceSettingsDialogProps } => data.component === SPACE_SETTINGS_DIALOG,
112
- component: ({ data }) => <SpaceSettingsDialog {...data.props} createInvitationUrl={createInvitationUrl} />,
112
+ filter: (data): data is { subject: SpaceSettingsDialogProps } => data.component === SPACE_SETTINGS_DIALOG,
113
+ component: ({ data }) => <SpaceSettingsDialog {...data.subject} createInvitationUrl={createInvitationUrl} />,
113
114
  }),
114
115
  createSurface({
115
116
  id: JOIN_DIALOG,
116
117
  role: 'dialog',
117
- filter: (data): data is { props: JoinPanelProps } => data.component === JOIN_DIALOG,
118
- component: ({ data }) => <JoinDialog {...data.props} />,
118
+ filter: (data): data is { subject: JoinPanelProps } => data.component === JOIN_DIALOG,
119
+ component: ({ data }) => <JoinDialog {...data.subject} />,
119
120
  }),
120
121
  createSurface({
121
122
  id: CREATE_SPACE_DIALOG,
@@ -126,7 +127,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
126
127
  createSurface({
127
128
  id: CREATE_OBJECT_DIALOG,
128
129
  role: 'dialog',
129
- filter: (data): data is { props: Partial<CreateObjectDialogProps> } => data.component === CREATE_OBJECT_DIALOG,
130
+ filter: (data): data is { subject: Partial<CreateObjectDialogProps> } => data.component === CREATE_OBJECT_DIALOG,
130
131
  component: ({ data }) => {
131
132
  const schemas = useCapabilities(ClientCapabilities.Schema).flat();
132
133
  const manager = usePluginManager();
@@ -141,21 +142,21 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
141
142
  [manager],
142
143
  );
143
144
 
144
- return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.props} />;
145
+ return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.subject} />;
145
146
  },
146
147
  }),
147
148
  createSurface({
148
149
  id: POPOVER_RENAME_SPACE,
149
150
  role: 'popover',
150
- filter: (data): data is { props: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.props),
151
- component: ({ data }) => <PopoverRenameSpace space={data.props} />,
151
+ filter: (data): data is { subject: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.subject),
152
+ component: ({ data }) => <PopoverRenameSpace space={data.subject} />,
152
153
  }),
153
154
  createSurface({
154
155
  id: POPOVER_RENAME_OBJECT,
155
156
  role: 'popover',
156
- filter: (data): data is { props: ReactiveEchoObject<any> } =>
157
- data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.props),
158
- component: ({ data }) => <PopoverRenameObject object={data.props} />,
157
+ filter: (data): data is { subject: ReactiveEchoObject<any> } =>
158
+ data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.subject),
159
+ component: ({ data }) => <PopoverRenameObject object={data.subject} />,
159
160
  }),
160
161
  createSurface({
161
162
  id: `${SPACE_PLUGIN}/navtree-presence`,
@@ -172,7 +173,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
172
173
  // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
173
174
  id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
174
175
  role: 'navtree-item-end',
175
- position: 'fallback',
176
+ disposition: 'fallback',
176
177
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
177
178
  component: ({ data }) => <SmallPresenceLive id={data.id} open={data.open} />,
178
179
  }),
@@ -185,7 +186,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
185
186
  createSurface({
186
187
  id: `${SPACE_PLUGIN}/navbar-presence`,
187
188
  role: 'navbar-end',
188
- position: 'hoist',
189
+ disposition: 'hoist',
189
190
  filter: (data): data is { subject: Space | ReactiveEchoObject<any> } =>
190
191
  isSpace(data.subject) || isEchoObject(data.subject),
191
192
  component: ({ data }) => {
@@ -196,7 +197,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
196
197
  : undefined
197
198
  : data.subject;
198
199
 
199
- return object ? <SpacePresence object={object} /> : null;
200
+ return space && object ? (
201
+ <>
202
+ <SpacePresence object={object} />
203
+ {space.properties[COMPOSER_SPACE_LOCK] ? null : <ShareSpaceButton space={space} />}
204
+ </>
205
+ ) : null;
200
206
  },
201
207
  }),
202
208
  createSurface({
@@ -207,10 +213,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
207
213
  }),
208
214
  createSurface({
209
215
  id: `${SPACE_PLUGIN}/settings`,
210
- role: 'article',
211
- filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
212
- data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
213
- component: ({ data: { subject } }) => <SpacePluginSettings settings={subject.value} />,
216
+ role: 'settings',
217
+ filter: (data): data is any => data.subject === SPACE_PLUGIN,
218
+ component: () => {
219
+ const settings = useCapability(Capabilities.SettingsStore).getStore<SpaceSettingsProps>(SPACE_PLUGIN)!.value;
220
+ return <SpacePluginSettings settings={settings} />;
221
+ },
214
222
  }),
215
223
  createSurface({
216
224
  id: `${SPACE_PLUGIN}/menu-footer`,
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes, createIntent, type PluginsContext, Capabilities, LayoutAction } from '@dxos/app-framework';
5
+ import { contributes, createIntent, openIds, type PluginsContext, Capabilities } from '@dxos/app-framework';
6
6
  import { EventSubscriptions } from '@dxos/async';
7
7
  import { Expando } from '@dxos/echo-schema';
8
8
  import { scheduledEffect } from '@dxos/echo-signals/core';
@@ -10,7 +10,6 @@ import { create } from '@dxos/live-object';
10
10
  import { log } from '@dxos/log';
11
11
  import { AttentionCapabilities } from '@dxos/plugin-attention';
12
12
  import { ClientCapabilities } from '@dxos/plugin-client';
13
- import { DeckCapabilities } from '@dxos/plugin-deck';
14
13
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
15
14
  import { PublicKey } from '@dxos/react-client';
16
15
  import { Filter, FQ_ID_LENGTH, parseFullyQualifiedId, SpaceState } from '@dxos/react-client/echo';
@@ -30,7 +29,7 @@ export default async (context: PluginsContext) => {
30
29
  const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
31
30
  const { graph } = context.requestCapability(Capabilities.AppGraph);
32
31
  const layout = context.requestCapability(Capabilities.Layout);
33
- const deck = context.requestCapability(DeckCapabilities.DeckState);
32
+ const location = context.requestCapability(Capabilities.Location);
34
33
  const attention = context.requestCapability(AttentionCapabilities.Attention);
35
34
  const state = context.requestCapability(SpaceCapabilities.MutableState);
36
35
  const client = context.requestCapability(ClientCapabilities.Client);
@@ -38,10 +37,6 @@ export default async (context: PluginsContext) => {
38
37
  const defaultSpace = client.spaces.default;
39
38
  await defaultSpace.waitUntilReady();
40
39
 
41
- if (deck.activeDeck === 'default') {
42
- await dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: defaultSpace.id }));
43
- }
44
-
45
40
  // Initialize space sharing lock in default space.
46
41
  if (typeof defaultSpace.properties[COMPOSER_SPACE_LOCK] !== 'boolean') {
47
42
  defaultSpace.properties[COMPOSER_SPACE_LOCK] = true;
@@ -59,18 +54,21 @@ export default async (context: PluginsContext) => {
59
54
  // Await missing objects.
60
55
  subscriptions.add(
61
56
  scheduledEffect(
62
- () => ({ active: layout.active }),
63
- ({ active }) => {
64
- if (active.length !== 1) {
57
+ () => ({
58
+ layoutMode: layout.layoutMode,
59
+ soloPart: location.active.solo?.[0],
60
+ }),
61
+ ({ layoutMode, soloPart }) => {
62
+ if (layoutMode !== 'solo' || !soloPart) {
65
63
  return;
66
64
  }
67
65
 
68
- const node = graph.findNode(active[0]);
69
- if (!node && active[0].length === FQ_ID_LENGTH) {
66
+ const node = graph.findNode(soloPart.id);
67
+ if (!node && soloPart.id.length === FQ_ID_LENGTH) {
70
68
  const timeout = setTimeout(async () => {
71
- const node = graph.findNode(active[0]);
69
+ const node = graph.findNode(soloPart.id);
72
70
  if (!node) {
73
- await dispatch(createIntent(SpaceAction.WaitForObject, { id: active[0] }));
71
+ await dispatch(createIntent(SpaceAction.WaitForObject, { id: soloPart.id }));
74
72
  }
75
73
  }, WAIT_FOR_OBJECT_TIMEOUT);
76
74
 
@@ -104,14 +102,17 @@ export default async (context: PluginsContext) => {
104
102
  // Broadcast active node to other peers in the space.
105
103
  subscriptions.add(
106
104
  scheduledEffect(
107
- () => ({ current: attention.current, active: layout.active, inactive: layout.inactive }),
108
- ({ current, active, inactive }) => {
105
+ () => ({
106
+ open: openIds(location.active, layout.layoutMode === 'solo' ? ['solo'] : ['main']),
107
+ closed: [...location.closed],
108
+ }),
109
+ ({ open, closed }) => {
109
110
  const send = () => {
110
111
  const spaces = client.spaces.get();
111
112
  const identity = client.halo.identity.get();
112
- if (identity) {
113
+ if (identity && location.active) {
113
114
  // Group parts by space for efficient messaging.
114
- const idsBySpace = reduceGroupBy(active, (id) => {
115
+ const idsBySpace = reduceGroupBy(open, (id) => {
115
116
  try {
116
117
  const [spaceId] = parseFullyQualifiedId(id);
117
118
  return spaceId;
@@ -120,7 +121,7 @@ export default async (context: PluginsContext) => {
120
121
  }
121
122
  });
122
123
 
123
- const removedBySpace = reduceGroupBy(inactive, (id) => {
124
+ const removedBySpace = reduceGroupBy(closed, (id) => {
124
125
  try {
125
126
  const [spaceId] = parseFullyQualifiedId(id);
126
127
  return spaceId;
@@ -146,7 +147,7 @@ export default async (context: PluginsContext) => {
146
147
  void space
147
148
  .postMessage('viewing', {
148
149
  identityKey: identity.identityKey.toHex(),
149
- attended: current,
150
+ attended: attention.current ? [...attention.current] : [],
150
151
  added,
151
152
  removed,
152
153
  })
@@ -5,7 +5,7 @@
5
5
  import { CheckCircle, CircleDashed, CircleNotch } from '@phosphor-icons/react';
6
6
  import React, { useCallback, useEffect, useState } from 'react';
7
7
 
8
- import { createIntent, LayoutAction, useIntentDispatcher, useLayout } from '@dxos/app-framework';
8
+ import { NavigationAction, useIntentDispatcher, createIntent, useCapability, Capabilities } from '@dxos/app-framework';
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import { Filter, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';
11
11
  import { Button, Toast, useTranslation } from '@dxos/react-ui';
@@ -23,7 +23,7 @@ export const AwaitingObject = ({ id }: { id: string }) => {
23
23
  const [found, setFound] = useState(false);
24
24
  const { t } = useTranslation(SPACE_PLUGIN);
25
25
  const { dispatchPromise: dispatch } = useIntentDispatcher();
26
- const layout = useLayout();
26
+ const location = useCapability(Capabilities.Location);
27
27
 
28
28
  const client = useClient();
29
29
  const objects = useQuery(client.spaces, Filter.all());
@@ -44,11 +44,11 @@ export const AwaitingObject = ({ id }: { id: string }) => {
44
44
  if (objects.findIndex((object) => fullyQualifiedId(object) === id) > -1) {
45
45
  setFound(true);
46
46
 
47
- if (layout.active.includes(id)) {
47
+ if (location.active.solo?.[0].id === id) {
48
48
  setOpen(false);
49
49
  }
50
50
  }
51
- }, [id, objects, layout]);
51
+ }, [id, objects, location]);
52
52
 
53
53
  const handleClose = useCallback(
54
54
  async () => dispatch(createIntent(SpaceAction.WaitForObject, { id: undefined })),
@@ -56,7 +56,7 @@ export const AwaitingObject = ({ id }: { id: string }) => {
56
56
  );
57
57
 
58
58
  const handleNavigate = useCallback(() => {
59
- void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [id] }));
59
+ void dispatch(createIntent(NavigationAction.Open, { activeParts: { main: [id] } }));
60
60
  void handleClose();
61
61
  }, [id, handleClose, dispatch]);
62
62
 
@@ -5,7 +5,7 @@
5
5
  import { pipe } from 'effect';
6
6
  import React, { useCallback, useRef } from 'react';
7
7
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { chain, createIntent, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import {
11
11
  getSpace,
@@ -71,7 +71,7 @@ export const CreateObjectDialog = ({
71
71
  const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
72
72
  const shouldNavigate = _shouldNavigate ?? (() => true);
73
73
  if (shouldNavigate(object)) {
74
- await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
74
+ await dispatch(pipe(addObjectIntent, chain(NavigationAction.Open, {})));
75
75
  } else {
76
76
  await dispatch(addObjectIntent);
77
77
  }
@@ -83,7 +83,7 @@ export const CreateObjectDialog = ({
83
83
  return (
84
84
  // TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
85
85
  // Consider factoring it out to the tabs package.
86
- <Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>
86
+ <Dialog.Content classNames='p-0 bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
87
87
  <div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
88
88
  <Dialog.Title>{t('create object dialog title')}</Dialog.Title>
89
89
  <Dialog.Close asChild>
@@ -92,18 +92,18 @@ export const CreateObjectDialog = ({
92
92
  </Button>
93
93
  </Dialog.Close>
94
94
  </div>
95
-
96
- <CreateObjectPanel
97
- classNames='p-4'
98
- schemas={schemas}
99
- spaces={spaces}
100
- target={target}
101
- typename={typename}
102
- name={name}
103
- defaultSpaceId={client.spaces.default.id}
104
- resolve={resolve}
105
- onCreateObject={handleCreateObject}
106
- />
95
+ <div className='p-4'>
96
+ <CreateObjectPanel
97
+ schemas={schemas}
98
+ spaces={spaces}
99
+ target={target}
100
+ typename={typename}
101
+ name={name}
102
+ defaultSpaceId={client.spaces.default.id}
103
+ resolve={resolve}
104
+ onCreateObject={handleCreateObject}
105
+ />
106
+ </div>
107
107
  </Dialog.Content>
108
108
  );
109
109
  };
@@ -5,18 +5,32 @@
5
5
  import React, { useCallback, useMemo, useState } from 'react';
6
6
 
7
7
  import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
8
- import { type TypedObject, getObjectAnnotation, type ObjectAnnotation, S } from '@dxos/echo-schema';
9
- import { type SpaceId, type Space } from '@dxos/react-client/echo';
10
- import { Icon, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
- import { Form, type InputProps } from '@dxos/react-ui-form';
8
+ import { type TypedObject, getObjectAnnotation, S } from '@dxos/echo-schema';
9
+ import { type SpaceId, type Space, isSpace } from '@dxos/react-client/echo';
10
+ import { Icon, IconButton, Input, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
+ import { Form, InputHeader, type InputProps } from '@dxos/react-ui-form';
12
12
  import { SearchList } from '@dxos/react-ui-searchlist';
13
- import { mx } from '@dxos/react-ui-theme';
14
13
  import { nonNullable, type MaybePromise } from '@dxos/util';
15
14
 
16
15
  import { SPACE_PLUGIN } from '../../meta';
17
16
  import { type CollectionType } from '../../types';
18
17
  import { getSpaceDisplayName } from '../../util';
19
18
 
19
+ export type CreateObjectPanelProps = {
20
+ schemas: TypedObject[];
21
+ spaces: Space[];
22
+ typename?: string;
23
+ target?: Space | CollectionType;
24
+ name?: string;
25
+ defaultSpaceId?: SpaceId;
26
+ resolve?: (typename: string) => Record<string, any>;
27
+ onCreateObject?: (params: {
28
+ schema: TypedObject;
29
+ target: Space | CollectionType;
30
+ data: Record<string, any>;
31
+ }) => MaybePromise<void>;
32
+ };
33
+
20
34
  // TODO(ZaymonFC): Move this if you find yourself needing it elsewhere.
21
35
  /**
22
36
  * Creates a surface input component based on plugin context.
@@ -27,7 +41,7 @@ const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
27
41
  const pluginManager = usePluginManager();
28
42
 
29
43
  return useCallback(
30
- ({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps }) => {
44
+ ({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps<any> }) => {
31
45
  const composedData = { prop, schema, ...baseData };
32
46
 
33
47
  if (!isSurfaceAvailable(pluginManager.context, { role: 'form-input', data: composedData })) {
@@ -40,23 +54,7 @@ const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
40
54
  );
41
55
  };
42
56
 
43
- export type CreateObjectPanelProps = ThemedClassName<{
44
- schemas: TypedObject[];
45
- spaces: Space[];
46
- typename?: string;
47
- target?: Space | CollectionType;
48
- name?: string;
49
- defaultSpaceId?: SpaceId;
50
- resolve?: (typename: string) => Record<string, any>;
51
- onCreateObject?: (params: {
52
- schema: TypedObject;
53
- target: Space | CollectionType;
54
- data: Record<string, any>;
55
- }) => MaybePromise<void>;
56
- }>;
57
-
58
57
  export const CreateObjectPanel = ({
59
- classNames,
60
58
  schemas,
61
59
  spaces,
62
60
  typename: initialTypename,
@@ -70,14 +68,10 @@ export const CreateObjectPanel = ({
70
68
  const [typename, setTypename] = useState<string | undefined>(initialTypename);
71
69
  const [target, setTarget] = useState<Space | CollectionType | undefined>(initialTarget);
72
70
  const schema = schemas.find((schema) => getObjectAnnotation(schema)?.typename === typename);
73
- const options: ObjectAnnotation[] = schemas
74
- .map(getObjectAnnotation)
75
- .filter(nonNullable)
76
- .sort((a, b) => {
77
- const nameA = t('typename label', { ns: a.typename, defaultValue: a.typename });
78
- const nameB = t('typename label', { ns: b.typename, defaultValue: b.typename });
79
- return nameA.localeCompare(nameB);
80
- });
71
+ const options = schemas.map(getObjectAnnotation).filter(nonNullable);
72
+
73
+ const handleClearSchema = useCallback(() => setTypename(undefined), []);
74
+ const handleClearTarget = useCallback(() => setTarget(undefined), []);
81
75
 
82
76
  const handleCreateObject = useCallback(
83
77
  async (props: Record<string, any>) => {
@@ -96,89 +90,8 @@ export const CreateObjectPanel = ({
96
90
  return resolve?.(typename);
97
91
  }, [resolve, typename]);
98
92
 
99
- const inputSurfaceLookup = useInputSurfaceLookup({ target });
100
-
101
- const form = useMemo(() => {
102
- // TODO(ZaymonFC): Move this default object creation schema somewhere?
103
- const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
104
-
105
- return (
106
- <Form
107
- classNames='!p-0'
108
- autoFocus
109
- values={{ name: initialName }}
110
- schema={schema}
111
- testId='create-object-form'
112
- onSave={handleCreateObject}
113
- lookupComponent={inputSurfaceLookup}
114
- />
115
- );
116
- }, [initialName, handleCreateObject, metadata]);
117
-
118
- // TODO(wittjosiah): These inputs should be rolled into a `Form` once it supports the necessary variants.
119
- return (
120
- <div role='form' className={mx('flex flex-col gap-2', classNames)}>
121
- {!schema ? (
122
- <SelectSchema options={options} resolve={resolve} onChange={setTypename} />
123
- ) : !target ? (
124
- <SelectSpace spaces={spaces} defaultSpaceId={defaultSpaceId} onChange={setTarget} />
125
- ) : (
126
- form
127
- )}
128
- </div>
129
- );
130
- };
131
-
132
- const SelectSpace = ({
133
- spaces,
134
- defaultSpaceId,
135
- onChange,
136
- }: { onChange: (space: Space) => void } & Pick<CreateObjectPanelProps, 'spaces' | 'defaultSpaceId'>) => {
137
- const { t } = useTranslation(SPACE_PLUGIN);
138
-
139
- return (
140
- <SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
141
- <SearchList.Input
142
- autoFocus
143
- data-testid='create-object-form.space-input'
144
- placeholder={t('space input placeholder')}
145
- classNames='px-1 my-2'
146
- />
147
- <SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
148
- {spaces
149
- .sort((a, b) => {
150
- const aName = toLocalizedString(getSpaceDisplayName(a, { personal: a.id === defaultSpaceId }), t);
151
- const bName = toLocalizedString(getSpaceDisplayName(b, { personal: b.id === defaultSpaceId }), t);
152
- return aName.localeCompare(bName);
153
- })
154
- .map((space) => (
155
- <SearchList.Item
156
- key={space.id}
157
- value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
158
- onSelect={() => onChange(space)}
159
- classNames='flex items-center gap-2'
160
- >
161
- <span className='grow truncate'>
162
- {toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
163
- </span>
164
- </SearchList.Item>
165
- ))}
166
- </SearchList.Content>
167
- </SearchList.Root>
168
- );
169
- };
170
-
171
- const SelectSchema = ({
172
- options,
173
- resolve,
174
- onChange,
175
- }: {
176
- options: ObjectAnnotation[];
177
- onChange: (type: string) => void;
178
- } & Pick<CreateObjectPanelProps, 'resolve'>) => {
179
- const { t } = useTranslation(SPACE_PLUGIN);
180
-
181
- return (
93
+ // TODO(wittjosiah): All of these inputs should be rolled into a `Form` once it supports the necessary variants.
94
+ const schemaInput = (
182
95
  <SearchList.Root label={t('schema input label')} classNames='flex flex-col grow overflow-hidden'>
183
96
  <SearchList.Input
184
97
  autoFocus
@@ -191,7 +104,7 @@ const SelectSchema = ({
191
104
  <SearchList.Item
192
105
  key={option.typename}
193
106
  value={t('typename label', { ns: option.typename, defaultValue: option.typename })}
194
- onSelect={() => onChange(option.typename)}
107
+ onSelect={() => setTypename(option.typename)}
195
108
  classNames='flex items-center gap-2'
196
109
  >
197
110
  <span className='flex gap-2 items-center grow truncate'>
@@ -203,4 +116,91 @@ const SelectSchema = ({
203
116
  </SearchList.Content>
204
117
  </SearchList.Root>
205
118
  );
119
+
120
+ const spaceInput = (
121
+ <SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
122
+ <SearchList.Input
123
+ autoFocus
124
+ data-testid='create-object-form.space-input'
125
+ placeholder={t('space input placeholder')}
126
+ classNames='px-1 my-2'
127
+ />
128
+ <SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
129
+ {spaces.map((space) => (
130
+ <SearchList.Item
131
+ key={space.id}
132
+ value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
133
+ onSelect={() => setTarget(space)}
134
+ classNames='flex items-center gap-2'
135
+ >
136
+ <span className='grow truncate'>
137
+ {toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
138
+ </span>
139
+ </SearchList.Item>
140
+ ))}
141
+ </SearchList.Content>
142
+ </SearchList.Root>
143
+ );
144
+
145
+ const inputSurfaceLookup = useInputSurfaceLookup({ target });
146
+
147
+ const form = useMemo(() => {
148
+ // TODO(ZaymonFC): Move this default object creation schema somewhere?
149
+ const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
150
+
151
+ return (
152
+ <Form
153
+ autoFocus
154
+ values={{ name: initialName }}
155
+ schema={schema}
156
+ testId='create-object-form'
157
+ onSave={handleCreateObject}
158
+ lookupComponent={inputSurfaceLookup}
159
+ />
160
+ );
161
+ }, [initialName, handleCreateObject, metadata]);
162
+
163
+ return (
164
+ <div role='form' className='flex flex-col gap-2'>
165
+ {target && (
166
+ <div role='none'>
167
+ <Input.Root>
168
+ <InputHeader>
169
+ <Input.Label>
170
+ {t(isSpace(target) ? 'creating in space label' : 'creating in collection label')}
171
+ </Input.Label>
172
+ </InputHeader>
173
+ <div role='none' className='flex gap-2'>
174
+ <Input.TextInput
175
+ disabled
176
+ value={
177
+ isSpace(target)
178
+ ? toLocalizedString(getSpaceDisplayName(target, { personal: target.id === defaultSpaceId }), t)
179
+ : target.name || t('unnamed collection label')
180
+ }
181
+ />
182
+ <IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearTarget} />
183
+ </div>
184
+ </Input.Root>
185
+ </div>
186
+ )}
187
+ {schema && (
188
+ <div role='none'>
189
+ <Input.Root>
190
+ <InputHeader>
191
+ <Input.Label>{t('creating object type label')}</Input.Label>
192
+ </InputHeader>
193
+ <div role='none' className='flex gap-2'>
194
+ <Input.TextInput
195
+ disabled
196
+ value={t('typename label', { ns: schema.typename, defaultValue: schema.typename })}
197
+ />
198
+ <IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearSchema} />
199
+ </div>
200
+ </Input.Root>
201
+ </div>
202
+ )}
203
+ {!schema ? schemaInput : !target ? spaceInput : form}
204
+ </div>
205
+ );
206
206
  };