@dxos/plugin-client 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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 (222) hide show
  1. package/dist/lib/browser/DevicesContainer-3N7ANEJ7.mjs +268 -0
  2. package/dist/lib/browser/DevicesContainer-3N7ANEJ7.mjs.map +7 -0
  3. package/dist/lib/browser/JoinDialog-VTTK7NHO.mjs +59 -0
  4. package/dist/lib/browser/JoinDialog-VTTK7NHO.mjs.map +7 -0
  5. package/dist/lib/browser/ProfileContainer-XV7OXJC2.mjs +171 -0
  6. package/dist/lib/browser/ProfileContainer-XV7OXJC2.mjs.map +7 -0
  7. package/dist/lib/browser/RecoveryCodeDialog-WO34OZEJ.mjs +60 -0
  8. package/dist/lib/browser/RecoveryCodeDialog-WO34OZEJ.mjs.map +7 -0
  9. package/dist/lib/browser/RecoveryCredentialsContainer-G22FSTIX.mjs +57 -0
  10. package/dist/lib/browser/RecoveryCredentialsContainer-G22FSTIX.mjs.map +7 -0
  11. package/dist/lib/browser/ResetDialog-W24FOWBQ.mjs +52 -0
  12. package/dist/lib/browser/ResetDialog-W24FOWBQ.mjs.map +7 -0
  13. package/dist/lib/browser/{app-graph-builder-3FGBMLTF.mjs → app-graph-builder-GGJKFY3X.mjs} +9 -6
  14. package/dist/lib/browser/app-graph-builder-GGJKFY3X.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-4BZGRIFS.mjs → chunk-FVEKZBM7.mjs} +34 -44
  16. package/dist/lib/browser/chunk-FVEKZBM7.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-F7H2Y3Z2.mjs → chunk-GSVYEYVS.mjs} +4 -4
  18. package/dist/lib/browser/chunk-HSFDKP5D.mjs +15 -0
  19. package/dist/lib/browser/{chunk-G7C3S2BE.mjs.map → chunk-HSFDKP5D.mjs.map} +1 -1
  20. package/dist/lib/browser/chunk-JHSBBOCI.mjs +15 -0
  21. package/dist/lib/browser/chunk-JHSBBOCI.mjs.map +7 -0
  22. package/dist/lib/browser/cli/index.mjs +60 -49
  23. package/dist/lib/browser/cli/index.mjs.map +3 -3
  24. package/dist/lib/browser/{client-IX5LMWV4.mjs → client-BXCP3EUE.mjs} +11 -11
  25. package/dist/lib/browser/client-BXCP3EUE.mjs.map +7 -0
  26. package/dist/lib/browser/index.mjs +26 -23
  27. package/dist/lib/browser/index.mjs.map +3 -3
  28. package/dist/lib/browser/meta.json +1 -1
  29. package/dist/lib/browser/{migrations-3EBTAW3N.mjs → migrations-GKUA2ARL.mjs} +6 -5
  30. package/dist/lib/browser/migrations-GKUA2ARL.mjs.map +7 -0
  31. package/dist/lib/browser/{operation-resolver-2NT3ISVP.mjs → operation-resolver-VSWA74RS.mjs} +24 -23
  32. package/dist/lib/browser/operation-resolver-VSWA74RS.mjs.map +7 -0
  33. package/dist/lib/browser/{react-context-4UABG3GP.mjs → react-context-GZ3T5UON.mjs} +8 -6
  34. package/dist/lib/browser/react-context-GZ3T5UON.mjs.map +7 -0
  35. package/dist/lib/browser/react-surface-5VZP34X3.mjs +77 -0
  36. package/dist/lib/browser/react-surface-5VZP34X3.mjs.map +7 -0
  37. package/dist/lib/browser/{schema-defs-O7VLP745.mjs → schema-defs-KAG6HQMI.mjs} +8 -6
  38. package/dist/lib/browser/schema-defs-KAG6HQMI.mjs.map +7 -0
  39. package/dist/lib/browser/types/index.mjs +2 -1
  40. package/dist/lib/node-esm/DevicesContainer-V7HEUPO7.mjs +269 -0
  41. package/dist/lib/node-esm/DevicesContainer-V7HEUPO7.mjs.map +7 -0
  42. package/dist/lib/node-esm/JoinDialog-XVKW4SLT.mjs +60 -0
  43. package/dist/lib/node-esm/JoinDialog-XVKW4SLT.mjs.map +7 -0
  44. package/dist/lib/node-esm/ProfileContainer-B5LJ6TMU.mjs +172 -0
  45. package/dist/lib/node-esm/ProfileContainer-B5LJ6TMU.mjs.map +7 -0
  46. package/dist/lib/node-esm/RecoveryCodeDialog-YIRGXM7N.mjs +61 -0
  47. package/dist/lib/node-esm/RecoveryCodeDialog-YIRGXM7N.mjs.map +7 -0
  48. package/dist/lib/node-esm/RecoveryCredentialsContainer-MVJEFNXX.mjs +58 -0
  49. package/dist/lib/node-esm/RecoveryCredentialsContainer-MVJEFNXX.mjs.map +7 -0
  50. package/dist/lib/node-esm/ResetDialog-GGBWSQZO.mjs +54 -0
  51. package/dist/lib/node-esm/ResetDialog-GGBWSQZO.mjs.map +7 -0
  52. package/dist/lib/node-esm/{app-graph-builder-2PIYVUNC.mjs → app-graph-builder-PTNZ46NN.mjs} +9 -6
  53. package/dist/lib/node-esm/app-graph-builder-PTNZ46NN.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-BOTJSPCT.mjs +17 -0
  55. package/dist/lib/node-esm/chunk-BOTJSPCT.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-JAF64TFQ.mjs → chunk-DT2ZNOGU.mjs} +33 -44
  57. package/dist/lib/node-esm/chunk-DT2ZNOGU.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-BCELGXRI.mjs → chunk-OFJUOKY7.mjs} +4 -4
  59. package/dist/lib/node-esm/chunk-VLNCZYIC.mjs +16 -0
  60. package/dist/lib/node-esm/{chunk-PRAFFO54.mjs.map → chunk-VLNCZYIC.mjs.map} +1 -1
  61. package/dist/lib/node-esm/cli/index.mjs +60 -49
  62. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  63. package/dist/lib/node-esm/{client-FFPK5UFP.mjs → client-EGZHGRRC.mjs} +11 -11
  64. package/dist/lib/node-esm/client-EGZHGRRC.mjs.map +7 -0
  65. package/dist/lib/node-esm/index.mjs +26 -23
  66. package/dist/lib/node-esm/index.mjs.map +3 -3
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{migrations-WSZSFGDK.mjs → migrations-4NEKCBGU.mjs} +6 -5
  69. package/dist/lib/node-esm/migrations-4NEKCBGU.mjs.map +7 -0
  70. package/dist/lib/node-esm/{operation-resolver-VW5R2BE4.mjs → operation-resolver-4GWB3YZG.mjs} +24 -23
  71. package/dist/lib/node-esm/operation-resolver-4GWB3YZG.mjs.map +7 -0
  72. package/dist/lib/node-esm/{react-context-UVXMGPW4.mjs → react-context-T2ORT5CC.mjs} +8 -6
  73. package/dist/lib/node-esm/react-context-T2ORT5CC.mjs.map +7 -0
  74. package/dist/lib/node-esm/react-surface-B65OUZYI.mjs +78 -0
  75. package/dist/lib/node-esm/react-surface-B65OUZYI.mjs.map +7 -0
  76. package/dist/lib/node-esm/{schema-defs-QLRGBIKY.mjs → schema-defs-GXQ47JZN.mjs} +8 -6
  77. package/dist/lib/node-esm/schema-defs-GXQ47JZN.mjs.map +7 -0
  78. package/dist/lib/node-esm/types/index.mjs +2 -1
  79. package/dist/types/src/ClientPlugin.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
  81. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/client/client.d.ts +2 -2
  83. package/dist/types/src/capabilities/client/client.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/client/index.d.ts +2 -1
  85. package/dist/types/src/capabilities/client/index.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/migrations/migrations.d.ts +1 -1
  87. package/dist/types/src/capabilities/migrations/migrations.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  89. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  91. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/react-context/react-context.d.ts +1 -1
  93. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  95. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  97. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts +1 -1
  99. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts.map +1 -1
  100. package/dist/types/src/cli/commands/halo/create/create.d.ts.map +1 -1
  101. package/dist/types/src/cli/commands/profile/create.d.ts +2 -1
  102. package/dist/types/src/cli/commands/profile/create.d.ts.map +1 -1
  103. package/dist/types/src/cli/commands/profile/delete.d.ts +1 -1
  104. package/dist/types/src/cli/commands/profile/delete.d.ts.map +1 -1
  105. package/dist/types/src/cli/commands/profile/list.d.ts.map +1 -1
  106. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  107. package/dist/types/src/components/index.d.ts +0 -6
  108. package/dist/types/src/components/index.d.ts.map +1 -1
  109. package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -0
  110. package/dist/types/src/{components → containers/DevicesContainer}/DevicesContainer.stories.d.ts +9 -7
  111. package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts.map +1 -0
  112. package/dist/types/src/containers/DevicesContainer/index.d.ts +3 -0
  113. package/dist/types/src/containers/DevicesContainer/index.d.ts.map +1 -0
  114. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -0
  115. package/dist/types/src/containers/JoinDialog/index.d.ts +3 -0
  116. package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -0
  117. package/dist/types/src/containers/ProfileContainer/ProfileContainer.d.ts.map +1 -0
  118. package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts.map +1 -0
  119. package/dist/types/src/containers/ProfileContainer/index.d.ts +3 -0
  120. package/dist/types/src/containers/ProfileContainer/index.d.ts.map +1 -0
  121. package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.d.ts.map +1 -0
  122. package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.d.ts.map +1 -0
  123. package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts +4 -0
  124. package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts.map +1 -0
  125. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -0
  126. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts.map +1 -0
  127. package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts +3 -0
  128. package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts.map +1 -0
  129. package/dist/types/src/{components → containers/ResetDialog}/ResetDialog.d.ts +1 -1
  130. package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts.map +1 -0
  131. package/dist/types/src/{components → containers/ResetDialog}/ResetDialog.stories.d.ts +1 -1
  132. package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts.map +1 -0
  133. package/dist/types/src/containers/ResetDialog/index.d.ts +4 -0
  134. package/dist/types/src/containers/ResetDialog/index.d.ts.map +1 -0
  135. package/dist/types/src/containers/index.d.ts +10 -0
  136. package/dist/types/src/containers/index.d.ts.map +1 -0
  137. package/dist/types/src/types/capabilities.d.ts +1 -1
  138. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  139. package/dist/types/src/types/schema.d.ts +36 -32
  140. package/dist/types/src/types/schema.d.ts.map +1 -1
  141. package/dist/types/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +36 -35
  143. package/src/ClientPlugin.ts +27 -19
  144. package/src/capabilities/app-graph-builder/app-graph-builder.ts +4 -3
  145. package/src/capabilities/client/client.ts +7 -5
  146. package/src/capabilities/migrations/migrations.ts +3 -3
  147. package/src/capabilities/operation-resolver/operation-resolver.ts +13 -12
  148. package/src/capabilities/react-context/react-context.tsx +3 -3
  149. package/src/capabilities/react-surface/react-surface.tsx +12 -12
  150. package/src/capabilities/schema-defs/schema-defs.ts +7 -6
  151. package/src/cli/commands/edge/status.ts +2 -2
  152. package/src/cli/commands/halo/create/create.ts +2 -2
  153. package/src/cli/commands/profile/create.ts +9 -6
  154. package/src/cli/commands/profile/delete.ts +5 -2
  155. package/src/cli/commands/profile/list.ts +13 -11
  156. package/src/cli/plugin.ts +7 -6
  157. package/src/components/index.ts +0 -7
  158. package/src/constants.ts +3 -3
  159. package/src/{components → containers/DevicesContainer}/DevicesContainer.stories.tsx +8 -6
  160. package/src/{components → containers/DevicesContainer}/DevicesContainer.tsx +49 -57
  161. package/src/containers/DevicesContainer/index.ts +7 -0
  162. package/src/{components → containers/JoinDialog}/JoinDialog.tsx +8 -6
  163. package/src/containers/JoinDialog/index.ts +7 -0
  164. package/src/{components → containers/ProfileContainer}/ProfileContainer.stories.tsx +4 -4
  165. package/src/{components → containers/ProfileContainer}/ProfileContainer.tsx +20 -28
  166. package/src/containers/ProfileContainer/index.ts +7 -0
  167. package/src/{components → containers/RecoveryCodeDialog}/RecoveryCodeDialog.stories.tsx +4 -4
  168. package/src/{components → containers/RecoveryCodeDialog}/RecoveryCodeDialog.tsx +28 -25
  169. package/src/containers/RecoveryCodeDialog/index.ts +8 -0
  170. package/src/{components → containers/RecoveryCredentialsContainer}/RecoveryCredentialsContainer.stories.tsx +8 -6
  171. package/src/{components → containers/RecoveryCredentialsContainer}/RecoveryCredentialsContainer.tsx +19 -19
  172. package/src/containers/RecoveryCredentialsContainer/index.ts +7 -0
  173. package/src/{components → containers/ResetDialog}/ResetDialog.stories.tsx +27 -14
  174. package/src/{components → containers/ResetDialog}/ResetDialog.tsx +10 -10
  175. package/src/containers/ResetDialog/index.ts +8 -0
  176. package/src/containers/index.ts +15 -0
  177. package/src/meta.ts +1 -1
  178. package/src/translations.ts +1 -1
  179. package/src/types/capabilities.ts +3 -3
  180. package/src/types/events.ts +5 -5
  181. package/src/types/schema.ts +28 -23
  182. package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs.map +0 -7
  183. package/dist/lib/browser/chunk-4BZGRIFS.mjs.map +0 -7
  184. package/dist/lib/browser/chunk-G7C3S2BE.mjs +0 -15
  185. package/dist/lib/browser/client-IX5LMWV4.mjs.map +0 -7
  186. package/dist/lib/browser/migrations-3EBTAW3N.mjs.map +0 -7
  187. package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs.map +0 -7
  188. package/dist/lib/browser/react-context-4UABG3GP.mjs.map +0 -7
  189. package/dist/lib/browser/react-surface-RSQ74XCT.mjs +0 -675
  190. package/dist/lib/browser/react-surface-RSQ74XCT.mjs.map +0 -7
  191. package/dist/lib/browser/schema-defs-O7VLP745.mjs.map +0 -7
  192. package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs.map +0 -7
  194. package/dist/lib/node-esm/chunk-PRAFFO54.mjs +0 -16
  195. package/dist/lib/node-esm/client-FFPK5UFP.mjs.map +0 -7
  196. package/dist/lib/node-esm/migrations-WSZSFGDK.mjs.map +0 -7
  197. package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs.map +0 -7
  198. package/dist/lib/node-esm/react-context-UVXMGPW4.mjs.map +0 -7
  199. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs +0 -676
  200. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs.map +0 -7
  201. package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs.map +0 -7
  202. package/dist/types/src/components/DevicesContainer.d.ts.map +0 -1
  203. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +0 -1
  204. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  205. package/dist/types/src/components/ProfileContainer.d.ts.map +0 -1
  206. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +0 -1
  207. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +0 -1
  208. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts.map +0 -1
  209. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +0 -1
  210. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +0 -1
  211. package/dist/types/src/components/ResetDialog.d.ts.map +0 -1
  212. package/dist/types/src/components/ResetDialog.stories.d.ts.map +0 -1
  213. /package/dist/lib/browser/{chunk-F7H2Y3Z2.mjs.map → chunk-GSVYEYVS.mjs.map} +0 -0
  214. /package/dist/lib/node-esm/{chunk-BCELGXRI.mjs.map → chunk-OFJUOKY7.mjs.map} +0 -0
  215. /package/dist/types/src/{components → containers/DevicesContainer}/DevicesContainer.d.ts +0 -0
  216. /package/dist/types/src/{components → containers/JoinDialog}/JoinDialog.d.ts +0 -0
  217. /package/dist/types/src/{components → containers/ProfileContainer}/ProfileContainer.d.ts +0 -0
  218. /package/dist/types/src/{components → containers/ProfileContainer}/ProfileContainer.stories.d.ts +0 -0
  219. /package/dist/types/src/{components → containers/RecoveryCodeDialog}/RecoveryCodeDialog.d.ts +0 -0
  220. /package/dist/types/src/{components → containers/RecoveryCodeDialog}/RecoveryCodeDialog.stories.d.ts +0 -0
  221. /package/dist/types/src/{components → containers/RecoveryCredentialsContainer}/RecoveryCredentialsContainer.d.ts +0 -0
  222. /package/dist/types/src/{components → containers/RecoveryCredentialsContainer}/RecoveryCredentialsContainer.stories.d.ts +0 -0
@@ -1,10 +1,3 @@
1
1
  //
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
-
5
- export * from './DevicesContainer';
6
- export * from './JoinDialog';
7
- export * from './ProfileContainer';
8
- export * from './RecoveryCodeDialog';
9
- export * from './RecoveryCredentialsContainer';
10
- export * from './ResetDialog';
package/src/constants.ts CHANGED
@@ -4,6 +4,6 @@
4
4
 
5
5
  import { meta } from './meta';
6
6
 
7
- export const JOIN_DIALOG = `${meta.id}/JoinDialog`;
8
- export const RECOVERY_CODE_DIALOG = `${meta.id}/RecoveryCodeDialog`;
9
- export const RESET_DIALOG = `${meta.id}/ResetDialog`;
7
+ export const JOIN_DIALOG = `${meta.id}.JoinDialog`;
8
+ export const RECOVERY_CODE_DIALOG = `${meta.id}.RecoveryCodeDialog`;
9
+ export const RESET_DIALOG = `${meta.id}.ResetDialog`;
@@ -5,21 +5,22 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Effect from 'effect/Effect';
7
7
 
8
- import { OperationPlugin } from '@dxos/app-framework';
8
+ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { withTheme } from '@dxos/react-ui/testing';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
11
  import { translations as shellTranslations } from '@dxos/shell/react';
12
12
 
13
- import { ClientPlugin } from '../ClientPlugin';
14
- import { translations } from '../translations';
13
+ import { ClientPlugin } from '../../ClientPlugin';
14
+ import { translations } from '../../translations';
15
15
 
16
16
  import { DevicesContainer } from './DevicesContainer';
17
17
 
18
18
  const meta = {
19
- title: 'plugins/plugin-client/DevicesContainer',
19
+ title: 'plugins/plugin-client/containers/DevicesContainer',
20
20
  component: DevicesContainer,
21
21
  decorators: [
22
- withTheme,
22
+ withTheme(),
23
+ withLayout({ layout: 'fullscreen' }),
23
24
  withPluginManager({
24
25
  plugins: [
25
26
  ClientPlugin({
@@ -29,6 +30,7 @@ const meta = {
29
30
  }),
30
31
  }),
31
32
  OperationPlugin(),
33
+ RuntimePlugin(),
32
34
  ],
33
35
  }),
34
36
  ],
@@ -5,28 +5,20 @@
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
  import { QR } from 'react-qr-rounded';
7
7
 
8
- import { useOperationInvoker } from '@dxos/app-framework/react';
8
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
9
9
  import { log } from '@dxos/log';
10
10
  import { useClient, useMulticastObservable } from '@dxos/react-client';
11
11
  import { type Device, useDevices } from '@dxos/react-client/halo';
12
12
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
13
13
  import { useNetworkStatus } from '@dxos/react-client/mesh';
14
14
  import { Button, Clipboard, Icon, IconButton, List, useId, useTranslation } from '@dxos/react-ui';
15
- import {
16
- ControlFrame,
17
- ControlFrameItem,
18
- ControlGroup,
19
- ControlItem,
20
- ControlPage,
21
- ControlSection,
22
- } from '@dxos/react-ui-form';
23
- import { translationKey } from '@dxos/shell/react';
24
- import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';
15
+ import { Settings } from '@dxos/react-ui-form';
16
+ import { AuthCode, Centered, DeviceListItem, Emoji, Viewport, translationKey } from '@dxos/shell/react';
25
17
  import { osTranslations } from '@dxos/ui-theme';
26
18
  import { hexToEmoji } from '@dxos/util';
27
19
 
28
- import { meta } from '../meta';
29
- import { ClientOperation } from '../types';
20
+ import { meta } from '../../meta';
21
+ import { ClientOperation } from '../../types';
30
22
 
31
23
  export type DevicesContainerProps = {
32
24
  createInvitationUrl?: (invitationCode: string) => string;
@@ -52,57 +44,55 @@ export const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps)
52
44
 
53
45
  return (
54
46
  <Clipboard.Provider>
55
- <ControlPage>
56
- <ControlSection
47
+ <Settings.Root>
48
+ <Settings.Section
57
49
  title={t('devices verbose label', { ns: meta.id })}
58
50
  description={t('devices description', { ns: meta.id })}
59
51
  >
60
- <ControlFrame>
61
- <ControlFrameItem title={t('devices label', { ns: meta.id })}>
52
+ <Settings.Frame>
53
+ <Settings.FrameItem title={t('devices label', { ns: meta.id })}>
62
54
  <List>
63
- {devices.map((device: Device) => {
64
- return (
65
- <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />
66
- );
67
- })}
55
+ {devices.map((device: Device) => (
56
+ <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />
57
+ ))}
68
58
  </List>
69
- </ControlFrameItem>
59
+ </Settings.FrameItem>
70
60
  {createInvitationUrl && (
71
- <ControlFrameItem title='Add device'>
61
+ <Settings.FrameItem title='Add device'>
72
62
  <DeviceInvitation createInvitationUrl={createInvitationUrl} />
73
- </ControlFrameItem>
63
+ </Settings.FrameItem>
74
64
  )}
75
- </ControlFrame>
76
- </ControlSection>
77
- <ControlSection
65
+ </Settings.Frame>
66
+ </Settings.Section>
67
+ <Settings.Section
78
68
  title={t('danger zone title', { ns: meta.id })}
79
69
  description={t('danger zone description', { ns: meta.id })}
80
70
  >
81
- <ControlGroup>
82
- <ControlItem title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>
71
+ <Settings.Group>
72
+ <Settings.Item title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>
83
73
  <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
84
74
  {t('reset device label')}
85
75
  </Button>
86
- </ControlItem>
87
- <ControlItem
76
+ </Settings.Item>
77
+ <Settings.Item
88
78
  title={t('recover identity label')}
89
79
  description={t('recover identity description', { ns: meta.id })}
90
80
  >
91
81
  <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
92
82
  {t('recover identity label')}
93
83
  </Button>
94
- </ControlItem>
95
- <ControlItem
84
+ </Settings.Item>
85
+ <Settings.Item
96
86
  title={t('join new identity label')}
97
87
  description={t('join new identity description', { ns: meta.id })}
98
88
  >
99
89
  <Button variant='destructive' onClick={handleJoinNewIdentity} data-testid='devicesContainer.joinExisting'>
100
90
  {t('join new identity label')}
101
91
  </Button>
102
- </ControlItem>
103
- </ControlGroup>
104
- </ControlSection>
105
- </ControlPage>
92
+ </Settings.Item>
93
+ </Settings.Group>
94
+ </Settings.Section>
95
+ </Settings.Root>
106
96
  </Clipboard.Provider>
107
97
  );
108
98
  };
@@ -188,12 +178,12 @@ const InvitationSection = ({
188
178
  : 'qr-code';
189
179
  return activeView === 'init' ? (
190
180
  <>
191
- <p className='text-description mbe-2'>{t('add device description')}</p>
181
+ <p className='text-description mb-2'>{t('add device description')}</p>
192
182
  <IconButton
193
183
  icon='ph--plus--regular'
194
184
  label={t('create device invitation label')}
195
185
  disabled={state >= 0}
196
- classNames='is-full'
186
+ classNames='w-full'
197
187
  data-testid='devicesContainer.createInvitation'
198
188
  onClick={onInvitationCreate}
199
189
  />
@@ -225,21 +215,23 @@ const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel
225
215
  return (
226
216
  <>
227
217
  <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>
228
- <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>
229
- <div role='none' className='is-full aspect-square relative text-description'>
230
- <QR
231
- rounding={100}
232
- backgroundColor='transparent'
233
- color='currentColor'
234
- aria-labelledby={qrLabel}
235
- errorCorrectionLevel='Q'
236
- cutout={true}
237
- >
238
- {url ?? 'never'}
239
- </QR>
240
- <Centered>
241
- <Emoji text={emoji} />
242
- </Centered>
218
+ <div role='group' className='grid grid-cols-[1fr_min-content]'>
219
+ <div className='flex justify-center py-4'>
220
+ <div role='none' className='w-full md:max-w-80 aspect-square relative text-description'>
221
+ <QR
222
+ rounding={100}
223
+ backgroundColor='transparent'
224
+ color='currentColor'
225
+ aria-labelledby={qrLabel}
226
+ errorCorrectionLevel='Q'
227
+ cutout={true}
228
+ >
229
+ {url ?? 'never'}
230
+ </QR>
231
+ <Centered>
232
+ <Emoji text={emoji} />
233
+ </Centered>
234
+ </div>
243
235
  </div>
244
236
  <span id={qrLabel} className='sr-only'>
245
237
  {t('qr label')}
@@ -265,9 +257,9 @@ const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string;
265
257
  return (
266
258
  <>
267
259
  <p className='text-description'>{t('auth other device emoji message')}</p>
268
- {emoji && <Emoji text={emoji} className='mli-auto mlb-2 text-center' />}
260
+ {emoji && <Emoji text={emoji} className='mx-auto my-2 text-center' />}
269
261
  <p className='text-description'>{t('auth code message')}</p>
270
- <AuthCode code={code} large classNames='mli-auto mlb-2 text-center grow' />
262
+ <AuthCode code={code} large classNames='mx-auto my-2 text-center grow' />
271
263
  <Button variant='ghost' onClick={onCancel}>
272
264
  {t('cancel label')}
273
265
  </Button>
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { DevicesContainer } from './DevicesContainer';
6
+
7
+ export default DevicesContainer;
@@ -4,16 +4,16 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { Common } from '@dxos/app-framework';
8
- import { useOperationInvoker } from '@dxos/app-framework/react';
7
+ import { useOperationInvoker } from '@dxos/app-framework/ui';
8
+ import { LayoutOperation } from '@dxos/app-toolkit';
9
9
  import { ObservabilityOperation } from '@dxos/plugin-observability/types';
10
10
  import { type InvitationResult } from '@dxos/react-client/invitations';
11
11
  import { Dialog, useTranslation } from '@dxos/react-ui';
12
12
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
13
13
  import { osTranslations } from '@dxos/ui-theme';
14
14
 
15
- import { meta } from '../meta';
16
- import { ClientOperation } from '../types';
15
+ import { meta } from '../../meta';
16
+ import { ClientOperation } from '../../types';
17
17
 
18
18
  export const JoinDialog = (props: JoinPanelProps) => {
19
19
  const { invokePromise } = useOperationInvoker();
@@ -25,7 +25,7 @@ export const JoinDialog = (props: JoinPanelProps) => {
25
25
  async (result: InvitationResult | null) => {
26
26
  if (result?.identityKey) {
27
27
  await Promise.all([
28
- invokePromise(Common.LayoutOperation.UpdateDialog, { state: false }),
28
+ invokePromise(LayoutOperation.UpdateDialog, { state: false }),
29
29
  invokePromise(ObservabilityOperation.SendEvent, {
30
30
  name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
31
31
  }),
@@ -37,7 +37,9 @@ export const JoinDialog = (props: JoinPanelProps) => {
37
37
 
38
38
  return (
39
39
  <Dialog.Content>
40
- <Dialog.Title classNames='sr-only'>{t('join space label', { ns: osTranslations })}</Dialog.Title>
40
+ <Dialog.Header>
41
+ <Dialog.Title classNames='sr-only'>{t('join space label', { ns: osTranslations })}</Dialog.Title>
42
+ </Dialog.Header>
41
43
  <JoinPanel
42
44
  mode='halo-only'
43
45
  {...props}
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { JoinDialog } from './JoinDialog';
6
+
7
+ export default JoinDialog;
@@ -5,16 +5,16 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
7
  import { withClientProvider } from '@dxos/react-client/testing';
8
- import { withTheme } from '@dxos/react-ui/testing';
8
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
9
9
 
10
- import { translations } from '../translations';
10
+ import { translations } from '../../translations';
11
11
 
12
12
  import { ProfileContainer } from './ProfileContainer';
13
13
 
14
14
  const meta = {
15
- title: 'plugins/plugin-client/ProfileContainer',
15
+ title: 'plugins/plugin-client/containers/ProfileContainer',
16
16
  component: ProfileContainer,
17
- decorators: [withTheme, withClientProvider({ createIdentity: true })],
17
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withClientProvider({ createIdentity: true })],
18
18
  parameters: {
19
19
  layout: 'fullscreen',
20
20
  translations,
@@ -9,19 +9,11 @@ import { debounce } from '@dxos/async';
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
11
11
  import { ButtonGroup, Clipboard, Input, useTranslation } from '@dxos/react-ui';
12
- import {
13
- ControlItem,
14
- ControlItemInput,
15
- ControlPage,
16
- ControlSection,
17
- Form,
18
- type FormFieldMap,
19
- type FormUpdateMeta,
20
- } from '@dxos/react-ui-form';
12
+ import { Form, type FormFieldMap, type FormUpdateMeta, Settings } from '@dxos/react-ui-form';
21
13
  import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
22
14
  import { hexToEmoji, hexToHue } from '@dxos/util';
23
15
 
24
- import { meta } from '../meta';
16
+ import { meta } from '../../meta';
25
17
 
26
18
  // TOOD(burdon): Factor out?
27
19
  // TODO(wittjosiah): Integrate annotations with translations.
@@ -109,14 +101,14 @@ export const ProfileContainer = () => {
109
101
  );
110
102
 
111
103
  return (
112
- <ControlItemInput title={label} description={t('display name description')}>
104
+ <Settings.ItemInput title={label} description={t('display name description')}>
113
105
  <Input.TextInput
114
106
  value={getValue()}
115
107
  onChange={handleChange}
116
108
  placeholder={t('display name input placeholder')}
117
- classNames='min-is-64'
109
+ classNames='min-w-64'
118
110
  />
119
- </ControlItemInput>
111
+ </Settings.ItemInput>
120
112
  );
121
113
  },
122
114
  emoji: ({ type, label, getValue, onValueChange }) => {
@@ -127,7 +119,7 @@ export const ProfileContainer = () => {
127
119
  );
128
120
 
129
121
  return (
130
- <ControlItem title={label} description={t('icon description')}>
122
+ <Settings.Item title={label} description={t('icon description')}>
131
123
  <EmojiPickerBlock
132
124
  triggerVariant='default'
133
125
  emoji={getValue()}
@@ -135,7 +127,7 @@ export const ProfileContainer = () => {
135
127
  onClickClear={handleEmojiReset}
136
128
  classNames='justify-self-end'
137
129
  />
138
- </ControlItem>
130
+ </Settings.Item>
139
131
  );
140
132
  },
141
133
  hue: ({ type, label, getValue, onValueChange }) => {
@@ -146,22 +138,22 @@ export const ProfileContainer = () => {
146
138
  );
147
139
 
148
140
  return (
149
- <ControlItem title={label} description={t('hue description')}>
141
+ <Settings.Item title={label} description={t('hue description')}>
150
142
  <div role='none' className='flex justify-self-end'>
151
143
  <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
152
144
  </div>
153
- </ControlItem>
145
+ </Settings.Item>
154
146
  );
155
147
  },
156
148
  // TODO(wittjosiah): We need text input annotations for disabled and copyable.
157
149
  did: ({ label, getValue }) => {
158
150
  return (
159
- <ControlItemInput title={label} description={t('did description')}>
160
- <ButtonGroup>
161
- <Input.TextInput value={getValue()} disabled classNames='min-is-64' />
151
+ <Settings.ItemInput title={label} description={t('did description')}>
152
+ <ButtonGroup classNames='w-full'>
153
+ <Input.TextInput value={getValue()} disabled classNames='min-w-64' />
162
154
  <Clipboard.IconButton value={getValue() ?? ''} />
163
155
  </ButtonGroup>
164
- </ControlItemInput>
156
+ </Settings.ItemInput>
165
157
  );
166
158
  },
167
159
  }),
@@ -169,16 +161,16 @@ export const ProfileContainer = () => {
169
161
  );
170
162
 
171
163
  return (
172
- <ControlPage>
173
- <Clipboard.Provider>
174
- <ControlSection title={t('profile label')} description={t('profile description')}>
164
+ <Clipboard.Provider>
165
+ <Settings.Root>
166
+ <Settings.Section title={t('profile label')} description={t('profile description')}>
175
167
  <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>
176
168
  <Form.Content>
177
- <Form.FieldSet classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]' />
169
+ <Form.FieldSet />
178
170
  </Form.Content>
179
171
  </Form.Root>
180
- </ControlSection>
181
- </Clipboard.Provider>
182
- </ControlPage>
172
+ </Settings.Section>
173
+ </Settings.Root>
174
+ </Clipboard.Provider>
183
175
  );
184
176
  };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ProfileContainer } from './ProfileContainer';
6
+
7
+ export default ProfileContainer;
@@ -8,9 +8,9 @@ import React, { useState } from 'react';
8
8
  import { useClient } from '@dxos/react-client';
9
9
  import { withClientProvider } from '@dxos/react-client/testing';
10
10
  import { AlertDialog, useAsyncEffect } from '@dxos/react-ui';
11
- import { withTheme } from '@dxos/react-ui/testing';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
12
 
13
- import { translations } from '../translations';
13
+ import { translations } from '../../translations';
14
14
 
15
15
  import { RecoveryCodeDialog } from './RecoveryCodeDialog';
16
16
 
@@ -32,10 +32,10 @@ const DefaultStory = () => {
32
32
  };
33
33
 
34
34
  const meta = {
35
- title: 'plugins/plugin-client/RecoveryCodeDialog',
35
+ title: 'plugins/plugin-client/containers/RecoveryCodeDialog',
36
36
  component: RecoveryCodeDialog as any,
37
37
  render: DefaultStory,
38
- decorators: [withTheme, withClientProvider({ createIdentity: true })],
38
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withClientProvider({ createIdentity: true })],
39
39
  parameters: {
40
40
  layout: 'fullscreen',
41
41
  translations,
@@ -6,12 +6,13 @@ import React, { useCallback, useState } from 'react';
6
6
 
7
7
  import { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { meta } from '../meta';
9
+ import { meta } from '../../meta';
10
10
 
11
11
  export type RecoveryCodeDialogProps = {
12
12
  code: string;
13
13
  };
14
14
 
15
+ // TODO(burdon): Should have cancel button.
15
16
  export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
16
17
  const { t } = useTranslation(meta.id);
17
18
  const [confirmation, setConfirmation] = useState(false);
@@ -19,33 +20,35 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
19
20
  const handleConfirmation = useCallback((checked: boolean) => setConfirmation(checked), []);
20
21
 
21
22
  return (
22
- <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
23
- <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
24
- <p className='plb-4'>{t('recovery code dialog description')}</p>
25
- <Clipboard.Provider>
26
- <Code code={code} />
27
- </Clipboard.Provider>
28
- <div className='flex flex-col plb-4 gap-2'>
29
- <p>{t('recovery code dialog warning 1')}</p>
30
- <p>{t('recovery code dialog warning 2')}</p>
31
- </div>
32
- <div className='flex items-center gap-2 pbe-4'>
33
- <Input.Root>
34
- <Input.Checkbox
35
- data-testid='recoveryCode.confirm'
36
- checked={confirmation}
37
- onCheckedChange={handleConfirmation}
38
- />
39
- <Input.Label>{t('recovery code confirmation label')}</Input.Label>
40
- </Input.Root>
41
- </div>
42
- <div className='flex justify-end'>
23
+ <AlertDialog.Content size='md' classNames='min-h-[15rem]'>
24
+ <AlertDialog.Body>
25
+ <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
26
+ <p className='py-4'>{t('recovery code dialog description')}</p>
27
+ <Clipboard.Provider>
28
+ <Code code={code} />
29
+ </Clipboard.Provider>
30
+ <div className='flex flex-col py-4 gap-2'>
31
+ <p>{t('recovery code dialog warning 1')}</p>
32
+ <p>{t('recovery code dialog warning 2')}</p>
33
+ </div>
34
+ <div className='flex items-center gap-2 pb-4'>
35
+ <Input.Root>
36
+ <Input.Checkbox
37
+ data-testid='recoveryCode.confirm'
38
+ checked={confirmation}
39
+ onCheckedChange={handleConfirmation}
40
+ />
41
+ <Input.Label>{t('recovery code confirmation label')}</Input.Label>
42
+ </Input.Root>
43
+ </div>
44
+ </AlertDialog.Body>
45
+ <AlertDialog.ActionBar>
43
46
  <AlertDialog.Action asChild>
44
47
  <Button data-testid='recoveryCode.continue' variant='primary' disabled={!confirmation}>
45
48
  {t('continue label')}
46
49
  </Button>
47
50
  </AlertDialog.Action>
48
- </div>
51
+ </AlertDialog.ActionBar>
49
52
  </AlertDialog.Content>
50
53
  );
51
54
  };
@@ -53,12 +56,12 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
53
56
  const Code = ({ code }: { code: string }) => {
54
57
  const words = code.split(' ');
55
58
  return (
56
- <div className='relative p-2 border border-separator rounded group'>
59
+ <div className='relative p-2 border border-separator rounded-sm group'>
57
60
  <Clipboard.IconButton value={code} classNames='absolute top-2 right-2 invisible group-hover:visible' />
58
61
  <div className='grid grid-cols-4'>
59
62
  {words.map((word, i) => (
60
63
  <div key={i} className='flex items-center p-2 gap-2'>
61
- <div className='is-4 text-xs text-center text-subdued'>{i + 1}</div>
64
+ <div className='w-4 text-xs text-center text-subdued'>{i + 1}</div>
62
65
  <div className='text-sm'>{word}</div>
63
66
  </div>
64
67
  ))}
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { RecoveryCodeDialog } from './RecoveryCodeDialog';
6
+
7
+ export * from './RecoveryCodeDialog';
8
+ export default RecoveryCodeDialog;
@@ -5,20 +5,21 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Effect from 'effect/Effect';
7
7
 
8
- import { OperationPlugin } from '@dxos/app-framework';
8
+ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
9
9
  import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { withTheme } from '@dxos/react-ui/testing';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
11
 
12
- import { ClientPlugin } from '../ClientPlugin';
13
- import { translations } from '../translations';
12
+ import { ClientPlugin } from '../../ClientPlugin';
13
+ import { translations } from '../../translations';
14
14
 
15
15
  import { RecoveryCredentialsContainer } from './RecoveryCredentialsContainer';
16
16
 
17
17
  const meta = {
18
- title: 'plugins/plugin-client/RecoveryCredentialsContainer',
18
+ title: 'plugins/plugin-client/containers/RecoveryCredentialsContainer',
19
19
  component: RecoveryCredentialsContainer,
20
20
  decorators: [
21
- withTheme,
21
+ withTheme(),
22
+ withLayout({ layout: 'fullscreen' }),
22
23
  withPluginManager({
23
24
  plugins: [
24
25
  ClientPlugin({
@@ -28,6 +29,7 @@ const meta = {
28
29
  }),
29
30
  }),
30
31
  OperationPlugin(),
32
+ RuntimePlugin(),
31
33
  ],
32
34
  }),
33
35
  ],