@dxos/shell 0.4.7-main.fd27392 → 0.4.7-next.76c1dea

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 (169) hide show
  1. package/dist/bundle/shell.mjs +69806 -27240
  2. package/dist/bundle/shell.mjs.map +1 -1
  3. package/dist/bundle/shell.umd.js +796 -80
  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 +871 -669
  8. package/dist/lib/browser/react.mjs.map +4 -4
  9. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -0
  10. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  11. package/dist/types/src/components/CompoundButton/CompoundButton.stories.d.ts +1 -0
  12. package/dist/types/src/components/CompoundButton/CompoundButton.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/EmojiPicker.d.ts +11 -0
  14. package/dist/types/src/components/EmojiPicker.d.ts.map +1 -0
  15. package/dist/types/src/components/EmojiPicker.js +79 -0
  16. package/dist/types/src/components/EmojiPicker.js.map +1 -0
  17. package/dist/types/src/components/HuePicker.d.ts +11 -0
  18. package/dist/types/src/components/HuePicker.d.ts.map +1 -0
  19. package/dist/types/src/components/HuePicker.js +56 -0
  20. package/dist/types/src/components/HuePicker.js.map +1 -0
  21. package/dist/types/src/components/IdentityList/DeviceList.d.ts +1 -0
  22. package/dist/types/src/components/IdentityList/DeviceList.d.ts.map +1 -1
  23. package/dist/types/src/components/IdentityList/IdentityListItem.d.ts.map +1 -1
  24. package/dist/types/src/components/IdentityList/IdentityListItem.js +5 -5
  25. package/dist/types/src/components/IdentityList/IdentityListItem.js.map +1 -1
  26. package/dist/types/src/components/IdentityList/SpaceMemberList.d.ts +1 -0
  27. package/dist/types/src/components/IdentityList/SpaceMemberList.d.ts.map +1 -1
  28. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts +1 -0
  29. package/dist/types/src/components/IdentityList/SpaceMemberList.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts +1 -0
  31. package/dist/types/src/components/InvitationList/InvitationList.stories.d.ts.map +1 -1
  32. package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts +1 -0
  33. package/dist/types/src/components/InvitationList/InvitationListContainer.d.ts.map +1 -1
  34. package/dist/types/src/components/InvitationList/InvitationListItem.d.ts.map +1 -1
  35. package/dist/types/src/components/InvitationList/InvitationListItem.js +2 -2
  36. package/dist/types/src/components/InvitationList/InvitationListItem.js.map +1 -1
  37. package/dist/types/src/components/Panel/CloseButton.d.ts +1 -0
  38. package/dist/types/src/components/Panel/CloseButton.d.ts.map +1 -1
  39. package/dist/types/src/components/Panel/Panel.stories.d.ts +1 -0
  40. package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -1
  41. package/dist/types/src/components/SpaceListItem.d.ts.map +1 -1
  42. package/dist/types/src/components/SpaceListItem.js +2 -3
  43. package/dist/types/src/components/SpaceListItem.js.map +1 -1
  44. package/dist/types/src/components/Viewport/Viewport.js.map +1 -1
  45. package/dist/types/src/components/Viewport/Viewport.stories.d.ts +1 -0
  46. package/dist/types/src/components/Viewport/Viewport.stories.d.ts.map +1 -1
  47. package/dist/types/src/components/index.d.ts +2 -0
  48. package/dist/types/src/components/index.d.ts.map +1 -1
  49. package/dist/types/src/components/index.js +2 -0
  50. package/dist/types/src/components/index.js.map +1 -1
  51. package/dist/types/src/composites/IdentityDialog/IdentityDialog.d.ts +1 -0
  52. package/dist/types/src/composites/IdentityDialog/IdentityDialog.d.ts.map +1 -1
  53. package/dist/types/src/composites/IdentityDialog/IdentityDialog.js +1 -1
  54. package/dist/types/src/composites/IdentityDialog/IdentityDialog.js.map +1 -1
  55. package/dist/types/src/composites/JoinDialog/JoinDialog.d.ts +1 -0
  56. package/dist/types/src/composites/JoinDialog/JoinDialog.d.ts.map +1 -1
  57. package/dist/types/src/composites/JoinDialog/JoinDialog.js +2 -2
  58. package/dist/types/src/composites/JoinDialog/JoinDialog.js.map +1 -1
  59. package/dist/types/src/composites/Shell/Shell.d.ts +1 -0
  60. package/dist/types/src/composites/Shell/Shell.d.ts.map +1 -1
  61. package/dist/types/src/composites/Shell/Shell.js.map +1 -1
  62. package/dist/types/src/composites/Shell/ShellContext.js.map +1 -1
  63. package/dist/types/src/composites/SpaceDialog/SpaceDialog.d.ts +1 -0
  64. package/dist/types/src/composites/SpaceDialog/SpaceDialog.d.ts.map +1 -1
  65. package/dist/types/src/composites/SpaceDialog/SpaceDialog.js +1 -1
  66. package/dist/types/src/composites/SpaceDialog/SpaceDialog.js.map +1 -1
  67. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts +1 -0
  68. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  69. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +7 -6
  70. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  71. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts +1 -0
  72. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  73. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.d.ts +1 -0
  74. package/dist/types/src/panels/IdentityPanel/steps/AgentForm.d.ts.map +1 -1
  75. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts +1 -0
  76. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts.map +1 -1
  77. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  78. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +2 -1
  79. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  80. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts +1 -0
  81. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -1
  82. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +12 -3
  83. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -1
  84. package/dist/types/src/panels/IdentityPanel/steps/SignOutChooser.d.ts +1 -0
  85. package/dist/types/src/panels/IdentityPanel/steps/SignOutChooser.d.ts.map +1 -1
  86. package/dist/types/src/panels/IdentityPanel/steps/SignOutChooser.js.map +1 -1
  87. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
  88. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +2 -1
  89. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
  90. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts +1 -0
  91. package/dist/types/src/panels/JoinPanel/JoinPanel.d.ts.map +1 -1
  92. package/dist/types/src/panels/JoinPanel/JoinPanel.js.map +1 -1
  93. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts +1 -0
  94. package/dist/types/src/panels/JoinPanel/JoinPanel.stories.d.ts.map +1 -1
  95. package/dist/types/src/panels/JoinPanel/joinMachine.js.map +1 -1
  96. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts +1 -0
  97. package/dist/types/src/panels/JoinPanel/steps/AdditionMethodChooser.d.ts.map +1 -1
  98. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.d.ts +1 -0
  99. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.d.ts.map +1 -1
  100. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.js +8 -7
  101. package/dist/types/src/panels/JoinPanel/steps/IdentityAdded.js.map +1 -1
  102. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts +1 -0
  103. package/dist/types/src/panels/JoinPanel/steps/IdentityInput.d.ts.map +1 -1
  104. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts +1 -0
  105. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.d.ts.map +1 -1
  106. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js +2 -2
  107. package/dist/types/src/panels/JoinPanel/steps/InvitationAuthenticator.js.map +1 -1
  108. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts +1 -0
  109. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.d.ts.map +1 -1
  110. package/dist/types/src/panels/JoinPanel/steps/InvitationInput.js.map +1 -1
  111. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.d.ts +1 -0
  112. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.d.ts.map +1 -1
  113. package/dist/types/src/panels/JoinPanel/steps/InvitationRescuer.js.map +1 -1
  114. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.d.ts +1 -0
  115. package/dist/types/src/panels/JoinPanel/steps/ResetIdentity.d.ts.map +1 -1
  116. package/dist/types/src/panels/Panels.stories.d.ts.map +1 -1
  117. package/dist/types/src/panels/Panels.stories.js +1 -3
  118. package/dist/types/src/panels/Panels.stories.js.map +1 -1
  119. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts +1 -0
  120. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts.map +1 -1
  121. package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -1
  122. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts +1 -0
  123. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts.map +1 -1
  124. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
  125. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +2 -1
  126. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
  127. package/dist/types/src/playwright/invitations-manager.js.map +1 -1
  128. package/dist/types/src/steps/InvitationManager.d.ts +1 -0
  129. package/dist/types/src/steps/InvitationManager.d.ts.map +1 -1
  130. package/dist/types/src/steps/InvitationManager.js +5 -4
  131. package/dist/types/src/steps/InvitationManager.js.map +1 -1
  132. package/dist/types/src/stories/Invitations.e2e-stories.d.ts +1 -0
  133. package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
  134. package/dist/types/src/stories/Invitations.e2e-stories.js +3 -2
  135. package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
  136. package/dist/types/src/testing/scoped-shell-manager.js.map +1 -1
  137. package/dist/types/src/testing/shell-manager.js.map +1 -1
  138. package/dist/types/src/translations/locales/en-US.d.ts +21 -0
  139. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  140. package/dist/types/src/translations/locales/en-US.js +21 -0
  141. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  142. package/dist/types/src/util/index.d.ts +0 -1
  143. package/dist/types/src/util/index.d.ts.map +1 -1
  144. package/dist/types/src/util/index.js +0 -1
  145. package/dist/types/src/util/index.js.map +1 -1
  146. package/package.json +23 -22
  147. package/src/components/EmojiPicker.tsx +82 -0
  148. package/src/components/HuePicker.tsx +87 -0
  149. package/src/components/IdentityList/IdentityListItem.tsx +9 -5
  150. package/src/components/InvitationList/InvitationListItem.tsx +2 -2
  151. package/src/components/SpaceListItem.tsx +4 -5
  152. package/src/components/index.ts +2 -0
  153. package/src/panels/IdentityPanel/IdentityPanel.tsx +6 -5
  154. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +2 -1
  155. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +29 -7
  156. package/src/panels/IdentityPanel/useAgentHandlers.ts +2 -1
  157. package/src/panels/JoinPanel/steps/IdentityAdded.tsx +7 -7
  158. package/src/panels/JoinPanel/steps/InvitationAuthenticator.tsx +2 -2
  159. package/src/panels/Panels.stories.tsx +1 -3
  160. package/src/panels/SpacePanel/steps/SpaceManager.tsx +2 -1
  161. package/src/steps/InvitationManager.tsx +4 -3
  162. package/src/stories/Invitations.e2e-stories.tsx +3 -2
  163. package/src/translations/locales/en-US.ts +21 -0
  164. package/src/util/index.ts +0 -1
  165. package/dist/types/src/util/toEmoji.d.ts +0 -2
  166. package/dist/types/src/util/toEmoji.d.ts.map +0 -1
  167. package/dist/types/src/util/toEmoji.js +0 -26
  168. package/dist/types/src/util/toEmoji.js.map +0 -1
  169. package/src/util/toEmoji.ts +0 -22
@@ -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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"}
@@ -1,3 +1,2 @@
1
1
  export * from './invitationStatusValue';
2
- export * from './toEmoji';
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC"}
@@ -18,5 +18,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  __exportStar(require("./invitationStatusValue"), exports);
21
- __exportStar(require("./toEmoji"), exports);
22
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,0DAAwC;AACxC,4CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/util/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,0DAAwC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/shell",
3
- "version": "0.4.7-main.fd27392",
3
+ "version": "0.4.7-next.76c1dea",
4
4
  "description": "DXOS’s OS experiences",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -28,6 +28,8 @@
28
28
  "src"
29
29
  ],
30
30
  "dependencies": {
31
+ "@emoji-mart/data": "^1.1.2",
32
+ "@emoji-mart/react": "^1.1.1",
31
33
  "@fluentui/react-tabster": "^9.19.0",
32
34
  "@radix-ui/react-accordion": "^1.1.1",
33
35
  "@radix-ui/react-context": "^1.0.0",
@@ -35,39 +37,38 @@
35
37
  "@radix-ui/react-use-controllable-state": "^1.0.0",
36
38
  "@react-hook/async": "^3.1.1",
37
39
  "@xstate/react": "^3.2.1",
38
- "lodash.toarray": "^4.4.0",
40
+ "emoji-mart": "^5.5.2",
39
41
  "react-qr-rounded": "^1.0.0",
40
42
  "url-join": "^5.0.0",
41
43
  "xstate": "^4.37.0",
42
- "@dxos/async": "0.4.7-main.fd27392",
43
- "@dxos/debug": "0.4.7-main.fd27392",
44
- "@dxos/client-services": "0.4.7-main.fd27392",
45
- "@dxos/client-protocol": "0.4.7-main.fd27392",
46
- "@dxos/display-name": "0.4.7-main.fd27392",
47
- "@dxos/log": "0.4.7-main.fd27392",
48
- "@dxos/react-client": "0.4.7-main.fd27392",
49
- "@dxos/react-ui-theme": "0.4.7-main.fd27392",
50
- "@dxos/react-ui-types": "0.4.7-main.fd27392",
51
- "@dxos/invariant": "0.4.7-main.fd27392",
52
- "@dxos/rpc-tunnel": "0.4.7-main.fd27392",
53
- "@dxos/react-ui": "0.4.7-main.fd27392",
54
- "@dxos/util": "0.4.7-main.fd27392"
44
+ "@dxos/async": "0.4.7-next.76c1dea",
45
+ "@dxos/client-services": "0.4.7-next.76c1dea",
46
+ "@dxos/client-protocol": "0.4.7-next.76c1dea",
47
+ "@dxos/debug": "0.4.7-next.76c1dea",
48
+ "@dxos/display-name": "0.4.7-next.76c1dea",
49
+ "@dxos/react-client": "0.4.7-next.76c1dea",
50
+ "@dxos/log": "0.4.7-next.76c1dea",
51
+ "@dxos/invariant": "0.4.7-next.76c1dea",
52
+ "@dxos/react-ui": "0.4.7-next.76c1dea",
53
+ "@dxos/react-ui-theme": "0.4.7-next.76c1dea",
54
+ "@dxos/rpc-tunnel": "0.4.7-next.76c1dea",
55
+ "@dxos/react-ui-types": "0.4.7-next.76c1dea",
56
+ "@dxos/util": "0.4.7-next.76c1dea"
55
57
  },
56
58
  "devDependencies": {
57
59
  "@phosphor-icons/react": "^2.0.5",
58
- "@types/lodash.toarray": "^4.4.7",
59
60
  "@types/react": "^18.0.21",
60
61
  "@types/react-dom": "^18.0.6",
61
62
  "@vitejs/plugin-react": "^4.2.1",
62
63
  "react": "^18.2.0",
63
64
  "react-dom": "^18.2.0",
64
- "vite": "^5.1.3",
65
+ "vite": "^5.1.5",
65
66
  "vite-plugin-turbosnap": "^1.0.2",
66
- "@dxos/config": "0.4.7-main.fd27392",
67
- "@dxos/react-async": "0.4.7-main.fd27392",
68
- "@dxos/random": "0.4.7-main.fd27392",
69
- "@dxos/react-ui-theme": "0.4.7-main.fd27392",
70
- "@dxos/storybook-utils": "0.4.7-main.fd27392"
67
+ "@dxos/config": "0.4.7-next.76c1dea",
68
+ "@dxos/react-async": "0.4.7-next.76c1dea",
69
+ "@dxos/react-ui-theme": "0.4.7-next.76c1dea",
70
+ "@dxos/storybook-utils": "0.4.7-next.76c1dea",
71
+ "@dxos/random": "0.4.7-next.76c1dea"
71
72
  },
72
73
  "peerDependencies": {
73
74
  "@phosphor-icons/react": "^2.0.5",
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+ import emojiData from '@emoji-mart/data';
5
+ import EmojiMart from '@emoji-mart/react';
6
+ import { ArrowCounterClockwise, CaretDown } from '@phosphor-icons/react';
7
+ import { useControllableState } from '@radix-ui/react-use-controllable-state';
8
+ import React, { type Dispatch, type SetStateAction, useState } from 'react';
9
+
10
+ import { Button, Popover, useTranslation, Tooltip, type ButtonProps } from '@dxos/react-ui';
11
+ import { getSize } from '@dxos/react-ui-theme';
12
+
13
+ export type EmojiPickerProps = {
14
+ disabled?: boolean;
15
+ defaultEmoji?: string;
16
+ emoji?: string;
17
+ onChangeEmoji?: Dispatch<SetStateAction<string>>;
18
+ onClickClear?: ButtonProps['onClick'];
19
+ };
20
+
21
+ export const EmojiPicker = ({ disabled, defaultEmoji, emoji, onChangeEmoji, onClickClear }: EmojiPickerProps) => {
22
+ const { t } = useTranslation('os');
23
+
24
+ const [emojiValue, setEmojiValue] = useControllableState<string>({
25
+ prop: emoji,
26
+ onChange: onChangeEmoji,
27
+ defaultProp: defaultEmoji,
28
+ });
29
+
30
+ const [emojiPickerOpen, setEmojiPickerOpen] = useState<boolean>(false);
31
+
32
+ return (
33
+ <>
34
+ <Popover.Root open={emojiPickerOpen} onOpenChange={setEmojiPickerOpen}>
35
+ <Popover.Trigger asChild>
36
+ <Button variant='ghost' classNames='gap-2 text-2xl plb-1' disabled={disabled}>
37
+ <span className='sr-only'>{t('select emoji label')}</span>
38
+ <span className='grow pis-14'>{emojiValue}</span>
39
+ <CaretDown className={getSize(4)} />
40
+ </Button>
41
+ </Popover.Trigger>
42
+ <Popover.Content
43
+ side='right'
44
+ onKeyDownCapture={(event) => {
45
+ if (event.key === 'Escape') {
46
+ event.stopPropagation();
47
+ setEmojiPickerOpen(false);
48
+ }
49
+ }}
50
+ >
51
+ <EmojiMart
52
+ data={emojiData}
53
+ onEmojiSelect={({ native }: { native?: string }) => {
54
+ if (native) {
55
+ setEmojiValue(native);
56
+ setEmojiPickerOpen(false);
57
+ }
58
+ }}
59
+ autoFocus={true}
60
+ maxFrequentRows={0}
61
+ noCountryFlags={true}
62
+ />
63
+ <Popover.Arrow />
64
+ </Popover.Content>
65
+ </Popover.Root>
66
+ <Tooltip.Root>
67
+ <Tooltip.Trigger asChild>
68
+ <Button variant='ghost' onClick={onClickClear} disabled={disabled}>
69
+ <span className='sr-only'>{t('clear label')}</span>
70
+ <ArrowCounterClockwise />
71
+ </Button>
72
+ </Tooltip.Trigger>
73
+ <Tooltip.Portal>
74
+ <Tooltip.Content style={{ zIndex: 70 }} side='right'>
75
+ {t('clear label')}
76
+ <Tooltip.Arrow />
77
+ </Tooltip.Content>
78
+ </Tooltip.Portal>
79
+ </Tooltip.Root>
80
+ </>
81
+ );
82
+ };
@@ -0,0 +1,87 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+ import { ArrowCounterClockwise, CaretDown, Check } from '@phosphor-icons/react';
5
+ import { useControllableState } from '@radix-ui/react-use-controllable-state';
6
+ import React, { type Dispatch, type SetStateAction } from 'react';
7
+
8
+ import { Button, useTranslation, Tooltip, DropdownMenu, useThemeContext, type ButtonProps } from '@dxos/react-ui';
9
+ import { getSize, hueTokenThemes } from '@dxos/react-ui-theme';
10
+
11
+ const HuePreview = ({ hue }: { hue: string }) => {
12
+ const { tx } = useThemeContext();
13
+ return (
14
+ <svg width={12} height={12} viewBox='0 0 12 12'>
15
+ <rect x={0} y={0} width={12} height={12} className={tx('hue.fill', 'select--hue__preview', { hue })} />
16
+ </svg>
17
+ );
18
+ };
19
+
20
+ export type HuePickerProps = {
21
+ disabled?: boolean;
22
+ defaultHue?: string;
23
+ hue?: string;
24
+ onChangeHue?: Dispatch<SetStateAction<string>>;
25
+ onClickClear?: ButtonProps['onClick'];
26
+ };
27
+
28
+ export const HuePicker = ({ disabled, hue, onChangeHue, defaultHue, onClickClear }: HuePickerProps) => {
29
+ const { t } = useTranslation('os');
30
+
31
+ const [hueValue, setHueValue] = useControllableState<string>({
32
+ prop: hue,
33
+ onChange: onChangeHue,
34
+ defaultProp: defaultHue,
35
+ });
36
+
37
+ return (
38
+ <>
39
+ <DropdownMenu.Root modal={false}>
40
+ <DropdownMenu.Trigger asChild>
41
+ <Button variant='ghost' classNames='gap-2 plb-1' disabled={disabled}>
42
+ <span className='sr-only'>{t('select hue label')}</span>
43
+ <div role='none' className='pis-14 grow flex items-center justify-center gap-2'>
44
+ <HuePreview hue={hueValue!} />
45
+ <span>{t(`${hueValue} label`)}</span>
46
+ </div>
47
+ <CaretDown className={getSize(4)} />
48
+ </Button>
49
+ </DropdownMenu.Trigger>
50
+ <DropdownMenu.Content side='right'>
51
+ <DropdownMenu.Viewport>
52
+ {Object.keys(hueTokenThemes).map((hue) => {
53
+ return (
54
+ <DropdownMenu.CheckboxItem
55
+ key={hue}
56
+ checked={hue === hueValue}
57
+ onCheckedChange={() => setHueValue(hue)}
58
+ >
59
+ <HuePreview hue={hue} />
60
+ <span className='grow'>{t(`${hue} label`)}</span>
61
+ <DropdownMenu.ItemIndicator>
62
+ <Check />
63
+ </DropdownMenu.ItemIndicator>
64
+ </DropdownMenu.CheckboxItem>
65
+ );
66
+ })}
67
+ </DropdownMenu.Viewport>
68
+ <DropdownMenu.Arrow />
69
+ </DropdownMenu.Content>
70
+ </DropdownMenu.Root>
71
+ <Tooltip.Root>
72
+ <Tooltip.Trigger asChild>
73
+ <Button variant='ghost' onClick={onClickClear} disabled={disabled}>
74
+ <span className='sr-only'>{t('clear label')}</span>
75
+ <ArrowCounterClockwise />
76
+ </Button>
77
+ </Tooltip.Trigger>
78
+ <Tooltip.Portal>
79
+ <Tooltip.Content style={{ zIndex: 70 }} side='right'>
80
+ {t('clear label')}
81
+ <Tooltip.Arrow />
82
+ </Tooltip.Content>
83
+ </Tooltip.Portal>
84
+ </Tooltip.Root>
85
+ </>
86
+ );
87
+ };
@@ -7,8 +7,9 @@ import React, { type ComponentPropsWithoutRef, forwardRef } from 'react';
7
7
  import { generateName } from '@dxos/display-name';
8
8
  import { SpaceMember } from '@dxos/react-client/echo';
9
9
  import { type Identity } from '@dxos/react-client/halo';
10
- import { ListItem, Avatar, useJdenticonHref, useId, type ThemedClassName } from '@dxos/react-ui';
10
+ import { ListItem, Avatar, useId, type ThemedClassName } from '@dxos/react-ui';
11
11
  import { mx } from '@dxos/react-ui-theme';
12
+ import { keyToFallback } from '@dxos/util';
12
13
 
13
14
  type IdentityListItemProps = {
14
15
  identity: Identity;
@@ -20,9 +21,8 @@ export const IdentityListItem = forwardRef<
20
21
  HTMLLIElement,
21
22
  ThemedClassName<ComponentPropsWithoutRef<'li'>> & IdentityListItemProps
22
23
  >(({ identity, presence, onClick, classNames, ...props }, forwardedRef) => {
23
- const fallbackValue = identity.identityKey.toHex();
24
+ const fallbackValue = keyToFallback(identity.identityKey);
24
25
  const labelId = useId('identityListItem__label');
25
- const jdenticon = useJdenticonHref(fallbackValue ?? '', 12);
26
26
  const displayName = identity.profile?.displayName ?? generateName(identity.identityKey.toHex());
27
27
  return (
28
28
  <ListItem.Root
@@ -33,9 +33,13 @@ export const IdentityListItem = forwardRef<
33
33
  labelId={labelId}
34
34
  ref={forwardedRef}
35
35
  >
36
- <Avatar.Root status={presence === SpaceMember.PresenceState.ONLINE ? 'active' : 'inactive'} labelId={labelId}>
36
+ <Avatar.Root
37
+ status={presence === SpaceMember.PresenceState.ONLINE ? 'active' : 'inactive'}
38
+ labelId={labelId}
39
+ hue={identity.profile?.data?.hue || fallbackValue.hue}
40
+ >
37
41
  <Avatar.Frame classNames='place-self-center'>
38
- <Avatar.Fallback href={jdenticon} />
42
+ <Avatar.Fallback text={identity.profile?.data?.emoji || fallbackValue.emoji} />
39
43
  </Avatar.Frame>
40
44
  <Avatar.Label classNames='text-sm truncate pli-2'>{displayName}</Avatar.Label>
41
45
  </Avatar.Root>
@@ -21,9 +21,9 @@ import {
21
21
  type ThemedClassName,
22
22
  } from '@dxos/react-ui';
23
23
  import { focusRing, getSize, mx } from '@dxos/react-ui-theme';
24
+ import { hexToEmoji } from '@dxos/util';
24
25
 
25
26
  import { type SharedInvitationListProps } from './InvitationListProps';
26
- import { toEmoji } from '../../util';
27
27
  import { AuthCode } from '../AuthCode';
28
28
  import { CopyButtonIconOnly } from '../Clipboard';
29
29
 
@@ -151,7 +151,7 @@ export const InvitationListItemImpl = ({
151
151
  <Avatar.Root {...avatarProps} animation={avatarAnimation} status={avatarStatus}>
152
152
  <Tooltip.Trigger asChild>
153
153
  <Avatar.Frame tabIndex={0} classNames={[focusRing, 'relative rounded-full place-self-center']}>
154
- <Avatar.Fallback text={toEmoji(invitationId)} />
154
+ <Avatar.Fallback text={hexToEmoji(invitationId)} />
155
155
  </Avatar.Frame>
156
156
  </Tooltip.Trigger>
157
157
  </Avatar.Root>
@@ -5,15 +5,14 @@
5
5
  import React, { type ForwardedRef, forwardRef } from 'react';
6
6
 
7
7
  import type { Space } from '@dxos/react-client/echo';
8
- import { Avatar, useId, useJdenticonHref } from '@dxos/react-ui';
8
+ import { Avatar, useId } from '@dxos/react-ui';
9
9
  import { mx } from '@dxos/react-ui-theme';
10
- import { humanize } from '@dxos/util';
10
+ import { humanize, keyToEmoji } from '@dxos/util';
11
11
 
12
12
  export const SpaceListItem = forwardRef(
13
13
  ({ space, onClick }: { space: Space; onClick?: () => void }, ref: ForwardedRef<HTMLLIElement>) => {
14
- const fallbackValue = space.key.toHex();
14
+ const fallbackValue = keyToEmoji(space.key);
15
15
  const labelId = useId('identityListItem__label');
16
- const jdenticon = useJdenticonHref(fallbackValue ?? '', 12);
17
16
  const displayName = space.properties.name ?? humanize(space.key.toHex());
18
17
 
19
18
  return (
@@ -25,7 +24,7 @@ export const SpaceListItem = forwardRef(
25
24
  >
26
25
  <Avatar.Root labelId={labelId}>
27
26
  <Avatar.Frame>
28
- <Avatar.Fallback href={jdenticon} />
27
+ <Avatar.Fallback text={fallbackValue} />
29
28
  </Avatar.Frame>
30
29
  <Avatar.Label classNames='text-sm truncate'>{displayName}</Avatar.Label>
31
30
  </Avatar.Root>
@@ -4,6 +4,8 @@
4
4
 
5
5
  export * from './Clipboard';
6
6
  export * from './CompoundButton';
7
+ export * from './EmojiPicker';
8
+ export * from './HuePicker';
7
9
  export * from './IdentityList';
8
10
  export * from './InvitationList';
9
11
  export * from './Panel';
@@ -9,7 +9,8 @@ import { useClient } from '@dxos/react-client';
9
9
  import { type Identity, useIdentity, useDevices, useHaloInvitations } from '@dxos/react-client/halo';
10
10
  import { useInvitationStatus } from '@dxos/react-client/invitations';
11
11
  import type { CancellableInvitationObservable } from '@dxos/react-client/invitations';
12
- import { Avatar, DensityProvider, useId, useJdenticonHref, useTranslation } from '@dxos/react-ui';
12
+ import { Avatar, DensityProvider, useId, useTranslation } from '@dxos/react-ui';
13
+ import { keyToFallback } from '@dxos/util';
13
14
 
14
15
  import {
15
16
  type IdentityPanelHeadingProps,
@@ -25,12 +26,12 @@ import { InvitationManager } from '../../steps';
25
26
  const viewStyles = 'pbs-1 pbe-3 pli-3';
26
27
 
27
28
  const IdentityHeading = ({ titleId, title, identity, onDone }: IdentityPanelHeadingProps) => {
28
- const fallbackHref = useJdenticonHref(identity.identityKey.toHex(), 12);
29
+ const fallbackValue = keyToFallback(identity.identityKey);
29
30
  return (
30
31
  <Heading titleId={titleId} title={title} corner={<CloseButton onDone={onDone} />}>
31
- <Avatar.Root size={12} variant='circle' status='active'>
32
+ <Avatar.Root size={12} variant='circle' status='active' hue={identity.profile?.data?.hue || fallbackValue.hue}>
32
33
  <Avatar.Frame classNames='block mbs-4 mbe-2 mli-auto chromatic-ignore'>
33
- <Avatar.Fallback href={fallbackHref} />
34
+ <Avatar.Fallback text={identity.profile?.data?.emoji || fallbackValue.emoji} />
34
35
  </Avatar.Frame>
35
36
  <Avatar.Label classNames='block text-center font-light text-xl' data-testid='identityHeading.displayName'>
36
37
  {identity.profile?.displayName ?? generateName(identity.identityKey.toHex())}
@@ -128,7 +129,7 @@ export const IdentityPanel = ({
128
129
  const invitations = useHaloInvitations();
129
130
  const agentProps = useAgentHandlers({ client, identity, invitations });
130
131
  if (!identity) {
131
- console.error('IdentityPanel rendered with no active identity.');
132
+ log.error('IdentityPanel rendered with no active identity.');
132
133
  return null;
133
134
  }
134
135
  const [identityState, identitySend, identityService] = useIdentityMachine(client);
@@ -5,6 +5,7 @@
5
5
  import { CaretRight, Devices, Plus, Power, UserGear, HardDrive } from '@phosphor-icons/react';
6
6
  import React, { useCallback } from 'react';
7
7
 
8
+ import { log } from '@dxos/log';
8
9
  import { useAgentHostingProviderClient, useClient } from '@dxos/react-client';
9
10
  import { useHaloInvitations } from '@dxos/react-client/halo';
10
11
  import { Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
@@ -24,7 +25,7 @@ export const IdentityActionChooser = (props: IdentityPanelStepProps) => {
24
25
  const onInvitationEvent = useCallback((invitation: Invitation) => {
25
26
  const invitationCode = InvitationEncoder.encode(invitation);
26
27
  if (invitation.state === Invitation.State.CONNECTING) {
27
- console.log(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
28
+ log.info(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
28
29
  }
29
30
  }, []);
30
31
  const createInvitation = (e: React.MouseEvent) => {
@@ -8,8 +8,9 @@ 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 { useTranslation } from '@dxos/react-ui';
11
+ import { hexToEmoji, hexToHue } from '@dxos/util';
11
12
 
12
- import { Action, Actions, StepHeading, Input, useClipboardContext } from '../../../components';
13
+ import { Action, Actions, StepHeading, Input, useClipboardContext, EmojiPicker, HuePicker } from '../../../components';
13
14
  import { type IdentityPanelStepProps } from '../IdentityPanelProps';
14
15
  import { type IdentityEvent } from '../identityMachine';
15
16
 
@@ -36,13 +37,20 @@ export const ProfileForm = (props: ProfileFormProps) => {
36
37
  return <ProfileFormImpl {...props} onUpdateProfile={handleUpdateProfile} validationMessage={validationMessage} />;
37
38
  };
38
39
 
40
+ const getHueValue = (identity?: Identity) =>
41
+ identity?.profile?.data?.hue || hexToHue(identity?.identityKey.toHex() ?? '0');
42
+ const getEmojiValue = (identity?: Identity) =>
43
+ identity?.profile?.data?.emoji || hexToEmoji(identity?.identityKey.toHex() ?? '0');
44
+
39
45
  // TODO(zhenyasav): impl shouldn't need send()
40
46
  const ProfileFormImpl = (props: ProfileFormImplProps) => {
41
47
  const { active, identity, send, onUpdateProfile, validationMessage } = props;
42
48
  const profile = identity?.profile;
43
49
  const disabled = !active;
44
50
  const { t } = useTranslation('os');
45
- const [inputValue, setInputValue] = useState(profile?.displayName ?? '');
51
+ const [displayName, setDisplayName] = useState(profile?.displayName ?? '');
52
+ const [hue, setHue] = useState<string>(getHueValue(identity));
53
+ const [emoji, setEmoji] = useState<string>(getEmojiValue(identity));
46
54
  const { textValue, setTextValue } = useClipboardContext();
47
55
  const identityHex = identity?.identityKey.toHex();
48
56
  const copied = textValue === identityHex;
@@ -51,14 +59,28 @@ const ProfileFormImpl = (props: ProfileFormImplProps) => {
51
59
  <div role='none' className='grow flex flex-col justify-center'>
52
60
  <Input
53
61
  {...{ validationMessage }}
54
- label={<StepHeading>{t('display name input label')}</StepHeading>}
62
+ label={<StepHeading className='m-0'>{t('display name input label')}</StepHeading>}
55
63
  disabled={disabled}
56
64
  data-testid='display-name-input'
57
65
  placeholder={t('display name input placeholder')}
58
- value={inputValue}
59
- onChange={({ target: { value } }) => setInputValue(value)}
60
- onKeyDown={({ key }) => key === 'Enter' && onUpdateProfile?.({ displayName: inputValue })}
66
+ value={displayName}
67
+ onChange={({ target: { value } }) => setDisplayName(value)}
61
68
  />
69
+ <StepHeading className='mbe-2'>{t('emoji and color label')}</StepHeading>
70
+ <div role='none' className='grid grid-cols-[1fr_min-content] gap-y-2'>
71
+ <EmojiPicker
72
+ emoji={emoji}
73
+ onChangeEmoji={setEmoji}
74
+ disabled={disabled}
75
+ onClickClear={() => setEmoji(getEmojiValue(identity))}
76
+ />
77
+ <HuePicker
78
+ hue={hue}
79
+ onChangeHue={setHue}
80
+ disabled={disabled}
81
+ onClickClear={() => setHue(getHueValue(identity))}
82
+ />
83
+ </div>
62
84
  </div>
63
85
  <Actions>
64
86
  <Action
@@ -84,7 +106,7 @@ const ProfileFormImpl = (props: ProfileFormImplProps) => {
84
106
  <Action
85
107
  variant='primary'
86
108
  disabled={disabled}
87
- onClick={() => onUpdateProfile?.({ displayName: inputValue })}
109
+ onClick={() => onUpdateProfile?.({ displayName, data: { emoji, hue } })}
88
110
  data-testid='update-profile-form-continue'
89
111
  >
90
112
  {t('done label')}
@@ -6,6 +6,7 @@ import { useCallback, useEffect, useState } from 'react';
6
6
 
7
7
  import { type CancellableInvitation } from '@dxos/client-protocol';
8
8
  import { invariant } from '@dxos/invariant';
9
+ import { log } from '@dxos/log';
9
10
  import { useAgentHostingProviderClient, type Client } from '@dxos/react-client';
10
11
  import { type Identity } from '@dxos/react-client/halo';
11
12
  import { Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
@@ -46,7 +47,7 @@ export const useAgentHandlers = ({
46
47
  const handleAgentCreate = useCallback(async (invitation: Invitation) => {
47
48
  const invitationCode = InvitationEncoder.encode(invitation);
48
49
  if (invitation.state === Invitation.State.CONNECTING) {
49
- console.log(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
50
+ log.info(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
50
51
  invariant(identity, 'Identity not found');
51
52
  if (agentHostingProviderClient) {
52
53
  try {
@@ -6,8 +6,9 @@ import React, { cloneElement } from 'react';
6
6
 
7
7
  import { generateName } from '@dxos/display-name';
8
8
  import type { Identity } from '@dxos/react-client/halo';
9
- import { Avatar, useId, useJdenticonHref, useTranslation } from '@dxos/react-ui';
9
+ import { Avatar, useId, useTranslation } from '@dxos/react-ui';
10
10
  import { mx } from '@dxos/react-ui-theme';
11
+ import { hexToFallback } from '@dxos/util';
11
12
 
12
13
  import { Action, Actions, StepHeading } from '../../../components';
13
14
  import { type JoinPanelMode, type JoinStepProps } from '../JoinPanelProps';
@@ -22,11 +23,10 @@ export const IdentityAdded = (props: IdentityAddedProps) => {
22
23
  const disabled = !active;
23
24
  const { t } = useTranslation('os');
24
25
 
25
- const fallbackValue = addedIdentity?.identityKey.toHex();
26
+ const addedIdentityHex = addedIdentity?.identityKey.toHex() ?? '0';
27
+ const fallbackValue = hexToFallback(addedIdentityHex);
26
28
  const labelId = useId('identityListItem__label');
27
- const jdenticon = useJdenticonHref(fallbackValue ?? '', 12);
28
- const displayName =
29
- addedIdentity?.profile?.displayName ?? (addedIdentity && generateName(addedIdentity?.identityKey.toHex()));
29
+ const displayName = addedIdentity?.profile?.displayName ?? (addedIdentity && generateName(addedIdentityHex));
30
30
 
31
31
  const doneAction = (
32
32
  <Action
@@ -43,9 +43,9 @@ export const IdentityAdded = (props: IdentityAddedProps) => {
43
43
  <>
44
44
  <StepHeading>{t('identity added label')}</StepHeading>
45
45
  <div role='none' className='grow flex flex-col items-center justify-center text-center gap-2'>
46
- <Avatar.Root status='active' labelId={labelId}>
46
+ <Avatar.Root status='active' labelId={labelId} hue={addedIdentity?.profile?.data?.hue || fallbackValue.hue}>
47
47
  <Avatar.Frame>
48
- <Avatar.Fallback href={jdenticon} />
48
+ <Avatar.Fallback text={addedIdentity?.profile?.data?.emoji || fallbackValue.emoji} />
49
49
  </Avatar.Frame>
50
50
  <Avatar.Label classNames={mx('text-lg truncate', !addedIdentity?.profile?.displayName && 'font-mono')}>
51
51
  {displayName}
@@ -5,9 +5,9 @@
5
5
  import React, { type ChangeEvent, useState } from 'react';
6
6
 
7
7
  import { Input, useTranslation } from '@dxos/react-ui';
8
+ import { hexToEmoji } from '@dxos/util';
8
9
 
9
10
  import { Actions, Action, Emoji, StepHeading } from '../../../components';
10
- import { toEmoji } from '../../../util';
11
11
  import { type JoinStepProps } from '../JoinPanelProps';
12
12
 
13
13
  const pinLength = 6;
@@ -45,7 +45,7 @@ export const InvitationAuthenticator = ({
45
45
  return (
46
46
  <>
47
47
  <div role='none' className='grow flex flex-col justify-center'>
48
- {invitationId && <Emoji text={toEmoji(invitationId)} />}
48
+ {invitationId && <Emoji text={hexToEmoji(invitationId)} />}
49
49
  <Input.Root
50
50
  {...(failed && {
51
51
  validationValence: 'error',
@@ -16,9 +16,7 @@ const getComponentNames = (module: any): string[] =>
16
16
  Object.getOwnPropertyNames(module).filter((name) => !(name === 'default' || name.startsWith('__')));
17
17
 
18
18
  const getComponents = (module: any): React.FC[] => {
19
- const components = getComponentNames(module).map((name) => module[name]);
20
- console.log(module);
21
- return components;
19
+ return getComponentNames(module).map((name) => module[name]);
22
20
  };
23
21
 
24
22
  const camelCaseToSpacedName = (camelCase: string) => {
@@ -5,6 +5,7 @@
5
5
  import { Placeholder, UserPlus, UsersThree } from '@phosphor-icons/react';
6
6
  import React, { type Dispatch, type SetStateAction, useCallback, useState } from 'react';
7
7
 
8
+ import { log } from '@dxos/log';
8
9
  import { useConfig } from '@dxos/react-client';
9
10
  import { useSpaceInvitations } from '@dxos/react-client/echo';
10
11
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
@@ -45,7 +46,7 @@ export const SpaceManager = (props: SpaceManagerProps) => {
45
46
  const onInvitationEvent = useCallback((invitation: Invitation) => {
46
47
  const invitationCode = InvitationEncoder.encode(invitation);
47
48
  if (invitation.state === Invitation.State.CONNECTING) {
48
- console.log(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
49
+ log.info(JSON.stringify({ invitationCode, authCode: invitation.authCode }));
49
50
  }
50
51
  }, []);
51
52