@dxos/shell 0.7.5-labs.a279d8c → 0.7.5-labs.ea4b4c2

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 (74) hide show
  1. package/dist/bundle/shell.mjs +16927 -17875
  2. package/dist/bundle/shell.mjs.map +1 -1
  3. package/dist/bundle/shell.umd.js +149 -147
  4. package/dist/bundle/shell.umd.js.map +1 -1
  5. package/dist/bundle/style.css +1 -1
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/react.mjs +532 -794
  8. package/dist/lib/browser/react.mjs.map +4 -4
  9. package/dist/lib/node/meta.json +1 -1
  10. package/dist/lib/node/react.cjs +625 -887
  11. package/dist/lib/node/react.cjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/react.mjs +532 -794
  14. package/dist/lib/node-esm/react.mjs.map +4 -4
  15. package/dist/types/src/components/AgentConfig.js +1 -1
  16. package/dist/types/src/components/AgentConfig.js.map +1 -1
  17. package/dist/types/src/components/DeviceList/DeviceList.js +1 -1
  18. package/dist/types/src/components/DeviceList/DeviceList.js.map +1 -1
  19. package/dist/types/src/components/index.d.ts +0 -2
  20. package/dist/types/src/components/index.d.ts.map +1 -1
  21. package/dist/types/src/components/index.js +0 -2
  22. package/dist/types/src/components/index.js.map +1 -1
  23. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  24. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +14 -14
  25. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  26. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  27. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +3 -0
  28. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
  29. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +2 -1
  30. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  31. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -1
  32. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +3 -2
  33. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -1
  34. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js +1 -1
  35. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.js.map +1 -1
  36. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts.map +1 -1
  37. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js +5 -0
  38. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js.map +1 -1
  39. package/dist/types/src/testing/fixtures/identities.d.ts.map +1 -1
  40. package/dist/types/src/testing/fixtures/identities.js +2 -0
  41. package/dist/types/src/testing/fixtures/identities.js.map +1 -1
  42. package/dist/types/src/translations/locales/en-US.d.ts +1 -1
  43. package/dist/types/src/translations/locales/en-US.js +1 -1
  44. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  45. package/dist/types/tsconfig.tsbuildinfo +1 -1
  46. package/package.json +31 -30
  47. package/src/components/AgentConfig.tsx +1 -1
  48. package/src/components/DeviceList/DeviceList.tsx +1 -1
  49. package/src/components/index.ts +0 -2
  50. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +3 -0
  51. package/src/panels/IdentityPanel/IdentityPanel.tsx +29 -26
  52. package/src/panels/IdentityPanel/IdentityPanelProps.ts +8 -1
  53. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +2 -1
  54. package/src/panels/JoinPanel/steps/IdentityInput.tsx +1 -1
  55. package/src/panels/SpacePanel/SpacePanel.stories.tsx +6 -1
  56. package/src/testing/fixtures/identities.ts +2 -0
  57. package/src/translations/locales/en-US.ts +1 -1
  58. package/dist/lib/browser/react.css +0 -7
  59. package/dist/lib/browser/react.css.map +0 -7
  60. package/dist/lib/node/react.css +0 -7
  61. package/dist/lib/node/react.css.map +0 -7
  62. package/dist/lib/node-esm/react.css +0 -7
  63. package/dist/lib/node-esm/react.css.map +0 -7
  64. package/dist/types/src/components/EmojiPicker.d.ts +0 -19
  65. package/dist/types/src/components/EmojiPicker.d.ts.map +0 -1
  66. package/dist/types/src/components/EmojiPicker.js +0 -146
  67. package/dist/types/src/components/EmojiPicker.js.map +0 -1
  68. package/dist/types/src/components/HuePicker.d.ts +0 -18
  69. package/dist/types/src/components/HuePicker.d.ts.map +0 -1
  70. package/dist/types/src/components/HuePicker.js +0 -133
  71. package/dist/types/src/components/HuePicker.js.map +0 -1
  72. package/src/components/EmojiPicker.tsx +0 -187
  73. package/src/components/HuePicker.tsx +0 -182
  74. package/src/components/emoji.css +0 -25
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/shell",
3
- "version": "0.7.5-labs.a279d8c",
3
+ "version": "0.7.5-labs.ea4b4c2",
4
4
  "description": "DXOS’s OS experiences",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -42,29 +42,30 @@
42
42
  "dependencies": {
43
43
  "@emoji-mart/data": "^1.1.2",
44
44
  "@emoji-mart/react": "^1.1.1",
45
- "@fluentui/react-tabster": "^9.19.0",
46
- "@radix-ui/react-accordion": "^1.1.1",
47
- "@radix-ui/react-context": "^1.0.0",
48
- "@radix-ui/react-radio-group": "^1.1.2",
49
- "@radix-ui/react-use-controllable-state": "^1.0.0",
45
+ "@fluentui/react-tabster": "9.23.3",
46
+ "@radix-ui/react-accordion": "1.2.3",
47
+ "@radix-ui/react-context": "1.1.1",
48
+ "@radix-ui/react-radio-group": "1.2.3",
49
+ "@radix-ui/react-use-controllable-state": "1.1.0",
50
50
  "@xstate/react": "^3.2.1",
51
51
  "date-fns": "^3.3.1",
52
52
  "emoji-mart": "^5.5.2",
53
53
  "react-qr-rounded": "^1.0.0",
54
54
  "url-join": "^5.0.0",
55
55
  "xstate": "^4.37.0",
56
- "@dxos/async": "0.7.5-labs.a279d8c",
57
- "@dxos/client-protocol": "0.7.5-labs.a279d8c",
58
- "@dxos/client-services": "0.7.5-labs.a279d8c",
59
- "@dxos/debug": "0.7.5-labs.a279d8c",
60
- "@dxos/display-name": "0.7.5-labs.a279d8c",
61
- "@dxos/invariant": "0.7.5-labs.a279d8c",
62
- "@dxos/log": "0.7.5-labs.a279d8c",
63
- "@dxos/protocols": "0.7.5-labs.a279d8c",
64
- "@dxos/react-ui-types": "0.7.5-labs.a279d8c",
65
- "@dxos/rpc": "0.7.5-labs.a279d8c",
66
- "@dxos/rpc-tunnel": "0.7.5-labs.a279d8c",
67
- "@dxos/util": "0.7.5-labs.a279d8c"
56
+ "@dxos/async": "0.7.5-labs.ea4b4c2",
57
+ "@dxos/client-protocol": "0.7.5-labs.ea4b4c2",
58
+ "@dxos/client-services": "0.7.5-labs.ea4b4c2",
59
+ "@dxos/debug": "0.7.5-labs.ea4b4c2",
60
+ "@dxos/display-name": "0.7.5-labs.ea4b4c2",
61
+ "@dxos/invariant": "0.7.5-labs.ea4b4c2",
62
+ "@dxos/log": "0.7.5-labs.ea4b4c2",
63
+ "@dxos/react-ui-pickers": "0.7.5-labs.ea4b4c2",
64
+ "@dxos/protocols": "0.7.5-labs.ea4b4c2",
65
+ "@dxos/react-ui-types": "0.7.5-labs.ea4b4c2",
66
+ "@dxos/rpc-tunnel": "0.7.5-labs.ea4b4c2",
67
+ "@dxos/rpc": "0.7.5-labs.ea4b4c2",
68
+ "@dxos/util": "0.7.5-labs.ea4b4c2"
68
69
  },
69
70
  "devDependencies": {
70
71
  "@phosphor-icons/react": "^2.1.5",
@@ -74,25 +75,25 @@
74
75
  "react": "~18.2.0",
75
76
  "react-dom": "~18.2.0",
76
77
  "vite": "5.4.7",
77
- "@dxos/react-client": "0.7.5-labs.a279d8c",
78
- "@dxos/config": "0.7.5-labs.a279d8c",
79
- "@dxos/random": "0.7.5-labs.a279d8c",
80
- "@dxos/react-hooks": "0.7.5-labs.a279d8c",
81
- "@dxos/react-ui": "0.7.5-labs.a279d8c",
82
- "@dxos/protocols": "0.7.5-labs.a279d8c",
83
- "@dxos/storybook-utils": "0.7.5-labs.a279d8c",
84
- "@dxos/react-ui-theme": "0.7.5-labs.a279d8c",
85
- "@dxos/test-utils": "0.7.5-labs.a279d8c"
78
+ "@dxos/config": "0.7.5-labs.ea4b4c2",
79
+ "@dxos/random": "0.7.5-labs.ea4b4c2",
80
+ "@dxos/protocols": "0.7.5-labs.ea4b4c2",
81
+ "@dxos/react-client": "0.7.5-labs.ea4b4c2",
82
+ "@dxos/react-hooks": "0.7.5-labs.ea4b4c2",
83
+ "@dxos/react-ui": "0.7.5-labs.ea4b4c2",
84
+ "@dxos/react-ui-theme": "0.7.5-labs.ea4b4c2",
85
+ "@dxos/test-utils": "0.7.5-labs.ea4b4c2",
86
+ "@dxos/storybook-utils": "0.7.5-labs.ea4b4c2"
86
87
  },
87
88
  "peerDependencies": {
88
89
  "react": "~18.2.0",
89
90
  "react-dom": "~18.2.0",
90
- "@dxos/react-client": "0.7.5-labs.a279d8c"
91
+ "@dxos/react-client": "0.7.5-labs.ea4b4c2"
91
92
  },
92
93
  "optionalDependencies": {
93
94
  "@phosphor-icons/react": "^2.1.5",
94
- "@dxos/react-ui": "0.7.5-labs.a279d8c",
95
- "@dxos/react-ui-theme": "0.7.5-labs.a279d8c"
95
+ "@dxos/react-ui": "0.7.5-labs.ea4b4c2",
96
+ "@dxos/react-ui-theme": "0.7.5-labs.ea4b4c2"
96
97
  },
97
98
  "publishConfig": {
98
99
  "access": "public"
@@ -88,7 +88,7 @@ export const AgentConfig = ({
88
88
  <>
89
89
  <Button
90
90
  variant='ghost'
91
- classNames='mlb-2 is-full justify-start gap-2 !pis-0 !pie-3'
91
+ classNames='mlb-2 is-full justify-start gap-2 pis-0 pie-3'
92
92
  data-testid={agentStatus === 'creatable' ? 'devices-panel.create-agent' : 'devices-panel.agent-error'}
93
93
  onClick={agentStatus === 'creatable' ? onAgentCreate : onAgentRefresh}
94
94
  aria-describedby='devices-panel.create-agent.description'
@@ -42,7 +42,7 @@ export const DeviceList = ({
42
42
  )}
43
43
  <Button
44
44
  variant='ghost'
45
- classNames='justify-start gap-2 !pis-0 !pie-3 is-full'
45
+ classNames='justify-start gap-2 pis-0 pie-3 is-full'
46
46
  data-testid='devices-panel.create-invitation'
47
47
  onClick={onClickAdd}
48
48
  >
@@ -4,8 +4,6 @@
4
4
 
5
5
  export * from './AgentConfig';
6
6
  export * from './CompoundButton';
7
- export * from './EmojiPicker';
8
- export * from './HuePicker';
9
7
  export * from './IdentityList';
10
8
  export * from './DeviceList';
11
9
  export * from './InvitationList';
@@ -6,6 +6,7 @@ import '@dxos-theme';
6
6
 
7
7
  import React from 'react';
8
8
 
9
+ import { IdentityDid } from '@dxos/keys';
9
10
  import { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';
10
11
  import { faker } from '@dxos/random';
11
12
  import { PublicKey } from '@dxos/react-client';
@@ -27,6 +28,7 @@ const noOpProps: IdentityPanelImplProps = {
27
28
  activeView: 'identity action chooser',
28
29
  createInvitationUrl: (code) => code,
29
30
  identity: {
31
+ did: IdentityDid.random(),
30
32
  identityKey: PublicKey.random(),
31
33
  profile: {
32
34
  displayName: faker.person.firstName(),
@@ -34,6 +36,7 @@ const noOpProps: IdentityPanelImplProps = {
34
36
  },
35
37
  devices: [],
36
38
  connectionState: ConnectionState.ONLINE,
39
+ onManageCredentials: async () => console.log('manage credentials'),
37
40
  };
38
41
 
39
42
  export default {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Key, Plugs, PlugsConnected } from '@phosphor-icons/react';
5
+ import { IdentificationCard, Plugs, PlugsConnected } from '@phosphor-icons/react';
6
6
  import React, { useEffect, useMemo, useState } from 'react';
7
7
 
8
8
  import { generateName } from '@dxos/display-name';
@@ -12,7 +12,8 @@ import { type Identity, useIdentity, useDevices, useHaloInvitations } from '@dxo
12
12
  import { useInvitationStatus } from '@dxos/react-client/invitations';
13
13
  import { type CancellableInvitationObservable } from '@dxos/react-client/invitations';
14
14
  import { useNetworkStatus, ConnectionState } from '@dxos/react-client/mesh';
15
- import { Avatar, Input, Toolbar, Tooltip, useClipboard, useId, useTranslation } from '@dxos/react-ui';
15
+ import { Avatar, Clipboard, Input, Toolbar, Tooltip, useId, useTranslation } from '@dxos/react-ui';
16
+ import { EmojiPickerToolbarButton, HuePickerToolbarButton } from '@dxos/react-ui-pickers';
16
17
  import { getSize } from '@dxos/react-ui-theme';
17
18
  import { hexToEmoji, hexToHue, keyToFallback } from '@dxos/util';
18
19
 
@@ -24,7 +25,7 @@ import {
24
25
  import { useIdentityMachine } from './identityMachine';
25
26
  import { IdentityActionChooser } from './steps';
26
27
  import { useAgentHandlers } from './useAgentHandlers';
27
- import { Viewport, CloseButton, EmojiPickerToolbarButton, Heading, HuePickerToolbarButton } from '../../components';
28
+ import { Viewport, CloseButton, Heading } from '../../components';
28
29
  import { ConfirmReset, InvitationManager } from '../../steps';
29
30
 
30
31
  const viewStyles = 'pbs-1 pbe-3 pli-3';
@@ -43,15 +44,13 @@ const IdentityHeading = ({
43
44
  onUpdateProfile,
44
45
  connectionState,
45
46
  onChangeConnectionState,
47
+ onManageCredentials,
46
48
  }: IdentityPanelHeadingProps) => {
47
49
  const fallbackValue = keyToFallback(identity.identityKey);
48
50
  const { t } = useTranslation('os');
49
51
  const [displayName, setDisplayName] = useState(identity.profile?.displayName ?? '');
50
52
  const [emoji, setEmojiDirectly] = useState<string>(getEmojiValue(identity));
51
53
  const [hue, setHueDirectly] = useState<string>(getHueValue(identity));
52
- const { textValue, setTextValue } = useClipboard();
53
- const identityHex = identity.identityKey.toHex();
54
- const publicKeyCopied = textValue === identityHex;
55
54
 
56
55
  const setEmoji = (nextEmoji: string) => {
57
56
  setEmojiDirectly(nextEmoji);
@@ -94,26 +93,28 @@ const IdentityHeading = ({
94
93
  <Toolbar.Root classNames='flex justify-center items-center gap-1 pt-3'>
95
94
  <EmojiPickerToolbarButton emoji={emoji} onChangeEmoji={setEmoji} classNames='bs-[--rail-action]' />
96
95
  <HuePickerToolbarButton hue={hue} onChangeHue={setHue} classNames='bs-[--rail-action]' />
97
- <Tooltip.Root>
98
- <Tooltip.Trigger asChild>
99
- <Toolbar.Button
100
- classNames='bs-[--rail-action]'
101
- data-testid='update-profile-form-copy-key'
102
- onClick={() => setTextValue(identityHex)}
103
- >
104
- <span className='sr-only'>
105
- {t(publicKeyCopied ? 'copy success label' : 'copy self public key label')}
106
- </span>
107
- <Key className={getSize(5)} />
108
- </Toolbar.Button>
109
- </Tooltip.Trigger>
110
- <Tooltip.Portal>
111
- <Tooltip.Content side='bottom'>
112
- {t(publicKeyCopied ? 'copy success label' : 'copy self public key label')}
113
- <Tooltip.Arrow />
114
- </Tooltip.Content>
115
- </Tooltip.Portal>
116
- </Tooltip.Root>
96
+ <Clipboard.IconButton
97
+ classNames='bs-[--rail-action]'
98
+ data-testid='update-profile-form-copy-key'
99
+ label={t('copy self did label')}
100
+ value={identity.did}
101
+ />
102
+ {onManageCredentials && (
103
+ <Tooltip.Root>
104
+ <Tooltip.Trigger asChild>
105
+ <Toolbar.Button classNames='bs-[--rail-action]' onClick={onManageCredentials}>
106
+ <span className='sr-only'>{t('manage credentials label')}</span>
107
+ <IdentificationCard className={getSize(5)} />
108
+ </Toolbar.Button>
109
+ </Tooltip.Trigger>
110
+ <Tooltip.Portal>
111
+ <Tooltip.Content side='bottom'>
112
+ {t('manage credentials label')}
113
+ <Tooltip.Arrow />
114
+ </Tooltip.Content>
115
+ </Tooltip.Portal>
116
+ </Tooltip.Root>
117
+ )}
117
118
  <Tooltip.Root>
118
119
  <Tooltip.Trigger asChild>
119
120
  <Toolbar.Button
@@ -153,6 +154,7 @@ export const IdentityPanelImpl = (props: IdentityPanelImplProps) => {
153
154
  connectionState,
154
155
  onChangeConnectionState,
155
156
  onDone,
157
+ onManageCredentials,
156
158
  ...rest
157
159
  } = props;
158
160
  const { t } = useTranslation('os');
@@ -180,6 +182,7 @@ export const IdentityPanelImpl = (props: IdentityPanelImplProps) => {
180
182
  onUpdateProfile,
181
183
  connectionState,
182
184
  onChangeConnectionState,
185
+ onManageCredentials,
183
186
  }}
184
187
  />
185
188
  <Viewport.Root activeView={activeView}>
@@ -29,6 +29,7 @@ export type IdentityPanelImplProps = {
29
29
  connectionState?: ConnectionState;
30
30
  onChangeConnectionState?: (nextState: ConnectionState) => Promise<void>;
31
31
  onUpdateProfile?: (profile: NonNullable<Identity['profile']>) => Promise<void>;
32
+ onManageCredentials?: () => Promise<void>;
32
33
  onResetStorage?: () => Promise<void>;
33
34
  onRecover?: () => Promise<void>;
34
35
  onJoinNewIdentity?: () => Promise<void>;
@@ -46,7 +47,13 @@ export type IdentityPanelProps = Partial<Omit<IdentityPanelImplProps, 'send' | '
46
47
 
47
48
  export type IdentityPanelHeadingProps = Pick<
48
49
  IdentityPanelImplProps,
49
- 'titleId' | 'identity' | 'onDone' | 'onUpdateProfile' | 'connectionState' | 'onChangeConnectionState'
50
+ | 'titleId'
51
+ | 'identity'
52
+ | 'onDone'
53
+ | 'onUpdateProfile'
54
+ | 'connectionState'
55
+ | 'onChangeConnectionState'
56
+ | 'onManageCredentials'
50
57
  > & {
51
58
  title: string;
52
59
  };
@@ -8,9 +8,10 @@ import { type Event, type SingleOrArray } from 'xstate';
8
8
  import { log } from '@dxos/log';
9
9
  import { type Identity } from '@dxos/react-client/halo';
10
10
  import { useClipboard, useTranslation } from '@dxos/react-ui';
11
+ import { EmojiPickerBlock, HuePickerBlock } from '@dxos/react-ui-pickers';
11
12
  import { hexToEmoji, hexToHue } from '@dxos/util';
12
13
 
13
- import { Action, Actions, StepHeading, Input, EmojiPickerBlock, HuePickerBlock } from '../../../components';
14
+ import { Action, Actions, StepHeading, Input } from '../../../components';
14
15
  import { type IdentityPanelStepProps } from '../IdentityPanelProps';
15
16
  import { type IdentityEvent } from '../identityMachine';
16
17
 
@@ -31,7 +31,7 @@ export const IdentityInput = (props: IdentityInputProps) => {
31
31
  const [validationMessage, setValidationMessage] = useState('');
32
32
  const handleConfirm = async (value: string) => {
33
33
  if (isRecover) {
34
- await client.halo.recoverIdentity({ seedphrase: value }).then(
34
+ await client.halo.recoverIdentity({ recoveryCode: value }).then(
35
35
  (identity) => {
36
36
  send?.({ type: 'selectIdentity' as const, identity });
37
37
  },
@@ -6,7 +6,7 @@ import '@dxos-theme';
6
6
 
7
7
  import React from 'react';
8
8
 
9
- import { PublicKey } from '@dxos/keys';
9
+ import { IdentityDid, PublicKey } from '@dxos/keys';
10
10
  import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
11
11
  import { Invitation } from '@dxos/react-client/invitations';
12
12
  import { withTheme } from '@dxos/storybook-utils';
@@ -179,6 +179,7 @@ export const SpaceManagerWithMember = () => {
179
179
  presence: SpaceMember.PresenceState.ONLINE,
180
180
  role: HaloSpaceMember.Role.ADMIN,
181
181
  identity: {
182
+ did: IdentityDid.random(),
182
183
  identityKey: PublicKey.random(),
183
184
  },
184
185
  },
@@ -212,6 +213,7 @@ export const SpaceManagerWithMembers = () => {
212
213
  presence: SpaceMember.PresenceState.ONLINE,
213
214
  role: HaloSpaceMember.Role.ADMIN,
214
215
  identity: {
216
+ did: IdentityDid.random(),
215
217
  identityKey: PublicKey.random(),
216
218
  profile: {
217
219
  displayName: 'John Doe',
@@ -252,6 +254,7 @@ export const SpaceManagerWithMoreMembers = () => {
252
254
  presence: SpaceMember.PresenceState.ONLINE,
253
255
  role: HaloSpaceMember.Role.ADMIN,
254
256
  identity: {
257
+ did: IdentityDid.random(),
255
258
  identityKey: PublicKey.random(),
256
259
  profile: {
257
260
  displayName: 'John Doe',
@@ -262,6 +265,7 @@ export const SpaceManagerWithMoreMembers = () => {
262
265
  presence: SpaceMember.PresenceState.OFFLINE,
263
266
  role: HaloSpaceMember.Role.ADMIN,
264
267
  identity: {
268
+ did: IdentityDid.random(),
265
269
  identityKey: PublicKey.random(),
266
270
  profile: {
267
271
  displayName: 'Alice Wong',
@@ -272,6 +276,7 @@ export const SpaceManagerWithMoreMembers = () => {
272
276
  presence: SpaceMember.PresenceState.OFFLINE,
273
277
  role: HaloSpaceMember.Role.ADMIN,
274
278
  identity: {
279
+ did: IdentityDid.random(),
275
280
  identityKey: PublicKey.random(),
276
281
  profile: {
277
282
  displayName: 'Steel Nickels',
@@ -2,12 +2,14 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { IdentityDid } from '@dxos/keys';
5
6
  import { PublicKey } from '@dxos/react-client';
6
7
  import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
7
8
 
8
9
  export const alice: SpaceMember = {
9
10
  role: HaloSpaceMember.Role.ADMIN,
10
11
  identity: {
12
+ did: IdentityDid.random(),
11
13
  identityKey: PublicKey.random(),
12
14
  profile: {
13
15
  displayName: 'Alice',
@@ -8,7 +8,7 @@ export const os = {
8
8
  'sidebar label': 'DXOS sidebar',
9
9
  'copy invitation code label': 'Copy URL',
10
10
  'copy success label': 'Copied',
11
- 'copy self public key label': 'Copy public key',
11
+ 'copy self did label': 'Copy DID',
12
12
  'open share panel label': 'View QR code',
13
13
  'joining space heading': 'Joining space',
14
14
  'join space heading': 'Enter space invitation',
@@ -1,7 +0,0 @@
1
- /* packages/sdk/shell/src/components/emoji.css */
2
- [data-theme=dark] em-emoji-picker {
3
- --background-rgb: #3B3B3F;
4
- --rgb-background: #3B3B3F;
5
- --font-family: "Inter Variable", ui-sans-serif;
6
- }
7
- /*# sourceMappingURL=react.css.map */
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/emoji.css"],
4
- "sourcesContent": ["/**\n * https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html\n */\n[data-theme=\"dark\"] em-emoji-picker {\n /* TODO(burdon): Get from TW defs: modal-surface? */\n --background-rgb: #3B3B3F;\n --rgb-background: #3B3B3F;\n\n --font-family: \"Inter Variable\", ui-sans-serif;\n\n /*--font-size: 16px;*/\n /*--color-border-over: rgba(0, 0, 0, 0.1);*/\n /*--color-border: rgba(0, 0, 0, 0.05);*/\n /*--category-icon-size: 24px;*/\n /*--border-radius: 24px;*/\n /*--font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;*/\n /*--rgb-accent: 255, 105, 180;*/\n /*--rgb-color: 102, 51, 153;*/\n /*--rgb-input: 255, 235, 235;*/\n /*--shadow: 5px 5px 15px -8px rebeccapurple;*/\n\n /*height: 50vh;*/\n /*min-height: 400px;*/\n /*max-height: 800px;*/\n}\n"],
5
- "mappings": ";AAGA,CAAC,iBAAmB;AAElB,oBAAkB;AAClB,oBAAkB;AAElB,iBAAe,gBAAgB,EAAE;AAgBnC;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- /* packages/sdk/shell/src/components/emoji.css */
2
- [data-theme=dark] em-emoji-picker {
3
- --background-rgb: #3B3B3F;
4
- --rgb-background: #3B3B3F;
5
- --font-family: "Inter Variable", ui-sans-serif;
6
- }
7
- /*# sourceMappingURL=react.css.map */
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/emoji.css"],
4
- "sourcesContent": ["/**\n * https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html\n */\n[data-theme=\"dark\"] em-emoji-picker {\n /* TODO(burdon): Get from TW defs: modal-surface? */\n --background-rgb: #3B3B3F;\n --rgb-background: #3B3B3F;\n\n --font-family: \"Inter Variable\", ui-sans-serif;\n\n /*--font-size: 16px;*/\n /*--color-border-over: rgba(0, 0, 0, 0.1);*/\n /*--color-border: rgba(0, 0, 0, 0.05);*/\n /*--category-icon-size: 24px;*/\n /*--border-radius: 24px;*/\n /*--font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;*/\n /*--rgb-accent: 255, 105, 180;*/\n /*--rgb-color: 102, 51, 153;*/\n /*--rgb-input: 255, 235, 235;*/\n /*--shadow: 5px 5px 15px -8px rebeccapurple;*/\n\n /*height: 50vh;*/\n /*min-height: 400px;*/\n /*max-height: 800px;*/\n}\n"],
5
- "mappings": ";AAGA,CAAC,iBAAmB;AAElB,oBAAkB;AAClB,oBAAkB;AAElB,iBAAe,gBAAgB,EAAE;AAgBnC;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- /* packages/sdk/shell/src/components/emoji.css */
2
- [data-theme=dark] em-emoji-picker {
3
- --background-rgb: #3B3B3F;
4
- --rgb-background: #3B3B3F;
5
- --font-family: "Inter Variable", ui-sans-serif;
6
- }
7
- /*# sourceMappingURL=react.css.map */
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/emoji.css"],
4
- "sourcesContent": ["/**\n * https://github.com/missive/emoji-mart/blob/main/packages/emoji-mart-website/example-custom-styles.html\n */\n[data-theme=\"dark\"] em-emoji-picker {\n /* TODO(burdon): Get from TW defs: modal-surface? */\n --background-rgb: #3B3B3F;\n --rgb-background: #3B3B3F;\n\n --font-family: \"Inter Variable\", ui-sans-serif;\n\n /*--font-size: 16px;*/\n /*--color-border-over: rgba(0, 0, 0, 0.1);*/\n /*--color-border: rgba(0, 0, 0, 0.05);*/\n /*--category-icon-size: 24px;*/\n /*--border-radius: 24px;*/\n /*--font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;*/\n /*--rgb-accent: 255, 105, 180;*/\n /*--rgb-color: 102, 51, 153;*/\n /*--rgb-input: 255, 235, 235;*/\n /*--shadow: 5px 5px 15px -8px rebeccapurple;*/\n\n /*height: 50vh;*/\n /*min-height: 400px;*/\n /*max-height: 800px;*/\n}\n"],
5
- "mappings": ";AAGA,CAAC,iBAAmB;AAElB,oBAAkB;AAClB,oBAAkB;AAElB,iBAAe,gBAAgB,EAAE;AAgBnC;",
6
- "names": []
7
- }
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- import { type ButtonProps, type ThemedClassName } from '@dxos/react-ui';
3
- import './emoji.css';
4
- export type EmojiPickerProps = {
5
- disabled?: boolean;
6
- defaultEmoji?: string;
7
- emoji?: string;
8
- onChangeEmoji?: (nextEmoji: string) => void;
9
- onClickClear?: ButtonProps['onClick'];
10
- };
11
- /**
12
- * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
13
- */
14
- export declare const EmojiPickerToolbarButton: ({ disabled, defaultEmoji, emoji, onChangeEmoji, classNames, }: ThemedClassName<Omit<EmojiPickerProps, "onClickClear">>) => React.JSX.Element;
15
- /**
16
- * A button for picking an emoji alongside a button for unsetting it.
17
- */
18
- export declare const EmojiPickerBlock: ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => React.JSX.Element;
19
- //# sourceMappingURL=EmojiPicker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../../../../src/components/EmojiPicker.tsx"],"names":[],"mappings":"AAQA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,eAAe,EAMrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,kEAMlC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,sBA4EzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,mEAAoE,gBAAgB,sBA+DhH,CAAC"}
@@ -1,146 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2024 DXOS.org
4
- //
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.EmojiPickerBlock = exports.EmojiPickerToolbarButton = void 0;
43
- const data_1 = __importDefault(require("@emoji-mart/data"));
44
- const react_1 = __importDefault(require("@emoji-mart/react"));
45
- const react_2 = require("@phosphor-icons/react");
46
- const react_use_controllable_state_1 = require("@radix-ui/react-use-controllable-state");
47
- const react_3 = __importStar(require("react"));
48
- const react_ui_1 = require("@dxos/react-ui");
49
- const react_ui_theme_1 = require("@dxos/react-ui-theme");
50
- require("./emoji.css");
51
- /**
52
- * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
53
- */
54
- const EmojiPickerToolbarButton = ({ disabled, defaultEmoji, emoji, onChangeEmoji, classNames, }) => {
55
- const { t } = (0, react_ui_1.useTranslation)('os');
56
- const { themeMode } = (0, react_ui_1.useThemeContext)();
57
- const [_emojiValue, setEmojiValue] = (0, react_use_controllable_state_1.useControllableState)({
58
- prop: emoji,
59
- onChange: onChangeEmoji,
60
- defaultProp: defaultEmoji,
61
- });
62
- const [emojiPickerOpen, setEmojiPickerOpen] = (0, react_3.useState)(false);
63
- const suppressNextTooltip = (0, react_3.useRef)(false);
64
- const [triggerTooltipOpen, setTriggerTooltipOpen] = (0, react_3.useState)(false);
65
- return (react_3.default.createElement(react_ui_1.Tooltip.Root, { open: triggerTooltipOpen, onOpenChange: (nextOpen) => {
66
- if (suppressNextTooltip.current) {
67
- setTriggerTooltipOpen(false);
68
- suppressNextTooltip.current = false;
69
- }
70
- else {
71
- setTriggerTooltipOpen(nextOpen);
72
- }
73
- } },
74
- react_3.default.createElement(react_ui_1.Popover.Root, { open: emojiPickerOpen, onOpenChange: (nextOpen) => {
75
- setEmojiPickerOpen(nextOpen);
76
- suppressNextTooltip.current = true;
77
- } },
78
- react_3.default.createElement(react_ui_1.Tooltip.Trigger, { asChild: true },
79
- react_3.default.createElement(react_ui_1.Popover.Trigger, { asChild: true },
80
- react_3.default.createElement(react_ui_1.Toolbar.Button, { classNames: ['gap-2 text-2xl plb-1', classNames], disabled: disabled },
81
- react_3.default.createElement("span", { className: 'sr-only' }, t('select emoji label')),
82
- react_3.default.createElement(react_2.UserCircle, { className: (0, react_ui_theme_1.getSize)(5) })))),
83
- react_3.default.createElement(react_ui_1.Tooltip.Portal, null,
84
- react_3.default.createElement(react_ui_1.Tooltip.Content, { side: 'bottom' },
85
- t('select emoji label'),
86
- react_3.default.createElement(react_ui_1.Tooltip.Arrow, null))),
87
- react_3.default.createElement(react_ui_1.Popover.Content, { side: 'bottom', onKeyDownCapture: (event) => {
88
- if (event.key === 'Escape') {
89
- event.stopPropagation();
90
- setEmojiPickerOpen(false);
91
- suppressNextTooltip.current = true;
92
- }
93
- } },
94
- react_3.default.createElement(react_1.default, { data: data_1.default, onEmojiSelect: ({ native }) => {
95
- if (native) {
96
- setEmojiValue(native);
97
- setEmojiPickerOpen(false);
98
- }
99
- }, autoFocus: true, maxFrequentRows: 0, noCountryFlags: true, theme: themeMode }),
100
- react_3.default.createElement(react_ui_1.Popover.Arrow, null)))));
101
- };
102
- exports.EmojiPickerToolbarButton = EmojiPickerToolbarButton;
103
- /**
104
- * A button for picking an emoji alongside a button for unsetting it.
105
- */
106
- const EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }) => {
107
- const { t } = (0, react_ui_1.useTranslation)('os');
108
- const [isMd] = (0, react_ui_1.useMediaQuery)('md', { ssr: false });
109
- const [emojiValue, setEmojiValue] = (0, react_use_controllable_state_1.useControllableState)({
110
- prop: emoji,
111
- onChange: onChangeEmoji,
112
- defaultProp: defaultEmoji,
113
- });
114
- const [emojiPickerOpen, setEmojiPickerOpen] = (0, react_3.useState)(false);
115
- return (react_3.default.createElement(react_3.default.Fragment, null,
116
- react_3.default.createElement(react_ui_1.Popover.Root, { open: emojiPickerOpen, onOpenChange: setEmojiPickerOpen },
117
- react_3.default.createElement(react_ui_1.Popover.Trigger, { asChild: true },
118
- react_3.default.createElement(react_ui_1.Button, { variant: 'ghost', classNames: 'gap-2 text-2xl plb-1', disabled: disabled },
119
- react_3.default.createElement("span", { className: 'sr-only' }, t('select emoji label')),
120
- react_3.default.createElement("span", { className: 'grow pis-14' }, emojiValue),
121
- react_3.default.createElement(react_2.CaretDown, { className: (0, react_ui_theme_1.getSize)(4) }))),
122
- react_3.default.createElement(react_ui_1.Popover.Content, { side: 'right', sideOffset: isMd ? 0 : -310, onKeyDownCapture: (event) => {
123
- if (event.key === 'Escape') {
124
- event.stopPropagation();
125
- setEmojiPickerOpen(false);
126
- }
127
- } },
128
- react_3.default.createElement(react_1.default, { data: data_1.default, onEmojiSelect: ({ native }) => {
129
- if (native) {
130
- setEmojiValue(native);
131
- setEmojiPickerOpen(false);
132
- }
133
- }, autoFocus: true, maxFrequentRows: 0, noCountryFlags: true }),
134
- react_3.default.createElement(react_ui_1.Popover.Arrow, null))),
135
- react_3.default.createElement(react_ui_1.Tooltip.Root, null,
136
- react_3.default.createElement(react_ui_1.Tooltip.Trigger, { asChild: true },
137
- react_3.default.createElement(react_ui_1.Button, { variant: 'ghost', onClick: onClickClear, disabled: disabled },
138
- react_3.default.createElement("span", { className: 'sr-only' }, t('clear label')),
139
- react_3.default.createElement(react_2.ArrowCounterClockwise, null))),
140
- react_3.default.createElement(react_ui_1.Tooltip.Portal, null,
141
- react_3.default.createElement(react_ui_1.Tooltip.Content, { side: 'right' },
142
- t('clear label'),
143
- react_3.default.createElement(react_ui_1.Tooltip.Arrow, null))))));
144
- };
145
- exports.EmojiPickerBlock = EmojiPickerBlock;
146
- //# sourceMappingURL=EmojiPicker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmojiPicker.js","sourceRoot":"","sources":["../../../../src/components/EmojiPicker.tsx"],"names":[],"mappings":"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"}