@dxos/plugin-client 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d

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 (147) hide show
  1. package/dist/lib/browser/{app-graph-builder-ENKIVZWH.mjs → app-graph-builder-ARY4H3VC.mjs} +26 -25
  2. package/dist/lib/browser/app-graph-builder-ARY4H3VC.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-56EADSTE.mjs → chunk-4G4YWIUQ.mjs} +45 -54
  4. package/dist/lib/browser/chunk-4G4YWIUQ.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-4LRO3Y2O.mjs +19 -0
  6. package/dist/lib/browser/chunk-4LRO3Y2O.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-N5UR2HOE.mjs +18 -0
  8. package/dist/lib/browser/chunk-N5UR2HOE.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-HLWIF3AW.mjs → chunk-RDIG75CA.mjs} +3 -3
  10. package/dist/lib/browser/chunk-RDIG75CA.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-ZRVMXLDR.mjs +15 -0
  12. package/dist/lib/browser/chunk-ZRVMXLDR.mjs.map +7 -0
  13. package/dist/lib/browser/{client-F73MIXMT.mjs → client-O7U3MQ6J.mjs} +6 -6
  14. package/dist/lib/browser/{client-F73MIXMT.mjs.map → client-O7U3MQ6J.mjs.map} +1 -1
  15. package/dist/lib/browser/index.mjs +23 -19
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/{intent-resolver-S3PUYK5Q.mjs → intent-resolver-KLK7PJZK.mjs} +10 -10
  18. package/dist/lib/browser/intent-resolver-KLK7PJZK.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{migrations-YJSO7JXY.mjs → migrations-RUAKBBTF.mjs} +6 -6
  21. package/dist/lib/browser/migrations-RUAKBBTF.mjs.map +7 -0
  22. package/dist/lib/browser/{react-context-QBXCHNH2.mjs → react-context-PCT5C3BN.mjs} +9 -8
  23. package/dist/lib/browser/react-context-PCT5C3BN.mjs.map +7 -0
  24. package/dist/lib/browser/{react-surface-YON76BFE.mjs → react-surface-RCXEA65V.mjs} +6 -6
  25. package/dist/lib/browser/{react-surface-YON76BFE.mjs.map → react-surface-RCXEA65V.mjs.map} +1 -1
  26. package/dist/lib/browser/{schema-defs-AMSX6T3B.mjs → schema-defs-UNNBAEFW.mjs} +6 -6
  27. package/dist/lib/browser/schema-defs-UNNBAEFW.mjs.map +7 -0
  28. package/dist/lib/browser/types/index.mjs +2 -2
  29. package/dist/lib/node-esm/{app-graph-builder-D4XJCLPN.mjs → app-graph-builder-LLM25DRR.mjs} +26 -25
  30. package/dist/lib/node-esm/app-graph-builder-LLM25DRR.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-6ANOJ7ZM.mjs +19 -0
  32. package/dist/lib/node-esm/chunk-6ANOJ7ZM.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-7M7VWQJW.mjs +20 -0
  34. package/dist/lib/node-esm/chunk-7M7VWQJW.mjs.map +7 -0
  35. package/dist/lib/node-esm/{chunk-J6I6JZPI.mjs → chunk-DJ6XKSE4.mjs} +45 -54
  36. package/dist/lib/node-esm/chunk-DJ6XKSE4.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-QT3EQXDU.mjs +17 -0
  38. package/dist/lib/node-esm/chunk-QT3EQXDU.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-JG6AFSFU.mjs → chunk-VENKFPBC.mjs} +3 -3
  40. package/dist/lib/node-esm/chunk-VENKFPBC.mjs.map +7 -0
  41. package/dist/lib/node-esm/{client-A7CNP37P.mjs → client-6MTNT7M6.mjs} +6 -6
  42. package/dist/lib/node-esm/{client-A7CNP37P.mjs.map → client-6MTNT7M6.mjs.map} +1 -1
  43. package/dist/lib/node-esm/index.mjs +23 -19
  44. package/dist/lib/node-esm/index.mjs.map +4 -4
  45. package/dist/lib/node-esm/{intent-resolver-EBJABYM3.mjs → intent-resolver-YR2C224X.mjs} +10 -10
  46. package/dist/lib/node-esm/intent-resolver-YR2C224X.mjs.map +7 -0
  47. package/dist/lib/node-esm/meta.json +1 -1
  48. package/dist/lib/node-esm/{migrations-UOEK7HB7.mjs → migrations-ASF2SAUR.mjs} +6 -6
  49. package/dist/lib/node-esm/migrations-ASF2SAUR.mjs.map +7 -0
  50. package/dist/lib/node-esm/{react-context-JIH7YBFI.mjs → react-context-F4QOBWSP.mjs} +9 -8
  51. package/dist/lib/node-esm/react-context-F4QOBWSP.mjs.map +7 -0
  52. package/dist/lib/node-esm/{react-surface-YKCZF43D.mjs → react-surface-SQBRXVMZ.mjs} +6 -6
  53. package/dist/lib/node-esm/{react-surface-YKCZF43D.mjs.map → react-surface-SQBRXVMZ.mjs.map} +1 -1
  54. package/dist/lib/node-esm/{schema-defs-4UTKKRTF.mjs → schema-defs-MSIT2KK2.mjs} +6 -6
  55. package/dist/lib/node-esm/schema-defs-MSIT2KK2.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +2 -2
  57. package/dist/types/src/ClientPlugin.d.ts +1 -1
  58. package/dist/types/src/ClientPlugin.d.ts.map +1 -1
  59. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  60. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  61. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  62. package/dist/types/src/capabilities/client.d.ts +1 -1
  63. package/dist/types/src/capabilities/index.d.ts +10 -10
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  66. package/dist/types/src/capabilities/migrations.d.ts +1 -1
  67. package/dist/types/src/capabilities/react-context.d.ts +2 -2
  68. package/dist/types/src/capabilities/react-context.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  70. package/dist/types/src/capabilities/schema-defs.d.ts +1 -1
  71. package/dist/types/src/components/DevicesContainer.d.ts.map +1 -1
  72. package/dist/types/src/components/DevicesContainer.stories.d.ts +224 -5
  73. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/JoinDialog.d.ts +1 -1
  75. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  76. package/dist/types/src/components/ProfileContainer.d.ts.map +1 -1
  77. package/dist/types/src/components/ProfileContainer.stories.d.ts +57 -5
  78. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/RecoveryCodeDialog.d.ts +1 -1
  80. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  81. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts +59 -5
  82. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts +1 -1
  84. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +1 -1
  85. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts +57 -5
  86. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/ResetDialog.d.ts +1 -1
  88. package/dist/types/src/components/ResetDialog.d.ts.map +1 -1
  89. package/dist/types/src/components/ResetDialog.stories.d.ts +59 -4
  90. package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -1
  91. package/dist/types/src/events.d.ts.map +1 -1
  92. package/dist/types/src/index.d.ts +3 -2
  93. package/dist/types/src/index.d.ts.map +1 -1
  94. package/dist/types/src/meta.d.ts +0 -1
  95. package/dist/types/src/meta.d.ts.map +1 -1
  96. package/dist/types/src/types/schema.d.ts +1 -1
  97. package/dist/types/src/types/schema.d.ts.map +1 -1
  98. package/dist/types/tsconfig.tsbuildinfo +1 -1
  99. package/package.json +35 -36
  100. package/src/ClientPlugin.ts +55 -57
  101. package/src/capabilities/app-graph-builder.ts +22 -21
  102. package/src/capabilities/capabilities.ts +5 -5
  103. package/src/capabilities/intent-resolver.ts +2 -2
  104. package/src/capabilities/migrations.ts +1 -1
  105. package/src/capabilities/react-context.tsx +4 -3
  106. package/src/capabilities/schema-defs.ts +1 -1
  107. package/src/components/DevicesContainer.stories.tsx +5 -8
  108. package/src/components/DevicesContainer.tsx +55 -68
  109. package/src/components/JoinDialog.tsx +5 -4
  110. package/src/components/ProfileContainer.stories.tsx +5 -7
  111. package/src/components/ProfileContainer.tsx +19 -27
  112. package/src/components/RecoveryCodeDialog.stories.tsx +7 -9
  113. package/src/components/RecoveryCodeDialog.tsx +6 -6
  114. package/src/components/RecoveryCredentialsContainer.stories.tsx +5 -8
  115. package/src/components/RecoveryCredentialsContainer.tsx +46 -50
  116. package/src/components/ResetDialog.stories.tsx +7 -9
  117. package/src/components/ResetDialog.tsx +5 -4
  118. package/src/events.ts +6 -6
  119. package/src/index.ts +4 -3
  120. package/src/meta.ts +6 -3
  121. package/src/types/schema.ts +1 -1
  122. package/dist/lib/browser/app-graph-builder-ENKIVZWH.mjs.map +0 -7
  123. package/dist/lib/browser/chunk-3F2Q2RKC.mjs +0 -18
  124. package/dist/lib/browser/chunk-3F2Q2RKC.mjs.map +0 -7
  125. package/dist/lib/browser/chunk-56EADSTE.mjs.map +0 -7
  126. package/dist/lib/browser/chunk-CAF2COXW.mjs +0 -19
  127. package/dist/lib/browser/chunk-CAF2COXW.mjs.map +0 -7
  128. package/dist/lib/browser/chunk-GS3LDHYD.mjs +0 -12
  129. package/dist/lib/browser/chunk-GS3LDHYD.mjs.map +0 -7
  130. package/dist/lib/browser/chunk-HLWIF3AW.mjs.map +0 -7
  131. package/dist/lib/browser/intent-resolver-S3PUYK5Q.mjs.map +0 -7
  132. package/dist/lib/browser/migrations-YJSO7JXY.mjs.map +0 -7
  133. package/dist/lib/browser/react-context-QBXCHNH2.mjs.map +0 -7
  134. package/dist/lib/browser/schema-defs-AMSX6T3B.mjs.map +0 -7
  135. package/dist/lib/node-esm/app-graph-builder-D4XJCLPN.mjs.map +0 -7
  136. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs +0 -19
  137. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-J6I6JZPI.mjs.map +0 -7
  139. package/dist/lib/node-esm/chunk-JG6AFSFU.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs +0 -14
  141. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs +0 -20
  143. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs.map +0 -7
  144. package/dist/lib/node-esm/intent-resolver-EBJABYM3.mjs.map +0 -7
  145. package/dist/lib/node-esm/migrations-UOEK7HB7.mjs.map +0 -7
  146. package/dist/lib/node-esm/react-context-JIH7YBFI.mjs.map +0 -7
  147. package/dist/lib/node-esm/schema-defs-4UTKKRTF.mjs.map +0 -7
@@ -2,29 +2,27 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
7
  import { withClientProvider } from '@dxos/react-client/testing';
10
- import { withLayout, withTheme } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
10
  import { translations } from '../translations';
13
11
 
14
12
  import { ProfileContainer } from './ProfileContainer';
15
13
 
16
- const meta: Meta = {
14
+ const meta = {
17
15
  title: 'plugins/plugin-client/ProfileContainer',
18
16
  component: ProfileContainer,
19
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
20
18
  parameters: {
21
19
  layout: 'fullscreen',
22
20
  translations,
23
21
  },
24
- };
22
+ } satisfies Meta<typeof ProfileContainer>;
25
23
 
26
24
  export default meta;
27
25
 
28
- type Story = StoryObj<typeof ProfileContainer>;
26
+ type Story = StoryObj<typeof meta>;
29
27
 
30
28
  export const Default: Story = {};
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
7
 
8
8
  import { debounce } from '@dxos/async';
@@ -18,10 +18,9 @@ import {
18
18
  type InputComponent,
19
19
  } from '@dxos/react-ui-form';
20
20
  import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
21
- import { StackItem } from '@dxos/react-ui-stack';
22
21
  import { hexToEmoji, hexToHue } from '@dxos/util';
23
22
 
24
- import { CLIENT_PLUGIN } from '../meta';
23
+ import { meta } from '../meta';
25
24
 
26
25
  // TODO(thure): Factor out?
27
26
  const getDefaultHueValue = (identity: Identity | null) => hexToHue(identity?.identityKey.toHex() ?? '0');
@@ -30,7 +29,7 @@ const getHueValue = (identity: Identity | null) => identity?.profile?.data?.hue
30
29
  const getEmojiValue = (identity: Identity | null) => identity?.profile?.data?.emoji || getDefaultEmojiValue(identity);
31
30
 
32
31
  export const ProfileContainer = () => {
33
- const { t } = useTranslation(CLIENT_PLUGIN);
32
+ const { t } = useTranslation(meta.id);
34
33
  const client = useClient();
35
34
  const identity = useIdentity();
36
35
  const [displayName, setDisplayNameDirectly] = useState(identity?.profile?.displayName ?? '');
@@ -118,12 +117,7 @@ export const ProfileContainer = () => {
118
117
  );
119
118
  return (
120
119
  <ControlItem title={label} description={t('hue description')}>
121
- <HuePicker
122
- value={getValue()}
123
- onChange={handleChange}
124
- onReset={handleHueReset}
125
- classNames='[--hue-preview-size:1.5rem] justify-self-end'
126
- />
120
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
127
121
  </ControlItem>
128
122
  );
129
123
  },
@@ -143,23 +137,21 @@ export const ProfileContainer = () => {
143
137
  );
144
138
 
145
139
  return (
146
- <StackItem.Content classNames='block overflow-y-auto'>
147
- <ControlPage>
148
- <Clipboard.Provider>
149
- <ControlSection title={t('profile label')} description={t('profile description')}>
150
- <Form
151
- schema={ProfileSchema}
152
- values={values}
153
- autoSave
154
- onSave={handleSave}
155
- Custom={customElements}
156
- classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4'
157
- outerSpacing={false}
158
- />
159
- </ControlSection>
160
- </Clipboard.Provider>
161
- </ControlPage>
162
- </StackItem.Content>
140
+ <ControlPage>
141
+ <Clipboard.Provider>
142
+ <ControlSection title={t('profile label')} description={t('profile description')}>
143
+ <Form
144
+ schema={ProfileSchema}
145
+ values={values}
146
+ autoSave
147
+ onSave={handleSave}
148
+ Custom={customElements}
149
+ classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'
150
+ outerSpacing={false}
151
+ />
152
+ </ControlSection>
153
+ </Clipboard.Provider>
154
+ </ControlPage>
163
155
  );
164
156
  };
165
157
 
@@ -2,19 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useState } from 'react';
9
7
 
10
8
  import { useClient } from '@dxos/react-client';
11
9
  import { withClientProvider } from '@dxos/react-client/testing';
12
10
  import { AlertDialog, useAsyncEffect } from '@dxos/react-ui';
13
- import { withLayout, withTheme } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
13
  import { translations } from '../translations';
16
14
 
17
- import { RecoveryCodeDialog, type RecoveryCodeDialogProps } from './RecoveryCodeDialog';
15
+ import { RecoveryCodeDialog } from './RecoveryCodeDialog';
18
16
 
19
17
  const DefaultStory = () => {
20
18
  const client = useClient();
@@ -33,19 +31,19 @@ const DefaultStory = () => {
33
31
  );
34
32
  };
35
33
 
36
- const meta: Meta<RecoveryCodeDialogProps> = {
34
+ const meta = {
37
35
  title: 'plugins/plugin-client/RecoveryCodeDialog',
38
- component: RecoveryCodeDialog,
36
+ component: RecoveryCodeDialog as any,
39
37
  render: DefaultStory,
40
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
38
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
41
39
  parameters: {
42
40
  layout: 'fullscreen',
43
41
  translations,
44
42
  },
45
- };
43
+ } satisfies Meta<typeof DefaultStory>;
46
44
 
47
45
  export default meta;
48
46
 
49
- type Story = StoryObj<RecoveryCodeDialogProps>;
47
+ type Story = StoryObj<typeof meta>;
50
48
 
51
49
  export const Default: Story = {};
@@ -6,16 +6,16 @@ import React, { useCallback, useState } from 'react';
6
6
 
7
7
  import { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { CLIENT_PLUGIN } from '../meta';
9
+ import { meta } from '../meta';
10
10
 
11
- export const RECOVERY_CODE_DIALOG = `${CLIENT_PLUGIN}/RecoveryCodeDialog`;
11
+ export const RECOVERY_CODE_DIALOG = `${meta.id}/RecoveryCodeDialog`;
12
12
 
13
13
  export type RecoveryCodeDialogProps = {
14
14
  code: string;
15
15
  };
16
16
 
17
17
  export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
18
- const { t } = useTranslation(CLIENT_PLUGIN);
18
+ const { t } = useTranslation(meta.id);
19
19
  const [confirmation, setConfirmation] = useState(false);
20
20
 
21
21
  const handleConfirmation = useCallback((checked: boolean) => setConfirmation(checked), []);
@@ -23,11 +23,11 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
23
23
  return (
24
24
  <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
25
25
  <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
26
- <p className='py-4'>{t('recovery code dialog description')}</p>
26
+ <p className='plb-4'>{t('recovery code dialog description')}</p>
27
27
  <Clipboard.Provider>
28
28
  <Code code={code} />
29
29
  </Clipboard.Provider>
30
- <div className='flex flex-col py-4 gap-2'>
30
+ <div className='flex flex-col plb-4 gap-2'>
31
31
  <p>{t('recovery code dialog warning 1')}</p>
32
32
  <p>{t('recovery code dialog warning 2')}</p>
33
33
  </div>
@@ -60,7 +60,7 @@ const Code = ({ code }: { code: string }) => {
60
60
  <div className='grid grid-cols-4'>
61
61
  {words.map((word, i) => (
62
62
  <div key={i} className='flex items-center p-2 gap-2'>
63
- <div className='w-4 text-xs text-center text-subdued'>{i + 1}</div>
63
+ <div className='is-4 text-xs text-center text-subdued'>{i + 1}</div>
64
64
  <div className='text-sm'>{word}</div>
65
65
  </div>
66
66
  ))}
@@ -2,23 +2,22 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
7
  import { IntentPlugin } from '@dxos/app-framework';
10
8
  import { withPluginManager } from '@dxos/app-framework/testing';
11
- import { withLayout, withTheme } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
12
10
 
13
11
  import { ClientPlugin } from '../ClientPlugin';
14
12
  import { translations } from '../translations';
15
13
 
16
14
  import { RecoveryCredentialsContainer } from './RecoveryCredentialsContainer';
17
15
 
18
- const meta: Meta = {
16
+ const meta = {
19
17
  title: 'plugins/plugin-client/RecoveryCredentialsContainer',
20
18
  component: RecoveryCredentialsContainer,
21
19
  decorators: [
20
+ withTheme,
22
21
  withPluginManager({
23
22
  plugins: [
24
23
  ClientPlugin({
@@ -29,17 +28,15 @@ const meta: Meta = {
29
28
  IntentPlugin(),
30
29
  ],
31
30
  }),
32
- withTheme,
33
- withLayout(),
34
31
  ],
35
32
  parameters: {
36
33
  layout: 'fullscreen',
37
34
  translations,
38
35
  },
39
- };
36
+ } satisfies Meta<typeof RecoveryCredentialsContainer>;
40
37
 
41
38
  export default meta;
42
39
 
43
- type Story = StoryObj<typeof RecoveryCredentialsContainer>;
40
+ type Story = StoryObj<typeof meta>;
44
41
 
45
42
  export const Default: Story = {};
@@ -4,19 +4,19 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { useCredentials } from '@dxos/react-client/halo';
9
10
  import { Icon, IconButton, List, ListItem, Message, useTranslation } from '@dxos/react-ui';
10
11
  import { ControlGroup, ControlItem, ControlPage, ControlSection } from '@dxos/react-ui-form';
11
- import { StackItem } from '@dxos/react-ui-stack';
12
12
 
13
- import { CLIENT_PLUGIN } from '../meta';
13
+ import { meta } from '../meta';
14
14
  import { ClientAction } from '../types';
15
15
 
16
- export const MANAGE_CREDENTIALS_DIALOG = `${CLIENT_PLUGIN}/ManageCredentialsDialog`;
16
+ export const MANAGE_CREDENTIALS_DIALOG = `${meta.id}/ManageCredentialsDialog`;
17
17
 
18
18
  export const RecoveryCredentialsContainer = () => {
19
- const { t } = useTranslation(CLIENT_PLUGIN);
19
+ const { t } = useTranslation(meta.id);
20
20
  const { dispatchPromise: dispatch } = useIntentDispatcher();
21
21
  const credentials = useCredentials();
22
22
  const recoveryCredentials = credentials.filter(
@@ -24,50 +24,46 @@ export const RecoveryCredentialsContainer = () => {
24
24
  );
25
25
 
26
26
  return (
27
- <StackItem.Content classNames='block overflow-y-auto'>
28
- <ControlPage>
29
- <ControlSection title={t('recovery setup dialog title')} description={t('recovery setup dialog description')}>
30
- <ControlGroup>
31
- <ControlItem title={t('create passkey label')} description={t('create passkey description')}>
32
- <IconButton
33
- label={t('create passkey label')}
34
- icon='ph--key--duotone'
35
- variant='primary'
36
- size={5}
37
- onClick={() => dispatch(createIntent(ClientAction.CreatePasskey))}
38
- />
39
- </ControlItem>
40
- <ControlItem title={t('create recovery code label')} description={t('create recovery code description')}>
41
- <IconButton
42
- label={t('create recovery code label')}
43
- icon='ph--receipt--duotone'
44
- variant='default'
45
- size={5}
46
- onClick={() => dispatch(createIntent(ClientAction.CreateRecoveryCode))}
47
- />
48
- </ControlItem>
49
- </ControlGroup>
50
- </ControlSection>
51
- <ControlSection title={t('credentials list label')}>
52
- {recoveryCredentials.length < 1 ? (
53
- <Message.Root valence='error' classNames='container-max-width'>
54
- <Message.Title icon='ph--shield-warning--duotone'>{t('no credentials title')}</Message.Title>
55
- <Message.Content>{t('no credentials message')}</Message.Content>
56
- </Message.Root>
57
- ) : (
58
- <List classNames='container-max-width pli-2'>
59
- {recoveryCredentials.map((credential) => (
60
- <ListItem.Root key={credential.id?.toHex()}>
61
- <ListItem.Endcap>
62
- <Icon icon='ph--key--regular' size={5} />
63
- </ListItem.Endcap>
64
- <ListItem.Heading>{credential.issuanceDate.toLocaleString()}</ListItem.Heading>
65
- </ListItem.Root>
66
- ))}
67
- </List>
68
- )}
69
- </ControlSection>
70
- </ControlPage>
71
- </StackItem.Content>
27
+ <ControlPage>
28
+ <ControlSection title={t('recovery setup dialog title')} description={t('recovery setup dialog description')}>
29
+ <ControlGroup>
30
+ <ControlItem title={t('create passkey label')} description={t('create passkey description')}>
31
+ <IconButton
32
+ label={t('create passkey label')}
33
+ icon='ph--key--duotone'
34
+ variant='primary'
35
+ onClick={() => dispatch(createIntent(ClientAction.CreatePasskey))}
36
+ />
37
+ </ControlItem>
38
+ <ControlItem title={t('create recovery code label')} description={t('create recovery code description')}>
39
+ <IconButton
40
+ label={t('create recovery code label')}
41
+ icon='ph--receipt--duotone'
42
+ variant='default'
43
+ onClick={() => dispatch(createIntent(ClientAction.CreateRecoveryCode))}
44
+ />
45
+ </ControlItem>
46
+ </ControlGroup>
47
+ </ControlSection>
48
+ <ControlSection title={t('credentials list label')}>
49
+ {recoveryCredentials.length < 1 ? (
50
+ <Message.Root valence='error' classNames='container-max-width'>
51
+ <Message.Title icon='ph--shield-warning--duotone'>{t('no credentials title')}</Message.Title>
52
+ <Message.Content>{t('no credentials message')}</Message.Content>
53
+ </Message.Root>
54
+ ) : (
55
+ <List classNames='container-max-width pli-2'>
56
+ {recoveryCredentials.map((credential) => (
57
+ <ListItem.Root key={credential.id?.toHex()}>
58
+ <ListItem.Endcap>
59
+ <Icon icon='ph--key--regular' />
60
+ </ListItem.Endcap>
61
+ <ListItem.Heading>{credential.issuanceDate.toLocaleString()}</ListItem.Heading>
62
+ </ListItem.Root>
63
+ ))}
64
+ </List>
65
+ )}
66
+ </ControlSection>
67
+ </ControlPage>
72
68
  );
73
69
  };
@@ -2,16 +2,15 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
10
8
  import { IntentPlugin } from '@dxos/app-framework';
11
9
  import { withPluginManager } from '@dxos/app-framework/testing';
12
10
  import { Dialog } from '@dxos/react-ui';
13
- import { withLayout, withTheme } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
13
+ import { ClientPlugin } from '../ClientPlugin';
15
14
  import { translations } from '../translations';
16
15
 
17
16
  import { ResetDialog, type ResetDialogProps } from './ResetDialog';
@@ -26,26 +25,25 @@ const Render = (props: ResetDialogProps) => {
26
25
  );
27
26
  };
28
27
 
29
- const meta: Meta<ResetDialogProps> = {
28
+ const meta = {
30
29
  title: 'plugins/plugin-client/ResetDialog',
31
30
  component: ResetDialog,
32
31
  render: Render,
33
32
  decorators: [
33
+ withTheme, // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
34
34
  withPluginManager({
35
- plugins: [IntentPlugin()],
35
+ plugins: [IntentPlugin(), ClientPlugin({})],
36
36
  }),
37
- withTheme,
38
- withLayout(),
39
37
  ],
40
38
  parameters: {
41
39
  layout: 'fullscreen',
42
40
  translations,
43
41
  },
44
- };
42
+ } satisfies Meta<typeof ResetDialog>;
45
43
 
46
44
  export default meta;
47
45
 
48
- type Story = StoryObj<ResetDialogProps>;
46
+ type Story = StoryObj<typeof meta>;
49
47
 
50
48
  export const Default: Story = { args: { mode: 'reset storage' } };
51
49
 
@@ -4,20 +4,21 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { useClient } from '@dxos/react-client';
9
10
  import { Dialog, useTranslation } from '@dxos/react-ui';
10
11
  import { ConfirmReset, type ConfirmResetProps } from '@dxos/shell/react';
11
12
 
12
- import { CLIENT_PLUGIN } from '../meta';
13
+ import { meta } from '../meta';
13
14
  import { type ClientPluginOptions } from '../types';
14
15
 
15
- export const RESET_DIALOG = `${CLIENT_PLUGIN}/ResetDialog`;
16
+ export const RESET_DIALOG = `${meta.id}/ResetDialog`;
16
17
 
17
18
  export type ResetDialogProps = Pick<ConfirmResetProps, 'mode'> & Pick<ClientPluginOptions, 'onReset'>;
18
19
 
19
20
  export const ResetDialog = ({ mode, onReset }: ResetDialogProps) => {
20
- const { t } = useTranslation(CLIENT_PLUGIN);
21
+ const { t } = useTranslation(meta.id);
21
22
  const { dispatchPromise: dispatch } = useIntentDispatcher();
22
23
  const client = useClient();
23
24
 
package/src/events.ts CHANGED
@@ -4,12 +4,12 @@
4
4
 
5
5
  import { defineEvent } from '@dxos/app-framework';
6
6
 
7
- import { CLIENT_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace ClientEvents {
10
- export const ClientReady = defineEvent(`${CLIENT_PLUGIN}/event/client-ready`);
11
- export const SetupSchema = defineEvent(`${CLIENT_PLUGIN}/event/setup-schema`);
12
- export const SetupMigration = defineEvent(`${CLIENT_PLUGIN}/event/setup-migration`);
13
- export const IdentityCreated = defineEvent(`${CLIENT_PLUGIN}/event/identity-created`);
14
- export const SpacesReady = defineEvent(`${CLIENT_PLUGIN}/event/spaces-ready`);
10
+ export const ClientReady = defineEvent(`${meta.id}/event/client-ready`);
11
+ export const SetupSchema = defineEvent(`${meta.id}/event/setup-schema`);
12
+ export const SetupMigration = defineEvent(`${meta.id}/event/setup-migration`);
13
+ export const IdentityCreated = defineEvent(`${meta.id}/event/identity-created`);
14
+ export const SpacesReady = defineEvent(`${meta.id}/event/spaces-ready`);
15
15
  }
package/src/index.ts CHANGED
@@ -2,8 +2,9 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './ClientPlugin';
6
- export * from './meta';
7
-
8
5
  export { ClientCapabilities } from './capabilities';
9
6
  export { ClientEvents } from './events';
7
+ export * from './meta';
8
+ export * from './types';
9
+
10
+ export * from './ClientPlugin';
package/src/meta.ts CHANGED
@@ -3,10 +3,13 @@
3
3
  //
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
-
7
- export const CLIENT_PLUGIN = 'dxos.org/plugin/client';
6
+ import { trim } from '@dxos/util';
8
7
 
9
8
  export const meta: PluginMeta = {
10
- id: CLIENT_PLUGIN,
9
+ id: 'dxos.org/plugin/client',
11
10
  name: 'Client',
11
+ description: trim`
12
+ Core client connectivity and peer-to-peer networking infrastructure.
13
+ Manages identity, authentication, and real-time synchronization across devices.
14
+ `,
12
15
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { type PluginContext } from '@dxos/app-framework';
8
8
  import { type Client, type ClientOptions, PublicKey } from '@dxos/react-client';
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { createIntent } from '@dxos/app-framework';\nimport { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';\nimport { ROOT_ID, createExtension, rxFromObservable } from '@dxos/plugin-graph';\nimport { ConnectionState } from '@dxos/react-client/mesh';\n\nimport { CLIENT_PLUGIN } from '../meta';\nimport { Account, ClientAction } from '../types';\n\nimport { ClientCapabilities } from './capabilities';\n\nexport default (context: PluginContext) =>\n contributes(\n Capabilities.AppGraphBuilder,\n createExtension({\n id: CLIENT_PLUGIN,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => {\n return [\n {\n id: `${CLIENT_PLUGIN}/open-user-account`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(ClientAction.ShareIdentity));\n },\n properties: {\n label: ['open user account label', { ns: CLIENT_PLUGIN }],\n icon: 'ph--user--regular',\n disposition: 'menu',\n keyBinding: {\n macos: 'meta+shift+.',\n // TODO(wittjosiah): Test on windows to see if it behaves the same as linux.\n windows: 'alt+shift+.',\n linux: 'alt+shift+>',\n },\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => {\n const client = context.getCapability(ClientCapabilities.Client);\n const identity = get(rxFromObservable(client.halo.identity));\n const status = get(rxFromObservable(client.mesh.networkStatus));\n\n return [\n {\n id: Account.id,\n type: CLIENT_PLUGIN,\n properties: {\n label: ['account label', { ns: CLIENT_PLUGIN }],\n icon: 'ph--user--regular',\n disposition: 'user-account',\n // NOTE: This currently needs to be the identity key because the fallback is generated from hex.\n userId: identity?.identityKey.toHex(),\n hue: identity?.profile?.data?.hue,\n emoji: identity?.profile?.data?.emoji,\n status: status.swarm === ConnectionState.OFFLINE ? 'error' : 'active',\n },\n nodes: [\n {\n id: Account.Profile,\n data: Account.Profile,\n type: CLIENT_PLUGIN,\n properties: {\n label: ['profile label', { ns: CLIENT_PLUGIN }],\n icon: 'ph--user--regular',\n },\n },\n {\n id: Account.Devices,\n data: Account.Devices,\n type: CLIENT_PLUGIN,\n properties: {\n label: ['devices label', { ns: CLIENT_PLUGIN }],\n icon: 'ph--devices--regular',\n testId: 'clientPlugin.devices',\n },\n },\n {\n id: Account.Security,\n data: Account.Security,\n type: CLIENT_PLUGIN,\n properties: {\n label: ['security label', { ns: CLIENT_PLUGIN }],\n icon: 'ph--key--regular',\n },\n },\n ],\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n );\n"],
5
- "mappings": ";;;;;;;;;;;;AAIA,SAASA,UAAU;AACnB,SAASC,QAAQC,YAAY;AAE7B,SAASC,oBAAoB;AAC7B,SAASC,cAAkCC,mBAAmB;AAC9D,SAASC,SAASC,iBAAiBC,wBAAwB;AAC3D,SAASC,uBAAuB;AAOhC,IAAA,4BAAe,CAACC,YACdC,YACEC,aAAaC,iBACbC,gBAAgB;EACdC,IAAIC;EACJC,SAAS,CAACC,SACRC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKH,OAAOU,UAAUF,OAAOG,KAAKR,KAAAA,IAAQK,OAAOI,KAAI,CAAA,GAC/EJ,OAAOK,IAAI,MAAA;AACT,WAAO;MACL;QACEb,IAAI,GAAGC,aAAAA;QACPa,MAAM,YAAA;AACJ,gBAAM,EAAEC,iBAAiBC,SAAQ,IAAKrB,QAAQsB,cAAcpB,aAAaqB,gBAAgB;AACzF,gBAAMF,SAASG,aAAaC,aAAaC,aAAa,CAAA;QACxD;QACAC,YAAY;UACVC,OAAO;YAAC;YAA2B;cAAEC,IAAIvB;YAAc;;UACvDwB,MAAM;UACNC,aAAa;UACbC,YAAY;YACVC,OAAO;;YAEPC,SAAS;YACTC,OAAO;UACT;QACF;MACF;;EAEJ,CAAA,GACAtB,OAAOuB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAG/BC,WAAW,CAAC7B,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKH,OAAOU,UAAUF,OAAOG,KAAKR,KAAAA,IAAQK,OAAOI,KAAI,CAAA,GAC/EJ,OAAOK,IAAI,MAAA;AACT,UAAMoB,SAAStC,QAAQsB,cAAciB,mBAAmBC,MAAM;AAC9D,UAAMC,WAAW9B,IAAI+B,iBAAiBJ,OAAOK,KAAKF,QAAQ,CAAA;AAC1D,UAAMG,SAASjC,IAAI+B,iBAAiBJ,OAAOO,KAAKC,aAAa,CAAA;AAE7D,WAAO;MACL;QACEzC,IAAI0C,QAAQ1C;QACZ2C,MAAM1C;QACNqB,YAAY;UACVC,OAAO;YAAC;YAAiB;cAAEC,IAAIvB;YAAc;;UAC7CwB,MAAM;UACNC,aAAa;;UAEbkB,QAAQR,UAAUS,YAAYC,MAAAA;UAC9BC,KAAKX,UAAUY,SAASlC,MAAMiC;UAC9BE,OAAOb,UAAUY,SAASlC,MAAMmC;UAChCV,QAAQA,OAAOW,UAAUC,gBAAgBC,UAAU,UAAU;QAC/D;QACAC,OAAO;UACL;YACErD,IAAI0C,QAAQY;YACZxC,MAAM4B,QAAQY;YACdX,MAAM1C;YACNqB,YAAY;cACVC,OAAO;gBAAC;gBAAiB;kBAAEC,IAAIvB;gBAAc;;cAC7CwB,MAAM;YACR;UACF;UACA;YACEzB,IAAI0C,QAAQa;YACZzC,MAAM4B,QAAQa;YACdZ,MAAM1C;YACNqB,YAAY;cACVC,OAAO;gBAAC;gBAAiB;kBAAEC,IAAIvB;gBAAc;;cAC7CwB,MAAM;cACN+B,QAAQ;YACV;UACF;UACA;YACExD,IAAI0C,QAAQe;YACZ3C,MAAM4B,QAAQe;YACdd,MAAM1C;YACNqB,YAAY;cACVC,OAAO;gBAAC;gBAAkB;kBAAEC,IAAIvB;gBAAc;;cAC9CwB,MAAM;YACR;UACF;;MAEJ;;EAEJ,CAAA,GACAjB,OAAOuB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;AAGjC,CAAA,CAAA;",
6
- "names": ["Rx", "Option", "pipe", "createIntent", "Capabilities", "contributes", "ROOT_ID", "createExtension", "rxFromObservable", "ConnectionState", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "CLIENT_PLUGIN", "actions", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "data", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "createIntent", "ClientAction", "ShareIdentity", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "linux", "getOrElse", "connector", "client", "ClientCapabilities", "Client", "identity", "rxFromObservable", "halo", "status", "mesh", "networkStatus", "Account", "type", "userId", "identityKey", "toHex", "hue", "profile", "emoji", "swarm", "ConnectionState", "OFFLINE", "nodes", "Profile", "Devices", "testId", "Security"]
7
- }
@@ -1,18 +0,0 @@
1
- import {
2
- CLIENT_PLUGIN
3
- } from "./chunk-GS3LDHYD.mjs";
4
-
5
- // src/capabilities/capabilities.ts
6
- import { defineCapability } from "@dxos/app-framework";
7
- (function(ClientCapabilities2) {
8
- ClientCapabilities2.Client = defineCapability(`${CLIENT_PLUGIN}/capability/client`);
9
- ClientCapabilities2.Schema = defineCapability(`${CLIENT_PLUGIN}/capability/schema`);
10
- ClientCapabilities2.SchemaWhiteList = defineCapability(`${CLIENT_PLUGIN}/capability/schema-whitelist`);
11
- ClientCapabilities2.Migration = defineCapability(`${CLIENT_PLUGIN}/capability/migration`);
12
- })(ClientCapabilities || (ClientCapabilities = {}));
13
- var ClientCapabilities;
14
-
15
- export {
16
- ClientCapabilities
17
- };
18
- //# sourceMappingURL=chunk-3F2Q2RKC.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/capabilities.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type Client } from '@dxos/client';\nimport { type ObjectMigration } from '@dxos/client/echo';\nimport { type Type } from '@dxos/echo';\n\nimport { CLIENT_PLUGIN } from '../meta';\n\nexport namespace ClientCapabilities {\n export const Client = defineCapability<Client>(`${CLIENT_PLUGIN}/capability/client`);\n export const Schema = defineCapability<Type.Obj.Any[]>(`${CLIENT_PLUGIN}/capability/schema`);\n // TODO(wittjosiah): More descriptive name.\n export const SchemaWhiteList = defineCapability<Type.Obj.Any[]>(`${CLIENT_PLUGIN}/capability/schema-whitelist`);\n export const Migration = defineCapability<ObjectMigration[]>(`${CLIENT_PLUGIN}/capability/migration`);\n}\n"],
5
- "mappings": ";;;;;AAIA,SAASA,wBAAwB;UAOhBC,qBAAAA;sBACFC,SAASC,iBAAyB,GAAGC,aAAAA,oBAAiC;sBACtEC,SAASF,iBAAiC,GAAGC,aAAAA,oBAAiC;sBAE9EE,kBAAkBH,iBAAiC,GAAGC,aAAAA,8BAA2C;sBACjGG,YAAYJ,iBAAoC,GAAGC,aAAAA,uBAAoC;AACtG,GANiBH,uBAAAA,qBAAAA,CAAAA,EAAAA;;",
6
- "names": ["defineCapability", "ClientCapabilities", "Client", "defineCapability", "CLIENT_PLUGIN", "Schema", "SchemaWhiteList", "Migration"]
7
- }