@dxos/shell 0.4.10-main.f68a1ca → 0.4.10-main.f937af6

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 (152) hide show
  1. package/dist/bundle/index-Cms4wG79.mjs +110 -0
  2. package/dist/bundle/index-Cms4wG79.mjs.map +1 -0
  3. package/dist/bundle/index-DACjPI-n.mjs +96625 -0
  4. package/dist/bundle/index-DACjPI-n.mjs.map +1 -0
  5. package/dist/bundle/shell.mjs +9 -81099
  6. package/dist/bundle/shell.mjs.map +1 -1
  7. package/dist/bundle/shell.umd.js +156 -88
  8. package/dist/bundle/shell.umd.js.map +1 -1
  9. package/dist/bundle/style.css +1 -1
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/react.mjs +866 -824
  12. package/dist/lib/browser/react.mjs.map +4 -4
  13. package/dist/lib/browser/testing/index.mjs +10 -9
  14. package/dist/lib/browser/testing/index.mjs.map +3 -3
  15. package/dist/types/src/components/AgentConfig.d.ts +3 -0
  16. package/dist/types/src/components/AgentConfig.d.ts.map +1 -0
  17. package/dist/types/src/components/AgentConfig.js +37 -0
  18. package/dist/types/src/components/AgentConfig.js.map +1 -0
  19. package/dist/types/src/components/DeviceList/DeviceList.d.ts +3 -0
  20. package/dist/types/src/components/DeviceList/DeviceList.d.ts.map +1 -0
  21. package/dist/types/src/components/DeviceList/DeviceList.js +29 -0
  22. package/dist/types/src/components/DeviceList/DeviceList.js.map +1 -0
  23. package/dist/types/src/components/DeviceList/DeviceListItem.d.ts +6 -0
  24. package/dist/types/src/components/DeviceList/DeviceListItem.d.ts.map +1 -0
  25. package/dist/types/src/components/DeviceList/DeviceListItem.js +72 -0
  26. package/dist/types/src/components/DeviceList/DeviceListItem.js.map +1 -0
  27. package/dist/types/src/components/DeviceList/DeviceListProps.d.ts +27 -0
  28. package/dist/types/src/components/DeviceList/DeviceListProps.d.ts.map +1 -0
  29. package/dist/types/src/components/DeviceList/DeviceListProps.js +6 -0
  30. package/dist/types/src/components/DeviceList/DeviceListProps.js.map +1 -0
  31. package/dist/types/src/components/DeviceList/index.d.ts +3 -0
  32. package/dist/types/src/components/DeviceList/index.d.ts.map +1 -0
  33. package/dist/types/src/components/DeviceList/index.js +22 -0
  34. package/dist/types/src/components/DeviceList/index.js.map +1 -0
  35. package/dist/types/src/components/EmojiPicker.d.ts +9 -2
  36. package/dist/types/src/components/EmojiPicker.d.ts.map +1 -1
  37. package/dist/types/src/components/EmojiPicker.js +57 -3
  38. package/dist/types/src/components/EmojiPicker.js.map +1 -1
  39. package/dist/types/src/components/HuePicker.d.ts +9 -2
  40. package/dist/types/src/components/HuePicker.d.ts.map +1 -1
  41. package/dist/types/src/components/HuePicker.js +75 -6
  42. package/dist/types/src/components/HuePicker.js.map +1 -1
  43. package/dist/types/src/components/IdentityList/index.d.ts +0 -1
  44. package/dist/types/src/components/IdentityList/index.d.ts.map +1 -1
  45. package/dist/types/src/components/IdentityList/index.js +0 -1
  46. package/dist/types/src/components/IdentityList/index.js.map +1 -1
  47. package/dist/types/src/components/InvitationList/InvitationListItem.js +5 -5
  48. package/dist/types/src/components/InvitationList/InvitationListItem.js.map +1 -1
  49. package/dist/types/src/components/Panel/Action.d.ts +2 -2
  50. package/dist/types/src/components/Viewport/Viewport.d.ts +1 -1
  51. package/dist/types/src/components/index.d.ts +2 -0
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/components/index.js +2 -0
  54. package/dist/types/src/components/index.js.map +1 -1
  55. package/dist/types/src/composites/Shell/Shell.d.ts.map +1 -1
  56. package/dist/types/src/composites/Shell/Shell.js +1 -5
  57. package/dist/types/src/composites/Shell/Shell.js.map +1 -1
  58. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  59. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +80 -40
  60. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  61. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts +0 -3
  62. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  63. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +1 -43
  64. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
  65. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +8 -11
  66. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  67. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts +1 -1
  68. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -1
  69. package/dist/types/src/panels/IdentityPanel/identityMachine.js +0 -24
  70. package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -1
  71. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts +4 -4
  72. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  73. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +9 -43
  74. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  75. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts +1 -1
  76. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -1
  77. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +2 -2
  78. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -1
  79. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts +0 -2
  80. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts.map +1 -1
  81. package/dist/types/src/panels/IdentityPanel/steps/index.js +0 -2
  82. package/dist/types/src/panels/IdentityPanel/steps/index.js.map +1 -1
  83. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
  84. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +5 -1
  85. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
  86. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
  87. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +3 -1
  88. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
  89. package/dist/types/src/playwright/invitations.spec.js +3 -1
  90. package/dist/types/src/playwright/invitations.spec.js.map +1 -1
  91. package/dist/types/src/steps/ConfirmReset.d.ts.map +1 -1
  92. package/dist/types/src/steps/ConfirmReset.js +4 -3
  93. package/dist/types/src/steps/ConfirmReset.js.map +1 -1
  94. package/dist/types/src/steps/InvitationManager.d.ts +1 -1
  95. package/dist/types/src/steps/InvitationManager.d.ts.map +1 -1
  96. package/dist/types/src/steps/InvitationManager.js +3 -4
  97. package/dist/types/src/steps/InvitationManager.js.map +1 -1
  98. package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
  99. package/dist/types/src/stories/Invitations.e2e-stories.js +5 -2
  100. package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
  101. package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
  102. package/dist/types/src/testing/shell-manager.js +10 -9
  103. package/dist/types/src/testing/shell-manager.js.map +1 -1
  104. package/dist/types/src/translations/locales/en-US.d.ts +12 -2
  105. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  106. package/dist/types/src/translations/locales/en-US.js +12 -2
  107. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  108. package/dist/types/src/types/index.js +1 -0
  109. package/dist/types/src/types/index.js.map +1 -1
  110. package/package.json +22 -21
  111. package/src/components/AgentConfig.tsx +66 -0
  112. package/src/components/DeviceList/DeviceList.tsx +54 -0
  113. package/src/components/DeviceList/DeviceListItem.tsx +120 -0
  114. package/src/components/DeviceList/DeviceListProps.ts +33 -0
  115. package/src/components/DeviceList/index.ts +6 -0
  116. package/src/components/EmojiPicker.tsx +101 -4
  117. package/src/components/HuePicker.tsx +99 -5
  118. package/src/components/IdentityList/index.ts +0 -1
  119. package/src/components/InvitationList/InvitationListItem.tsx +5 -5
  120. package/src/components/index.ts +2 -0
  121. package/src/composites/Shell/Shell.tsx +1 -7
  122. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +0 -63
  123. package/src/panels/IdentityPanel/IdentityPanel.tsx +123 -34
  124. package/src/panels/IdentityPanel/IdentityPanelProps.ts +10 -14
  125. package/src/panels/IdentityPanel/identityMachine.ts +1 -31
  126. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +23 -76
  127. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +12 -4
  128. package/src/panels/IdentityPanel/steps/index.ts +0 -2
  129. package/src/panels/IdentityPanel/useAgentHandlers.ts +5 -1
  130. package/src/panels/SpacePanel/steps/SpaceManager.tsx +3 -1
  131. package/src/playwright/invitations.spec.ts +3 -1
  132. package/src/steps/ConfirmReset.tsx +4 -3
  133. package/src/steps/InvitationManager.tsx +4 -4
  134. package/src/stories/Invitations.e2e-stories.tsx +6 -3
  135. package/src/testing/shell-manager.ts +10 -9
  136. package/src/translations/locales/en-US.ts +13 -2
  137. package/src/types/index.ts +2 -0
  138. package/dist/types/src/components/IdentityList/DeviceList.d.ts +0 -7
  139. package/dist/types/src/components/IdentityList/DeviceList.d.ts.map +0 -1
  140. package/dist/types/src/components/IdentityList/DeviceList.js +0 -34
  141. package/dist/types/src/components/IdentityList/DeviceList.js.map +0 -1
  142. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.d.ts +0 -3
  143. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.d.ts.map +0 -1
  144. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.js +0 -26
  145. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.js.map +0 -1
  146. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts +0 -10
  147. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts.map +0 -1
  148. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js +0 -23
  149. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js.map +0 -1
  150. package/src/components/IdentityList/DeviceList.tsx +0 -49
  151. package/src/panels/IdentityPanel/steps/AgentForm.tsx +0 -61
  152. package/src/panels/IdentityPanel/steps/DeviceManager.tsx +0 -41
@@ -47,8 +47,6 @@ exports.os = {
47
47
  'connected status label': 'Enter confirmation PIN',
48
48
  'authenticating status label': 'Enter confirmation PIN',
49
49
  'success status label': 'Success',
50
- 'connect label': 'Connect',
51
- 'reconnect label': 'Reconnect',
52
50
  'cancel label': 'Cancel',
53
51
  'done label': 'Done',
54
52
  'reset label': 'Start over',
@@ -131,5 +129,17 @@ exports.os = {
131
129
  'fuchsia label': 'Fuchsia',
132
130
  'pink label': 'Pink',
133
131
  'rose label': 'Rose',
132
+ 'current device tag label': 'This device',
133
+ 'device name placeholder': '{{platform}} on {{os}}',
134
+ 'more options label': 'More options',
135
+ 'disconnect label': 'Currently online. Click to go offline.',
136
+ 'connect label': 'Currently offline. Click to go online.',
137
+ 'edit device label': 'Edit device name & avatar',
138
+ 'agent heading': 'Agent',
139
+ 'agent message title': 'About creating an agent',
140
+ 'agent message body': 'Creating an agent helps keep your devices and peers in-sync. An agent is like any other device, but since it’s always online your changes will sync even when all your physical devices are asleep.',
141
+ 'create agent label': 'Start an agent',
142
+ 'destroy agent label': 'Shut down agent',
143
+ 'agent device label': 'Your agent',
134
144
  };
135
145
  //# sourceMappingURL=en-US.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.js","sourceRoot":"","sources":["../../../../../src/translations/locales/en-US.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"en-US.js","sourceRoot":"","sources":["../../../../../src/translations/locales/en-US.ts"],"names":[],"mappings":"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"}
@@ -19,4 +19,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  __exportStar(require("./FailReason"), exports);
21
21
  __exportStar(require("./IInvitation"), exports);
22
+ // This comment is here to bust NX cache. Remove it after the code changes.
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,+CAA6B;AAC7B,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,+CAA6B;AAC7B,gDAA8B;AAE9B,2EAA2E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/shell",
3
- "version": "0.4.10-main.f68a1ca",
3
+ "version": "0.4.10-main.f937af6",
4
4
  "description": "DXOS’s OS experiences",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -42,34 +42,35 @@
42
42
  "react-qr-rounded": "^1.0.0",
43
43
  "url-join": "^5.0.0",
44
44
  "xstate": "^4.37.0",
45
- "@dxos/async": "0.4.10-main.f68a1ca",
46
- "@dxos/client-services": "0.4.10-main.f68a1ca",
47
- "@dxos/client-protocol": "0.4.10-main.f68a1ca",
48
- "@dxos/debug": "0.4.10-main.f68a1ca",
49
- "@dxos/display-name": "0.4.10-main.f68a1ca",
50
- "@dxos/invariant": "0.4.10-main.f68a1ca",
51
- "@dxos/react-client": "0.4.10-main.f68a1ca",
52
- "@dxos/react-ui-theme": "0.4.10-main.f68a1ca",
53
- "@dxos/log": "0.4.10-main.f68a1ca",
54
- "@dxos/react-ui": "0.4.10-main.f68a1ca",
55
- "@dxos/rpc-tunnel": "0.4.10-main.f68a1ca",
56
- "@dxos/util": "0.4.10-main.f68a1ca",
57
- "@dxos/react-ui-types": "0.4.10-main.f68a1ca"
45
+ "@dxos/async": "0.4.10-main.f937af6",
46
+ "@dxos/client-protocol": "0.4.10-main.f937af6",
47
+ "@dxos/client-services": "0.4.10-main.f937af6",
48
+ "@dxos/display-name": "0.4.10-main.f937af6",
49
+ "@dxos/debug": "0.4.10-main.f937af6",
50
+ "@dxos/invariant": "0.4.10-main.f937af6",
51
+ "@dxos/react-client": "0.4.10-main.f937af6",
52
+ "@dxos/log": "0.4.10-main.f937af6",
53
+ "@dxos/react-ui-theme": "0.4.10-main.f937af6",
54
+ "@dxos/react-ui": "0.4.10-main.f937af6",
55
+ "@dxos/react-ui-types": "0.4.10-main.f937af6",
56
+ "@dxos/util": "0.4.10-main.f937af6",
57
+ "@dxos/rpc-tunnel": "0.4.10-main.f937af6"
58
58
  },
59
59
  "devDependencies": {
60
- "@phosphor-icons/react": "^2.0.5",
60
+ "@phosphor-icons/react": "^2.1.5",
61
61
  "@types/react": "^18.0.21",
62
62
  "@types/react-dom": "^18.0.6",
63
63
  "@vitejs/plugin-react": "^4.2.1",
64
64
  "react": "^18.2.0",
65
65
  "react-dom": "^18.2.0",
66
- "vite": "^5.1.5",
66
+ "vite": "^5.2.9",
67
67
  "vite-plugin-turbosnap": "^1.0.2",
68
- "@dxos/config": "0.4.10-main.f68a1ca",
69
- "@dxos/random": "0.4.10-main.f68a1ca",
70
- "@dxos/storybook-utils": "0.4.10-main.f68a1ca",
71
- "@dxos/react-async": "0.4.10-main.f68a1ca",
72
- "@dxos/react-ui-theme": "0.4.10-main.f68a1ca"
68
+ "@dxos/config": "0.4.10-main.f937af6",
69
+ "@dxos/protocols": "0.4.10-main.f937af6",
70
+ "@dxos/random": "0.4.10-main.f937af6",
71
+ "@dxos/storybook-utils": "0.4.10-main.f937af6",
72
+ "@dxos/react-async": "0.4.10-main.f937af6",
73
+ "@dxos/react-ui-theme": "0.4.10-main.f937af6"
73
74
  },
74
75
  "peerDependencies": {
75
76
  "@phosphor-icons/react": "^2.0.5",
@@ -0,0 +1,66 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { Database, Plus, Power } from '@phosphor-icons/react';
6
+ import React from 'react';
7
+
8
+ import { Avatar, Button, Tooltip, useTranslation } from '@dxos/react-ui';
9
+ import { descriptionText, getSize, mx } from '@dxos/react-ui-theme';
10
+
11
+ import { type AgentFormProps } from './DeviceList';
12
+
13
+ export const AgentConfig = ({ agentActive, agentStatus, onAgentDestroy, onAgentCreate }: AgentFormProps) => {
14
+ const { t } = useTranslation('os');
15
+ return (
16
+ <>
17
+ <h2 className={mx(descriptionText, 'text-center mbs-4')}>{t('agent heading')}</h2>
18
+ {agentActive ? (
19
+ <div role='group' className='flex gap-2 items-center'>
20
+ <Avatar.Root status={agentStatus ? 'active' : 'inactive'} variant='square'>
21
+ <Avatar.Frame classNames='place-self-center'>
22
+ <Database weight='duotone' width={24} height={24} x={8} y={8} />
23
+ </Avatar.Frame>
24
+ <Avatar.Label classNames='flex-1 text-sm truncate'>{t('agent device label')}</Avatar.Label>
25
+ </Avatar.Root>
26
+ <Tooltip.Root>
27
+ <Tooltip.Trigger asChild>
28
+ <Button
29
+ variant='ghost'
30
+ classNames='pli-0 is-[--rail-action] bs-[--rail-action]'
31
+ data-testid='agent.destroy'
32
+ onClick={onAgentDestroy}
33
+ >
34
+ <span className='sr-only'>{t('destroy agent label')}</span>
35
+ <Power className={getSize(5)} />
36
+ </Button>
37
+ </Tooltip.Trigger>
38
+ <Tooltip.Portal>
39
+ <Tooltip.Content side='bottom' classNames='z-50'>
40
+ {t('destroy agent label')}
41
+ </Tooltip.Content>
42
+ </Tooltip.Portal>
43
+ </Tooltip.Root>
44
+ </div>
45
+ ) : (
46
+ <>
47
+ <Button
48
+ variant='ghost'
49
+ classNames='mlb-2 is-full justify-start gap-2 !pis-0 !pie-3'
50
+ data-testid='devices-panel.create-agent'
51
+ onClick={onAgentCreate}
52
+ aria-describedby='devices-panel.create-agent.description'
53
+ >
54
+ <div role='img' className={mx(getSize(8), 'm-1 rounded-sm surface-input grid place-items-center')}>
55
+ <Plus weight='light' className={getSize(6)} />
56
+ </div>
57
+ <span className='grow font-medium text-start'>{t('create agent label')}</span>
58
+ </Button>
59
+ <p id='devices-panel.create-agent.description' className={descriptionText}>
60
+ {t('agent message body')}
61
+ </p>
62
+ </>
63
+ )}
64
+ </>
65
+ );
66
+ };
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { CaretRight, Plus } from '@phosphor-icons/react';
6
+ import React from 'react';
7
+
8
+ import { type Device } from '@dxos/react-client/halo';
9
+ import { Button, List, useTranslation } from '@dxos/react-ui';
10
+ import { descriptionText, getSize, mx } from '@dxos/react-ui-theme';
11
+
12
+ import { DeviceListItem } from './DeviceListItem';
13
+ import { type DeviceListProps } from './DeviceListProps';
14
+
15
+ export const DeviceList = ({
16
+ devices,
17
+ onClickAdd,
18
+ onClickEdit,
19
+ onClickReset,
20
+ onClickJoinExisting,
21
+ }: DeviceListProps) => {
22
+ const { t } = useTranslation('os');
23
+ return (
24
+ <>
25
+ <h2 className={mx(descriptionText, 'text-center mbs-4')}>{t('devices heading')}</h2>
26
+ {devices.length > 0 && (
27
+ <List>
28
+ {devices.map((device: Device) => {
29
+ return (
30
+ <DeviceListItem
31
+ key={device.deviceKey.toHex()}
32
+ device={device}
33
+ onClickEdit={() => onClickEdit?.(device)}
34
+ {...{ onClickReset, onClickJoinExisting }}
35
+ />
36
+ );
37
+ })}
38
+ </List>
39
+ )}
40
+ <Button
41
+ variant='ghost'
42
+ classNames='justify-start gap-2 !pis-0 !pie-3'
43
+ data-testid='devices-panel.create-invitation'
44
+ onClick={onClickAdd}
45
+ >
46
+ <div role='img' className={mx(getSize(8), 'm-1 rounded-sm surface-input grid place-items-center')}>
47
+ <Plus weight='light' className={getSize(6)} />
48
+ </div>
49
+ <span className='grow font-medium text-start'>{t('choose add device label')}</span>
50
+ <CaretRight weight='bold' className={getSize(4)} />
51
+ </Button>
52
+ </>
53
+ );
54
+ };
@@ -0,0 +1,120 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import {
6
+ Compass,
7
+ Desktop,
8
+ DeviceMobile,
9
+ Devices,
10
+ DotsThree,
11
+ type IconProps,
12
+ Intersect,
13
+ Power,
14
+ Robot,
15
+ } from '@phosphor-icons/react';
16
+ import React, { type ComponentPropsWithoutRef, forwardRef } from 'react';
17
+
18
+ import { generateName } from '@dxos/display-name';
19
+ import { Device, DeviceType, DeviceKind } from '@dxos/react-client/halo';
20
+ import {
21
+ ListItem,
22
+ Avatar,
23
+ useId,
24
+ type ThemedClassName,
25
+ Tag,
26
+ useTranslation,
27
+ DropdownMenu,
28
+ Button,
29
+ } from '@dxos/react-ui';
30
+ import { getSize } from '@dxos/react-ui-theme';
31
+ import { keyToFallback } from '@dxos/util';
32
+
33
+ import { type DeviceListItemProps } from './DeviceListProps';
34
+
35
+ const iconProps: IconProps = {
36
+ weight: 'duotone',
37
+ width: 24,
38
+ height: 24,
39
+ x: 8,
40
+ y: 8,
41
+ };
42
+
43
+ export const DeviceListItem = forwardRef<
44
+ HTMLLIElement,
45
+ ThemedClassName<ComponentPropsWithoutRef<'li'>> & DeviceListItemProps
46
+ >(({ device, onClickAdd, onClickEdit, onClickReset, onClickJoinExisting, classNames, ...props }, forwardedRef) => {
47
+ const { t } = useTranslation('os');
48
+ const fallbackValue = keyToFallback(device.deviceKey);
49
+ const labelId = useId('identityListItem__label');
50
+ const displayName = device.profile
51
+ ? t('device name placeholder', { os: device.profile.os, platform: device.profile.platform })
52
+ : generateName(device.deviceKey.toHex());
53
+ const isCurrent = device.kind === DeviceKind.CURRENT;
54
+ return (
55
+ <ListItem.Root
56
+ {...props}
57
+ classNames={['flex gap-2 items-center mlb-2', classNames]}
58
+ data-testid={`device-list-item${isCurrent ? '-current' : ''}`}
59
+ labelId={labelId}
60
+ ref={forwardedRef}
61
+ >
62
+ <Avatar.Root
63
+ status={device.presence === Device.PresenceState.ONLINE ? 'active' : 'inactive'}
64
+ labelId={labelId}
65
+ hue={fallbackValue.hue}
66
+ variant='square'
67
+ >
68
+ <Avatar.Frame classNames='place-self-center'>
69
+ {device.profile?.type ? (
70
+ device.profile.type === DeviceType.BROWSER ? (
71
+ <Compass {...iconProps} />
72
+ ) : device.profile.type === DeviceType.NATIVE ? (
73
+ <Desktop {...iconProps} />
74
+ ) : [DeviceType.AGENT, DeviceType.AGENT_MANAGED].includes(device.profile.type) ? (
75
+ <Robot {...iconProps} />
76
+ ) : device.profile.type === DeviceType.MOBILE ? (
77
+ <DeviceMobile {...iconProps} />
78
+ ) : (
79
+ <Devices {...iconProps} />
80
+ )
81
+ ) : (
82
+ <Avatar.Fallback text={fallbackValue.emoji} />
83
+ )}
84
+ </Avatar.Frame>
85
+ {isCurrent && <Tag color='primary'>{t('current device tag label')}</Tag>}
86
+ <Avatar.Label classNames='flex-1 text-sm truncate'>{displayName}</Avatar.Label>
87
+ {device.kind === DeviceKind.CURRENT && (
88
+ <DropdownMenu.Root>
89
+ <DropdownMenu.Trigger asChild>
90
+ <Button
91
+ variant='ghost'
92
+ classNames='pli-0 is-[--rail-action] bs-[--rail-action]'
93
+ data-testid={`device-list-item${isCurrent ? '-current' : ''}.options`}
94
+ >
95
+ <span className='sr-only'>{t('more options label')}</span>
96
+ <DotsThree className={getSize(5)} />
97
+ </Button>
98
+ </DropdownMenu.Trigger>
99
+ <DropdownMenu.Content>
100
+ <DropdownMenu.Viewport>
101
+ {/* <DropdownMenu.Item disabled onClick={onClickEdit}> */}
102
+ {/* <PencilSimpleLine className={getSize(5)} /> */}
103
+ {/* {t('edit device label')} */}
104
+ {/* </DropdownMenu.Item> */}
105
+ <DropdownMenu.Item data-testid='device-list-item-current.join-existing' onClick={onClickJoinExisting}>
106
+ <Intersect className={getSize(5)} />
107
+ {t('choose join new identity label')}
108
+ </DropdownMenu.Item>
109
+ <DropdownMenu.Item data-testid='device-list-item-current.reset' onClick={onClickReset}>
110
+ <Power className={getSize(5)} />
111
+ {t('reset device label')}
112
+ </DropdownMenu.Item>
113
+ </DropdownMenu.Viewport>
114
+ </DropdownMenu.Content>
115
+ </DropdownMenu.Root>
116
+ )}
117
+ </Avatar.Root>
118
+ </ListItem.Root>
119
+ );
120
+ });
@@ -0,0 +1,33 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type SpaceMember } from '@dxos/react-client/echo';
6
+ import { type Device } from '@dxos/react-client/halo';
7
+
8
+ export type DeviceListProps = {
9
+ devices: Device[];
10
+ onClickAdd?: () => void;
11
+ onClickEdit?: (device: Device) => void;
12
+ onClickReset?: () => void;
13
+ onClickJoinExisting?: () => void;
14
+ };
15
+
16
+ export type AgentFormProps = {
17
+ onAgentCreate?: () => Promise<void>;
18
+ onAgentDestroy?: () => Promise<void>;
19
+ agentStatus?: string;
20
+ agentActive?: boolean;
21
+ agentProviderDisabled?: boolean;
22
+ validationMessage?: string;
23
+ agentHostingEnabled?: boolean;
24
+ };
25
+
26
+ export type DeviceListItemProps = {
27
+ device: Device;
28
+ presence?: SpaceMember['presence'];
29
+ onClickAdd?: () => void;
30
+ onClickEdit?: () => void;
31
+ onClickReset?: () => void;
32
+ onClickJoinExisting?: () => void;
33
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './DeviceList';
6
+ export * from './DeviceListProps';
@@ -3,11 +3,20 @@
3
3
  //
4
4
  import emojiData from '@emoji-mart/data';
5
5
  import EmojiMart from '@emoji-mart/react';
6
- import { ArrowCounterClockwise, CaretDown } from '@phosphor-icons/react';
6
+ import { ArrowCounterClockwise, CaretDown, ImageSquare } from '@phosphor-icons/react';
7
7
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
8
- import React, { type Dispatch, type SetStateAction, useState } from 'react';
8
+ import React, { type Dispatch, type SetStateAction, useRef, useState } from 'react';
9
9
 
10
- import { Button, Popover, useTranslation, Tooltip, type ButtonProps, useMediaQuery } from '@dxos/react-ui';
10
+ import {
11
+ Button,
12
+ Popover,
13
+ useTranslation,
14
+ Tooltip,
15
+ type ButtonProps,
16
+ Toolbar,
17
+ useMediaQuery,
18
+ type ThemedClassName,
19
+ } from '@dxos/react-ui';
11
20
  import { getSize } from '@dxos/react-ui-theme';
12
21
 
13
22
  export type EmojiPickerProps = {
@@ -18,7 +27,95 @@ export type EmojiPickerProps = {
18
27
  onClickClear?: ButtonProps['onClick'];
19
28
  };
20
29
 
21
- export const EmojiPicker = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => {
30
+ /**
31
+ * A toolbar button for picking an emoji. Use only in `role=toolbar` elements. Unable to unset the value.
32
+ */
33
+ export const EmojiPickerToolbarButton = ({
34
+ disabled,
35
+ defaultEmoji,
36
+ emoji,
37
+ onChangeEmoji,
38
+ classNames,
39
+ }: ThemedClassName<Omit<EmojiPickerProps, 'onClickClear'>>) => {
40
+ const { t } = useTranslation('os');
41
+
42
+ const [_emojiValue, setEmojiValue] = useControllableState<string>({
43
+ prop: emoji,
44
+ onChange: onChangeEmoji,
45
+ defaultProp: defaultEmoji,
46
+ });
47
+
48
+ const [emojiPickerOpen, setEmojiPickerOpen] = useState<boolean>(false);
49
+
50
+ const suppressNextTooltip = useRef<boolean>(false);
51
+ const [triggerTooltipOpen, setTriggerTooltipOpen] = useState(false);
52
+
53
+ return (
54
+ <Tooltip.Root
55
+ open={triggerTooltipOpen}
56
+ onOpenChange={(nextOpen) => {
57
+ if (suppressNextTooltip.current) {
58
+ setTriggerTooltipOpen(false);
59
+ suppressNextTooltip.current = false;
60
+ } else {
61
+ setTriggerTooltipOpen(nextOpen);
62
+ }
63
+ }}
64
+ >
65
+ <Popover.Root
66
+ open={emojiPickerOpen}
67
+ onOpenChange={(nextOpen) => {
68
+ setEmojiPickerOpen(nextOpen);
69
+ suppressNextTooltip.current = true;
70
+ }}
71
+ >
72
+ <Tooltip.Trigger asChild>
73
+ <Popover.Trigger asChild>
74
+ <Toolbar.Button classNames={['gap-2 text-2xl plb-1', classNames]} disabled={disabled}>
75
+ <span className='sr-only'>{t('select emoji label')}</span>
76
+ <ImageSquare className={getSize(5)} />
77
+ </Toolbar.Button>
78
+ </Popover.Trigger>
79
+ </Tooltip.Trigger>
80
+ <Tooltip.Portal>
81
+ <Tooltip.Content side='bottom' classNames='z-50'>
82
+ {t('select emoji label')}
83
+ <Tooltip.Arrow />
84
+ </Tooltip.Content>
85
+ </Tooltip.Portal>
86
+ <Popover.Content
87
+ side='bottom'
88
+ onKeyDownCapture={(event) => {
89
+ if (event.key === 'Escape') {
90
+ event.stopPropagation();
91
+ setEmojiPickerOpen(false);
92
+ suppressNextTooltip.current = true;
93
+ }
94
+ }}
95
+ >
96
+ <EmojiMart
97
+ data={emojiData}
98
+ onEmojiSelect={({ native }: { native?: string }) => {
99
+ if (native) {
100
+ setEmojiValue(native);
101
+ setEmojiPickerOpen(false);
102
+ }
103
+ }}
104
+ autoFocus={true}
105
+ maxFrequentRows={0}
106
+ noCountryFlags={true}
107
+ />
108
+ <Popover.Arrow />
109
+ </Popover.Content>
110
+ </Popover.Root>
111
+ </Tooltip.Root>
112
+ );
113
+ };
114
+
115
+ /**
116
+ * A button for picking an emoji alongside a button for unsetting it.
117
+ */
118
+ export const EmojiPickerBlock = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => {
22
119
  const { t } = useTranslation('os');
23
120
  const [isMd] = useMediaQuery('md', { ssr: false });
24
121
 
@@ -1,12 +1,21 @@
1
1
  //
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
- import { ArrowCounterClockwise, CaretDown, Check } from '@phosphor-icons/react';
4
+ import { ArrowCounterClockwise, CaretDown, Check, Palette } from '@phosphor-icons/react';
5
5
  import { useControllableState } from '@radix-ui/react-use-controllable-state';
6
- import React, { type Dispatch, type SetStateAction } from 'react';
6
+ import React, { type Dispatch, type SetStateAction, useRef, useState } from 'react';
7
7
 
8
- import { Button, useTranslation, Tooltip, DropdownMenu, useThemeContext, type ButtonProps } from '@dxos/react-ui';
9
- import { getSize, hueTokenThemes } from '@dxos/react-ui-theme';
8
+ import {
9
+ Button,
10
+ useTranslation,
11
+ Tooltip,
12
+ DropdownMenu,
13
+ useThemeContext,
14
+ type ButtonProps,
15
+ Toolbar,
16
+ type ThemedClassName,
17
+ } from '@dxos/react-ui';
18
+ import { getSize, hueTokenThemes, mx } from '@dxos/react-ui-theme';
10
19
 
11
20
  const HuePreview = ({ hue }: { hue: string }) => {
12
21
  const { tx } = useThemeContext();
@@ -25,7 +34,92 @@ export type HuePickerProps = {
25
34
  onClickClear?: ButtonProps['onClick'];
26
35
  };
27
36
 
28
- export const HuePicker = ({ disabled, hue, onChangeHue, defaultHue, onClickClear }: HuePickerProps) => {
37
+ /**
38
+ * A toolbar button for picking hue. Use only in `role=toolbar` elements. Unable to unset the value.
39
+ */
40
+ export const HuePickerToolbarButton = ({
41
+ disabled,
42
+ hue,
43
+ onChangeHue,
44
+ classNames,
45
+ defaultHue,
46
+ }: ThemedClassName<Omit<HuePickerProps, 'onClickClear'>>) => {
47
+ const { t } = useTranslation('os');
48
+
49
+ const [hueValue, setHueValue] = useControllableState<string>({
50
+ prop: hue,
51
+ onChange: onChangeHue,
52
+ defaultProp: defaultHue,
53
+ });
54
+
55
+ const [huePickerOpen, setHuePickerOpen] = useState<boolean>(false);
56
+
57
+ const suppressNextTooltip = useRef<boolean>(false);
58
+ const [triggerTooltipOpen, setTriggerTooltipOpen] = useState(false);
59
+
60
+ return (
61
+ <Tooltip.Root
62
+ open={triggerTooltipOpen}
63
+ onOpenChange={(nextOpen) => {
64
+ if (suppressNextTooltip.current) {
65
+ setTriggerTooltipOpen(false);
66
+ suppressNextTooltip.current = false;
67
+ } else {
68
+ setTriggerTooltipOpen(nextOpen);
69
+ }
70
+ }}
71
+ >
72
+ <DropdownMenu.Root
73
+ modal={false}
74
+ open={huePickerOpen}
75
+ onOpenChange={(nextOpen) => {
76
+ setHuePickerOpen(nextOpen);
77
+ suppressNextTooltip.current = true;
78
+ }}
79
+ >
80
+ <Tooltip.Trigger asChild>
81
+ <DropdownMenu.Trigger asChild>
82
+ <Toolbar.Button classNames={mx('gap-2 plb-1', classNames)} disabled={disabled}>
83
+ <span className='sr-only'>{t('select hue label')}</span>
84
+ <Palette className={getSize(5)} />
85
+ </Toolbar.Button>
86
+ </DropdownMenu.Trigger>
87
+ </Tooltip.Trigger>
88
+ <Tooltip.Portal>
89
+ <Tooltip.Content side='bottom' classNames='z-50'>
90
+ {t('select hue label')}
91
+ <Tooltip.Arrow />
92
+ </Tooltip.Content>
93
+ </Tooltip.Portal>
94
+ <DropdownMenu.Content side='bottom'>
95
+ <DropdownMenu.Viewport>
96
+ {Object.keys(hueTokenThemes).map((hue) => {
97
+ return (
98
+ <DropdownMenu.CheckboxItem
99
+ key={hue}
100
+ checked={hue === hueValue}
101
+ onCheckedChange={() => setHueValue(hue)}
102
+ >
103
+ <HuePreview hue={hue} />
104
+ <span className='grow'>{t(`${hue} label`)}</span>
105
+ <DropdownMenu.ItemIndicator>
106
+ <Check />
107
+ </DropdownMenu.ItemIndicator>
108
+ </DropdownMenu.CheckboxItem>
109
+ );
110
+ })}
111
+ </DropdownMenu.Viewport>
112
+ <DropdownMenu.Arrow />
113
+ </DropdownMenu.Content>
114
+ </DropdownMenu.Root>
115
+ </Tooltip.Root>
116
+ );
117
+ };
118
+
119
+ /**
120
+ * A button for picking hue alongside a button for unsetting it.
121
+ */
122
+ export const HuePickerBlock = ({ disabled, hue, onChangeHue, defaultHue, onClickClear }: HuePickerProps) => {
29
123
  const { t } = useTranslation('os');
30
124
 
31
125
  const [hueValue, setHueValue] = useControllableState<string>({
@@ -2,6 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './DeviceList';
6
5
  export * from './IdentityListItem';
7
6
  export * from './SpaceMemberList';