@dxos/shell 0.3.11-main.2e39ec4 → 0.3.11-main.338d9a5

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 (79) hide show
  1. package/dist/bundle/shell.mjs +36433 -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 +344 -282
  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/composites/Shell/Shell.d.ts.map +1 -1
  13. package/dist/types/src/composites/Shell/Shell.js +10 -4
  14. package/dist/types/src/composites/Shell/Shell.js.map +1 -1
  15. package/dist/types/src/panels/IdentityPanel/IdentityPanel.d.ts.map +1 -1
  16. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js +10 -1
  17. package/dist/types/src/panels/IdentityPanel/IdentityPanel.js.map +1 -1
  18. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts +6 -0
  19. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.d.ts.map +1 -1
  20. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js +26 -3
  21. package/dist/types/src/panels/IdentityPanel/IdentityPanel.stories.js.map +1 -1
  22. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts +7 -6
  23. package/dist/types/src/panels/IdentityPanel/IdentityPanelProps.d.ts.map +1 -1
  24. package/dist/types/src/panels/IdentityPanel/identityMachine.d.ts.map +1 -1
  25. package/dist/types/src/panels/IdentityPanel/identityMachine.js +2 -1
  26. package/dist/types/src/panels/IdentityPanel/identityMachine.js.map +1 -1
  27. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts +10 -0
  28. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.d.ts.map +1 -0
  29. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js +23 -0
  30. package/dist/types/src/panels/IdentityPanel/steps/DeviceManager.js.map +1 -0
  31. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.d.ts.map +1 -1
  32. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js +4 -0
  33. package/dist/types/src/panels/IdentityPanel/steps/IdentityActionChooser.js.map +1 -1
  34. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts +0 -1
  35. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.d.ts.map +1 -1
  36. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js +2 -3
  37. package/dist/types/src/panels/IdentityPanel/steps/ProfileForm.js.map +1 -1
  38. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts +1 -0
  39. package/dist/types/src/panels/IdentityPanel/steps/index.d.ts.map +1 -1
  40. package/dist/types/src/panels/IdentityPanel/steps/index.js +1 -0
  41. package/dist/types/src/panels/IdentityPanel/steps/index.js.map +1 -1
  42. package/dist/types/src/panels/JoinPanel/JoinPanel.js +4 -3
  43. package/dist/types/src/panels/JoinPanel/JoinPanel.js.map +1 -1
  44. package/dist/types/src/panels/JoinPanel/joinMachine.js +1 -1
  45. package/dist/types/src/panels/JoinPanel/joinMachine.js.map +1 -1
  46. package/dist/types/src/panels/SpacePanel/SpacePanel.d.ts.map +1 -1
  47. package/dist/types/src/panels/SpacePanel/SpacePanel.js +5 -3
  48. package/dist/types/src/panels/SpacePanel/SpacePanel.js.map +1 -1
  49. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.d.ts.map +1 -1
  50. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js +2 -2
  51. package/dist/types/src/panels/SpacePanel/SpacePanel.stories.js.map +1 -1
  52. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts +1 -0
  53. package/dist/types/src/panels/SpacePanel/SpacePanelProps.d.ts.map +1 -1
  54. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts +1 -0
  55. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
  56. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +3 -1
  57. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
  58. package/dist/types/src/translations/locales/en-US.d.ts +1 -0
  59. package/dist/types/src/translations/locales/en-US.d.ts.map +1 -1
  60. package/dist/types/src/translations/locales/en-US.js +2 -1
  61. package/dist/types/src/translations/locales/en-US.js.map +1 -1
  62. package/package.json +17 -17
  63. package/src/components/IdentityList/DeviceList.tsx +7 -5
  64. package/src/composites/Shell/Shell.tsx +9 -2
  65. package/src/panels/IdentityPanel/IdentityPanel.stories.tsx +44 -2
  66. package/src/panels/IdentityPanel/IdentityPanel.tsx +14 -3
  67. package/src/panels/IdentityPanel/IdentityPanelProps.ts +7 -6
  68. package/src/panels/IdentityPanel/identityMachine.ts +2 -1
  69. package/src/panels/IdentityPanel/steps/DeviceManager.tsx +41 -0
  70. package/src/panels/IdentityPanel/steps/IdentityActionChooser.tsx +6 -1
  71. package/src/panels/IdentityPanel/steps/ProfileForm.tsx +1 -1
  72. package/src/panels/IdentityPanel/steps/index.ts +1 -0
  73. package/src/panels/JoinPanel/JoinPanel.tsx +2 -2
  74. package/src/panels/JoinPanel/joinMachine.ts +1 -1
  75. package/src/panels/SpacePanel/SpacePanel.stories.tsx +2 -1
  76. package/src/panels/SpacePanel/SpacePanel.tsx +4 -1
  77. package/src/panels/SpacePanel/SpacePanelProps.ts +1 -0
  78. package/src/panels/SpacePanel/steps/SpaceManager.tsx +4 -1
  79. 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"),
@@ -1801,7 +1851,7 @@ var joinMachine = createMachine2({
1801
1851
  } : context.space
1802
1852
  }),
1803
1853
  log: (context, event) => {
1804
- log4.info("[transition]", {
1854
+ log4("[transition]", {
1805
1855
  event,
1806
1856
  haloInvitation: context.halo.invitation,
1807
1857
  spaceInvitation: context.space.invitation
@@ -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",
@@ -2545,12 +2595,11 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2545
2595
  }
2546
2596
  }
2547
2597
  });
2548
- console.log("[joinState]", joinState);
2549
2598
  useEffect4(() => {
2550
2599
  const subscription = joinService.subscribe((state) => {
2551
2600
  log8("[state]", state, {
2552
2601
  F: __dxlog_file8,
2553
- L: 200,
2602
+ L: 198,
2554
2603
  S: void 0,
2555
2604
  C: (f, a) => f(...a)
2556
2605
  });
@@ -2744,7 +2793,8 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2744
2793
  propsOnDone?.({
2745
2794
  identityKey: joinState.context.halo.invitation?.identityKey ?? null,
2746
2795
  swarmKey: joinState.context.halo.invitation?.swarmKey ?? null,
2747
- spaceKey: joinState.context.halo.invitation?.spaceKey ?? null
2796
+ spaceKey: joinState.context.halo.invitation?.spaceKey ?? null,
2797
+ target: joinState.context.halo.invitation?.target ?? null
2748
2798
  });
2749
2799
  }, [
2750
2800
  joinState,
@@ -2754,13 +2804,14 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2754
2804
  propsOnDone?.({
2755
2805
  identityKey: joinState.context.space.invitation?.identityKey ?? null,
2756
2806
  swarmKey: joinState.context.space.invitation?.swarmKey ?? null,
2757
- spaceKey: joinState.context.space.invitation?.spaceKey ?? null
2807
+ spaceKey: joinState.context.space.invitation?.spaceKey ?? null,
2808
+ target: joinState.context.space.invitation?.target ?? null
2758
2809
  });
2759
2810
  }, [
2760
2811
  joinState,
2761
2812
  propsOnDone
2762
2813
  ]);
2763
- return /* @__PURE__ */ React34.createElement(JoinPanelImpl, {
2814
+ return /* @__PURE__ */ React35.createElement(JoinPanelImpl, {
2764
2815
  titleId,
2765
2816
  mode,
2766
2817
  send: joinSend,
@@ -2799,10 +2850,10 @@ var JoinPanel = ({ titleId: propsTitleId, mode = "default", initialInvitationCod
2799
2850
 
2800
2851
  // packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx
2801
2852
  import { Planet } from "@phosphor-icons/react";
2802
- import React36, { useEffect as useEffect5, useMemo as useMemo5 } from "react";
2853
+ import React37, { useEffect as useEffect5, useMemo as useMemo5 } from "react";
2803
2854
  import { log as log10 } from "@dxos/log";
2804
2855
  import { useInvitationStatus as useInvitationStatus3 } from "@dxos/react-client/invitations";
2805
- import { DensityProvider as DensityProvider4, useId as useId8, useTranslation as useTranslation21 } from "@dxos/react-ui";
2856
+ import { DensityProvider as DensityProvider4, useId as useId8, useTranslation as useTranslation22 } from "@dxos/react-ui";
2806
2857
 
2807
2858
  // packages/sdk/shell/src/panels/SpacePanel/spaceMachine.ts
2808
2859
  import { useMachine as useMachine3 } from "@xstate/react";
@@ -2868,16 +2919,16 @@ var useSpaceMachine = (options) => {
2868
2919
 
2869
2920
  // packages/sdk/shell/src/panels/SpacePanel/steps/SpaceManager.tsx
2870
2921
  import { Placeholder as Placeholder2, UserPlus, UsersThree } from "@phosphor-icons/react";
2871
- import React35, { useCallback as useCallback7, useState as useState8 } from "react";
2922
+ import React36, { useCallback as useCallback7, useState as useState8 } from "react";
2872
2923
  import { useConfig } from "@dxos/react-client";
2873
2924
  import { useSpaceInvitations as useSpaceInvitations2 } from "@dxos/react-client/echo";
2874
2925
  import { Invitation as Invitation7, InvitationEncoder as InvitationEncoder3 } from "@dxos/react-client/invitations";
2875
- import { ScrollArea, useTranslation as useTranslation20 } from "@dxos/react-ui";
2926
+ import { ScrollArea, useTranslation as useTranslation21 } from "@dxos/react-ui";
2876
2927
  import { descriptionText as descriptionText10, mx as mx21 } from "@dxos/react-ui-theme";
2877
2928
  var activeActionKey = "dxos:react-shell/space-manager/active-action";
2878
2929
  var SpaceManager = (props) => {
2879
- const { space } = props;
2880
- const { t } = useTranslation20("os");
2930
+ const { space, target } = props;
2931
+ const { t } = useTranslation21("os");
2881
2932
  const config = useConfig();
2882
2933
  const invitations = useSpaceInvitations2(space?.key);
2883
2934
  const onInvitationEvent = useCallback7((invitation) => {
@@ -2897,7 +2948,8 @@ var SpaceManager = (props) => {
2897
2948
  onClick: useCallback7(() => {
2898
2949
  const invitation = space.share?.({
2899
2950
  type: Invitation7.Type.INTERACTIVE,
2900
- authMethod: Invitation7.AuthMethod.SHARED_SECRET
2951
+ authMethod: Invitation7.AuthMethod.SHARED_SECRET,
2952
+ target
2901
2953
  });
2902
2954
  if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") {
2903
2955
  invitation.subscribe(onInvitationEvent);
@@ -2913,7 +2965,8 @@ var SpaceManager = (props) => {
2913
2965
  onClick: useCallback7(() => {
2914
2966
  const invitation = space.share?.({
2915
2967
  type: Invitation7.Type.MULTIUSE,
2916
- authMethod: Invitation7.AuthMethod.NONE
2968
+ authMethod: Invitation7.AuthMethod.NONE,
2969
+ target
2917
2970
  });
2918
2971
  if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") {
2919
2972
  invitation.subscribe(onInvitationEvent);
@@ -2923,7 +2976,7 @@ var SpaceManager = (props) => {
2923
2976
  ])
2924
2977
  }
2925
2978
  };
2926
- return /* @__PURE__ */ React35.createElement(SpaceManagerImpl, {
2979
+ return /* @__PURE__ */ React36.createElement(SpaceManagerImpl, {
2927
2980
  ...props,
2928
2981
  invitations,
2929
2982
  inviteActions
@@ -2932,7 +2985,7 @@ var SpaceManager = (props) => {
2932
2985
  var headingFragment = "pis-3 pie-1 plb-1 mbe-1 font-medium";
2933
2986
  var SpaceManagerImpl = (props) => {
2934
2987
  const { active, space, createInvitationUrl, send, inviteActions: propsInviteActions, invitations, showInactiveInvitations, SpaceMemberList: SpaceMemberListComponent = SpaceMemberList, InvitationList: InvitationListComponent = InvitationList } = props;
2935
- const { t } = useTranslation20("os");
2988
+ const { t } = useTranslation21("os");
2936
2989
  const inviteActions = propsInviteActions ?? {
2937
2990
  noopInvite: {
2938
2991
  label: t("create space invitation label"),
@@ -2950,26 +3003,26 @@ var SpaceManagerImpl = (props) => {
2950
3003
  const visibleInvitations = showInactiveInvitations ? invitations : invitations?.filter((invitation) => ![
2951
3004
  Invitation7.State.CANCELLED
2952
3005
  ].includes(invitation.get().state));
2953
- return /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement(ScrollArea.Root, {
3006
+ return /* @__PURE__ */ React36.createElement(React36.Fragment, null, /* @__PURE__ */ React36.createElement(ScrollArea.Root, {
2954
3007
  classNames: "grow shrink basis-28 -mli-2"
2955
- }, /* @__PURE__ */ React35.createElement(ScrollArea.Viewport, {
3008
+ }, /* @__PURE__ */ React36.createElement(ScrollArea.Viewport, {
2956
3009
  classNames: "is-full pie-2"
2957
- }, !!visibleInvitations?.length && /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement("h3", {
3010
+ }, !!visibleInvitations?.length && /* @__PURE__ */ React36.createElement(React36.Fragment, null, /* @__PURE__ */ React36.createElement("h3", {
2958
3011
  className: mx21(headingFragment, descriptionText10)
2959
- }, t("invitation list heading")), /* @__PURE__ */ React35.createElement(InvitationListComponent, {
3012
+ }, t("invitation list heading")), /* @__PURE__ */ React36.createElement(InvitationListComponent, {
2960
3013
  className: "mb-2",
2961
3014
  send,
2962
3015
  invitations: visibleInvitations ?? [],
2963
3016
  onClickRemove: (invitation) => invitation.cancel(),
2964
3017
  createInvitationUrl
2965
- }), /* @__PURE__ */ React35.createElement("h3", {
3018
+ }), /* @__PURE__ */ React36.createElement("h3", {
2966
3019
  className: mx21(headingFragment, descriptionText10, "mbs-2")
2967
- }, t("space member list heading"))), /* @__PURE__ */ React35.createElement(SpaceMemberListComponent, {
3020
+ }, t("space member list heading"))), /* @__PURE__ */ React36.createElement(SpaceMemberListComponent, {
2968
3021
  spaceKey: space.key,
2969
3022
  includeSelf: true
2970
- })), /* @__PURE__ */ React35.createElement(ScrollArea.Scrollbar, {
3023
+ })), /* @__PURE__ */ React36.createElement(ScrollArea.Scrollbar, {
2971
3024
  orientation: "vertical"
2972
- }, /* @__PURE__ */ React35.createElement(ScrollArea.Thumb, null))), /* @__PURE__ */ React35.createElement(Actions, null, /* @__PURE__ */ React35.createElement(BifurcatedAction, {
3025
+ }, /* @__PURE__ */ React36.createElement(ScrollArea.Thumb, null))), /* @__PURE__ */ React36.createElement(Actions, null, /* @__PURE__ */ React36.createElement(BifurcatedAction, {
2973
3026
  disabled: !active,
2974
3027
  actions: inviteActions,
2975
3028
  activeAction,
@@ -2981,45 +3034,46 @@ var SpaceManagerImpl = (props) => {
2981
3034
  // packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx
2982
3035
  var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/panels/SpacePanel/SpacePanel.tsx";
2983
3036
  var SpacePanelHeading = ({ titleId, space, onDone }) => {
2984
- const { t } = useTranslation21("os");
3037
+ const { t } = useTranslation22("os");
2985
3038
  const name = space.properties.name;
2986
- return /* @__PURE__ */ React36.createElement(Heading, {
3039
+ return /* @__PURE__ */ React37.createElement(Heading, {
2987
3040
  titleId,
2988
3041
  title: t("space panel heading"),
2989
- corner: /* @__PURE__ */ React36.createElement(CloseButton, {
3042
+ corner: /* @__PURE__ */ React37.createElement(CloseButton, {
2990
3043
  "data-testid": "identity-panel-done",
2991
3044
  onDone
2992
3045
  })
2993
- }, /* @__PURE__ */ React36.createElement("div", {
3046
+ }, /* @__PURE__ */ React37.createElement("div", {
2994
3047
  role: "none",
2995
3048
  className: "flex gap-4 items-center justify-center mlb-4"
2996
- }, /* @__PURE__ */ React36.createElement(Planet, {
3049
+ }, /* @__PURE__ */ React37.createElement(Planet, {
2997
3050
  size: 32
2998
- }), /* @__PURE__ */ React36.createElement("div", {
3051
+ }), /* @__PURE__ */ React37.createElement("div", {
2999
3052
  className: "block text-start font-light text-xl"
3000
3053
  }, name ?? space.key.truncate())));
3001
3054
  };
3002
3055
  var SpacePanelImpl = (props) => {
3003
- const { titleId, activeView, space, SpaceManager: SpaceManagerComponent = SpaceManager, InvitationManager: InvitationManagerComponent = InvitationManager, ...rest } = props;
3004
- return /* @__PURE__ */ React36.createElement(DensityProvider4, {
3056
+ const { titleId, activeView, space, target, SpaceManager: SpaceManagerComponent = SpaceManager, InvitationManager: InvitationManagerComponent = InvitationManager, ...rest } = props;
3057
+ return /* @__PURE__ */ React37.createElement(DensityProvider4, {
3005
3058
  density: "fine"
3006
- }, /* @__PURE__ */ React36.createElement(SpacePanelHeading, {
3059
+ }, /* @__PURE__ */ React37.createElement(SpacePanelHeading, {
3007
3060
  ...rest,
3008
3061
  titleId,
3009
3062
  space
3010
- }), /* @__PURE__ */ React36.createElement(Viewport.Root, {
3063
+ }), /* @__PURE__ */ React37.createElement(Viewport.Root, {
3011
3064
  activeView
3012
- }, /* @__PURE__ */ React36.createElement(Viewport.Views, null, /* @__PURE__ */ React36.createElement(Viewport.View, {
3065
+ }, /* @__PURE__ */ React37.createElement(Viewport.Views, null, /* @__PURE__ */ React37.createElement(Viewport.View, {
3013
3066
  id: "space manager",
3014
3067
  classNames: stepStyles
3015
- }, /* @__PURE__ */ React36.createElement(SpaceManagerComponent, {
3068
+ }, /* @__PURE__ */ React37.createElement(SpaceManagerComponent, {
3016
3069
  active: activeView === "space manager",
3017
3070
  space,
3071
+ target,
3018
3072
  ...rest
3019
- })), /* @__PURE__ */ React36.createElement(Viewport.View, {
3073
+ })), /* @__PURE__ */ React37.createElement(Viewport.View, {
3020
3074
  id: "space invitation manager",
3021
3075
  classNames: stepStyles
3022
- }, /* @__PURE__ */ React36.createElement(InvitationManagerComponent, {
3076
+ }, /* @__PURE__ */ React37.createElement(InvitationManagerComponent, {
3023
3077
  active: activeView === "space invitation manager",
3024
3078
  ...rest,
3025
3079
  invitationUrl: props.invitationUrl
@@ -3027,7 +3081,7 @@ var SpacePanelImpl = (props) => {
3027
3081
  };
3028
3082
  var SpacePanelWithInvitationImpl = ({ invitation, ...props }) => {
3029
3083
  const invitationStatus = useInvitationStatus3(invitation);
3030
- return /* @__PURE__ */ React36.createElement(SpacePanelImpl, {
3084
+ return /* @__PURE__ */ React37.createElement(SpacePanelImpl, {
3031
3085
  ...props,
3032
3086
  ...invitationStatus,
3033
3087
  invitationUrl: props.createInvitationUrl(invitationStatus.invitationCode)
@@ -3044,7 +3098,7 @@ var SpacePanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => code,
3044
3098
  const subscription = spaceService.subscribe((state) => {
3045
3099
  log10("[state]", state, {
3046
3100
  F: __dxlog_file10,
3047
- L: 92,
3101
+ L: 94,
3048
3102
  S: void 0,
3049
3103
  C: (f, a) => f(...a)
3050
3104
  });
@@ -3072,62 +3126,65 @@ var SpacePanel = ({ titleId: propsTitleId, createInvitationUrl = (code) => code,
3072
3126
  titleId,
3073
3127
  createInvitationUrl
3074
3128
  };
3075
- return spaceState.context.invitation ? /* @__PURE__ */ React36.createElement(SpacePanelWithInvitationImpl, {
3076
- ...implProps,
3077
- invitation: spaceState.context.invitation
3078
- }) : /* @__PURE__ */ React36.createElement(SpacePanelImpl, implProps);
3129
+ return spaceState.context.invitation ? (
3130
+ // TODO(wittjosiah): Unused? Remove?
3131
+ /* @__PURE__ */ React37.createElement(SpacePanelWithInvitationImpl, {
3132
+ ...implProps,
3133
+ invitation: spaceState.context.invitation
3134
+ })
3135
+ ) : /* @__PURE__ */ React37.createElement(SpacePanelImpl, implProps);
3079
3136
  };
3080
3137
 
3081
3138
  // packages/sdk/shell/src/composites/IdentityDialog/IdentityDialog.tsx
3082
3139
  var IdentityDialog = (props) => {
3083
3140
  const titleId = useId9("spaceDialog__title");
3084
- return /* @__PURE__ */ React37.createElement(Dialog.Root, {
3141
+ return /* @__PURE__ */ React38.createElement(Dialog.Root, {
3085
3142
  defaultOpen: true,
3086
3143
  onOpenChange: (open) => open || props.onDone?.()
3087
- }, /* @__PURE__ */ React37.createElement(Dialog.Portal, null, /* @__PURE__ */ React37.createElement(Dialog.Overlay, null, /* @__PURE__ */ React37.createElement(Dialog.Content, {
3144
+ }, /* @__PURE__ */ React38.createElement(Dialog.Portal, null, /* @__PURE__ */ React38.createElement(Dialog.Overlay, null, /* @__PURE__ */ React38.createElement(Dialog.Content, {
3088
3145
  "aria-labelledby": titleId,
3089
3146
  onOpenAutoFocus: (e) => e.preventDefault()
3090
- }, /* @__PURE__ */ React37.createElement(ClipboardProvider, null, /* @__PURE__ */ React37.createElement(IdentityPanel, {
3147
+ }, /* @__PURE__ */ React38.createElement(ClipboardProvider, null, /* @__PURE__ */ React38.createElement(IdentityPanel, {
3091
3148
  ...props,
3092
3149
  titleId,
3093
- doneActionParent: /* @__PURE__ */ React37.createElement(Dialog.Close, {
3150
+ doneActionParent: /* @__PURE__ */ React38.createElement(Dialog.Close, {
3094
3151
  asChild: true
3095
3152
  })
3096
3153
  }))))));
3097
3154
  };
3098
3155
 
3099
3156
  // packages/sdk/shell/src/composites/JoinDialog/JoinDialog.tsx
3100
- import React38 from "react";
3157
+ import React39 from "react";
3101
3158
  import { AlertDialog, useId as useId10, useVisualViewport } from "@dxos/react-ui";
3102
3159
  var JoinDialog = (joinPanelProps) => {
3103
3160
  const titleId = useId10("joinDialog__title");
3104
3161
  const { height } = useVisualViewport();
3105
- return /* @__PURE__ */ React38.createElement(AlertDialog.Root, {
3162
+ return /* @__PURE__ */ React39.createElement(AlertDialog.Root, {
3106
3163
  defaultOpen: true,
3107
3164
  onOpenChange: (open) => open || (joinPanelProps.onExit ? joinPanelProps.onExit() : joinPanelProps.onDone?.(null))
3108
- }, /* @__PURE__ */ React38.createElement(AlertDialog.Portal, null, /* @__PURE__ */ React38.createElement(AlertDialog.Overlay, {
3165
+ }, /* @__PURE__ */ React39.createElement(AlertDialog.Portal, null, /* @__PURE__ */ React39.createElement(AlertDialog.Overlay, {
3109
3166
  classNames: "backdrop-blur",
3110
3167
  ...height && {
3111
3168
  style: {
3112
3169
  blockSize: `${height}px`
3113
3170
  }
3114
3171
  }
3115
- }, /* @__PURE__ */ React38.createElement(AlertDialog.Content, {
3172
+ }, /* @__PURE__ */ React39.createElement(AlertDialog.Content, {
3116
3173
  "aria-labelledby": titleId
3117
- }, /* @__PURE__ */ React38.createElement(JoinPanel, {
3174
+ }, /* @__PURE__ */ React39.createElement(JoinPanel, {
3118
3175
  ...joinPanelProps,
3119
3176
  titleId,
3120
- exitActionParent: /* @__PURE__ */ React38.createElement(AlertDialog.Cancel, {
3177
+ exitActionParent: /* @__PURE__ */ React39.createElement(AlertDialog.Cancel, {
3121
3178
  asChild: true
3122
3179
  }),
3123
- doneActionParent: /* @__PURE__ */ React38.createElement(AlertDialog.Action, {
3180
+ doneActionParent: /* @__PURE__ */ React39.createElement(AlertDialog.Action, {
3124
3181
  asChild: true
3125
3182
  })
3126
3183
  })))));
3127
3184
  };
3128
3185
 
3129
3186
  // packages/sdk/shell/src/composites/Shell/run-shell.tsx
3130
- import React41, { StrictMode } from "react";
3187
+ import React42, { StrictMode } from "react";
3131
3188
  import { createRoot } from "react-dom/client";
3132
3189
  import { DEFAULT_CLIENT_CHANNEL, DEFAULT_SHELL_CHANNEL } from "@dxos/client-protocol";
3133
3190
  import { ShellRuntimeImpl } from "@dxos/client-services";
@@ -3137,25 +3194,25 @@ import { defaultTx } from "@dxos/react-ui-theme";
3137
3194
  import { createIFramePort } from "@dxos/rpc-tunnel";
3138
3195
 
3139
3196
  // packages/sdk/shell/src/composites/Shell/Shell.tsx
3140
- import React40, { useEffect as useEffect6, useState as useState9 } from "react";
3197
+ import React41, { useEffect as useEffect6, useState as useState9 } from "react";
3141
3198
  import { log as log11 } from "@dxos/log";
3142
3199
  import { ShellDisplay, ShellLayout } from "@dxos/react-client";
3143
3200
  import { useSpace as useSpace2 } from "@dxos/react-client/echo";
3144
3201
 
3145
3202
  // packages/sdk/shell/src/composites/SpaceDialog/SpaceDialog.tsx
3146
- import React39 from "react";
3203
+ import React40 from "react";
3147
3204
  import { Dialog as Dialog2, useId as useId11 } from "@dxos/react-ui";
3148
3205
  var SpaceDialog = (spacePanelProps) => {
3149
3206
  const titleId = useId11("spaceDialog__title");
3150
- return /* @__PURE__ */ React39.createElement(Dialog2.Root, {
3207
+ return /* @__PURE__ */ React40.createElement(Dialog2.Root, {
3151
3208
  defaultOpen: true,
3152
3209
  onOpenChange: (open) => open || spacePanelProps.onDone?.()
3153
- }, /* @__PURE__ */ React39.createElement(Dialog2.Portal, null, /* @__PURE__ */ React39.createElement(Dialog2.Overlay, null, /* @__PURE__ */ React39.createElement(Dialog2.Content, {
3210
+ }, /* @__PURE__ */ React40.createElement(Dialog2.Portal, null, /* @__PURE__ */ React40.createElement(Dialog2.Overlay, null, /* @__PURE__ */ React40.createElement(Dialog2.Content, {
3154
3211
  "aria-labelledby": titleId
3155
- }, /* @__PURE__ */ React39.createElement(ClipboardProvider, null, /* @__PURE__ */ React39.createElement(SpacePanel, {
3212
+ }, /* @__PURE__ */ React40.createElement(ClipboardProvider, null, /* @__PURE__ */ React40.createElement(SpacePanel, {
3156
3213
  ...spacePanelProps,
3157
3214
  titleId,
3158
- doneActionParent: /* @__PURE__ */ React39.createElement(Dialog2.Close, {
3215
+ doneActionParent: /* @__PURE__ */ React40.createElement(Dialog2.Close, {
3159
3216
  asChild: true
3160
3217
  })
3161
3218
  }))))));
@@ -3164,10 +3221,11 @@ var SpaceDialog = (spacePanelProps) => {
3164
3221
  // packages/sdk/shell/src/composites/Shell/Shell.tsx
3165
3222
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/shell/src/composites/Shell/Shell.tsx";
3166
3223
  var Shell = ({ runtime, origin }) => {
3167
- const [{ layout, invitationCode, spaceKey }, setLayout] = useState9({
3224
+ const [{ layout, invitationCode, spaceKey, target }, setLayout] = useState9({
3168
3225
  layout: runtime.layout,
3169
3226
  invitationCode: runtime.invitationCode,
3170
- spaceKey: runtime.spaceKey
3227
+ spaceKey: runtime.spaceKey,
3228
+ target: runtime.target
3171
3229
  });
3172
3230
  const space = useSpace2(spaceKey);
3173
3231
  useEffect6(() => {
@@ -3179,7 +3237,7 @@ var Shell = ({ runtime, origin }) => {
3179
3237
  if (layout === ShellLayout.SPACE && !space) {
3180
3238
  log11.warn("No space found for shell space invitations.", void 0, {
3181
3239
  F: __dxlog_file11,
3182
- L: 30,
3240
+ L: 31,
3183
3241
  S: void 0,
3184
3242
  C: (f, a) => f(...a)
3185
3243
  });
@@ -3200,7 +3258,7 @@ var Shell = ({ runtime, origin }) => {
3200
3258
  ]);
3201
3259
  switch (layout) {
3202
3260
  case ShellLayout.INITIALIZE_IDENTITY:
3203
- return /* @__PURE__ */ React40.createElement(JoinDialog, {
3261
+ return /* @__PURE__ */ React41.createElement(JoinDialog, {
3204
3262
  mode: "halo-only",
3205
3263
  initialInvitationCode: invitationCode,
3206
3264
  onDone: () => {
@@ -3215,7 +3273,7 @@ var Shell = ({ runtime, origin }) => {
3215
3273
  case ShellLayout.IDENTITY:
3216
3274
  case ShellLayout.SHARE_IDENTITY:
3217
3275
  case ShellLayout.EDIT_PROFILE:
3218
- return /* @__PURE__ */ React40.createElement(IdentityDialog, {
3276
+ return /* @__PURE__ */ React41.createElement(IdentityDialog, {
3219
3277
  createInvitationUrl: (invitationCode2) => `${origin}?deviceInvitationCode=${invitationCode2}`,
3220
3278
  onDone: async () => {
3221
3279
  await runtime.setAppContext({
@@ -3227,8 +3285,9 @@ var Shell = ({ runtime, origin }) => {
3227
3285
  }
3228
3286
  });
3229
3287
  case ShellLayout.SPACE:
3230
- return space ? /* @__PURE__ */ React40.createElement(SpaceDialog, {
3288
+ return space ? /* @__PURE__ */ React41.createElement(SpaceDialog, {
3231
3289
  space,
3290
+ target,
3232
3291
  createInvitationUrl: (invitationCode2) => `${origin}?spaceInvitationCode=${invitationCode2}`,
3233
3292
  onDone: async () => {
3234
3293
  await runtime.setAppContext({
@@ -3240,12 +3299,14 @@ var Shell = ({ runtime, origin }) => {
3240
3299
  }
3241
3300
  }) : null;
3242
3301
  case ShellLayout.JOIN_SPACE:
3243
- return /* @__PURE__ */ React40.createElement(JoinDialog, {
3302
+ return /* @__PURE__ */ React41.createElement(JoinDialog, {
3244
3303
  initialInvitationCode: invitationCode,
3245
3304
  onDone: async (result) => {
3305
+ const target2 = result?.target ?? void 0;
3246
3306
  await runtime.setAppContext({
3247
3307
  display: ShellDisplay.NONE,
3248
- spaceKey: result?.spaceKey ?? void 0
3308
+ spaceKey: result?.spaceKey ?? void 0,
3309
+ target: target2
3249
3310
  });
3250
3311
  runtime.setLayout({
3251
3312
  layout: ShellLayout.DEFAULT
@@ -3337,7 +3398,8 @@ var os = {
3337
3398
  "selecting identity heading": "Selecting identity",
3338
3399
  "devices heading": "Devices",
3339
3400
  "identity heading": "Profile settings",
3340
- "choose devices label": "Add device",
3401
+ "choose add device label": "Add device",
3402
+ "choose devices label": "Manage devices",
3341
3403
  "choose profile label": "Edit profile",
3342
3404
  "choose sign out label": "Sign out",
3343
3405
  "empty space members message": "There is nobody in this space yet.",
@@ -3388,24 +3450,24 @@ var runShell = async (config = new Config()) => {
3388
3450
  runtime.open(),
3389
3451
  client.initialize()
3390
3452
  ]);
3391
- createRoot(document.getElementById("root")).render(/* @__PURE__ */ React41.createElement(StrictMode, null, /* @__PURE__ */ React41.createElement(ThemeProvider, {
3453
+ createRoot(document.getElementById("root")).render(/* @__PURE__ */ React42.createElement(StrictMode, null, /* @__PURE__ */ React42.createElement(ThemeProvider, {
3392
3454
  tx: defaultTx,
3393
3455
  resourceExtensions: [
3394
3456
  osTranslations
3395
3457
  ]
3396
- }, /* @__PURE__ */ React41.createElement(ClientContext.Provider, {
3458
+ }, /* @__PURE__ */ React42.createElement(ClientContext.Provider, {
3397
3459
  value: {
3398
3460
  client,
3399
3461
  status: SystemStatus.ACTIVE
3400
3462
  }
3401
- }, /* @__PURE__ */ React41.createElement(ClipboardProvider, null, /* @__PURE__ */ React41.createElement(Tooltip3.Provider, null, /* @__PURE__ */ React41.createElement(Shell, {
3463
+ }, /* @__PURE__ */ React42.createElement(ClipboardProvider, null, /* @__PURE__ */ React42.createElement(Tooltip3.Provider, null, /* @__PURE__ */ React42.createElement(Shell, {
3402
3464
  runtime,
3403
3465
  origin: location.origin
3404
3466
  })))))));
3405
3467
  };
3406
3468
 
3407
3469
  // 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";
3470
+ import React43, { createContext as createContext2, useCallback as useCallback8, useContext as useContext2, useEffect as useEffect7, useMemo as useMemo6, useState as useState10 } from "react";
3409
3471
  import { ShellDisplay as ShellDisplay2, ShellLayout as ShellLayout3, useClient as useClient7 } from "@dxos/react-client";
3410
3472
  import { useIdentity as useIdentity3 } from "@dxos/react-client/halo";
3411
3473
  import { mx as mx22 } from "@dxos/react-ui-theme";
@@ -3537,12 +3599,12 @@ var ShellProvider = ({ space, deviceInvitationCode, spaceInvitationCode, onJoine
3537
3599
  }, [
3538
3600
  shellRuntime
3539
3601
  ]);
3540
- return /* @__PURE__ */ React42.createElement(React42.Fragment, null, shellRuntime && /* @__PURE__ */ React42.createElement("div", {
3602
+ return /* @__PURE__ */ React43.createElement(React43.Fragment, null, shellRuntime && /* @__PURE__ */ React43.createElement("div", {
3541
3603
  className: mx22(display === ShellDisplay2.NONE ? "hidden" : "")
3542
- }, /* @__PURE__ */ React42.createElement(Shell, {
3604
+ }, /* @__PURE__ */ React43.createElement(Shell, {
3543
3605
  runtime: shellRuntime,
3544
3606
  origin: window.location.origin
3545
- })), /* @__PURE__ */ React42.createElement(ShellContext.Provider, {
3607
+ })), /* @__PURE__ */ React43.createElement(ShellContext.Provider, {
3546
3608
  value: {
3547
3609
  runtime: shellRuntime,
3548
3610
  setDisplay