@dxos/shell 0.3.11-main.8a2cfe6 → 0.3.11-main.8be6c8a

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 (53) hide show
  1. package/dist/bundle/shell.mjs +36416 -0
  2. package/dist/bundle/shell.mjs.map +1 -0
  3. package/dist/bundle/shell.umd.js +210 -0
  4. package/dist/bundle/shell.umd.js.map +1 -0
  5. package/dist/bundle/style.css +1 -0
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/react.mjs +317 -266
  8. package/dist/lib/browser/react.mjs.map +4 -4
  9. package/dist/types/src/components/IdentityList/DeviceList.d.ts.map +1 -1
  10. package/dist/types/src/components/IdentityList/DeviceList.js +5 -3
  11. package/dist/types/src/components/IdentityList/DeviceList.js.map +1 -1
  12. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  13. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +10 -1
  14. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  15. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts +6 -0
  16. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  17. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +26 -3
  18. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
  19. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +7 -6
  20. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  21. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -1
  22. package/dist/types/src/panels/IdentityPanel/identityMachine.js +2 -1
  23. package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -1
  24. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts +10 -0
  25. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts.map +1 -0
  26. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js +23 -0
  27. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js.map +1 -0
  28. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  29. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +4 -0
  30. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  31. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts +0 -1
  32. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -1
  33. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +2 -3
  34. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -1
  35. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts +1 -0
  36. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts.map +1 -1
  37. package/dist/types/src/panels/IdentityPanel/steps/index.js +1 -0
  38. package/dist/types/src/panels/IdentityPanel/steps/index.js.map +1 -1
  39. package/dist/types/src/translations/locales/en-US.d.ts +1 -0
  40. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  41. package/dist/types/src/translations/locales/en-US.js +2 -1
  42. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  43. package/package.json +17 -17
  44. package/src/components/IdentityList/DeviceList.tsx +7 -5
  45. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +44 -2
  46. package/src/panels/IdentityPanel/IdentityPanel.tsx +14 -3
  47. package/src/panels/IdentityPanel/IdentityPanelProps.ts +7 -6
  48. package/src/panels/IdentityPanel/identityMachine.ts +2 -1
  49. package/src/panels/IdentityPanel/steps/DeviceManager.tsx +41 -0
  50. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +6 -1
  51. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +1 -1
  52. package/src/panels/IdentityPanel/steps/index.ts +1 -0
  53. package/src/translations/locales/en-US.ts +2 -1
@@ -182,9 +182,9 @@ var DeviceList = ({ devices, onSelect }) => {
182
182
  }, devices.map((device) => {
183
183
  const identity = {
184
184
  identityKey: device.deviceKey,
185
- profile: {
185
+ profile: device.profile ? {
186
186
  displayName: `${device.profile?.platform} (${device.profile?.platformVersion}) on ${device.profile?.os} (${device.profile?.osVersion}) ${device.profile?.architecture ?? "Unknown"}-bit`
187
- }
187
+ } : void 0
188
188
  };
189
189
  return /* @__PURE__ */ React5.createElement(IdentityListItem, {
190
190
  key: device.deviceKey.toHex(),
@@ -813,17 +813,17 @@ var SpaceListItem = /* @__PURE__ */ forwardRef7(({ space, onClick }, ref) => {
813
813
  });
814
814
 
815
815
  // packages/sdk/shell/src/composites/IdentityDialog/IdentityDialog.tsx
816
- import React37 from "react";
816
+ import React38 from "react";
817
817
  import { Dialog, useId as useId9 } from "@dxos/react-ui";
818
818
 
819
819
  // packages/sdk/shell/src/panels/IdentityPanel/IdentityPanel.tsx
820
- import React24, { useEffect as useEffect2, useMemo as useMemo3 } from "react";
820
+ import React25, { useEffect as useEffect2, useMemo as useMemo3 } from "react";
821
821
  import { generateName as generateName2 } from "@dxos/display-name";
822
822
  import { log as log3 } from "@dxos/log";
823
823
  import { useClient as useClient3 } from "@dxos/react-client";
824
- import { useIdentity } from "@dxos/react-client/halo";
824
+ import { useIdentity, useDevices } from "@dxos/react-client/halo";
825
825
  import { useInvitationStatus as useInvitationStatus2 } from "@dxos/react-client/invitations";
826
- import { Avatar as Avatar4, DensityProvider as DensityProvider2, useId as useId5, useJdenticonHref as useJdenticonHref3, useTranslation as useTranslation10 } from "@dxos/react-ui";
826
+ import { Avatar as Avatar4, DensityProvider as DensityProvider2, useId as useId5, useJdenticonHref as useJdenticonHref3, useTranslation as useTranslation11 } from "@dxos/react-ui";
827
827
 
828
828
  // packages/sdk/shell/src/panels/IdentityPanel/identityMachine.ts
829
829
  import { useMachine } from "@xstate/react";
@@ -844,6 +844,7 @@ var identityMachine = createMachine({
844
844
  states: {
845
845
  choosingAction: {},
846
846
  managingDeviceInvitation: {},
847
+ managingDevices: {},
847
848
  managingProfile: {
848
849
  initial: "idle",
849
850
  states: {
@@ -873,13 +874,6 @@ var identityMachine = createMachine({
873
874
  "log"
874
875
  ]
875
876
  },
876
- chooseDevices: {
877
- target: ".managingDeviceInvitation",
878
- actions: [
879
- "unsetInvitation",
880
- "log"
881
- ]
882
- },
883
877
  deselectInvitation: {
884
878
  target: ".choosingAction",
885
879
  actions: [
@@ -894,6 +888,10 @@ var identityMachine = createMachine({
894
888
  "log"
895
889
  ]
896
890
  },
891
+ chooseDevices: {
892
+ target: ".managingDevices",
893
+ actions: "log"
894
+ },
897
895
  chooseProfile: {
898
896
  target: ".managingProfile",
899
897
  actions: "log"
@@ -916,7 +914,7 @@ var identityMachine = createMachine({
916
914
  context
917
915
  }, {
918
916
  F: __dxlog_file,
919
- L: 95,
917
+ L: 96,
920
918
  S: void 0,
921
919
  C: (f, a) => f(...a)
922
920
  });
@@ -937,13 +935,34 @@ var useIdentityMachine = (client, options) => {
937
935
  });
938
936
  };
939
937
 
938
+ // packages/sdk/shell/src/panels/IdentityPanel/steps/DeviceManager.tsx
939
+ import React21 from "react";
940
+ import { useTranslation as useTranslation7 } from "@dxos/react-ui";
941
+ var DeviceManager = ({ devices, active, send }) => {
942
+ const { t } = useTranslation7("os");
943
+ const disabled = !active;
944
+ return /* @__PURE__ */ React21.createElement(React21.Fragment, null, /* @__PURE__ */ React21.createElement("div", {
945
+ role: "none",
946
+ className: "grow"
947
+ }, /* @__PURE__ */ React21.createElement(DeviceList, {
948
+ devices
949
+ })), /* @__PURE__ */ React21.createElement(Actions, null, /* @__PURE__ */ React21.createElement(Action, {
950
+ variant: "ghost",
951
+ disabled,
952
+ onClick: () => send?.({
953
+ type: "unchooseAction"
954
+ }),
955
+ "data-testid": "manage-devices-back"
956
+ }, t("back label"))));
957
+ };
958
+
940
959
  // packages/sdk/shell/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx
941
- import { CaretRight, Plus, Power, UserGear } from "@phosphor-icons/react";
942
- import React21, { useCallback as useCallback4 } from "react";
960
+ import { CaretRight, Devices, Plus, Power, UserGear } from "@phosphor-icons/react";
961
+ import React22, { useCallback as useCallback4 } from "react";
943
962
  import { useClient as useClient2 } from "@dxos/react-client";
944
963
  import { useHaloInvitations } from "@dxos/react-client/halo";
945
964
  import { Invitation as Invitation3, InvitationEncoder } from "@dxos/react-client/invitations";
946
- import { DensityProvider, useTranslation as useTranslation7 } from "@dxos/react-ui";
965
+ import { DensityProvider, useTranslation as useTranslation8 } from "@dxos/react-ui";
947
966
  import { getSize as getSize6 } from "@dxos/react-ui-theme";
948
967
  var IdentityActionChooser = (props) => {
949
968
  const { send } = props;
@@ -973,69 +992,82 @@ var IdentityActionChooser = (props) => {
973
992
  invitation
974
993
  });
975
994
  };
976
- return /* @__PURE__ */ React21.createElement(IdentityActionChooserImpl, {
995
+ return /* @__PURE__ */ React22.createElement(IdentityActionChooserImpl, {
977
996
  ...props,
978
997
  onCreateInvitationClick: (e) => createInvitation(e)
979
998
  });
980
999
  };
981
1000
  var IdentityActionChooserImpl = ({ onCreateInvitationClick, active, send, onDone, doneActionParent }) => {
982
- const { t } = useTranslation7("os");
983
- return /* @__PURE__ */ React21.createElement("div", {
1001
+ const { t } = useTranslation8("os");
1002
+ return /* @__PURE__ */ React22.createElement("div", {
984
1003
  role: "none",
985
1004
  className: "grow flex flex-col gap-1"
986
- }, /* @__PURE__ */ React21.createElement(DensityProvider, {
1005
+ }, /* @__PURE__ */ React22.createElement(DensityProvider, {
987
1006
  density: "coarse"
988
- }, /* @__PURE__ */ React21.createElement("div", {
1007
+ }, /* @__PURE__ */ React22.createElement("div", {
989
1008
  className: "grow justify-center flex flex-col gap-1"
990
- }, /* @__PURE__ */ React21.createElement(Action, {
1009
+ }, /* @__PURE__ */ React22.createElement(Action, {
991
1010
  disabled: !active,
992
1011
  "data-testid": "devices-panel.create-invitation",
993
1012
  onClick: onCreateInvitationClick,
994
1013
  classNames: "plb-4"
995
- }, /* @__PURE__ */ React21.createElement(Plus, {
1014
+ }, /* @__PURE__ */ React22.createElement(Plus, {
1015
+ className: getSize6(6)
1016
+ }), /* @__PURE__ */ React22.createElement("span", {
1017
+ className: "grow mli-3"
1018
+ }, t("choose add device label")), /* @__PURE__ */ React22.createElement(CaretRight, {
1019
+ weight: "bold",
1020
+ className: getSize6(4)
1021
+ })), /* @__PURE__ */ React22.createElement(Action, {
1022
+ "data-testid": "manage-devices",
1023
+ onClick: () => send?.({
1024
+ type: "chooseDevices"
1025
+ }),
1026
+ classNames: "plb-4"
1027
+ }, /* @__PURE__ */ React22.createElement(Devices, {
996
1028
  className: getSize6(6)
997
- }), /* @__PURE__ */ React21.createElement("span", {
1029
+ }), /* @__PURE__ */ React22.createElement("span", {
998
1030
  className: "grow mli-3"
999
- }, t("choose devices label")), /* @__PURE__ */ React21.createElement(CaretRight, {
1031
+ }, t("choose devices label")), /* @__PURE__ */ React22.createElement(CaretRight, {
1000
1032
  weight: "bold",
1001
1033
  className: getSize6(4)
1002
- })), /* @__PURE__ */ React21.createElement(Action, {
1034
+ })), /* @__PURE__ */ React22.createElement(Action, {
1003
1035
  "data-testid": "manage-profile",
1004
1036
  onClick: () => send?.({
1005
1037
  type: "chooseProfile"
1006
1038
  }),
1007
1039
  classNames: "plb-4"
1008
- }, /* @__PURE__ */ React21.createElement(UserGear, {
1040
+ }, /* @__PURE__ */ React22.createElement(UserGear, {
1009
1041
  className: getSize6(6)
1010
- }), /* @__PURE__ */ React21.createElement("span", {
1042
+ }), /* @__PURE__ */ React22.createElement("span", {
1011
1043
  className: "grow mli-3"
1012
- }, t("choose profile label")), /* @__PURE__ */ React21.createElement(CaretRight, {
1044
+ }, t("choose profile label")), /* @__PURE__ */ React22.createElement(CaretRight, {
1013
1045
  weight: "bold",
1014
1046
  className: getSize6(4)
1015
- })), /* @__PURE__ */ React21.createElement(Action, {
1047
+ })), /* @__PURE__ */ React22.createElement(Action, {
1016
1048
  disabled: true,
1017
1049
  "data-testid": "sign-out",
1018
1050
  onClick: () => {
1019
1051
  },
1020
1052
  classNames: "plb-4"
1021
- }, /* @__PURE__ */ React21.createElement(Power, {
1053
+ }, /* @__PURE__ */ React22.createElement(Power, {
1022
1054
  className: getSize6(6)
1023
- }), /* @__PURE__ */ React21.createElement("span", {
1055
+ }), /* @__PURE__ */ React22.createElement("span", {
1024
1056
  className: "grow mli-3"
1025
- }, t("choose sign out label")), /* @__PURE__ */ React21.createElement(CaretRight, {
1057
+ }, t("choose sign out label")), /* @__PURE__ */ React22.createElement(CaretRight, {
1026
1058
  weight: "bold",
1027
1059
  className: getSize6(4)
1028
1060
  })))));
1029
1061
  };
1030
1062
 
1031
1063
  // packages/sdk/shell/src/panels/IdentityPanel/steps/ProfileForm.tsx
1032
- import React22, { useState as useState3 } from "react";
1064
+ import React23, { useState as useState3 } from "react";
1033
1065
  import { log as log2 } from "@dxos/log";
1034
- import { useTranslation as useTranslation8 } from "@dxos/react-ui";
1066
+ import { useTranslation as useTranslation9 } from "@dxos/react-ui";
1035
1067
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/IdentityPanel/steps/ProfileForm.tsx";
1036
1068
  var ProfileForm = (props) => {
1037
1069
  const { onUpdateProfile } = props;
1038
- const { t } = useTranslation8("os");
1070
+ const { t } = useTranslation9("os");
1039
1071
  const [validationMessage, setValidationMessage] = useState3("");
1040
1072
  const handleUpdateProfile = async (profile) => {
1041
1073
  await onUpdateProfile?.(profile).catch((error) => {
@@ -1048,7 +1080,7 @@ var ProfileForm = (props) => {
1048
1080
  setValidationMessage(t("failed to update profile message"));
1049
1081
  });
1050
1082
  };
1051
- return /* @__PURE__ */ React22.createElement(ProfileFormImpl, {
1083
+ return /* @__PURE__ */ React23.createElement(ProfileFormImpl, {
1052
1084
  ...props,
1053
1085
  onUpdateProfile: handleUpdateProfile,
1054
1086
  validationMessage
@@ -1057,14 +1089,14 @@ var ProfileForm = (props) => {
1057
1089
  var ProfileFormImpl = (props) => {
1058
1090
  const { active, profile, send, onUpdateProfile, validationMessage } = props;
1059
1091
  const disabled = !active;
1060
- const { t } = useTranslation8("os");
1092
+ const { t } = useTranslation9("os");
1061
1093
  const [inputValue, setInputValue] = useState3(profile?.displayName ?? "");
1062
- return /* @__PURE__ */ React22.createElement(React22.Fragment, null, /* @__PURE__ */ React22.createElement("div", {
1094
+ return /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement("div", {
1063
1095
  role: "none",
1064
1096
  className: "grow flex flex-col justify-center"
1065
- }, /* @__PURE__ */ React22.createElement(Input, {
1097
+ }, /* @__PURE__ */ React23.createElement(Input, {
1066
1098
  validationMessage,
1067
- label: /* @__PURE__ */ React22.createElement(StepHeading, null, t("display name input label")),
1099
+ label: /* @__PURE__ */ React23.createElement(StepHeading, null, t("display name input label")),
1068
1100
  disabled,
1069
1101
  "data-testid": "display-name-input",
1070
1102
  placeholder: t("display name input placeholder"),
@@ -1073,14 +1105,14 @@ var ProfileFormImpl = (props) => {
1073
1105
  onKeyDown: ({ key }) => key === "Enter" && onUpdateProfile?.({
1074
1106
  displayName: inputValue
1075
1107
  })
1076
- })), /* @__PURE__ */ React22.createElement(Actions, null, /* @__PURE__ */ React22.createElement(Action, {
1108
+ })), /* @__PURE__ */ React23.createElement(Actions, null, /* @__PURE__ */ React23.createElement(Action, {
1077
1109
  variant: "ghost",
1078
1110
  disabled,
1079
1111
  onClick: () => send?.({
1080
1112
  type: "unchooseAction"
1081
1113
  }),
1082
1114
  "data-testid": "update-profile-form-back"
1083
- }, t("back label")), /* @__PURE__ */ React22.createElement(Action, {
1115
+ }, t("back label")), /* @__PURE__ */ React23.createElement(Action, {
1084
1116
  variant: "primary",
1085
1117
  disabled,
1086
1118
  onClick: () => onUpdateProfile?.({
@@ -1092,19 +1124,19 @@ var ProfileFormImpl = (props) => {
1092
1124
 
1093
1125
  // packages/sdk/shell/src/steps/InvitationManager.tsx
1094
1126
  import { Check as Check3, X as X3 } from "@phosphor-icons/react";
1095
- import React23, { useMemo as useMemo2 } from "react";
1127
+ import React24, { useMemo as useMemo2 } from "react";
1096
1128
  import { QR } from "react-qr-rounded";
1097
1129
  import { Invitation as Invitation4 } from "@dxos/react-client/invitations";
1098
- import { useId as useId4, useTranslation as useTranslation9 } from "@dxos/react-ui";
1130
+ import { useId as useId4, useTranslation as useTranslation10 } from "@dxos/react-ui";
1099
1131
  import { descriptionText as descriptionText7, getSize as getSize7, mx as mx18 } from "@dxos/react-ui-theme";
1100
1132
  var InvitationManagerView = ({ children, ...props }) => {
1101
- return /* @__PURE__ */ React23.createElement(Viewport.View, {
1133
+ return /* @__PURE__ */ React24.createElement(Viewport.View, {
1102
1134
  ...props,
1103
1135
  classNames: "grow flex flex-col justify-around items-center"
1104
1136
  }, children);
1105
1137
  };
1106
1138
  var InvitationManager = ({ invitationUrl, active, send, status, type, authCode, id }) => {
1107
- const { t } = useTranslation9("os");
1139
+ const { t } = useTranslation10("os");
1108
1140
  const qrLabel = useId4("invitation-manager__qr-code");
1109
1141
  const statusValue = type === Invitation4.Type.MULTIUSE ? 0 : invitationStatusValue.get(status) ?? 0;
1110
1142
  const showAuthCode = statusValue === 3;
@@ -1122,18 +1154,18 @@ var InvitationManager = ({ invitationUrl, active, send, status, type, authCode,
1122
1154
  }, [
1123
1155
  statusValue
1124
1156
  ]);
1125
- return /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Viewport.Root, {
1157
+ return /* @__PURE__ */ React24.createElement(React24.Fragment, null, /* @__PURE__ */ React24.createElement(Viewport.Root, {
1126
1158
  activeView,
1127
1159
  classNames: "grow plb-1"
1128
- }, /* @__PURE__ */ React23.createElement(Viewport.Views, null, /* @__PURE__ */ React23.createElement(InvitationManagerView, {
1160
+ }, /* @__PURE__ */ React24.createElement(Viewport.Views, null, /* @__PURE__ */ React24.createElement(InvitationManagerView, {
1129
1161
  id: "showing qr",
1130
1162
  emoji: emoji2
1131
- }, /* @__PURE__ */ React23.createElement("p", {
1163
+ }, /* @__PURE__ */ React24.createElement("p", {
1132
1164
  className: "text-sm mlb-1 font-normal text-center"
1133
- }, t(type === Invitation4.Type.MULTIUSE ? "invite many qr label" : "invite one qr label")), /* @__PURE__ */ React23.createElement("div", {
1165
+ }, t(type === Invitation4.Type.MULTIUSE ? "invite many qr label" : "invite one qr label")), /* @__PURE__ */ React24.createElement("div", {
1134
1166
  role: "none",
1135
1167
  className: mx18(descriptionText7, "is-full max-is-[14rem] relative")
1136
- }, /* @__PURE__ */ React23.createElement(QR, {
1168
+ }, /* @__PURE__ */ React24.createElement(QR, {
1137
1169
  rounding: 100,
1138
1170
  backgroundColor: "transparent",
1139
1171
  color: "currentColor",
@@ -1141,31 +1173,31 @@ var InvitationManager = ({ invitationUrl, active, send, status, type, authCode,
1141
1173
  "aria-labelledby": qrLabel,
1142
1174
  errorCorrectionLevel: "Q",
1143
1175
  cutout: true
1144
- }, invitationUrl ?? "never"), /* @__PURE__ */ React23.createElement(Centered, null, /* @__PURE__ */ React23.createElement(Emoji, {
1176
+ }, invitationUrl ?? "never"), /* @__PURE__ */ React24.createElement(Centered, null, /* @__PURE__ */ React24.createElement(Emoji, {
1145
1177
  text: emoji2
1146
- }))), /* @__PURE__ */ React23.createElement("span", {
1178
+ }))), /* @__PURE__ */ React24.createElement("span", {
1147
1179
  id: qrLabel,
1148
1180
  className: "sr-only"
1149
- }, t("qr label")), /* @__PURE__ */ React23.createElement(CopyButton, {
1181
+ }, t("qr label")), /* @__PURE__ */ React24.createElement(CopyButton, {
1150
1182
  variant: "ghost",
1151
1183
  value: invitationUrl ?? "never"
1152
- })), /* @__PURE__ */ React23.createElement(InvitationManagerView, {
1184
+ })), /* @__PURE__ */ React24.createElement(InvitationManagerView, {
1153
1185
  id: "showing auth code"
1154
- }, /* @__PURE__ */ React23.createElement(Label, null, t("auth code message")), /* @__PURE__ */ React23.createElement(AuthCode, {
1186
+ }, /* @__PURE__ */ React24.createElement(Label, null, t("auth code message")), /* @__PURE__ */ React24.createElement(AuthCode, {
1155
1187
  code: authCode,
1156
1188
  large: true,
1157
1189
  classNames: "text-black dark:text-white"
1158
- }), /* @__PURE__ */ React23.createElement(Label, null, "Be sure the other device is showing this symbol:"), emoji2 && /* @__PURE__ */ React23.createElement(Emoji, {
1190
+ }), /* @__PURE__ */ React24.createElement(Label, null, "Be sure the other device is showing this symbol:"), emoji2 && /* @__PURE__ */ React24.createElement(Emoji, {
1159
1191
  text: emoji2
1160
- })), /* @__PURE__ */ React23.createElement(InvitationManagerView, {
1192
+ })), /* @__PURE__ */ React24.createElement(InvitationManagerView, {
1161
1193
  id: "showing final"
1162
- }, statusValue > 0 ? /* @__PURE__ */ React23.createElement(Check3, {
1194
+ }, statusValue > 0 ? /* @__PURE__ */ React24.createElement(Check3, {
1163
1195
  className: mx18("m-1.5", getSize7(6))
1164
- }) : /* @__PURE__ */ React23.createElement(X3, {
1196
+ }) : /* @__PURE__ */ React24.createElement(X3, {
1165
1197
  className: mx18("m-1.5", getSize7(6))
1166
- })))), /* @__PURE__ */ React23.createElement(Actions, {
1198
+ })))), /* @__PURE__ */ React24.createElement(Actions, {
1167
1199
  classNames: "mbs-4"
1168
- }, /* @__PURE__ */ React23.createElement(Action, {
1200
+ }, /* @__PURE__ */ React24.createElement(Action, {
1169
1201
  disabled: !active,
1170
1202
  onClick: () => send?.({
1171
1203
  type: "deselectInvitation"
@@ -1178,32 +1210,33 @@ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/I
1178
1210
  var viewStyles = "pbs-1 pbe-3 pli-3";
1179
1211
  var IdentityHeading = ({ titleId, title, identity, onDone }) => {
1180
1212
  const fallbackHref = useJdenticonHref3(identity.identityKey.toHex(), 12);
1181
- return /* @__PURE__ */ React24.createElement(Heading, {
1213
+ return /* @__PURE__ */ React25.createElement(Heading, {
1182
1214
  titleId,
1183
1215
  title,
1184
- corner: /* @__PURE__ */ React24.createElement(CloseButton, {
1216
+ corner: /* @__PURE__ */ React25.createElement(CloseButton, {
1185
1217
  onDone
1186
1218
  })
1187
- }, /* @__PURE__ */ React24.createElement(Avatar4.Root, {
1219
+ }, /* @__PURE__ */ React25.createElement(Avatar4.Root, {
1188
1220
  size: 12,
1189
1221
  variant: "circle",
1190
1222
  status: "active"
1191
- }, /* @__PURE__ */ React24.createElement(Avatar4.Frame, {
1223
+ }, /* @__PURE__ */ React25.createElement(Avatar4.Frame, {
1192
1224
  classNames: "block mbs-4 mbe-2 mli-auto chromatic-ignore"
1193
- }, /* @__PURE__ */ React24.createElement(Avatar4.Fallback, {
1225
+ }, /* @__PURE__ */ React25.createElement(Avatar4.Fallback, {
1194
1226
  href: fallbackHref
1195
- })), /* @__PURE__ */ React24.createElement(Avatar4.Label, {
1227
+ })), /* @__PURE__ */ React25.createElement(Avatar4.Label, {
1196
1228
  classNames: "block text-center font-light text-xl"
1197
1229
  }, identity.profile?.displayName ?? generateName2(identity.identityKey.toHex()))));
1198
1230
  };
1199
1231
  var IdentityPanelImpl = (props) => {
1200
1232
  const { identity, titleId, activeView, onUpdateProfile, IdentityActionChooser: IdentityActionChooserComponent = IdentityActionChooser, InvitationManager: InvitationManagerComponent = InvitationManager, onDone, ...rest } = props;
1201
- const { t } = useTranslation10("os");
1233
+ const { t } = useTranslation11("os");
1202
1234
  const title = useMemo3(() => {
1203
1235
  switch (activeView) {
1204
1236
  case "device manager":
1205
- case "device invitation manager":
1206
1237
  return t("choose devices label");
1238
+ case "device invitation manager":
1239
+ return t("choose add device label");
1207
1240
  default:
1208
1241
  return t("identity heading");
1209
1242
  }
@@ -1211,32 +1244,41 @@ var IdentityPanelImpl = (props) => {
1211
1244
  activeView,
1212
1245
  t
1213
1246
  ]);
1214
- return /* @__PURE__ */ React24.createElement(DensityProvider2, {
1247
+ console.log("[IdentityPanelImpl]", {
1248
+ activeView
1249
+ });
1250
+ return /* @__PURE__ */ React25.createElement(DensityProvider2, {
1215
1251
  density: "fine"
1216
- }, /* @__PURE__ */ React24.createElement(IdentityHeading, {
1252
+ }, /* @__PURE__ */ React25.createElement(IdentityHeading, {
1217
1253
  identity,
1218
1254
  titleId,
1219
1255
  title,
1220
1256
  onDone
1221
- }), /* @__PURE__ */ React24.createElement(Viewport.Root, {
1257
+ }), /* @__PURE__ */ React25.createElement(Viewport.Root, {
1222
1258
  activeView
1223
- }, /* @__PURE__ */ React24.createElement(Viewport.Views, null, /* @__PURE__ */ React24.createElement(Viewport.View, {
1259
+ }, /* @__PURE__ */ React25.createElement(Viewport.Views, null, /* @__PURE__ */ React25.createElement(Viewport.View, {
1224
1260
  id: "identity action chooser",
1225
1261
  classNames: viewStyles
1226
- }, /* @__PURE__ */ React24.createElement(IdentityActionChooserComponent, {
1262
+ }, /* @__PURE__ */ React25.createElement(IdentityActionChooserComponent, {
1227
1263
  active: activeView === "identity action chooser",
1228
1264
  ...rest
1229
- })), /* @__PURE__ */ React24.createElement(Viewport.View, {
1265
+ })), /* @__PURE__ */ React25.createElement(Viewport.View, {
1230
1266
  id: "device invitation manager",
1231
1267
  classNames: viewStyles
1232
- }, /* @__PURE__ */ React24.createElement(InvitationManagerComponent, {
1268
+ }, /* @__PURE__ */ React25.createElement(InvitationManagerComponent, {
1233
1269
  active: activeView === "device invitation manager",
1234
1270
  ...rest,
1235
1271
  invitationUrl: rest.createInvitationUrl(rest.invitationCode)
1236
- })), /* @__PURE__ */ React24.createElement(Viewport.View, {
1272
+ })), /* @__PURE__ */ React25.createElement(Viewport.View, {
1273
+ id: "device manager",
1274
+ classNames: viewStyles
1275
+ }, /* @__PURE__ */ React25.createElement(DeviceManager, {
1276
+ active: activeView === "device manager",
1277
+ ...rest
1278
+ })), /* @__PURE__ */ React25.createElement(Viewport.View, {
1237
1279
  classNames: viewStyles,
1238
1280
  id: "update profile form"
1239
- }, /* @__PURE__ */ React24.createElement(ProfileForm, {
1281
+ }, /* @__PURE__ */ React25.createElement(ProfileForm, {
1240
1282
  send: rest.send,
1241
1283
  active: activeView === "update profile form",
1242
1284
  profile: identity.profile,
@@ -1245,7 +1287,7 @@ var IdentityPanelImpl = (props) => {
1245
1287
  };
1246
1288
  var IdentityPanelWithInvitationImpl = ({ invitation, ...props }) => {
1247
1289
  const invitationStatus = useInvitationStatus2(invitation);
1248
- return /* @__PURE__ */ React24.createElement(IdentityPanelImpl, {
1290
+ return /* @__PURE__ */ React25.createElement(IdentityPanelImpl, {
1249
1291
  ...props,
1250
1292
  ...invitationStatus
1251
1293
  });
@@ -1253,6 +1295,7 @@ var IdentityPanelWithInvitationImpl = ({ invitation, ...props }) => {
1253
1295
  var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => code, ...props }) => {
1254
1296
  const titleId = useId5("identityPanel__heading", propsTitleId);
1255
1297
  const client = useClient3();
1298
+ const devices = useDevices();
1256
1299
  const identity = useIdentity();
1257
1300
  if (!identity) {
1258
1301
  console.error("IdentityPanel rendered with no active identity.");
@@ -1263,7 +1306,7 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
1263
1306
  const subscription = identityService.subscribe((state) => {
1264
1307
  log3("[state]", state, {
1265
1308
  F: __dxlog_file3,
1266
- L: 117,
1309
+ L: 123,
1267
1310
  S: void 0,
1268
1311
  C: (f, a) => f(...a)
1269
1312
  });
@@ -1278,6 +1321,8 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
1278
1321
  return "identity action chooser";
1279
1322
  case identityState.matches("managingDeviceInvitation"):
1280
1323
  return "device invitation manager";
1324
+ case identityState.matches("managingDevices"):
1325
+ return "device manager";
1281
1326
  case [
1282
1327
  {
1283
1328
  managingProfile: "idle"
@@ -1293,6 +1338,10 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
1293
1338
  }, [
1294
1339
  identityState
1295
1340
  ]);
1341
+ console.log({
1342
+ activeView,
1343
+ identityState
1344
+ });
1296
1345
  const onUpdateProfile = async (profile) => {
1297
1346
  identitySend({
1298
1347
  type: "updateProfile"
@@ -1302,20 +1351,21 @@ var IdentityPanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => co
1302
1351
  const implProps = {
1303
1352
  ...props,
1304
1353
  identity,
1354
+ devices,
1305
1355
  activeView,
1306
1356
  send: identitySend,
1307
1357
  titleId,
1308
1358
  createInvitationUrl,
1309
1359
  onUpdateProfile
1310
1360
  };
1311
- return identityState.context.invitation ? /* @__PURE__ */ React24.createElement(IdentityPanelWithInvitationImpl, {
1361
+ return identityState.context.invitation ? /* @__PURE__ */ React25.createElement(IdentityPanelWithInvitationImpl, {
1312
1362
  ...implProps,
1313
1363
  invitation: identityState.context.invitation
1314
- }) : /* @__PURE__ */ React24.createElement(IdentityPanelImpl, implProps);
1364
+ }) : /* @__PURE__ */ React25.createElement(IdentityPanelImpl, implProps);
1315
1365
  };
1316
1366
 
1317
1367
  // packages/sdk/shell/src/panels/JoinPanel/JoinPanel.tsx
1318
- import React34, { useCallback as useCallback6, useEffect as useEffect4, useMemo as useMemo4 } from "react";
1368
+ import React35, { useCallback as useCallback6, useEffect as useEffect4, useMemo as useMemo4 } from "react";
1319
1369
  import { log as log8 } from "@dxos/log";
1320
1370
  import { useClient as useClient6, useMulticastObservable } from "@dxos/react-client";
1321
1371
  import { useIdentity as useIdentity2 } from "@dxos/react-client/halo";
@@ -1323,25 +1373,25 @@ import { DensityProvider as DensityProvider3, useId as useId7, useThemeContext a
1323
1373
 
1324
1374
  // packages/sdk/shell/src/panels/JoinPanel/JoinHeading.tsx
1325
1375
  import { X as X4 } from "@phosphor-icons/react";
1326
- import React25, { cloneElement, forwardRef as forwardRef8 } from "react";
1327
- import { Button as Button5, useTranslation as useTranslation11 } from "@dxos/react-ui";
1376
+ import React26, { cloneElement, forwardRef as forwardRef8 } from "react";
1377
+ import { Button as Button5, useTranslation as useTranslation12 } from "@dxos/react-ui";
1328
1378
  import { descriptionText as descriptionText8, getSize as getSize8, mx as mx19 } from "@dxos/react-ui-theme";
1329
1379
  var JoinHeading = /* @__PURE__ */ forwardRef8(({ mode, titleId, onExit, exitActionParent }, forwardedRef) => {
1330
- const { t } = useTranslation11("os");
1331
- const exitButton = /* @__PURE__ */ React25.createElement(Button5, {
1380
+ const { t } = useTranslation12("os");
1381
+ const exitButton = /* @__PURE__ */ React26.createElement(Button5, {
1332
1382
  variant: "ghost",
1333
1383
  ...onExit && {
1334
1384
  onClick: onExit
1335
1385
  },
1336
1386
  classNames: mx19(descriptionText8, "plb-0 pli-2 absolute block-start-0 inline-end-0 z-[1]"),
1337
1387
  "data-testid": "join-exit"
1338
- }, /* @__PURE__ */ React25.createElement(X4, {
1388
+ }, /* @__PURE__ */ React26.createElement(X4, {
1339
1389
  weight: "bold",
1340
1390
  className: getSize8(4)
1341
- }), /* @__PURE__ */ React25.createElement("span", {
1391
+ }), /* @__PURE__ */ React26.createElement("span", {
1342
1392
  className: "sr-only"
1343
1393
  }, t("exit label")));
1344
- return /* @__PURE__ */ React25.createElement(Heading, {
1394
+ return /* @__PURE__ */ React26.createElement(Heading, {
1345
1395
  ref: forwardedRef,
1346
1396
  titleId,
1347
1397
  title: t(mode === "halo-only" ? "selecting identity heading" : "joining space heading"),
@@ -1933,16 +1983,16 @@ var useJoinMachine = (client, options) => {
1933
1983
 
1934
1984
  // packages/sdk/shell/src/panels/JoinPanel/steps/AdditionMethodChooser.tsx
1935
1985
  import { CaretRight as CaretRight2, Plus as Plus2, QrCode, Textbox } from "@phosphor-icons/react";
1936
- import React26 from "react";
1937
- import { useTranslation as useTranslation12 } from "@dxos/react-ui";
1986
+ import React27 from "react";
1987
+ import { useTranslation as useTranslation13 } from "@dxos/react-ui";
1938
1988
  import { getSize as getSize9 } from "@dxos/react-ui-theme";
1939
1989
  var AdditionMethodChooser = (viewStateProps) => {
1940
1990
  const disabled = !viewStateProps.active;
1941
1991
  const { send } = viewStateProps;
1942
- const { t } = useTranslation12("os");
1992
+ const { t } = useTranslation13("os");
1943
1993
  const sharedButtonProps = {
1944
1994
  disabled,
1945
- after: /* @__PURE__ */ React26.createElement(CaretRight2, {
1995
+ after: /* @__PURE__ */ React27.createElement(CaretRight2, {
1946
1996
  className: getSize9(4),
1947
1997
  weight: "bold"
1948
1998
  }),
@@ -1952,13 +2002,13 @@ var AdditionMethodChooser = (viewStateProps) => {
1952
2002
  }
1953
2003
  }
1954
2004
  };
1955
- return /* @__PURE__ */ React26.createElement(React26.Fragment, null, /* @__PURE__ */ React26.createElement(StepHeading, null, t("addition method chooser title")), /* @__PURE__ */ React26.createElement("div", {
2005
+ return /* @__PURE__ */ React27.createElement(React27.Fragment, null, /* @__PURE__ */ React27.createElement(StepHeading, null, t("addition method chooser title")), /* @__PURE__ */ React27.createElement("div", {
1956
2006
  role: "none",
1957
2007
  className: "flex flex-col gap-1 grow"
1958
- }, /* @__PURE__ */ React26.createElement(CompoundButton, {
2008
+ }, /* @__PURE__ */ React27.createElement(CompoundButton, {
1959
2009
  ...sharedButtonProps,
1960
2010
  description: t("create identity description"),
1961
- before: /* @__PURE__ */ React26.createElement(Plus2, {
2011
+ before: /* @__PURE__ */ React27.createElement(Plus2, {
1962
2012
  className: getSize9(6)
1963
2013
  }),
1964
2014
  onClick: () => send({
@@ -1966,22 +2016,22 @@ var AdditionMethodChooser = (viewStateProps) => {
1966
2016
  }),
1967
2017
  "data-autofocus": "choosingAuthMethod",
1968
2018
  "data-testid": "create-identity"
1969
- }, t("create identity label")), /* @__PURE__ */ React26.createElement(CompoundButton, {
2019
+ }, t("create identity label")), /* @__PURE__ */ React27.createElement(CompoundButton, {
1970
2020
  ...sharedButtonProps,
1971
2021
  description: t("join identity description"),
1972
- before: /* @__PURE__ */ React26.createElement(QrCode, {
2022
+ before: /* @__PURE__ */ React27.createElement(QrCode, {
1973
2023
  className: getSize9(6)
1974
2024
  }),
1975
2025
  onClick: () => send({
1976
2026
  type: "acceptHaloInvitation"
1977
2027
  }),
1978
2028
  "data-testid": "join-identity"
1979
- }, t("join identity label")), /* @__PURE__ */ React26.createElement(CompoundButton, {
2029
+ }, t("join identity label")), /* @__PURE__ */ React27.createElement(CompoundButton, {
1980
2030
  ...sharedButtonProps,
1981
2031
  // TODO(mykola): Implement recover.
1982
2032
  disabled: true,
1983
2033
  description: t("recover identity description"),
1984
- before: /* @__PURE__ */ React26.createElement(Textbox, {
2034
+ before: /* @__PURE__ */ React27.createElement(Textbox, {
1985
2035
  className: getSize9(6)
1986
2036
  }),
1987
2037
  onClick: () => send({
@@ -1992,37 +2042,37 @@ var AdditionMethodChooser = (viewStateProps) => {
1992
2042
  };
1993
2043
 
1994
2044
  // packages/sdk/shell/src/panels/JoinPanel/steps/IdentityAdded.tsx
1995
- import React27, { cloneElement as cloneElement2 } from "react";
2045
+ import React28, { cloneElement as cloneElement2 } from "react";
1996
2046
  import { generateName as generateName3 } from "@dxos/display-name";
1997
- import { Avatar as Avatar5, useId as useId6, useJdenticonHref as useJdenticonHref4, useTranslation as useTranslation13 } from "@dxos/react-ui";
2047
+ import { Avatar as Avatar5, useId as useId6, useJdenticonHref as useJdenticonHref4, useTranslation as useTranslation14 } from "@dxos/react-ui";
1998
2048
  import { mx as mx20 } from "@dxos/react-ui-theme";
1999
2049
  var IdentityAdded = (props) => {
2000
2050
  const { mode, addedIdentity, active, send, onDone, doneActionParent } = props;
2001
2051
  const disabled = !active;
2002
- const { t } = useTranslation13("os");
2052
+ const { t } = useTranslation14("os");
2003
2053
  const fallbackValue = addedIdentity?.identityKey.toHex();
2004
2054
  const labelId = useId6("identityListItem__label");
2005
2055
  const jdenticon = useJdenticonHref4(fallbackValue ?? "", 12);
2006
2056
  const displayName = addedIdentity?.profile?.displayName ?? (addedIdentity && generateName3(addedIdentity?.identityKey.toHex()));
2007
- const doneAction = /* @__PURE__ */ React27.createElement(Action, {
2057
+ const doneAction = /* @__PURE__ */ React28.createElement(Action, {
2008
2058
  ...onDone && {
2009
2059
  onClick: () => onDone(null)
2010
2060
  },
2011
2061
  disabled,
2012
2062
  "data-autofocus": "confirmingAddedIdentity",
2013
2063
  "data-testid": "identity-added-done"
2014
- }, /* @__PURE__ */ React27.createElement("span", null, t("done label")));
2015
- return /* @__PURE__ */ React27.createElement(React27.Fragment, null, /* @__PURE__ */ React27.createElement(StepHeading, null, t("identity added label")), /* @__PURE__ */ React27.createElement("div", {
2064
+ }, /* @__PURE__ */ React28.createElement("span", null, t("done label")));
2065
+ return /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement(StepHeading, null, t("identity added label")), /* @__PURE__ */ React28.createElement("div", {
2016
2066
  role: "none",
2017
2067
  className: "grow flex flex-col items-center justify-center text-center gap-2"
2018
- }, /* @__PURE__ */ React27.createElement(Avatar5.Root, {
2068
+ }, /* @__PURE__ */ React28.createElement(Avatar5.Root, {
2019
2069
  status: "active",
2020
2070
  labelId
2021
- }, /* @__PURE__ */ React27.createElement(Avatar5.Frame, null, /* @__PURE__ */ React27.createElement(Avatar5.Fallback, {
2071
+ }, /* @__PURE__ */ React28.createElement(Avatar5.Frame, null, /* @__PURE__ */ React28.createElement(Avatar5.Fallback, {
2022
2072
  href: jdenticon
2023
- })), /* @__PURE__ */ React27.createElement(Avatar5.Label, {
2073
+ })), /* @__PURE__ */ React28.createElement(Avatar5.Label, {
2024
2074
  classNames: mx20("text-lg truncate", !addedIdentity?.profile?.displayName && "font-mono")
2025
- }, displayName))), /* @__PURE__ */ React27.createElement(Actions, null, mode === "halo-only" ? doneActionParent ? /* @__PURE__ */ cloneElement2(doneActionParent, {}, doneAction) : doneAction : /* @__PURE__ */ React27.createElement(Action, {
2075
+ }, displayName))), /* @__PURE__ */ React28.createElement(Actions, null, mode === "halo-only" ? doneActionParent ? /* @__PURE__ */ cloneElement2(doneActionParent, {}, doneAction) : doneAction : /* @__PURE__ */ React28.createElement(Action, {
2026
2076
  variant: "primary",
2027
2077
  disabled: disabled || !addedIdentity,
2028
2078
  onClick: () => addedIdentity && send({
@@ -2034,16 +2084,16 @@ var IdentityAdded = (props) => {
2034
2084
  };
2035
2085
 
2036
2086
  // packages/sdk/shell/src/panels/JoinPanel/steps/IdentityInput.tsx
2037
- import React28, { useState as useState4 } from "react";
2087
+ import React29, { useState as useState4 } from "react";
2038
2088
  import { log as log5 } from "@dxos/log";
2039
2089
  import { useClient as useClient4 } from "@dxos/react-client";
2040
- import { useTranslation as useTranslation14 } from "@dxos/react-ui";
2090
+ import { useTranslation as useTranslation15 } from "@dxos/react-ui";
2041
2091
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/steps/IdentityInput.tsx";
2042
2092
  var IdentityInput = (props) => {
2043
2093
  const { send, method } = props;
2044
2094
  const isRecover = method === "recover identity";
2045
2095
  const client = useClient4();
2046
- const { t } = useTranslation14("os");
2096
+ const { t } = useTranslation15("os");
2047
2097
  const [validationMessage, setValidationMessage] = useState4("");
2048
2098
  const createIdentity = (displayName) => {
2049
2099
  void client.halo.createIdentity({
@@ -2063,7 +2113,7 @@ var IdentityInput = (props) => {
2063
2113
  setValidationMessage(t(isRecover ? "failed to recover identity message" : "failed to create identity message"));
2064
2114
  });
2065
2115
  };
2066
- return /* @__PURE__ */ React28.createElement(IdentityInputImpl, {
2116
+ return /* @__PURE__ */ React29.createElement(IdentityInputImpl, {
2067
2117
  ...props,
2068
2118
  onDisplayNameConfirm: createIdentity,
2069
2119
  validationMessage
@@ -2072,27 +2122,27 @@ var IdentityInput = (props) => {
2072
2122
  var IdentityInputImpl = (props) => {
2073
2123
  const { method, send, active, onDisplayNameConfirm, validationMessage } = props;
2074
2124
  const disabled = !active;
2075
- const { t } = useTranslation14("os");
2125
+ const { t } = useTranslation15("os");
2076
2126
  const [inputValue, setInputValue] = useState4("");
2077
2127
  const isRecover = method === "recover identity";
2078
- return /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement("div", {
2128
+ return /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement("div", {
2079
2129
  role: "none",
2080
2130
  className: "grow flex flex-col justify-center"
2081
- }, /* @__PURE__ */ React28.createElement(Input, {
2131
+ }, /* @__PURE__ */ React29.createElement(Input, {
2082
2132
  validationMessage,
2083
- label: /* @__PURE__ */ React28.createElement(StepHeading, null, t(isRecover ? "recover identity input label" : "new identity input label")),
2133
+ label: /* @__PURE__ */ React29.createElement(StepHeading, null, t(isRecover ? "recover identity input label" : "new identity input label")),
2084
2134
  disabled,
2085
2135
  "data-testid": "identity-input",
2086
2136
  placeholder: isRecover ? "Type your recovery phrase" : "Type a display name",
2087
2137
  onChange: ({ target: { value } }) => setInputValue(value)
2088
- })), /* @__PURE__ */ React28.createElement(Actions, null, /* @__PURE__ */ React28.createElement(Action, {
2138
+ })), /* @__PURE__ */ React29.createElement(Actions, null, /* @__PURE__ */ React29.createElement(Action, {
2089
2139
  variant: "ghost",
2090
2140
  disabled,
2091
2141
  onClick: () => send?.({
2092
2142
  type: "deselectAuthMethod"
2093
2143
  }),
2094
2144
  "data-testid": `${method === "recover identity" ? "recover" : "create"}-identity-input-back`
2095
- }, t("back label")), /* @__PURE__ */ React28.createElement(Action, {
2145
+ }, t("back label")), /* @__PURE__ */ React29.createElement(Action, {
2096
2146
  variant: "primary",
2097
2147
  disabled,
2098
2148
  onClick: () => onDisplayNameConfirm?.(inputValue),
@@ -2101,31 +2151,31 @@ var IdentityInputImpl = (props) => {
2101
2151
  };
2102
2152
 
2103
2153
  // packages/sdk/shell/src/panels/JoinPanel/steps/InvitationAccepted.tsx
2104
- import React29, { cloneElement as cloneElement3 } from "react";
2105
- import { useTranslation as useTranslation15 } from "@dxos/react-ui";
2154
+ import React30, { cloneElement as cloneElement3 } from "react";
2155
+ import { useTranslation as useTranslation16 } from "@dxos/react-ui";
2106
2156
  var InvitationAccepted = (props) => {
2107
2157
  const { active, Kind, doneActionParent, onDone } = props;
2108
2158
  const disabled = !active;
2109
- const { t } = useTranslation15("os");
2110
- const doneAction = /* @__PURE__ */ React29.createElement(Action, {
2159
+ const { t } = useTranslation16("os");
2160
+ const doneAction = /* @__PURE__ */ React30.createElement(Action, {
2111
2161
  variant: "primary",
2112
2162
  onClick: onDone,
2113
2163
  disabled,
2114
2164
  "data-autofocus": `success${Kind}Invitation finishingJoining${Kind}`,
2115
2165
  "data-testid": `${Kind.toLowerCase()}-invitation-accepted-done`
2116
2166
  }, t("done label"));
2117
- return /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement("div", {
2167
+ return /* @__PURE__ */ React30.createElement(React30.Fragment, null, /* @__PURE__ */ React30.createElement("div", {
2118
2168
  role: "none",
2119
2169
  className: "grow flex flex-col justify-center"
2120
- }, /* @__PURE__ */ React29.createElement("p", {
2170
+ }, /* @__PURE__ */ React30.createElement("p", {
2121
2171
  className: "text-center text-sm font-normal"
2122
- }, t("welcome message"))), /* @__PURE__ */ React29.createElement(Actions, null, doneActionParent ? /* @__PURE__ */ cloneElement3(doneActionParent, {}, doneAction) : doneAction));
2172
+ }, t("welcome message"))), /* @__PURE__ */ React30.createElement(Actions, null, doneActionParent ? /* @__PURE__ */ cloneElement3(doneActionParent, {}, doneAction) : doneAction));
2123
2173
  };
2124
2174
 
2125
2175
  // packages/sdk/shell/src/panels/JoinPanel/steps/InvitationInput.tsx
2126
- import React30, { useState as useState5, useEffect as useEffect3, cloneElement as cloneElement4 } from "react";
2176
+ import React31, { useState as useState5, useEffect as useEffect3, cloneElement as cloneElement4 } from "react";
2127
2177
  import { log as log6 } from "@dxos/log";
2128
- import { useTranslation as useTranslation16 } from "@dxos/react-ui";
2178
+ import { useTranslation as useTranslation17 } from "@dxos/react-ui";
2129
2179
  var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/steps/InvitationInput.tsx";
2130
2180
  var invitationCodeFromUrl = (text) => {
2131
2181
  try {
@@ -2145,7 +2195,7 @@ var invitationCodeFromUrl = (text) => {
2145
2195
  var InvitationInput = (props) => {
2146
2196
  const { Kind, active, send, unredeemedCode, onExit, exitActionParent, onDone, doneActionParent, succeededKeys } = props;
2147
2197
  const disabled = !active;
2148
- const { t } = useTranslation16("os");
2198
+ const { t } = useTranslation17("os");
2149
2199
  const [inputValue, setInputValue] = useState5(unredeemedCode ?? "");
2150
2200
  useEffect3(() => {
2151
2201
  unredeemedCode && setInputValue(unredeemedCode ?? "");
@@ -2159,7 +2209,7 @@ var InvitationInput = (props) => {
2159
2209
  succeededKeys
2160
2210
  }
2161
2211
  });
2162
- const exitAction = /* @__PURE__ */ React30.createElement(Action, {
2212
+ const exitAction = /* @__PURE__ */ React31.createElement(Action, {
2163
2213
  variant: "ghost",
2164
2214
  disabled,
2165
2215
  ...onExit ? {
@@ -2169,11 +2219,11 @@ var InvitationInput = (props) => {
2169
2219
  },
2170
2220
  "data-testid": "join-exit"
2171
2221
  }, t("cancel label"));
2172
- return /* @__PURE__ */ React30.createElement(React30.Fragment, null, /* @__PURE__ */ React30.createElement("div", {
2222
+ return /* @__PURE__ */ React31.createElement(React31.Fragment, null, /* @__PURE__ */ React31.createElement("div", {
2173
2223
  role: "none",
2174
2224
  className: "grow flex flex-col justify-center"
2175
- }, /* @__PURE__ */ React30.createElement(Input, {
2176
- label: /* @__PURE__ */ React30.createElement(StepHeading, null, t("invitation input label")),
2225
+ }, /* @__PURE__ */ React31.createElement(Input, {
2226
+ label: /* @__PURE__ */ React31.createElement(StepHeading, null, t("invitation input label")),
2177
2227
  placeholder: "Type an invitation code",
2178
2228
  disabled,
2179
2229
  value: inputValue,
@@ -2181,14 +2231,14 @@ var InvitationInput = (props) => {
2181
2231
  "data-autofocus": `inputting${Kind}InvitationCode`,
2182
2232
  "data-testid": `${Kind.toLowerCase()}-invitation-input`,
2183
2233
  onKeyUp: ({ key }) => key === "Enter" && handleNext()
2184
- })), /* @__PURE__ */ React30.createElement(Actions, null, Kind === "Halo" ? /* @__PURE__ */ React30.createElement(Action, {
2234
+ })), /* @__PURE__ */ React31.createElement(Actions, null, Kind === "Halo" ? /* @__PURE__ */ React31.createElement(Action, {
2185
2235
  variant: "ghost",
2186
2236
  disabled,
2187
2237
  onClick: () => send({
2188
2238
  type: "deselectAuthMethod"
2189
2239
  }),
2190
2240
  "data-testid": `${Kind.toLowerCase()}-invitation-input-back`
2191
- }, t("back label")) : exitActionParent ? /* @__PURE__ */ cloneElement4(exitActionParent, {}, exitAction) : doneActionParent ? /* @__PURE__ */ cloneElement4(doneActionParent, {}, exitAction) : exitAction, /* @__PURE__ */ React30.createElement(Action, {
2241
+ }, t("back label")) : exitActionParent ? /* @__PURE__ */ cloneElement4(exitActionParent, {}, exitAction) : doneActionParent ? /* @__PURE__ */ cloneElement4(doneActionParent, {}, exitAction) : exitAction, /* @__PURE__ */ React31.createElement(Action, {
2192
2242
  variant: "primary",
2193
2243
  disabled,
2194
2244
  onClick: handleNext,
@@ -2197,8 +2247,8 @@ var InvitationInput = (props) => {
2197
2247
  };
2198
2248
 
2199
2249
  // packages/sdk/shell/src/panels/JoinPanel/steps/InvitationRescuer.tsx
2200
- import React31 from "react";
2201
- import { useTranslation as useTranslation17 } from "@dxos/react-ui";
2250
+ import React32 from "react";
2251
+ import { useTranslation as useTranslation18 } from "@dxos/react-ui";
2202
2252
  import { descriptionText as descriptionText9 } from "@dxos/react-ui-theme";
2203
2253
  var InvitationActions = ({
2204
2254
  // `invitationState` does report correct state, but here we evaluate whether `failReason` is a better source of truth
@@ -2210,14 +2260,14 @@ var InvitationActions = ({
2210
2260
  Kind,
2211
2261
  failReason
2212
2262
  }) => {
2213
- const { t } = useTranslation17("os");
2263
+ const { t } = useTranslation18("os");
2214
2264
  if (failReason) {
2215
- return /* @__PURE__ */ React31.createElement(React31.Fragment, null, /* @__PURE__ */ React31.createElement(StepHeading, {
2265
+ return /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement(StepHeading, {
2216
2266
  className: descriptionText9
2217
- }, t(failReason === "timeout" ? "timeout status label" : failReason === "cancelled" ? "cancelled status label" : "error status label")), /* @__PURE__ */ React31.createElement("div", {
2267
+ }, t(failReason === "timeout" ? "timeout status label" : failReason === "cancelled" ? "cancelled status label" : "error status label")), /* @__PURE__ */ React32.createElement("div", {
2218
2268
  role: "none",
2219
2269
  className: "grow"
2220
- }), /* @__PURE__ */ React31.createElement(Actions, null, /* @__PURE__ */ React31.createElement(Action, {
2270
+ }), /* @__PURE__ */ React32.createElement(Actions, null, /* @__PURE__ */ React32.createElement(Action, {
2221
2271
  disabled: !active,
2222
2272
  onClick: () => send({
2223
2273
  type: `reset${Kind}Invitation`
@@ -2225,16 +2275,16 @@ var InvitationActions = ({
2225
2275
  "data-testid": "invitation-rescuer-reset"
2226
2276
  }, t("reset label"))));
2227
2277
  } else {
2228
- return /* @__PURE__ */ React31.createElement(React31.Fragment, null, /* @__PURE__ */ React31.createElement(StepHeading, {
2278
+ return /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement(StepHeading, {
2229
2279
  className: descriptionText9
2230
- }, t("connecting status label")), /* @__PURE__ */ React31.createElement("div", {
2280
+ }, t("connecting status label")), /* @__PURE__ */ React32.createElement("div", {
2231
2281
  role: "none",
2232
2282
  className: "grow"
2233
- }), /* @__PURE__ */ React31.createElement(Actions, null, /* @__PURE__ */ React31.createElement(Action, {
2283
+ }), /* @__PURE__ */ React32.createElement(Actions, null, /* @__PURE__ */ React32.createElement(Action, {
2234
2284
  disabled: true,
2235
2285
  classNames: "order-2",
2236
2286
  "data-testid": "next"
2237
- }, t("next label")), /* @__PURE__ */ React31.createElement(Action, {
2287
+ }, t("next label")), /* @__PURE__ */ React32.createElement(Action, {
2238
2288
  disabled: !active,
2239
2289
  onClick: onInvitationCancel,
2240
2290
  "data-testid": "invitation-rescuer-cancel"
@@ -2243,28 +2293,28 @@ var InvitationActions = ({
2243
2293
  };
2244
2294
  var InvitationRescuer = (props) => {
2245
2295
  const { Kind, invitationState, active, send } = props;
2246
- const { t } = useTranslation17("os");
2247
- return /* @__PURE__ */ React31.createElement(React31.Fragment, null, typeof invitationState === "undefined" ? /* @__PURE__ */ React31.createElement(React31.Fragment, null, /* @__PURE__ */ React31.createElement("div", {
2296
+ const { t } = useTranslation18("os");
2297
+ return /* @__PURE__ */ React32.createElement(React32.Fragment, null, typeof invitationState === "undefined" ? /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", {
2248
2298
  role: "none",
2249
2299
  className: "grow flex flex-col justify-center"
2250
- }, /* @__PURE__ */ React31.createElement(StepHeading, {
2300
+ }, /* @__PURE__ */ React32.createElement(StepHeading, {
2251
2301
  className: descriptionText9
2252
- }, "There was a problem joining the space")), /* @__PURE__ */ React31.createElement(Actions, null, /* @__PURE__ */ React31.createElement(Action, {
2302
+ }, "There was a problem joining the space")), /* @__PURE__ */ React32.createElement(Actions, null, /* @__PURE__ */ React32.createElement(Action, {
2253
2303
  disabled: !active,
2254
2304
  "data-testid": "invitation-rescuer-blank-reset",
2255
2305
  onClick: () => send({
2256
2306
  type: `reset${Kind}Invitation`
2257
2307
  })
2258
- }, t("reset label")))) : /* @__PURE__ */ React31.createElement(InvitationActions, props));
2308
+ }, t("reset label")))) : /* @__PURE__ */ React32.createElement(InvitationActions, props));
2259
2309
  };
2260
2310
 
2261
2311
  // packages/sdk/shell/src/panels/JoinPanel/steps/InvitationAuthenticator.tsx
2262
- import React32, { useState as useState6 } from "react";
2263
- import { Input as Input2, useTranslation as useTranslation18 } from "@dxos/react-ui";
2312
+ import React33, { useState as useState6 } from "react";
2313
+ import { Input as Input2, useTranslation as useTranslation19 } from "@dxos/react-ui";
2264
2314
  var pinLength = 6;
2265
2315
  var InvitationAuthenticator = ({ failed, Kind, active, pending, invitationId, onInvitationAuthenticate, onInvitationCancel }) => {
2266
2316
  const disabled = !active || pending;
2267
- const { t } = useTranslation18("os");
2317
+ const { t } = useTranslation19("os");
2268
2318
  const invitationType = Kind.toLowerCase();
2269
2319
  const [authCode, setAuthCode] = useState6("");
2270
2320
  const onChange = ({ target: { value } }) => {
@@ -2273,16 +2323,16 @@ var InvitationAuthenticator = ({ failed, Kind, active, pending, invitationId, on
2273
2323
  document.querySelector(`[data-autofocus-pinlength="${invitationType}"]`)?.focus();
2274
2324
  }
2275
2325
  };
2276
- return /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", {
2326
+ return /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("div", {
2277
2327
  role: "none",
2278
2328
  className: "grow flex flex-col justify-center"
2279
- }, invitationId && /* @__PURE__ */ React32.createElement(Emoji, {
2329
+ }, invitationId && /* @__PURE__ */ React33.createElement(Emoji, {
2280
2330
  text: toEmoji(invitationId)
2281
- }), /* @__PURE__ */ React32.createElement(Input2.Root, failed && {
2331
+ }), /* @__PURE__ */ React33.createElement(Input2.Root, failed && {
2282
2332
  validationValence: "error"
2283
- }, /* @__PURE__ */ React32.createElement(Input2.Label, {
2333
+ }, /* @__PURE__ */ React33.createElement(Input2.Label, {
2284
2334
  asChild: true
2285
- }, /* @__PURE__ */ React32.createElement(StepHeading, null, t("auth code input label"))), /* @__PURE__ */ React32.createElement(Input2.PinInput, {
2335
+ }, /* @__PURE__ */ React33.createElement(StepHeading, null, t("auth code input label"))), /* @__PURE__ */ React33.createElement(Input2.PinInput, {
2286
2336
  disabled,
2287
2337
  length: pinLength,
2288
2338
  onChange,
@@ -2293,14 +2343,14 @@ var InvitationAuthenticator = ({ failed, Kind, active, pending, invitationId, on
2293
2343
  "data-prevent-ios-autofocus": true,
2294
2344
  "data-testid": `${invitationType}-auth-code-input`,
2295
2345
  "data-1p-ignore": true
2296
- }), failed && /* @__PURE__ */ React32.createElement(Input2.DescriptionAndValidation, {
2346
+ }), failed && /* @__PURE__ */ React33.createElement(Input2.DescriptionAndValidation, {
2297
2347
  classNames: "text-center"
2298
- }, /* @__PURE__ */ React32.createElement(Input2.Validation, null, t("failed to authenticate message"))))), /* @__PURE__ */ React32.createElement(Actions, null, /* @__PURE__ */ React32.createElement(Action, {
2348
+ }, /* @__PURE__ */ React33.createElement(Input2.Validation, null, t("failed to authenticate message"))))), /* @__PURE__ */ React33.createElement(Actions, null, /* @__PURE__ */ React33.createElement(Action, {
2299
2349
  variant: "ghost",
2300
2350
  disabled,
2301
2351
  onClick: () => onInvitationCancel?.(),
2302
2352
  "data-testid": `${invitationType}-invitation-authenticator-cancel`
2303
- }, t("cancel label")), /* @__PURE__ */ React32.createElement(Action, {
2353
+ }, t("cancel label")), /* @__PURE__ */ React33.createElement(Action, {
2304
2354
  variant: "primary",
2305
2355
  disabled,
2306
2356
  onClick: () => onInvitationAuthenticate?.(authCode),
@@ -2310,14 +2360,14 @@ var InvitationAuthenticator = ({ failed, Kind, active, pending, invitationId, on
2310
2360
  };
2311
2361
 
2312
2362
  // packages/sdk/shell/src/panels/JoinPanel/steps/ResetIdentity.tsx
2313
- import React33, { useState as useState7 } from "react";
2363
+ import React34, { useState as useState7 } from "react";
2314
2364
  import { log as log7 } from "@dxos/log";
2315
2365
  import { useClient as useClient5 } from "@dxos/react-client";
2316
- import { useTranslation as useTranslation19 } from "@dxos/react-ui";
2366
+ import { useTranslation as useTranslation20 } from "@dxos/react-ui";
2317
2367
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/steps/ResetIdentity.tsx";
2318
2368
  var ResetIdentity = ({ send, active }) => {
2319
2369
  const client = useClient5();
2320
- const { t } = useTranslation19("os");
2370
+ const { t } = useTranslation20("os");
2321
2371
  const [validationMessage, setValidationMessage] = useState7("");
2322
2372
  const resetIdentity = () => {
2323
2373
  void client.reset().then(() => send?.({
@@ -2332,29 +2382,29 @@ var ResetIdentity = ({ send, active }) => {
2332
2382
  setValidationMessage(t("failed to reset identity message"));
2333
2383
  });
2334
2384
  };
2335
- return /* @__PURE__ */ React33.createElement(ResetIdentityImpl, {
2385
+ return /* @__PURE__ */ React34.createElement(ResetIdentityImpl, {
2336
2386
  disabled: !active,
2337
2387
  validationMessage,
2338
2388
  onConfirm: () => resetIdentity()
2339
2389
  });
2340
2390
  };
2341
2391
  var ResetIdentityImpl = ({ disabled, validationMessage, onConfirm }) => {
2342
- const { t } = useTranslation19("os");
2392
+ const { t } = useTranslation20("os");
2343
2393
  const confirmationValue = t("confirmation value");
2344
2394
  const [inputValue, setInputValue] = useState7("");
2345
- return /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("div", {
2395
+ return /* @__PURE__ */ React34.createElement(React34.Fragment, null, /* @__PURE__ */ React34.createElement("div", {
2346
2396
  role: "none",
2347
2397
  className: "grow flex flex-col justify-center"
2348
- }, /* @__PURE__ */ React33.createElement(Input, {
2398
+ }, /* @__PURE__ */ React34.createElement(Input, {
2349
2399
  validationMessage,
2350
- label: /* @__PURE__ */ React33.createElement(StepHeading, null, t("reset identity input label", {
2400
+ label: /* @__PURE__ */ React34.createElement(StepHeading, null, t("reset identity input label", {
2351
2401
  confirmationValue
2352
2402
  })),
2353
2403
  disabled,
2354
2404
  "data-testid": "identity-input",
2355
2405
  placeholder: confirmationValue,
2356
2406
  onChange: ({ target: { value } }) => setInputValue(value)
2357
- })), /* @__PURE__ */ React33.createElement(Actions, null, /* @__PURE__ */ React33.createElement(Action, {
2407
+ })), /* @__PURE__ */ React34.createElement(Actions, null, /* @__PURE__ */ React34.createElement(Action, {
2358
2408
  // TODO(wittjosiah): Probably make this red?
2359
2409
  variant: "primary",
2360
2410
  disabled: disabled || inputValue !== confirmationValue,
@@ -2391,47 +2441,47 @@ var resolvedTextColor = (status) => status === Invitation6.State.ERROR ? errorTe
2391
2441
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/JoinPanel/JoinPanel.tsx";
2392
2442
  var JoinPanelImpl = (props) => {
2393
2443
  const { titleId, send, activeView, failed, mode, unredeemedCodes, invitationStates, succeededKeys, failReasons, onExit, onHaloDone, onSpaceDone, exitActionParent, doneActionParent, onHaloInvitationCancel, onSpaceInvitationCancel, onHaloInvitationAuthenticate, onSpaceInvitationAuthenticate, IdentityInput: IdentityInputComponent = IdentityInput, ResetIdentity: ResetIdentityComponent = ResetIdentity } = props;
2394
- return /* @__PURE__ */ React34.createElement(DensityProvider3, {
2444
+ return /* @__PURE__ */ React35.createElement(DensityProvider3, {
2395
2445
  density: "fine"
2396
- }, mode !== "halo-only" && /* @__PURE__ */ React34.createElement(JoinHeading, {
2446
+ }, mode !== "halo-only" && /* @__PURE__ */ React35.createElement(JoinHeading, {
2397
2447
  titleId,
2398
2448
  mode,
2399
2449
  onExit,
2400
2450
  exitActionParent
2401
- }), /* @__PURE__ */ React34.createElement(Viewport.Root, {
2451
+ }), /* @__PURE__ */ React35.createElement(Viewport.Root, {
2402
2452
  focusManaged: true,
2403
2453
  activeView
2404
- }, /* @__PURE__ */ React34.createElement(Viewport.Views, null, /* @__PURE__ */ React34.createElement(Viewport.View, {
2454
+ }, /* @__PURE__ */ React35.createElement(Viewport.Views, null, /* @__PURE__ */ React35.createElement(Viewport.View, {
2405
2455
  classNames: stepStyles,
2406
2456
  id: "addition method chooser"
2407
- }, /* @__PURE__ */ React34.createElement(AdditionMethodChooser, {
2457
+ }, /* @__PURE__ */ React35.createElement(AdditionMethodChooser, {
2408
2458
  send,
2409
2459
  active: activeView === "addition method chooser"
2410
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2460
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2411
2461
  classNames: stepStyles,
2412
2462
  id: "reset identity confirmation"
2413
- }, /* @__PURE__ */ React34.createElement(ResetIdentityComponent, {
2463
+ }, /* @__PURE__ */ React35.createElement(ResetIdentityComponent, {
2414
2464
  send,
2415
2465
  method: "reset identity",
2416
2466
  active: activeView === "reset identity confirmation"
2417
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2467
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2418
2468
  classNames: stepStyles,
2419
2469
  id: "create identity input"
2420
- }, /* @__PURE__ */ React34.createElement(IdentityInputComponent, {
2470
+ }, /* @__PURE__ */ React35.createElement(IdentityInputComponent, {
2421
2471
  send,
2422
2472
  method: "create identity",
2423
2473
  active: activeView === "create identity input"
2424
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2474
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2425
2475
  classNames: stepStyles,
2426
2476
  id: "recover identity input"
2427
- }, /* @__PURE__ */ React34.createElement(IdentityInputComponent, {
2477
+ }, /* @__PURE__ */ React35.createElement(IdentityInputComponent, {
2428
2478
  send,
2429
2479
  method: "recover identity",
2430
2480
  active: activeView === "recover identity input"
2431
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2481
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2432
2482
  classNames: stepStyles,
2433
2483
  id: "halo invitation input"
2434
- }, /* @__PURE__ */ React34.createElement(InvitationInput, {
2484
+ }, /* @__PURE__ */ React35.createElement(InvitationInput, {
2435
2485
  send,
2436
2486
  Kind: "Halo",
2437
2487
  active: activeView === "halo invitation input",
@@ -2441,20 +2491,20 @@ var JoinPanelImpl = (props) => {
2441
2491
  ...succeededKeys?.Halo && {
2442
2492
  succeededKeys: succeededKeys.Halo
2443
2493
  }
2444
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2494
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2445
2495
  classNames: stepStyles,
2446
2496
  id: "halo invitation rescuer"
2447
- }, /* @__PURE__ */ React34.createElement(InvitationRescuer, {
2497
+ }, /* @__PURE__ */ React35.createElement(InvitationRescuer, {
2448
2498
  send,
2449
2499
  Kind: "Halo",
2450
2500
  active: activeView === "halo invitation rescuer",
2451
2501
  invitationState: invitationStates?.Halo,
2452
2502
  onInvitationCancel: onHaloInvitationCancel,
2453
2503
  failReason: failReasons?.Halo
2454
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2504
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2455
2505
  classNames: stepStyles,
2456
2506
  id: "halo invitation authenticator"
2457
- }, /* @__PURE__ */ React34.createElement(InvitationAuthenticator, {
2507
+ }, /* @__PURE__ */ React35.createElement(InvitationAuthenticator, {
2458
2508
  send,
2459
2509
  Kind: "Halo",
2460
2510
  active: activeView === "halo invitation authenticator",
@@ -2463,28 +2513,28 @@ var JoinPanelImpl = (props) => {
2463
2513
  ...failed.has("Halo") && {
2464
2514
  failed: true
2465
2515
  }
2466
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2516
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2467
2517
  classNames: stepStyles,
2468
2518
  id: "halo invitation accepted"
2469
- }, /* @__PURE__ */ React34.createElement(InvitationAccepted, {
2519
+ }, /* @__PURE__ */ React35.createElement(InvitationAccepted, {
2470
2520
  send,
2471
2521
  Kind: "Halo",
2472
2522
  active: activeView === "halo invitation accepted",
2473
2523
  doneActionParent,
2474
2524
  onDone: onHaloDone
2475
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2525
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2476
2526
  classNames: stepStyles,
2477
2527
  id: "identity added"
2478
- }, /* @__PURE__ */ React34.createElement(IdentityAdded, {
2528
+ }, /* @__PURE__ */ React35.createElement(IdentityAdded, {
2479
2529
  send,
2480
2530
  mode,
2481
2531
  active: activeView === "identity added",
2482
2532
  doneActionParent,
2483
2533
  onDone: onHaloDone
2484
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2534
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2485
2535
  classNames: stepStyles,
2486
2536
  id: "space invitation input"
2487
- }, /* @__PURE__ */ React34.createElement(InvitationInput, {
2537
+ }, /* @__PURE__ */ React35.createElement(InvitationInput, {
2488
2538
  send,
2489
2539
  Kind: "Space",
2490
2540
  active: activeView === "space invitation input",
@@ -2496,20 +2546,20 @@ var JoinPanelImpl = (props) => {
2496
2546
  },
2497
2547
  onExit,
2498
2548
  exitActionParent
2499
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2549
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2500
2550
  classNames: stepStyles,
2501
2551
  id: "space invitation rescuer"
2502
- }, /* @__PURE__ */ React34.createElement(InvitationRescuer, {
2552
+ }, /* @__PURE__ */ React35.createElement(InvitationRescuer, {
2503
2553
  send,
2504
2554
  Kind: "Space",
2505
2555
  active: activeView === "space invitation rescuer",
2506
2556
  invitationState: invitationStates?.Space,
2507
2557
  onInvitationCancel: onSpaceInvitationCancel,
2508
2558
  failReason: failReasons?.Space
2509
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2559
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2510
2560
  classNames: stepStyles,
2511
2561
  id: "space invitation authenticator"
2512
- }, /* @__PURE__ */ React34.createElement(InvitationAuthenticator, {
2562
+ }, /* @__PURE__ */ React35.createElement(InvitationAuthenticator, {
2513
2563
  send,
2514
2564
  Kind: "Space",
2515
2565
  active: activeView === "space invitation authenticator",
@@ -2518,10 +2568,10 @@ var JoinPanelImpl = (props) => {
2518
2568
  ...failed.has("Space") && {
2519
2569
  failed: true
2520
2570
  }
2521
- })), /* @__PURE__ */ React34.createElement(Viewport.View, {
2571
+ })), /* @__PURE__ */ React35.createElement(Viewport.View, {
2522
2572
  classNames: stepStyles,
2523
2573
  id: "space invitation accepted"
2524
- }, /* @__PURE__ */ React34.createElement(InvitationAccepted, {
2574
+ }, /* @__PURE__ */ React35.createElement(InvitationAccepted, {
2525
2575
  send,
2526
2576
  Kind: "Space",
2527
2577
  active: activeView === "space invitation accepted",
@@ -2760,7 +2810,7 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2760
2810
  joinState,
2761
2811
  propsOnDone
2762
2812
  ]);
2763
- return /* @__PURE__ */ React34.createElement(JoinPanelImpl, {
2813
+ return /* @__PURE__ */ React35.createElement(JoinPanelImpl, {
2764
2814
  titleId,
2765
2815
  mode,
2766
2816
  send: joinSend,
@@ -2799,10 +2849,10 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2799
2849
 
2800
2850
  // packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx
2801
2851
  import { Planet } from "@phosphor-icons/react";
2802
- import React36, { useEffect as useEffect5, useMemo as useMemo5 } from "react";
2852
+ import React37, { useEffect as useEffect5, useMemo as useMemo5 } from "react";
2803
2853
  import { log as log10 } from "@dxos/log";
2804
2854
  import { useInvitationStatus as useInvitationStatus3 } from "@dxos/react-client/invitations";
2805
- import { DensityProvider as DensityProvider4, useId as useId8, useTranslation as useTranslation21 } from "@dxos/react-ui";
2855
+ import { DensityProvider as DensityProvider4, useId as useId8, useTranslation as useTranslation22 } from "@dxos/react-ui";
2806
2856
 
2807
2857
  // packages/sdk/shell/src/panels/SpacePanel/spaceMachine.ts
2808
2858
  import { useMachine as useMachine3 } from "@xstate/react";
@@ -2868,16 +2918,16 @@ var useSpaceMachine = (options) => {
2868
2918
 
2869
2919
  // packages/sdk/shell/src/panels/SpacePanel/steps/SpaceManager.tsx
2870
2920
  import { Placeholder as Placeholder2, UserPlus, UsersThree } from "@phosphor-icons/react";
2871
- import React35, { useCallback as useCallback7, useState as useState8 } from "react";
2921
+ import React36, { useCallback as useCallback7, useState as useState8 } from "react";
2872
2922
  import { useConfig } from "@dxos/react-client";
2873
2923
  import { useSpaceInvitations as useSpaceInvitations2 } from "@dxos/react-client/echo";
2874
2924
  import { Invitation as Invitation7, InvitationEncoder as InvitationEncoder3 } from "@dxos/react-client/invitations";
2875
- import { ScrollArea, useTranslation as useTranslation20 } from "@dxos/react-ui";
2925
+ import { ScrollArea, useTranslation as useTranslation21 } from "@dxos/react-ui";
2876
2926
  import { descriptionText as descriptionText10, mx as mx21 } from "@dxos/react-ui-theme";
2877
2927
  var activeActionKey = "dxos:react-shell/space-manager/active-action";
2878
2928
  var SpaceManager = (props) => {
2879
2929
  const { space } = props;
2880
- const { t } = useTranslation20("os");
2930
+ const { t } = useTranslation21("os");
2881
2931
  const config = useConfig();
2882
2932
  const invitations = useSpaceInvitations2(space?.key);
2883
2933
  const onInvitationEvent = useCallback7((invitation) => {
@@ -2923,7 +2973,7 @@ var SpaceManager = (props) => {
2923
2973
  ])
2924
2974
  }
2925
2975
  };
2926
- return /* @__PURE__ */ React35.createElement(SpaceManagerImpl, {
2976
+ return /* @__PURE__ */ React36.createElement(SpaceManagerImpl, {
2927
2977
  ...props,
2928
2978
  invitations,
2929
2979
  inviteActions
@@ -2932,7 +2982,7 @@ var SpaceManager = (props) => {
2932
2982
  var headingFragment = "pis-3 pie-1 plb-1 mbe-1 font-medium";
2933
2983
  var SpaceManagerImpl = (props) => {
2934
2984
  const { active, space, createInvitationUrl, send, inviteActions: propsInviteActions, invitations, showInactiveInvitations, SpaceMemberList: SpaceMemberListComponent = SpaceMemberList, InvitationList: InvitationListComponent = InvitationList } = props;
2935
- const { t } = useTranslation20("os");
2985
+ const { t } = useTranslation21("os");
2936
2986
  const inviteActions = propsInviteActions ?? {
2937
2987
  noopInvite: {
2938
2988
  label: t("create space invitation label"),
@@ -2950,26 +3000,26 @@ var SpaceManagerImpl = (props) => {
2950
3000
  const visibleInvitations = showInactiveInvitations ? invitations : invitations?.filter((invitation) => ![
2951
3001
  Invitation7.State.CANCELLED
2952
3002
  ].includes(invitation.get().state));
2953
- return /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement(ScrollArea.Root, {
3003
+ return /* @__PURE__ */ React36.createElement(React36.Fragment, null, /* @__PURE__ */ React36.createElement(ScrollArea.Root, {
2954
3004
  classNames: "grow shrink basis-28 -mli-2"
2955
- }, /* @__PURE__ */ React35.createElement(ScrollArea.Viewport, {
3005
+ }, /* @__PURE__ */ React36.createElement(ScrollArea.Viewport, {
2956
3006
  classNames: "is-full pie-2"
2957
- }, !!visibleInvitations?.length && /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement("h3", {
3007
+ }, !!visibleInvitations?.length && /* @__PURE__ */ React36.createElement(React36.Fragment, null, /* @__PURE__ */ React36.createElement("h3", {
2958
3008
  className: mx21(headingFragment, descriptionText10)
2959
- }, t("invitation list heading")), /* @__PURE__ */ React35.createElement(InvitationListComponent, {
3009
+ }, t("invitation list heading")), /* @__PURE__ */ React36.createElement(InvitationListComponent, {
2960
3010
  className: "mb-2",
2961
3011
  send,
2962
3012
  invitations: visibleInvitations ?? [],
2963
3013
  onClickRemove: (invitation) => invitation.cancel(),
2964
3014
  createInvitationUrl
2965
- }), /* @__PURE__ */ React35.createElement("h3", {
3015
+ }), /* @__PURE__ */ React36.createElement("h3", {
2966
3016
  className: mx21(headingFragment, descriptionText10, "mbs-2")
2967
- }, t("space member list heading"))), /* @__PURE__ */ React35.createElement(SpaceMemberListComponent, {
3017
+ }, t("space member list heading"))), /* @__PURE__ */ React36.createElement(SpaceMemberListComponent, {
2968
3018
  spaceKey: space.key,
2969
3019
  includeSelf: true
2970
- })), /* @__PURE__ */ React35.createElement(ScrollArea.Scrollbar, {
3020
+ })), /* @__PURE__ */ React36.createElement(ScrollArea.Scrollbar, {
2971
3021
  orientation: "vertical"
2972
- }, /* @__PURE__ */ React35.createElement(ScrollArea.Thumb, null))), /* @__PURE__ */ React35.createElement(Actions, null, /* @__PURE__ */ React35.createElement(BifurcatedAction, {
3022
+ }, /* @__PURE__ */ React36.createElement(ScrollArea.Thumb, null))), /* @__PURE__ */ React36.createElement(Actions, null, /* @__PURE__ */ React36.createElement(BifurcatedAction, {
2973
3023
  disabled: !active,
2974
3024
  actions: inviteActions,
2975
3025
  activeAction,
@@ -2981,45 +3031,45 @@ var SpaceManagerImpl = (props) => {
2981
3031
  // packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx
2982
3032
  var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx";
2983
3033
  var SpacePanelHeading = ({ titleId, space, onDone }) => {
2984
- const { t } = useTranslation21("os");
3034
+ const { t } = useTranslation22("os");
2985
3035
  const name = space.properties.name;
2986
- return /* @__PURE__ */ React36.createElement(Heading, {
3036
+ return /* @__PURE__ */ React37.createElement(Heading, {
2987
3037
  titleId,
2988
3038
  title: t("space panel heading"),
2989
- corner: /* @__PURE__ */ React36.createElement(CloseButton, {
3039
+ corner: /* @__PURE__ */ React37.createElement(CloseButton, {
2990
3040
  "data-testid": "identity-panel-done",
2991
3041
  onDone
2992
3042
  })
2993
- }, /* @__PURE__ */ React36.createElement("div", {
3043
+ }, /* @__PURE__ */ React37.createElement("div", {
2994
3044
  role: "none",
2995
3045
  className: "flex gap-4 items-center justify-center mlb-4"
2996
- }, /* @__PURE__ */ React36.createElement(Planet, {
3046
+ }, /* @__PURE__ */ React37.createElement(Planet, {
2997
3047
  size: 32
2998
- }), /* @__PURE__ */ React36.createElement("div", {
3048
+ }), /* @__PURE__ */ React37.createElement("div", {
2999
3049
  className: "block text-start font-light text-xl"
3000
3050
  }, name ?? space.key.truncate())));
3001
3051
  };
3002
3052
  var SpacePanelImpl = (props) => {
3003
3053
  const { titleId, activeView, space, SpaceManager: SpaceManagerComponent = SpaceManager, InvitationManager: InvitationManagerComponent = InvitationManager, ...rest } = props;
3004
- return /* @__PURE__ */ React36.createElement(DensityProvider4, {
3054
+ return /* @__PURE__ */ React37.createElement(DensityProvider4, {
3005
3055
  density: "fine"
3006
- }, /* @__PURE__ */ React36.createElement(SpacePanelHeading, {
3056
+ }, /* @__PURE__ */ React37.createElement(SpacePanelHeading, {
3007
3057
  ...rest,
3008
3058
  titleId,
3009
3059
  space
3010
- }), /* @__PURE__ */ React36.createElement(Viewport.Root, {
3060
+ }), /* @__PURE__ */ React37.createElement(Viewport.Root, {
3011
3061
  activeView
3012
- }, /* @__PURE__ */ React36.createElement(Viewport.Views, null, /* @__PURE__ */ React36.createElement(Viewport.View, {
3062
+ }, /* @__PURE__ */ React37.createElement(Viewport.Views, null, /* @__PURE__ */ React37.createElement(Viewport.View, {
3013
3063
  id: "space manager",
3014
3064
  classNames: stepStyles
3015
- }, /* @__PURE__ */ React36.createElement(SpaceManagerComponent, {
3065
+ }, /* @__PURE__ */ React37.createElement(SpaceManagerComponent, {
3016
3066
  active: activeView === "space manager",
3017
3067
  space,
3018
3068
  ...rest
3019
- })), /* @__PURE__ */ React36.createElement(Viewport.View, {
3069
+ })), /* @__PURE__ */ React37.createElement(Viewport.View, {
3020
3070
  id: "space invitation manager",
3021
3071
  classNames: stepStyles
3022
- }, /* @__PURE__ */ React36.createElement(InvitationManagerComponent, {
3072
+ }, /* @__PURE__ */ React37.createElement(InvitationManagerComponent, {
3023
3073
  active: activeView === "space invitation manager",
3024
3074
  ...rest,
3025
3075
  invitationUrl: props.invitationUrl
@@ -3027,7 +3077,7 @@ var SpacePanelImpl = (props) => {
3027
3077
  };
3028
3078
  var SpacePanelWithInvitationImpl = ({ invitation, ...props }) => {
3029
3079
  const invitationStatus = useInvitationStatus3(invitation);
3030
- return /* @__PURE__ */ React36.createElement(SpacePanelImpl, {
3080
+ return /* @__PURE__ */ React37.createElement(SpacePanelImpl, {
3031
3081
  ...props,
3032
3082
  ...invitationStatus,
3033
3083
  invitationUrl: props.createInvitationUrl(invitationStatus.invitationCode)
@@ -3072,62 +3122,62 @@ var SpacePanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => code,
3072
3122
  titleId,
3073
3123
  createInvitationUrl
3074
3124
  };
3075
- return spaceState.context.invitation ? /* @__PURE__ */ React36.createElement(SpacePanelWithInvitationImpl, {
3125
+ return spaceState.context.invitation ? /* @__PURE__ */ React37.createElement(SpacePanelWithInvitationImpl, {
3076
3126
  ...implProps,
3077
3127
  invitation: spaceState.context.invitation
3078
- }) : /* @__PURE__ */ React36.createElement(SpacePanelImpl, implProps);
3128
+ }) : /* @__PURE__ */ React37.createElement(SpacePanelImpl, implProps);
3079
3129
  };
3080
3130
 
3081
3131
  // packages/sdk/shell/src/composites/IdentityDialog/IdentityDialog.tsx
3082
3132
  var IdentityDialog = (props) => {
3083
3133
  const titleId = useId9("spaceDialog__title");
3084
- return /* @__PURE__ */ React37.createElement(Dialog.Root, {
3134
+ return /* @__PURE__ */ React38.createElement(Dialog.Root, {
3085
3135
  defaultOpen: true,
3086
3136
  onOpenChange: (open) => open || props.onDone?.()
3087
- }, /* @__PURE__ */ React37.createElement(Dialog.Portal, null, /* @__PURE__ */ React37.createElement(Dialog.Overlay, null, /* @__PURE__ */ React37.createElement(Dialog.Content, {
3137
+ }, /* @__PURE__ */ React38.createElement(Dialog.Portal, null, /* @__PURE__ */ React38.createElement(Dialog.Overlay, null, /* @__PURE__ */ React38.createElement(Dialog.Content, {
3088
3138
  "aria-labelledby": titleId,
3089
3139
  onOpenAutoFocus: (e) => e.preventDefault()
3090
- }, /* @__PURE__ */ React37.createElement(ClipboardProvider, null, /* @__PURE__ */ React37.createElement(IdentityPanel, {
3140
+ }, /* @__PURE__ */ React38.createElement(ClipboardProvider, null, /* @__PURE__ */ React38.createElement(IdentityPanel, {
3091
3141
  ...props,
3092
3142
  titleId,
3093
- doneActionParent: /* @__PURE__ */ React37.createElement(Dialog.Close, {
3143
+ doneActionParent: /* @__PURE__ */ React38.createElement(Dialog.Close, {
3094
3144
  asChild: true
3095
3145
  })
3096
3146
  }))))));
3097
3147
  };
3098
3148
 
3099
3149
  // packages/sdk/shell/src/composites/JoinDialog/JoinDialog.tsx
3100
- import React38 from "react";
3150
+ import React39 from "react";
3101
3151
  import { AlertDialog, useId as useId10, useVisualViewport } from "@dxos/react-ui";
3102
3152
  var JoinDialog = (joinPanelProps) => {
3103
3153
  const titleId = useId10("joinDialog__title");
3104
3154
  const { height } = useVisualViewport();
3105
- return /* @__PURE__ */ React38.createElement(AlertDialog.Root, {
3155
+ return /* @__PURE__ */ React39.createElement(AlertDialog.Root, {
3106
3156
  defaultOpen: true,
3107
3157
  onOpenChange: (open) => open || (joinPanelProps.onExit ? joinPanelProps.onExit() : joinPanelProps.onDone?.(null))
3108
- }, /* @__PURE__ */ React38.createElement(AlertDialog.Portal, null, /* @__PURE__ */ React38.createElement(AlertDialog.Overlay, {
3158
+ }, /* @__PURE__ */ React39.createElement(AlertDialog.Portal, null, /* @__PURE__ */ React39.createElement(AlertDialog.Overlay, {
3109
3159
  classNames: "backdrop-blur",
3110
3160
  ...height && {
3111
3161
  style: {
3112
3162
  blockSize: `${height}px`
3113
3163
  }
3114
3164
  }
3115
- }, /* @__PURE__ */ React38.createElement(AlertDialog.Content, {
3165
+ }, /* @__PURE__ */ React39.createElement(AlertDialog.Content, {
3116
3166
  "aria-labelledby": titleId
3117
- }, /* @__PURE__ */ React38.createElement(JoinPanel, {
3167
+ }, /* @__PURE__ */ React39.createElement(JoinPanel, {
3118
3168
  ...joinPanelProps,
3119
3169
  titleId,
3120
- exitActionParent: /* @__PURE__ */ React38.createElement(AlertDialog.Cancel, {
3170
+ exitActionParent: /* @__PURE__ */ React39.createElement(AlertDialog.Cancel, {
3121
3171
  asChild: true
3122
3172
  }),
3123
- doneActionParent: /* @__PURE__ */ React38.createElement(AlertDialog.Action, {
3173
+ doneActionParent: /* @__PURE__ */ React39.createElement(AlertDialog.Action, {
3124
3174
  asChild: true
3125
3175
  })
3126
3176
  })))));
3127
3177
  };
3128
3178
 
3129
3179
  // packages/sdk/shell/src/composites/Shell/run-shell.tsx
3130
- import React41, { StrictMode } from "react";
3180
+ import React42, { StrictMode } from "react";
3131
3181
  import { createRoot } from "react-dom/client";
3132
3182
  import { DEFAULT_CLIENT_CHANNEL, DEFAULT_SHELL_CHANNEL } from "@dxos/client-protocol";
3133
3183
  import { ShellRuntimeImpl } from "@dxos/client-services";
@@ -3137,25 +3187,25 @@ import { defaultTx } from "@dxos/react-ui-theme";
3137
3187
  import { createIFramePort } from "@dxos/rpc-tunnel";
3138
3188
 
3139
3189
  // packages/sdk/shell/src/composites/Shell/Shell.tsx
3140
- import React40, { useEffect as useEffect6, useState as useState9 } from "react";
3190
+ import React41, { useEffect as useEffect6, useState as useState9 } from "react";
3141
3191
  import { log as log11 } from "@dxos/log";
3142
3192
  import { ShellDisplay, ShellLayout } from "@dxos/react-client";
3143
3193
  import { useSpace as useSpace2 } from "@dxos/react-client/echo";
3144
3194
 
3145
3195
  // packages/sdk/shell/src/composites/SpaceDialog/SpaceDialog.tsx
3146
- import React39 from "react";
3196
+ import React40 from "react";
3147
3197
  import { Dialog as Dialog2, useId as useId11 } from "@dxos/react-ui";
3148
3198
  var SpaceDialog = (spacePanelProps) => {
3149
3199
  const titleId = useId11("spaceDialog__title");
3150
- return /* @__PURE__ */ React39.createElement(Dialog2.Root, {
3200
+ return /* @__PURE__ */ React40.createElement(Dialog2.Root, {
3151
3201
  defaultOpen: true,
3152
3202
  onOpenChange: (open) => open || spacePanelProps.onDone?.()
3153
- }, /* @__PURE__ */ React39.createElement(Dialog2.Portal, null, /* @__PURE__ */ React39.createElement(Dialog2.Overlay, null, /* @__PURE__ */ React39.createElement(Dialog2.Content, {
3203
+ }, /* @__PURE__ */ React40.createElement(Dialog2.Portal, null, /* @__PURE__ */ React40.createElement(Dialog2.Overlay, null, /* @__PURE__ */ React40.createElement(Dialog2.Content, {
3154
3204
  "aria-labelledby": titleId
3155
- }, /* @__PURE__ */ React39.createElement(ClipboardProvider, null, /* @__PURE__ */ React39.createElement(SpacePanel, {
3205
+ }, /* @__PURE__ */ React40.createElement(ClipboardProvider, null, /* @__PURE__ */ React40.createElement(SpacePanel, {
3156
3206
  ...spacePanelProps,
3157
3207
  titleId,
3158
- doneActionParent: /* @__PURE__ */ React39.createElement(Dialog2.Close, {
3208
+ doneActionParent: /* @__PURE__ */ React40.createElement(Dialog2.Close, {
3159
3209
  asChild: true
3160
3210
  })
3161
3211
  }))))));
@@ -3200,7 +3250,7 @@ var Shell = ({ runtime, origin }) => {
3200
3250
  ]);
3201
3251
  switch (layout) {
3202
3252
  case ShellLayout.INITIALIZE_IDENTITY:
3203
- return /* @__PURE__ */ React40.createElement(JoinDialog, {
3253
+ return /* @__PURE__ */ React41.createElement(JoinDialog, {
3204
3254
  mode: "halo-only",
3205
3255
  initialInvitationCode: invitationCode,
3206
3256
  onDone: () => {
@@ -3215,7 +3265,7 @@ var Shell = ({ runtime, origin }) => {
3215
3265
  case ShellLayout.IDENTITY:
3216
3266
  case ShellLayout.SHARE_IDENTITY:
3217
3267
  case ShellLayout.EDIT_PROFILE:
3218
- return /* @__PURE__ */ React40.createElement(IdentityDialog, {
3268
+ return /* @__PURE__ */ React41.createElement(IdentityDialog, {
3219
3269
  createInvitationUrl: (invitationCode2) => `${origin}?deviceInvitationCode=${invitationCode2}`,
3220
3270
  onDone: async () => {
3221
3271
  await runtime.setAppContext({
@@ -3227,7 +3277,7 @@ var Shell = ({ runtime, origin }) => {
3227
3277
  }
3228
3278
  });
3229
3279
  case ShellLayout.SPACE:
3230
- return space ? /* @__PURE__ */ React40.createElement(SpaceDialog, {
3280
+ return space ? /* @__PURE__ */ React41.createElement(SpaceDialog, {
3231
3281
  space,
3232
3282
  createInvitationUrl: (invitationCode2) => `${origin}?spaceInvitationCode=${invitationCode2}`,
3233
3283
  onDone: async () => {
@@ -3240,7 +3290,7 @@ var Shell = ({ runtime, origin }) => {
3240
3290
  }
3241
3291
  }) : null;
3242
3292
  case ShellLayout.JOIN_SPACE:
3243
- return /* @__PURE__ */ React40.createElement(JoinDialog, {
3293
+ return /* @__PURE__ */ React41.createElement(JoinDialog, {
3244
3294
  initialInvitationCode: invitationCode,
3245
3295
  onDone: async (result) => {
3246
3296
  await runtime.setAppContext({
@@ -3337,7 +3387,8 @@ var os = {
3337
3387
  "selecting identity heading": "Selecting identity",
3338
3388
  "devices heading": "Devices",
3339
3389
  "identity heading": "Profile settings",
3340
- "choose devices label": "Add device",
3390
+ "choose add device label": "Add device",
3391
+ "choose devices label": "Manage devices",
3341
3392
  "choose profile label": "Edit profile",
3342
3393
  "choose sign out label": "Sign out",
3343
3394
  "empty space members message": "There is nobody in this space yet.",
@@ -3388,24 +3439,24 @@ var runShell = async (config = new Config()) => {
3388
3439
  runtime.open(),
3389
3440
  client.initialize()
3390
3441
  ]);
3391
- createRoot(document.getElementById("root")).render(/* @__PURE__ */ React41.createElement(StrictMode, null, /* @__PURE__ */ React41.createElement(ThemeProvider, {
3442
+ createRoot(document.getElementById("root")).render(/* @__PURE__ */ React42.createElement(StrictMode, null, /* @__PURE__ */ React42.createElement(ThemeProvider, {
3392
3443
  tx: defaultTx,
3393
3444
  resourceExtensions: [
3394
3445
  osTranslations
3395
3446
  ]
3396
- }, /* @__PURE__ */ React41.createElement(ClientContext.Provider, {
3447
+ }, /* @__PURE__ */ React42.createElement(ClientContext.Provider, {
3397
3448
  value: {
3398
3449
  client,
3399
3450
  status: SystemStatus.ACTIVE
3400
3451
  }
3401
- }, /* @__PURE__ */ React41.createElement(ClipboardProvider, null, /* @__PURE__ */ React41.createElement(Tooltip3.Provider, null, /* @__PURE__ */ React41.createElement(Shell, {
3452
+ }, /* @__PURE__ */ React42.createElement(ClipboardProvider, null, /* @__PURE__ */ React42.createElement(Tooltip3.Provider, null, /* @__PURE__ */ React42.createElement(Shell, {
3402
3453
  runtime,
3403
3454
  origin: location.origin
3404
3455
  })))))));
3405
3456
  };
3406
3457
 
3407
3458
  // packages/sdk/shell/src/composites/Shell/ShellContext.tsx
3408
- import React42, { createContext as createContext2, useCallback as useCallback8, useContext as useContext2, useEffect as useEffect7, useMemo as useMemo6, useState as useState10 } from "react";
3459
+ import React43, { createContext as createContext2, useCallback as useCallback8, useContext as useContext2, useEffect as useEffect7, useMemo as useMemo6, useState as useState10 } from "react";
3409
3460
  import { ShellDisplay as ShellDisplay2, ShellLayout as ShellLayout3, useClient as useClient7 } from "@dxos/react-client";
3410
3461
  import { useIdentity as useIdentity3 } from "@dxos/react-client/halo";
3411
3462
  import { mx as mx22 } from "@dxos/react-ui-theme";
@@ -3537,12 +3588,12 @@ var ShellProvider = ({ space, deviceInvitationCode, spaceInvitationCode, onJoine
3537
3588
  }, [
3538
3589
  shellRuntime
3539
3590
  ]);
3540
- return /* @__PURE__ */ React42.createElement(React42.Fragment, null, shellRuntime && /* @__PURE__ */ React42.createElement("div", {
3591
+ return /* @__PURE__ */ React43.createElement(React43.Fragment, null, shellRuntime && /* @__PURE__ */ React43.createElement("div", {
3541
3592
  className: mx22(display === ShellDisplay2.NONE ? "hidden" : "")
3542
- }, /* @__PURE__ */ React42.createElement(Shell, {
3593
+ }, /* @__PURE__ */ React43.createElement(Shell, {
3543
3594
  runtime: shellRuntime,
3544
3595
  origin: window.location.origin
3545
- })), /* @__PURE__ */ React42.createElement(ShellContext.Provider, {
3596
+ })), /* @__PURE__ */ React43.createElement(ShellContext.Provider, {
3546
3597
  value: {
3547
3598
  runtime: shellRuntime,
3548
3599
  setDisplay