@ai-matrx/meet 0.10.0 → 0.10.1

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.
@@ -107,10 +107,10 @@ __export(meet_exports, {
107
107
  module.exports = __toCommonJS(meet_exports);
108
108
 
109
109
  // src/skins/meet/components.tsx
110
- var import_react9 = require("react");
110
+ var import_react10 = require("react");
111
111
 
112
112
  // src/react/facade.ts
113
- var import_react7 = require("react");
113
+ var import_react8 = require("react");
114
114
 
115
115
  // src/react/root.tsx
116
116
  var import_react3 = require("react");
@@ -360,6 +360,20 @@ function isLinkFollower(standing) {
360
360
  function isHostRole(role) {
361
361
  return role === "host" || role === "cohost";
362
362
  }
363
+ function isObserverRole(role) {
364
+ return role === "viewer";
365
+ }
366
+
367
+ // src/core/app-panel.ts
368
+ function appPanelOf(meeting) {
369
+ const raw = meeting?.metadata?.["app_panel"];
370
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
371
+ const key = raw["key"];
372
+ const recordId = raw["record_id"];
373
+ if (typeof key !== "string" || key.length === 0) return null;
374
+ if (typeof recordId !== "string" || recordId.length === 0) return null;
375
+ return { key, recordId };
376
+ }
363
377
 
364
378
  // src/core/collab.ts
365
379
  function assignedRoom(plan, identity) {
@@ -797,7 +811,10 @@ function orderParticipants(participants, activeSpeakers) {
797
811
  }
798
812
  function computeStage(args) {
799
813
  const pageSize = Math.max(1, args.pageSize ?? DEFAULT_PAGE_SIZE);
800
- const ordered = orderParticipants(args.participants, args.activeSpeakers);
814
+ const ordered = orderParticipants(
815
+ args.participants.filter((participant) => !isObserverRole(participant.role)),
816
+ args.activeSpeakers
817
+ );
801
818
  const sharer = ordered.find((participant) => participant.screenSharing) ?? null;
802
819
  const pinnedParticipant = args.pinned === null ? null : ordered.find((participant) => participant.identity === args.pinned) ?? null;
803
820
  const spotlit = args.spotlight == null ? null : ordered.find((participant) => participant.identity === args.spotlight) ?? null;
@@ -823,9 +840,97 @@ function gridColumns(count) {
823
840
  return 5;
824
841
  }
825
842
 
826
- // src/react/hooks.ts
843
+ // src/react/app-panel.tsx
827
844
  var import_react4 = require("react");
828
- var import_react5 = require("@ai-matrx/realtime/react");
845
+
846
+ // src/core/collab-state.ts
847
+ function availableActivities(collab, isHost) {
848
+ const settings = collab?.settings ?? null;
849
+ if (settings === null) return [];
850
+ const out = [];
851
+ if (settings.whiteboardEnabled) out.push("whiteboard");
852
+ if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
853
+ if (settings.qaEnabled) out.push("qa");
854
+ if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
855
+ return out;
856
+ }
857
+ function activityAttention(collab, isHost) {
858
+ if (collab === null) return false;
859
+ if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
860
+ if (isHost && collab.questions.some((q) => q.state === "open")) return true;
861
+ return false;
862
+ }
863
+ async function performCollab(runtime, request) {
864
+ if (runtime === null) return { ok: false, message: "This meeting is not connected." };
865
+ try {
866
+ const result = await runtime.inRoom.collab(request);
867
+ return { ok: true, message: result.message, itemId: result.itemId };
868
+ } catch (error) {
869
+ return { ok: false, message: error.message ?? "That did not work." };
870
+ }
871
+ }
872
+ async function moveToRoom(runtime, roomId) {
873
+ if (runtime === null) return { ok: false, message: "This meeting is not connected." };
874
+ try {
875
+ await runtime.engine.moveToBreakout(roomId);
876
+ return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
877
+ } catch (error) {
878
+ return { ok: false, message: error.message ?? "That room could not be joined." };
879
+ }
880
+ }
881
+ function untranslatedLines(lines, translations) {
882
+ return lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text }) => ({ id, text }));
883
+ }
884
+ function nextTranslationBatch(pending, language, asked) {
885
+ const batch = pending.filter((line) => !asked.has(`${language}:${line.id}`)).slice(-20);
886
+ for (const line of batch) asked.add(`${language}:${line.id}`);
887
+ return batch;
888
+ }
889
+ function setCaptionLanguage(store, next) {
890
+ store.patch({
891
+ collab: {
892
+ ...store.snapshot().collab,
893
+ captionLanguage: next,
894
+ captionTranslations: {},
895
+ captionTranslationError: null
896
+ }
897
+ });
898
+ }
899
+ function takePanelRequest(store) {
900
+ const request = store.snapshot().collab.panelRequest;
901
+ if (request === null) return null;
902
+ store.patch({ collab: { ...store.snapshot().collab, panelRequest: null } });
903
+ return request.panel;
904
+ }
905
+ function takeMoveRequest(store) {
906
+ const request = store.snapshot().collab.moveRequest;
907
+ if (request === null) return null;
908
+ store.patch({ collab: { ...store.snapshot().collab, moveRequest: null } });
909
+ return { roomId: request.roomId };
910
+ }
911
+
912
+ // src/react/app-panel.tsx
913
+ var import_jsx_runtime3 = require("react/jsx-runtime");
914
+ var RegistryContext = (0, import_react4.createContext)({});
915
+ function useMeetAppPanelRegistry() {
916
+ return (0, import_react4.useContext)(RegistryContext);
917
+ }
918
+ function useMeetAppPanel(meeting) {
919
+ const snapshot = useMeetSnapshot();
920
+ const registry = useMeetAppPanelRegistry();
921
+ const record = meeting ?? snapshot?.meeting ?? null;
922
+ return (0, import_react4.useMemo)(() => {
923
+ const panel = appPanelOf(record);
924
+ if (panel === null || record === null) return null;
925
+ const entry = registry[panel.key];
926
+ if (entry === void 0) return null;
927
+ return { ...entry, panel, organizationId: record.organizationId };
928
+ }, [record, registry]);
929
+ }
930
+
931
+ // src/react/hooks.ts
932
+ var import_react5 = require("react");
933
+ var import_react6 = require("@ai-matrx/realtime/react");
829
934
 
830
935
  // src/core/record.ts
831
936
  var import_format = require("@ai-matrx/kit/format");
@@ -950,51 +1055,51 @@ function useRoom() {
950
1055
  failure: snapshot?.failure ?? null,
951
1056
  local,
952
1057
  canShareScreen: engine?.supportsScreenShare() ?? true,
953
- join: (0, import_react4.useCallback)(
1058
+ join: (0, import_react5.useCallback)(
954
1059
  async (request) => requireEngine(engine, "join").join(request),
955
1060
  [engine]
956
1061
  ),
957
- leave: (0, import_react4.useCallback)(async () => requireEngine(engine, "leave").leave(), [engine]),
958
- toggleMicrophone: (0, import_react4.useCallback)(
1062
+ leave: (0, import_react5.useCallback)(async () => requireEngine(engine, "leave").leave(), [engine]),
1063
+ toggleMicrophone: (0, import_react5.useCallback)(
959
1064
  async () => requireEngine(engine, "toggleMicrophone").setMicrophoneEnabled(
960
1065
  !(local?.micEnabled ?? false)
961
1066
  ),
962
1067
  [engine, local]
963
1068
  ),
964
- toggleCamera: (0, import_react4.useCallback)(
1069
+ toggleCamera: (0, import_react5.useCallback)(
965
1070
  async () => requireEngine(engine, "toggleCamera").setCameraEnabled(!(local?.cameraEnabled ?? false)),
966
1071
  [engine, local]
967
1072
  ),
968
- toggleScreenShare: (0, import_react4.useCallback)(
1073
+ toggleScreenShare: (0, import_react5.useCallback)(
969
1074
  async () => requireEngine(engine, "toggleScreenShare").setScreenShareEnabled(
970
1075
  !(local?.screenSharing ?? false)
971
1076
  ),
972
1077
  [engine, local]
973
1078
  ),
974
- toggleHand: (0, import_react4.useCallback)(
1079
+ toggleHand: (0, import_react5.useCallback)(
975
1080
  async () => requireEngine(engine, "toggleHand").raiseHand(!(local?.handRaised ?? false)),
976
1081
  [engine, local]
977
1082
  ),
978
- react: (0, import_react4.useCallback)(
1083
+ react: (0, import_react5.useCallback)(
979
1084
  async (emoji) => requireEngine(engine, "react").react(emoji),
980
1085
  [engine]
981
1086
  ),
982
- sendChat: (0, import_react4.useCallback)(
1087
+ sendChat: (0, import_react5.useCallback)(
983
1088
  async (text) => {
984
1089
  if (host === null) throw noRuntime("sendChat");
985
1090
  await host.inRoom.sendChat(text);
986
1091
  },
987
1092
  [host]
988
1093
  ),
989
- sendPrivateChat: (0, import_react4.useCallback)(
1094
+ sendPrivateChat: (0, import_react5.useCallback)(
990
1095
  async (to, text) => requireEngine(engine, "sendPrivateChat").sendPrivateChat(to, text),
991
1096
  [engine]
992
1097
  ),
993
- pin: (0, import_react4.useCallback)(
1098
+ pin: (0, import_react5.useCallback)(
994
1099
  (identity) => requireEngine(engine, "pin").pin(identity),
995
1100
  [engine]
996
1101
  ),
997
- setLayout: (0, import_react4.useCallback)(
1102
+ setLayout: (0, import_react5.useCallback)(
998
1103
  (layout) => requireEngine(engine, "setLayout").setLayout(layout),
999
1104
  [engine]
1000
1105
  )
@@ -1002,8 +1107,8 @@ function useRoom() {
1002
1107
  }
1003
1108
  function useStage(pageSize = DEFAULT_PAGE_SIZE) {
1004
1109
  const snapshot = useMeetSnapshot();
1005
- const [page, setPage] = (0, import_react4.useState)(0);
1006
- const stage = (0, import_react4.useMemo)(
1110
+ const [page, setPage] = (0, import_react5.useState)(0);
1111
+ const stage = (0, import_react5.useMemo)(
1007
1112
  () => computeStage({
1008
1113
  participants: snapshot?.participants ?? [],
1009
1114
  layout: snapshot?.layout ?? "grid",
@@ -1015,15 +1120,15 @@ function useStage(pageSize = DEFAULT_PAGE_SIZE) {
1015
1120
  }),
1016
1121
  [snapshot, pageSize, page]
1017
1122
  );
1018
- (0, import_react4.useEffect)(() => {
1123
+ (0, import_react5.useEffect)(() => {
1019
1124
  if (page > stage.pageCount - 1) setPage(Math.max(0, stage.pageCount - 1));
1020
1125
  }, [page, stage.pageCount]);
1021
1126
  return stage;
1022
1127
  }
1023
1128
  function useTrack(identity, kind) {
1024
1129
  const host = useMeetHost();
1025
- const detachRef = (0, import_react4.useRef)(null);
1026
- return (0, import_react4.useCallback)(
1130
+ const detachRef = (0, import_react5.useRef)(null);
1131
+ return (0, import_react5.useCallback)(
1027
1132
  (element) => {
1028
1133
  detachRef.current?.();
1029
1134
  detachRef.current = null;
@@ -1043,19 +1148,19 @@ function useLobby() {
1043
1148
  // No runtime means no host powers — `<LobbyPanel>` renders nothing rather
1044
1149
  // than an admit button that would throw.
1045
1150
  canAdmit: session !== null && isHost,
1046
- admit: (0, import_react4.useCallback)(
1151
+ admit: (0, import_react5.useCallback)(
1047
1152
  async (entry) => requireSession(session, "admit").admit(entry, true),
1048
1153
  [session]
1049
1154
  ),
1050
- deny: (0, import_react4.useCallback)(
1155
+ deny: (0, import_react5.useCallback)(
1051
1156
  async (entry) => requireSession(session, "deny").admit(entry, false),
1052
1157
  [session]
1053
1158
  ),
1054
- admitAll: (0, import_react4.useCallback)(
1159
+ admitAll: (0, import_react5.useCallback)(
1055
1160
  async () => requireSession(session, "admitAll").admitAll(),
1056
1161
  [session]
1057
1162
  ),
1058
- undeny: (0, import_react4.useCallback)(
1163
+ undeny: (0, import_react5.useCallback)(
1059
1164
  async (entry) => requireSession(session, "undeny").undeny(entry),
1060
1165
  [session]
1061
1166
  )
@@ -1067,8 +1172,8 @@ function useWaiting() {
1067
1172
  const session = host?.meetings ?? null;
1068
1173
  return {
1069
1174
  waiting: snapshot?.waiting ?? null,
1070
- withdraw: (0, import_react4.useCallback)(async () => requireSession(session, "withdraw").withdraw(), [session]),
1071
- askAgain: (0, import_react4.useCallback)(async () => requireSession(session, "askAgain").askAgain(), [session])
1175
+ withdraw: (0, import_react5.useCallback)(async () => requireSession(session, "withdraw").withdraw(), [session]),
1176
+ askAgain: (0, import_react5.useCallback)(async () => requireSession(session, "askAgain").askAgain(), [session])
1072
1177
  };
1073
1178
  }
1074
1179
  function useRecording() {
@@ -1085,7 +1190,7 @@ function useRecording() {
1085
1190
  // `stopping` is already stopping; the other in-flight states can be.
1086
1191
  canStop: host !== null && canRecord && (state === "recording" || state === "starting"),
1087
1192
  consentNotice: host?.recording.consentNotice(meeting) ?? null,
1088
- start: (0, import_react4.useCallback)(async () => {
1193
+ start: (0, import_react5.useCallback)(async () => {
1089
1194
  const live = requireHost(host, "startRecording");
1090
1195
  if (meeting === null || live.identity.userId === null) return;
1091
1196
  await live.recording.start({
@@ -1094,7 +1199,7 @@ function useRecording() {
1094
1199
  by: live.identity.userId
1095
1200
  });
1096
1201
  }, [host, meeting]),
1097
- stop: (0, import_react4.useCallback)(async () => {
1202
+ stop: (0, import_react5.useCallback)(async () => {
1098
1203
  const live = requireHost(host, "stopRecording");
1099
1204
  if (meeting === null || live.identity.userId === null) return;
1100
1205
  await live.recording.stop({ meetingId: meeting.id, by: live.identity.userId });
@@ -1105,17 +1210,17 @@ function useMeetAi() {
1105
1210
  const host = useMeetHost();
1106
1211
  const snapshot = useMeetSnapshot();
1107
1212
  const isHost = useIsHost();
1108
- const [asking, setAsking] = (0, import_react4.useState)(false);
1109
- const [answer, setAnswer] = (0, import_react4.useState)(null);
1110
- const [coverage, setCoverage] = (0, import_react4.useState)(null);
1111
- const [phase, setPhase] = (0, import_react4.useState)(null);
1112
- const [error, setError] = (0, import_react4.useState)(null);
1213
+ const [asking, setAsking] = (0, import_react5.useState)(false);
1214
+ const [answer, setAnswer] = (0, import_react5.useState)(null);
1215
+ const [coverage, setCoverage] = (0, import_react5.useState)(null);
1216
+ const [phase, setPhase] = (0, import_react5.useState)(null);
1217
+ const [error, setError] = (0, import_react5.useState)(null);
1113
1218
  const ai = host?.ai ?? null;
1114
1219
  const meeting = snapshot?.meeting ?? null;
1115
1220
  const participants = snapshot?.participants ?? [];
1116
1221
  const notes = snapshot?.notes ?? [];
1117
1222
  const wrapUp = snapshot?.wrapUp ?? null;
1118
- const status = (0, import_react4.useMemo)(
1223
+ const status = (0, import_react5.useMemo)(
1119
1224
  () => noteTakerStatus({
1120
1225
  meeting,
1121
1226
  participants,
@@ -1124,7 +1229,7 @@ function useMeetAi() {
1124
1229
  [meeting, participants, snapshot?.noteTakerRefusal]
1125
1230
  );
1126
1231
  const names = snapshot?.names ?? EMPTY_NAMES;
1127
- const transcript = (0, import_react4.useMemo)(
1232
+ const transcript = (0, import_react5.useMemo)(
1128
1233
  () => readableTranscript(snapshot?.transcript ?? []).map((line) => ({
1129
1234
  id: line.id,
1130
1235
  identity: line.identity,
@@ -1140,7 +1245,7 @@ function useMeetAi() {
1140
1245
  })),
1141
1246
  [snapshot?.transcript, names]
1142
1247
  );
1143
- const dispatchNoteTaker = (0, import_react4.useCallback)(
1248
+ const dispatchNoteTaker = (0, import_react5.useCallback)(
1144
1249
  async (run) => {
1145
1250
  setError(null);
1146
1251
  try {
@@ -1176,7 +1281,7 @@ function useMeetAi() {
1176
1281
  coverage,
1177
1282
  phase,
1178
1283
  error,
1179
- ask: (0, import_react4.useCallback)(
1284
+ ask: (0, import_react5.useCallback)(
1180
1285
  async (question) => {
1181
1286
  if (ai === null || meeting === null) return;
1182
1287
  setAsking(true);
@@ -1207,13 +1312,13 @@ function useMeetAi() {
1207
1312
  },
1208
1313
  [ai, meeting]
1209
1314
  ),
1210
- startNoteTaker: (0, import_react4.useCallback)(async () => {
1315
+ startNoteTaker: (0, import_react5.useCallback)(async () => {
1211
1316
  if (ai === null || meeting === null) return;
1212
1317
  await dispatchNoteTaker(
1213
1318
  () => ai.startNoteTaker({ meetingId: meeting.id, roomName: meeting.roomName })
1214
1319
  );
1215
1320
  }, [ai, meeting, dispatchNoteTaker]),
1216
- stopNoteTaker: (0, import_react4.useCallback)(async () => {
1321
+ stopNoteTaker: (0, import_react5.useCallback)(async () => {
1217
1322
  if (ai === null || meeting === null) return;
1218
1323
  await dispatchNoteTaker(() => ai.stopNoteTaker({ meetingId: meeting.id }));
1219
1324
  }, [ai, meeting, dispatchNoteTaker])
@@ -1223,8 +1328,8 @@ function useEndMeeting() {
1223
1328
  const host = useMeetHost();
1224
1329
  const snapshot = useMeetSnapshot();
1225
1330
  const isHost = useIsHost();
1226
- const [ending, setEnding] = (0, import_react4.useState)(false);
1227
- const [notice, setNotice] = (0, import_react4.useState)(null);
1331
+ const [ending, setEnding] = (0, import_react5.useState)(false);
1332
+ const [notice, setNotice] = (0, import_react5.useState)(null);
1228
1333
  const meeting = snapshot?.meeting ?? null;
1229
1334
  const session = host?.meetings ?? null;
1230
1335
  return {
@@ -1232,7 +1337,7 @@ function useEndMeeting() {
1232
1337
  ending,
1233
1338
  ended: meeting?.endedAt !== null && meeting?.endedAt !== void 0,
1234
1339
  notice,
1235
- end: (0, import_react4.useCallback)(async () => {
1340
+ end: (0, import_react5.useCallback)(async () => {
1236
1341
  const live = requireSession(session, "endForEveryone");
1237
1342
  setEnding(true);
1238
1343
  setNotice(null);
@@ -1266,7 +1371,7 @@ function useReactions() {
1266
1371
  const host = useMeetHost();
1267
1372
  const snapshot = useMeetSnapshot();
1268
1373
  const store = host?.store ?? null;
1269
- (0, import_react4.useEffect)(() => {
1374
+ (0, import_react5.useEffect)(() => {
1270
1375
  if (store === null) return void 0;
1271
1376
  const timer = setInterval(() => store.expireReactions(Date.now()), REACTION_TTL_MS / 2);
1272
1377
  return () => clearInterval(timer);
@@ -1274,8 +1379,8 @@ function useReactions() {
1274
1379
  return snapshot?.reactions ?? [];
1275
1380
  }
1276
1381
  function useElapsed(startedAt) {
1277
- const [now, setNow] = (0, import_react4.useState)(() => Date.now());
1278
- (0, import_react4.useEffect)(() => {
1382
+ const [now, setNow] = (0, import_react5.useState)(() => Date.now());
1383
+ (0, import_react5.useEffect)(() => {
1279
1384
  if (startedAt === null) return void 0;
1280
1385
  const timer = setInterval(() => setNow(Date.now()), 1e3);
1281
1386
  return () => clearInterval(timer);
@@ -1291,15 +1396,15 @@ function useHostControls() {
1291
1396
  (participant) => participant.identity === snapshot.localIdentity
1292
1397
  );
1293
1398
  const actor = me === void 0 ? void 0 : { ...me, role };
1294
- const [busy, setBusy] = (0, import_react4.useState)(false);
1399
+ const [busy, setBusy] = (0, import_react5.useState)(false);
1295
1400
  const inRoom = host?.inRoom ?? null;
1296
1401
  const store = host?.store ?? null;
1297
1402
  const notice = snapshot?.actionNotice ?? null;
1298
- const setNotice = (0, import_react4.useCallback)(
1403
+ const setNotice = (0, import_react5.useCallback)(
1299
1404
  (next) => store?.patch({ actionNotice: next === null ? null : { ...next, at: Date.now() } }),
1300
1405
  [store]
1301
1406
  );
1302
- const run = (0, import_react4.useCallback)(
1407
+ const run = (0, import_react5.useCallback)(
1303
1408
  async (request) => {
1304
1409
  if (inRoom === null) throw noRuntime(`moderate(${request.action})`);
1305
1410
  setBusy(true);
@@ -1325,19 +1430,19 @@ function useHostControls() {
1325
1430
  isOwner: role === "host",
1326
1431
  notice,
1327
1432
  busy,
1328
- clearNotice: (0, import_react4.useCallback)(() => setNotice(null), [setNotice]),
1329
- canModerate: (0, import_react4.useCallback)(
1433
+ clearNotice: (0, import_react5.useCallback)(() => setNotice(null), [setNotice]),
1434
+ canModerate: (0, import_react5.useCallback)(
1330
1435
  (target) => canModerateParticipant(actor, target),
1331
1436
  [actor]
1332
1437
  ),
1333
1438
  run,
1334
- mute: (0, import_react4.useCallback)(
1439
+ mute: (0, import_react5.useCallback)(
1335
1440
  async (target) => {
1336
1441
  await run({ action: "mute", identity: target.identity });
1337
1442
  },
1338
1443
  [run]
1339
1444
  ),
1340
- remove: (0, import_react4.useCallback)(
1445
+ remove: (0, import_react5.useCallback)(
1341
1446
  async (target) => {
1342
1447
  await run({ action: "remove", identity: target.identity });
1343
1448
  },
@@ -1347,7 +1452,7 @@ function useHostControls() {
1347
1452
  }
1348
1453
  function useHandQueue() {
1349
1454
  const snapshot = useMeetSnapshot();
1350
- return (0, import_react4.useMemo)(
1455
+ return (0, import_react5.useMemo)(
1351
1456
  () => (snapshot?.participants ?? []).filter((participant) => participant.handRaised).sort((a, b) => (a.handRaisedAt ?? 0) - (b.handRaisedAt ?? 0)),
1352
1457
  [snapshot?.participants]
1353
1458
  );
@@ -1359,7 +1464,7 @@ function useMediaEffects() {
1359
1464
  return {
1360
1465
  effects: snapshot?.effects ?? DEFAULT_EFFECTS,
1361
1466
  backgroundsSupported: engine?.supportsVideoEffects() ?? false,
1362
- set: (0, import_react4.useCallback)(
1467
+ set: (0, import_react5.useCallback)(
1363
1468
  async (next) => requireEngine(engine, "setEffects").setEffects(next),
1364
1469
  [engine]
1365
1470
  )
@@ -1370,12 +1475,12 @@ function useModerationNotice() {
1370
1475
  const snapshot = useMeetSnapshot();
1371
1476
  return {
1372
1477
  notice: snapshot?.moderationNotice ?? null,
1373
- dismiss: (0, import_react4.useCallback)(() => host?.store.patch({ moderationNotice: null }), [host])
1478
+ dismiss: (0, import_react5.useCallback)(() => host?.store.patch({ moderationNotice: null }), [host])
1374
1479
  };
1375
1480
  }
1376
1481
  function useAudioLevel(stream) {
1377
- const [level, setLevel] = (0, import_react4.useState)(0);
1378
- (0, import_react4.useEffect)(() => {
1482
+ const [level, setLevel] = (0, import_react5.useState)(0);
1483
+ (0, import_react5.useEffect)(() => {
1379
1484
  if (stream === null || stream.getAudioTracks().length === 0) {
1380
1485
  setLevel(0);
1381
1486
  return void 0;
@@ -1414,9 +1519,9 @@ var MEET_SHORTCUTS = [
1414
1519
  { id: "help", keys: "Shift + ?", label: "Show keyboard shortcuts" }
1415
1520
  ];
1416
1521
  function useMeetShortcuts(handlers) {
1417
- const ref = (0, import_react4.useRef)(handlers);
1522
+ const ref = (0, import_react5.useRef)(handlers);
1418
1523
  ref.current = handlers;
1419
- (0, import_react4.useEffect)(() => {
1524
+ (0, import_react5.useEffect)(() => {
1420
1525
  const target = globalThis.window;
1421
1526
  if (target === void 0) return void 0;
1422
1527
  const onKey = (event) => {
@@ -1445,11 +1550,11 @@ function useGuestRecordAccess(meeting) {
1445
1550
  const host = useMeetHost();
1446
1551
  const api = host?.api ?? null;
1447
1552
  const stored = guestRecordAccessSetting(meeting);
1448
- const [chosen, setChosen] = (0, import_react4.useState)(null);
1449
- const [effective, setEffective] = (0, import_react4.useState)(null);
1450
- const [saving, setSaving] = (0, import_react4.useState)(false);
1451
- const [error, setError] = (0, import_react4.useState)(null);
1452
- (0, import_react4.useEffect)(() => {
1553
+ const [chosen, setChosen] = (0, import_react5.useState)(null);
1554
+ const [effective, setEffective] = (0, import_react5.useState)(null);
1555
+ const [saving, setSaving] = (0, import_react5.useState)(false);
1556
+ const [error, setError] = (0, import_react5.useState)(null);
1557
+ (0, import_react5.useEffect)(() => {
1453
1558
  setChosen(null);
1454
1559
  }, [stored, meeting?.id]);
1455
1560
  return {
@@ -1457,7 +1562,7 @@ function useGuestRecordAccess(meeting) {
1457
1562
  effective,
1458
1563
  saving,
1459
1564
  error,
1460
- choose: (0, import_react4.useCallback)(
1565
+ choose: (0, import_react5.useCallback)(
1461
1566
  async (next) => {
1462
1567
  if (api === null || meeting === null) return;
1463
1568
  setSaving(true);
@@ -1485,74 +1590,8 @@ function useGuestRecordAccess(meeting) {
1485
1590
  };
1486
1591
  }
1487
1592
 
1488
- // src/core/collab-state.ts
1489
- function availableActivities(collab, isHost) {
1490
- const settings = collab?.settings ?? null;
1491
- if (settings === null) return [];
1492
- const out = [];
1493
- if (settings.whiteboardEnabled) out.push("whiteboard");
1494
- if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
1495
- if (settings.qaEnabled) out.push("qa");
1496
- if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
1497
- return out;
1498
- }
1499
- function activityAttention(collab, isHost) {
1500
- if (collab === null) return false;
1501
- if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
1502
- if (isHost && collab.questions.some((q) => q.state === "open")) return true;
1503
- return false;
1504
- }
1505
- async function performCollab(runtime, request) {
1506
- if (runtime === null) return { ok: false, message: "This meeting is not connected." };
1507
- try {
1508
- const result = await runtime.inRoom.collab(request);
1509
- return { ok: true, message: result.message, itemId: result.itemId };
1510
- } catch (error) {
1511
- return { ok: false, message: error.message ?? "That did not work." };
1512
- }
1513
- }
1514
- async function moveToRoom(runtime, roomId) {
1515
- if (runtime === null) return { ok: false, message: "This meeting is not connected." };
1516
- try {
1517
- await runtime.engine.moveToBreakout(roomId);
1518
- return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
1519
- } catch (error) {
1520
- return { ok: false, message: error.message ?? "That room could not be joined." };
1521
- }
1522
- }
1523
- function untranslatedLines(lines, translations) {
1524
- return lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text }) => ({ id, text }));
1525
- }
1526
- function nextTranslationBatch(pending, language, asked) {
1527
- const batch = pending.filter((line) => !asked.has(`${language}:${line.id}`)).slice(-20);
1528
- for (const line of batch) asked.add(`${language}:${line.id}`);
1529
- return batch;
1530
- }
1531
- function setCaptionLanguage(store, next) {
1532
- store.patch({
1533
- collab: {
1534
- ...store.snapshot().collab,
1535
- captionLanguage: next,
1536
- captionTranslations: {},
1537
- captionTranslationError: null
1538
- }
1539
- });
1540
- }
1541
- function takePanelRequest(store) {
1542
- const request = store.snapshot().collab.panelRequest;
1543
- if (request === null) return null;
1544
- store.patch({ collab: { ...store.snapshot().collab, panelRequest: null } });
1545
- return request.panel;
1546
- }
1547
- function takeMoveRequest(store) {
1548
- const request = store.snapshot().collab.moveRequest;
1549
- if (request === null) return null;
1550
- store.patch({ collab: { ...store.snapshot().collab, moveRequest: null } });
1551
- return { roomId: request.roomId };
1552
- }
1553
-
1554
1593
  // src/react/collab-hooks.ts
1555
- var import_react6 = require("react");
1594
+ var import_react7 = require("react");
1556
1595
  function useCollab() {
1557
1596
  const host = useMeetHost();
1558
1597
  const snapshot = useMeetSnapshot();
@@ -1579,13 +1618,13 @@ function useCaptionTranslation(lines) {
1579
1618
  const snapshot = useMeetSnapshot();
1580
1619
  const collab = snapshot?.collab ?? null;
1581
1620
  const language = collab?.captionLanguage ?? null;
1582
- const asked = (0, import_react6.useRef)(/* @__PURE__ */ new Set());
1621
+ const asked = (0, import_react7.useRef)(/* @__PURE__ */ new Set());
1583
1622
  const translations = collab?.captionTranslations ?? {};
1584
1623
  const missing = untranslatedLines(lines, translations);
1585
1624
  const key = `${language ?? ""}|${missing.map((l) => l.id).join(",")}`;
1586
- const pending = (0, import_react6.useRef)(missing);
1625
+ const pending = (0, import_react7.useRef)(missing);
1587
1626
  pending.current = missing;
1588
- (0, import_react6.useEffect)(() => {
1627
+ (0, import_react7.useEffect)(() => {
1589
1628
  if (host === null || language === null) return;
1590
1629
  const batch = nextTranslationBatch(pending.current, language, asked.current);
1591
1630
  if (batch.length === 0) return;
@@ -1596,9 +1635,9 @@ function useCaptionTranslation(lines) {
1596
1635
  function useCollabPanelRequest(onRequest) {
1597
1636
  const host = useMeetHost();
1598
1637
  const at = useMeetSnapshot()?.collab.panelRequest?.at ?? null;
1599
- const callback = (0, import_react6.useRef)(onRequest);
1638
+ const callback = (0, import_react7.useRef)(onRequest);
1600
1639
  callback.current = onRequest;
1601
- (0, import_react6.useEffect)(() => {
1640
+ (0, import_react7.useEffect)(() => {
1602
1641
  if (host === null) return;
1603
1642
  const panel = takePanelRequest(host.store);
1604
1643
  if (panel === null) return;
@@ -1617,7 +1656,7 @@ function useMeetCore() {
1617
1656
  const role = useRole();
1618
1657
  const isHost = useIsHost();
1619
1658
  const observation = useCoreObservation();
1620
- return (0, import_react7.useMemo)(
1659
+ return (0, import_react8.useMemo)(
1621
1660
  () => ({ host, snapshot, devices, role, isHost, observation }),
1622
1661
  [host, snapshot, devices, role, isHost, observation]
1623
1662
  );
@@ -1627,12 +1666,12 @@ function useMeetCore() {
1627
1666
  var import_design_system = require("@ai-matrx/design-system");
1628
1667
 
1629
1668
  // src/skins/meet/collab.tsx
1630
- var import_react8 = require("react");
1669
+ var import_react9 = require("react");
1631
1670
 
1632
1671
  // src/skins/meet/icons.tsx
1633
- var import_jsx_runtime3 = require("react/jsx-runtime");
1672
+ var import_jsx_runtime4 = require("react/jsx-runtime");
1634
1673
  function Icon({ children, ...props }) {
1635
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1674
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1636
1675
  "svg",
1637
1676
  {
1638
1677
  width: "20",
@@ -1651,227 +1690,227 @@ function Icon({ children, ...props }) {
1651
1690
  );
1652
1691
  }
1653
1692
  function MicIcon(props) {
1654
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1655
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
1656
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
1657
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 19v3" })
1693
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1694
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
1695
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
1696
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 19v3" })
1658
1697
  ] });
1659
1698
  }
1660
1699
  function MicOffIcon(props) {
1661
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1662
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M2 2l20 20" }),
1663
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
1664
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15 9.34V5a3 3 0 0 0-5.94-.6" }),
1665
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M19 10v2a7 7 0 0 1-.11 1.23M5 10v2a7 7 0 0 0 11 5.66" }),
1666
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 19v3" })
1700
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1701
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 2l20 20" }),
1702
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
1703
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M15 9.34V5a3 3 0 0 0-5.94-.6" }),
1704
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 10v2a7 7 0 0 1-.11 1.23M5 10v2a7 7 0 0 0 11 5.66" }),
1705
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 19v3" })
1667
1706
  ] });
1668
1707
  }
1669
1708
  function CameraIcon(props) {
1670
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1671
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m23 7-7 5 7 5V7Z" }),
1672
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2" })
1709
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1710
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m23 7-7 5 7 5V7Z" }),
1711
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2" })
1673
1712
  ] });
1674
1713
  }
1675
1714
  function CameraOffIcon(props) {
1676
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1677
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M2 2l20 20" }),
1678
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M10.66 5H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10" }),
1679
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M16 16a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2" })
1715
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1716
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 2l20 20" }),
1717
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10.66 5H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10" }),
1718
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 16a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2" })
1680
1719
  ] });
1681
1720
  }
1682
1721
  function ScreenShareIcon(props) {
1683
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1684
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1685
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8 21h8M12 17v4" }),
1686
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 13V8m0 0-2.5 2.5M12 8l2.5 2.5" })
1722
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1723
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1724
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 21h8M12 17v4" }),
1725
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 13V8m0 0-2.5 2.5M12 8l2.5 2.5" })
1687
1726
  ] });
1688
1727
  }
1689
1728
  function PhoneIcon(props) {
1690
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.79 19.79 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.9.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92Z" }) });
1729
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.79 19.79 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.9.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92Z" }) });
1691
1730
  }
1692
1731
  function PhoneOffIcon(props) {
1693
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { fill: "currentColor", stroke: "none", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.99.99 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9Z" }) });
1732
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { fill: "currentColor", stroke: "none", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.99.99 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9Z" }) });
1694
1733
  }
1695
1734
  function HandIcon(props) {
1696
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1697
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M18 11V6a2 2 0 0 0-4 0v5" }),
1698
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M14 10V4a2 2 0 0 0-4 0v7" }),
1699
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M10 10.5V6a2 2 0 0 0-4 0v8" }),
1700
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2a8 8 0 0 1-8-8v-1a2 2 0 1 1 4 0" })
1735
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1736
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 11V6a2 2 0 0 0-4 0v5" }),
1737
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M14 10V4a2 2 0 0 0-4 0v7" }),
1738
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 10.5V6a2 2 0 0 0-4 0v8" }),
1739
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2a8 8 0 0 1-8-8v-1a2 2 0 1 1 4 0" })
1701
1740
  ] });
1702
1741
  }
1703
1742
  function ChatIcon(props) {
1704
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z" }) });
1743
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z" }) });
1705
1744
  }
1706
1745
  function PeopleIcon(props) {
1707
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1708
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
1709
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
1710
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" })
1746
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1747
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
1748
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
1749
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" })
1711
1750
  ] });
1712
1751
  }
1713
1752
  function RecordIcon(props) {
1714
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "8", fill: "currentColor", stroke: "none" }) });
1753
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "8", fill: "currentColor", stroke: "none" }) });
1715
1754
  }
1716
1755
  function SparklesIcon(props) {
1717
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1718
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3Z" }),
1719
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M19 15l.9 2.1 2.1.9-2.1.9-.9 2.1-.9-2.1-2.1-.9 2.1-.9L19 15Z" })
1756
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1757
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3Z" }),
1758
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 15l.9 2.1 2.1.9-2.1.9-.9 2.1-.9-2.1-2.1-.9 2.1-.9L19 15Z" })
1720
1759
  ] });
1721
1760
  }
1722
1761
  function LockIcon(props) {
1723
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1724
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "4", y: "10", width: "16", height: "11", rx: "2" }),
1725
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
1762
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1763
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "4", y: "10", width: "16", height: "11", rx: "2" }),
1764
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
1726
1765
  ] });
1727
1766
  }
1728
1767
  function LayoutIcon(props) {
1729
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1730
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
1731
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M3 9h18M9 21V9" })
1768
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1769
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
1770
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M3 9h18M9 21V9" })
1732
1771
  ] });
1733
1772
  }
1734
1773
  function SettingsIcon(props) {
1735
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1736
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
1737
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.6a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z" })
1774
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1775
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
1776
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.6a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z" })
1738
1777
  ] });
1739
1778
  }
1740
1779
  function CheckIcon(props) {
1741
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M20 6 9 17l-5-5" }) });
1780
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M20 6 9 17l-5-5" }) });
1742
1781
  }
1743
1782
  function CloseIcon(props) {
1744
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M18 6 6 18M6 6l12 12" }) });
1783
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 6 6 18M6 6l12 12" }) });
1745
1784
  }
1746
1785
  function PinIcon(props) {
1747
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1748
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 17v5" }),
1749
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
1786
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1787
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 17v5" }),
1788
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
1750
1789
  ] });
1751
1790
  }
1752
1791
  function WifiLowIcon(props) {
1753
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1754
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 20h.01" }),
1755
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8.5 16.5a5 5 0 0 1 7 0" })
1792
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1793
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 20h.01" }),
1794
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8.5 16.5a5 5 0 0 1 7 0" })
1756
1795
  ] });
1757
1796
  }
1758
1797
  function SmileIcon(props) {
1759
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1760
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
1761
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
1762
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
1763
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" })
1798
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1799
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
1800
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
1801
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
1802
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" })
1764
1803
  ] });
1765
1804
  }
1766
1805
  function MoreIcon(props) {
1767
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1768
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "1" }),
1769
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "19", cy: "12", r: "1" }),
1770
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "5", cy: "12", r: "1" })
1806
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1807
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "1" }),
1808
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "19", cy: "12", r: "1" }),
1809
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "5", cy: "12", r: "1" })
1771
1810
  ] });
1772
1811
  }
1773
1812
  function SearchIcon(props) {
1774
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1775
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "11", cy: "11", r: "8" }),
1776
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m21 21-4.3-4.3" })
1813
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1814
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "11", cy: "11", r: "8" }),
1815
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m21 21-4.3-4.3" })
1777
1816
  ] });
1778
1817
  }
1779
1818
  function KeyboardIcon(props) {
1780
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1781
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10M8 12h.01" }),
1782
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" })
1819
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1820
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10M8 12h.01" }),
1821
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" })
1783
1822
  ] });
1784
1823
  }
1785
1824
  function SpotlightIcon(props) {
1786
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 2 15 8.5 22 9.3 17 14 18.2 21 12 17.6 5.8 21 7 14 2 9.3 9 8.5Z" }) });
1825
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 2 15 8.5 22 9.3 17 14 18.2 21 12 17.6 5.8 21 7 14 2 9.3 9 8.5Z" }) });
1787
1826
  }
1788
1827
  function SignalIcon({ bars, ...props }) {
1789
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1790
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M4 20v-2", opacity: bars >= 1 ? 1 : 0.3 }),
1791
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M10 20v-6", opacity: bars >= 2 ? 1 : 0.3 }),
1792
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M16 20V9", opacity: bars >= 3 ? 1 : 0.3 }),
1793
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M22 20V4", opacity: bars >= 3 ? 1 : 0.3 })
1828
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1829
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 20v-2", opacity: bars >= 1 ? 1 : 0.3 }),
1830
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 20v-6", opacity: bars >= 2 ? 1 : 0.3 }),
1831
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 20V9", opacity: bars >= 3 ? 1 : 0.3 }),
1832
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 20V4", opacity: bars >= 3 ? 1 : 0.3 })
1794
1833
  ] });
1795
1834
  }
1796
1835
  function SpeakerIcon(props) {
1797
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1798
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M11 5 6 9H2v6h4l5 4V5Z" }),
1799
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" }),
1800
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" })
1836
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1837
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M11 5 6 9H2v6h4l5 4V5Z" }),
1838
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" }),
1839
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" })
1801
1840
  ] });
1802
1841
  }
1803
1842
  function FlagIcon(props) {
1804
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1805
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" }),
1806
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "4", x2: "4", y1: "22", y2: "15" })
1843
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1844
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" }),
1845
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "4", x2: "4", y1: "22", y2: "15" })
1807
1846
  ] });
1808
1847
  }
1809
1848
  function PencilIcon(props) {
1810
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" }) });
1849
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" }) });
1811
1850
  }
1812
1851
  function ActivitiesIcon(props) {
1813
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1814
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z" }),
1815
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
1816
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "17.5", cy: "17.5", r: "3.5" })
1852
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1853
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z" }),
1854
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
1855
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "17.5", cy: "17.5", r: "3.5" })
1817
1856
  ] });
1818
1857
  }
1819
1858
  function PollIcon(props) {
1820
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1821
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "18", x2: "18", y1: "20", y2: "10" }),
1822
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "12", x2: "12", y1: "20", y2: "4" }),
1823
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "6", x2: "6", y1: "20", y2: "14" })
1859
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1860
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "18", x2: "18", y1: "20", y2: "10" }),
1861
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "12", x2: "12", y1: "20", y2: "4" }),
1862
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "6", x2: "6", y1: "20", y2: "14" })
1824
1863
  ] });
1825
1864
  }
1826
1865
  function QuestionIcon(props) {
1827
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1828
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
1829
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
1830
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M12 17h.01" })
1866
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1867
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
1868
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
1869
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 17h.01" })
1831
1870
  ] });
1832
1871
  }
1833
1872
  function WhiteboardIcon(props) {
1834
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1835
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M2 3h20" }),
1836
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" }),
1837
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m7 21 5-5 5 5" })
1873
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1874
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 3h20" }),
1875
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" }),
1876
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m7 21 5-5 5 5" })
1838
1877
  ] });
1839
1878
  }
1840
1879
  function BreakoutIcon(props) {
1841
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1842
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { width: "7", height: "18", x: "3", y: "3", rx: "1" }),
1843
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { width: "7", height: "7", x: "14", y: "3", rx: "1" }),
1844
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { width: "7", height: "7", x: "14", y: "14", rx: "1" })
1880
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1881
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "18", x: "3", y: "3", rx: "1" }),
1882
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "7", x: "14", y: "3", rx: "1" }),
1883
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "7", x: "14", y: "14", rx: "1" })
1845
1884
  ] });
1846
1885
  }
1847
1886
  function UpvoteIcon(props) {
1848
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M9 18v-6H5l7-7 7 7h-4v6H9z" }) });
1887
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 18v-6H5l7-7 7 7h-4v6H9z" }) });
1849
1888
  }
1850
1889
  function EraserIcon(props) {
1851
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1852
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21" }),
1853
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M22 21H7" }),
1854
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m5 11 9 9" })
1890
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1891
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21" }),
1892
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 21H7" }),
1893
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m5 11 9 9" })
1855
1894
  ] });
1856
1895
  }
1857
1896
  function HighlighterIcon(props) {
1858
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1859
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m9 11-6 6v3h9l3-3" }),
1860
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4" })
1897
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1898
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m9 11-6 6v3h9l3-3" }),
1899
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4" })
1861
1900
  ] });
1862
1901
  }
1863
1902
  function UndoIcon(props) {
1864
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Icon, { ...props, children: [
1865
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M9 14 4 9l5-5" }),
1866
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11" })
1903
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
1904
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 14 4 9l5-5" }),
1905
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11" })
1867
1906
  ] });
1868
1907
  }
1869
1908
 
1870
1909
  // src/skins/meet/collab.tsx
1871
- var import_jsx_runtime4 = require("react/jsx-runtime");
1910
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1872
1911
  function useNotice() {
1873
- const [notice, setNotice] = (0, import_react8.useState)(null);
1874
- (0, import_react8.useEffect)(() => {
1912
+ const [notice, setNotice] = (0, import_react9.useState)(null);
1913
+ (0, import_react9.useEffect)(() => {
1875
1914
  if (notice === null) return void 0;
1876
1915
  const timer = setTimeout(() => setNotice(null), notice.failed ? 7e3 : 3e3);
1877
1916
  return () => clearTimeout(timer);
@@ -1880,7 +1919,7 @@ function useNotice() {
1880
1919
  }
1881
1920
  function Notice({ notice }) {
1882
1921
  if (notice === null) return null;
1883
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: notice.failed ? "mx-meet__panel-note mx-meet__collab-error" : "mx-meet__panel-note", role: "status", children: notice.text });
1922
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: notice.failed ? "mx-meet__panel-note mx-meet__collab-error" : "mx-meet__panel-note", role: "status", children: notice.text });
1884
1923
  }
1885
1924
  var ACTIVITY_LABELS = {
1886
1925
  polls: "Polls",
@@ -1890,25 +1929,25 @@ var ACTIVITY_LABELS = {
1890
1929
  };
1891
1930
  function ActivityIcon({ panel }) {
1892
1931
  const props = { width: 16, height: 16 };
1893
- if (panel === "polls") return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PollIcon, { ...props });
1894
- if (panel === "qa") return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(QuestionIcon, { ...props });
1895
- if (panel === "whiteboard") return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(WhiteboardIcon, { ...props });
1896
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BreakoutIcon, { ...props });
1932
+ if (panel === "polls") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollIcon, { ...props });
1933
+ if (panel === "qa") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QuestionIcon, { ...props });
1934
+ if (panel === "whiteboard") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(WhiteboardIcon, { ...props });
1935
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutIcon, { ...props });
1897
1936
  }
1898
1937
  function ActivitiesControl({
1899
1938
  active,
1900
1939
  onOpen
1901
1940
  }) {
1902
- const [open, setOpen] = (0, import_react8.useState)(false);
1941
+ const [open, setOpen] = (0, import_react9.useState)(false);
1903
1942
  const available = useAvailableActivities();
1904
1943
  const attention = useActivityAttention();
1905
1944
  if (available.length === 0) return null;
1906
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "mx-meet__anchor", children: [
1907
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ControlButton, { label: "Activities", active: open || active !== null, onClick: () => setOpen(!open), children: [
1908
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ActivitiesIcon, {}),
1909
- attention ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
1945
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
1946
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(ControlButton, { label: "Activities", active: open || active !== null, onClick: () => setOpen(!open), children: [
1947
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActivitiesIcon, {}),
1948
+ attention ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
1910
1949
  ] }),
1911
- open ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Popover, { label: "Activities", onClose: () => setOpen(false), children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__menu", role: "menu", children: available.map((panel) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1950
+ open ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: "Activities", onClose: () => setOpen(false), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__menu", role: "menu", children: available.map((panel) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1912
1951
  MenuItem,
1913
1952
  {
1914
1953
  onSelect: () => {
@@ -1916,7 +1955,7 @@ function ActivitiesControl({
1916
1955
  onOpen(panel);
1917
1956
  },
1918
1957
  children: [
1919
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ActivityIcon, { panel }),
1958
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActivityIcon, { panel }),
1920
1959
  " ",
1921
1960
  ACTIVITY_LABELS[panel]
1922
1961
  ]
@@ -1927,11 +1966,11 @@ function ActivitiesControl({
1927
1966
  }
1928
1967
  function PollComposer({ maxOptions, onDone }) {
1929
1968
  const { act } = useCollab();
1930
- const [question, setQuestion] = (0, import_react8.useState)("");
1931
- const [options, setOptions] = (0, import_react8.useState)(["", ""]);
1932
- const [multiple, setMultiple] = (0, import_react8.useState)(false);
1933
- const [anonymous, setAnonymous] = (0, import_react8.useState)(false);
1934
- const [busy, setBusy] = (0, import_react8.useState)(false);
1969
+ const [question, setQuestion] = (0, import_react9.useState)("");
1970
+ const [options, setOptions] = (0, import_react9.useState)(["", ""]);
1971
+ const [multiple, setMultiple] = (0, import_react9.useState)(false);
1972
+ const [anonymous, setAnonymous] = (0, import_react9.useState)(false);
1973
+ const [busy, setBusy] = (0, import_react9.useState)(false);
1935
1974
  const [notice, show] = useNotice();
1936
1975
  const filled = options.map((o) => o.trim()).filter(Boolean);
1937
1976
  const ready = question.trim().length > 0 && filled.length >= 2;
@@ -1954,7 +1993,7 @@ function PollComposer({ maxOptions, onDone }) {
1954
1993
  setBusy(false);
1955
1994
  onDone();
1956
1995
  };
1957
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1996
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1958
1997
  "form",
1959
1998
  {
1960
1999
  className: "mx-meet__collab-card",
@@ -1963,9 +2002,9 @@ function PollComposer({ maxOptions, onDone }) {
1963
2002
  if (ready) void save(true);
1964
2003
  },
1965
2004
  children: [
1966
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__field", children: [
1967
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: "Question" }),
1968
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2005
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
2006
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Question" }),
2007
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1969
2008
  "input",
1970
2009
  {
1971
2010
  className: "mx-meet__input",
@@ -1977,8 +2016,8 @@ function PollComposer({ maxOptions, onDone }) {
1977
2016
  }
1978
2017
  )
1979
2018
  ] }),
1980
- options.map((option, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__composer-row", children: [
1981
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2019
+ options.map((option, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__composer-row", children: [
2020
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1982
2021
  "input",
1983
2022
  {
1984
2023
  className: "mx-meet__input",
@@ -1989,22 +2028,22 @@ function PollComposer({ maxOptions, onDone }) {
1989
2028
  onChange: (event) => setOptions(options.map((o, i) => i === index ? event.target.value : o))
1990
2029
  }
1991
2030
  ),
1992
- options.length > 2 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ControlButton, { label: `Remove answer ${index + 1}`, onClick: () => setOptions(options.filter((_, i) => i !== index)), children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CloseIcon, { width: 14, height: 14 }) }) : null
2031
+ options.length > 2 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: `Remove answer ${index + 1}`, onClick: () => setOptions(options.filter((_, i) => i !== index)), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 14, height: 14 }) }) : null
1993
2032
  ] }, index)),
1994
- options.length < maxOptions ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setOptions([...options, ""]), children: "Add an answer" }) : null,
1995
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
1996
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { type: "checkbox", checked: multiple, onChange: (event) => setMultiple(event.target.checked) }),
2033
+ options.length < maxOptions ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setOptions([...options, ""]), children: "Add an answer" }) : null,
2034
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
2035
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: multiple, onChange: (event) => setMultiple(event.target.checked) }),
1997
2036
  "People can pick more than one"
1998
2037
  ] }),
1999
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
2000
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
2038
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
2039
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
2001
2040
  "Anonymous \u2014 nobody sees who picked what"
2002
2041
  ] }),
2003
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2004
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2005
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "submit", className: "mx-meet__primary mx-meet__primary--small", disabled: !ready || busy, children: "Launch" }),
2006
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", disabled: !ready || busy, onClick: () => void save(false), children: "Save draft" }),
2007
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__link", onClick: onDone, children: "Cancel" })
2042
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2043
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2044
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__primary mx-meet__primary--small", disabled: !ready || busy, children: "Launch" }),
2045
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", disabled: !ready || busy, onClick: () => void save(false), children: "Save draft" }),
2046
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: onDone, children: "Cancel" })
2008
2047
  ] })
2009
2048
  ]
2010
2049
  }
@@ -2012,9 +2051,9 @@ function PollComposer({ maxOptions, onDone }) {
2012
2051
  }
2013
2052
  function PollCard({ poll }) {
2014
2053
  const { act, isHost } = useCollab();
2015
- const [picked, setPicked] = (0, import_react8.useState)(poll.myVote.slice());
2054
+ const [picked, setPicked] = (0, import_react9.useState)(poll.myVote.slice());
2016
2055
  const [notice, show] = useNotice();
2017
- (0, import_react8.useEffect)(() => setPicked(poll.myVote.slice()), [poll.myVote]);
2056
+ (0, import_react9.useEffect)(() => setPicked(poll.myVote.slice()), [poll.myVote]);
2018
2057
  const counts = poll.options.some((o) => o.votes !== void 0);
2019
2058
  const total = poll.options.reduce((sum, o) => sum + (o.votes ?? 0), 0);
2020
2059
  const canVote = poll.state === "live";
@@ -2024,22 +2063,22 @@ function PollCard({ poll }) {
2024
2063
  if (!canVote) return;
2025
2064
  setPicked(poll.multiple ? picked.includes(id) ? picked.filter((p) => p !== id) : [...picked, id] : [id]);
2026
2065
  };
2027
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("article", { className: "mx-meet__collab-card", "aria-label": poll.question, children: [
2028
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { className: "mx-meet__collab-head", children: [
2029
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { className: "mx-meet__collab-title", children: poll.question }),
2030
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__collab-state", children: stateWord })
2066
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("article", { className: "mx-meet__collab-card", "aria-label": poll.question, children: [
2067
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__collab-head", children: [
2068
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { className: "mx-meet__collab-title", children: poll.question }),
2069
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: stateWord })
2031
2070
  ] }),
2032
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("p", { className: "mx-meet__panel-note", children: [
2071
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
2033
2072
  poll.multiple ? "Pick any." : "Pick one.",
2034
2073
  poll.anonymous ? " Anonymous." : "",
2035
2074
  counts && poll.voterCount !== null ? ` ${poll.voterCount} voted.` : "",
2036
2075
  isHost && poll.state !== "draft" && !poll.resultsShared ? " Results are visible only to hosts." : ""
2037
2076
  ] }),
2038
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__poll-options", children: poll.options.map((option) => {
2077
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__poll-options", children: poll.options.map((option) => {
2039
2078
  const share = counts && total > 0 ? Math.round((option.votes ?? 0) / total * 100) : 0;
2040
2079
  const chosen = picked.includes(option.id);
2041
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { children: [
2042
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2080
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { children: [
2081
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2043
2082
  "button",
2044
2083
  {
2045
2084
  type: "button",
@@ -2048,9 +2087,9 @@ function PollCard({ poll }) {
2048
2087
  disabled: !canVote,
2049
2088
  onClick: () => toggle(option.id),
2050
2089
  children: [
2051
- counts ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__poll-bar", style: { width: `${share}%` }, "aria-hidden": "true" }) : null,
2052
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__poll-text", children: option.text }),
2053
- counts ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "mx-meet__poll-count", children: [
2090
+ counts ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-bar", style: { width: `${share}%` }, "aria-hidden": "true" }) : null,
2091
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-text", children: option.text }),
2092
+ counts ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__poll-count", children: [
2054
2093
  option.votes ?? 0,
2055
2094
  " \xB7 ",
2056
2095
  share,
@@ -2059,12 +2098,12 @@ function PollCard({ poll }) {
2059
2098
  ]
2060
2099
  }
2061
2100
  ),
2062
- option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__poll-voters", children: option.voters.join(", ") }) : null
2101
+ option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-voters", children: option.voters.join(", ") }) : null
2063
2102
  ] }, option.id);
2064
2103
  }) }),
2065
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2066
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2067
- canVote ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2104
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2105
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2106
+ canVote ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2068
2107
  "button",
2069
2108
  {
2070
2109
  type: "button",
@@ -2074,35 +2113,35 @@ function PollCard({ poll }) {
2074
2113
  children: voted ? "Change vote" : "Vote"
2075
2114
  }
2076
2115
  ) : null,
2077
- isHost && poll.state === "draft" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => void act({ action: "poll_launch", itemId: poll.id }).then(show), children: "Launch" }) : null,
2078
- isHost && poll.state === "live" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_close", itemId: poll.id }).then(show), children: "End poll" }) : null,
2079
- isHost && poll.state !== "draft" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_share", itemId: poll.id }).then(show), children: poll.resultsShared ? "Hide results" : "Share results" }) : null,
2080
- isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "poll_delete", itemId: poll.id }).then(show), children: "Delete" }) : null
2116
+ isHost && poll.state === "draft" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => void act({ action: "poll_launch", itemId: poll.id }).then(show), children: "Launch" }) : null,
2117
+ isHost && poll.state === "live" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_close", itemId: poll.id }).then(show), children: "End poll" }) : null,
2118
+ isHost && poll.state !== "draft" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_share", itemId: poll.id }).then(show), children: poll.resultsShared ? "Hide results" : "Share results" }) : null,
2119
+ isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "poll_delete", itemId: poll.id }).then(show), children: "Delete" }) : null
2081
2120
  ] })
2082
2121
  ] });
2083
2122
  }
2084
2123
  function PollsPanel({ onClose }) {
2085
2124
  const { collab, isHost } = useCollab();
2086
- const [composing, setComposing] = (0, import_react8.useState)(false);
2125
+ const [composing, setComposing] = (0, import_react9.useState)(false);
2087
2126
  const polls = collab?.polls ?? [];
2088
2127
  const maxOptions = collab?.settings?.pollMaxOptions ?? 10;
2089
2128
  const ordered = [...polls].reverse();
2090
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(PanelShell, { title: "Polls", onClose, children: [
2091
- collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2092
- isHost && !composing ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => setComposing(true), children: "New poll" }) : null,
2093
- isHost && composing ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PollComposer, { maxOptions, onDone: () => setComposing(false) }) : null,
2094
- ordered.length === 0 && !composing ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note", children: isHost ? "No polls yet. Polls and their results are kept with the meeting." : "No polls yet." }) : null,
2095
- ordered.map((poll) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PollCard, { poll }, poll.id))
2129
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Polls", onClose, children: [
2130
+ collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2131
+ isHost && !composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => setComposing(true), children: "New poll" }) : null,
2132
+ isHost && composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollComposer, { maxOptions, onDone: () => setComposing(false) }) : null,
2133
+ ordered.length === 0 && !composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: isHost ? "No polls yet. Polls and their results are kept with the meeting." : "No polls yet." }) : null,
2134
+ ordered.map((poll) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollCard, { poll }, poll.id))
2096
2135
  ] });
2097
2136
  }
2098
2137
  function QuestionCard({ question }) {
2099
2138
  const { act, isHost } = useCollab();
2100
- const [answering, setAnswering] = (0, import_react8.useState)(false);
2101
- const [reply, setReply] = (0, import_react8.useState)("");
2139
+ const [answering, setAnswering] = (0, import_react9.useState)(false);
2140
+ const [reply, setReply] = (0, import_react9.useState)("");
2102
2141
  const [notice, show] = useNotice();
2103
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { className: `mx-meet__collab-card mx-meet__question mx-meet__question--${question.state}`, children: [
2104
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__question-row", children: [
2105
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2142
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: `mx-meet__collab-card mx-meet__question mx-meet__question--${question.state}`, children: [
2143
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__question-row", children: [
2144
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2106
2145
  "button",
2107
2146
  {
2108
2147
  type: "button",
@@ -2112,20 +2151,20 @@ function QuestionCard({ question }) {
2112
2151
  disabled: question.state === "dismissed",
2113
2152
  onClick: () => void act({ action: "question_upvote", itemId: question.id }).then((r) => r.ok ? void 0 : show(r)),
2114
2153
  children: [
2115
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(UpvoteIcon, { width: 16, height: 16 }),
2116
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: question.upvotes })
2154
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UpvoteIcon, { width: 16, height: 16 }),
2155
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: question.upvotes })
2117
2156
  ]
2118
2157
  }
2119
2158
  ),
2120
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__question-body", children: [
2121
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "mx-meet__chat-meta", children: [
2122
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: question.mine ? "You" : question.askerName }),
2123
- question.mine && question.anonymous ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__chat-private", children: "anonymous" }) : null,
2124
- question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__collab-state", children: question.state === "answered" ? "Answered" : "Dismissed" }) : null
2159
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__question-body", children: [
2160
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__chat-meta", children: [
2161
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: question.mine ? "You" : question.askerName }),
2162
+ question.mine && question.anonymous ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-private", children: "anonymous" }) : null,
2163
+ question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: question.state === "answered" ? "Answered" : "Dismissed" }) : null
2125
2164
  ] }),
2126
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__chat-text", children: question.text }),
2127
- question.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "mx-meet__question-answer", children: [
2128
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("strong", { children: [
2165
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-text", children: question.text }),
2166
+ question.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__question-answer", children: [
2167
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
2129
2168
  question.answeredByName ?? "Host",
2130
2169
  ":"
2131
2170
  ] }),
@@ -2134,7 +2173,7 @@ function QuestionCard({ question }) {
2134
2173
  ] }) : null
2135
2174
  ] })
2136
2175
  ] }),
2137
- answering ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2176
+ answering ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2138
2177
  "form",
2139
2178
  {
2140
2179
  className: "mx-meet__composer-row",
@@ -2149,7 +2188,7 @@ function QuestionCard({ question }) {
2149
2188
  });
2150
2189
  },
2151
2190
  children: [
2152
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2191
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2153
2192
  "input",
2154
2193
  {
2155
2194
  className: "mx-meet__input",
@@ -2161,24 +2200,24 @@ function QuestionCard({ question }) {
2161
2200
  autoFocus: true
2162
2201
  }
2163
2202
  ),
2164
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "submit", className: "mx-meet__send", children: "Done" })
2203
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", children: "Done" })
2165
2204
  ]
2166
2205
  }
2167
2206
  ) : null,
2168
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2169
- isHost || question.mine ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2170
- isHost && question.state === "open" && !answering ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => setAnswering(true), children: "Answer" }) : null,
2171
- isHost && question.state === "open" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_dismiss", itemId: question.id }).then(show), children: "Dismiss" }) : null,
2172
- isHost && question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_reopen", itemId: question.id }).then(show), children: "Reopen" }) : null,
2173
- question.mine || isHost ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "question_delete", itemId: question.id }).then(show), children: "Delete" }) : null
2207
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2208
+ isHost || question.mine ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
2209
+ isHost && question.state === "open" && !answering ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => setAnswering(true), children: "Answer" }) : null,
2210
+ isHost && question.state === "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_dismiss", itemId: question.id }).then(show), children: "Dismiss" }) : null,
2211
+ isHost && question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_reopen", itemId: question.id }).then(show), children: "Reopen" }) : null,
2212
+ question.mine || isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "question_delete", itemId: question.id }).then(show), children: "Delete" }) : null
2174
2213
  ] }) : null
2175
2214
  ] });
2176
2215
  }
2177
2216
  function QaPanel({ onClose }) {
2178
2217
  const { collab, act } = useCollab();
2179
- const [draft, setDraft] = (0, import_react8.useState)("");
2180
- const [anonymous, setAnonymous] = (0, import_react8.useState)(false);
2181
- const [order, setOrder] = (0, import_react8.useState)("popular");
2218
+ const [draft, setDraft] = (0, import_react9.useState)("");
2219
+ const [anonymous, setAnonymous] = (0, import_react9.useState)(false);
2220
+ const [order, setOrder] = (0, import_react9.useState)("popular");
2182
2221
  const [notice, show] = useNotice();
2183
2222
  const allowAnonymous = collab?.settings?.qaAnonymousAllowed === true;
2184
2223
  const questions = [...collab?.questions ?? []];
@@ -2186,9 +2225,9 @@ function QaPanel({ onClose }) {
2186
2225
  questions.sort(
2187
2226
  (a, b) => rank(a) !== rank(b) ? rank(a) - rank(b) : order === "popular" ? b.upvotes - a.upvotes || (b.createdAt ?? "").localeCompare(a.createdAt ?? "") : (b.createdAt ?? "").localeCompare(a.createdAt ?? "")
2188
2227
  );
2189
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(PanelShell, { title: "Q&A", onClose, children: [
2190
- collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2191
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2228
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Q&A", onClose, children: [
2229
+ collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2230
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2192
2231
  "form",
2193
2232
  {
2194
2233
  className: "mx-meet__composer mx-meet__composer--chat",
@@ -2202,8 +2241,8 @@ function QaPanel({ onClose }) {
2202
2241
  });
2203
2242
  },
2204
2243
  children: [
2205
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__composer-row", children: [
2206
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2244
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__composer-row", children: [
2245
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2207
2246
  "input",
2208
2247
  {
2209
2248
  className: "mx-meet__input",
@@ -2214,17 +2253,17 @@ function QaPanel({ onClose }) {
2214
2253
  "aria-label": "Ask the host a question"
2215
2254
  }
2216
2255
  ),
2217
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Ask" })
2256
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Ask" })
2218
2257
  ] }),
2219
- allowAnonymous ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
2220
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
2258
+ allowAnonymous ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
2259
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
2221
2260
  "Ask anonymously"
2222
2261
  ] }) : null
2223
2262
  ]
2224
2263
  }
2225
2264
  ),
2226
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2227
- questions.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Order questions", children: ["popular", "recent"].map((value) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2265
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2266
+ questions.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Order questions", children: ["popular", "recent"].map((value) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2228
2267
  "button",
2229
2268
  {
2230
2269
  type: "button",
@@ -2235,7 +2274,7 @@ function QaPanel({ onClose }) {
2235
2274
  },
2236
2275
  value
2237
2276
  )) }) : null,
2238
- questions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note", children: "No questions yet. Questions are kept with the meeting." }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__chat", children: questions.map((question) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(QuestionCard, { question }, question.id)) })
2277
+ questions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "No questions yet. Questions are kept with the meeting." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__chat", children: questions.map((question) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QuestionCard, { question }, question.id)) })
2239
2278
  ] });
2240
2279
  }
2241
2280
  var BOARD_W = 1600;
@@ -2249,7 +2288,7 @@ function strokePath(points) {
2249
2288
  return `${move} ${rest.map(([x, y]) => `L${(x * BOARD_W).toFixed(1)} ${(y * BOARD_H).toFixed(1)}`).join(" ")}`;
2250
2289
  }
2251
2290
  function StrokeView({ stroke, onPick }) {
2252
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2291
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2253
2292
  "path",
2254
2293
  {
2255
2294
  d: strokePath(stroke.points),
@@ -2261,18 +2300,18 @@ function StrokeView({ stroke, onPick }) {
2261
2300
  strokeLinejoin: "round",
2262
2301
  onPointerDown: onPick,
2263
2302
  style: onPick !== void 0 ? { cursor: "pointer" } : void 0,
2264
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("title", { children: stroke.byName })
2303
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("title", { children: stroke.byName })
2265
2304
  }
2266
2305
  );
2267
2306
  }
2268
2307
  function WhiteboardPanel({ onClose }) {
2269
2308
  const { collab, act, isHost, localIdentity } = useCollab();
2270
- const [tool, setTool] = (0, import_react8.useState)("pen");
2271
- const [color, setColor] = (0, import_react8.useState)(INK[0]);
2272
- const [drawing, setDrawing] = (0, import_react8.useState)(null);
2273
- const [pending, setPending] = (0, import_react8.useState)([]);
2309
+ const [tool, setTool] = (0, import_react9.useState)("pen");
2310
+ const [color, setColor] = (0, import_react9.useState)(INK[0]);
2311
+ const [drawing, setDrawing] = (0, import_react9.useState)(null);
2312
+ const [pending, setPending] = (0, import_react9.useState)([]);
2274
2313
  const [notice, show] = useNotice();
2275
- const svgRef = (0, import_react8.useRef)(null);
2314
+ const svgRef = (0, import_react9.useRef)(null);
2276
2315
  const strokes = collab?.strokes ?? [];
2277
2316
  const mine = strokes.filter((s) => s.by === localIdentity);
2278
2317
  const point = (event) => {
@@ -2304,14 +2343,14 @@ function WhiteboardPanel({ onClose }) {
2304
2343
  if (!result.ok) show(result);
2305
2344
  });
2306
2345
  };
2307
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "mx-meet__whiteboard", "aria-label": "Whiteboard", children: [
2308
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { className: "mx-meet__whiteboard-bar", children: [
2309
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { className: "mx-meet__panel-title", children: "Whiteboard" }),
2310
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Tool", children: [
2311
- ["pen", "Pen", /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PencilIcon, { width: 16, height: 16 }, "p")],
2312
- ["highlighter", "Highlighter", /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HighlighterIcon, { width: 16, height: 16 }, "h")],
2313
- ["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(EraserIcon, { width: 16, height: 16 }, "e")]
2314
- ].map(([value, label, icon]) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2346
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__whiteboard", "aria-label": "Whiteboard", children: [
2347
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__whiteboard-bar", children: [
2348
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { className: "mx-meet__panel-title", children: "Whiteboard" }),
2349
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Tool", children: [
2350
+ ["pen", "Pen", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PencilIcon, { width: 16, height: 16 }, "p")],
2351
+ ["highlighter", "Highlighter", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HighlighterIcon, { width: 16, height: 16 }, "h")],
2352
+ ["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EraserIcon, { width: 16, height: 16 }, "e")]
2353
+ ].map(([value, label, icon]) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2315
2354
  "button",
2316
2355
  {
2317
2356
  type: "button",
@@ -2324,7 +2363,7 @@ function WhiteboardPanel({ onClose }) {
2324
2363
  },
2325
2364
  value
2326
2365
  )) }),
2327
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__swatches", role: "group", "aria-label": "Color", children: INK.map((ink) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2366
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__swatches", role: "group", "aria-label": "Color", children: INK.map((ink) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2328
2367
  "button",
2329
2368
  {
2330
2369
  type: "button",
@@ -2339,7 +2378,7 @@ function WhiteboardPanel({ onClose }) {
2339
2378
  },
2340
2379
  ink
2341
2380
  )) }),
2342
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2381
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2343
2382
  ControlButton,
2344
2383
  {
2345
2384
  label: "Undo my last stroke",
@@ -2347,15 +2386,15 @@ function WhiteboardPanel({ onClose }) {
2347
2386
  const last = mine[mine.length - 1];
2348
2387
  if (last !== void 0) void act({ action: "stroke_erase", itemId: last.id }).then((r) => r.ok ? void 0 : show(r));
2349
2388
  },
2350
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(UndoIcon, { width: 16, height: 16 })
2389
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UndoIcon, { width: 16, height: 16 })
2351
2390
  }
2352
2391
  ),
2353
- isHost && strokes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "whiteboard_clear" }).then(show), children: "Clear board" }) : null,
2354
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__whiteboard-note", children: "Saved with the meeting" }),
2355
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ControlButton, { label: "Close whiteboard", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CloseIcon, { width: 16, height: 16 }) })
2392
+ isHost && strokes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "whiteboard_clear" }).then(show), children: "Clear board" }) : null,
2393
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__whiteboard-note", children: "Saved with the meeting" }),
2394
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Close whiteboard", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 }) })
2356
2395
  ] }),
2357
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2358
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2396
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2397
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2359
2398
  "svg",
2360
2399
  {
2361
2400
  ref: svgRef,
@@ -2379,8 +2418,8 @@ function WhiteboardPanel({ onClose }) {
2379
2418
  onPointerUp: finish,
2380
2419
  onPointerCancel: finish,
2381
2420
  children: [
2382
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: 0, y: 0, width: BOARD_W, height: BOARD_H, className: "mx-meet__board-paper" }),
2383
- strokes.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2421
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("rect", { x: 0, y: 0, width: BOARD_W, height: BOARD_H, className: "mx-meet__board-paper" }),
2422
+ strokes.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2384
2423
  StrokeView,
2385
2424
  {
2386
2425
  stroke,
@@ -2388,8 +2427,8 @@ function WhiteboardPanel({ onClose }) {
2388
2427
  },
2389
2428
  stroke.id
2390
2429
  )),
2391
- pending.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(StrokeView, { stroke }, stroke.id)),
2392
- drawing !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2430
+ pending.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StrokeView, { stroke }, stroke.id)),
2431
+ drawing !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2393
2432
  StrokeView,
2394
2433
  {
2395
2434
  stroke: {
@@ -2413,8 +2452,8 @@ function clock(ms) {
2413
2452
  }
2414
2453
  var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
2415
2454
  function useNow(active) {
2416
- const [now, setNow] = (0, import_react8.useState)(() => Date.now());
2417
- (0, import_react8.useEffect)(() => {
2455
+ const [now, setNow] = (0, import_react9.useState)(() => Date.now());
2456
+ (0, import_react9.useEffect)(() => {
2418
2457
  if (!active) return void 0;
2419
2458
  const timer = setInterval(() => setNow(Date.now()), 1e3);
2420
2459
  return () => clearInterval(timer);
@@ -2428,11 +2467,11 @@ function BreakoutSetup() {
2428
2467
  const people = (snapshot?.participants ?? []).filter(
2429
2468
  (p) => !p.isAgent && p.role !== "host" && p.role !== "cohost"
2430
2469
  );
2431
- const [count, setCount] = (0, import_react8.useState)(Math.min(Math.max(2, Math.ceil(people.length / 4)), settings?.breakoutMaxRooms ?? 20));
2432
- const [mode, setMode] = (0, import_react8.useState)("auto");
2433
- const [minutes, setMinutes] = (0, import_react8.useState)(settings?.breakoutDefaultMinutes ?? 15);
2434
- const [manual, setManual] = (0, import_react8.useState)({});
2435
- const [busy, setBusy] = (0, import_react8.useState)(false);
2470
+ const [count, setCount] = (0, import_react9.useState)(Math.min(Math.max(2, Math.ceil(people.length / 4)), settings?.breakoutMaxRooms ?? 20));
2471
+ const [mode, setMode] = (0, import_react9.useState)("auto");
2472
+ const [minutes, setMinutes] = (0, import_react9.useState)(settings?.breakoutDefaultMinutes ?? 15);
2473
+ const [manual, setManual] = (0, import_react9.useState)({});
2474
+ const [busy, setBusy] = (0, import_react9.useState)(false);
2436
2475
  const [notice, show] = useNotice();
2437
2476
  const max = settings?.breakoutMaxRooms ?? 20;
2438
2477
  const rooms = Math.min(Math.max(1, count), max);
@@ -2444,10 +2483,10 @@ function BreakoutSetup() {
2444
2483
  (_, index) => people.filter((p) => (manual[p.identity] ?? -1) === index).map((p) => p.identity)
2445
2484
  ) : Array.from({ length: rooms }, () => []);
2446
2485
  const nameOf = (identity) => people.find((p) => p.identity === identity)?.displayName ?? identity;
2447
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-card", children: [
2448
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__field", children: [
2449
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: "Rooms" }),
2450
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2486
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-card", children: [
2487
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
2488
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Rooms" }),
2489
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2451
2490
  "input",
2452
2491
  {
2453
2492
  className: "mx-meet__input",
@@ -2459,11 +2498,11 @@ function BreakoutSetup() {
2459
2498
  }
2460
2499
  )
2461
2500
  ] }),
2462
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "How people are placed", children: [
2501
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "How people are placed", children: [
2463
2502
  ["auto", "Automatically"],
2464
2503
  ["manual", "Manually"],
2465
2504
  ["choose", "Let people choose"]
2466
- ].map(([value, label]) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2505
+ ].map(([value, label]) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2467
2506
  "button",
2468
2507
  {
2469
2508
  type: "button",
@@ -2474,9 +2513,9 @@ function BreakoutSetup() {
2474
2513
  },
2475
2514
  value
2476
2515
  )) }),
2477
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__field", children: [
2478
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: "Timer (minutes, 0 for none)" }),
2479
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2516
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
2517
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Timer (minutes, 0 for none)" }),
2518
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2480
2519
  "input",
2481
2520
  {
2482
2521
  className: "mx-meet__input",
@@ -2488,9 +2527,9 @@ function BreakoutSetup() {
2488
2527
  }
2489
2528
  )
2490
2529
  ] }),
2491
- mode === "manual" ? people.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note", children: "Nobody else is in the meeting yet." }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__people", children: people.map((person) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { className: "mx-meet__person", children: [
2492
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__person-name", children: person.displayName }),
2493
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2530
+ mode === "manual" ? people.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Nobody else is in the meeting yet." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__people", children: people.map((person) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
2531
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__person-name", children: person.displayName }),
2532
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2494
2533
  "select",
2495
2534
  {
2496
2535
  className: "mx-meet__select mx-meet__select--compact",
@@ -2498,24 +2537,24 @@ function BreakoutSetup() {
2498
2537
  value: manual[person.identity] ?? -1,
2499
2538
  onChange: (event) => setManual({ ...manual, [person.identity]: Number(event.target.value) }),
2500
2539
  children: [
2501
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: -1, children: "Main room" }),
2502
- Array.from({ length: rooms }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("option", { value: index, children: [
2540
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: -1, children: "Main room" }),
2541
+ Array.from({ length: rooms }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("option", { value: index, children: [
2503
2542
  "Room ",
2504
2543
  index + 1
2505
2544
  ] }, index))
2506
2545
  ]
2507
2546
  }
2508
2547
  )
2509
- ] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__breakout-rooms", children: assignment.map((members, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { children: [
2510
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("strong", { children: [
2548
+ ] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__breakout-rooms", children: assignment.map((members, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { children: [
2549
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
2511
2550
  "Room ",
2512
2551
  index + 1
2513
2552
  ] }),
2514
2553
  " ",
2515
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__panel-note", children: members.length === 0 ? "empty" : members.map(nameOf).join(", ") })
2516
- ] }, index)) }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note", children: "Everyone picks a room from their own screen." }),
2517
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2518
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2554
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__panel-note", children: members.length === 0 ? "empty" : members.map(nameOf).join(", ") })
2555
+ ] }, index)) }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Everyone picks a room from their own screen." }),
2556
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2557
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2519
2558
  "button",
2520
2559
  {
2521
2560
  type: "button",
@@ -2548,7 +2587,7 @@ function BreakoutRun({ plan }) {
2548
2587
  const snapshot = useMeetSnapshot();
2549
2588
  const now = useNow(plan.endsAt !== null);
2550
2589
  const remaining = breakoutRemainingMs(plan, now);
2551
- const [broadcast, setBroadcast] = (0, import_react8.useState)("");
2590
+ const [broadcast, setBroadcast] = (0, import_react9.useState)("");
2552
2591
  const [notice, show] = useNotice();
2553
2592
  const nameOf = (identity) => displayNameFor(snapshot?.names ?? {}, identity, snapshot?.participants.find((p) => p.identity === identity)?.displayName);
2554
2593
  const mine = assignedRoom(plan, localIdentity);
@@ -2560,8 +2599,8 @@ function BreakoutRun({ plan }) {
2560
2599
  }
2561
2600
  show(await moveTo(roomId));
2562
2601
  };
2563
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-card", children: [
2564
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("p", { className: "mx-meet__panel-note", children: [
2602
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-card", children: [
2603
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
2565
2604
  plan.rooms.length,
2566
2605
  " room",
2567
2606
  plan.rooms.length === 1 ? "" : "s",
@@ -2569,18 +2608,18 @@ function BreakoutRun({ plan }) {
2569
2608
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
2570
2609
  plan.allowChoose ? " \xB7 people choose their room" : ""
2571
2610
  ] }),
2572
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__breakout-rooms", children: plan.rooms.map((room) => {
2611
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__breakout-rooms", children: plan.rooms.map((room) => {
2573
2612
  const here = breakoutRoomId === room.id;
2574
2613
  const mayJoin = isHost || plan.allowChoose || mine?.id === room.id;
2575
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { className: here ? "mx-meet__breakout-room mx-meet__breakout-room--here" : "mx-meet__breakout-room", children: [
2576
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__collab-head", children: [
2577
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: room.name }),
2578
- here ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__collab-state", children: "You are here" }) : mayJoin ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(room.id), children: "Join" }) : null
2614
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: here ? "mx-meet__breakout-room mx-meet__breakout-room--here" : "mx-meet__breakout-room", children: [
2615
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-head", children: [
2616
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: room.name }),
2617
+ here ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: "You are here" }) : mayJoin ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(room.id), children: "Join" }) : null
2579
2618
  ] }),
2580
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__panel-note", children: room.identities.length === 0 ? "Nobody assigned" : room.identities.map(nameOf).join(", ") }),
2581
- isHost && room.identities.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "mx-meet__people", children: room.identities.map((identity) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("li", { className: "mx-meet__person", children: [
2582
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__person-name", children: nameOf(identity) }),
2583
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2619
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__panel-note", children: room.identities.length === 0 ? "Nobody assigned" : room.identities.map(nameOf).join(", ") }),
2620
+ isHost && room.identities.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__people", children: room.identities.map((identity) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
2621
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__person-name", children: nameOf(identity) }),
2622
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2584
2623
  "select",
2585
2624
  {
2586
2625
  className: "mx-meet__select mx-meet__select--compact",
@@ -2592,16 +2631,16 @@ function BreakoutRun({ plan }) {
2592
2631
  roomId: event.target.value === "" ? null : event.target.value
2593
2632
  }).then(show),
2594
2633
  children: [
2595
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: "", children: "Main room" }),
2596
- plan.rooms.map((option) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: option.id, children: option.name }, option.id))
2634
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: "", children: "Main room" }),
2635
+ plan.rooms.map((option) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: option.id, children: option.name }, option.id))
2597
2636
  ]
2598
2637
  }
2599
2638
  )
2600
2639
  ] }, identity)) }) : null
2601
2640
  ] }, room.id);
2602
2641
  }) }),
2603
- breakoutRoomId !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(null), children: "Return to the main room" }) : null,
2604
- isHost ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2642
+ breakoutRoomId !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(null), children: "Return to the main room" }) : null,
2643
+ isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2605
2644
  "form",
2606
2645
  {
2607
2646
  className: "mx-meet__composer-row",
@@ -2615,7 +2654,7 @@ function BreakoutRun({ plan }) {
2615
2654
  });
2616
2655
  },
2617
2656
  children: [
2618
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2657
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2619
2658
  "input",
2620
2659
  {
2621
2660
  className: "mx-meet__input",
@@ -2626,12 +2665,12 @@ function BreakoutRun({ plan }) {
2626
2665
  "aria-label": "Message every room"
2627
2666
  }
2628
2667
  ),
2629
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: broadcast.trim().length === 0, children: "Send" })
2668
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: broadcast.trim().length === 0, children: "Send" })
2630
2669
  ]
2631
2670
  }
2632
2671
  ) : null,
2633
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Notice, { notice }),
2634
- isHost ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2672
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
2673
+ isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2635
2674
  "button",
2636
2675
  {
2637
2676
  type: "button",
@@ -2645,9 +2684,9 @@ function BreakoutRun({ plan }) {
2645
2684
  function BreakoutsPanel({ onClose }) {
2646
2685
  const { collab, isHost } = useCollab();
2647
2686
  const plan = collab?.breakout?.state === "open" ? collab.breakout : null;
2648
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(PanelShell, { title: "Breakout rooms", onClose, children: [
2649
- collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2650
- plan !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BreakoutRun, { plan }) : isHost ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(BreakoutSetup, {}) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note", children: "Breakout rooms are closed." })
2687
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Breakout rooms", onClose, children: [
2688
+ collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
2689
+ plan !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutRun, { plan }) : isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutSetup, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Breakout rooms are closed." })
2651
2690
  ] });
2652
2691
  }
2653
2692
  function BreakoutBanner() {
@@ -2658,11 +2697,11 @@ function BreakoutBanner() {
2658
2697
  const now = useNow(open?.endsAt != null);
2659
2698
  const remaining = breakoutRemainingMs(open, now);
2660
2699
  const assigned = assignedRoom(open, localIdentity);
2661
- const [dismissedBroadcast, setDismissedBroadcast] = (0, import_react8.useState)(null);
2662
- const [failure, setFailure] = (0, import_react8.useState)(null);
2663
- const expireAsked = (0, import_react8.useRef)(null);
2700
+ const [dismissedBroadcast, setDismissedBroadcast] = (0, import_react9.useState)(null);
2701
+ const [failure, setFailure] = (0, import_react9.useState)(null);
2702
+ const expireAsked = (0, import_react9.useRef)(null);
2664
2703
  const moveAt = collab?.moveRequest?.at ?? null;
2665
- (0, import_react8.useEffect)(() => {
2704
+ (0, import_react9.useEffect)(() => {
2666
2705
  if (host === null) return;
2667
2706
  const request = takeMoveRequest(host.store);
2668
2707
  if (request === null) return;
@@ -2670,7 +2709,7 @@ function BreakoutBanner() {
2670
2709
  if ((here ?? null) === request.roomId) return;
2671
2710
  void moveTo(request.roomId).then((result) => setFailure(result.ok ? null : result.message));
2672
2711
  }, [moveAt, host, moveTo]);
2673
- (0, import_react8.useEffect)(() => {
2712
+ (0, import_react9.useEffect)(() => {
2674
2713
  if (open === null || remaining === null || remaining > 0) return;
2675
2714
  const asked = expireAsked.current;
2676
2715
  if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
@@ -2681,17 +2720,17 @@ function BreakoutBanner() {
2681
2720
  const showBroadcast = broadcast !== null && broadcast.at !== dismissedBroadcast && open !== null;
2682
2721
  const room = open?.rooms.find((r) => r.id === breakoutRoomId) ?? null;
2683
2722
  if (open === null && failure === null) return null;
2684
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__breakout-banner", role: "status", children: [
2685
- failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__collab-error", children: failure }) : null,
2686
- room !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
2687
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: room.name }),
2723
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__breakout-banner", role: "status", children: [
2724
+ failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-error", children: failure }) : null,
2725
+ room !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
2726
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: room.name }),
2688
2727
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
2689
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void moveTo(null), children: "Return to main room" })
2690
- ] }) : assigned !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
2728
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void moveTo(null), children: "Return to main room" })
2729
+ ] }) : assigned !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
2691
2730
  "You are assigned to ",
2692
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: assigned.name }),
2731
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: assigned.name }),
2693
2732
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
2694
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2733
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2695
2734
  "button",
2696
2735
  {
2697
2736
  type: "button",
@@ -2703,15 +2742,15 @@ function BreakoutBanner() {
2703
2742
  children: "Join"
2704
2743
  }
2705
2744
  )
2706
- ] }) : open?.allowChoose ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Breakout rooms are open \u2014 pick one under Activities." }) : null,
2707
- showBroadcast ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "mx-meet__breakout-broadcast", children: [
2708
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("strong", { children: [
2745
+ ] }) : open?.allowChoose ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "Breakout rooms are open \u2014 pick one under Activities." }) : null,
2746
+ showBroadcast ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__breakout-broadcast", children: [
2747
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
2709
2748
  broadcast.by,
2710
2749
  ":"
2711
2750
  ] }),
2712
2751
  " ",
2713
2752
  broadcast.text,
2714
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setDismissedBroadcast(broadcast.at), children: "Dismiss" })
2753
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setDismissedBroadcast(broadcast.at), children: "Dismiss" })
2715
2754
  ] }) : null
2716
2755
  ] });
2717
2756
  }
@@ -2725,10 +2764,10 @@ function CaptionLanguageSettings() {
2725
2764
  const preferred = defaultCaptionLanguage(settings, viewer);
2726
2765
  const current = collab?.captionLanguage ?? "";
2727
2766
  const choices = CAPTION_LANGUAGES.some((l) => l.tag === preferred) ? CAPTION_LANGUAGES : [{ tag: preferred, name: preferred }, ...CAPTION_LANGUAGES];
2728
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "mx-meet__section", "aria-label": "Captions", children: [
2729
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__field", children: [
2730
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: "Translate captions to" }),
2731
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
2767
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__section", "aria-label": "Captions", children: [
2768
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
2769
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Translate captions to" }),
2770
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2732
2771
  "select",
2733
2772
  {
2734
2773
  className: "mx-meet__select",
@@ -2738,29 +2777,29 @@ function CaptionLanguageSettings() {
2738
2777
  setCaptionLanguage(host.store, next);
2739
2778
  },
2740
2779
  children: [
2741
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: "", children: "Off \u2014 as spoken" }),
2742
- current === "" ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("option", { value: preferred, children: [
2780
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: "", children: "Off \u2014 as spoken" }),
2781
+ current === "" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("option", { value: preferred, children: [
2743
2782
  choices.find((c) => c.tag === preferred)?.name ?? preferred,
2744
2783
  " (yours)"
2745
2784
  ] }) : null,
2746
- choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: choice.tag, children: choice.name }, choice.tag))
2785
+ choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: choice.tag, children: choice.name }, choice.tag))
2747
2786
  ]
2748
2787
  }
2749
2788
  )
2750
2789
  ] }),
2751
- collab?.captionTranslationError != null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
2790
+ collab?.captionTranslationError != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
2752
2791
  ] });
2753
2792
  }
2754
2793
 
2755
2794
  // src/skins/meet/components.tsx
2756
- var import_jsx_runtime5 = require("react/jsx-runtime");
2795
+ var import_jsx_runtime6 = require("react/jsx-runtime");
2757
2796
  function InertNotice({ what }) {
2758
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__empty", role: "status", children: [
2759
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__empty-title", children: [
2797
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__empty", role: "status", children: [
2798
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__empty-title", children: [
2760
2799
  what,
2761
2800
  " is not ready yet"
2762
2801
  ] }),
2763
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__empty-body", children: "Calls and meetings need a signed-in identity and an active organization. This will appear as soon as they resolve." })
2802
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", children: "Calls and meetings need a signed-in identity and an active organization. This will appear as soon as they resolve." })
2764
2803
  ] });
2765
2804
  }
2766
2805
  function Avatar({
@@ -2770,7 +2809,7 @@ function Avatar({
2770
2809
  }) {
2771
2810
  const tint = (0, import_format2.avatarPaletteIndex)(name);
2772
2811
  if (url != null && url.length > 0) {
2773
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2812
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2774
2813
  "img",
2775
2814
  {
2776
2815
  className: "mx-meet__avatar",
@@ -2782,7 +2821,7 @@ function Avatar({
2782
2821
  }
2783
2822
  );
2784
2823
  }
2785
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2824
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2786
2825
  "span",
2787
2826
  {
2788
2827
  className: "mx-meet__avatar mx-meet__avatar--initials",
@@ -2804,7 +2843,7 @@ function ControlButton({
2804
2843
  onClick,
2805
2844
  children
2806
2845
  }) {
2807
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2846
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2808
2847
  "button",
2809
2848
  {
2810
2849
  type: "button",
@@ -2823,14 +2862,14 @@ function ControlButton({
2823
2862
  function RecordingIndicator() {
2824
2863
  const { state, label } = useRecording();
2825
2864
  if (label === null) return null;
2826
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2865
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2827
2866
  "span",
2828
2867
  {
2829
2868
  className: `mx-meet__recording mx-meet__recording--${state}`,
2830
2869
  role: "status",
2831
2870
  "aria-live": "polite",
2832
2871
  children: [
2833
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(RecordIcon, { width: 10, height: 10 }),
2872
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, { width: 10, height: 10 }),
2834
2873
  label
2835
2874
  ]
2836
2875
  }
@@ -2838,15 +2877,16 @@ function RecordingIndicator() {
2838
2877
  }
2839
2878
  function ConnectionDot({ quality }) {
2840
2879
  if (quality === "excellent" || quality === "good" || quality === "unknown") return null;
2841
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `mx-meet__quality mx-meet__quality--${quality}`, title: `Connection ${quality}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(WifiLowIcon, { width: 14, height: 14 }) });
2880
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `mx-meet__quality mx-meet__quality--${quality}`, title: `Connection ${quality}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WifiLowIcon, { width: 14, height: 14 }) });
2842
2881
  }
2843
2882
  function RoleBadge({
2844
2883
  role,
2845
2884
  standing
2846
2885
  }) {
2847
- if (role === "host") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Host" });
2848
- if (role === "cohost") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Co-host" });
2849
- if (isLinkFollower(standing)) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Guest" });
2886
+ if (role === "host") return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Host" });
2887
+ if (role === "cohost") return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Co-host" });
2888
+ if (isObserverRole(role)) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", "data-meet-observing": "", children: "Observing" });
2889
+ if (isLinkFollower(standing)) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Guest" });
2850
2890
  return null;
2851
2891
  }
2852
2892
  function ParticipantTile({
@@ -2856,7 +2896,7 @@ function ParticipantTile({
2856
2896
  const host = useMeetHost();
2857
2897
  const snapshot = useMeetSnapshot();
2858
2898
  const queue = useHandQueue();
2859
- const [menu, setMenu] = (0, import_react9.useState)(false);
2899
+ const [menu, setMenu] = (0, import_react10.useState)(false);
2860
2900
  const videoRef = useTrack(
2861
2901
  participant.identity,
2862
2902
  participant.screenSharing ? "screen" : "camera"
@@ -2865,7 +2905,7 @@ function ParticipantTile({
2865
2905
  const pinnedHere = snapshot?.pinned === participant.identity;
2866
2906
  const spotlit = snapshot?.spotlight === participant.identity;
2867
2907
  const handPosition = participant.handRaised ? queue.findIndex((entry) => entry.identity === participant.identity) + 1 : 0;
2868
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
2908
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
2869
2909
  "div",
2870
2910
  {
2871
2911
  className: [
@@ -2876,7 +2916,7 @@ function ParticipantTile({
2876
2916
  "data-identity": participant.identity,
2877
2917
  ...participantAttributes(participant),
2878
2918
  children: [
2879
- showVideo ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2919
+ showVideo ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2880
2920
  "video",
2881
2921
  {
2882
2922
  ref: videoRef,
@@ -2885,43 +2925,43 @@ function ParticipantTile({
2885
2925
  playsInline: true,
2886
2926
  muted: participant.isLocal
2887
2927
  }
2888
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: featured ? 96 : 56 }) }),
2889
- participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__tile-hand", title: `Hand raised \xB7 ${ordinal(handPosition)} in line`, children: [
2890
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HandIcon, { width: 14, height: 14 }),
2928
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: featured ? 96 : 56 }) }),
2929
+ participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__tile-hand", title: `Hand raised \xB7 ${ordinal(handPosition)} in line`, children: [
2930
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 14, height: 14 }),
2891
2931
  handPosition > 0 ? handPosition : null
2892
2932
  ] }) : null,
2893
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__tile-bar", children: [
2894
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__tile-name", children: [
2895
- spotlit ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { title: "Spotlighted for everyone", className: "mx-meet__tile-flag", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpotlightIcon, { width: 12, height: 12 }) }) : null,
2933
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__tile-bar", children: [
2934
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__tile-name", children: [
2935
+ spotlit ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { title: "Spotlighted for everyone", className: "mx-meet__tile-flag", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 12, height: 12 }) }) : null,
2896
2936
  participant.displayName,
2897
2937
  participant.isLocal ? " (you)" : "",
2898
- participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "AI" }) : null,
2899
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(RoleBadge, { role: participant.role, standing: participant.standing })
2938
+ participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "AI" }) : null,
2939
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RoleBadge, { role: participant.role, standing: participant.standing })
2900
2940
  ] }),
2901
- !participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
2902
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QualityBars, { quality: participant.quality })
2941
+ !participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
2942
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QualityBars, { quality: participant.quality })
2903
2943
  ] }),
2904
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: menu ? "mx-meet__tile-actions mx-meet__tile-actions--open" : "mx-meet__tile-actions", children: [
2905
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2944
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: menu ? "mx-meet__tile-actions mx-meet__tile-actions--open" : "mx-meet__tile-actions", children: [
2945
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2906
2946
  ControlButton,
2907
2947
  {
2908
2948
  label: pinnedHere ? "Unpin" : `Pin ${participant.displayName} for me`,
2909
2949
  active: pinnedHere,
2910
2950
  onClick: () => host?.engine.pin(pinnedHere ? null : participant.identity),
2911
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PinIcon, { width: 16, height: 16 })
2951
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PinIcon, { width: 16, height: 16 })
2912
2952
  }
2913
2953
  ),
2914
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
2915
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2954
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
2955
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2916
2956
  ControlButton,
2917
2957
  {
2918
2958
  label: `More for ${participant.displayName}`,
2919
2959
  active: menu,
2920
2960
  onClick: () => setMenu(!menu),
2921
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MoreIcon, { width: 16, height: 16 })
2961
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, { width: 16, height: 16 })
2922
2962
  }
2923
2963
  ),
2924
- menu ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PersonMenu, { participant, onClose: () => setMenu(false), placement: "down" }) : null
2964
+ menu ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PersonMenu, { participant, onClose: () => setMenu(false), placement: "down" }) : null
2925
2965
  ] })
2926
2966
  ] })
2927
2967
  ]
@@ -2937,28 +2977,28 @@ function QualityBars({ quality }) {
2937
2977
  if (quality === "unknown") return null;
2938
2978
  const bars = quality === "excellent" ? 3 : quality === "good" ? 2 : quality === "poor" ? 1 : 0;
2939
2979
  const label = quality === "lost" ? "Connection lost" : quality === "poor" ? "Poor connection" : `Connection ${quality}`;
2940
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: `mx-meet__signal mx-meet__signal--${quality}`, title: label, "aria-label": label, role: "img", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SignalIcon, { bars, width: 14, height: 14 }) });
2980
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `mx-meet__signal mx-meet__signal--${quality}`, title: label, "aria-label": label, role: "img", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SignalIcon, { bars, width: 14, height: 14 }) });
2941
2981
  }
2942
2982
  function Stage({ pageSize }) {
2943
2983
  const stage = useStage(pageSize);
2944
2984
  const columns = gridColumns(stage.tiles.length);
2945
2985
  if (stage.feature === null && stage.tiles.length === 0) {
2946
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__stage mx-meet__stage--empty", children: [
2947
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__empty-title", children: "Waiting for others to join" }),
2948
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__empty-body", children: "Share the meeting link and people can join from anywhere \u2014 no account needed." })
2986
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__stage mx-meet__stage--empty", children: [
2987
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-title", children: "Waiting for others to join" }),
2988
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", children: "Share the meeting link and people can join from anywhere \u2014 no account needed." })
2949
2989
  ] });
2950
2990
  }
2951
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: `mx-meet__stage${stage.feature !== null ? " mx-meet__stage--speaker" : ""}`, children: [
2952
- stage.feature !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ParticipantTile, { participant: stage.feature, featured: true }) : null,
2953
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
2991
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: `mx-meet__stage${stage.feature !== null ? " mx-meet__stage--speaker" : ""}`, children: [
2992
+ stage.feature !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ParticipantTile, { participant: stage.feature, featured: true }) : null,
2993
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
2954
2994
  "div",
2955
2995
  {
2956
2996
  className: "mx-meet__grid",
2957
2997
  style: { "--mx-meet-columns": columns },
2958
- children: stage.tiles.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ParticipantTile, { participant }, participant.identity))
2998
+ children: stage.tiles.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ParticipantTile, { participant }, participant.identity))
2959
2999
  }
2960
3000
  ),
2961
- stage.overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__overflow", children: [
3001
+ stage.overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__overflow", children: [
2962
3002
  "+",
2963
3003
  stage.overflow,
2964
3004
  " more ",
@@ -2970,17 +3010,24 @@ function Stage({ pageSize }) {
2970
3010
  function ControlBar({ onLeave }) {
2971
3011
  const room = useRoom();
2972
3012
  const recording = useRecording();
2973
- const [panel, setPanel] = (0, import_react9.useState)("none");
2974
- const [chatTo, setChatTo] = (0, import_react9.useState)(null);
2975
- const [popover, setPopover] = (0, import_react9.useState)("none");
2976
- const [shortcuts, setShortcuts] = (0, import_react9.useState)(false);
3013
+ const [panel, setPanel] = (0, import_react10.useState)("none");
3014
+ const [chatTo, setChatTo] = (0, import_react10.useState)(null);
3015
+ const [popover, setPopover] = (0, import_react10.useState)("none");
3016
+ const [shortcuts, setShortcuts] = (0, import_react10.useState)(false);
2977
3017
  const snapshot = useMeetSnapshot();
2978
3018
  const lobby = useLobby();
2979
3019
  const controls = useHostControls();
2980
3020
  const queue = useHandQueue();
2981
3021
  const micUnavailable = useLocalMedia().microphone.unavailable;
2982
3022
  const unread = useUnreadChat(panel === "chat");
2983
- const [whiteboard, setWhiteboard] = (0, import_react9.useState)(false);
3023
+ const [whiteboard, setWhiteboard] = (0, import_react10.useState)(false);
3024
+ const app = useMeetAppPanel();
3025
+ const appOpened = (0, import_react10.useRef)(false);
3026
+ (0, import_react10.useEffect)(() => {
3027
+ if (app === null || appOpened.current) return;
3028
+ appOpened.current = true;
3029
+ setPanel("app");
3030
+ }, [app]);
2984
3031
  const toggle = (next) => setPanel(panel === next ? "none" : next);
2985
3032
  const openActivity = (activity) => {
2986
3033
  if (activity === "whiteboard") setWhiteboard(true);
@@ -2991,7 +3038,7 @@ function ControlBar({ onLeave }) {
2991
3038
  });
2992
3039
  const privateChatAt = snapshot?.privateChatRequest?.at ?? null;
2993
3040
  const meetStore = useMeetHost()?.store ?? null;
2994
- (0, import_react9.useEffect)(() => {
3041
+ (0, import_react10.useEffect)(() => {
2995
3042
  const request = meetStore?.snapshot().privateChatRequest ?? null;
2996
3043
  if (request === null) return;
2997
3044
  setChatTo(request.to);
@@ -3007,11 +3054,11 @@ function ControlBar({ onLeave }) {
3007
3054
  help: () => setShortcuts(true)
3008
3055
  });
3009
3056
  const hasSpotlight = snapshot?.spotlight !== null && snapshot?.spotlight !== void 0;
3010
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
3011
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MeetingOverlays, {}),
3012
- shortcuts ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ShortcutsSheet, { onClose: () => setShortcuts(false) }) : null,
3013
- panel === "chat" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChatPanel, { onClose: () => setPanel("none"), to: chatTo, onTo: setChatTo }) : null,
3014
- panel === "people" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3057
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
3058
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MeetingOverlays, {}),
3059
+ shortcuts ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ShortcutsSheet, { onClose: () => setShortcuts(false) }) : null,
3060
+ panel === "chat" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatPanel, { onClose: () => setPanel("none"), to: chatTo, onTo: setChatTo }) : null,
3061
+ panel === "people" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3015
3062
  PeoplePanel,
3016
3063
  {
3017
3064
  onClose: () => setPanel("none"),
@@ -3021,53 +3068,61 @@ function ControlBar({ onLeave }) {
3021
3068
  }
3022
3069
  }
3023
3070
  ) : null,
3024
- panel === "ai" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AiPanel, { onClose: () => setPanel("none") }) : null,
3025
- panel === "settings" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SettingsPanel, { onClose: () => setPanel("none") }) : null,
3026
- panel === "polls" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollsPanel, { onClose: () => setPanel("none") }) : null,
3027
- panel === "qa" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QaPanel, { onClose: () => setPanel("none") }) : null,
3028
- panel === "breakouts" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutsPanel, { onClose: () => setPanel("none") }) : null,
3029
- whiteboard ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(WhiteboardPanel, { onClose: () => setWhiteboard(false) }) : null,
3030
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutBanner, {}),
3031
- controls.notice !== null && panel !== "people" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Toast, { text: controls.notice.text, failed: controls.notice.failed, onDone: controls.clearNotice }) : null,
3032
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__controls", children: [
3033
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3071
+ panel === "ai" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiPanel, { onClose: () => setPanel("none") }) : null,
3072
+ panel === "settings" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SettingsPanel, { onClose: () => setPanel("none") }) : null,
3073
+ panel === "polls" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PollsPanel, { onClose: () => setPanel("none") }) : null,
3074
+ panel === "qa" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QaPanel, { onClose: () => setPanel("none") }) : null,
3075
+ panel === "breakouts" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BreakoutsPanel, { onClose: () => setPanel("none") }) : null,
3076
+ whiteboard ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WhiteboardPanel, { onClose: () => setWhiteboard(false) }) : null,
3077
+ panel === "app" && app !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PanelShell, { title: app.title, onClose: () => setPanel("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__app-panel", "data-meet-app-panel": app.panel.key, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3078
+ app.Component,
3079
+ {
3080
+ recordId: app.panel.recordId,
3081
+ organizationId: app.organizationId,
3082
+ panelKey: app.panel.key
3083
+ }
3084
+ ) }) }) : null,
3085
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BreakoutBanner, {}),
3086
+ controls.notice !== null && panel !== "people" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Toast, { text: controls.notice.text, failed: controls.notice.failed, onDone: controls.clearNotice }) : null,
3087
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__controls", children: [
3088
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3034
3089
  ControlButton,
3035
3090
  {
3036
3091
  label: micUnavailable !== null ? `Unmute \u2014 ${micUnavailable.remedy}` : room.local?.micEnabled === true ? "Mute (\u2318D)" : "Unmute (\u2318D)",
3037
3092
  active: room.local?.micEnabled === true,
3038
3093
  onClick: () => void room.toggleMicrophone(),
3039
- children: room.local?.micEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, {})
3094
+ children: room.local?.micEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, {})
3040
3095
  }
3041
3096
  ),
3042
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3097
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3043
3098
  ControlButton,
3044
3099
  {
3045
3100
  label: room.local?.cameraEnabled === true ? "Stop video (\u2318E)" : "Start video (\u2318E)",
3046
3101
  active: room.local?.cameraEnabled === true,
3047
3102
  onClick: () => void room.toggleCamera(),
3048
- children: room.local?.cameraEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CameraIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CameraOffIcon, {})
3103
+ children: room.local?.cameraEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraOffIcon, {})
3049
3104
  }
3050
3105
  ),
3051
- room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3106
+ room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3052
3107
  ControlButton,
3053
3108
  {
3054
3109
  label: room.local?.screenSharing === true ? "Stop sharing" : "Share screen",
3055
3110
  active: room.local?.screenSharing === true,
3056
3111
  onClick: () => void room.toggleScreenShare(),
3057
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScreenShareIcon, {})
3112
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ScreenShareIcon, {})
3058
3113
  }
3059
3114
  ) : null,
3060
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
3061
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3115
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
3116
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3062
3117
  ControlButton,
3063
3118
  {
3064
3119
  label: "Send a reaction",
3065
3120
  active: popover === "reactions",
3066
3121
  onClick: () => setPopover(popover === "reactions" ? "none" : "reactions"),
3067
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SmileIcon, {})
3122
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SmileIcon, {})
3068
3123
  }
3069
3124
  ),
3070
- popover === "reactions" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: "Reactions", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__emoji-bar", children: MEET_REACTIONS.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3125
+ popover === "reactions" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: "Reactions", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__emoji-bar", children: MEET_REACTIONS.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3071
3126
  "button",
3072
3127
  {
3073
3128
  type: "button",
@@ -3079,53 +3134,54 @@ function ControlBar({ onLeave }) {
3079
3134
  emoji
3080
3135
  )) }) }) : null
3081
3136
  ] }),
3082
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3137
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3083
3138
  ControlButton,
3084
3139
  {
3085
3140
  label: room.local?.handRaised === true ? "Lower hand (\u2318\u2325H)" : "Raise hand (\u2318\u2325H)",
3086
3141
  active: room.local?.handRaised === true,
3087
3142
  onClick: () => void room.toggleHand(),
3088
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HandIcon, {})
3143
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, {})
3089
3144
  }
3090
3145
  ),
3091
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(ControlButton, { label: "Chat (\u2318\u2325C)", active: panel === "chat", onClick: () => toggle("chat"), children: [
3092
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChatIcon, {}),
3093
- unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
3146
+ app !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: app.title, active: panel === "app", onClick: () => toggle("app"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FlagIcon, {}) }) : null,
3147
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(ControlButton, { label: "Chat (\u2318\u2325C)", active: panel === "chat", onClick: () => toggle("chat"), children: [
3148
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatIcon, {}),
3149
+ unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
3094
3150
  ] }),
3095
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3151
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3096
3152
  ControlButton,
3097
3153
  {
3098
3154
  label: lobby.waiting.length > 0 ? `People \u2014 ${lobby.waiting.length} waiting` : `People \u2014 ${(snapshot?.participants ?? []).length} in the meeting`,
3099
3155
  active: panel === "people",
3100
3156
  onClick: () => toggle("people"),
3101
3157
  children: [
3102
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PeopleIcon, {}),
3103
- lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
3158
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, {}),
3159
+ lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
3104
3160
  ]
3105
3161
  }
3106
3162
  ),
3107
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3163
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3108
3164
  ActivitiesControl,
3109
3165
  {
3110
3166
  active: whiteboard ? "whiteboard" : panel === "polls" || panel === "qa" || panel === "breakouts" ? panel : null,
3111
3167
  onOpen: openActivity
3112
3168
  }
3113
3169
  ),
3114
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AiControl, { active: panel === "ai", onToggle: () => toggle("ai") }),
3115
- recording.canStart ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Start recording", onClick: () => void recording.start(), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(RecordIcon, {}) }) : null,
3116
- recording.canStop ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Stop recording", active: true, onClick: () => void recording.stop(), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(RecordIcon, {}) }) : null,
3117
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
3118
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3170
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiControl, { active: panel === "ai", onToggle: () => toggle("ai") }),
3171
+ recording.canStart ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Start recording", onClick: () => void recording.start(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, {}) }) : null,
3172
+ recording.canStop ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Stop recording", active: true, onClick: () => void recording.stop(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, {}) }) : null,
3173
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
3174
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3119
3175
  ControlButton,
3120
3176
  {
3121
3177
  label: "More options",
3122
3178
  active: popover === "more" || panel === "settings",
3123
3179
  onClick: () => setPopover(popover === "more" ? "none" : "more"),
3124
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MoreIcon, {})
3180
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, {})
3125
3181
  }
3126
3182
  ),
3127
- popover === "more" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: "More options", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
3128
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3183
+ popover === "more" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: "More options", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
3184
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3129
3185
  MenuItem,
3130
3186
  {
3131
3187
  onSelect: () => {
@@ -3133,12 +3189,12 @@ function ControlBar({ onLeave }) {
3133
3189
  setPanel("settings");
3134
3190
  },
3135
3191
  children: [
3136
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SettingsIcon, { width: 16, height: 16 }),
3192
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SettingsIcon, { width: 16, height: 16 }),
3137
3193
  " Settings"
3138
3194
  ]
3139
3195
  }
3140
3196
  ),
3141
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3197
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3142
3198
  MenuItem,
3143
3199
  {
3144
3200
  onSelect: () => {
@@ -3146,14 +3202,14 @@ function ControlBar({ onLeave }) {
3146
3202
  setShortcuts(true);
3147
3203
  },
3148
3204
  children: [
3149
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(KeyboardIcon, { width: 16, height: 16 }),
3205
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardIcon, { width: 16, height: 16 }),
3150
3206
  " Keyboard shortcuts"
3151
3207
  ]
3152
3208
  }
3153
3209
  ),
3154
- controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
3155
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
3156
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3210
+ controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
3211
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
3212
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3157
3213
  MenuItem,
3158
3214
  {
3159
3215
  onSelect: () => {
@@ -3161,12 +3217,12 @@ function ControlBar({ onLeave }) {
3161
3217
  void controls.run({ action: "mute_all" });
3162
3218
  },
3163
3219
  children: [
3164
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, { width: 16, height: 16 }),
3220
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 16, height: 16 }),
3165
3221
  " Mute everyone"
3166
3222
  ]
3167
3223
  }
3168
3224
  ),
3169
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3225
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3170
3226
  MenuItem,
3171
3227
  {
3172
3228
  onSelect: () => {
@@ -3174,12 +3230,12 @@ function ControlBar({ onLeave }) {
3174
3230
  void controls.run({ action: "ask_all_unmute" });
3175
3231
  },
3176
3232
  children: [
3177
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicIcon, { width: 16, height: 16 }),
3233
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 16, height: 16 }),
3178
3234
  " Ask everyone to unmute"
3179
3235
  ]
3180
3236
  }
3181
3237
  ),
3182
- queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3238
+ queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3183
3239
  MenuItem,
3184
3240
  {
3185
3241
  onSelect: () => {
@@ -3187,14 +3243,14 @@ function ControlBar({ onLeave }) {
3187
3243
  void controls.run({ action: "lower_all_hands" });
3188
3244
  },
3189
3245
  children: [
3190
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HandIcon, { width: 16, height: 16 }),
3246
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 16, height: 16 }),
3191
3247
  " Lower all hands (",
3192
3248
  queue.length,
3193
3249
  ")"
3194
3250
  ]
3195
3251
  }
3196
3252
  ) : null,
3197
- hasSpotlight ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3253
+ hasSpotlight ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3198
3254
  MenuItem,
3199
3255
  {
3200
3256
  onSelect: () => {
@@ -3202,7 +3258,7 @@ function ControlBar({ onLeave }) {
3202
3258
  void controls.run({ action: "spotlight", identity: null });
3203
3259
  },
3204
3260
  children: [
3205
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3261
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3206
3262
  " Remove spotlight"
3207
3263
  ]
3208
3264
  }
@@ -3210,7 +3266,7 @@ function ControlBar({ onLeave }) {
3210
3266
  ] }) : null
3211
3267
  ] }) }) : null
3212
3268
  ] }),
3213
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3269
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3214
3270
  ControlButton,
3215
3271
  {
3216
3272
  label: "Leave",
@@ -3219,7 +3275,7 @@ function ControlBar({ onLeave }) {
3219
3275
  void room.leave();
3220
3276
  onLeave?.();
3221
3277
  },
3222
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PhoneOffIcon, {})
3278
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PhoneOffIcon, {})
3223
3279
  }
3224
3280
  )
3225
3281
  ] })
@@ -3229,13 +3285,13 @@ function useUnreadChat(open) {
3229
3285
  const snapshot = useMeetSnapshot();
3230
3286
  const chat = snapshot?.chat ?? [];
3231
3287
  const local = snapshot?.localIdentity ?? null;
3232
- const [seen, setSeen] = (0, import_react9.useState)(0);
3233
- (0, import_react9.useEffect)(() => {
3288
+ const [seen, setSeen] = (0, import_react10.useState)(0);
3289
+ (0, import_react10.useEffect)(() => {
3234
3290
  if (open) setSeen(chat.length);
3235
3291
  }, [open, chat.length]);
3236
3292
  const loaded = snapshot?.chatLoaded === true;
3237
- const [baseline, setBaseline] = (0, import_react9.useState)(null);
3238
- (0, import_react9.useEffect)(() => {
3293
+ const [baseline, setBaseline] = (0, import_react10.useState)(null);
3294
+ (0, import_react10.useEffect)(() => {
3239
3295
  if (loaded && baseline === null) setBaseline(chat.length);
3240
3296
  }, [loaded, baseline, chat.length]);
3241
3297
  if (open) return 0;
@@ -3248,14 +3304,14 @@ function Popover({
3248
3304
  children,
3249
3305
  placement = "up"
3250
3306
  }) {
3251
- const ref = (0, import_react9.useRef)(null);
3252
- const [style, setStyle] = (0, import_react9.useState)({
3307
+ const ref = (0, import_react10.useRef)(null);
3308
+ const [style, setStyle] = (0, import_react10.useState)({
3253
3309
  position: "fixed",
3254
3310
  top: 0,
3255
3311
  left: 0,
3256
3312
  visibility: "hidden"
3257
3313
  });
3258
- (0, import_react9.useLayoutEffect)(() => {
3314
+ (0, import_react10.useLayoutEffect)(() => {
3259
3315
  const element = ref.current;
3260
3316
  const anchor = element?.parentElement ?? null;
3261
3317
  if (element === null || anchor === null) return;
@@ -3300,7 +3356,7 @@ function Popover({
3300
3356
  window.removeEventListener("scroll", place, true);
3301
3357
  };
3302
3358
  }, [placement]);
3303
- (0, import_react9.useEffect)(() => {
3359
+ (0, import_react10.useEffect)(() => {
3304
3360
  const onKey = (event) => {
3305
3361
  if (event.key === "Escape") onClose();
3306
3362
  };
@@ -3315,14 +3371,14 @@ function Popover({
3315
3371
  window.removeEventListener("pointerdown", onPointer);
3316
3372
  };
3317
3373
  }, [onClose]);
3318
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { ref, className: "mx-meet__popover", style, role: "dialog", "aria-label": label, children });
3374
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { ref, className: "mx-meet__popover", style, role: "dialog", "aria-label": label, children });
3319
3375
  }
3320
3376
  function MenuItem({
3321
3377
  onSelect,
3322
3378
  danger = false,
3323
3379
  children
3324
3380
  }) {
3325
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3381
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3326
3382
  "button",
3327
3383
  {
3328
3384
  type: "button",
@@ -3334,28 +3390,28 @@ function MenuItem({
3334
3390
  );
3335
3391
  }
3336
3392
  function Toast({ text, failed, onDone }) {
3337
- (0, import_react9.useEffect)(() => {
3393
+ (0, import_react10.useEffect)(() => {
3338
3394
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
3339
3395
  return () => clearTimeout(timer);
3340
3396
  }, [text, failed, onDone]);
3341
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: failed ? "mx-meet__toast mx-meet__toast--failed" : "mx-meet__toast", role: "status", children: [
3342
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: text }),
3343
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: onDone, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 14, height: 14 }) })
3397
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: failed ? "mx-meet__toast mx-meet__toast--failed" : "mx-meet__toast", role: "status", children: [
3398
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: text }),
3399
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: onDone, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 14, height: 14 }) })
3344
3400
  ] });
3345
3401
  }
3346
3402
  function MeetingOverlays() {
3347
3403
  const reactions = useReactions();
3348
3404
  const { notice, dismiss } = useModerationNotice();
3349
3405
  const room = useRoom();
3350
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
3351
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ReactionOverlay, { reactions }),
3406
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
3407
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ReactionOverlay, { reactions }),
3352
3408
  notice !== null && notice.kind !== "removed" ? (
3353
3409
  // A host's request ("the host is asking you to unmute"), not an error:
3354
3410
  // an assertive status, so it is announced at once without being filed
3355
3411
  // as a failure (design-system error-box census).
3356
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__notice-bar", role: "status", "aria-live": "assertive", children: [
3357
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: notice.text }),
3358
- notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3412
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__notice-bar", role: "status", "aria-live": "assertive", children: [
3413
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: notice.text }),
3414
+ notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3359
3415
  "button",
3360
3416
  {
3361
3417
  type: "button",
@@ -3367,20 +3423,20 @@ function MeetingOverlays() {
3367
3423
  children: "Unmute"
3368
3424
  }
3369
3425
  ) : null,
3370
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: dismiss, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 14, height: 14 }) })
3426
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: dismiss, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 14, height: 14 }) })
3371
3427
  ] })
3372
3428
  ) : null
3373
3429
  ] });
3374
3430
  }
3375
3431
  function ShortcutsSheet({ onClose }) {
3376
- (0, import_react9.useEffect)(() => {
3432
+ (0, import_react10.useEffect)(() => {
3377
3433
  const onKey = (event) => {
3378
3434
  if (event.key === "Escape") onClose();
3379
3435
  };
3380
3436
  window.addEventListener("keydown", onKey);
3381
3437
  return () => window.removeEventListener("keydown", onKey);
3382
3438
  }, [onClose]);
3383
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__sheet-backdrop", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3439
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__sheet-backdrop", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3384
3440
  "div",
3385
3441
  {
3386
3442
  className: "mx-meet__sheet",
@@ -3388,13 +3444,13 @@ function ShortcutsSheet({ onClose }) {
3388
3444
  "aria-label": "Keyboard shortcuts",
3389
3445
  onClick: (event) => event.stopPropagation(),
3390
3446
  children: [
3391
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__panel-head", children: [
3392
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "mx-meet__panel-title", children: "Keyboard shortcuts" }),
3393
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Close", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 }) })
3447
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__panel-head", children: [
3448
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__panel-title", children: "Keyboard shortcuts" }),
3449
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Close", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }) })
3394
3450
  ] }),
3395
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dl", { className: "mx-meet__shortcuts", children: MEET_SHORTCUTS.map((shortcut) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__shortcut", children: [
3396
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dt", { children: shortcut.label }),
3397
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("dd", { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("kbd", { className: "mx-meet__kbd", children: shortcut.keys }) })
3451
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dl", { className: "mx-meet__shortcuts", children: MEET_SHORTCUTS.map((shortcut) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__shortcut", children: [
3452
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dt", { children: shortcut.label }),
3453
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dd", { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("kbd", { className: "mx-meet__kbd", children: shortcut.keys }) })
3398
3454
  ] }, shortcut.id)) })
3399
3455
  ]
3400
3456
  }
@@ -3404,15 +3460,15 @@ function AiControl({ active, onToggle }) {
3404
3460
  const snapshot = useMeetSnapshot();
3405
3461
  const meeting = snapshot?.meeting ?? null;
3406
3462
  if (meeting === null || !meeting.aiEnabled) return null;
3407
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Meeting assistant", active, onClick: onToggle, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SparklesIcon, {}) });
3463
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Meeting assistant", active, onClick: onToggle, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SparklesIcon, {}) });
3408
3464
  }
3409
3465
  function PanelShell({
3410
3466
  title,
3411
3467
  onClose,
3412
3468
  children
3413
3469
  }) {
3414
- const ref = (0, import_react9.useRef)(null);
3415
- (0, import_react9.useLayoutEffect)(() => {
3470
+ const ref = (0, import_react10.useRef)(null);
3471
+ (0, import_react10.useLayoutEffect)(() => {
3416
3472
  const panel = ref.current;
3417
3473
  const root = panel?.closest(".mx-meet");
3418
3474
  const header = root?.querySelector(":scope > .mx-meet__header") ?? null;
@@ -3424,12 +3480,12 @@ function PanelShell({
3424
3480
  observer.observe(header);
3425
3481
  return () => observer.disconnect();
3426
3482
  }, []);
3427
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("aside", { ref, className: "mx-meet__panel", "aria-label": title, children: [
3428
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__panel-head", children: [
3429
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "mx-meet__panel-title", children: title }),
3430
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Close panel", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 }) })
3483
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("aside", { ref, className: "mx-meet__panel", "aria-label": title, children: [
3484
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__panel-head", children: [
3485
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__panel-title", children: title }),
3486
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Close panel", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }) })
3431
3487
  ] }),
3432
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__panel-body", children })
3488
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__panel-body", children })
3433
3489
  ] });
3434
3490
  }
3435
3491
  function ChatPanel({
@@ -3439,17 +3495,17 @@ function ChatPanel({
3439
3495
  }) {
3440
3496
  const snapshot = useMeetSnapshot();
3441
3497
  const room = useRoom();
3442
- const [draft, setDraft] = (0, import_react9.useState)("");
3443
- const [recipient, setRecipient] = (0, import_react9.useState)(to);
3444
- const listRef = (0, import_react9.useRef)(null);
3498
+ const [draft, setDraft] = (0, import_react10.useState)("");
3499
+ const [recipient, setRecipient] = (0, import_react10.useState)(to);
3500
+ const listRef = (0, import_react10.useRef)(null);
3445
3501
  const messages = snapshot?.chat ?? [];
3446
3502
  const local = snapshot?.localIdentity ?? null;
3447
3503
  const people = (snapshot?.participants ?? []).filter(
3448
3504
  (participant) => !participant.isLocal && !participant.isAgent
3449
3505
  );
3450
3506
  const recipientName = recipient === null ? null : people.find((p) => p.identity === recipient)?.displayName ?? null;
3451
- (0, import_react9.useEffect)(() => setRecipient(to), [to]);
3452
- (0, import_react9.useEffect)(() => {
3507
+ (0, import_react10.useEffect)(() => setRecipient(to), [to]);
3508
+ (0, import_react10.useEffect)(() => {
3453
3509
  const list = listRef.current;
3454
3510
  if (list !== null) list.scrollTop = list.scrollHeight;
3455
3511
  }, [messages.length]);
@@ -3457,13 +3513,13 @@ function ChatPanel({
3457
3513
  setRecipient(next);
3458
3514
  onTo?.(next);
3459
3515
  };
3460
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Chat", onClose, children: [
3461
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("ul", { className: "mx-meet__chat", ref: listRef, children: [
3462
- snapshot?.chatHistoryError != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("li", { className: "mx-meet__panel-note", children: snapshot.chatHistoryError }) : null,
3463
- snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("li", { className: "mx-meet__panel-note", children: "No messages yet. Messages to everyone stay with the meeting, so people who join later see them." }) : null,
3464
- messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChatLine, { message, local, people }, message.id))
3516
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Chat", onClose, children: [
3517
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("ul", { className: "mx-meet__chat", ref: listRef, children: [
3518
+ snapshot?.chatHistoryError != null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: snapshot.chatHistoryError }) : null,
3519
+ snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: "No messages yet. Messages to everyone stay with the meeting, so people who join later see them." }) : null,
3520
+ messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatLine, { message, local, people }, message.id))
3465
3521
  ] }),
3466
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3522
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3467
3523
  "form",
3468
3524
  {
3469
3525
  className: "mx-meet__composer mx-meet__composer--chat",
@@ -3476,7 +3532,7 @@ function ChatPanel({
3476
3532
  else void room.sendPrivateChat(recipient, text);
3477
3533
  },
3478
3534
  children: [
3479
- people.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3535
+ people.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3480
3536
  "select",
3481
3537
  {
3482
3538
  className: "mx-meet__select mx-meet__select--compact",
@@ -3484,16 +3540,16 @@ function ChatPanel({
3484
3540
  value: recipient ?? "",
3485
3541
  onChange: (event) => choose(event.target.value === "" ? null : event.target.value),
3486
3542
  children: [
3487
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: "", children: "Everyone" }),
3488
- people.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("option", { value: participant.identity, children: [
3543
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("option", { value: "", children: "Everyone" }),
3544
+ people.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("option", { value: participant.identity, children: [
3489
3545
  participant.displayName,
3490
3546
  " (private)"
3491
3547
  ] }, participant.identity))
3492
3548
  ]
3493
3549
  }
3494
3550
  ) : null,
3495
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__composer-row", children: [
3496
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3551
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__composer-row", children: [
3552
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3497
3553
  "input",
3498
3554
  {
3499
3555
  className: "mx-meet__input",
@@ -3504,9 +3560,9 @@ function ChatPanel({
3504
3560
  maxLength: 4e3
3505
3561
  }
3506
3562
  ),
3507
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Send" })
3563
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Send" })
3508
3564
  ] }),
3509
- recipientName !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
3565
+ recipientName !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
3510
3566
  "Only ",
3511
3567
  recipientName,
3512
3568
  " sees this. Private messages are not saved."
@@ -3524,7 +3580,7 @@ function ChatLine({
3524
3580
  const mine = message.identity === local;
3525
3581
  const privateTo = message.to ?? null;
3526
3582
  const counterpart = privateTo === null ? null : mine ? people.find((p) => p.identity === privateTo)?.displayName ?? "them" : "you";
3527
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3583
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3528
3584
  "li",
3529
3585
  {
3530
3586
  className: [
@@ -3533,17 +3589,17 @@ function ChatLine({
3533
3589
  message.failed !== void 0 ? "mx-meet__chat-line--failed" : ""
3534
3590
  ].filter(Boolean).join(" "),
3535
3591
  children: [
3536
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__chat-meta", children: [
3537
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: mine ? "You" : message.displayName }),
3538
- counterpart !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__chat-private", children: [
3592
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__chat-meta", children: [
3593
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: mine ? "You" : message.displayName }),
3594
+ counterpart !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__chat-private", children: [
3539
3595
  "to ",
3540
3596
  counterpart,
3541
3597
  " \xB7 private"
3542
3598
  ] }) : null,
3543
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("time", { dateTime: message.at, children: clockOf(message.at) })
3599
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("time", { dateTime: message.at, children: clockOf(message.at) })
3544
3600
  ] }),
3545
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-text", children: message.text }),
3546
- message.failed !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-failed", children: message.failed }) : privateTo === null && message.saved === false ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-pending", children: message.id.startsWith("pending-") ? "Sending\u2026" : "Not saved \u2014 people who join later will not see this" }) : null
3601
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-text", children: message.text }),
3602
+ message.failed !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-failed", children: message.failed }) : privateTo === null && message.saved === false ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-pending", children: message.id.startsWith("pending-") ? "Sending\u2026" : "Not saved \u2014 people who join later will not see this" }) : null
3547
3603
  ]
3548
3604
  }
3549
3605
  );
@@ -3555,22 +3611,25 @@ function PeoplePanel({
3555
3611
  const snapshot = useMeetSnapshot();
3556
3612
  const controls = useHostControls();
3557
3613
  const queue = useHandQueue();
3558
- const [query, setQuery] = (0, import_react9.useState)("");
3559
- const [menuFor, setMenuFor] = (0, import_react9.useState)(null);
3614
+ const [query, setQuery] = (0, import_react10.useState)("");
3615
+ const [menuFor, setMenuFor] = (0, import_react10.useState)(null);
3560
3616
  const myRole = useRole();
3561
3617
  const local = snapshot?.localIdentity ?? null;
3562
- const everyone = snapshot?.participants ?? [];
3618
+ const observersHidden = snapshot?.grants.observersVisibleTo === "hosts" && !controls.isHost;
3619
+ const everyone = (snapshot?.participants ?? []).filter(
3620
+ (participant) => !observersHidden || !isObserverRole(participant.role) || participant.identity === local
3621
+ );
3563
3622
  const needle = query.trim().toLowerCase();
3564
3623
  const shown = needle.length === 0 ? everyone : everyone.filter((participant) => participant.displayName.toLowerCase().includes(needle));
3565
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: `People (${everyone.length})`, onClose, children: [
3566
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(LobbyPanel, {}),
3567
- queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__section", "aria-label": "Raised hands", children: [
3568
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__section-head", children: [
3569
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h3", { className: "mx-meet__section-title", children: [
3624
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: `People (${everyone.length})`, onClose, children: [
3625
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LobbyPanel, {}),
3626
+ queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Raised hands", children: [
3627
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__section-head", children: [
3628
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("h3", { className: "mx-meet__section-title", children: [
3570
3629
  "Raised hands \xB7 ",
3571
3630
  queue.length
3572
3631
  ] }),
3573
- controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3632
+ controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3574
3633
  "button",
3575
3634
  {
3576
3635
  type: "button",
@@ -3580,13 +3639,13 @@ function PeoplePanel({
3580
3639
  }
3581
3640
  ) : null
3582
3641
  ] }),
3583
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ol", { className: "mx-meet__queue", children: queue.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
3584
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 28 }),
3585
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__person-name", children: [
3642
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ol", { className: "mx-meet__queue", children: queue.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__person", children: [
3643
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 28 }),
3644
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
3586
3645
  participant.displayName,
3587
- participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null
3646
+ participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null
3588
3647
  ] }),
3589
- controls.isHost || participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3648
+ controls.isHost || participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3590
3649
  "button",
3591
3650
  {
3592
3651
  type: "button",
@@ -3597,27 +3656,27 @@ function PeoplePanel({
3597
3656
  ) : null
3598
3657
  ] }, participant.identity)) })
3599
3658
  ] }) : null,
3600
- controls.isHost && everyone.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__bulk", children: [
3601
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("button", { type: "button", className: "mx-meet__chip", onClick: () => void controls.run({ action: "mute_all" }), children: [
3602
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, { width: 14, height: 14 }),
3659
+ controls.isHost && everyone.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__bulk", children: [
3660
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("button", { type: "button", className: "mx-meet__chip", onClick: () => void controls.run({ action: "mute_all" }), children: [
3661
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }),
3603
3662
  " Mute all"
3604
3663
  ] }),
3605
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3664
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3606
3665
  "button",
3607
3666
  {
3608
3667
  type: "button",
3609
3668
  className: "mx-meet__chip",
3610
3669
  onClick: () => void controls.run({ action: "ask_all_unmute" }),
3611
3670
  children: [
3612
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicIcon, { width: 14, height: 14 }),
3671
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 14, height: 14 }),
3613
3672
  " Ask all to unmute"
3614
3673
  ]
3615
3674
  }
3616
3675
  )
3617
3676
  ] }) : null,
3618
- everyone.length > 4 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__search", children: [
3619
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SearchIcon, { width: 16, height: 16 }),
3620
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3677
+ everyone.length > 4 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__search", children: [
3678
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SearchIcon, { width: 16, height: 16 }),
3679
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3621
3680
  "input",
3622
3681
  {
3623
3682
  className: "mx-meet__input mx-meet__input--bare",
@@ -3628,37 +3687,37 @@ function PeoplePanel({
3628
3687
  }
3629
3688
  )
3630
3689
  ] }) : null,
3631
- controls.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: controls.notice.failed ? "mx-meet__error" : "mx-meet__notice", role: "status", children: controls.notice.text }) : null,
3632
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("ul", { className: "mx-meet__people", children: [
3633
- shown.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
3634
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 32 }),
3635
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__person-name", children: [
3690
+ controls.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: controls.notice.failed ? "mx-meet__error" : "mx-meet__notice", role: "status", children: controls.notice.text }) : null,
3691
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("ul", { className: "mx-meet__people", children: [
3692
+ shown.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__person", children: [
3693
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 32 }),
3694
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
3636
3695
  participant.displayName,
3637
- participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null,
3638
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3696
+ participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null,
3697
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3639
3698
  RoleBadge,
3640
3699
  {
3641
3700
  role: participant.identity === local ? myRole : participant.role,
3642
3701
  standing: participant.standing
3643
3702
  }
3644
3703
  ),
3645
- isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
3646
- snapshot?.spotlight === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
3704
+ isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
3705
+ snapshot?.spotlight === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
3647
3706
  ] }),
3648
- participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HandIcon, { width: 14, height: 14 }) : null,
3649
- !participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
3650
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QualityBars, { quality: participant.quality }),
3651
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
3652
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3707
+ participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 14, height: 14 }) : null,
3708
+ !participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
3709
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QualityBars, { quality: participant.quality }),
3710
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
3711
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3653
3712
  ControlButton,
3654
3713
  {
3655
3714
  label: `More for ${participant.displayName}`,
3656
3715
  active: menuFor === participant.identity,
3657
3716
  onClick: () => setMenuFor(menuFor === participant.identity ? null : participant.identity),
3658
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MoreIcon, { width: 16, height: 16 })
3717
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, { width: 16, height: 16 })
3659
3718
  }
3660
3719
  ),
3661
- menuFor === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3720
+ menuFor === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3662
3721
  PersonMenu,
3663
3722
  {
3664
3723
  participant,
@@ -3669,13 +3728,13 @@ function PeoplePanel({
3669
3728
  ) : null
3670
3729
  ] })
3671
3730
  ] }, participant.identity)),
3672
- shown.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__panel-note", children: [
3731
+ shown.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__panel-note", children: [
3673
3732
  "Nobody matches \u201C",
3674
3733
  query,
3675
3734
  "\u201D."
3676
3735
  ] }) : null
3677
3736
  ] }),
3678
- snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(GuestRecordAccessControl, { meeting: snapshot.meeting }) : null
3737
+ snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(GuestRecordAccessControl, { meeting: snapshot.meeting }) : null
3679
3738
  ] });
3680
3739
  }
3681
3740
  function PersonMenu({
@@ -3687,14 +3746,14 @@ function PersonMenu({
3687
3746
  const host = useMeetHost();
3688
3747
  const snapshot = useMeetSnapshot();
3689
3748
  const controls = useHostControls();
3690
- const [mode, setMode] = (0, import_react9.useState)("menu");
3691
- const [text, setText] = (0, import_react9.useState)("");
3749
+ const [mode, setMode] = (0, import_react10.useState)("menu");
3750
+ const [text, setText] = (0, import_react10.useState)("");
3692
3751
  const self = participant.identity === snapshot?.localIdentity;
3693
3752
  const moderate = controls.canModerate(participant);
3694
3753
  const pinned = snapshot?.pinned === participant.identity;
3695
3754
  const spotlit = snapshot?.spotlight === participant.identity;
3696
3755
  const hasAccount = participant.userId !== null;
3697
- const [refused, setRefused] = (0, import_react9.useState)(false);
3756
+ const [refused, setRefused] = (0, import_react10.useState)(false);
3698
3757
  const act = (request) => {
3699
3758
  setRefused(false);
3700
3759
  void controls.run(request).then((result) => {
@@ -3702,10 +3761,10 @@ function PersonMenu({
3702
3761
  else setRefused(true);
3703
3762
  });
3704
3763
  };
3705
- const refusal = refused && controls.notice?.failed === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.ErrorBox, { as: "p", className: "mx-meet__error", message: controls.notice.text, operation: "Change this participant", origin: "meet/components", children: controls.notice.text }) : null;
3764
+ const refusal = refused && controls.notice?.failed === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.ErrorBox, { as: "p", className: "mx-meet__error", message: controls.notice.text, operation: "Change this participant", origin: "meet/components", children: controls.notice.text }) : null;
3706
3765
  if (mode === "rename" || mode === "report") {
3707
3766
  const renaming = mode === "rename";
3708
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: renaming ? "Rename" : "Report", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3767
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: renaming ? "Rename" : "Report", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3709
3768
  "form",
3710
3769
  {
3711
3770
  className: "mx-meet__menu-form",
@@ -3717,9 +3776,9 @@ function PersonMenu({
3717
3776
  );
3718
3777
  },
3719
3778
  children: [
3720
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
3721
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: renaming ? "Name shown in this meeting" : `What did ${participant.displayName} do?` }),
3722
- renaming ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3779
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__field", children: [
3780
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__field-label", children: renaming ? "Name shown in this meeting" : `What did ${participant.displayName} do?` }),
3781
+ renaming ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3723
3782
  "input",
3724
3783
  {
3725
3784
  className: "mx-meet__input",
@@ -3728,7 +3787,7 @@ function PersonMenu({
3728
3787
  value: text,
3729
3788
  onChange: (event) => setText(event.target.value)
3730
3789
  }
3731
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3790
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3732
3791
  "textarea",
3733
3792
  {
3734
3793
  className: "mx-meet__input",
@@ -3741,9 +3800,9 @@ function PersonMenu({
3741
3800
  )
3742
3801
  ] }),
3743
3802
  refusal,
3744
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__menu-actions", children: [
3745
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Back" }),
3746
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: text.trim().length === 0 || controls.busy, children: renaming ? "Rename" : "Report" })
3803
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-actions", children: [
3804
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Back" }),
3805
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: text.trim().length === 0 || controls.busy, children: renaming ? "Rename" : "Report" })
3747
3806
  ] })
3748
3807
  ]
3749
3808
  }
@@ -3751,12 +3810,12 @@ function PersonMenu({
3751
3810
  }
3752
3811
  if (mode === "remove" || mode === "transfer") {
3753
3812
  const removing = mode === "remove";
3754
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: removing ? "Remove" : "Make host", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__menu-form", children: [
3755
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__confirm-text", children: removing ? `Remove ${participant.displayName}? They leave immediately and cannot rejoin this meeting.` : `Make ${participant.displayName} the host? They get every host control and own this meeting. You stay on as a co-host.` }),
3813
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: removing ? "Remove" : "Make host", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-form", children: [
3814
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__confirm-text", children: removing ? `Remove ${participant.displayName}? They leave immediately and cannot rejoin this meeting.` : `Make ${participant.displayName} the host? They get every host control and own this meeting. You stay on as a co-host.` }),
3756
3815
  refusal,
3757
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__menu-actions", children: [
3758
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Cancel" }),
3759
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3816
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-actions", children: [
3817
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Cancel" }),
3818
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3760
3819
  "button",
3761
3820
  {
3762
3821
  type: "button",
@@ -3769,8 +3828,8 @@ function PersonMenu({
3769
3828
  ] })
3770
3829
  ] }) });
3771
3830
  }
3772
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: `Options for ${participant.displayName}`, onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
3773
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3831
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: `Options for ${participant.displayName}`, onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
3832
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3774
3833
  MenuItem,
3775
3834
  {
3776
3835
  onSelect: () => {
@@ -3778,13 +3837,13 @@ function PersonMenu({
3778
3837
  onClose();
3779
3838
  },
3780
3839
  children: [
3781
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PinIcon, { width: 16, height: 16 }),
3840
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PinIcon, { width: 16, height: 16 }),
3782
3841
  " ",
3783
3842
  pinned ? "Unpin" : "Pin for me"
3784
3843
  ]
3785
3844
  }
3786
3845
  ),
3787
- !self && !participant.isAgent && (onMessage !== void 0 || host !== null) ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3846
+ !self && !participant.isAgent && (onMessage !== void 0 || host !== null) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3788
3847
  MenuItem,
3789
3848
  {
3790
3849
  onSelect: () => {
@@ -3796,42 +3855,42 @@ function PersonMenu({
3796
3855
  onClose();
3797
3856
  },
3798
3857
  children: [
3799
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChatIcon, { width: 16, height: 16 }),
3858
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatIcon, { width: 16, height: 16 }),
3800
3859
  " Message privately"
3801
3860
  ]
3802
3861
  }
3803
3862
  ) : null,
3804
- controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "spotlight", identity: spotlit ? null : participant.identity }), children: [
3805
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3863
+ controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "spotlight", identity: spotlit ? null : participant.identity }), children: [
3864
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3806
3865
  " ",
3807
3866
  spotlit ? "Remove spotlight" : "Spotlight for everyone"
3808
3867
  ] }) : null,
3809
- moderate ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
3810
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
3811
- participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "mute", identity: participant.identity }), children: [
3812
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicOffIcon, { width: 16, height: 16 }),
3868
+ moderate ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
3869
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
3870
+ participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "mute", identity: participant.identity }), children: [
3871
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 16, height: 16 }),
3813
3872
  " Mute"
3814
- ] }) : !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "ask_unmute", identity: participant.identity }), children: [
3815
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MicIcon, { width: 16, height: 16 }),
3873
+ ] }) : !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "ask_unmute", identity: participant.identity }), children: [
3874
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 16, height: 16 }),
3816
3875
  " Ask to unmute"
3817
3876
  ] }) : null,
3818
- participant.cameraEnabled ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_video", identity: participant.identity }), children: [
3819
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CameraOffIcon, { width: 16, height: 16 }),
3877
+ participant.cameraEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_video", identity: participant.identity }), children: [
3878
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraOffIcon, { width: 16, height: 16 }),
3820
3879
  " Stop video"
3821
3880
  ] }) : null,
3822
- participant.screenSharing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_screen", identity: participant.identity }), children: [
3823
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScreenShareIcon, { width: 16, height: 16 }),
3881
+ participant.screenSharing ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_screen", identity: participant.identity }), children: [
3882
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ScreenShareIcon, { width: 16, height: 16 }),
3824
3883
  " Stop screen share"
3825
3884
  ] }) : null,
3826
- participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "lower_hand", identity: participant.identity }), children: [
3827
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HandIcon, { width: 16, height: 16 }),
3885
+ participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "lower_hand", identity: participant.identity }), children: [
3886
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 16, height: 16 }),
3828
3887
  " Lower hand"
3829
3888
  ] }) : null,
3830
- hasAccount && !participant.isAgent && participant.role !== "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "make_cohost", identity: participant.identity }), children: [
3831
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PeopleIcon, { width: 16, height: 16 }),
3889
+ hasAccount && !participant.isAgent && participant.role !== "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "make_cohost", identity: participant.identity }), children: [
3890
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, { width: 16, height: 16 }),
3832
3891
  " Make co-host"
3833
3892
  ] }) : null,
3834
- !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3893
+ !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3835
3894
  MenuItem,
3836
3895
  {
3837
3896
  onSelect: () => {
@@ -3839,21 +3898,21 @@ function PersonMenu({
3839
3898
  setMode("rename");
3840
3899
  },
3841
3900
  children: [
3842
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PencilIcon, { width: 16, height: 16 }),
3901
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PencilIcon, { width: 16, height: 16 }),
3843
3902
  " Rename"
3844
3903
  ]
3845
3904
  }
3846
3905
  ) : null
3847
3906
  ] }) : null,
3848
- controls.isOwner && participant.role === "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => act({ action: "revoke_cohost", identity: participant.identity }), children: [
3849
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PeopleIcon, { width: 16, height: 16 }),
3907
+ controls.isOwner && participant.role === "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "revoke_cohost", identity: participant.identity }), children: [
3908
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, { width: 16, height: 16 }),
3850
3909
  " Remove co-host"
3851
3910
  ] }) : null,
3852
- controls.isOwner && !self && hasAccount && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { onSelect: () => setMode("transfer"), children: [
3853
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3911
+ controls.isOwner && !self && hasAccount && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => setMode("transfer"), children: [
3912
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
3854
3913
  " Make host"
3855
3914
  ] }) : null,
3856
- self ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3915
+ self ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3857
3916
  MenuItem,
3858
3917
  {
3859
3918
  onSelect: () => {
@@ -3861,12 +3920,12 @@ function PersonMenu({
3861
3920
  setMode("rename");
3862
3921
  },
3863
3922
  children: [
3864
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PencilIcon, { width: 16, height: 16 }),
3923
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PencilIcon, { width: 16, height: 16 }),
3865
3924
  " Rename yourself"
3866
3925
  ]
3867
3926
  }
3868
3927
  ) : null,
3869
- !self && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3928
+ !self && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3870
3929
  MenuItem,
3871
3930
  {
3872
3931
  onSelect: () => {
@@ -3874,21 +3933,21 @@ function PersonMenu({
3874
3933
  setMode("report");
3875
3934
  },
3876
3935
  children: [
3877
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FlagIcon, { width: 16, height: 16 }),
3936
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FlagIcon, { width: 16, height: 16 }),
3878
3937
  " Report"
3879
3938
  ]
3880
3939
  }
3881
3940
  ) : null,
3882
- moderate && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MenuItem, { danger: true, onSelect: () => setMode("remove"), children: [
3883
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 }),
3941
+ moderate && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { danger: true, onSelect: () => setMode("remove"), children: [
3942
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }),
3884
3943
  " Remove from meeting"
3885
3944
  ] }) : null
3886
3945
  ] }) });
3887
3946
  }
3888
3947
  function SettingsPanel({ onClose }) {
3889
3948
  const host = useRequiredMeetHost();
3890
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Settings", onClose, children: [
3891
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
3949
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Settings", onClose, children: [
3950
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3892
3951
  DeviceSettings,
3893
3952
  {
3894
3953
  onPick: (kind, deviceId) => {
@@ -3897,8 +3956,8 @@ function SettingsPanel({ onClose }) {
3897
3956
  }
3898
3957
  }
3899
3958
  ),
3900
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EffectsSettings, {}),
3901
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CaptionLanguageSettings, {})
3959
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EffectsSettings, {}),
3960
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CaptionLanguageSettings, {})
3902
3961
  ] });
3903
3962
  }
3904
3963
  function DeviceSettings({
@@ -3910,15 +3969,15 @@ function DeviceSettings({
3910
3969
  const speaker = devices?.selected.audiooutput ?? host.devices.resolve("audiooutput");
3911
3970
  const stream = useMicrophoneStream(microphone);
3912
3971
  const level = useAudioLevel(stream);
3913
- const [testing, setTesting] = (0, import_react9.useState)(false);
3914
- (0, import_react9.useEffect)(() => {
3972
+ const [testing, setTesting] = (0, import_react10.useState)(false);
3973
+ (0, import_react10.useEffect)(() => {
3915
3974
  void host.devices.refresh();
3916
3975
  }, [host]);
3917
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__section", "aria-label": "Devices", children: [
3918
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone", onPick }),
3919
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__meter", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }),
3920
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker", onPick }),
3921
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
3976
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Devices", children: [
3977
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone", onPick }),
3978
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__meter", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }),
3979
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker", onPick }),
3980
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3922
3981
  "button",
3923
3982
  {
3924
3983
  type: "button",
@@ -3929,19 +3988,19 @@ function DeviceSettings({
3929
3988
  void playTestSound(speaker).finally(() => setTesting(false));
3930
3989
  },
3931
3990
  children: [
3932
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpeakerIcon, { width: 14, height: 14 }),
3991
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpeakerIcon, { width: 14, height: 14 }),
3933
3992
  " ",
3934
3993
  testing ? "Playing\u2026" : "Test speaker"
3935
3994
  ]
3936
3995
  }
3937
3996
  ),
3938
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "videoinput", label: "Camera", onPick })
3997
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "videoinput", label: "Camera", onPick })
3939
3998
  ] });
3940
3999
  }
3941
4000
  function EffectsSettings({ preview }) {
3942
4001
  const effects = useMediaEffects();
3943
- const [error, setError] = (0, import_react9.useState)(null);
3944
- const fileRef = (0, import_react9.useRef)(null);
4002
+ const [error, setError] = (0, import_react10.useState)(null);
4003
+ const fileRef = (0, import_react10.useRef)(null);
3945
4004
  const supported = effects.backgroundsSupported || preview != null || videoEffectsSupported();
3946
4005
  const apply = (next) => {
3947
4006
  setError(null);
@@ -3953,9 +4012,9 @@ function EffectsSettings({ preview }) {
3953
4012
  );
3954
4013
  }
3955
4014
  };
3956
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__section", "aria-label": "Effects", children: [
3957
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__check", children: [
3958
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4015
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Effects", children: [
4016
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
4017
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3959
4018
  import_design_system.Checkbox,
3960
4019
  {
3961
4020
  id: "mx-meet-noise",
@@ -3963,14 +4022,14 @@ function EffectsSettings({ preview }) {
3963
4022
  onCheckedChange: (checked) => apply({ noiseSuppression: checked === true })
3964
4023
  }
3965
4024
  ),
3966
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__check-text", children: [
3967
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
3968
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
4025
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check-text", children: [
4026
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
4027
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
3969
4028
  ] })
3970
4029
  ] }),
3971
- supported ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__field", children: [
3972
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Label, { children: "Background" }),
3973
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4030
+ supported ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field", children: [
4031
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { children: "Background" }),
4032
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3974
4033
  import_design_system.SegmentedControl,
3975
4034
  {
3976
4035
  fullWidth: true,
@@ -3989,7 +4048,7 @@ function EffectsSettings({ preview }) {
3989
4048
  ]
3990
4049
  }
3991
4050
  ),
3992
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4051
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3993
4052
  "input",
3994
4053
  {
3995
4054
  ref: fileRef,
@@ -4004,7 +4063,7 @@ function EffectsSettings({ preview }) {
4004
4063
  }
4005
4064
  }
4006
4065
  ),
4007
- error !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__error", children: error }) : null
4066
+ error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__error", children: error }) : null
4008
4067
  ] }) : null
4009
4068
  ] });
4010
4069
  }
@@ -4063,8 +4122,8 @@ async function playTestSound(sinkId) {
4063
4122
  await context.close();
4064
4123
  }
4065
4124
  function useMicrophoneStream(deviceId) {
4066
- const [stream, setStream] = (0, import_react9.useState)(null);
4067
- (0, import_react9.useEffect)(() => {
4125
+ const [stream, setStream] = (0, import_react10.useState)(null);
4126
+ (0, import_react10.useEffect)(() => {
4068
4127
  if (deviceId === "off") return void 0;
4069
4128
  let live = true;
4070
4129
  let opened = null;
@@ -4089,31 +4148,31 @@ function useMicrophoneStream(deviceId) {
4089
4148
  function LobbyPanel() {
4090
4149
  const lobby = useLobby();
4091
4150
  if (!lobby.canAdmit || lobby.waiting.length === 0) return null;
4092
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__lobby", "aria-label": "Waiting room", children: [
4093
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__lobby-head", children: [
4094
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "mx-meet__lobby-title", children: lobby.waiting.length === 1 ? "1 person is waiting" : `${lobby.waiting.length} people are waiting` }),
4095
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void lobby.admitAll(), children: "Admit all" })
4151
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__lobby", "aria-label": "Waiting room", children: [
4152
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__lobby-head", children: [
4153
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__lobby-title", children: lobby.waiting.length === 1 ? "1 person is waiting" : `${lobby.waiting.length} people are waiting` }),
4154
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void lobby.admitAll(), children: "Admit all" })
4096
4155
  ] }),
4097
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__lobby-list", children: lobby.waiting.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4156
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__lobby-list", children: lobby.waiting.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4098
4157
  "li",
4099
4158
  {
4100
4159
  className: "mx-meet__lobby-row",
4101
4160
  "data-meet-lobby-entry": "",
4102
4161
  "data-meet-participant-name": entry.displayName,
4103
4162
  children: [
4104
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
4105
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__person-name", children: [
4163
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
4164
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
4106
4165
  entry.displayName,
4107
- entry.userId === null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__badge", children: "Guest" }) : null
4166
+ entry.userId === null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Guest" }) : null
4108
4167
  ] }),
4109
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CheckIcon, { width: 16, height: 16 }) }),
4110
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4168
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CheckIcon, { width: 16, height: 16 }) }),
4169
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4111
4170
  ControlButton,
4112
4171
  {
4113
4172
  label: `Deny ${entry.displayName}`,
4114
4173
  danger: true,
4115
4174
  onClick: () => void lobby.deny(entry),
4116
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 })
4175
+ children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 })
4117
4176
  }
4118
4177
  )
4119
4178
  ]
@@ -4126,21 +4185,21 @@ function NoteTakerRow() {
4126
4185
  const ai = useMeetAi();
4127
4186
  const status = ai.noteTaker;
4128
4187
  const duplicateError = status.refusal !== null && ai.error !== null && status.refusal.reason === ai.error.message && status.refusal.remedy === ai.error.remedy;
4129
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__note-taker", "aria-label": "Note-taker", children: [
4130
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: `mx-meet__note-taker-state mx-meet__note-taker-state--${status.state}`, children: [
4131
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__note-taker-dot", "aria-hidden": "true" }),
4188
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-taker", "aria-label": "Note-taker", children: [
4189
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: `mx-meet__note-taker-state mx-meet__note-taker-state--${status.state}`, children: [
4190
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__note-taker-dot", "aria-hidden": "true" }),
4132
4191
  ai.noteTakerLabel
4133
4192
  ] }),
4134
- status.detail !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: status.detail }) : null,
4135
- status.refusal !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: status.refusal, operation: "Join this meeting", origin: "meet/components", children: [
4136
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-reason", children: status.refusal.reason }),
4137
- status.refusal.remedy.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-remedy", children: status.refusal.remedy }) : null
4193
+ status.detail !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", children: status.detail }) : null,
4194
+ status.refusal !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: status.refusal, operation: "Join this meeting", origin: "meet/components", children: [
4195
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: status.refusal.reason }),
4196
+ status.refusal.remedy.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: status.refusal.remedy }) : null
4138
4197
  ] }) : null,
4139
- ai.error !== null && !duplicateError ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
4140
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
4141
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
4198
+ ai.error !== null && !duplicateError ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
4199
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
4200
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
4142
4201
  ] }) : null,
4143
- ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4202
+ ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4144
4203
  "button",
4145
4204
  {
4146
4205
  type: "button",
@@ -4148,7 +4207,7 @@ function NoteTakerRow() {
4148
4207
  onClick: () => void ai.stopNoteTaker(),
4149
4208
  children: "Dismiss the note-taker"
4150
4209
  }
4151
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4210
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4152
4211
  "button",
4153
4212
  {
4154
4213
  type: "button",
@@ -4164,24 +4223,24 @@ function NoteList({
4164
4223
  notes,
4165
4224
  empty
4166
4225
  }) {
4167
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__note-group", "aria-label": title, children: [
4168
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "mx-meet__note-group-title", children: title }),
4169
- notes.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: empty }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__notes", children: notes.map((note) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__note", children: [
4226
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": title, children: [
4227
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: title }),
4228
+ notes.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", children: empty }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__notes", children: notes.map((note) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__note", children: [
4170
4229
  note.text,
4171
- note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__assignee", children: note.assigneeDisplayName }) : null
4230
+ note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__assignee", children: note.assigneeDisplayName }) : null
4172
4231
  ] }, note.id)) })
4173
4232
  ] });
4174
4233
  }
4175
4234
  function AiPanel({ onClose }) {
4176
4235
  const ai = useMeetAi();
4177
- const [question, setQuestion] = (0, import_react9.useState)("");
4178
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Meeting assistant", onClose, children: [
4179
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NoteTakerRow, {}),
4180
- ai.summary !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Summary", children: [
4181
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "mx-meet__note-group-title", children: "Summary" }),
4182
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__summary", children: ai.summary.text })
4236
+ const [question, setQuestion] = (0, import_react10.useState)("");
4237
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Meeting assistant", onClose, children: [
4238
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(NoteTakerRow, {}),
4239
+ ai.summary !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Summary", children: [
4240
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: "Summary" }),
4241
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__summary", children: ai.summary.text })
4183
4242
  ] }) : null,
4184
- ai.wrapUp !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__wrap-up-notice", role: "status", children: [
4243
+ ai.wrapUp !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__wrap-up-notice", role: "status", children: [
4185
4244
  "The wrap-up is written \u2014 ",
4186
4245
  ai.wrapUp.noteIds.length,
4187
4246
  " ",
@@ -4193,7 +4252,7 @@ function AiPanel({ onClose }) {
4193
4252
  ai.wrapUp.segmentCount === 1 ? "transcript line" : "transcript lines",
4194
4253
  "."
4195
4254
  ] }) : null,
4196
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4255
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4197
4256
  NoteList,
4198
4257
  {
4199
4258
  title: "Notes",
@@ -4201,7 +4260,7 @@ function AiPanel({ onClose }) {
4201
4260
  empty: "Notes appear here as the meeting goes on."
4202
4261
  }
4203
4262
  ),
4204
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4263
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4205
4264
  NoteList,
4206
4265
  {
4207
4266
  title: "Decisions",
@@ -4209,7 +4268,7 @@ function AiPanel({ onClose }) {
4209
4268
  empty: "Nothing has been decided yet."
4210
4269
  }
4211
4270
  ),
4212
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4271
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4213
4272
  NoteList,
4214
4273
  {
4215
4274
  title: "Action items",
@@ -4217,21 +4276,21 @@ function AiPanel({ onClose }) {
4217
4276
  empty: "No action items yet."
4218
4277
  }
4219
4278
  ),
4220
- ai.transcript.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Transcript", children: [
4221
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "mx-meet__note-group-title", children: "Transcript" }),
4222
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__transcript", children: ai.transcript.map((line) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4279
+ ai.transcript.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Transcript", children: [
4280
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: "Transcript" }),
4281
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__transcript", children: ai.transcript.map((line) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4223
4282
  "li",
4224
4283
  {
4225
4284
  className: line.final && line.source === "record" ? "mx-meet__line" : "mx-meet__line mx-meet__line--interim",
4226
4285
  children: [
4227
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: line.speaker }),
4228
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: line.text })
4286
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: line.speaker }),
4287
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: line.text })
4229
4288
  ]
4230
4289
  },
4231
4290
  line.id
4232
4291
  )) })
4233
4292
  ] }) : null,
4234
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4293
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4235
4294
  "form",
4236
4295
  {
4237
4296
  className: "mx-meet__composer",
@@ -4242,7 +4301,7 @@ function AiPanel({ onClose }) {
4242
4301
  void ai.ask(asked);
4243
4302
  },
4244
4303
  children: [
4245
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4304
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4246
4305
  "input",
4247
4306
  {
4248
4307
  className: "mx-meet__input",
@@ -4252,13 +4311,13 @@ function AiPanel({ onClose }) {
4252
4311
  "aria-label": "Ask about this meeting"
4253
4312
  }
4254
4313
  ),
4255
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: ai.asking, children: ai.asking ? "Asking\u2026" : "Ask" })
4314
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: ai.asking, children: ai.asking ? "Asking\u2026" : "Ask" })
4256
4315
  ]
4257
4316
  }
4258
4317
  ),
4259
- ai.asking && ai.phase !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: ai.phase }) : null,
4260
- ai.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__answer", children: ai.answer }) : null,
4261
- ai.answer !== null && ai.coverage !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__coverage", children: [
4318
+ ai.asking && ai.phase !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: ai.phase }) : null,
4319
+ ai.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__answer", children: ai.answer }) : null,
4320
+ ai.answer !== null && ai.coverage !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__coverage", children: [
4262
4321
  "Answered from ",
4263
4322
  ai.coverage.segmentsUsed,
4264
4323
  " of ",
@@ -4267,9 +4326,9 @@ function AiPanel({ onClose }) {
4267
4326
  ai.coverage.truncated ? " (the oldest were left out)" : "",
4268
4327
  "."
4269
4328
  ] }) : null,
4270
- ai.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
4271
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
4272
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
4329
+ ai.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
4330
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
4331
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
4273
4332
  ] }) : null
4274
4333
  ] });
4275
4334
  }
@@ -4278,30 +4337,30 @@ function Captions({ lines = 3 }) {
4278
4337
  const visible = ai.transcript.slice(-lines);
4279
4338
  const translation = useCaptionTranslation(visible);
4280
4339
  if (visible.length === 0) return null;
4281
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__captions", "aria-live": "polite", "aria-label": "Live captions", children: [
4340
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__captions", "aria-live": "polite", "aria-label": "Live captions", children: [
4282
4341
  visible.map((line) => {
4283
4342
  const translated = translation.language === null ? void 0 : translation.translations[line.id];
4284
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4343
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4285
4344
  "p",
4286
4345
  {
4287
4346
  className: line.final ? "mx-meet__caption" : "mx-meet__caption mx-meet__caption--interim",
4288
4347
  children: [
4289
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: line.speaker }),
4348
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: line.speaker }),
4290
4349
  " ",
4291
4350
  translated ?? line.text,
4292
- translated !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__caption-original", children: line.text }) : null
4351
+ translated !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__caption-original", children: line.text }) : null
4293
4352
  ]
4294
4353
  },
4295
4354
  line.id
4296
4355
  );
4297
4356
  }),
4298
- translation.language !== null && translation.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__caption mx-meet__caption--interim", children: translation.error }) : null
4357
+ translation.language !== null && translation.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__caption mx-meet__caption--interim", children: translation.error }) : null
4299
4358
  ] });
4300
4359
  }
4301
4360
  function ConsentNotice() {
4302
4361
  const notice = useConsentNotice();
4303
4362
  if (notice === null) return null;
4304
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__consent", role: "status", children: notice });
4363
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__consent", role: "status", children: notice });
4305
4364
  }
4306
4365
  function AttendanceNotice() {
4307
4366
  const media = useLocalMedia();
@@ -4309,7 +4368,7 @@ function AttendanceNotice() {
4309
4368
  if (notice === null) return null;
4310
4369
  const refused = media.microphone.unavailable;
4311
4370
  const code = microphoneNoticeCode(media.microphone);
4312
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4371
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4313
4372
  "p",
4314
4373
  {
4315
4374
  className: "mx-meet__banner mx-meet__banner--attendance",
@@ -4317,21 +4376,22 @@ function AttendanceNotice() {
4317
4376
  ...code !== null ? { "data-meet-notice": code } : {},
4318
4377
  children: [
4319
4378
  notice,
4320
- refused === null ? null : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__remedy", children: refused.remedy })
4379
+ refused === null ? null : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__remedy", children: refused.remedy })
4321
4380
  ]
4322
4381
  }
4323
4382
  );
4324
4383
  }
4325
4384
  function PreJoin(props) {
4326
4385
  const host = useMeetHost();
4327
- if (host === null) return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(InertNotice, { what: "This meeting" });
4328
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PreJoinBody, { ...props, host });
4386
+ if (host === null) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(InertNotice, { what: "This meeting" });
4387
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PreJoinBody, { ...props, host });
4329
4388
  }
4330
4389
  function PreJoinBody({
4331
4390
  roomName,
4332
4391
  meetingId,
4333
4392
  slug,
4334
4393
  onJoined,
4394
+ observe: observe2 = false,
4335
4395
  host
4336
4396
  }) {
4337
4397
  const room = useRoom();
@@ -4339,21 +4399,21 @@ function PreJoinBody({
4339
4399
  const recording = useRecording();
4340
4400
  const effects = useMediaEffects();
4341
4401
  const { notice } = useModerationNotice();
4342
- const [mode, setMode] = (0, import_react9.useState)("video");
4343
- const [microphone, setMicrophone] = (0, import_react9.useState)(true);
4344
- const [joining, setJoining] = (0, import_react9.useState)(false);
4402
+ const [mode, setMode] = (0, import_react10.useState)("video");
4403
+ const [microphone, setMicrophone] = (0, import_react10.useState)(true);
4404
+ const [joining, setJoining] = (0, import_react10.useState)(false);
4345
4405
  const camera = devices?.selected.videoinput ?? host.devices.resolve("videoinput");
4346
4406
  const mic = devices?.selected.audioinput ?? host.devices.resolve("audioinput");
4347
4407
  const preview = useCameraPreview(mode === "video" ? camera : void 0, effects.effects);
4348
4408
  const micStream = useMicrophoneStream(microphone ? mic : "off");
4349
4409
  const level = useAudioLevel(micStream);
4350
- const [speakerTesting, setSpeakerTesting] = (0, import_react9.useState)(false);
4351
- (0, import_react9.useEffect)(() => {
4410
+ const [speakerTesting, setSpeakerTesting] = (0, import_react10.useState)(false);
4411
+ (0, import_react10.useEffect)(() => {
4352
4412
  void host.devices.refresh();
4353
4413
  }, [host]);
4354
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__prejoin", children: [
4355
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__preview", children: [
4356
- mode === "video" && preview.preview !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4414
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin", children: [
4415
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__preview", children: [
4416
+ mode === "video" && preview.preview !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4357
4417
  "video",
4358
4418
  {
4359
4419
  className: "mx-meet__video mx-meet__video--mirror",
@@ -4364,16 +4424,16 @@ function PreJoinBody({
4364
4424
  if (element !== null) preview.preview?.attach(element);
4365
4425
  }
4366
4426
  }
4367
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 96 }) }),
4368
- mode === "video" && preview.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__preview-note", children: preview.error }) : null,
4369
- microphone && micStream !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__meter mx-meet__meter--preview", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }) : null
4427
+ ) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 96 }) }),
4428
+ mode === "video" && preview.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__preview-note", children: preview.error }) : null,
4429
+ microphone && micStream !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__meter mx-meet__meter--preview", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }) : null
4370
4430
  ] }),
4371
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__prejoin-panel", children: [
4372
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h1", { className: "mx-meet__prejoin-title", children: "Ready to join?" }),
4373
- notice?.kind === "removed" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__warning", children: notice.text }) : null,
4374
- devices?.labelsHidden === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
4431
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin-panel", children: [
4432
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__prejoin-title", children: "Ready to join?" }),
4433
+ notice?.kind === "removed" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__warning", children: notice.text }) : null,
4434
+ devices?.labelsHidden === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
4375
4435
  "Your browser is hiding device names until you allow camera and microphone access.",
4376
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4436
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4377
4437
  "button",
4378
4438
  {
4379
4439
  type: "button",
@@ -4385,11 +4445,11 @@ function PreJoinBody({
4385
4445
  }
4386
4446
  )
4387
4447
  ] }) : null,
4388
- devices?.fallbackNotice != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__warning", children: devices.fallbackNotice }) : null,
4389
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone" }),
4390
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__field-row", children: [
4391
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
4392
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4448
+ devices?.fallbackNotice != null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__warning", children: devices.fallbackNotice }) : null,
4449
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone" }),
4450
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field-row", children: [
4451
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
4452
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4393
4453
  import_design_system.Button,
4394
4454
  {
4395
4455
  type: "button",
@@ -4402,19 +4462,19 @@ function PreJoinBody({
4402
4462
  );
4403
4463
  },
4404
4464
  children: [
4405
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpeakerIcon, {}),
4465
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpeakerIcon, {}),
4406
4466
  " ",
4407
4467
  speakerTesting ? "Playing\u2026" : "Test"
4408
4468
  ]
4409
4469
  }
4410
4470
  )
4411
4471
  ] }),
4412
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DevicePicker, { kind: "videoinput", label: "Camera" }),
4413
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EffectsSettings, { preview: preview.preview }),
4414
- recording.consentNotice !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Alert, { variant: "info", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.AlertDescription, { children: recording.consentNotice }) }) : null,
4415
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__prejoin-actions", children: [
4416
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__check", children: [
4417
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4472
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "videoinput", label: "Camera" }),
4473
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EffectsSettings, { preview: preview.preview }),
4474
+ recording.consentNotice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Alert, { variant: "info", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.AlertDescription, { children: recording.consentNotice }) }) : null,
4475
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin-actions", children: [
4476
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
4477
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4418
4478
  import_design_system.Checkbox,
4419
4479
  {
4420
4480
  id: "mx-meet-join-video",
@@ -4422,10 +4482,10 @@ function PreJoinBody({
4422
4482
  onCheckedChange: (checked) => setMode(checked === true ? "video" : "audio")
4423
4483
  }
4424
4484
  ),
4425
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
4485
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
4426
4486
  ] }),
4427
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__check", children: [
4428
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4487
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
4488
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4429
4489
  import_design_system.Checkbox,
4430
4490
  {
4431
4491
  id: "mx-meet-join-mic",
@@ -4433,9 +4493,9 @@ function PreJoinBody({
4433
4493
  onCheckedChange: (checked) => setMicrophone(checked === true)
4434
4494
  }
4435
4495
  ),
4436
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
4496
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
4437
4497
  ] }),
4438
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4498
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4439
4499
  import_design_system.Button,
4440
4500
  {
4441
4501
  type: "button",
@@ -4446,30 +4506,32 @@ function PreJoinBody({
4446
4506
  preview.release();
4447
4507
  void room.join({
4448
4508
  roomName,
4449
- mode,
4450
- microphone,
4509
+ // An observer publishes nothing: no camera, no microphone (MD-16).
4510
+ mode: observe2 ? "audio" : mode,
4511
+ microphone: observe2 ? false : microphone,
4451
4512
  ...meetingId !== void 0 ? { meetingId } : {},
4452
- ...slug !== void 0 ? { slug } : {}
4513
+ ...slug !== void 0 ? { slug } : {},
4514
+ ...observe2 ? { observe: true } : {}
4453
4515
  }).then(() => onJoined?.()).catch(() => void 0).finally(() => setJoining(false));
4454
4516
  },
4455
- children: joining ? "Joining\u2026" : "Join now"
4517
+ children: joining ? "Joining\u2026" : observe2 ? "Observe" : "Join now"
4456
4518
  }
4457
4519
  )
4458
4520
  ] }),
4459
- room.failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__error", children: [
4521
+ room.failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__error", children: [
4460
4522
  room.failure.message,
4461
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__remedy", children: room.failure.remedy })
4523
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__remedy", children: room.failure.remedy })
4462
4524
  ] }) : null
4463
4525
  ] })
4464
4526
  ] });
4465
4527
  }
4466
4528
  function useCameraPreview(deviceId, effects) {
4467
- const [preview, setPreview] = (0, import_react9.useState)(null);
4468
- const [error, setError] = (0, import_react9.useState)(null);
4469
- const current = (0, import_react9.useRef)(null);
4470
- const initialEffect = (0, import_react9.useRef)(toVideoEffect(effects));
4529
+ const [preview, setPreview] = (0, import_react10.useState)(null);
4530
+ const [error, setError] = (0, import_react10.useState)(null);
4531
+ const current = (0, import_react10.useRef)(null);
4532
+ const initialEffect = (0, import_react10.useRef)(toVideoEffect(effects));
4471
4533
  initialEffect.current = toVideoEffect(effects);
4472
- (0, import_react9.useEffect)(() => {
4534
+ (0, import_react10.useEffect)(() => {
4473
4535
  if (deviceId === void 0) return void 0;
4474
4536
  let live = true;
4475
4537
  setError(null);
@@ -4516,9 +4578,9 @@ function DevicePicker({
4516
4578
  const triggerId = `mx-meet-device-${kind}`;
4517
4579
  const valueOf = (deviceId) => deviceId.length > 0 ? deviceId : "default";
4518
4580
  const current = devices?.selected[kind] ?? host.devices.resolve(kind) ?? "";
4519
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__field", children: [
4520
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Label, { htmlFor: triggerId, children: label }),
4521
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
4581
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field", children: [
4582
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: triggerId, children: label }),
4583
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
4522
4584
  import_design_system.Select,
4523
4585
  {
4524
4586
  ...current.length > 0 ? { value: valueOf(current) } : {},
@@ -4528,8 +4590,8 @@ function DevicePicker({
4528
4590
  else host.devices.select(kind, deviceId);
4529
4591
  },
4530
4592
  children: [
4531
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.SelectValue, { placeholder: label }) }),
4532
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.SelectContent, { children: list.map((device) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
4593
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectValue, { placeholder: label }) }),
4594
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectContent, { children: list.map((device) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
4533
4595
  ]
4534
4596
  }
4535
4597
  )
@@ -4540,83 +4602,86 @@ function MeetSkinRoom({
4540
4602
  meetingId,
4541
4603
  slug,
4542
4604
  onLeave,
4543
- headerControls
4605
+ headerControls,
4606
+ observe: observe2 = false
4544
4607
  }) {
4545
4608
  const { host, snapshot, isHost } = useMeetCore();
4546
4609
  const elapsed = useElapsed(snapshot?.meeting?.startedAt ?? null);
4547
4610
  const phase = snapshot?.phase ?? "idle";
4548
4611
  if (host === null) return null;
4549
4612
  if (phase === "idle" || phase === "failed" || phase === "left") {
4550
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4613
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4551
4614
  PreJoin,
4552
4615
  {
4553
4616
  roomName,
4554
4617
  ...meetingId !== void 0 ? { meetingId } : {},
4555
- ...slug !== void 0 ? { slug } : {}
4618
+ ...slug !== void 0 ? { slug } : {},
4619
+ observe: observe2
4556
4620
  }
4557
4621
  ) });
4558
4622
  }
4559
4623
  if (phase === "lobby") {
4560
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet mx-meet--lobby", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(WaitingRoom, { host, ...onLeave !== void 0 ? { onLeave } : {} }) });
4624
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet mx-meet--lobby", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WaitingRoom, { host, ...onLeave !== void 0 ? { onLeave } : {} }) });
4561
4625
  }
4562
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet", children: [
4563
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ConsentNotice, {}),
4564
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AttendanceNotice, {}),
4565
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__header", children: [
4566
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
4567
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__meta", children: [
4626
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet", children: [
4627
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ConsentNotice, {}),
4628
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AttendanceNotice, {}),
4629
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__header", children: [
4630
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
4631
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__meta", children: [
4568
4632
  participantSummary(snapshot?.participants ?? []),
4569
4633
  elapsed > 0 ? ` \xB7 ${(0, import_format2.formatDurationMs)(elapsed)}` : ""
4570
4634
  ] }),
4571
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(RecordingIndicator, {}),
4572
- snapshot?.locked === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__badge", children: [
4573
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(LockIcon, { width: 12, height: 12 }),
4635
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordingIndicator, {}),
4636
+ isObserverRole(snapshot?.grants.role) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", "data-meet-observing": "self", children: "Observing" }) : null,
4637
+ snapshot?.locked === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__badge", children: [
4638
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LockIcon, { width: 12, height: 12 }),
4574
4639
  " Locked"
4575
4640
  ] }) : null,
4576
- headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__header-controls", "data-meet-header-controls": "", children: headerControls }) : null,
4577
- isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HostMenu, {}) : null
4641
+ headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__header-controls", "data-meet-header-controls": "", children: headerControls }) : null,
4642
+ isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HostMenu, {}) : null
4578
4643
  ] }),
4579
- phase === "reconnecting" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__banner", role: "status", children: "Reconnecting\u2026" }) : null,
4580
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Stage, {}),
4581
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Captions, {}),
4582
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlBar, { ...onLeave !== void 0 ? { onLeave } : {} })
4644
+ phase === "reconnecting" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__banner", role: "status", children: "Reconnecting\u2026" }) : null,
4645
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Stage, {}),
4646
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Captions, {}),
4647
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlBar, { ...onLeave !== void 0 ? { onLeave } : {} })
4583
4648
  ] });
4584
4649
  }
4585
4650
  function WaitingRoom({ host, onLeave }) {
4586
4651
  const { waiting, withdraw, askAgain } = useWaiting();
4587
- const [busy, setBusy] = (0, import_react9.useState)(false);
4652
+ const [busy, setBusy] = (0, import_react10.useState)(false);
4588
4653
  const admission = waiting?.admission ?? "knocking";
4589
4654
  const run = (action) => () => {
4590
4655
  setBusy(true);
4591
4656
  void action().catch(() => void 0).finally(() => setBusy(false));
4592
4657
  };
4593
- const home = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", variant: "outline", onClick: () => onLeave !== void 0 ? onLeave() : window.location.assign("/"), children: "Back to home" });
4658
+ const home = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", onClick: () => onLeave !== void 0 ? onLeave() : window.location.assign("/"), children: "Back to home" });
4594
4659
  let title;
4595
4660
  let line = null;
4596
4661
  let actions;
4597
4662
  switch (admission) {
4598
4663
  case "waiting_host":
4599
4664
  title = "Waiting for the host to start";
4600
- actions = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Leave" });
4665
+ actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Leave" });
4601
4666
  break;
4602
4667
  case "denied":
4603
4668
  title = "The host declined your request";
4604
- actions = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
4605
- waiting?.reknockAllowed === true ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask to join again" }) : null,
4669
+ actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
4670
+ waiting?.reknockAllowed === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask to join again" }) : null,
4606
4671
  home
4607
4672
  ] });
4608
4673
  break;
4609
4674
  case "expired":
4610
4675
  title = "No one responded";
4611
- actions = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
4612
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask again" }),
4676
+ actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
4677
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask again" }),
4613
4678
  home
4614
4679
  ] });
4615
4680
  break;
4616
4681
  case "withdrawn":
4617
4682
  title = "You left the waiting room";
4618
- actions = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
4619
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Rejoin" }),
4683
+ actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
4684
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Rejoin" }),
4620
4685
  home
4621
4686
  ] });
4622
4687
  break;
@@ -4627,23 +4692,23 @@ function WaitingRoom({ host, onLeave }) {
4627
4692
  default:
4628
4693
  title = "Waiting for the host to let you in";
4629
4694
  line = waiting?.admittersPresent === false ? "The host isn't here yet" : null;
4630
- actions = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Cancel request" });
4695
+ actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Cancel request" });
4631
4696
  }
4632
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__waiting", children: [
4633
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 72 }),
4634
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h1", { className: "mx-meet__prejoin-title", children: title }),
4635
- line !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__empty-body", role: "status", "data-meet-notice": "host-absent", children: line }) : null,
4636
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__waiting-actions", children: actions })
4697
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__waiting", children: [
4698
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 72 }),
4699
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__prejoin-title", children: title }),
4700
+ line !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", role: "status", "data-meet-notice": "host-absent", children: line }) : null,
4701
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__waiting-actions", children: actions })
4637
4702
  ] });
4638
4703
  }
4639
4704
  function HostMenu() {
4640
4705
  const host = useRequiredMeetHost();
4641
4706
  const snapshot = useMeetSnapshot();
4642
4707
  const end = useEndMeeting();
4643
- const [confirmingEnd, setConfirmingEnd] = (0, import_react9.useState)(false);
4708
+ const [confirmingEnd, setConfirmingEnd] = (0, import_react10.useState)(false);
4644
4709
  const locked = snapshot?.locked === true;
4645
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__host-menu", children: [
4646
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4710
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__host-menu", children: [
4711
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4647
4712
  "button",
4648
4713
  {
4649
4714
  type: "button",
@@ -4654,9 +4719,9 @@ function HostMenu() {
4654
4719
  children: locked ? "Unlock meeting" : "Lock meeting"
4655
4720
  }
4656
4721
  ),
4657
- end.canEnd ? confirmingEnd ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__confirm", role: "group", "aria-label": "End this meeting?", children: [
4658
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__confirm-text", children: "End it for everyone? Every participant is disconnected, the note-taker stops, and the wrap-up is written. Nobody can rejoin this meeting afterwards." }),
4659
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4722
+ end.canEnd ? confirmingEnd ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__confirm", role: "group", "aria-label": "End this meeting?", children: [
4723
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__confirm-text", children: "End it for everyone? Every participant is disconnected, the note-taker stops, and the wrap-up is written. Nobody can rejoin this meeting afterwards." }),
4724
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4660
4725
  "button",
4661
4726
  {
4662
4727
  type: "button",
@@ -4668,7 +4733,7 @@ function HostMenu() {
4668
4733
  children: "End it"
4669
4734
  }
4670
4735
  ),
4671
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4736
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4672
4737
  "button",
4673
4738
  {
4674
4739
  type: "button",
@@ -4677,7 +4742,7 @@ function HostMenu() {
4677
4742
  children: "Keep it running"
4678
4743
  }
4679
4744
  )
4680
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4745
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4681
4746
  "button",
4682
4747
  {
4683
4748
  type: "button",
@@ -4686,14 +4751,14 @@ function HostMenu() {
4686
4751
  children: end.ending ? "Ending\u2026" : "End meeting for everyone"
4687
4752
  }
4688
4753
  ) : null,
4689
- end.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
4754
+ end.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
4690
4755
  ] });
4691
4756
  }
4692
4757
  function ReactionOverlay({
4693
4758
  reactions
4694
4759
  }) {
4695
4760
  if (reactions.length === 0) return null;
4696
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__reactions", "aria-hidden": "true", children: reactions.map((reaction) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__reaction", children: reaction.emoji }, reaction.id)) });
4761
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__reactions", "aria-hidden": "true", children: reactions.map((reaction) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__reaction", children: reaction.emoji }, reaction.id)) });
4697
4762
  }
4698
4763
  function clockOf(iso) {
4699
4764
  const at = new Date(iso);
@@ -4710,11 +4775,11 @@ function GuestRecordAccessControl({
4710
4775
  const isHost = inRoomHost || viewerId !== null && meeting.hostUserId === viewerId;
4711
4776
  if (host === null || !isHost) return null;
4712
4777
  const resolved = access.setting === "default" && access.effective !== null ? ` Right now that means: ${guestRecordAccessLabel(access.effective.level).toLowerCase()}.` : "";
4713
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__record-section", "aria-label": "What guests may read", children: [
4714
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "mx-meet__record-section-title", children: "What guests may read" }),
4715
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
4716
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "People who attended by link, without an account" }),
4717
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
4778
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__record-section", "aria-label": "What guests may read", children: [
4779
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__record-section-title", children: "What guests may read" }),
4780
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__field", children: [
4781
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__field-label", children: "People who attended by link, without an account" }),
4782
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4718
4783
  "select",
4719
4784
  {
4720
4785
  className: "mx-meet__select",
@@ -4725,18 +4790,18 @@ function GuestRecordAccessControl({
4725
4790
  event.target.value
4726
4791
  );
4727
4792
  },
4728
- children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: choice, children: guestRecordAccessLabel(choice) }, choice))
4793
+ children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("option", { value: choice, children: guestRecordAccessLabel(choice) }, choice))
4729
4794
  }
4730
4795
  )
4731
4796
  ] }),
4732
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
4797
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
4733
4798
  guestRecordAccessExplanation(access.setting),
4734
4799
  resolved
4735
4800
  ] }),
4736
- access.saving ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: "Saving what guests may read\u2026" }) : null,
4737
- access.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: access.error, operation: "Change who can join", origin: "meet/components", children: [
4738
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-reason", children: access.error.message }),
4739
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__refusal-remedy", children: access.error.remedy })
4801
+ access.saving ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: "Saving what guests may read\u2026" }) : null,
4802
+ access.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: access.error, operation: "Change who can join", origin: "meet/components", children: [
4803
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: access.error.message }),
4804
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: access.error.remedy })
4740
4805
  ] }) : null
4741
4806
  ] });
4742
4807
  }