@ai-matrx/meet 0.7.83 → 0.7.85

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.
package/dist/react.js CHANGED
@@ -1,6 +1,18 @@
1
1
  "use client";
2
2
  "use client";
3
3
 
4
+ // src/core/slot.ts
5
+ var NAMESPACE = "ai-matrx.meet";
6
+ function globalSlot(name, create) {
7
+ const key = /* @__PURE__ */ Symbol.for(`${NAMESPACE}.${name}`);
8
+ const host = globalThis;
9
+ const existing = host[key];
10
+ if (existing !== void 0) return existing;
11
+ const created = create();
12
+ host[key] = created;
13
+ return created;
14
+ }
15
+
4
16
  // src/react/provider.tsx
5
17
  import {
6
18
  createContext,
@@ -901,20 +913,6 @@ function fileDownloadPath(fileId) {
901
913
 
902
914
  // src/core/channels.ts
903
915
  import { defineChannelNamespace } from "@ai-matrx/realtime";
904
-
905
- // src/core/slot.ts
906
- var NAMESPACE = "ai-matrx.meet";
907
- function globalSlot(name, create) {
908
- const key = /* @__PURE__ */ Symbol.for(`${NAMESPACE}.${name}`);
909
- const host = globalThis;
910
- const existing = host[key];
911
- if (existing !== void 0) return existing;
912
- const created = create();
913
- host[key] = created;
914
- return created;
915
- }
916
-
917
- // src/core/channels.ts
918
916
  function namespaces() {
919
917
  return globalSlot("channel-namespaces", () => ({
920
918
  user: defineChannelNamespace({
@@ -5223,7 +5221,7 @@ async function createCameraPreview(deviceId2, effect) {
5223
5221
 
5224
5222
  // src/react/provider.tsx
5225
5223
  import { jsx } from "react/jsx-runtime";
5226
- var MeetContext = createContext(null);
5224
+ var MeetContext = globalSlot("react.context", () => createContext(null));
5227
5225
  function defaultDiagnostics(event) {
5228
5226
  const line = `[@ai-matrx/meet] ${event.message}${event.remedy !== void 0 ? `
5229
5227
  \u2192 ${event.remedy}` : ""}`;
@@ -5545,8 +5543,183 @@ function useLocalUserId() {
5545
5543
  return useMeetHost()?.identity.userId ?? null;
5546
5544
  }
5547
5545
 
5546
+ // src/react/root.tsx
5547
+ import { useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2 } from "react";
5548
+
5549
+ // src/core/observation.ts
5550
+ function observedDevice(track) {
5551
+ if (track.enabled) return "on";
5552
+ const refused = track.unavailable;
5553
+ if (refused === null) return "muted_by_me";
5554
+ switch (refused.code) {
5555
+ case "permission-denied":
5556
+ return "unavailable:denied";
5557
+ case "device-not-found":
5558
+ return "unavailable:none";
5559
+ case "device-in-use":
5560
+ return "unavailable:busy";
5561
+ case "insecure-context":
5562
+ return "unavailable:blocked_site";
5563
+ default:
5564
+ return "unavailable:failed";
5565
+ }
5566
+ }
5567
+ function endedRecord(snapshot, given) {
5568
+ const record = snapshot?.meeting ?? given;
5569
+ return record !== null && record.endedAt !== null;
5570
+ }
5571
+ function observedPhase(input) {
5572
+ const { snapshot } = input;
5573
+ if (snapshot === null) return "resolving";
5574
+ const raw = snapshot.phase;
5575
+ const live = raw === "connected" || raw === "reconnecting";
5576
+ if (endedRecord(snapshot, input.meeting ?? null) && !live) return "ended";
5577
+ switch (raw) {
5578
+ case "idle":
5579
+ case "failed":
5580
+ case "left":
5581
+ return "prejoin";
5582
+ case "lobby":
5583
+ return "waiting:knocking";
5584
+ case "requesting-token":
5585
+ case "connecting":
5586
+ return "joining";
5587
+ case "connected":
5588
+ case "reconnecting":
5589
+ return "in_call";
5590
+ }
5591
+ }
5592
+ var ADMITTER_ROLES = /* @__PURE__ */ new Set(["host", "cohost"]);
5593
+ function observe(input) {
5594
+ const { snapshot } = input;
5595
+ const phase = observedPhase(input);
5596
+ const inCall = phase === "in_call";
5597
+ const role = inCall && snapshot !== null ? effectiveRole(snapshot) : "none";
5598
+ const canAdmit = role !== "none" && ADMITTER_ROLES.has(role);
5599
+ const deviceInPlay = phase === "joining" || inCall;
5600
+ return {
5601
+ phase,
5602
+ reason: null,
5603
+ role,
5604
+ connection: snapshot?.phase === "reconnecting" ? "reconnecting" : "stable",
5605
+ hostPresent: inCall && snapshot !== null ? snapshot.participants.some((p) => ADMITTER_ROLES.has(p.role)) : null,
5606
+ lobbyCount: canAdmit && snapshot !== null ? snapshot.lobby.filter((entry) => entry.state === "knocking").length : 0,
5607
+ recording: snapshot?.recording === "recording" || snapshot?.recording === "stopping",
5608
+ audioBlocked: null,
5609
+ camera: deviceInPlay && snapshot !== null ? observedDevice(snapshot.media.camera) : null,
5610
+ microphone: deviceInPlay && snapshot !== null ? observedDevice(snapshot.media.microphone) : null
5611
+ };
5612
+ }
5613
+ function staticObservation(phase, reason = null) {
5614
+ return {
5615
+ phase,
5616
+ reason,
5617
+ role: "none",
5618
+ connection: phase === "disconnected" ? "server_unreachable" : "stable",
5619
+ hostPresent: null,
5620
+ lobbyCount: 0,
5621
+ recording: false,
5622
+ audioBlocked: null,
5623
+ camera: null,
5624
+ microphone: null
5625
+ };
5626
+ }
5627
+ function rootAttributes(o) {
5628
+ const attrs = {
5629
+ "data-meet-root": "",
5630
+ "data-meet-phase": o.phase,
5631
+ "data-meet-role": o.role,
5632
+ "data-meet-connection": o.connection,
5633
+ "data-meet-lobby-count": String(o.lobbyCount),
5634
+ "data-meet-recording": String(o.recording)
5635
+ };
5636
+ if (o.reason !== null) attrs["data-meet-reason"] = o.reason;
5637
+ if (o.hostPresent !== null) attrs["data-meet-host-present"] = String(o.hostPresent);
5638
+ if (o.audioBlocked !== null) attrs["data-meet-audio-blocked"] = String(o.audioBlocked);
5639
+ if (o.camera !== null) attrs["data-meet-camera"] = o.camera;
5640
+ if (o.microphone !== null) attrs["data-meet-microphone"] = o.microphone;
5641
+ attrs["data-meet-regions"] = JSON.stringify({
5642
+ connection: o.connection,
5643
+ camera: o.camera,
5644
+ mic: o.microphone,
5645
+ audio_output: o.audioBlocked === null ? null : o.audioBlocked ? "blocked" : "playing",
5646
+ recording: o.recording
5647
+ });
5648
+ return attrs;
5649
+ }
5650
+ function observedQuality(quality) {
5651
+ switch (quality) {
5652
+ case "excellent":
5653
+ case "good":
5654
+ return "good";
5655
+ case "poor":
5656
+ return "poor";
5657
+ case "lost":
5658
+ return "lost";
5659
+ default:
5660
+ return null;
5661
+ }
5662
+ }
5663
+ function participantAttributes(p) {
5664
+ const attrs = {
5665
+ "data-meet-participant": "",
5666
+ "data-meet-participant-identity": p.identity,
5667
+ "data-meet-participant-name": p.displayName,
5668
+ "data-meet-participant-role": p.role,
5669
+ "data-meet-participant-self": String(p.isLocal)
5670
+ };
5671
+ const quality = observedQuality(p.quality);
5672
+ if (quality !== null) attrs["data-meet-participant-connection"] = quality;
5673
+ return attrs;
5674
+ }
5675
+ function microphoneNoticeCode(track) {
5676
+ const refused = track.unavailable;
5677
+ if (refused === null) return null;
5678
+ return refused.code === "permission-denied" || refused.code === "insecure-context" ? "mic-blocked" : "device-lost";
5679
+ }
5680
+
5681
+ // src/react/root.tsx
5682
+ import { jsx as jsx2 } from "react/jsx-runtime";
5683
+ function useCoreObservation(options = {}) {
5684
+ const snapshot = useMeetSnapshot();
5685
+ const { meeting, phase, reason } = options;
5686
+ return useMemo2(
5687
+ () => phase !== void 0 ? staticObservation(phase, reason ?? null) : observe({ snapshot, meeting: meeting ?? null }),
5688
+ [snapshot, meeting, phase, reason]
5689
+ );
5690
+ }
5691
+ function useCoreRootProps(options = {}) {
5692
+ const observation = useCoreObservation(options);
5693
+ return useMemo2(() => rootAttributes(observation), [observation]);
5694
+ }
5695
+ function MeetRoot({
5696
+ children,
5697
+ ...options
5698
+ }) {
5699
+ const snapshot = useMeetSnapshot();
5700
+ const observation = useCoreObservation(options);
5701
+ const attrs = useMemo2(() => rootAttributes(observation), [observation]);
5702
+ const latest = useRef2({ observation, storePhase: snapshot?.phase ?? null });
5703
+ latest.current = { observation, storePhase: snapshot?.phase ?? null };
5704
+ useEffect2(() => {
5705
+ if (typeof window === "undefined") return void 0;
5706
+ const diagnostics = {
5707
+ contract: "HARNESS-CONTRACT",
5708
+ snapshot: () => latest.current,
5709
+ activeCatalogStates: [],
5710
+ activeCatalogStatesDerived: false
5711
+ };
5712
+ const target = window;
5713
+ target.__matrxMeet = diagnostics;
5714
+ return () => {
5715
+ if (target.__matrxMeet === diagnostics) delete target.__matrxMeet;
5716
+ };
5717
+ }, []);
5718
+ return /* @__PURE__ */ jsx2("div", { ...attrs, style: { display: "contents" }, children });
5719
+ }
5720
+
5548
5721
  // src/react/hooks.ts
5549
- import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2, useSyncExternalStore as useSyncExternalStore2 } from "react";
5722
+ import { useCallback as useCallback2, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef3, useState as useState2, useSyncExternalStore as useSyncExternalStore2 } from "react";
5550
5723
  import { useRealtimeManager as useRealtimeManager2 } from "@ai-matrx/realtime/react";
5551
5724
 
5552
5725
  // src/core/record.ts
@@ -6285,7 +6458,7 @@ function useRoom() {
6285
6458
  function useStage(pageSize = DEFAULT_PAGE_SIZE) {
6286
6459
  const snapshot = useMeetSnapshot();
6287
6460
  const [page, setPage] = useState2(0);
6288
- const stage = useMemo2(
6461
+ const stage = useMemo3(
6289
6462
  () => computeStage({
6290
6463
  participants: snapshot?.participants ?? [],
6291
6464
  layout: snapshot?.layout ?? "grid",
@@ -6297,14 +6470,14 @@ function useStage(pageSize = DEFAULT_PAGE_SIZE) {
6297
6470
  }),
6298
6471
  [snapshot, pageSize, page]
6299
6472
  );
6300
- useEffect2(() => {
6473
+ useEffect3(() => {
6301
6474
  if (page > stage.pageCount - 1) setPage(Math.max(0, stage.pageCount - 1));
6302
6475
  }, [page, stage.pageCount]);
6303
6476
  return stage;
6304
6477
  }
6305
6478
  function useTrack(identity, kind) {
6306
6479
  const host = useMeetHost();
6307
- const detachRef = useRef2(null);
6480
+ const detachRef = useRef3(null);
6308
6481
  return useCallback2(
6309
6482
  (element) => {
6310
6483
  detachRef.current?.();
@@ -6319,7 +6492,7 @@ function useCalls() {
6319
6492
  const host = useMeetHost();
6320
6493
  const center = host?.calls ?? null;
6321
6494
  const [, force] = useState2(0);
6322
- useEffect2(() => {
6495
+ useEffect3(() => {
6323
6496
  if (center === null) return void 0;
6324
6497
  const timer = setInterval(() => force((value) => value + 1), 1e3);
6325
6498
  return () => clearInterval(timer);
@@ -6440,7 +6613,7 @@ function useMeetAi() {
6440
6613
  const participants = snapshot?.participants ?? [];
6441
6614
  const notes = snapshot?.notes ?? [];
6442
6615
  const wrapUp = snapshot?.wrapUp ?? null;
6443
- const status = useMemo2(
6616
+ const status = useMemo3(
6444
6617
  () => noteTakerStatus({
6445
6618
  meeting,
6446
6619
  participants,
@@ -6449,7 +6622,7 @@ function useMeetAi() {
6449
6622
  [meeting, participants, snapshot?.noteTakerRefusal]
6450
6623
  );
6451
6624
  const names = snapshot?.names ?? EMPTY_NAMES;
6452
- const transcript = useMemo2(
6625
+ const transcript = useMemo3(
6453
6626
  () => readableTranscript(snapshot?.transcript ?? []).map((line) => ({
6454
6627
  id: line.id,
6455
6628
  identity: line.identity,
@@ -6594,7 +6767,7 @@ function useReactions() {
6594
6767
  const host = useMeetHost();
6595
6768
  const snapshot = useMeetSnapshot();
6596
6769
  const store = host?.store ?? null;
6597
- useEffect2(() => {
6770
+ useEffect3(() => {
6598
6771
  if (store === null) return void 0;
6599
6772
  const timer = setInterval(() => store.expireReactions(Date.now()), REACTION_TTL_MS / 2);
6600
6773
  return () => clearInterval(timer);
@@ -6603,7 +6776,7 @@ function useReactions() {
6603
6776
  }
6604
6777
  function useElapsed(startedAt) {
6605
6778
  const [now, setNow] = useState2(() => Date.now());
6606
- useEffect2(() => {
6779
+ useEffect3(() => {
6607
6780
  if (startedAt === null) return void 0;
6608
6781
  const timer = setInterval(() => setNow(Date.now()), 1e3);
6609
6782
  return () => clearInterval(timer);
@@ -6683,7 +6856,7 @@ function useHostControls() {
6683
6856
  }
6684
6857
  function useHandQueue() {
6685
6858
  const snapshot = useMeetSnapshot();
6686
- return useMemo2(
6859
+ return useMemo3(
6687
6860
  () => (snapshot?.participants ?? []).filter((participant) => participant.handRaised).sort((a, b) => (a.handRaisedAt ?? 0) - (b.handRaisedAt ?? 0)),
6688
6861
  [snapshot?.participants]
6689
6862
  );
@@ -6711,7 +6884,7 @@ function useModerationNotice() {
6711
6884
  }
6712
6885
  function useAudioLevel(stream) {
6713
6886
  const [level, setLevel] = useState2(0);
6714
- useEffect2(() => {
6887
+ useEffect3(() => {
6715
6888
  if (stream === null || stream.getAudioTracks().length === 0) {
6716
6889
  setLevel(0);
6717
6890
  return void 0;
@@ -6750,9 +6923,9 @@ var MEET_SHORTCUTS = [
6750
6923
  { id: "help", keys: "Shift + ?", label: "Show keyboard shortcuts" }
6751
6924
  ];
6752
6925
  function useMeetShortcuts(handlers) {
6753
- const ref = useRef2(handlers);
6926
+ const ref = useRef3(handlers);
6754
6927
  ref.current = handlers;
6755
- useEffect2(() => {
6928
+ useEffect3(() => {
6756
6929
  const target = globalThis.window;
6757
6930
  if (target === void 0) return void 0;
6758
6931
  const onKey = (event) => {
@@ -6815,7 +6988,7 @@ function useMeetingRecord(meeting) {
6815
6988
  () => cache.state(key),
6816
6989
  () => cache.state(null)
6817
6990
  );
6818
- const readRef = useRef2(() => Promise.reject(new Error("not ready")));
6991
+ const readRef = useRef3(() => Promise.reject(new Error("not ready")));
6819
6992
  readRef.current = async () => {
6820
6993
  if (repository === null || meeting === null || meetingId === null) throw new Error("No meeting to read.");
6821
6994
  if (readerId === null && api !== null && tokens !== null && roomName !== null) {
@@ -6844,14 +7017,14 @@ function useMeetingRecord(meeting) {
6844
7017
  }
6845
7018
  return { kind: "parts", meeting, parts };
6846
7019
  };
6847
- useEffect2(() => {
7020
+ useEffect3(() => {
6848
7021
  if (key === null) return;
6849
7022
  void cache.ensure(key, () => readRef.current());
6850
7023
  }, [cache, key]);
6851
- useEffect2(() => {
7024
+ useEffect3(() => {
6852
7025
  if (key !== null && meeting !== null) cache.setMeeting(key, meeting);
6853
7026
  }, [cache, key, meeting]);
6854
- useEffect2(() => {
7027
+ useEffect3(() => {
6855
7028
  if (key === null || manager === null || repository === null || meetingId === null || readerId === null) {
6856
7029
  return void 0;
6857
7030
  }
@@ -6952,7 +7125,7 @@ function useMeetings(limit = 25, organizationFilter = null) {
6952
7125
  const [loading, setLoading] = useState2(true);
6953
7126
  const [failure, setFailure] = useState2(null);
6954
7127
  const [nonce, setNonce] = useState2(0);
6955
- useEffect2(() => {
7128
+ useEffect3(() => {
6956
7129
  if (repository === null) return void 0;
6957
7130
  let live = true;
6958
7131
  setLoading(true);
@@ -6990,7 +7163,7 @@ function useGuestRecordAccess(meeting) {
6990
7163
  const [effective, setEffective] = useState2(null);
6991
7164
  const [saving, setSaving] = useState2(false);
6992
7165
  const [error, setError] = useState2(null);
6993
- useEffect2(() => {
7166
+ useEffect3(() => {
6994
7167
  setChosen(null);
6995
7168
  }, [stored, meeting?.id]);
6996
7169
  return {
@@ -7026,23 +7199,15 @@ function useGuestRecordAccess(meeting) {
7026
7199
  };
7027
7200
  }
7028
7201
 
7029
- // src/react/components.tsx
7030
- import { useEffect as useEffect4, useLayoutEffect, useMemo as useMemo3, useRef as useRef4, useState as useState4 } from "react";
7031
- import {
7032
- Alert,
7033
- AlertDescription,
7034
- Button,
7035
- Checkbox,
7036
- ErrorBox,
7037
- Label,
7038
- SegmentedControl,
7039
- Select,
7040
- SelectContent,
7041
- SelectItem,
7042
- SelectTrigger,
7043
- SelectValue
7044
- } from "@ai-matrx/design-system";
7045
- import { avatarPaletteIndex, formatDurationMs as formatDurationMs4, getInitials } from "@ai-matrx/kit/format";
7202
+ // src/react/skin-root.tsx
7203
+ import { useEffect as useEffect8 } from "react";
7204
+
7205
+ // src/skins/meet/components.tsx
7206
+ import { useEffect as useEffect6, useLayoutEffect, useRef as useRef6, useState as useState4 } from "react";
7207
+
7208
+ // src/react/facade.ts
7209
+ import { useMemo as useMemo4 } from "react";
7210
+ import { avatarPaletteIndex, formatDurationMs as formatDurationMs3, getInitials } from "@ai-matrx/kit/format";
7046
7211
 
7047
7212
  // src/core/after.ts
7048
7213
  import { toDelimited } from "@ai-matrx/kit/delimited";
@@ -7479,14 +7644,154 @@ function countLabel(count2, singular, plural = `${singular}s`) {
7479
7644
  return `${count2} ${count2 === 1 ? singular : plural}`;
7480
7645
  }
7481
7646
 
7482
- // src/react/collab.tsx
7483
- import { useEffect as useEffect3, useRef as useRef3, useState as useState3 } from "react";
7484
- import { formatDurationMs as formatDurationMs3 } from "@ai-matrx/kit/format";
7647
+ // src/core/collab-state.ts
7648
+ function availableActivities(collab, isHost) {
7649
+ const settings = collab?.settings ?? null;
7650
+ if (settings === null) return [];
7651
+ const out = [];
7652
+ if (settings.whiteboardEnabled) out.push("whiteboard");
7653
+ if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
7654
+ if (settings.qaEnabled) out.push("qa");
7655
+ if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
7656
+ return out;
7657
+ }
7658
+ function activityAttention(collab, isHost) {
7659
+ if (collab === null) return false;
7660
+ if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
7661
+ if (isHost && collab.questions.some((q) => q.state === "open")) return true;
7662
+ return false;
7663
+ }
7664
+ async function performCollab(runtime, request) {
7665
+ if (runtime === null) return { ok: false, message: "This meeting is not connected." };
7666
+ try {
7667
+ const result = await runtime.inRoom.collab(request);
7668
+ return { ok: true, message: result.message, itemId: result.itemId };
7669
+ } catch (error) {
7670
+ return { ok: false, message: error.message ?? "That did not work." };
7671
+ }
7672
+ }
7673
+ async function moveToRoom(runtime, roomId) {
7674
+ if (runtime === null) return { ok: false, message: "This meeting is not connected." };
7675
+ try {
7676
+ await runtime.engine.moveToBreakout(roomId);
7677
+ return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
7678
+ } catch (error) {
7679
+ return { ok: false, message: error.message ?? "That room could not be joined." };
7680
+ }
7681
+ }
7682
+ function untranslatedLines(lines, translations) {
7683
+ return lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text: text3 }) => ({ id, text: text3 }));
7684
+ }
7685
+ function nextTranslationBatch(pending, language, asked) {
7686
+ const batch = pending.filter((line) => !asked.has(`${language}:${line.id}`)).slice(-20);
7687
+ for (const line of batch) asked.add(`${language}:${line.id}`);
7688
+ return batch;
7689
+ }
7690
+ function setCaptionLanguage(store, next) {
7691
+ store.patch({
7692
+ collab: {
7693
+ ...store.snapshot().collab,
7694
+ captionLanguage: next,
7695
+ captionTranslations: {},
7696
+ captionTranslationError: null
7697
+ }
7698
+ });
7699
+ }
7700
+ function takePanelRequest(store) {
7701
+ const request = store.snapshot().collab.panelRequest;
7702
+ if (request === null) return null;
7703
+ store.patch({ collab: { ...store.snapshot().collab, panelRequest: null } });
7704
+ return request.panel;
7705
+ }
7706
+ function takeMoveRequest(store) {
7707
+ const request = store.snapshot().collab.moveRequest;
7708
+ if (request === null) return null;
7709
+ store.patch({ collab: { ...store.snapshot().collab, moveRequest: null } });
7710
+ return { roomId: request.roomId };
7711
+ }
7712
+
7713
+ // src/react/collab-hooks.ts
7714
+ import { useEffect as useEffect4, useRef as useRef4 } from "react";
7715
+ function useCollab() {
7716
+ const host = useMeetHost();
7717
+ const snapshot = useMeetSnapshot();
7718
+ const isHost = useIsHost();
7719
+ return {
7720
+ collab: snapshot?.collab ?? null,
7721
+ isHost,
7722
+ localIdentity: snapshot?.localIdentity ?? null,
7723
+ breakoutRoomId: snapshot?.breakoutRoomId ?? null,
7724
+ act: (request) => performCollab(host, request),
7725
+ moveTo: (roomId) => moveToRoom(host, roomId)
7726
+ };
7727
+ }
7728
+ function useAvailableActivities() {
7729
+ const { collab, isHost } = useCollab();
7730
+ return availableActivities(collab, isHost);
7731
+ }
7732
+ function useActivityAttention() {
7733
+ const { collab, isHost } = useCollab();
7734
+ return activityAttention(collab, isHost);
7735
+ }
7736
+ function useCaptionTranslation(lines) {
7737
+ const host = useMeetHost();
7738
+ const snapshot = useMeetSnapshot();
7739
+ const collab = snapshot?.collab ?? null;
7740
+ const language = collab?.captionLanguage ?? null;
7741
+ const asked = useRef4(/* @__PURE__ */ new Set());
7742
+ const translations = collab?.captionTranslations ?? {};
7743
+ const missing = untranslatedLines(lines, translations);
7744
+ const key = `${language ?? ""}|${missing.map((l) => l.id).join(",")}`;
7745
+ const pending = useRef4(missing);
7746
+ pending.current = missing;
7747
+ useEffect4(() => {
7748
+ if (host === null || language === null) return;
7749
+ const batch = nextTranslationBatch(pending.current, language, asked.current);
7750
+ if (batch.length === 0) return;
7751
+ void host.inRoom.translateCaptions(language, batch).catch(() => void 0);
7752
+ }, [host, language, key]);
7753
+ return { language, translations, error: collab?.captionTranslationError ?? null };
7754
+ }
7755
+ function useCollabPanelRequest(onRequest) {
7756
+ const host = useMeetHost();
7757
+ const at = useMeetSnapshot()?.collab.panelRequest?.at ?? null;
7758
+ const callback = useRef4(onRequest);
7759
+ callback.current = onRequest;
7760
+ useEffect4(() => {
7761
+ if (host === null) return;
7762
+ const panel = takePanelRequest(host.store);
7763
+ if (panel === null) return;
7764
+ callback.current(panel);
7765
+ }, [at, host]);
7766
+ }
7767
+
7768
+ // src/core/reactions.ts
7769
+ var MEET_REACTIONS = ["\u{1F496}", "\u{1F44D}", "\u{1F389}", "\u{1F44F}", "\u{1F602}", "\u{1F62E}", "\u{1F622}", "\u{1F914}", "\u{1F44E}"];
7770
+
7771
+ // src/react/facade.ts
7772
+ function useMeetCore() {
7773
+ const host = useMeetHost();
7774
+ const snapshot = useMeetSnapshot();
7775
+ const devices = useDeviceSnapshot();
7776
+ const role = useRole();
7777
+ const isHost = useIsHost();
7778
+ const observation = useCoreObservation();
7779
+ return useMemo4(
7780
+ () => ({ host, snapshot, devices, role, isHost, observation }),
7781
+ [host, snapshot, devices, role, isHost, observation]
7782
+ );
7783
+ }
7784
+
7785
+ // src/skins/meet/components.tsx
7786
+ import { Alert, AlertDescription, Button, Checkbox, ErrorBox, Label, SegmentedControl, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@ai-matrx/design-system";
7787
+
7788
+ // src/skins/meet/collab.tsx
7789
+ import { useEffect as useEffect5, useRef as useRef5, useState as useState3 } from "react";
7485
7790
 
7486
- // src/react/icons.tsx
7487
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
7791
+ // src/skins/meet/icons.tsx
7792
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
7488
7793
  function Icon({ children, ...props }) {
7489
- return /* @__PURE__ */ jsx2(
7794
+ return /* @__PURE__ */ jsx3(
7490
7795
  "svg",
7491
7796
  {
7492
7797
  width: "20",
@@ -7506,255 +7811,214 @@ function Icon({ children, ...props }) {
7506
7811
  }
7507
7812
  function MicIcon(props) {
7508
7813
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7509
- /* @__PURE__ */ jsx2("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
7510
- /* @__PURE__ */ jsx2("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
7511
- /* @__PURE__ */ jsx2("path", { d: "M12 19v3" })
7814
+ /* @__PURE__ */ jsx3("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
7815
+ /* @__PURE__ */ jsx3("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
7816
+ /* @__PURE__ */ jsx3("path", { d: "M12 19v3" })
7512
7817
  ] });
7513
7818
  }
7514
7819
  function MicOffIcon(props) {
7515
7820
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7516
- /* @__PURE__ */ jsx2("path", { d: "M2 2l20 20" }),
7517
- /* @__PURE__ */ jsx2("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
7518
- /* @__PURE__ */ jsx2("path", { d: "M15 9.34V5a3 3 0 0 0-5.94-.6" }),
7519
- /* @__PURE__ */ jsx2("path", { d: "M19 10v2a7 7 0 0 1-.11 1.23M5 10v2a7 7 0 0 0 11 5.66" }),
7520
- /* @__PURE__ */ jsx2("path", { d: "M12 19v3" })
7821
+ /* @__PURE__ */ jsx3("path", { d: "M2 2l20 20" }),
7822
+ /* @__PURE__ */ jsx3("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
7823
+ /* @__PURE__ */ jsx3("path", { d: "M15 9.34V5a3 3 0 0 0-5.94-.6" }),
7824
+ /* @__PURE__ */ jsx3("path", { d: "M19 10v2a7 7 0 0 1-.11 1.23M5 10v2a7 7 0 0 0 11 5.66" }),
7825
+ /* @__PURE__ */ jsx3("path", { d: "M12 19v3" })
7521
7826
  ] });
7522
7827
  }
7523
7828
  function CameraIcon(props) {
7524
7829
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7525
- /* @__PURE__ */ jsx2("path", { d: "m23 7-7 5 7 5V7Z" }),
7526
- /* @__PURE__ */ jsx2("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2" })
7830
+ /* @__PURE__ */ jsx3("path", { d: "m23 7-7 5 7 5V7Z" }),
7831
+ /* @__PURE__ */ jsx3("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2" })
7527
7832
  ] });
7528
7833
  }
7529
7834
  function CameraOffIcon(props) {
7530
7835
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7531
- /* @__PURE__ */ jsx2("path", { d: "M2 2l20 20" }),
7532
- /* @__PURE__ */ jsx2("path", { d: "M10.66 5H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10" }),
7533
- /* @__PURE__ */ jsx2("path", { d: "M16 16a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2" })
7836
+ /* @__PURE__ */ jsx3("path", { d: "M2 2l20 20" }),
7837
+ /* @__PURE__ */ jsx3("path", { d: "M10.66 5H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10" }),
7838
+ /* @__PURE__ */ jsx3("path", { d: "M16 16a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2" })
7534
7839
  ] });
7535
7840
  }
7536
7841
  function ScreenShareIcon(props) {
7537
7842
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7538
- /* @__PURE__ */ jsx2("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
7539
- /* @__PURE__ */ jsx2("path", { d: "M8 21h8M12 17v4" }),
7540
- /* @__PURE__ */ jsx2("path", { d: "M12 13V8m0 0-2.5 2.5M12 8l2.5 2.5" })
7843
+ /* @__PURE__ */ jsx3("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
7844
+ /* @__PURE__ */ jsx3("path", { d: "M8 21h8M12 17v4" }),
7845
+ /* @__PURE__ */ jsx3("path", { d: "M12 13V8m0 0-2.5 2.5M12 8l2.5 2.5" })
7541
7846
  ] });
7542
7847
  }
7543
7848
  function PhoneIcon(props) {
7544
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("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" }) });
7849
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("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" }) });
7545
7850
  }
7546
7851
  function PhoneOffIcon(props) {
7547
- return /* @__PURE__ */ jsx2(Icon, { fill: "currentColor", stroke: "none", ...props, children: /* @__PURE__ */ jsx2("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" }) });
7852
+ return /* @__PURE__ */ jsx3(Icon, { fill: "currentColor", stroke: "none", ...props, children: /* @__PURE__ */ jsx3("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" }) });
7548
7853
  }
7549
7854
  function HandIcon(props) {
7550
7855
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7551
- /* @__PURE__ */ jsx2("path", { d: "M18 11V6a2 2 0 0 0-4 0v5" }),
7552
- /* @__PURE__ */ jsx2("path", { d: "M14 10V4a2 2 0 0 0-4 0v7" }),
7553
- /* @__PURE__ */ jsx2("path", { d: "M10 10.5V6a2 2 0 0 0-4 0v8" }),
7554
- /* @__PURE__ */ jsx2("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" })
7856
+ /* @__PURE__ */ jsx3("path", { d: "M18 11V6a2 2 0 0 0-4 0v5" }),
7857
+ /* @__PURE__ */ jsx3("path", { d: "M14 10V4a2 2 0 0 0-4 0v7" }),
7858
+ /* @__PURE__ */ jsx3("path", { d: "M10 10.5V6a2 2 0 0 0-4 0v8" }),
7859
+ /* @__PURE__ */ jsx3("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" })
7555
7860
  ] });
7556
7861
  }
7557
7862
  function ChatIcon(props) {
7558
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z" }) });
7863
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z" }) });
7559
7864
  }
7560
7865
  function PeopleIcon(props) {
7561
7866
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7562
- /* @__PURE__ */ jsx2("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
7563
- /* @__PURE__ */ jsx2("circle", { cx: "9", cy: "7", r: "4" }),
7564
- /* @__PURE__ */ jsx2("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" })
7867
+ /* @__PURE__ */ jsx3("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
7868
+ /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "7", r: "4" }),
7869
+ /* @__PURE__ */ jsx3("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" })
7565
7870
  ] });
7566
7871
  }
7567
7872
  function RecordIcon(props) {
7568
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "8", fill: "currentColor", stroke: "none" }) });
7873
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "8", fill: "currentColor", stroke: "none" }) });
7569
7874
  }
7570
7875
  function SparklesIcon(props) {
7571
7876
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7572
- /* @__PURE__ */ jsx2("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" }),
7573
- /* @__PURE__ */ jsx2("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" })
7877
+ /* @__PURE__ */ jsx3("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" }),
7878
+ /* @__PURE__ */ jsx3("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" })
7574
7879
  ] });
7575
7880
  }
7576
7881
  function LockIcon(props) {
7577
7882
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7578
- /* @__PURE__ */ jsx2("rect", { x: "4", y: "10", width: "16", height: "11", rx: "2" }),
7579
- /* @__PURE__ */ jsx2("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
7580
- ] });
7581
- }
7582
- function LayoutIcon(props) {
7583
- return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7584
- /* @__PURE__ */ jsx2("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
7585
- /* @__PURE__ */ jsx2("path", { d: "M3 9h18M9 21V9" })
7883
+ /* @__PURE__ */ jsx3("rect", { x: "4", y: "10", width: "16", height: "11", rx: "2" }),
7884
+ /* @__PURE__ */ jsx3("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
7586
7885
  ] });
7587
7886
  }
7588
7887
  function SettingsIcon(props) {
7589
7888
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7590
- /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "3" }),
7591
- /* @__PURE__ */ jsx2("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" })
7889
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "3" }),
7890
+ /* @__PURE__ */ jsx3("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" })
7592
7891
  ] });
7593
7892
  }
7594
7893
  function CheckIcon(props) {
7595
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("path", { d: "M20 6 9 17l-5-5" }) });
7894
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("path", { d: "M20 6 9 17l-5-5" }) });
7596
7895
  }
7597
7896
  function CloseIcon(props) {
7598
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("path", { d: "M18 6 6 18M6 6l12 12" }) });
7897
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("path", { d: "M18 6 6 18M6 6l12 12" }) });
7599
7898
  }
7600
7899
  function PinIcon(props) {
7601
7900
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7602
- /* @__PURE__ */ jsx2("path", { d: "M12 17v5" }),
7603
- /* @__PURE__ */ jsx2("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
7604
- ] });
7605
- }
7606
- function WifiLowIcon(props) {
7607
- return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7608
- /* @__PURE__ */ jsx2("path", { d: "M12 20h.01" }),
7609
- /* @__PURE__ */ jsx2("path", { d: "M8.5 16.5a5 5 0 0 1 7 0" })
7901
+ /* @__PURE__ */ jsx3("path", { d: "M12 17v5" }),
7902
+ /* @__PURE__ */ jsx3("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
7610
7903
  ] });
7611
7904
  }
7612
7905
  function SmileIcon(props) {
7613
7906
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7614
- /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "10" }),
7615
- /* @__PURE__ */ jsx2("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
7616
- /* @__PURE__ */ jsx2("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
7617
- /* @__PURE__ */ jsx2("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" })
7907
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
7908
+ /* @__PURE__ */ jsx3("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
7909
+ /* @__PURE__ */ jsx3("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
7910
+ /* @__PURE__ */ jsx3("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" })
7618
7911
  ] });
7619
7912
  }
7620
7913
  function MoreIcon(props) {
7621
7914
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7622
- /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "1" }),
7623
- /* @__PURE__ */ jsx2("circle", { cx: "19", cy: "12", r: "1" }),
7624
- /* @__PURE__ */ jsx2("circle", { cx: "5", cy: "12", r: "1" })
7915
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "1" }),
7916
+ /* @__PURE__ */ jsx3("circle", { cx: "19", cy: "12", r: "1" }),
7917
+ /* @__PURE__ */ jsx3("circle", { cx: "5", cy: "12", r: "1" })
7625
7918
  ] });
7626
7919
  }
7627
7920
  function SearchIcon(props) {
7628
7921
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7629
- /* @__PURE__ */ jsx2("circle", { cx: "11", cy: "11", r: "8" }),
7630
- /* @__PURE__ */ jsx2("path", { d: "m21 21-4.3-4.3" })
7922
+ /* @__PURE__ */ jsx3("circle", { cx: "11", cy: "11", r: "8" }),
7923
+ /* @__PURE__ */ jsx3("path", { d: "m21 21-4.3-4.3" })
7631
7924
  ] });
7632
7925
  }
7633
7926
  function KeyboardIcon(props) {
7634
7927
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7635
- /* @__PURE__ */ jsx2("path", { d: "M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10M8 12h.01" }),
7636
- /* @__PURE__ */ jsx2("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" })
7928
+ /* @__PURE__ */ jsx3("path", { d: "M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10M8 12h.01" }),
7929
+ /* @__PURE__ */ jsx3("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" })
7637
7930
  ] });
7638
7931
  }
7639
7932
  function SpotlightIcon(props) {
7640
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("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" }) });
7933
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("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" }) });
7641
7934
  }
7642
7935
  function SignalIcon({ bars, ...props }) {
7643
7936
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7644
- /* @__PURE__ */ jsx2("path", { d: "M4 20v-2", opacity: bars >= 1 ? 1 : 0.3 }),
7645
- /* @__PURE__ */ jsx2("path", { d: "M10 20v-6", opacity: bars >= 2 ? 1 : 0.3 }),
7646
- /* @__PURE__ */ jsx2("path", { d: "M16 20V9", opacity: bars >= 3 ? 1 : 0.3 }),
7647
- /* @__PURE__ */ jsx2("path", { d: "M22 20V4", opacity: bars >= 3 ? 1 : 0.3 })
7937
+ /* @__PURE__ */ jsx3("path", { d: "M4 20v-2", opacity: bars >= 1 ? 1 : 0.3 }),
7938
+ /* @__PURE__ */ jsx3("path", { d: "M10 20v-6", opacity: bars >= 2 ? 1 : 0.3 }),
7939
+ /* @__PURE__ */ jsx3("path", { d: "M16 20V9", opacity: bars >= 3 ? 1 : 0.3 }),
7940
+ /* @__PURE__ */ jsx3("path", { d: "M22 20V4", opacity: bars >= 3 ? 1 : 0.3 })
7648
7941
  ] });
7649
7942
  }
7650
7943
  function SpeakerIcon(props) {
7651
7944
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7652
- /* @__PURE__ */ jsx2("path", { d: "M11 5 6 9H2v6h4l5 4V5Z" }),
7653
- /* @__PURE__ */ jsx2("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" }),
7654
- /* @__PURE__ */ jsx2("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" })
7945
+ /* @__PURE__ */ jsx3("path", { d: "M11 5 6 9H2v6h4l5 4V5Z" }),
7946
+ /* @__PURE__ */ jsx3("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" }),
7947
+ /* @__PURE__ */ jsx3("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" })
7655
7948
  ] });
7656
7949
  }
7657
7950
  function FlagIcon(props) {
7658
7951
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7659
- /* @__PURE__ */ jsx2("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" }),
7660
- /* @__PURE__ */ jsx2("line", { x1: "4", x2: "4", y1: "22", y2: "15" })
7952
+ /* @__PURE__ */ jsx3("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" }),
7953
+ /* @__PURE__ */ jsx3("line", { x1: "4", x2: "4", y1: "22", y2: "15" })
7661
7954
  ] });
7662
7955
  }
7663
7956
  function PencilIcon(props) {
7664
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("path", { d: "M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" }) });
7957
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("path", { d: "M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" }) });
7665
7958
  }
7666
7959
  function ActivitiesIcon(props) {
7667
7960
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7668
- /* @__PURE__ */ jsx2("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" }),
7669
- /* @__PURE__ */ jsx2("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
7670
- /* @__PURE__ */ jsx2("circle", { cx: "17.5", cy: "17.5", r: "3.5" })
7961
+ /* @__PURE__ */ jsx3("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" }),
7962
+ /* @__PURE__ */ jsx3("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
7963
+ /* @__PURE__ */ jsx3("circle", { cx: "17.5", cy: "17.5", r: "3.5" })
7671
7964
  ] });
7672
7965
  }
7673
7966
  function PollIcon(props) {
7674
7967
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7675
- /* @__PURE__ */ jsx2("line", { x1: "18", x2: "18", y1: "20", y2: "10" }),
7676
- /* @__PURE__ */ jsx2("line", { x1: "12", x2: "12", y1: "20", y2: "4" }),
7677
- /* @__PURE__ */ jsx2("line", { x1: "6", x2: "6", y1: "20", y2: "14" })
7968
+ /* @__PURE__ */ jsx3("line", { x1: "18", x2: "18", y1: "20", y2: "10" }),
7969
+ /* @__PURE__ */ jsx3("line", { x1: "12", x2: "12", y1: "20", y2: "4" }),
7970
+ /* @__PURE__ */ jsx3("line", { x1: "6", x2: "6", y1: "20", y2: "14" })
7678
7971
  ] });
7679
7972
  }
7680
7973
  function QuestionIcon(props) {
7681
7974
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7682
- /* @__PURE__ */ jsx2("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
7683
- /* @__PURE__ */ jsx2("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
7684
- /* @__PURE__ */ jsx2("path", { d: "M12 17h.01" })
7975
+ /* @__PURE__ */ jsx3("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
7976
+ /* @__PURE__ */ jsx3("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
7977
+ /* @__PURE__ */ jsx3("path", { d: "M12 17h.01" })
7685
7978
  ] });
7686
7979
  }
7687
7980
  function WhiteboardIcon(props) {
7688
7981
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7689
- /* @__PURE__ */ jsx2("path", { d: "M2 3h20" }),
7690
- /* @__PURE__ */ jsx2("path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" }),
7691
- /* @__PURE__ */ jsx2("path", { d: "m7 21 5-5 5 5" })
7982
+ /* @__PURE__ */ jsx3("path", { d: "M2 3h20" }),
7983
+ /* @__PURE__ */ jsx3("path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" }),
7984
+ /* @__PURE__ */ jsx3("path", { d: "m7 21 5-5 5 5" })
7692
7985
  ] });
7693
7986
  }
7694
7987
  function BreakoutIcon(props) {
7695
7988
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7696
- /* @__PURE__ */ jsx2("rect", { width: "7", height: "18", x: "3", y: "3", rx: "1" }),
7697
- /* @__PURE__ */ jsx2("rect", { width: "7", height: "7", x: "14", y: "3", rx: "1" }),
7698
- /* @__PURE__ */ jsx2("rect", { width: "7", height: "7", x: "14", y: "14", rx: "1" })
7989
+ /* @__PURE__ */ jsx3("rect", { width: "7", height: "18", x: "3", y: "3", rx: "1" }),
7990
+ /* @__PURE__ */ jsx3("rect", { width: "7", height: "7", x: "14", y: "3", rx: "1" }),
7991
+ /* @__PURE__ */ jsx3("rect", { width: "7", height: "7", x: "14", y: "14", rx: "1" })
7699
7992
  ] });
7700
7993
  }
7701
7994
  function UpvoteIcon(props) {
7702
- return /* @__PURE__ */ jsx2(Icon, { ...props, children: /* @__PURE__ */ jsx2("path", { d: "M9 18v-6H5l7-7 7 7h-4v6H9z" }) });
7995
+ return /* @__PURE__ */ jsx3(Icon, { ...props, children: /* @__PURE__ */ jsx3("path", { d: "M9 18v-6H5l7-7 7 7h-4v6H9z" }) });
7703
7996
  }
7704
7997
  function EraserIcon(props) {
7705
7998
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7706
- /* @__PURE__ */ jsx2("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" }),
7707
- /* @__PURE__ */ jsx2("path", { d: "M22 21H7" }),
7708
- /* @__PURE__ */ jsx2("path", { d: "m5 11 9 9" })
7999
+ /* @__PURE__ */ jsx3("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" }),
8000
+ /* @__PURE__ */ jsx3("path", { d: "M22 21H7" }),
8001
+ /* @__PURE__ */ jsx3("path", { d: "m5 11 9 9" })
7709
8002
  ] });
7710
8003
  }
7711
8004
  function HighlighterIcon(props) {
7712
8005
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7713
- /* @__PURE__ */ jsx2("path", { d: "m9 11-6 6v3h9l3-3" }),
7714
- /* @__PURE__ */ jsx2("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" })
8006
+ /* @__PURE__ */ jsx3("path", { d: "m9 11-6 6v3h9l3-3" }),
8007
+ /* @__PURE__ */ jsx3("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" })
7715
8008
  ] });
7716
8009
  }
7717
8010
  function UndoIcon(props) {
7718
8011
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7719
- /* @__PURE__ */ jsx2("path", { d: "M9 14 4 9l5-5" }),
7720
- /* @__PURE__ */ jsx2("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" })
8012
+ /* @__PURE__ */ jsx3("path", { d: "M9 14 4 9l5-5" }),
8013
+ /* @__PURE__ */ jsx3("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" })
7721
8014
  ] });
7722
8015
  }
7723
8016
 
7724
- // src/react/collab.tsx
7725
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
7726
- function useCollab() {
7727
- const host = useMeetHost();
7728
- const snapshot = useMeetSnapshot();
7729
- const isHost = useIsHost();
7730
- return {
7731
- collab: snapshot?.collab ?? null,
7732
- isHost,
7733
- localIdentity: snapshot?.localIdentity ?? null,
7734
- breakoutRoomId: snapshot?.breakoutRoomId ?? null,
7735
- async act(request) {
7736
- if (host === null) return { ok: false, message: "This meeting is not connected." };
7737
- try {
7738
- const result = await host.inRoom.collab(request);
7739
- return { ok: true, message: result.message, itemId: result.itemId };
7740
- } catch (error) {
7741
- return { ok: false, message: error.message ?? "That did not work." };
7742
- }
7743
- },
7744
- async moveTo(roomId) {
7745
- if (host === null) return { ok: false, message: "This meeting is not connected." };
7746
- try {
7747
- await host.engine.moveToBreakout(roomId);
7748
- return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
7749
- } catch (error) {
7750
- return { ok: false, message: error.message ?? "That room could not be joined." };
7751
- }
7752
- }
7753
- };
7754
- }
8017
+ // src/skins/meet/collab.tsx
8018
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
7755
8019
  function useNotice() {
7756
8020
  const [notice, setNotice] = useState3(null);
7757
- useEffect3(() => {
8021
+ useEffect5(() => {
7758
8022
  if (notice === null) return void 0;
7759
8023
  const timer = setTimeout(() => setNotice(null), notice.failed ? 7e3 : 3e3);
7760
8024
  return () => clearTimeout(timer);
@@ -7763,7 +8027,7 @@ function useNotice() {
7763
8027
  }
7764
8028
  function Notice({ notice }) {
7765
8029
  if (notice === null) return null;
7766
- return /* @__PURE__ */ jsx3("p", { className: notice.failed ? "mx-meet__panel-note mx-meet__collab-error" : "mx-meet__panel-note", role: "status", children: notice.text });
8030
+ return /* @__PURE__ */ jsx4("p", { className: notice.failed ? "mx-meet__panel-note mx-meet__collab-error" : "mx-meet__panel-note", role: "status", children: notice.text });
7767
8031
  }
7768
8032
  var ACTIVITY_LABELS = {
7769
8033
  polls: "Polls",
@@ -7773,28 +8037,10 @@ var ACTIVITY_LABELS = {
7773
8037
  };
7774
8038
  function ActivityIcon({ panel }) {
7775
8039
  const props = { width: 16, height: 16 };
7776
- if (panel === "polls") return /* @__PURE__ */ jsx3(PollIcon, { ...props });
7777
- if (panel === "qa") return /* @__PURE__ */ jsx3(QuestionIcon, { ...props });
7778
- if (panel === "whiteboard") return /* @__PURE__ */ jsx3(WhiteboardIcon, { ...props });
7779
- return /* @__PURE__ */ jsx3(BreakoutIcon, { ...props });
7780
- }
7781
- function useAvailableActivities() {
7782
- const { collab, isHost } = useCollab();
7783
- const settings = collab?.settings ?? null;
7784
- if (settings === null) return [];
7785
- const out = [];
7786
- if (settings.whiteboardEnabled) out.push("whiteboard");
7787
- if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
7788
- if (settings.qaEnabled) out.push("qa");
7789
- if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
7790
- return out;
7791
- }
7792
- function useActivityAttention() {
7793
- const { collab, isHost } = useCollab();
7794
- if (collab === null) return false;
7795
- if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
7796
- if (isHost && collab.questions.some((q) => q.state === "open")) return true;
7797
- return false;
8040
+ if (panel === "polls") return /* @__PURE__ */ jsx4(PollIcon, { ...props });
8041
+ if (panel === "qa") return /* @__PURE__ */ jsx4(QuestionIcon, { ...props });
8042
+ if (panel === "whiteboard") return /* @__PURE__ */ jsx4(WhiteboardIcon, { ...props });
8043
+ return /* @__PURE__ */ jsx4(BreakoutIcon, { ...props });
7798
8044
  }
7799
8045
  function ActivitiesControl({
7800
8046
  active,
@@ -7806,10 +8052,10 @@ function ActivitiesControl({
7806
8052
  if (available.length === 0) return null;
7807
8053
  return /* @__PURE__ */ jsxs2("span", { className: "mx-meet__anchor", children: [
7808
8054
  /* @__PURE__ */ jsxs2(ControlButton, { label: "Activities", active: open || active !== null, onClick: () => setOpen(!open), children: [
7809
- /* @__PURE__ */ jsx3(ActivitiesIcon, {}),
7810
- attention ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
8055
+ /* @__PURE__ */ jsx4(ActivitiesIcon, {}),
8056
+ attention ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
7811
8057
  ] }),
7812
- open ? /* @__PURE__ */ jsx3(Popover, { label: "Activities", onClose: () => setOpen(false), children: /* @__PURE__ */ jsx3("div", { className: "mx-meet__menu", role: "menu", children: available.map((panel) => /* @__PURE__ */ jsxs2(
8058
+ open ? /* @__PURE__ */ jsx4(Popover, { label: "Activities", onClose: () => setOpen(false), children: /* @__PURE__ */ jsx4("div", { className: "mx-meet__menu", role: "menu", children: available.map((panel) => /* @__PURE__ */ jsxs2(
7813
8059
  MenuItem,
7814
8060
  {
7815
8061
  onSelect: () => {
@@ -7817,7 +8063,7 @@ function ActivitiesControl({
7817
8063
  onOpen(panel);
7818
8064
  },
7819
8065
  children: [
7820
- /* @__PURE__ */ jsx3(ActivityIcon, { panel }),
8066
+ /* @__PURE__ */ jsx4(ActivityIcon, { panel }),
7821
8067
  " ",
7822
8068
  ACTIVITY_LABELS[panel]
7823
8069
  ]
@@ -7865,8 +8111,8 @@ function PollComposer({ maxOptions, onDone }) {
7865
8111
  },
7866
8112
  children: [
7867
8113
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__field", children: [
7868
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__field-label", children: "Question" }),
7869
- /* @__PURE__ */ jsx3(
8114
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Question" }),
8115
+ /* @__PURE__ */ jsx4(
7870
8116
  "input",
7871
8117
  {
7872
8118
  className: "mx-meet__input",
@@ -7879,7 +8125,7 @@ function PollComposer({ maxOptions, onDone }) {
7879
8125
  )
7880
8126
  ] }),
7881
8127
  options.map((option, index) => /* @__PURE__ */ jsxs2("div", { className: "mx-meet__composer-row", children: [
7882
- /* @__PURE__ */ jsx3(
8128
+ /* @__PURE__ */ jsx4(
7883
8129
  "input",
7884
8130
  {
7885
8131
  className: "mx-meet__input",
@@ -7890,22 +8136,22 @@ function PollComposer({ maxOptions, onDone }) {
7890
8136
  onChange: (event) => setOptions(options.map((o, i) => i === index ? event.target.value : o))
7891
8137
  }
7892
8138
  ),
7893
- options.length > 2 ? /* @__PURE__ */ jsx3(ControlButton, { label: `Remove answer ${index + 1}`, onClick: () => setOptions(options.filter((_, i) => i !== index)), children: /* @__PURE__ */ jsx3(CloseIcon, { width: 14, height: 14 }) }) : null
8139
+ options.length > 2 ? /* @__PURE__ */ jsx4(ControlButton, { label: `Remove answer ${index + 1}`, onClick: () => setOptions(options.filter((_, i) => i !== index)), children: /* @__PURE__ */ jsx4(CloseIcon, { width: 14, height: 14 }) }) : null
7894
8140
  ] }, index)),
7895
- options.length < maxOptions ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__link", onClick: () => setOptions([...options, ""]), children: "Add an answer" }) : null,
8141
+ options.length < maxOptions ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => setOptions([...options, ""]), children: "Add an answer" }) : null,
7896
8142
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__toggle", children: [
7897
- /* @__PURE__ */ jsx3("input", { type: "checkbox", checked: multiple, onChange: (event) => setMultiple(event.target.checked) }),
8143
+ /* @__PURE__ */ jsx4("input", { type: "checkbox", checked: multiple, onChange: (event) => setMultiple(event.target.checked) }),
7898
8144
  "People can pick more than one"
7899
8145
  ] }),
7900
8146
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__toggle", children: [
7901
- /* @__PURE__ */ jsx3("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
8147
+ /* @__PURE__ */ jsx4("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
7902
8148
  "Anonymous \u2014 nobody sees who picked what"
7903
8149
  ] }),
7904
- /* @__PURE__ */ jsx3(Notice, { notice }),
8150
+ /* @__PURE__ */ jsx4(Notice, { notice }),
7905
8151
  /* @__PURE__ */ jsxs2("div", { className: "mx-meet__collab-actions", children: [
7906
- /* @__PURE__ */ jsx3("button", { type: "submit", className: "mx-meet__primary mx-meet__primary--small", disabled: !ready || busy, children: "Launch" }),
7907
- /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", disabled: !ready || busy, onClick: () => void save(false), children: "Save draft" }),
7908
- /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__link", onClick: onDone, children: "Cancel" })
8152
+ /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__primary mx-meet__primary--small", disabled: !ready || busy, children: "Launch" }),
8153
+ /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", disabled: !ready || busy, onClick: () => void save(false), children: "Save draft" }),
8154
+ /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: onDone, children: "Cancel" })
7909
8155
  ] })
7910
8156
  ]
7911
8157
  }
@@ -7915,7 +8161,7 @@ function PollCard({ poll }) {
7915
8161
  const { act, isHost } = useCollab();
7916
8162
  const [picked, setPicked] = useState3(poll.myVote.slice());
7917
8163
  const [notice, show] = useNotice();
7918
- useEffect3(() => setPicked(poll.myVote.slice()), [poll.myVote]);
8164
+ useEffect5(() => setPicked(poll.myVote.slice()), [poll.myVote]);
7919
8165
  const counts = poll.options.some((o) => o.votes !== void 0);
7920
8166
  const total = poll.options.reduce((sum, o) => sum + (o.votes ?? 0), 0);
7921
8167
  const canVote = poll.state === "live";
@@ -7927,8 +8173,8 @@ function PollCard({ poll }) {
7927
8173
  };
7928
8174
  return /* @__PURE__ */ jsxs2("article", { className: "mx-meet__collab-card", "aria-label": poll.question, children: [
7929
8175
  /* @__PURE__ */ jsxs2("header", { className: "mx-meet__collab-head", children: [
7930
- /* @__PURE__ */ jsx3("strong", { className: "mx-meet__collab-title", children: poll.question }),
7931
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__collab-state", children: stateWord })
8176
+ /* @__PURE__ */ jsx4("strong", { className: "mx-meet__collab-title", children: poll.question }),
8177
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__collab-state", children: stateWord })
7932
8178
  ] }),
7933
8179
  /* @__PURE__ */ jsxs2("p", { className: "mx-meet__panel-note", children: [
7934
8180
  poll.multiple ? "Pick any." : "Pick one.",
@@ -7936,7 +8182,7 @@ function PollCard({ poll }) {
7936
8182
  counts && poll.voterCount !== null ? ` ${poll.voterCount} voted.` : "",
7937
8183
  isHost && poll.state !== "draft" && !poll.resultsShared ? " Results are visible only to hosts." : ""
7938
8184
  ] }),
7939
- /* @__PURE__ */ jsx3("ul", { className: "mx-meet__poll-options", children: poll.options.map((option) => {
8185
+ /* @__PURE__ */ jsx4("ul", { className: "mx-meet__poll-options", children: poll.options.map((option) => {
7940
8186
  const share = counts && total > 0 ? Math.round((option.votes ?? 0) / total * 100) : 0;
7941
8187
  const chosen = picked.includes(option.id);
7942
8188
  return /* @__PURE__ */ jsxs2("li", { children: [
@@ -7949,8 +8195,8 @@ function PollCard({ poll }) {
7949
8195
  disabled: !canVote,
7950
8196
  onClick: () => toggle(option.id),
7951
8197
  children: [
7952
- counts ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__poll-bar", style: { width: `${share}%` }, "aria-hidden": "true" }) : null,
7953
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__poll-text", children: option.text }),
8198
+ counts ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__poll-bar", style: { width: `${share}%` }, "aria-hidden": "true" }) : null,
8199
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__poll-text", children: option.text }),
7954
8200
  counts ? /* @__PURE__ */ jsxs2("span", { className: "mx-meet__poll-count", children: [
7955
8201
  option.votes ?? 0,
7956
8202
  " \xB7 ",
@@ -7960,12 +8206,12 @@ function PollCard({ poll }) {
7960
8206
  ]
7961
8207
  }
7962
8208
  ),
7963
- option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__poll-voters", children: option.voters.join(", ") }) : null
8209
+ option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__poll-voters", children: option.voters.join(", ") }) : null
7964
8210
  ] }, option.id);
7965
8211
  }) }),
7966
- /* @__PURE__ */ jsx3(Notice, { notice }),
8212
+ /* @__PURE__ */ jsx4(Notice, { notice }),
7967
8213
  /* @__PURE__ */ jsxs2("div", { className: "mx-meet__collab-actions", children: [
7968
- canVote ? /* @__PURE__ */ jsx3(
8214
+ canVote ? /* @__PURE__ */ jsx4(
7969
8215
  "button",
7970
8216
  {
7971
8217
  type: "button",
@@ -7975,10 +8221,10 @@ function PollCard({ poll }) {
7975
8221
  children: voted ? "Change vote" : "Vote"
7976
8222
  }
7977
8223
  ) : null,
7978
- isHost && poll.state === "draft" ? /* @__PURE__ */ jsx3("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,
7979
- isHost && poll.state === "live" ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_close", itemId: poll.id }).then(show), children: "End poll" }) : null,
7980
- isHost && poll.state !== "draft" ? /* @__PURE__ */ jsx3("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,
7981
- isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "poll_delete", itemId: poll.id }).then(show), children: "Delete" }) : null
8224
+ isHost && poll.state === "draft" ? /* @__PURE__ */ jsx4("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,
8225
+ isHost && poll.state === "live" ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_close", itemId: poll.id }).then(show), children: "End poll" }) : null,
8226
+ isHost && poll.state !== "draft" ? /* @__PURE__ */ jsx4("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,
8227
+ isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "poll_delete", itemId: poll.id }).then(show), children: "Delete" }) : null
7982
8228
  ] })
7983
8229
  ] });
7984
8230
  }
@@ -7989,11 +8235,11 @@ function PollsPanel({ onClose }) {
7989
8235
  const maxOptions = collab?.settings?.pollMaxOptions ?? 10;
7990
8236
  const ordered = [...polls].reverse();
7991
8237
  return /* @__PURE__ */ jsxs2(PanelShell, { title: "Polls", onClose, children: [
7992
- collab?.error != null ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
7993
- isHost && !composing ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => setComposing(true), children: "New poll" }) : null,
7994
- isHost && composing ? /* @__PURE__ */ jsx3(PollComposer, { maxOptions, onDone: () => setComposing(false) }) : null,
7995
- ordered.length === 0 && !composing ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note", children: isHost ? "No polls yet. Polls and their results are kept with the meeting." : "No polls yet." }) : null,
7996
- ordered.map((poll) => /* @__PURE__ */ jsx3(PollCard, { poll }, poll.id))
8238
+ collab?.error != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
8239
+ isHost && !composing ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => setComposing(true), children: "New poll" }) : null,
8240
+ isHost && composing ? /* @__PURE__ */ jsx4(PollComposer, { maxOptions, onDone: () => setComposing(false) }) : null,
8241
+ ordered.length === 0 && !composing ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: isHost ? "No polls yet. Polls and their results are kept with the meeting." : "No polls yet." }) : null,
8242
+ ordered.map((poll) => /* @__PURE__ */ jsx4(PollCard, { poll }, poll.id))
7997
8243
  ] });
7998
8244
  }
7999
8245
  function QuestionCard({ question }) {
@@ -8013,18 +8259,18 @@ function QuestionCard({ question }) {
8013
8259
  disabled: question.state === "dismissed",
8014
8260
  onClick: () => void act({ action: "question_upvote", itemId: question.id }).then((r) => r.ok ? void 0 : show(r)),
8015
8261
  children: [
8016
- /* @__PURE__ */ jsx3(UpvoteIcon, { width: 16, height: 16 }),
8017
- /* @__PURE__ */ jsx3("span", { children: question.upvotes })
8262
+ /* @__PURE__ */ jsx4(UpvoteIcon, { width: 16, height: 16 }),
8263
+ /* @__PURE__ */ jsx4("span", { children: question.upvotes })
8018
8264
  ]
8019
8265
  }
8020
8266
  ),
8021
8267
  /* @__PURE__ */ jsxs2("div", { className: "mx-meet__question-body", children: [
8022
8268
  /* @__PURE__ */ jsxs2("span", { className: "mx-meet__chat-meta", children: [
8023
- /* @__PURE__ */ jsx3("strong", { children: question.mine ? "You" : question.askerName }),
8024
- question.mine && question.anonymous ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__chat-private", children: "anonymous" }) : null,
8025
- question.state !== "open" ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__collab-state", children: question.state === "answered" ? "Answered" : "Dismissed" }) : null
8269
+ /* @__PURE__ */ jsx4("strong", { children: question.mine ? "You" : question.askerName }),
8270
+ question.mine && question.anonymous ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__chat-private", children: "anonymous" }) : null,
8271
+ question.state !== "open" ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__collab-state", children: question.state === "answered" ? "Answered" : "Dismissed" }) : null
8026
8272
  ] }),
8027
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__chat-text", children: question.text }),
8273
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__chat-text", children: question.text }),
8028
8274
  question.answer !== null ? /* @__PURE__ */ jsxs2("span", { className: "mx-meet__question-answer", children: [
8029
8275
  /* @__PURE__ */ jsxs2("strong", { children: [
8030
8276
  question.answeredByName ?? "Host",
@@ -8050,7 +8296,7 @@ function QuestionCard({ question }) {
8050
8296
  });
8051
8297
  },
8052
8298
  children: [
8053
- /* @__PURE__ */ jsx3(
8299
+ /* @__PURE__ */ jsx4(
8054
8300
  "input",
8055
8301
  {
8056
8302
  className: "mx-meet__input",
@@ -8062,16 +8308,16 @@ function QuestionCard({ question }) {
8062
8308
  autoFocus: true
8063
8309
  }
8064
8310
  ),
8065
- /* @__PURE__ */ jsx3("button", { type: "submit", className: "mx-meet__send", children: "Done" })
8311
+ /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", children: "Done" })
8066
8312
  ]
8067
8313
  }
8068
8314
  ) : null,
8069
- /* @__PURE__ */ jsx3(Notice, { notice }),
8315
+ /* @__PURE__ */ jsx4(Notice, { notice }),
8070
8316
  isHost || question.mine ? /* @__PURE__ */ jsxs2("div", { className: "mx-meet__collab-actions", children: [
8071
- isHost && question.state === "open" && !answering ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => setAnswering(true), children: "Answer" }) : null,
8072
- isHost && question.state === "open" ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_dismiss", itemId: question.id }).then(show), children: "Dismiss" }) : null,
8073
- isHost && question.state !== "open" ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_reopen", itemId: question.id }).then(show), children: "Reopen" }) : null,
8074
- question.mine || isHost ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "question_delete", itemId: question.id }).then(show), children: "Delete" }) : null
8317
+ isHost && question.state === "open" && !answering ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => setAnswering(true), children: "Answer" }) : null,
8318
+ isHost && question.state === "open" ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_dismiss", itemId: question.id }).then(show), children: "Dismiss" }) : null,
8319
+ isHost && question.state !== "open" ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_reopen", itemId: question.id }).then(show), children: "Reopen" }) : null,
8320
+ question.mine || isHost ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "question_delete", itemId: question.id }).then(show), children: "Delete" }) : null
8075
8321
  ] }) : null
8076
8322
  ] });
8077
8323
  }
@@ -8088,7 +8334,7 @@ function QaPanel({ onClose }) {
8088
8334
  (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 ?? "")
8089
8335
  );
8090
8336
  return /* @__PURE__ */ jsxs2(PanelShell, { title: "Q&A", onClose, children: [
8091
- collab?.error != null ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
8337
+ collab?.error != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
8092
8338
  /* @__PURE__ */ jsxs2(
8093
8339
  "form",
8094
8340
  {
@@ -8104,7 +8350,7 @@ function QaPanel({ onClose }) {
8104
8350
  },
8105
8351
  children: [
8106
8352
  /* @__PURE__ */ jsxs2("div", { className: "mx-meet__composer-row", children: [
8107
- /* @__PURE__ */ jsx3(
8353
+ /* @__PURE__ */ jsx4(
8108
8354
  "input",
8109
8355
  {
8110
8356
  className: "mx-meet__input",
@@ -8115,17 +8361,17 @@ function QaPanel({ onClose }) {
8115
8361
  "aria-label": "Ask the host a question"
8116
8362
  }
8117
8363
  ),
8118
- /* @__PURE__ */ jsx3("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Ask" })
8364
+ /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Ask" })
8119
8365
  ] }),
8120
8366
  allowAnonymous ? /* @__PURE__ */ jsxs2("label", { className: "mx-meet__toggle", children: [
8121
- /* @__PURE__ */ jsx3("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
8367
+ /* @__PURE__ */ jsx4("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
8122
8368
  "Ask anonymously"
8123
8369
  ] }) : null
8124
8370
  ]
8125
8371
  }
8126
8372
  ),
8127
- /* @__PURE__ */ jsx3(Notice, { notice }),
8128
- questions.length > 1 ? /* @__PURE__ */ jsx3("div", { className: "mx-meet__pills", role: "group", "aria-label": "Order questions", children: ["popular", "recent"].map((value) => /* @__PURE__ */ jsx3(
8373
+ /* @__PURE__ */ jsx4(Notice, { notice }),
8374
+ questions.length > 1 ? /* @__PURE__ */ jsx4("div", { className: "mx-meet__pills", role: "group", "aria-label": "Order questions", children: ["popular", "recent"].map((value) => /* @__PURE__ */ jsx4(
8129
8375
  "button",
8130
8376
  {
8131
8377
  type: "button",
@@ -8136,7 +8382,7 @@ function QaPanel({ onClose }) {
8136
8382
  },
8137
8383
  value
8138
8384
  )) }) : null,
8139
- questions.length === 0 ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note", children: "No questions yet. Questions are kept with the meeting." }) : /* @__PURE__ */ jsx3("ul", { className: "mx-meet__chat", children: questions.map((question) => /* @__PURE__ */ jsx3(QuestionCard, { question }, question.id)) })
8385
+ questions.length === 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: "No questions yet. Questions are kept with the meeting." }) : /* @__PURE__ */ jsx4("ul", { className: "mx-meet__chat", children: questions.map((question) => /* @__PURE__ */ jsx4(QuestionCard, { question }, question.id)) })
8140
8386
  ] });
8141
8387
  }
8142
8388
  var BOARD_W = 1600;
@@ -8150,7 +8396,7 @@ function strokePath(points) {
8150
8396
  return `${move} ${rest.map(([x, y]) => `L${(x * BOARD_W).toFixed(1)} ${(y * BOARD_H).toFixed(1)}`).join(" ")}`;
8151
8397
  }
8152
8398
  function StrokeView({ stroke, onPick }) {
8153
- return /* @__PURE__ */ jsx3(
8399
+ return /* @__PURE__ */ jsx4(
8154
8400
  "path",
8155
8401
  {
8156
8402
  d: strokePath(stroke.points),
@@ -8162,7 +8408,7 @@ function StrokeView({ stroke, onPick }) {
8162
8408
  strokeLinejoin: "round",
8163
8409
  onPointerDown: onPick,
8164
8410
  style: onPick !== void 0 ? { cursor: "pointer" } : void 0,
8165
- children: /* @__PURE__ */ jsx3("title", { children: stroke.byName })
8411
+ children: /* @__PURE__ */ jsx4("title", { children: stroke.byName })
8166
8412
  }
8167
8413
  );
8168
8414
  }
@@ -8173,7 +8419,7 @@ function WhiteboardPanel({ onClose }) {
8173
8419
  const [drawing, setDrawing] = useState3(null);
8174
8420
  const [pending, setPending] = useState3([]);
8175
8421
  const [notice, show] = useNotice();
8176
- const svgRef = useRef3(null);
8422
+ const svgRef = useRef5(null);
8177
8423
  const strokes = collab?.strokes ?? [];
8178
8424
  const mine = strokes.filter((s) => s.by === localIdentity);
8179
8425
  const point = (event) => {
@@ -8207,12 +8453,12 @@ function WhiteboardPanel({ onClose }) {
8207
8453
  };
8208
8454
  return /* @__PURE__ */ jsxs2("section", { className: "mx-meet__whiteboard", "aria-label": "Whiteboard", children: [
8209
8455
  /* @__PURE__ */ jsxs2("header", { className: "mx-meet__whiteboard-bar", children: [
8210
- /* @__PURE__ */ jsx3("strong", { className: "mx-meet__panel-title", children: "Whiteboard" }),
8211
- /* @__PURE__ */ jsx3("div", { className: "mx-meet__pills", role: "group", "aria-label": "Tool", children: [
8212
- ["pen", "Pen", /* @__PURE__ */ jsx3(PencilIcon, { width: 16, height: 16 }, "p")],
8213
- ["highlighter", "Highlighter", /* @__PURE__ */ jsx3(HighlighterIcon, { width: 16, height: 16 }, "h")],
8214
- ["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ jsx3(EraserIcon, { width: 16, height: 16 }, "e")]
8215
- ].map(([value, label, icon]) => /* @__PURE__ */ jsx3(
8456
+ /* @__PURE__ */ jsx4("strong", { className: "mx-meet__panel-title", children: "Whiteboard" }),
8457
+ /* @__PURE__ */ jsx4("div", { className: "mx-meet__pills", role: "group", "aria-label": "Tool", children: [
8458
+ ["pen", "Pen", /* @__PURE__ */ jsx4(PencilIcon, { width: 16, height: 16 }, "p")],
8459
+ ["highlighter", "Highlighter", /* @__PURE__ */ jsx4(HighlighterIcon, { width: 16, height: 16 }, "h")],
8460
+ ["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ jsx4(EraserIcon, { width: 16, height: 16 }, "e")]
8461
+ ].map(([value, label, icon]) => /* @__PURE__ */ jsx4(
8216
8462
  "button",
8217
8463
  {
8218
8464
  type: "button",
@@ -8225,7 +8471,7 @@ function WhiteboardPanel({ onClose }) {
8225
8471
  },
8226
8472
  value
8227
8473
  )) }),
8228
- /* @__PURE__ */ jsx3("div", { className: "mx-meet__swatches", role: "group", "aria-label": "Color", children: INK.map((ink) => /* @__PURE__ */ jsx3(
8474
+ /* @__PURE__ */ jsx4("div", { className: "mx-meet__swatches", role: "group", "aria-label": "Color", children: INK.map((ink) => /* @__PURE__ */ jsx4(
8229
8475
  "button",
8230
8476
  {
8231
8477
  type: "button",
@@ -8240,7 +8486,7 @@ function WhiteboardPanel({ onClose }) {
8240
8486
  },
8241
8487
  ink
8242
8488
  )) }),
8243
- /* @__PURE__ */ jsx3(
8489
+ /* @__PURE__ */ jsx4(
8244
8490
  ControlButton,
8245
8491
  {
8246
8492
  label: "Undo my last stroke",
@@ -8248,14 +8494,14 @@ function WhiteboardPanel({ onClose }) {
8248
8494
  const last = mine[mine.length - 1];
8249
8495
  if (last !== void 0) void act({ action: "stroke_erase", itemId: last.id }).then((r) => r.ok ? void 0 : show(r));
8250
8496
  },
8251
- children: /* @__PURE__ */ jsx3(UndoIcon, { width: 16, height: 16 })
8497
+ children: /* @__PURE__ */ jsx4(UndoIcon, { width: 16, height: 16 })
8252
8498
  }
8253
8499
  ),
8254
- isHost && strokes.length > 0 ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "whiteboard_clear" }).then(show), children: "Clear board" }) : null,
8255
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__whiteboard-note", children: "Saved with the meeting" }),
8256
- /* @__PURE__ */ jsx3(ControlButton, { label: "Close whiteboard", onClick: onClose, children: /* @__PURE__ */ jsx3(CloseIcon, { width: 16, height: 16 }) })
8500
+ isHost && strokes.length > 0 ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "whiteboard_clear" }).then(show), children: "Clear board" }) : null,
8501
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__whiteboard-note", children: "Saved with the meeting" }),
8502
+ /* @__PURE__ */ jsx4(ControlButton, { label: "Close whiteboard", onClick: onClose, children: /* @__PURE__ */ jsx4(CloseIcon, { width: 16, height: 16 }) })
8257
8503
  ] }),
8258
- /* @__PURE__ */ jsx3(Notice, { notice }),
8504
+ /* @__PURE__ */ jsx4(Notice, { notice }),
8259
8505
  /* @__PURE__ */ jsxs2(
8260
8506
  "svg",
8261
8507
  {
@@ -8280,8 +8526,8 @@ function WhiteboardPanel({ onClose }) {
8280
8526
  onPointerUp: finish,
8281
8527
  onPointerCancel: finish,
8282
8528
  children: [
8283
- /* @__PURE__ */ jsx3("rect", { x: 0, y: 0, width: BOARD_W, height: BOARD_H, className: "mx-meet__board-paper" }),
8284
- strokes.map((stroke) => /* @__PURE__ */ jsx3(
8529
+ /* @__PURE__ */ jsx4("rect", { x: 0, y: 0, width: BOARD_W, height: BOARD_H, className: "mx-meet__board-paper" }),
8530
+ strokes.map((stroke) => /* @__PURE__ */ jsx4(
8285
8531
  StrokeView,
8286
8532
  {
8287
8533
  stroke,
@@ -8289,8 +8535,8 @@ function WhiteboardPanel({ onClose }) {
8289
8535
  },
8290
8536
  stroke.id
8291
8537
  )),
8292
- pending.map((stroke) => /* @__PURE__ */ jsx3(StrokeView, { stroke }, stroke.id)),
8293
- drawing !== null ? /* @__PURE__ */ jsx3(
8538
+ pending.map((stroke) => /* @__PURE__ */ jsx4(StrokeView, { stroke }, stroke.id)),
8539
+ drawing !== null ? /* @__PURE__ */ jsx4(
8294
8540
  StrokeView,
8295
8541
  {
8296
8542
  stroke: {
@@ -8315,7 +8561,7 @@ function clock(ms2) {
8315
8561
  var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
8316
8562
  function useNow(active) {
8317
8563
  const [now, setNow] = useState3(() => Date.now());
8318
- useEffect3(() => {
8564
+ useEffect5(() => {
8319
8565
  if (!active) return void 0;
8320
8566
  const timer = setInterval(() => setNow(Date.now()), 1e3);
8321
8567
  return () => clearInterval(timer);
@@ -8347,8 +8593,8 @@ function BreakoutSetup() {
8347
8593
  const nameOf = (identity) => people.find((p) => p.identity === identity)?.displayName ?? identity;
8348
8594
  return /* @__PURE__ */ jsxs2("div", { className: "mx-meet__collab-card", children: [
8349
8595
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__field", children: [
8350
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__field-label", children: "Rooms" }),
8351
- /* @__PURE__ */ jsx3(
8596
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Rooms" }),
8597
+ /* @__PURE__ */ jsx4(
8352
8598
  "input",
8353
8599
  {
8354
8600
  className: "mx-meet__input",
@@ -8360,11 +8606,11 @@ function BreakoutSetup() {
8360
8606
  }
8361
8607
  )
8362
8608
  ] }),
8363
- /* @__PURE__ */ jsx3("div", { className: "mx-meet__pills", role: "group", "aria-label": "How people are placed", children: [
8609
+ /* @__PURE__ */ jsx4("div", { className: "mx-meet__pills", role: "group", "aria-label": "How people are placed", children: [
8364
8610
  ["auto", "Automatically"],
8365
8611
  ["manual", "Manually"],
8366
8612
  ["choose", "Let people choose"]
8367
- ].map(([value, label]) => /* @__PURE__ */ jsx3(
8613
+ ].map(([value, label]) => /* @__PURE__ */ jsx4(
8368
8614
  "button",
8369
8615
  {
8370
8616
  type: "button",
@@ -8376,8 +8622,8 @@ function BreakoutSetup() {
8376
8622
  value
8377
8623
  )) }),
8378
8624
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__field", children: [
8379
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__field-label", children: "Timer (minutes, 0 for none)" }),
8380
- /* @__PURE__ */ jsx3(
8625
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Timer (minutes, 0 for none)" }),
8626
+ /* @__PURE__ */ jsx4(
8381
8627
  "input",
8382
8628
  {
8383
8629
  className: "mx-meet__input",
@@ -8389,8 +8635,8 @@ function BreakoutSetup() {
8389
8635
  }
8390
8636
  )
8391
8637
  ] }),
8392
- mode === "manual" ? people.length === 0 ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note", children: "Nobody else is in the meeting yet." }) : /* @__PURE__ */ jsx3("ul", { className: "mx-meet__people", children: people.map((person) => /* @__PURE__ */ jsxs2("li", { className: "mx-meet__person", children: [
8393
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__person-name", children: person.displayName }),
8638
+ mode === "manual" ? people.length === 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: "Nobody else is in the meeting yet." }) : /* @__PURE__ */ jsx4("ul", { className: "mx-meet__people", children: people.map((person) => /* @__PURE__ */ jsxs2("li", { className: "mx-meet__person", children: [
8639
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__person-name", children: person.displayName }),
8394
8640
  /* @__PURE__ */ jsxs2(
8395
8641
  "select",
8396
8642
  {
@@ -8399,7 +8645,7 @@ function BreakoutSetup() {
8399
8645
  value: manual[person.identity] ?? -1,
8400
8646
  onChange: (event) => setManual({ ...manual, [person.identity]: Number(event.target.value) }),
8401
8647
  children: [
8402
- /* @__PURE__ */ jsx3("option", { value: -1, children: "Main room" }),
8648
+ /* @__PURE__ */ jsx4("option", { value: -1, children: "Main room" }),
8403
8649
  Array.from({ length: rooms }, (_, index) => /* @__PURE__ */ jsxs2("option", { value: index, children: [
8404
8650
  "Room ",
8405
8651
  index + 1
@@ -8407,15 +8653,15 @@ function BreakoutSetup() {
8407
8653
  ]
8408
8654
  }
8409
8655
  )
8410
- ] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ jsx3("ul", { className: "mx-meet__breakout-rooms", children: assignment.map((members, index) => /* @__PURE__ */ jsxs2("li", { children: [
8656
+ ] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ jsx4("ul", { className: "mx-meet__breakout-rooms", children: assignment.map((members, index) => /* @__PURE__ */ jsxs2("li", { children: [
8411
8657
  /* @__PURE__ */ jsxs2("strong", { children: [
8412
8658
  "Room ",
8413
8659
  index + 1
8414
8660
  ] }),
8415
8661
  " ",
8416
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__panel-note", children: members.length === 0 ? "empty" : members.map(nameOf).join(", ") })
8417
- ] }, index)) }) : /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note", children: "Everyone picks a room from their own screen." }),
8418
- /* @__PURE__ */ jsx3(Notice, { notice }),
8662
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__panel-note", children: members.length === 0 ? "empty" : members.map(nameOf).join(", ") })
8663
+ ] }, index)) }) : /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: "Everyone picks a room from their own screen." }),
8664
+ /* @__PURE__ */ jsx4(Notice, { notice }),
8419
8665
  /* @__PURE__ */ jsxs2(
8420
8666
  "button",
8421
8667
  {
@@ -8470,17 +8716,17 @@ function BreakoutRun({ plan }) {
8470
8716
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
8471
8717
  plan.allowChoose ? " \xB7 people choose their room" : ""
8472
8718
  ] }),
8473
- /* @__PURE__ */ jsx3("ul", { className: "mx-meet__breakout-rooms", children: plan.rooms.map((room) => {
8719
+ /* @__PURE__ */ jsx4("ul", { className: "mx-meet__breakout-rooms", children: plan.rooms.map((room) => {
8474
8720
  const here = breakoutRoomId === room.id;
8475
8721
  const mayJoin = isHost || plan.allowChoose || mine?.id === room.id;
8476
8722
  return /* @__PURE__ */ jsxs2("li", { className: here ? "mx-meet__breakout-room mx-meet__breakout-room--here" : "mx-meet__breakout-room", children: [
8477
8723
  /* @__PURE__ */ jsxs2("div", { className: "mx-meet__collab-head", children: [
8478
- /* @__PURE__ */ jsx3("strong", { children: room.name }),
8479
- here ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__collab-state", children: "You are here" }) : mayJoin ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(room.id), children: "Join" }) : null
8724
+ /* @__PURE__ */ jsx4("strong", { children: room.name }),
8725
+ here ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__collab-state", children: "You are here" }) : mayJoin ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(room.id), children: "Join" }) : null
8480
8726
  ] }),
8481
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__panel-note", children: room.identities.length === 0 ? "Nobody assigned" : room.identities.map(nameOf).join(", ") }),
8482
- isHost && room.identities.length > 0 ? /* @__PURE__ */ jsx3("ul", { className: "mx-meet__people", children: room.identities.map((identity) => /* @__PURE__ */ jsxs2("li", { className: "mx-meet__person", children: [
8483
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__person-name", children: nameOf(identity) }),
8727
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__panel-note", children: room.identities.length === 0 ? "Nobody assigned" : room.identities.map(nameOf).join(", ") }),
8728
+ isHost && room.identities.length > 0 ? /* @__PURE__ */ jsx4("ul", { className: "mx-meet__people", children: room.identities.map((identity) => /* @__PURE__ */ jsxs2("li", { className: "mx-meet__person", children: [
8729
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__person-name", children: nameOf(identity) }),
8484
8730
  /* @__PURE__ */ jsxs2(
8485
8731
  "select",
8486
8732
  {
@@ -8493,15 +8739,15 @@ function BreakoutRun({ plan }) {
8493
8739
  roomId: event.target.value === "" ? null : event.target.value
8494
8740
  }).then(show),
8495
8741
  children: [
8496
- /* @__PURE__ */ jsx3("option", { value: "", children: "Main room" }),
8497
- plan.rooms.map((option) => /* @__PURE__ */ jsx3("option", { value: option.id, children: option.name }, option.id))
8742
+ /* @__PURE__ */ jsx4("option", { value: "", children: "Main room" }),
8743
+ plan.rooms.map((option) => /* @__PURE__ */ jsx4("option", { value: option.id, children: option.name }, option.id))
8498
8744
  ]
8499
8745
  }
8500
8746
  )
8501
8747
  ] }, identity)) }) : null
8502
8748
  ] }, room.id);
8503
8749
  }) }),
8504
- breakoutRoomId !== null ? /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(null), children: "Return to the main room" }) : null,
8750
+ breakoutRoomId !== null ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(null), children: "Return to the main room" }) : null,
8505
8751
  isHost ? /* @__PURE__ */ jsxs2(
8506
8752
  "form",
8507
8753
  {
@@ -8516,7 +8762,7 @@ function BreakoutRun({ plan }) {
8516
8762
  });
8517
8763
  },
8518
8764
  children: [
8519
- /* @__PURE__ */ jsx3(
8765
+ /* @__PURE__ */ jsx4(
8520
8766
  "input",
8521
8767
  {
8522
8768
  className: "mx-meet__input",
@@ -8527,12 +8773,12 @@ function BreakoutRun({ plan }) {
8527
8773
  "aria-label": "Message every room"
8528
8774
  }
8529
8775
  ),
8530
- /* @__PURE__ */ jsx3("button", { type: "submit", className: "mx-meet__send", disabled: broadcast.trim().length === 0, children: "Send" })
8776
+ /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", disabled: broadcast.trim().length === 0, children: "Send" })
8531
8777
  ]
8532
8778
  }
8533
8779
  ) : null,
8534
- /* @__PURE__ */ jsx3(Notice, { notice }),
8535
- isHost ? /* @__PURE__ */ jsx3(
8780
+ /* @__PURE__ */ jsx4(Notice, { notice }),
8781
+ isHost ? /* @__PURE__ */ jsx4(
8536
8782
  "button",
8537
8783
  {
8538
8784
  type: "button",
@@ -8547,8 +8793,8 @@ function BreakoutsPanel({ onClose }) {
8547
8793
  const { collab, isHost } = useCollab();
8548
8794
  const plan = collab?.breakout?.state === "open" ? collab.breakout : null;
8549
8795
  return /* @__PURE__ */ jsxs2(PanelShell, { title: "Breakout rooms", onClose, children: [
8550
- collab?.error != null ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
8551
- plan !== null ? /* @__PURE__ */ jsx3(BreakoutRun, { plan }) : isHost ? /* @__PURE__ */ jsx3(BreakoutSetup, {}) : /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note", children: "Breakout rooms are closed." })
8796
+ collab?.error != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
8797
+ plan !== null ? /* @__PURE__ */ jsx4(BreakoutRun, { plan }) : isHost ? /* @__PURE__ */ jsx4(BreakoutSetup, {}) : /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: "Breakout rooms are closed." })
8552
8798
  ] });
8553
8799
  }
8554
8800
  function BreakoutBanner() {
@@ -8561,17 +8807,17 @@ function BreakoutBanner() {
8561
8807
  const assigned = assignedRoom(open, localIdentity);
8562
8808
  const [dismissedBroadcast, setDismissedBroadcast] = useState3(null);
8563
8809
  const [failure, setFailure] = useState3(null);
8564
- const expireAsked = useRef3(null);
8810
+ const expireAsked = useRef5(null);
8565
8811
  const moveAt = collab?.moveRequest?.at ?? null;
8566
- useEffect3(() => {
8567
- const request = host?.store.snapshot().collab.moveRequest ?? null;
8568
- if (request === null || host === null) return;
8569
- host.store.patch({ collab: { ...host.store.snapshot().collab, moveRequest: null } });
8812
+ useEffect5(() => {
8813
+ if (host === null) return;
8814
+ const request = takeMoveRequest(host.store);
8815
+ if (request === null) return;
8570
8816
  const here = host.store.snapshot().breakoutRoomId;
8571
8817
  if ((here ?? null) === request.roomId) return;
8572
8818
  void moveTo(request.roomId).then((result) => setFailure(result.ok ? null : result.message));
8573
8819
  }, [moveAt, host, moveTo]);
8574
- useEffect3(() => {
8820
+ useEffect5(() => {
8575
8821
  if (open === null || remaining === null || remaining > 0) return;
8576
8822
  const asked = expireAsked.current;
8577
8823
  if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
@@ -8583,16 +8829,16 @@ function BreakoutBanner() {
8583
8829
  const room = open?.rooms.find((r) => r.id === breakoutRoomId) ?? null;
8584
8830
  if (open === null && failure === null) return null;
8585
8831
  return /* @__PURE__ */ jsxs2("div", { className: "mx-meet__breakout-banner", role: "status", children: [
8586
- failure !== null ? /* @__PURE__ */ jsx3("span", { className: "mx-meet__collab-error", children: failure }) : null,
8832
+ failure !== null ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__collab-error", children: failure }) : null,
8587
8833
  room !== null ? /* @__PURE__ */ jsxs2("span", { children: [
8588
- /* @__PURE__ */ jsx3("strong", { children: room.name }),
8834
+ /* @__PURE__ */ jsx4("strong", { children: room.name }),
8589
8835
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
8590
- /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__chip", onClick: () => void moveTo(null), children: "Return to main room" })
8836
+ /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__chip", onClick: () => void moveTo(null), children: "Return to main room" })
8591
8837
  ] }) : assigned !== null ? /* @__PURE__ */ jsxs2("span", { children: [
8592
8838
  "You are assigned to ",
8593
- /* @__PURE__ */ jsx3("strong", { children: assigned.name }),
8839
+ /* @__PURE__ */ jsx4("strong", { children: assigned.name }),
8594
8840
  remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
8595
- /* @__PURE__ */ jsx3(
8841
+ /* @__PURE__ */ jsx4(
8596
8842
  "button",
8597
8843
  {
8598
8844
  type: "button",
@@ -8604,7 +8850,7 @@ function BreakoutBanner() {
8604
8850
  children: "Join"
8605
8851
  }
8606
8852
  )
8607
- ] }) : open?.allowChoose ? /* @__PURE__ */ jsx3("span", { children: "Breakout rooms are open \u2014 pick one under Activities." }) : null,
8853
+ ] }) : open?.allowChoose ? /* @__PURE__ */ jsx4("span", { children: "Breakout rooms are open \u2014 pick one under Activities." }) : null,
8608
8854
  showBroadcast ? /* @__PURE__ */ jsxs2("span", { className: "mx-meet__breakout-broadcast", children: [
8609
8855
  /* @__PURE__ */ jsxs2("strong", { children: [
8610
8856
  broadcast.by,
@@ -8612,30 +8858,10 @@ function BreakoutBanner() {
8612
8858
  ] }),
8613
8859
  " ",
8614
8860
  broadcast.text,
8615
- /* @__PURE__ */ jsx3("button", { type: "button", className: "mx-meet__link", onClick: () => setDismissedBroadcast(broadcast.at), children: "Dismiss" })
8861
+ /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => setDismissedBroadcast(broadcast.at), children: "Dismiss" })
8616
8862
  ] }) : null
8617
8863
  ] });
8618
8864
  }
8619
- function useCaptionTranslation(lines) {
8620
- const host = useMeetHost();
8621
- const snapshot = useMeetSnapshot();
8622
- const collab = snapshot?.collab ?? null;
8623
- const language = collab?.captionLanguage ?? null;
8624
- const asked = useRef3(/* @__PURE__ */ new Set());
8625
- const translations = collab?.captionTranslations ?? {};
8626
- const missing = lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text: text3 }) => ({ id, text: text3 }));
8627
- const key = `${language ?? ""}|${missing.map((l) => l.id).join(",")}`;
8628
- const pending = useRef3(missing);
8629
- pending.current = missing;
8630
- useEffect3(() => {
8631
- if (host === null || language === null) return;
8632
- const batch = pending.current.filter((line) => !asked.current.has(`${language}:${line.id}`)).slice(-20);
8633
- if (batch.length === 0) return;
8634
- for (const line of batch) asked.current.add(`${language}:${line.id}`);
8635
- void host.inRoom.translateCaptions(language, batch).catch(() => void 0);
8636
- }, [host, language, key]);
8637
- return { language, translations, error: collab?.captionTranslationError ?? null };
8638
- }
8639
8865
  function CaptionLanguageSettings() {
8640
8866
  const host = useMeetHost();
8641
8867
  const snapshot = useMeetSnapshot();
@@ -8648,7 +8874,7 @@ function CaptionLanguageSettings() {
8648
8874
  const choices = CAPTION_LANGUAGES.some((l) => l.tag === preferred) ? CAPTION_LANGUAGES : [{ tag: preferred, name: preferred }, ...CAPTION_LANGUAGES];
8649
8875
  return /* @__PURE__ */ jsxs2("section", { className: "mx-meet__section", "aria-label": "Captions", children: [
8650
8876
  /* @__PURE__ */ jsxs2("label", { className: "mx-meet__field", children: [
8651
- /* @__PURE__ */ jsx3("span", { className: "mx-meet__field-label", children: "Translate captions to" }),
8877
+ /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Translate captions to" }),
8652
8878
  /* @__PURE__ */ jsxs2(
8653
8879
  "select",
8654
8880
  {
@@ -8656,51 +8882,32 @@ function CaptionLanguageSettings() {
8656
8882
  value: current,
8657
8883
  onChange: (event) => {
8658
8884
  const next = event.target.value === "" ? null : event.target.value;
8659
- host.store.patch({
8660
- collab: {
8661
- ...host.store.snapshot().collab,
8662
- captionLanguage: next,
8663
- captionTranslations: {},
8664
- captionTranslationError: null
8665
- }
8666
- });
8885
+ setCaptionLanguage(host.store, next);
8667
8886
  },
8668
8887
  children: [
8669
- /* @__PURE__ */ jsx3("option", { value: "", children: "Off \u2014 as spoken" }),
8888
+ /* @__PURE__ */ jsx4("option", { value: "", children: "Off \u2014 as spoken" }),
8670
8889
  current === "" ? /* @__PURE__ */ jsxs2("option", { value: preferred, children: [
8671
8890
  choices.find((c) => c.tag === preferred)?.name ?? preferred,
8672
8891
  " (yours)"
8673
8892
  ] }) : null,
8674
- choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ jsx3("option", { value: choice.tag, children: choice.name }, choice.tag))
8893
+ choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ jsx4("option", { value: choice.tag, children: choice.name }, choice.tag))
8675
8894
  ]
8676
8895
  }
8677
8896
  )
8678
8897
  ] }),
8679
- collab?.captionTranslationError != null ? /* @__PURE__ */ jsx3("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
8898
+ collab?.captionTranslationError != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
8680
8899
  ] });
8681
8900
  }
8682
- function useCollabPanelRequest(onRequest) {
8683
- const host = useMeetHost();
8684
- const at = useMeetSnapshot()?.collab.panelRequest?.at ?? null;
8685
- const callback = useRef3(onRequest);
8686
- callback.current = onRequest;
8687
- useEffect3(() => {
8688
- const request = host?.store.snapshot().collab.panelRequest ?? null;
8689
- if (request === null || host === null) return;
8690
- host.store.patch({ collab: { ...host.store.snapshot().collab, panelRequest: null } });
8691
- callback.current(request.panel);
8692
- }, [at, host]);
8693
- }
8694
8901
 
8695
- // src/react/components.tsx
8696
- import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
8902
+ // src/skins/meet/components.tsx
8903
+ import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
8697
8904
  function InertNotice({ what }) {
8698
8905
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
8699
8906
  /* @__PURE__ */ jsxs3("p", { className: "mx-meet__empty-title", children: [
8700
8907
  what,
8701
8908
  " is not ready yet"
8702
8909
  ] }),
8703
- /* @__PURE__ */ jsx4("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." })
8910
+ /* @__PURE__ */ jsx5("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." })
8704
8911
  ] });
8705
8912
  }
8706
8913
  function Avatar({
@@ -8710,7 +8917,7 @@ function Avatar({
8710
8917
  }) {
8711
8918
  const tint = avatarPaletteIndex(name);
8712
8919
  if (url != null && url.length > 0) {
8713
- return /* @__PURE__ */ jsx4(
8920
+ return /* @__PURE__ */ jsx5(
8714
8921
  "img",
8715
8922
  {
8716
8923
  className: "mx-meet__avatar",
@@ -8722,7 +8929,7 @@ function Avatar({
8722
8929
  }
8723
8930
  );
8724
8931
  }
8725
- return /* @__PURE__ */ jsx4(
8932
+ return /* @__PURE__ */ jsx5(
8726
8933
  "span",
8727
8934
  {
8728
8935
  className: "mx-meet__avatar mx-meet__avatar--initials",
@@ -8744,7 +8951,7 @@ function ControlButton({
8744
8951
  onClick,
8745
8952
  children
8746
8953
  }) {
8747
- return /* @__PURE__ */ jsx4(
8954
+ return /* @__PURE__ */ jsx5(
8748
8955
  "button",
8749
8956
  {
8750
8957
  type: "button",
@@ -8770,20 +8977,16 @@ function RecordingIndicator() {
8770
8977
  role: "status",
8771
8978
  "aria-live": "polite",
8772
8979
  children: [
8773
- /* @__PURE__ */ jsx4(RecordIcon, { width: 10, height: 10 }),
8980
+ /* @__PURE__ */ jsx5(RecordIcon, { width: 10, height: 10 }),
8774
8981
  label
8775
8982
  ]
8776
8983
  }
8777
8984
  );
8778
8985
  }
8779
- function ConnectionDot({ quality }) {
8780
- if (quality === "excellent" || quality === "good" || quality === "unknown") return null;
8781
- return /* @__PURE__ */ jsx4("span", { className: `mx-meet__quality mx-meet__quality--${quality}`, title: `Connection ${quality}`, children: /* @__PURE__ */ jsx4(WifiLowIcon, { width: 14, height: 14 }) });
8782
- }
8783
8986
  function RoleBadge({ role }) {
8784
- if (role === "host") return /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Host" });
8785
- if (role === "cohost") return /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Co-host" });
8786
- if (role === "guest") return /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Guest" });
8987
+ if (role === "host") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Host" });
8988
+ if (role === "cohost") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Co-host" });
8989
+ if (role === "guest") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Guest" });
8787
8990
  return null;
8788
8991
  }
8789
8992
  function ParticipantTile({
@@ -8811,8 +9014,9 @@ function ParticipantTile({
8811
9014
  participant.speaking ? "mx-meet__tile--speaking" : ""
8812
9015
  ].filter(Boolean).join(" "),
8813
9016
  "data-identity": participant.identity,
9017
+ ...participantAttributes(participant),
8814
9018
  children: [
8815
- showVideo ? /* @__PURE__ */ jsx4(
9019
+ showVideo ? /* @__PURE__ */ jsx5(
8816
9020
  "video",
8817
9021
  {
8818
9022
  ref: videoRef,
@@ -8821,43 +9025,43 @@ function ParticipantTile({
8821
9025
  playsInline: true,
8822
9026
  muted: participant.isLocal
8823
9027
  }
8824
- ) : /* @__PURE__ */ jsx4("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ jsx4(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: featured ? 96 : 56 }) }),
9028
+ ) : /* @__PURE__ */ jsx5("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ jsx5(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: featured ? 96 : 56 }) }),
8825
9029
  participant.handRaised ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__tile-hand", title: `Hand raised \xB7 ${ordinal(handPosition)} in line`, children: [
8826
- /* @__PURE__ */ jsx4(HandIcon, { width: 14, height: 14 }),
9030
+ /* @__PURE__ */ jsx5(HandIcon, { width: 14, height: 14 }),
8827
9031
  handPosition > 0 ? handPosition : null
8828
9032
  ] }) : null,
8829
9033
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__tile-bar", children: [
8830
9034
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__tile-name", children: [
8831
- spotlit ? /* @__PURE__ */ jsx4("span", { title: "Spotlighted for everyone", className: "mx-meet__tile-flag", children: /* @__PURE__ */ jsx4(SpotlightIcon, { width: 12, height: 12 }) }) : null,
9035
+ spotlit ? /* @__PURE__ */ jsx5("span", { title: "Spotlighted for everyone", className: "mx-meet__tile-flag", children: /* @__PURE__ */ jsx5(SpotlightIcon, { width: 12, height: 12 }) }) : null,
8832
9036
  participant.displayName,
8833
9037
  participant.isLocal ? " (you)" : "",
8834
- participant.isAgent ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "AI" }) : null,
8835
- /* @__PURE__ */ jsx4(RoleBadge, { role: participant.role })
9038
+ participant.isAgent ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "AI" }) : null,
9039
+ /* @__PURE__ */ jsx5(RoleBadge, { role: participant.role })
8836
9040
  ] }),
8837
- !participant.micEnabled ? /* @__PURE__ */ jsx4(MicOffIcon, { width: 14, height: 14 }) : null,
8838
- /* @__PURE__ */ jsx4(QualityBars, { quality: participant.quality })
9041
+ !participant.micEnabled ? /* @__PURE__ */ jsx5(MicOffIcon, { width: 14, height: 14 }) : null,
9042
+ /* @__PURE__ */ jsx5(QualityBars, { quality: participant.quality })
8839
9043
  ] }),
8840
9044
  /* @__PURE__ */ jsxs3("div", { className: menu ? "mx-meet__tile-actions mx-meet__tile-actions--open" : "mx-meet__tile-actions", children: [
8841
- /* @__PURE__ */ jsx4(
9045
+ /* @__PURE__ */ jsx5(
8842
9046
  ControlButton,
8843
9047
  {
8844
9048
  label: pinnedHere ? "Unpin" : `Pin ${participant.displayName} for me`,
8845
9049
  active: pinnedHere,
8846
9050
  onClick: () => host?.engine.pin(pinnedHere ? null : participant.identity),
8847
- children: /* @__PURE__ */ jsx4(PinIcon, { width: 16, height: 16 })
9051
+ children: /* @__PURE__ */ jsx5(PinIcon, { width: 16, height: 16 })
8848
9052
  }
8849
9053
  ),
8850
9054
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__anchor", children: [
8851
- /* @__PURE__ */ jsx4(
9055
+ /* @__PURE__ */ jsx5(
8852
9056
  ControlButton,
8853
9057
  {
8854
9058
  label: `More for ${participant.displayName}`,
8855
9059
  active: menu,
8856
9060
  onClick: () => setMenu(!menu),
8857
- children: /* @__PURE__ */ jsx4(MoreIcon, { width: 16, height: 16 })
9061
+ children: /* @__PURE__ */ jsx5(MoreIcon, { width: 16, height: 16 })
8858
9062
  }
8859
9063
  ),
8860
- menu ? /* @__PURE__ */ jsx4(PersonMenu, { participant, onClose: () => setMenu(false), placement: "down" }) : null
9064
+ menu ? /* @__PURE__ */ jsx5(PersonMenu, { participant, onClose: () => setMenu(false), placement: "down" }) : null
8861
9065
  ] })
8862
9066
  ] })
8863
9067
  ]
@@ -8873,25 +9077,25 @@ function QualityBars({ quality }) {
8873
9077
  if (quality === "unknown") return null;
8874
9078
  const bars = quality === "excellent" ? 3 : quality === "good" ? 2 : quality === "poor" ? 1 : 0;
8875
9079
  const label = quality === "lost" ? "Connection lost" : quality === "poor" ? "Poor connection" : `Connection ${quality}`;
8876
- return /* @__PURE__ */ jsx4("span", { className: `mx-meet__signal mx-meet__signal--${quality}`, title: label, "aria-label": label, role: "img", children: /* @__PURE__ */ jsx4(SignalIcon, { bars, width: 14, height: 14 }) });
9080
+ return /* @__PURE__ */ jsx5("span", { className: `mx-meet__signal mx-meet__signal--${quality}`, title: label, "aria-label": label, role: "img", children: /* @__PURE__ */ jsx5(SignalIcon, { bars, width: 14, height: 14 }) });
8877
9081
  }
8878
9082
  function Stage({ pageSize }) {
8879
9083
  const stage = useStage(pageSize);
8880
9084
  const columns = gridColumns(stage.tiles.length);
8881
9085
  if (stage.feature === null && stage.tiles.length === 0) {
8882
9086
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__stage mx-meet__stage--empty", children: [
8883
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "Waiting for others to join" }),
8884
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: "Share the meeting link and people can join from anywhere \u2014 no account needed." })
9087
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-title", children: "Waiting for others to join" }),
9088
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-body", children: "Share the meeting link and people can join from anywhere \u2014 no account needed." })
8885
9089
  ] });
8886
9090
  }
8887
9091
  return /* @__PURE__ */ jsxs3("div", { className: `mx-meet__stage${stage.feature !== null ? " mx-meet__stage--speaker" : ""}`, children: [
8888
- stage.feature !== null ? /* @__PURE__ */ jsx4(ParticipantTile, { participant: stage.feature, featured: true }) : null,
8889
- /* @__PURE__ */ jsx4(
9092
+ stage.feature !== null ? /* @__PURE__ */ jsx5(ParticipantTile, { participant: stage.feature, featured: true }) : null,
9093
+ /* @__PURE__ */ jsx5(
8890
9094
  "div",
8891
9095
  {
8892
9096
  className: "mx-meet__grid",
8893
9097
  style: { "--mx-meet-columns": columns },
8894
- children: stage.tiles.map((participant) => /* @__PURE__ */ jsx4(ParticipantTile, { participant }, participant.identity))
9098
+ children: stage.tiles.map((participant) => /* @__PURE__ */ jsx5(ParticipantTile, { participant }, participant.identity))
8895
9099
  }
8896
9100
  ),
8897
9101
  stage.overflow > 0 ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__overflow", children: [
@@ -8903,7 +9107,6 @@ function Stage({ pageSize }) {
8903
9107
  ] }) : null
8904
9108
  ] });
8905
9109
  }
8906
- var MEET_REACTIONS = ["\u{1F496}", "\u{1F44D}", "\u{1F389}", "\u{1F44F}", "\u{1F602}", "\u{1F62E}", "\u{1F622}", "\u{1F914}", "\u{1F44E}"];
8907
9110
  function ControlBar({ onLeave }) {
8908
9111
  const room = useRoom();
8909
9112
  const recording = useRecording();
@@ -8928,7 +9131,7 @@ function ControlBar({ onLeave }) {
8928
9131
  });
8929
9132
  const privateChatAt = snapshot?.privateChatRequest?.at ?? null;
8930
9133
  const meetStore = useMeetHost()?.store ?? null;
8931
- useEffect4(() => {
9134
+ useEffect6(() => {
8932
9135
  const request = meetStore?.snapshot().privateChatRequest ?? null;
8933
9136
  if (request === null) return;
8934
9137
  setChatTo(request.to);
@@ -8945,10 +9148,10 @@ function ControlBar({ onLeave }) {
8945
9148
  });
8946
9149
  const hasSpotlight = snapshot?.spotlight !== null && snapshot?.spotlight !== void 0;
8947
9150
  return /* @__PURE__ */ jsxs3(Fragment, { children: [
8948
- /* @__PURE__ */ jsx4(MeetingOverlays, {}),
8949
- shortcuts ? /* @__PURE__ */ jsx4(ShortcutsSheet, { onClose: () => setShortcuts(false) }) : null,
8950
- panel === "chat" ? /* @__PURE__ */ jsx4(ChatPanel, { onClose: () => setPanel("none"), to: chatTo, onTo: setChatTo }) : null,
8951
- panel === "people" ? /* @__PURE__ */ jsx4(
9151
+ /* @__PURE__ */ jsx5(MeetingOverlays, {}),
9152
+ shortcuts ? /* @__PURE__ */ jsx5(ShortcutsSheet, { onClose: () => setShortcuts(false) }) : null,
9153
+ panel === "chat" ? /* @__PURE__ */ jsx5(ChatPanel, { onClose: () => setPanel("none"), to: chatTo, onTo: setChatTo }) : null,
9154
+ panel === "people" ? /* @__PURE__ */ jsx5(
8952
9155
  PeoplePanel,
8953
9156
  {
8954
9157
  onClose: () => setPanel("none"),
@@ -8958,53 +9161,53 @@ function ControlBar({ onLeave }) {
8958
9161
  }
8959
9162
  }
8960
9163
  ) : null,
8961
- panel === "ai" ? /* @__PURE__ */ jsx4(AiPanel, { onClose: () => setPanel("none") }) : null,
8962
- panel === "settings" ? /* @__PURE__ */ jsx4(SettingsPanel, { onClose: () => setPanel("none") }) : null,
8963
- panel === "polls" ? /* @__PURE__ */ jsx4(PollsPanel, { onClose: () => setPanel("none") }) : null,
8964
- panel === "qa" ? /* @__PURE__ */ jsx4(QaPanel, { onClose: () => setPanel("none") }) : null,
8965
- panel === "breakouts" ? /* @__PURE__ */ jsx4(BreakoutsPanel, { onClose: () => setPanel("none") }) : null,
8966
- whiteboard ? /* @__PURE__ */ jsx4(WhiteboardPanel, { onClose: () => setWhiteboard(false) }) : null,
8967
- /* @__PURE__ */ jsx4(BreakoutBanner, {}),
8968
- controls.notice !== null && panel !== "people" ? /* @__PURE__ */ jsx4(Toast, { text: controls.notice.text, failed: controls.notice.failed, onDone: controls.clearNotice }) : null,
9164
+ panel === "ai" ? /* @__PURE__ */ jsx5(AiPanel, { onClose: () => setPanel("none") }) : null,
9165
+ panel === "settings" ? /* @__PURE__ */ jsx5(SettingsPanel, { onClose: () => setPanel("none") }) : null,
9166
+ panel === "polls" ? /* @__PURE__ */ jsx5(PollsPanel, { onClose: () => setPanel("none") }) : null,
9167
+ panel === "qa" ? /* @__PURE__ */ jsx5(QaPanel, { onClose: () => setPanel("none") }) : null,
9168
+ panel === "breakouts" ? /* @__PURE__ */ jsx5(BreakoutsPanel, { onClose: () => setPanel("none") }) : null,
9169
+ whiteboard ? /* @__PURE__ */ jsx5(WhiteboardPanel, { onClose: () => setWhiteboard(false) }) : null,
9170
+ /* @__PURE__ */ jsx5(BreakoutBanner, {}),
9171
+ controls.notice !== null && panel !== "people" ? /* @__PURE__ */ jsx5(Toast, { text: controls.notice.text, failed: controls.notice.failed, onDone: controls.clearNotice }) : null,
8969
9172
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__controls", children: [
8970
- /* @__PURE__ */ jsx4(
9173
+ /* @__PURE__ */ jsx5(
8971
9174
  ControlButton,
8972
9175
  {
8973
9176
  label: micUnavailable !== null ? `Unmute \u2014 ${micUnavailable.remedy}` : room.local?.micEnabled === true ? "Mute (\u2318D)" : "Unmute (\u2318D)",
8974
9177
  active: room.local?.micEnabled === true,
8975
9178
  onClick: () => void room.toggleMicrophone(),
8976
- children: room.local?.micEnabled === true ? /* @__PURE__ */ jsx4(MicIcon, {}) : /* @__PURE__ */ jsx4(MicOffIcon, {})
9179
+ children: room.local?.micEnabled === true ? /* @__PURE__ */ jsx5(MicIcon, {}) : /* @__PURE__ */ jsx5(MicOffIcon, {})
8977
9180
  }
8978
9181
  ),
8979
- /* @__PURE__ */ jsx4(
9182
+ /* @__PURE__ */ jsx5(
8980
9183
  ControlButton,
8981
9184
  {
8982
9185
  label: room.local?.cameraEnabled === true ? "Stop video (\u2318E)" : "Start video (\u2318E)",
8983
9186
  active: room.local?.cameraEnabled === true,
8984
9187
  onClick: () => void room.toggleCamera(),
8985
- children: room.local?.cameraEnabled === true ? /* @__PURE__ */ jsx4(CameraIcon, {}) : /* @__PURE__ */ jsx4(CameraOffIcon, {})
9188
+ children: room.local?.cameraEnabled === true ? /* @__PURE__ */ jsx5(CameraIcon, {}) : /* @__PURE__ */ jsx5(CameraOffIcon, {})
8986
9189
  }
8987
9190
  ),
8988
- room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ jsx4(
9191
+ room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ jsx5(
8989
9192
  ControlButton,
8990
9193
  {
8991
9194
  label: room.local?.screenSharing === true ? "Stop sharing" : "Share screen",
8992
9195
  active: room.local?.screenSharing === true,
8993
9196
  onClick: () => void room.toggleScreenShare(),
8994
- children: /* @__PURE__ */ jsx4(ScreenShareIcon, {})
9197
+ children: /* @__PURE__ */ jsx5(ScreenShareIcon, {})
8995
9198
  }
8996
9199
  ) : null,
8997
9200
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__anchor", children: [
8998
- /* @__PURE__ */ jsx4(
9201
+ /* @__PURE__ */ jsx5(
8999
9202
  ControlButton,
9000
9203
  {
9001
9204
  label: "Send a reaction",
9002
9205
  active: popover === "reactions",
9003
9206
  onClick: () => setPopover(popover === "reactions" ? "none" : "reactions"),
9004
- children: /* @__PURE__ */ jsx4(SmileIcon, {})
9207
+ children: /* @__PURE__ */ jsx5(SmileIcon, {})
9005
9208
  }
9006
9209
  ),
9007
- popover === "reactions" ? /* @__PURE__ */ jsx4(Popover, { label: "Reactions", onClose: () => setPopover("none"), children: /* @__PURE__ */ jsx4("div", { className: "mx-meet__emoji-bar", children: MEET_REACTIONS.map((emoji) => /* @__PURE__ */ jsx4(
9210
+ popover === "reactions" ? /* @__PURE__ */ jsx5(Popover, { label: "Reactions", onClose: () => setPopover("none"), children: /* @__PURE__ */ jsx5("div", { className: "mx-meet__emoji-bar", children: MEET_REACTIONS.map((emoji) => /* @__PURE__ */ jsx5(
9008
9211
  "button",
9009
9212
  {
9010
9213
  type: "button",
@@ -9016,18 +9219,18 @@ function ControlBar({ onLeave }) {
9016
9219
  emoji
9017
9220
  )) }) }) : null
9018
9221
  ] }),
9019
- /* @__PURE__ */ jsx4(
9222
+ /* @__PURE__ */ jsx5(
9020
9223
  ControlButton,
9021
9224
  {
9022
9225
  label: room.local?.handRaised === true ? "Lower hand (\u2318\u2325H)" : "Raise hand (\u2318\u2325H)",
9023
9226
  active: room.local?.handRaised === true,
9024
9227
  onClick: () => void room.toggleHand(),
9025
- children: /* @__PURE__ */ jsx4(HandIcon, {})
9228
+ children: /* @__PURE__ */ jsx5(HandIcon, {})
9026
9229
  }
9027
9230
  ),
9028
9231
  /* @__PURE__ */ jsxs3(ControlButton, { label: "Chat (\u2318\u2325C)", active: panel === "chat", onClick: () => toggle("chat"), children: [
9029
- /* @__PURE__ */ jsx4(ChatIcon, {}),
9030
- unread > 0 ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
9232
+ /* @__PURE__ */ jsx5(ChatIcon, {}),
9233
+ unread > 0 ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
9031
9234
  ] }),
9032
9235
  /* @__PURE__ */ jsxs3(
9033
9236
  ControlButton,
@@ -9036,32 +9239,32 @@ function ControlBar({ onLeave }) {
9036
9239
  active: panel === "people",
9037
9240
  onClick: () => toggle("people"),
9038
9241
  children: [
9039
- /* @__PURE__ */ jsx4(PeopleIcon, {}),
9040
- lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
9242
+ /* @__PURE__ */ jsx5(PeopleIcon, {}),
9243
+ lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
9041
9244
  ]
9042
9245
  }
9043
9246
  ),
9044
- /* @__PURE__ */ jsx4(
9247
+ /* @__PURE__ */ jsx5(
9045
9248
  ActivitiesControl,
9046
9249
  {
9047
9250
  active: whiteboard ? "whiteboard" : panel === "polls" || panel === "qa" || panel === "breakouts" ? panel : null,
9048
9251
  onOpen: openActivity
9049
9252
  }
9050
9253
  ),
9051
- /* @__PURE__ */ jsx4(AiControl, { active: panel === "ai", onToggle: () => toggle("ai") }),
9052
- recording.canStart ? /* @__PURE__ */ jsx4(ControlButton, { label: "Start recording", onClick: () => void recording.start(), children: /* @__PURE__ */ jsx4(RecordIcon, {}) }) : null,
9053
- recording.canStop ? /* @__PURE__ */ jsx4(ControlButton, { label: "Stop recording", active: true, onClick: () => void recording.stop(), children: /* @__PURE__ */ jsx4(RecordIcon, {}) }) : null,
9254
+ /* @__PURE__ */ jsx5(AiControl, { active: panel === "ai", onToggle: () => toggle("ai") }),
9255
+ recording.canStart ? /* @__PURE__ */ jsx5(ControlButton, { label: "Start recording", onClick: () => void recording.start(), children: /* @__PURE__ */ jsx5(RecordIcon, {}) }) : null,
9256
+ recording.canStop ? /* @__PURE__ */ jsx5(ControlButton, { label: "Stop recording", active: true, onClick: () => void recording.stop(), children: /* @__PURE__ */ jsx5(RecordIcon, {}) }) : null,
9054
9257
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__anchor", children: [
9055
- /* @__PURE__ */ jsx4(
9258
+ /* @__PURE__ */ jsx5(
9056
9259
  ControlButton,
9057
9260
  {
9058
9261
  label: "More options",
9059
9262
  active: popover === "more" || panel === "settings",
9060
9263
  onClick: () => setPopover(popover === "more" ? "none" : "more"),
9061
- children: /* @__PURE__ */ jsx4(MoreIcon, {})
9264
+ children: /* @__PURE__ */ jsx5(MoreIcon, {})
9062
9265
  }
9063
9266
  ),
9064
- popover === "more" ? /* @__PURE__ */ jsx4(Popover, { label: "More options", onClose: () => setPopover("none"), children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu", role: "menu", children: [
9267
+ popover === "more" ? /* @__PURE__ */ jsx5(Popover, { label: "More options", onClose: () => setPopover("none"), children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu", role: "menu", children: [
9065
9268
  /* @__PURE__ */ jsxs3(
9066
9269
  MenuItem,
9067
9270
  {
@@ -9070,7 +9273,7 @@ function ControlBar({ onLeave }) {
9070
9273
  setPanel("settings");
9071
9274
  },
9072
9275
  children: [
9073
- /* @__PURE__ */ jsx4(SettingsIcon, { width: 16, height: 16 }),
9276
+ /* @__PURE__ */ jsx5(SettingsIcon, { width: 16, height: 16 }),
9074
9277
  " Settings"
9075
9278
  ]
9076
9279
  }
@@ -9083,13 +9286,13 @@ function ControlBar({ onLeave }) {
9083
9286
  setShortcuts(true);
9084
9287
  },
9085
9288
  children: [
9086
- /* @__PURE__ */ jsx4(KeyboardIcon, { width: 16, height: 16 }),
9289
+ /* @__PURE__ */ jsx5(KeyboardIcon, { width: 16, height: 16 }),
9087
9290
  " Keyboard shortcuts"
9088
9291
  ]
9089
9292
  }
9090
9293
  ),
9091
9294
  controls.isHost ? /* @__PURE__ */ jsxs3(Fragment, { children: [
9092
- /* @__PURE__ */ jsx4("div", { className: "mx-meet__menu-sep", role: "separator" }),
9295
+ /* @__PURE__ */ jsx5("div", { className: "mx-meet__menu-sep", role: "separator" }),
9093
9296
  /* @__PURE__ */ jsxs3(
9094
9297
  MenuItem,
9095
9298
  {
@@ -9098,7 +9301,7 @@ function ControlBar({ onLeave }) {
9098
9301
  void controls.run({ action: "mute_all" });
9099
9302
  },
9100
9303
  children: [
9101
- /* @__PURE__ */ jsx4(MicOffIcon, { width: 16, height: 16 }),
9304
+ /* @__PURE__ */ jsx5(MicOffIcon, { width: 16, height: 16 }),
9102
9305
  " Mute everyone"
9103
9306
  ]
9104
9307
  }
@@ -9111,7 +9314,7 @@ function ControlBar({ onLeave }) {
9111
9314
  void controls.run({ action: "ask_all_unmute" });
9112
9315
  },
9113
9316
  children: [
9114
- /* @__PURE__ */ jsx4(MicIcon, { width: 16, height: 16 }),
9317
+ /* @__PURE__ */ jsx5(MicIcon, { width: 16, height: 16 }),
9115
9318
  " Ask everyone to unmute"
9116
9319
  ]
9117
9320
  }
@@ -9124,7 +9327,7 @@ function ControlBar({ onLeave }) {
9124
9327
  void controls.run({ action: "lower_all_hands" });
9125
9328
  },
9126
9329
  children: [
9127
- /* @__PURE__ */ jsx4(HandIcon, { width: 16, height: 16 }),
9330
+ /* @__PURE__ */ jsx5(HandIcon, { width: 16, height: 16 }),
9128
9331
  " Lower all hands (",
9129
9332
  queue.length,
9130
9333
  ")"
@@ -9139,7 +9342,7 @@ function ControlBar({ onLeave }) {
9139
9342
  void controls.run({ action: "spotlight", identity: null });
9140
9343
  },
9141
9344
  children: [
9142
- /* @__PURE__ */ jsx4(SpotlightIcon, { width: 16, height: 16 }),
9345
+ /* @__PURE__ */ jsx5(SpotlightIcon, { width: 16, height: 16 }),
9143
9346
  " Remove spotlight"
9144
9347
  ]
9145
9348
  }
@@ -9147,7 +9350,7 @@ function ControlBar({ onLeave }) {
9147
9350
  ] }) : null
9148
9351
  ] }) }) : null
9149
9352
  ] }),
9150
- /* @__PURE__ */ jsx4(
9353
+ /* @__PURE__ */ jsx5(
9151
9354
  ControlButton,
9152
9355
  {
9153
9356
  label: "Leave",
@@ -9156,7 +9359,7 @@ function ControlBar({ onLeave }) {
9156
9359
  void room.leave();
9157
9360
  onLeave?.();
9158
9361
  },
9159
- children: /* @__PURE__ */ jsx4(PhoneOffIcon, {})
9362
+ children: /* @__PURE__ */ jsx5(PhoneOffIcon, {})
9160
9363
  }
9161
9364
  )
9162
9365
  ] })
@@ -9167,12 +9370,12 @@ function useUnreadChat(open) {
9167
9370
  const chat = snapshot?.chat ?? [];
9168
9371
  const local = snapshot?.localIdentity ?? null;
9169
9372
  const [seen, setSeen] = useState4(0);
9170
- useEffect4(() => {
9373
+ useEffect6(() => {
9171
9374
  if (open) setSeen(chat.length);
9172
9375
  }, [open, chat.length]);
9173
9376
  const loaded = snapshot?.chatLoaded === true;
9174
9377
  const [baseline, setBaseline] = useState4(null);
9175
- useEffect4(() => {
9378
+ useEffect6(() => {
9176
9379
  if (loaded && baseline === null) setBaseline(chat.length);
9177
9380
  }, [loaded, baseline, chat.length]);
9178
9381
  if (open) return 0;
@@ -9185,7 +9388,7 @@ function Popover({
9185
9388
  children,
9186
9389
  placement = "up"
9187
9390
  }) {
9188
- const ref = useRef4(null);
9391
+ const ref = useRef6(null);
9189
9392
  const [style, setStyle] = useState4({
9190
9393
  position: "fixed",
9191
9394
  top: 0,
@@ -9237,7 +9440,7 @@ function Popover({
9237
9440
  window.removeEventListener("scroll", place, true);
9238
9441
  };
9239
9442
  }, [placement]);
9240
- useEffect4(() => {
9443
+ useEffect6(() => {
9241
9444
  const onKey = (event) => {
9242
9445
  if (event.key === "Escape") onClose();
9243
9446
  };
@@ -9252,14 +9455,14 @@ function Popover({
9252
9455
  window.removeEventListener("pointerdown", onPointer);
9253
9456
  };
9254
9457
  }, [onClose]);
9255
- return /* @__PURE__ */ jsx4("div", { ref, className: "mx-meet__popover", style, role: "dialog", "aria-label": label, children });
9458
+ return /* @__PURE__ */ jsx5("div", { ref, className: "mx-meet__popover", style, role: "dialog", "aria-label": label, children });
9256
9459
  }
9257
9460
  function MenuItem({
9258
9461
  onSelect,
9259
9462
  danger = false,
9260
9463
  children
9261
9464
  }) {
9262
- return /* @__PURE__ */ jsx4(
9465
+ return /* @__PURE__ */ jsx5(
9263
9466
  "button",
9264
9467
  {
9265
9468
  type: "button",
@@ -9271,13 +9474,13 @@ function MenuItem({
9271
9474
  );
9272
9475
  }
9273
9476
  function Toast({ text: text3, failed, onDone }) {
9274
- useEffect4(() => {
9477
+ useEffect6(() => {
9275
9478
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
9276
9479
  return () => clearTimeout(timer);
9277
9480
  }, [text3, failed, onDone]);
9278
9481
  return /* @__PURE__ */ jsxs3("div", { className: failed ? "mx-meet__toast mx-meet__toast--failed" : "mx-meet__toast", role: "status", children: [
9279
- /* @__PURE__ */ jsx4("span", { children: text3 }),
9280
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: onDone, children: /* @__PURE__ */ jsx4(CloseIcon, { width: 14, height: 14 }) })
9482
+ /* @__PURE__ */ jsx5("span", { children: text3 }),
9483
+ /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: onDone, children: /* @__PURE__ */ jsx5(CloseIcon, { width: 14, height: 14 }) })
9281
9484
  ] });
9282
9485
  }
9283
9486
  function MeetingOverlays() {
@@ -9285,14 +9488,14 @@ function MeetingOverlays() {
9285
9488
  const { notice, dismiss } = useModerationNotice();
9286
9489
  const room = useRoom();
9287
9490
  return /* @__PURE__ */ jsxs3(Fragment, { children: [
9288
- /* @__PURE__ */ jsx4(ReactionOverlay, { reactions }),
9491
+ /* @__PURE__ */ jsx5(ReactionOverlay, { reactions }),
9289
9492
  notice !== null && notice.kind !== "removed" ? (
9290
9493
  // A host's request ("the host is asking you to unmute"), not an error:
9291
9494
  // an assertive status, so it is announced at once without being filed
9292
9495
  // as a failure (design-system error-box census).
9293
9496
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__notice-bar", role: "status", "aria-live": "assertive", children: [
9294
- /* @__PURE__ */ jsx4("span", { children: notice.text }),
9295
- notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ jsx4(
9497
+ /* @__PURE__ */ jsx5("span", { children: notice.text }),
9498
+ notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ jsx5(
9296
9499
  "button",
9297
9500
  {
9298
9501
  type: "button",
@@ -9304,20 +9507,20 @@ function MeetingOverlays() {
9304
9507
  children: "Unmute"
9305
9508
  }
9306
9509
  ) : null,
9307
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: dismiss, children: /* @__PURE__ */ jsx4(CloseIcon, { width: 14, height: 14 }) })
9510
+ /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: dismiss, children: /* @__PURE__ */ jsx5(CloseIcon, { width: 14, height: 14 }) })
9308
9511
  ] })
9309
9512
  ) : null
9310
9513
  ] });
9311
9514
  }
9312
9515
  function ShortcutsSheet({ onClose }) {
9313
- useEffect4(() => {
9516
+ useEffect6(() => {
9314
9517
  const onKey = (event) => {
9315
9518
  if (event.key === "Escape") onClose();
9316
9519
  };
9317
9520
  window.addEventListener("keydown", onKey);
9318
9521
  return () => window.removeEventListener("keydown", onKey);
9319
9522
  }, [onClose]);
9320
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet__sheet-backdrop", onClick: onClose, children: /* @__PURE__ */ jsxs3(
9523
+ return /* @__PURE__ */ jsx5("div", { className: "mx-meet__sheet-backdrop", onClick: onClose, children: /* @__PURE__ */ jsxs3(
9321
9524
  "div",
9322
9525
  {
9323
9526
  className: "mx-meet__sheet",
@@ -9326,12 +9529,12 @@ function ShortcutsSheet({ onClose }) {
9326
9529
  onClick: (event) => event.stopPropagation(),
9327
9530
  children: [
9328
9531
  /* @__PURE__ */ jsxs3("header", { className: "mx-meet__panel-head", children: [
9329
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__panel-title", children: "Keyboard shortcuts" }),
9330
- /* @__PURE__ */ jsx4(ControlButton, { label: "Close", onClick: onClose, children: /* @__PURE__ */ jsx4(CloseIcon, { width: 16, height: 16 }) })
9532
+ /* @__PURE__ */ jsx5("h2", { className: "mx-meet__panel-title", children: "Keyboard shortcuts" }),
9533
+ /* @__PURE__ */ jsx5(ControlButton, { label: "Close", onClick: onClose, children: /* @__PURE__ */ jsx5(CloseIcon, { width: 16, height: 16 }) })
9331
9534
  ] }),
9332
- /* @__PURE__ */ jsx4("dl", { className: "mx-meet__shortcuts", children: MEET_SHORTCUTS.map((shortcut) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__shortcut", children: [
9333
- /* @__PURE__ */ jsx4("dt", { children: shortcut.label }),
9334
- /* @__PURE__ */ jsx4("dd", { children: /* @__PURE__ */ jsx4("kbd", { className: "mx-meet__kbd", children: shortcut.keys }) })
9535
+ /* @__PURE__ */ jsx5("dl", { className: "mx-meet__shortcuts", children: MEET_SHORTCUTS.map((shortcut) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__shortcut", children: [
9536
+ /* @__PURE__ */ jsx5("dt", { children: shortcut.label }),
9537
+ /* @__PURE__ */ jsx5("dd", { children: /* @__PURE__ */ jsx5("kbd", { className: "mx-meet__kbd", children: shortcut.keys }) })
9335
9538
  ] }, shortcut.id)) })
9336
9539
  ]
9337
9540
  }
@@ -9341,14 +9544,14 @@ function AiControl({ active, onToggle }) {
9341
9544
  const snapshot = useMeetSnapshot();
9342
9545
  const meeting = snapshot?.meeting ?? null;
9343
9546
  if (meeting === null || !meeting.aiEnabled) return null;
9344
- return /* @__PURE__ */ jsx4(ControlButton, { label: "Meeting assistant", active, onClick: onToggle, children: /* @__PURE__ */ jsx4(SparklesIcon, {}) });
9547
+ return /* @__PURE__ */ jsx5(ControlButton, { label: "Meeting assistant", active, onClick: onToggle, children: /* @__PURE__ */ jsx5(SparklesIcon, {}) });
9345
9548
  }
9346
9549
  function PanelShell({
9347
9550
  title,
9348
9551
  onClose,
9349
9552
  children
9350
9553
  }) {
9351
- const ref = useRef4(null);
9554
+ const ref = useRef6(null);
9352
9555
  useLayoutEffect(() => {
9353
9556
  const panel = ref.current;
9354
9557
  const root = panel?.closest(".mx-meet");
@@ -9363,10 +9566,10 @@ function PanelShell({
9363
9566
  }, []);
9364
9567
  return /* @__PURE__ */ jsxs3("aside", { ref, className: "mx-meet__panel", "aria-label": title, children: [
9365
9568
  /* @__PURE__ */ jsxs3("header", { className: "mx-meet__panel-head", children: [
9366
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__panel-title", children: title }),
9367
- /* @__PURE__ */ jsx4(ControlButton, { label: "Close panel", onClick: onClose, children: /* @__PURE__ */ jsx4(CloseIcon, { width: 16, height: 16 }) })
9569
+ /* @__PURE__ */ jsx5("h2", { className: "mx-meet__panel-title", children: title }),
9570
+ /* @__PURE__ */ jsx5(ControlButton, { label: "Close panel", onClick: onClose, children: /* @__PURE__ */ jsx5(CloseIcon, { width: 16, height: 16 }) })
9368
9571
  ] }),
9369
- /* @__PURE__ */ jsx4("div", { className: "mx-meet__panel-body", children })
9572
+ /* @__PURE__ */ jsx5("div", { className: "mx-meet__panel-body", children })
9370
9573
  ] });
9371
9574
  }
9372
9575
  function ChatPanel({
@@ -9378,15 +9581,15 @@ function ChatPanel({
9378
9581
  const room = useRoom();
9379
9582
  const [draft, setDraft] = useState4("");
9380
9583
  const [recipient, setRecipient] = useState4(to);
9381
- const listRef = useRef4(null);
9584
+ const listRef = useRef6(null);
9382
9585
  const messages = snapshot?.chat ?? [];
9383
9586
  const local = snapshot?.localIdentity ?? null;
9384
9587
  const people = (snapshot?.participants ?? []).filter(
9385
9588
  (participant) => !participant.isLocal && !participant.isAgent
9386
9589
  );
9387
9590
  const recipientName = recipient === null ? null : people.find((p) => p.identity === recipient)?.displayName ?? null;
9388
- useEffect4(() => setRecipient(to), [to]);
9389
- useEffect4(() => {
9591
+ useEffect6(() => setRecipient(to), [to]);
9592
+ useEffect6(() => {
9390
9593
  const list = listRef.current;
9391
9594
  if (list !== null) list.scrollTop = list.scrollHeight;
9392
9595
  }, [messages.length]);
@@ -9396,9 +9599,9 @@ function ChatPanel({
9396
9599
  };
9397
9600
  return /* @__PURE__ */ jsxs3(PanelShell, { title: "Chat", onClose, children: [
9398
9601
  /* @__PURE__ */ jsxs3("ul", { className: "mx-meet__chat", ref: listRef, children: [
9399
- snapshot?.chatHistoryError != null ? /* @__PURE__ */ jsx4("li", { className: "mx-meet__panel-note", children: snapshot.chatHistoryError }) : null,
9400
- snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ jsx4("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ jsx4("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,
9401
- messages.map((message) => /* @__PURE__ */ jsx4(ChatLine, { message, local, people }, message.id))
9602
+ snapshot?.chatHistoryError != null ? /* @__PURE__ */ jsx5("li", { className: "mx-meet__panel-note", children: snapshot.chatHistoryError }) : null,
9603
+ snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ jsx5("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ jsx5("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,
9604
+ messages.map((message) => /* @__PURE__ */ jsx5(ChatLine, { message, local, people }, message.id))
9402
9605
  ] }),
9403
9606
  /* @__PURE__ */ jsxs3(
9404
9607
  "form",
@@ -9421,7 +9624,7 @@ function ChatPanel({
9421
9624
  value: recipient ?? "",
9422
9625
  onChange: (event) => choose(event.target.value === "" ? null : event.target.value),
9423
9626
  children: [
9424
- /* @__PURE__ */ jsx4("option", { value: "", children: "Everyone" }),
9627
+ /* @__PURE__ */ jsx5("option", { value: "", children: "Everyone" }),
9425
9628
  people.map((participant) => /* @__PURE__ */ jsxs3("option", { value: participant.identity, children: [
9426
9629
  participant.displayName,
9427
9630
  " (private)"
@@ -9430,7 +9633,7 @@ function ChatPanel({
9430
9633
  }
9431
9634
  ) : null,
9432
9635
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__composer-row", children: [
9433
- /* @__PURE__ */ jsx4(
9636
+ /* @__PURE__ */ jsx5(
9434
9637
  "input",
9435
9638
  {
9436
9639
  className: "mx-meet__input",
@@ -9441,7 +9644,7 @@ function ChatPanel({
9441
9644
  maxLength: 4e3
9442
9645
  }
9443
9646
  ),
9444
- /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Send" })
9647
+ /* @__PURE__ */ jsx5("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Send" })
9445
9648
  ] }),
9446
9649
  recipientName !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__panel-note", children: [
9447
9650
  "Only ",
@@ -9471,16 +9674,16 @@ function ChatLine({
9471
9674
  ].filter(Boolean).join(" "),
9472
9675
  children: [
9473
9676
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__chat-meta", children: [
9474
- /* @__PURE__ */ jsx4("strong", { children: mine ? "You" : message.displayName }),
9677
+ /* @__PURE__ */ jsx5("strong", { children: mine ? "You" : message.displayName }),
9475
9678
  counterpart !== null ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__chat-private", children: [
9476
9679
  "to ",
9477
9680
  counterpart,
9478
9681
  " \xB7 private"
9479
9682
  ] }) : null,
9480
- /* @__PURE__ */ jsx4("time", { dateTime: message.at, children: clockOf(message.at) })
9683
+ /* @__PURE__ */ jsx5("time", { dateTime: message.at, children: clockOf(message.at) })
9481
9684
  ] }),
9482
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__chat-text", children: message.text }),
9483
- message.failed !== void 0 ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__chat-failed", children: message.failed }) : privateTo === null && message.saved === false ? /* @__PURE__ */ jsx4("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
9685
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__chat-text", children: message.text }),
9686
+ message.failed !== void 0 ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__chat-failed", children: message.failed }) : privateTo === null && message.saved === false ? /* @__PURE__ */ jsx5("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
9484
9687
  ]
9485
9688
  }
9486
9689
  );
@@ -9500,14 +9703,14 @@ function PeoplePanel({
9500
9703
  const needle = query.trim().toLowerCase();
9501
9704
  const shown = needle.length === 0 ? everyone : everyone.filter((participant) => participant.displayName.toLowerCase().includes(needle));
9502
9705
  return /* @__PURE__ */ jsxs3(PanelShell, { title: `People (${everyone.length})`, onClose, children: [
9503
- /* @__PURE__ */ jsx4(LobbyPanel, {}),
9706
+ /* @__PURE__ */ jsx5(LobbyPanel, {}),
9504
9707
  queue.length > 0 ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__section", "aria-label": "Raised hands", children: [
9505
9708
  /* @__PURE__ */ jsxs3("header", { className: "mx-meet__section-head", children: [
9506
9709
  /* @__PURE__ */ jsxs3("h3", { className: "mx-meet__section-title", children: [
9507
9710
  "Raised hands \xB7 ",
9508
9711
  queue.length
9509
9712
  ] }),
9510
- controls.isHost ? /* @__PURE__ */ jsx4(
9713
+ controls.isHost ? /* @__PURE__ */ jsx5(
9511
9714
  "button",
9512
9715
  {
9513
9716
  type: "button",
@@ -9517,13 +9720,13 @@ function PeoplePanel({
9517
9720
  }
9518
9721
  ) : null
9519
9722
  ] }),
9520
- /* @__PURE__ */ jsx4("ol", { className: "mx-meet__queue", children: queue.map((participant) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__person", children: [
9521
- /* @__PURE__ */ jsx4(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 28 }),
9723
+ /* @__PURE__ */ jsx5("ol", { className: "mx-meet__queue", children: queue.map((participant) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__person", children: [
9724
+ /* @__PURE__ */ jsx5(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 28 }),
9522
9725
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
9523
9726
  participant.displayName,
9524
- participant.identity === local ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__you", children: " (you)" }) : null
9727
+ participant.identity === local ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__you", children: " (you)" }) : null
9525
9728
  ] }),
9526
- controls.isHost || participant.identity === local ? /* @__PURE__ */ jsx4(
9729
+ controls.isHost || participant.identity === local ? /* @__PURE__ */ jsx5(
9527
9730
  "button",
9528
9731
  {
9529
9732
  type: "button",
@@ -9536,7 +9739,7 @@ function PeoplePanel({
9536
9739
  ] }) : null,
9537
9740
  controls.isHost && everyone.length > 1 ? /* @__PURE__ */ jsxs3("div", { className: "mx-meet__bulk", children: [
9538
9741
  /* @__PURE__ */ jsxs3("button", { type: "button", className: "mx-meet__chip", onClick: () => void controls.run({ action: "mute_all" }), children: [
9539
- /* @__PURE__ */ jsx4(MicOffIcon, { width: 14, height: 14 }),
9742
+ /* @__PURE__ */ jsx5(MicOffIcon, { width: 14, height: 14 }),
9540
9743
  " Mute all"
9541
9744
  ] }),
9542
9745
  /* @__PURE__ */ jsxs3(
@@ -9546,15 +9749,15 @@ function PeoplePanel({
9546
9749
  className: "mx-meet__chip",
9547
9750
  onClick: () => void controls.run({ action: "ask_all_unmute" }),
9548
9751
  children: [
9549
- /* @__PURE__ */ jsx4(MicIcon, { width: 14, height: 14 }),
9752
+ /* @__PURE__ */ jsx5(MicIcon, { width: 14, height: 14 }),
9550
9753
  " Ask all to unmute"
9551
9754
  ]
9552
9755
  }
9553
9756
  )
9554
9757
  ] }) : null,
9555
9758
  everyone.length > 4 ? /* @__PURE__ */ jsxs3("label", { className: "mx-meet__search", children: [
9556
- /* @__PURE__ */ jsx4(SearchIcon, { width: 16, height: 16 }),
9557
- /* @__PURE__ */ jsx4(
9759
+ /* @__PURE__ */ jsx5(SearchIcon, { width: 16, height: 16 }),
9760
+ /* @__PURE__ */ jsx5(
9558
9761
  "input",
9559
9762
  {
9560
9763
  className: "mx-meet__input mx-meet__input--bare",
@@ -9565,31 +9768,31 @@ function PeoplePanel({
9565
9768
  }
9566
9769
  )
9567
9770
  ] }) : null,
9568
- controls.notice !== null ? /* @__PURE__ */ jsx4("p", { className: controls.notice.failed ? "mx-meet__error" : "mx-meet__notice", role: "status", children: controls.notice.text }) : null,
9771
+ controls.notice !== null ? /* @__PURE__ */ jsx5("p", { className: controls.notice.failed ? "mx-meet__error" : "mx-meet__notice", role: "status", children: controls.notice.text }) : null,
9569
9772
  /* @__PURE__ */ jsxs3("ul", { className: "mx-meet__people", children: [
9570
9773
  shown.map((participant) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__person", children: [
9571
- /* @__PURE__ */ jsx4(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 32 }),
9774
+ /* @__PURE__ */ jsx5(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 32 }),
9572
9775
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
9573
9776
  participant.displayName,
9574
- participant.identity === local ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__you", children: " (you)" }) : null,
9575
- /* @__PURE__ */ jsx4(RoleBadge, { role: participant.identity === local ? myRole : participant.role }),
9576
- isNoteTaker(participant) ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
9577
- snapshot?.spotlight === participant.identity ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
9777
+ participant.identity === local ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__you", children: " (you)" }) : null,
9778
+ /* @__PURE__ */ jsx5(RoleBadge, { role: participant.identity === local ? myRole : participant.role }),
9779
+ isNoteTaker(participant) ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
9780
+ snapshot?.spotlight === participant.identity ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
9578
9781
  ] }),
9579
- participant.handRaised ? /* @__PURE__ */ jsx4(HandIcon, { width: 14, height: 14 }) : null,
9580
- !participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ jsx4(MicOffIcon, { width: 14, height: 14 }) : null,
9581
- /* @__PURE__ */ jsx4(QualityBars, { quality: participant.quality }),
9782
+ participant.handRaised ? /* @__PURE__ */ jsx5(HandIcon, { width: 14, height: 14 }) : null,
9783
+ !participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ jsx5(MicOffIcon, { width: 14, height: 14 }) : null,
9784
+ /* @__PURE__ */ jsx5(QualityBars, { quality: participant.quality }),
9582
9785
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__anchor", children: [
9583
- /* @__PURE__ */ jsx4(
9786
+ /* @__PURE__ */ jsx5(
9584
9787
  ControlButton,
9585
9788
  {
9586
9789
  label: `More for ${participant.displayName}`,
9587
9790
  active: menuFor === participant.identity,
9588
9791
  onClick: () => setMenuFor(menuFor === participant.identity ? null : participant.identity),
9589
- children: /* @__PURE__ */ jsx4(MoreIcon, { width: 16, height: 16 })
9792
+ children: /* @__PURE__ */ jsx5(MoreIcon, { width: 16, height: 16 })
9590
9793
  }
9591
9794
  ),
9592
- menuFor === participant.identity ? /* @__PURE__ */ jsx4(
9795
+ menuFor === participant.identity ? /* @__PURE__ */ jsx5(
9593
9796
  PersonMenu,
9594
9797
  {
9595
9798
  participant,
@@ -9606,7 +9809,7 @@ function PeoplePanel({
9606
9809
  "\u201D."
9607
9810
  ] }) : null
9608
9811
  ] }),
9609
- snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ jsx4(GuestRecordAccessControl, { meeting: snapshot.meeting }) : null
9812
+ snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ jsx5(GuestRecordAccessControl, { meeting: snapshot.meeting }) : null
9610
9813
  ] });
9611
9814
  }
9612
9815
  function PersonMenu({
@@ -9633,10 +9836,10 @@ function PersonMenu({
9633
9836
  else setRefused(true);
9634
9837
  });
9635
9838
  };
9636
- const refusal2 = refused && controls.notice?.failed === true ? /* @__PURE__ */ jsx4(ErrorBox, { as: "p", className: "mx-meet__error", message: controls.notice.text, operation: "Change this participant", origin: "meet/components", children: controls.notice.text }) : null;
9839
+ const refusal2 = refused && controls.notice?.failed === true ? /* @__PURE__ */ jsx5(ErrorBox, { as: "p", className: "mx-meet__error", message: controls.notice.text, operation: "Change this participant", origin: "meet/components", children: controls.notice.text }) : null;
9637
9840
  if (mode === "rename" || mode === "report") {
9638
9841
  const renaming = mode === "rename";
9639
- return /* @__PURE__ */ jsx4(Popover, { label: renaming ? "Rename" : "Report", onClose, placement, children: /* @__PURE__ */ jsxs3(
9842
+ return /* @__PURE__ */ jsx5(Popover, { label: renaming ? "Rename" : "Report", onClose, placement, children: /* @__PURE__ */ jsxs3(
9640
9843
  "form",
9641
9844
  {
9642
9845
  className: "mx-meet__menu-form",
@@ -9649,8 +9852,8 @@ function PersonMenu({
9649
9852
  },
9650
9853
  children: [
9651
9854
  /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
9652
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: renaming ? "Name shown in this meeting" : `What did ${participant.displayName} do?` }),
9653
- renaming ? /* @__PURE__ */ jsx4(
9855
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__field-label", children: renaming ? "Name shown in this meeting" : `What did ${participant.displayName} do?` }),
9856
+ renaming ? /* @__PURE__ */ jsx5(
9654
9857
  "input",
9655
9858
  {
9656
9859
  className: "mx-meet__input",
@@ -9659,7 +9862,7 @@ function PersonMenu({
9659
9862
  value: text3,
9660
9863
  onChange: (event) => setText(event.target.value)
9661
9864
  }
9662
- ) : /* @__PURE__ */ jsx4(
9865
+ ) : /* @__PURE__ */ jsx5(
9663
9866
  "textarea",
9664
9867
  {
9665
9868
  className: "mx-meet__input",
@@ -9673,8 +9876,8 @@ function PersonMenu({
9673
9876
  ] }),
9674
9877
  refusal2,
9675
9878
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu-actions", children: [
9676
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Back" }),
9677
- /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", disabled: text3.trim().length === 0 || controls.busy, children: renaming ? "Rename" : "Report" })
9879
+ /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Back" }),
9880
+ /* @__PURE__ */ jsx5("button", { type: "submit", className: "mx-meet__send", disabled: text3.trim().length === 0 || controls.busy, children: renaming ? "Rename" : "Report" })
9678
9881
  ] })
9679
9882
  ]
9680
9883
  }
@@ -9682,12 +9885,12 @@ function PersonMenu({
9682
9885
  }
9683
9886
  if (mode === "remove" || mode === "transfer") {
9684
9887
  const removing = mode === "remove";
9685
- return /* @__PURE__ */ jsx4(Popover, { label: removing ? "Remove" : "Make host", onClose, placement, children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu-form", children: [
9686
- /* @__PURE__ */ jsx4("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.` }),
9888
+ return /* @__PURE__ */ jsx5(Popover, { label: removing ? "Remove" : "Make host", onClose, placement, children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu-form", children: [
9889
+ /* @__PURE__ */ jsx5("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.` }),
9687
9890
  refusal2,
9688
9891
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu-actions", children: [
9689
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Cancel" }),
9690
- /* @__PURE__ */ jsx4(
9892
+ /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Cancel" }),
9893
+ /* @__PURE__ */ jsx5(
9691
9894
  "button",
9692
9895
  {
9693
9896
  type: "button",
@@ -9700,7 +9903,7 @@ function PersonMenu({
9700
9903
  ] })
9701
9904
  ] }) });
9702
9905
  }
9703
- return /* @__PURE__ */ jsx4(Popover, { label: `Options for ${participant.displayName}`, onClose, placement, children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu", role: "menu", children: [
9906
+ return /* @__PURE__ */ jsx5(Popover, { label: `Options for ${participant.displayName}`, onClose, placement, children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__menu", role: "menu", children: [
9704
9907
  /* @__PURE__ */ jsxs3(
9705
9908
  MenuItem,
9706
9909
  {
@@ -9709,7 +9912,7 @@ function PersonMenu({
9709
9912
  onClose();
9710
9913
  },
9711
9914
  children: [
9712
- /* @__PURE__ */ jsx4(PinIcon, { width: 16, height: 16 }),
9915
+ /* @__PURE__ */ jsx5(PinIcon, { width: 16, height: 16 }),
9713
9916
  " ",
9714
9917
  pinned ? "Unpin" : "Pin for me"
9715
9918
  ]
@@ -9727,39 +9930,39 @@ function PersonMenu({
9727
9930
  onClose();
9728
9931
  },
9729
9932
  children: [
9730
- /* @__PURE__ */ jsx4(ChatIcon, { width: 16, height: 16 }),
9933
+ /* @__PURE__ */ jsx5(ChatIcon, { width: 16, height: 16 }),
9731
9934
  " Message privately"
9732
9935
  ]
9733
9936
  }
9734
9937
  ) : null,
9735
9938
  controls.isHost ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "spotlight", identity: spotlit ? null : participant.identity }), children: [
9736
- /* @__PURE__ */ jsx4(SpotlightIcon, { width: 16, height: 16 }),
9939
+ /* @__PURE__ */ jsx5(SpotlightIcon, { width: 16, height: 16 }),
9737
9940
  " ",
9738
9941
  spotlit ? "Remove spotlight" : "Spotlight for everyone"
9739
9942
  ] }) : null,
9740
9943
  moderate ? /* @__PURE__ */ jsxs3(Fragment, { children: [
9741
- /* @__PURE__ */ jsx4("div", { className: "mx-meet__menu-sep", role: "separator" }),
9944
+ /* @__PURE__ */ jsx5("div", { className: "mx-meet__menu-sep", role: "separator" }),
9742
9945
  participant.micEnabled ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "mute", identity: participant.identity }), children: [
9743
- /* @__PURE__ */ jsx4(MicOffIcon, { width: 16, height: 16 }),
9946
+ /* @__PURE__ */ jsx5(MicOffIcon, { width: 16, height: 16 }),
9744
9947
  " Mute"
9745
9948
  ] }) : !participant.isAgent ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "ask_unmute", identity: participant.identity }), children: [
9746
- /* @__PURE__ */ jsx4(MicIcon, { width: 16, height: 16 }),
9949
+ /* @__PURE__ */ jsx5(MicIcon, { width: 16, height: 16 }),
9747
9950
  " Ask to unmute"
9748
9951
  ] }) : null,
9749
9952
  participant.cameraEnabled ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "stop_video", identity: participant.identity }), children: [
9750
- /* @__PURE__ */ jsx4(CameraOffIcon, { width: 16, height: 16 }),
9953
+ /* @__PURE__ */ jsx5(CameraOffIcon, { width: 16, height: 16 }),
9751
9954
  " Stop video"
9752
9955
  ] }) : null,
9753
9956
  participant.screenSharing ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "stop_screen", identity: participant.identity }), children: [
9754
- /* @__PURE__ */ jsx4(ScreenShareIcon, { width: 16, height: 16 }),
9957
+ /* @__PURE__ */ jsx5(ScreenShareIcon, { width: 16, height: 16 }),
9755
9958
  " Stop screen share"
9756
9959
  ] }) : null,
9757
9960
  participant.handRaised ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "lower_hand", identity: participant.identity }), children: [
9758
- /* @__PURE__ */ jsx4(HandIcon, { width: 16, height: 16 }),
9961
+ /* @__PURE__ */ jsx5(HandIcon, { width: 16, height: 16 }),
9759
9962
  " Lower hand"
9760
9963
  ] }) : null,
9761
9964
  hasAccount && !participant.isAgent && participant.role !== "cohost" ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "make_cohost", identity: participant.identity }), children: [
9762
- /* @__PURE__ */ jsx4(PeopleIcon, { width: 16, height: 16 }),
9965
+ /* @__PURE__ */ jsx5(PeopleIcon, { width: 16, height: 16 }),
9763
9966
  " Make co-host"
9764
9967
  ] }) : null,
9765
9968
  !participant.isAgent ? /* @__PURE__ */ jsxs3(
@@ -9770,18 +9973,18 @@ function PersonMenu({
9770
9973
  setMode("rename");
9771
9974
  },
9772
9975
  children: [
9773
- /* @__PURE__ */ jsx4(PencilIcon, { width: 16, height: 16 }),
9976
+ /* @__PURE__ */ jsx5(PencilIcon, { width: 16, height: 16 }),
9774
9977
  " Rename"
9775
9978
  ]
9776
9979
  }
9777
9980
  ) : null
9778
9981
  ] }) : null,
9779
9982
  controls.isOwner && participant.role === "cohost" ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => act({ action: "revoke_cohost", identity: participant.identity }), children: [
9780
- /* @__PURE__ */ jsx4(PeopleIcon, { width: 16, height: 16 }),
9983
+ /* @__PURE__ */ jsx5(PeopleIcon, { width: 16, height: 16 }),
9781
9984
  " Remove co-host"
9782
9985
  ] }) : null,
9783
9986
  controls.isOwner && !self && hasAccount && !participant.isAgent ? /* @__PURE__ */ jsxs3(MenuItem, { onSelect: () => setMode("transfer"), children: [
9784
- /* @__PURE__ */ jsx4(SpotlightIcon, { width: 16, height: 16 }),
9987
+ /* @__PURE__ */ jsx5(SpotlightIcon, { width: 16, height: 16 }),
9785
9988
  " Make host"
9786
9989
  ] }) : null,
9787
9990
  self ? /* @__PURE__ */ jsxs3(
@@ -9792,7 +9995,7 @@ function PersonMenu({
9792
9995
  setMode("rename");
9793
9996
  },
9794
9997
  children: [
9795
- /* @__PURE__ */ jsx4(PencilIcon, { width: 16, height: 16 }),
9998
+ /* @__PURE__ */ jsx5(PencilIcon, { width: 16, height: 16 }),
9796
9999
  " Rename yourself"
9797
10000
  ]
9798
10001
  }
@@ -9805,13 +10008,13 @@ function PersonMenu({
9805
10008
  setMode("report");
9806
10009
  },
9807
10010
  children: [
9808
- /* @__PURE__ */ jsx4(FlagIcon, { width: 16, height: 16 }),
10011
+ /* @__PURE__ */ jsx5(FlagIcon, { width: 16, height: 16 }),
9809
10012
  " Report"
9810
10013
  ]
9811
10014
  }
9812
10015
  ) : null,
9813
10016
  moderate && !participant.isAgent ? /* @__PURE__ */ jsxs3(MenuItem, { danger: true, onSelect: () => setMode("remove"), children: [
9814
- /* @__PURE__ */ jsx4(CloseIcon, { width: 16, height: 16 }),
10017
+ /* @__PURE__ */ jsx5(CloseIcon, { width: 16, height: 16 }),
9815
10018
  " Remove from meeting"
9816
10019
  ] }) : null
9817
10020
  ] }) });
@@ -9819,7 +10022,7 @@ function PersonMenu({
9819
10022
  function SettingsPanel({ onClose }) {
9820
10023
  const host = useRequiredMeetHost();
9821
10024
  return /* @__PURE__ */ jsxs3(PanelShell, { title: "Settings", onClose, children: [
9822
- /* @__PURE__ */ jsx4(
10025
+ /* @__PURE__ */ jsx5(
9823
10026
  DeviceSettings,
9824
10027
  {
9825
10028
  onPick: (kind, deviceId2) => {
@@ -9828,8 +10031,8 @@ function SettingsPanel({ onClose }) {
9828
10031
  }
9829
10032
  }
9830
10033
  ),
9831
- /* @__PURE__ */ jsx4(EffectsSettings, {}),
9832
- /* @__PURE__ */ jsx4(CaptionLanguageSettings, {})
10034
+ /* @__PURE__ */ jsx5(EffectsSettings, {}),
10035
+ /* @__PURE__ */ jsx5(CaptionLanguageSettings, {})
9833
10036
  ] });
9834
10037
  }
9835
10038
  function DeviceSettings({
@@ -9842,13 +10045,13 @@ function DeviceSettings({
9842
10045
  const stream = useMicrophoneStream(microphone);
9843
10046
  const level = useAudioLevel(stream);
9844
10047
  const [testing, setTesting] = useState4(false);
9845
- useEffect4(() => {
10048
+ useEffect6(() => {
9846
10049
  void host.devices.refresh();
9847
10050
  }, [host]);
9848
10051
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__section", "aria-label": "Devices", children: [
9849
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "audioinput", label: "Microphone", onPick }),
9850
- /* @__PURE__ */ jsx4("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__ */ jsx4("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }),
9851
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "audiooutput", label: "Speaker", onPick }),
10052
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "audioinput", label: "Microphone", onPick }),
10053
+ /* @__PURE__ */ jsx5("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__ */ jsx5("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }),
10054
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "audiooutput", label: "Speaker", onPick }),
9852
10055
  /* @__PURE__ */ jsxs3(
9853
10056
  "button",
9854
10057
  {
@@ -9860,19 +10063,19 @@ function DeviceSettings({
9860
10063
  void playTestSound(speaker).finally(() => setTesting(false));
9861
10064
  },
9862
10065
  children: [
9863
- /* @__PURE__ */ jsx4(SpeakerIcon, { width: 14, height: 14 }),
10066
+ /* @__PURE__ */ jsx5(SpeakerIcon, { width: 14, height: 14 }),
9864
10067
  " ",
9865
10068
  testing ? "Playing\u2026" : "Test speaker"
9866
10069
  ]
9867
10070
  }
9868
10071
  ),
9869
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "videoinput", label: "Camera", onPick })
10072
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "videoinput", label: "Camera", onPick })
9870
10073
  ] });
9871
10074
  }
9872
10075
  function EffectsSettings({ preview }) {
9873
10076
  const effects = useMediaEffects();
9874
10077
  const [error, setError] = useState4(null);
9875
- const fileRef = useRef4(null);
10078
+ const fileRef = useRef6(null);
9876
10079
  const supported = effects.backgroundsSupported || preview != null || videoEffectsSupported();
9877
10080
  const apply = (next) => {
9878
10081
  setError(null);
@@ -9886,7 +10089,7 @@ function EffectsSettings({ preview }) {
9886
10089
  };
9887
10090
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__section", "aria-label": "Effects", children: [
9888
10091
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__check", children: [
9889
- /* @__PURE__ */ jsx4(
10092
+ /* @__PURE__ */ jsx5(
9890
10093
  Checkbox,
9891
10094
  {
9892
10095
  id: "mx-meet-noise",
@@ -9895,13 +10098,13 @@ function EffectsSettings({ preview }) {
9895
10098
  }
9896
10099
  ),
9897
10100
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__check-text", children: [
9898
- /* @__PURE__ */ jsx4(Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
9899
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
10101
+ /* @__PURE__ */ jsx5(Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
10102
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
9900
10103
  ] })
9901
10104
  ] }),
9902
10105
  supported ? /* @__PURE__ */ jsxs3("div", { className: "mx-meet__field", children: [
9903
- /* @__PURE__ */ jsx4(Label, { children: "Background" }),
9904
- /* @__PURE__ */ jsx4(
10106
+ /* @__PURE__ */ jsx5(Label, { children: "Background" }),
10107
+ /* @__PURE__ */ jsx5(
9905
10108
  SegmentedControl,
9906
10109
  {
9907
10110
  fullWidth: true,
@@ -9920,7 +10123,7 @@ function EffectsSettings({ preview }) {
9920
10123
  ]
9921
10124
  }
9922
10125
  ),
9923
- /* @__PURE__ */ jsx4(
10126
+ /* @__PURE__ */ jsx5(
9924
10127
  "input",
9925
10128
  {
9926
10129
  ref: fileRef,
@@ -9935,7 +10138,7 @@ function EffectsSettings({ preview }) {
9935
10138
  }
9936
10139
  }
9937
10140
  ),
9938
- error !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__error", children: error }) : null
10141
+ error !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__error", children: error }) : null
9939
10142
  ] }) : null
9940
10143
  ] });
9941
10144
  }
@@ -9995,7 +10198,7 @@ async function playTestSound(sinkId) {
9995
10198
  }
9996
10199
  function useMicrophoneStream(deviceId2) {
9997
10200
  const [stream, setStream] = useState4(null);
9998
- useEffect4(() => {
10201
+ useEffect6(() => {
9999
10202
  if (deviceId2 === "off") return void 0;
10000
10203
  let live = true;
10001
10204
  let opened = null;
@@ -10022,26 +10225,35 @@ function LobbyPanel() {
10022
10225
  if (!lobby.canAdmit || lobby.waiting.length === 0) return null;
10023
10226
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__lobby", "aria-label": "Waiting room", children: [
10024
10227
  /* @__PURE__ */ jsxs3("header", { className: "mx-meet__lobby-head", children: [
10025
- /* @__PURE__ */ jsx4("h3", { className: "mx-meet__lobby-title", children: lobby.waiting.length === 1 ? "1 person is waiting" : `${lobby.waiting.length} people are waiting` }),
10026
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: () => void lobby.admitAll(), children: "Admit all" })
10228
+ /* @__PURE__ */ jsx5("h3", { className: "mx-meet__lobby-title", children: lobby.waiting.length === 1 ? "1 person is waiting" : `${lobby.waiting.length} people are waiting` }),
10229
+ /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__link", onClick: () => void lobby.admitAll(), children: "Admit all" })
10027
10230
  ] }),
10028
- /* @__PURE__ */ jsx4("ul", { className: "mx-meet__lobby-list", children: lobby.waiting.map((entry) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__lobby-row", children: [
10029
- /* @__PURE__ */ jsx4(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
10030
- /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
10031
- entry.displayName,
10032
- entry.userId === null ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Guest" }) : null
10033
- ] }),
10034
- /* @__PURE__ */ jsx4(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ jsx4(CheckIcon, { width: 16, height: 16 }) }),
10035
- /* @__PURE__ */ jsx4(
10036
- ControlButton,
10037
- {
10038
- label: `Deny ${entry.displayName}`,
10039
- danger: true,
10040
- onClick: () => void lobby.deny(entry),
10041
- children: /* @__PURE__ */ jsx4(CloseIcon, { width: 16, height: 16 })
10042
- }
10043
- )
10044
- ] }, entry.identity)) })
10231
+ /* @__PURE__ */ jsx5("ul", { className: "mx-meet__lobby-list", children: lobby.waiting.map((entry) => /* @__PURE__ */ jsxs3(
10232
+ "li",
10233
+ {
10234
+ className: "mx-meet__lobby-row",
10235
+ "data-meet-lobby-entry": "",
10236
+ "data-meet-participant-name": entry.displayName,
10237
+ children: [
10238
+ /* @__PURE__ */ jsx5(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
10239
+ /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
10240
+ entry.displayName,
10241
+ entry.userId === null ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Guest" }) : null
10242
+ ] }),
10243
+ /* @__PURE__ */ jsx5(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ jsx5(CheckIcon, { width: 16, height: 16 }) }),
10244
+ /* @__PURE__ */ jsx5(
10245
+ ControlButton,
10246
+ {
10247
+ label: `Deny ${entry.displayName}`,
10248
+ danger: true,
10249
+ onClick: () => void lobby.deny(entry),
10250
+ children: /* @__PURE__ */ jsx5(CloseIcon, { width: 16, height: 16 })
10251
+ }
10252
+ )
10253
+ ]
10254
+ },
10255
+ entry.identity
10256
+ )) })
10045
10257
  ] });
10046
10258
  }
10047
10259
  function NoteTakerRow() {
@@ -10050,19 +10262,19 @@ function NoteTakerRow() {
10050
10262
  const duplicateError = status.refusal !== null && ai.error !== null && status.refusal.reason === ai.error.message && status.refusal.remedy === ai.error.remedy;
10051
10263
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__note-taker", "aria-label": "Note-taker", children: [
10052
10264
  /* @__PURE__ */ jsxs3("p", { className: `mx-meet__note-taker-state mx-meet__note-taker-state--${status.state}`, children: [
10053
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__note-taker-dot", "aria-hidden": "true" }),
10265
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__note-taker-dot", "aria-hidden": "true" }),
10054
10266
  ai.noteTakerLabel
10055
10267
  ] }),
10056
- status.detail !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: status.detail }) : null,
10268
+ status.detail !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: status.detail }) : null,
10057
10269
  status.refusal !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: status.refusal, operation: "Join this meeting", origin: "meet/components", children: [
10058
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: status.refusal.reason }),
10059
- status.refusal.remedy.length > 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: status.refusal.remedy }) : null
10270
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: status.refusal.reason }),
10271
+ status.refusal.remedy.length > 0 ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-remedy", children: status.refusal.remedy }) : null
10060
10272
  ] }) : null,
10061
10273
  ai.error !== null && !duplicateError ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
10062
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
10063
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
10274
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
10275
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
10064
10276
  ] }) : null,
10065
- ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ jsx4(
10277
+ ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ jsx5(
10066
10278
  "button",
10067
10279
  {
10068
10280
  type: "button",
@@ -10070,7 +10282,7 @@ function NoteTakerRow() {
10070
10282
  onClick: () => void ai.stopNoteTaker(),
10071
10283
  children: "Dismiss the note-taker"
10072
10284
  }
10073
- ) : /* @__PURE__ */ jsx4(
10285
+ ) : /* @__PURE__ */ jsx5(
10074
10286
  "button",
10075
10287
  {
10076
10288
  type: "button",
@@ -10087,10 +10299,10 @@ function NoteList({
10087
10299
  empty
10088
10300
  }) {
10089
10301
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__note-group", "aria-label": title, children: [
10090
- /* @__PURE__ */ jsx4("h3", { className: "mx-meet__note-group-title", children: title }),
10091
- notes.length === 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: empty }) : /* @__PURE__ */ jsx4("ul", { className: "mx-meet__notes", children: notes.map((note) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__note", children: [
10302
+ /* @__PURE__ */ jsx5("h3", { className: "mx-meet__note-group-title", children: title }),
10303
+ notes.length === 0 ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: empty }) : /* @__PURE__ */ jsx5("ul", { className: "mx-meet__notes", children: notes.map((note) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__note", children: [
10092
10304
  note.text,
10093
- note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__assignee", children: note.assigneeDisplayName }) : null
10305
+ note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__assignee", children: note.assigneeDisplayName }) : null
10094
10306
  ] }, note.id)) })
10095
10307
  ] });
10096
10308
  }
@@ -10098,10 +10310,10 @@ function AiPanel({ onClose }) {
10098
10310
  const ai = useMeetAi();
10099
10311
  const [question, setQuestion] = useState4("");
10100
10312
  return /* @__PURE__ */ jsxs3(PanelShell, { title: "Meeting assistant", onClose, children: [
10101
- /* @__PURE__ */ jsx4(NoteTakerRow, {}),
10313
+ /* @__PURE__ */ jsx5(NoteTakerRow, {}),
10102
10314
  ai.summary !== null ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__note-group", "aria-label": "Summary", children: [
10103
- /* @__PURE__ */ jsx4("h3", { className: "mx-meet__note-group-title", children: "Summary" }),
10104
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__summary", children: ai.summary.text })
10315
+ /* @__PURE__ */ jsx5("h3", { className: "mx-meet__note-group-title", children: "Summary" }),
10316
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__summary", children: ai.summary.text })
10105
10317
  ] }) : null,
10106
10318
  ai.wrapUp !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__wrap-up-notice", role: "status", children: [
10107
10319
  "The wrap-up is written \u2014 ",
@@ -10115,7 +10327,7 @@ function AiPanel({ onClose }) {
10115
10327
  ai.wrapUp.segmentCount === 1 ? "transcript line" : "transcript lines",
10116
10328
  "."
10117
10329
  ] }) : null,
10118
- /* @__PURE__ */ jsx4(
10330
+ /* @__PURE__ */ jsx5(
10119
10331
  NoteList,
10120
10332
  {
10121
10333
  title: "Notes",
@@ -10123,7 +10335,7 @@ function AiPanel({ onClose }) {
10123
10335
  empty: "Notes appear here as the meeting goes on."
10124
10336
  }
10125
10337
  ),
10126
- /* @__PURE__ */ jsx4(
10338
+ /* @__PURE__ */ jsx5(
10127
10339
  NoteList,
10128
10340
  {
10129
10341
  title: "Decisions",
@@ -10131,7 +10343,7 @@ function AiPanel({ onClose }) {
10131
10343
  empty: "Nothing has been decided yet."
10132
10344
  }
10133
10345
  ),
10134
- /* @__PURE__ */ jsx4(
10346
+ /* @__PURE__ */ jsx5(
10135
10347
  NoteList,
10136
10348
  {
10137
10349
  title: "Action items",
@@ -10140,14 +10352,14 @@ function AiPanel({ onClose }) {
10140
10352
  }
10141
10353
  ),
10142
10354
  ai.transcript.length > 0 ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__note-group", "aria-label": "Transcript", children: [
10143
- /* @__PURE__ */ jsx4("h3", { className: "mx-meet__note-group-title", children: "Transcript" }),
10144
- /* @__PURE__ */ jsx4("ul", { className: "mx-meet__transcript", children: ai.transcript.map((line) => /* @__PURE__ */ jsxs3(
10355
+ /* @__PURE__ */ jsx5("h3", { className: "mx-meet__note-group-title", children: "Transcript" }),
10356
+ /* @__PURE__ */ jsx5("ul", { className: "mx-meet__transcript", children: ai.transcript.map((line) => /* @__PURE__ */ jsxs3(
10145
10357
  "li",
10146
10358
  {
10147
10359
  className: line.final && line.source === "record" ? "mx-meet__line" : "mx-meet__line mx-meet__line--interim",
10148
10360
  children: [
10149
- /* @__PURE__ */ jsx4("strong", { children: line.speaker }),
10150
- /* @__PURE__ */ jsx4("span", { children: line.text })
10361
+ /* @__PURE__ */ jsx5("strong", { children: line.speaker }),
10362
+ /* @__PURE__ */ jsx5("span", { children: line.text })
10151
10363
  ]
10152
10364
  },
10153
10365
  line.id
@@ -10164,7 +10376,7 @@ function AiPanel({ onClose }) {
10164
10376
  void ai.ask(asked);
10165
10377
  },
10166
10378
  children: [
10167
- /* @__PURE__ */ jsx4(
10379
+ /* @__PURE__ */ jsx5(
10168
10380
  "input",
10169
10381
  {
10170
10382
  className: "mx-meet__input",
@@ -10174,12 +10386,12 @@ function AiPanel({ onClose }) {
10174
10386
  "aria-label": "Ask about this meeting"
10175
10387
  }
10176
10388
  ),
10177
- /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__send", disabled: ai.asking, children: ai.asking ? "Asking\u2026" : "Ask" })
10389
+ /* @__PURE__ */ jsx5("button", { type: "submit", className: "mx-meet__send", disabled: ai.asking, children: ai.asking ? "Asking\u2026" : "Ask" })
10178
10390
  ]
10179
10391
  }
10180
10392
  ),
10181
- ai.asking && ai.phase !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", role: "status", children: ai.phase }) : null,
10182
- ai.answer !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__answer", children: ai.answer }) : null,
10393
+ ai.asking && ai.phase !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", role: "status", children: ai.phase }) : null,
10394
+ ai.answer !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__answer", children: ai.answer }) : null,
10183
10395
  ai.answer !== null && ai.coverage !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__coverage", children: [
10184
10396
  "Answered from ",
10185
10397
  ai.coverage.segmentsUsed,
@@ -10190,8 +10402,8 @@ function AiPanel({ onClose }) {
10190
10402
  "."
10191
10403
  ] }) : null,
10192
10404
  ai.error !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
10193
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
10194
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
10405
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
10406
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
10195
10407
  ] }) : null
10196
10408
  ] });
10197
10409
  }
@@ -10208,37 +10420,46 @@ function Captions({ lines = 3 }) {
10208
10420
  {
10209
10421
  className: line.final ? "mx-meet__caption" : "mx-meet__caption mx-meet__caption--interim",
10210
10422
  children: [
10211
- /* @__PURE__ */ jsx4("strong", { children: line.speaker }),
10423
+ /* @__PURE__ */ jsx5("strong", { children: line.speaker }),
10212
10424
  " ",
10213
10425
  translated ?? line.text,
10214
- translated !== void 0 ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__caption-original", children: line.text }) : null
10426
+ translated !== void 0 ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__caption-original", children: line.text }) : null
10215
10427
  ]
10216
10428
  },
10217
10429
  line.id
10218
10430
  );
10219
10431
  }),
10220
- translation.language !== null && translation.error !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__caption mx-meet__caption--interim", children: translation.error }) : null
10432
+ translation.language !== null && translation.error !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__caption mx-meet__caption--interim", children: translation.error }) : null
10221
10433
  ] });
10222
10434
  }
10223
10435
  function ConsentNotice() {
10224
10436
  const notice = useConsentNotice();
10225
10437
  if (notice === null) return null;
10226
- return /* @__PURE__ */ jsx4("p", { className: "mx-meet__consent", role: "status", children: notice });
10438
+ return /* @__PURE__ */ jsx5("p", { className: "mx-meet__consent", role: "status", children: notice });
10227
10439
  }
10228
10440
  function AttendanceNotice() {
10229
10441
  const media = useLocalMedia();
10230
10442
  const notice = listenOnlyNotice(media);
10231
10443
  if (notice === null) return null;
10232
10444
  const refused = media.microphone.unavailable;
10233
- return /* @__PURE__ */ jsxs3("p", { className: "mx-meet__banner mx-meet__banner--attendance", role: "status", children: [
10234
- notice,
10235
- refused === null ? null : /* @__PURE__ */ jsx4("span", { className: "mx-meet__remedy", children: refused.remedy })
10236
- ] });
10445
+ const code = microphoneNoticeCode(media.microphone);
10446
+ return /* @__PURE__ */ jsxs3(
10447
+ "p",
10448
+ {
10449
+ className: "mx-meet__banner mx-meet__banner--attendance",
10450
+ role: "status",
10451
+ ...code !== null ? { "data-meet-notice": code } : {},
10452
+ children: [
10453
+ notice,
10454
+ refused === null ? null : /* @__PURE__ */ jsx5("span", { className: "mx-meet__remedy", children: refused.remedy })
10455
+ ]
10456
+ }
10457
+ );
10237
10458
  }
10238
10459
  function PreJoin(props) {
10239
10460
  const host = useMeetHost();
10240
- if (host === null) return /* @__PURE__ */ jsx4(InertNotice, { what: "This meeting" });
10241
- return /* @__PURE__ */ jsx4(PreJoinBody, { ...props, host });
10461
+ if (host === null) return /* @__PURE__ */ jsx5(InertNotice, { what: "This meeting" });
10462
+ return /* @__PURE__ */ jsx5(PreJoinBody, { ...props, host });
10242
10463
  }
10243
10464
  function PreJoinBody({
10244
10465
  roomName,
@@ -10261,12 +10482,12 @@ function PreJoinBody({
10261
10482
  const micStream = useMicrophoneStream(microphone ? mic : "off");
10262
10483
  const level = useAudioLevel(micStream);
10263
10484
  const [speakerTesting, setSpeakerTesting] = useState4(false);
10264
- useEffect4(() => {
10485
+ useEffect6(() => {
10265
10486
  void host.devices.refresh();
10266
10487
  }, [host]);
10267
10488
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__prejoin", children: [
10268
10489
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__preview", children: [
10269
- mode === "video" && preview.preview !== null ? /* @__PURE__ */ jsx4(
10490
+ mode === "video" && preview.preview !== null ? /* @__PURE__ */ jsx5(
10270
10491
  "video",
10271
10492
  {
10272
10493
  className: "mx-meet__video mx-meet__video--mirror",
@@ -10277,16 +10498,16 @@ function PreJoinBody({
10277
10498
  if (element !== null) preview.preview?.attach(element);
10278
10499
  }
10279
10500
  }
10280
- ) : /* @__PURE__ */ jsx4("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ jsx4(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 96 }) }),
10281
- mode === "video" && preview.error !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__preview-note", children: preview.error }) : null,
10282
- microphone && micStream !== null ? /* @__PURE__ */ jsx4("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__ */ jsx4("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }) : null
10501
+ ) : /* @__PURE__ */ jsx5("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ jsx5(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 96 }) }),
10502
+ mode === "video" && preview.error !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__preview-note", children: preview.error }) : null,
10503
+ microphone && micStream !== null ? /* @__PURE__ */ jsx5("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__ */ jsx5("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }) : null
10283
10504
  ] }),
10284
10505
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__prejoin-panel", children: [
10285
- /* @__PURE__ */ jsx4("h1", { className: "mx-meet__prejoin-title", children: "Ready to join?" }),
10286
- notice?.kind === "removed" ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__warning", children: notice.text }) : null,
10506
+ /* @__PURE__ */ jsx5("h1", { className: "mx-meet__prejoin-title", children: "Ready to join?" }),
10507
+ notice?.kind === "removed" ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__warning", children: notice.text }) : null,
10287
10508
  devices?.labelsHidden === true ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__panel-note", children: [
10288
10509
  "Your browser is hiding device names until you allow camera and microphone access.",
10289
- /* @__PURE__ */ jsx4(
10510
+ /* @__PURE__ */ jsx5(
10290
10511
  "button",
10291
10512
  {
10292
10513
  type: "button",
@@ -10298,10 +10519,10 @@ function PreJoinBody({
10298
10519
  }
10299
10520
  )
10300
10521
  ] }) : null,
10301
- devices?.fallbackNotice != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__warning", children: devices.fallbackNotice }) : null,
10302
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "audioinput", label: "Microphone" }),
10522
+ devices?.fallbackNotice != null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__warning", children: devices.fallbackNotice }) : null,
10523
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "audioinput", label: "Microphone" }),
10303
10524
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__field-row", children: [
10304
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
10525
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
10305
10526
  /* @__PURE__ */ jsxs3(
10306
10527
  Button,
10307
10528
  {
@@ -10315,19 +10536,19 @@ function PreJoinBody({
10315
10536
  );
10316
10537
  },
10317
10538
  children: [
10318
- /* @__PURE__ */ jsx4(SpeakerIcon, {}),
10539
+ /* @__PURE__ */ jsx5(SpeakerIcon, {}),
10319
10540
  " ",
10320
10541
  speakerTesting ? "Playing\u2026" : "Test"
10321
10542
  ]
10322
10543
  }
10323
10544
  )
10324
10545
  ] }),
10325
- /* @__PURE__ */ jsx4(DevicePicker, { kind: "videoinput", label: "Camera" }),
10326
- /* @__PURE__ */ jsx4(EffectsSettings, { preview: preview.preview }),
10327
- recording.consentNotice !== null ? /* @__PURE__ */ jsx4(Alert, { variant: "info", children: /* @__PURE__ */ jsx4(AlertDescription, { children: recording.consentNotice }) }) : null,
10546
+ /* @__PURE__ */ jsx5(DevicePicker, { kind: "videoinput", label: "Camera" }),
10547
+ /* @__PURE__ */ jsx5(EffectsSettings, { preview: preview.preview }),
10548
+ recording.consentNotice !== null ? /* @__PURE__ */ jsx5(Alert, { variant: "info", children: /* @__PURE__ */ jsx5(AlertDescription, { children: recording.consentNotice }) }) : null,
10328
10549
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__prejoin-actions", children: [
10329
10550
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__check", children: [
10330
- /* @__PURE__ */ jsx4(
10551
+ /* @__PURE__ */ jsx5(
10331
10552
  Checkbox,
10332
10553
  {
10333
10554
  id: "mx-meet-join-video",
@@ -10335,10 +10556,10 @@ function PreJoinBody({
10335
10556
  onCheckedChange: (checked) => setMode(checked === true ? "video" : "audio")
10336
10557
  }
10337
10558
  ),
10338
- /* @__PURE__ */ jsx4(Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
10559
+ /* @__PURE__ */ jsx5(Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
10339
10560
  ] }),
10340
10561
  /* @__PURE__ */ jsxs3("div", { className: "mx-meet__check", children: [
10341
- /* @__PURE__ */ jsx4(
10562
+ /* @__PURE__ */ jsx5(
10342
10563
  Checkbox,
10343
10564
  {
10344
10565
  id: "mx-meet-join-mic",
@@ -10346,9 +10567,9 @@ function PreJoinBody({
10346
10567
  onCheckedChange: (checked) => setMicrophone(checked === true)
10347
10568
  }
10348
10569
  ),
10349
- /* @__PURE__ */ jsx4(Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
10570
+ /* @__PURE__ */ jsx5(Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
10350
10571
  ] }),
10351
- /* @__PURE__ */ jsx4(
10572
+ /* @__PURE__ */ jsx5(
10352
10573
  Button,
10353
10574
  {
10354
10575
  type: "button",
@@ -10371,7 +10592,7 @@ function PreJoinBody({
10371
10592
  ] }),
10372
10593
  room.failure !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__error", children: [
10373
10594
  room.failure.message,
10374
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__remedy", children: room.failure.remedy })
10595
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__remedy", children: room.failure.remedy })
10375
10596
  ] }) : null
10376
10597
  ] })
10377
10598
  ] });
@@ -10379,10 +10600,10 @@ function PreJoinBody({
10379
10600
  function useCameraPreview(deviceId2, effects) {
10380
10601
  const [preview, setPreview] = useState4(null);
10381
10602
  const [error, setError] = useState4(null);
10382
- const current = useRef4(null);
10383
- const initialEffect = useRef4(toVideoEffect(effects));
10603
+ const current = useRef6(null);
10604
+ const initialEffect = useRef6(toVideoEffect(effects));
10384
10605
  initialEffect.current = toVideoEffect(effects);
10385
- useEffect4(() => {
10606
+ useEffect6(() => {
10386
10607
  if (deviceId2 === void 0) return void 0;
10387
10608
  let live = true;
10388
10609
  setError(null);
@@ -10430,7 +10651,7 @@ function DevicePicker({
10430
10651
  const valueOf = (deviceId2) => deviceId2.length > 0 ? deviceId2 : "default";
10431
10652
  const current = devices?.selected[kind] ?? host.devices.resolve(kind) ?? "";
10432
10653
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__field", children: [
10433
- /* @__PURE__ */ jsx4(Label, { htmlFor: triggerId, children: label }),
10654
+ /* @__PURE__ */ jsx5(Label, { htmlFor: triggerId, children: label }),
10434
10655
  /* @__PURE__ */ jsxs3(
10435
10656
  Select,
10436
10657
  {
@@ -10441,52 +10662,26 @@ function DevicePicker({
10441
10662
  else host.devices.select(kind, deviceId2);
10442
10663
  },
10443
10664
  children: [
10444
- /* @__PURE__ */ jsx4(SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ jsx4(SelectValue, { placeholder: label }) }),
10445
- /* @__PURE__ */ jsx4(SelectContent, { children: list.map((device) => /* @__PURE__ */ jsx4(SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
10665
+ /* @__PURE__ */ jsx5(SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ jsx5(SelectValue, { placeholder: label }) }),
10666
+ /* @__PURE__ */ jsx5(SelectContent, { children: list.map((device) => /* @__PURE__ */ jsx5(SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
10446
10667
  ]
10447
10668
  }
10448
10669
  )
10449
10670
  ] });
10450
10671
  }
10451
- function MeetingRoom(props) {
10452
- const host = useMeetHost();
10453
- if (host === null) {
10454
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet", children: /* @__PURE__ */ jsx4(InertNotice, { what: "This meeting" }) });
10455
- }
10456
- return /* @__PURE__ */ jsx4(MeetingRoomBody, { ...props, host });
10457
- }
10458
- function MeetingRoomBody({
10672
+ function MeetSkinRoom({
10459
10673
  roomName,
10460
10674
  meetingId,
10461
10675
  slug,
10462
- meeting: given,
10463
10676
  onLeave,
10464
- headerControls,
10465
- host
10677
+ headerControls
10466
10678
  }) {
10467
- const snapshot = useMeetSnapshot();
10468
- const isHost = useIsHost();
10679
+ const { host, snapshot, isHost } = useMeetCore();
10469
10680
  const elapsed = useElapsed(snapshot?.meeting?.startedAt ?? null);
10470
10681
  const phase = snapshot?.phase ?? "idle";
10471
- useEffect4(() => {
10472
- host.meetings.watch(roomName);
10473
- }, [host, roomName]);
10474
- useEffect4(() => {
10475
- if (given === void 0) return;
10476
- if (host.store.snapshot().meeting !== null) return;
10477
- host.store.patch({ meeting: given, locked: given.locked });
10478
- }, [host, given]);
10479
- const watchedId = meetingId ?? snapshot?.meeting?.id ?? null;
10480
- useEffect4(() => {
10481
- if (watchedId === null) return;
10482
- host.meetings.watchMeeting(asMeetingId(watchedId));
10483
- }, [host, watchedId]);
10484
- const record = snapshot?.meeting ?? given ?? null;
10485
- if (hasEnded(record) && phase !== "connected" && phase !== "reconnecting") {
10486
- return /* @__PURE__ */ jsx4(MeetingRecordView, { meeting: record });
10487
- }
10682
+ if (host === null) return null;
10488
10683
  if (phase === "idle" || phase === "failed" || phase === "left") {
10489
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet", children: /* @__PURE__ */ jsx4(
10684
+ return /* @__PURE__ */ jsx5("div", { className: "mx-meet", children: /* @__PURE__ */ jsx5(
10490
10685
  PreJoin,
10491
10686
  {
10492
10687
  roomName,
@@ -10496,41 +10691,41 @@ function MeetingRoomBody({
10496
10691
  ) });
10497
10692
  }
10498
10693
  if (phase === "lobby") {
10499
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet mx-meet--lobby", children: /* @__PURE__ */ jsx4(WaitingRoom, { roomName, host }) });
10694
+ return /* @__PURE__ */ jsx5("div", { className: "mx-meet mx-meet--lobby", children: /* @__PURE__ */ jsx5(WaitingRoom, { roomName, host }) });
10500
10695
  }
10501
10696
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet", children: [
10502
- /* @__PURE__ */ jsx4(ConsentNotice, {}),
10503
- /* @__PURE__ */ jsx4(AttendanceNotice, {}),
10697
+ /* @__PURE__ */ jsx5(ConsentNotice, {}),
10698
+ /* @__PURE__ */ jsx5(AttendanceNotice, {}),
10504
10699
  /* @__PURE__ */ jsxs3("header", { className: "mx-meet__header", children: [
10505
- /* @__PURE__ */ jsx4("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
10700
+ /* @__PURE__ */ jsx5("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
10506
10701
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__meta", children: [
10507
10702
  participantSummary(snapshot?.participants ?? []),
10508
- elapsed > 0 ? ` \xB7 ${formatDurationMs4(elapsed)}` : ""
10703
+ elapsed > 0 ? ` \xB7 ${formatDurationMs3(elapsed)}` : ""
10509
10704
  ] }),
10510
- /* @__PURE__ */ jsx4(RecordingIndicator, {}),
10705
+ /* @__PURE__ */ jsx5(RecordingIndicator, {}),
10511
10706
  snapshot?.locked === true ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__badge", children: [
10512
- /* @__PURE__ */ jsx4(LockIcon, { width: 12, height: 12 }),
10707
+ /* @__PURE__ */ jsx5(LockIcon, { width: 12, height: 12 }),
10513
10708
  " Locked"
10514
10709
  ] }) : null,
10515
- headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__header-controls", "data-meet-header-controls": "", children: headerControls }) : null,
10516
- isHost ? /* @__PURE__ */ jsx4(HostMenu, {}) : null
10710
+ headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__header-controls", "data-meet-header-controls": "", children: headerControls }) : null,
10711
+ isHost ? /* @__PURE__ */ jsx5(HostMenu, {}) : null
10517
10712
  ] }),
10518
- phase === "reconnecting" ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__banner", role: "status", children: "Reconnecting\u2026" }) : null,
10519
- /* @__PURE__ */ jsx4(Stage, {}),
10520
- /* @__PURE__ */ jsx4(Captions, {}),
10521
- /* @__PURE__ */ jsx4(ControlBar, { ...onLeave !== void 0 ? { onLeave } : {} })
10713
+ phase === "reconnecting" ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__banner", role: "status", children: "Reconnecting\u2026" }) : null,
10714
+ /* @__PURE__ */ jsx5(Stage, {}),
10715
+ /* @__PURE__ */ jsx5(Captions, {}),
10716
+ /* @__PURE__ */ jsx5(ControlBar, { ...onLeave !== void 0 ? { onLeave } : {} })
10522
10717
  ] });
10523
10718
  }
10524
10719
  function WaitingRoom({ roomName, host }) {
10525
- const knocked = useRef4(false);
10526
- useEffect4(() => {
10720
+ const knocked = useRef6(false);
10721
+ useEffect6(() => {
10527
10722
  if (knocked.current) return;
10528
10723
  knocked.current = true;
10529
10724
  host.meetings.knock(roomName);
10530
10725
  }, [host, roomName]);
10531
10726
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__waiting", children: [
10532
- /* @__PURE__ */ jsx4(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 72 }),
10533
- /* @__PURE__ */ jsx4("h1", { className: "mx-meet__prejoin-title", children: "Waiting for the host to let you in" }),
10727
+ /* @__PURE__ */ jsx5(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 72 }),
10728
+ /* @__PURE__ */ jsx5("h1", { className: "mx-meet__prejoin-title", children: "Waiting for the host to let you in" }),
10534
10729
  /* @__PURE__ */ jsxs3("p", { className: "mx-meet__empty-body", children: [
10535
10730
  "You are in the waiting room as ",
10536
10731
  host.identity.displayName,
@@ -10545,7 +10740,7 @@ function HostMenu() {
10545
10740
  const [confirmingEnd, setConfirmingEnd] = useState4(false);
10546
10741
  const locked = snapshot?.locked === true;
10547
10742
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__host-menu", children: [
10548
- /* @__PURE__ */ jsx4(
10743
+ /* @__PURE__ */ jsx5(
10549
10744
  "button",
10550
10745
  {
10551
10746
  type: "button",
@@ -10557,8 +10752,8 @@ function HostMenu() {
10557
10752
  }
10558
10753
  ),
10559
10754
  end.canEnd ? confirmingEnd ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__confirm", role: "group", "aria-label": "End this meeting?", children: [
10560
- /* @__PURE__ */ jsx4("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." }),
10561
- /* @__PURE__ */ jsx4(
10755
+ /* @__PURE__ */ jsx5("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." }),
10756
+ /* @__PURE__ */ jsx5(
10562
10757
  "button",
10563
10758
  {
10564
10759
  type: "button",
@@ -10570,7 +10765,7 @@ function HostMenu() {
10570
10765
  children: "End it"
10571
10766
  }
10572
10767
  ),
10573
- /* @__PURE__ */ jsx4(
10768
+ /* @__PURE__ */ jsx5(
10574
10769
  "button",
10575
10770
  {
10576
10771
  type: "button",
@@ -10579,7 +10774,7 @@ function HostMenu() {
10579
10774
  children: "Keep it running"
10580
10775
  }
10581
10776
  )
10582
- ] }) : /* @__PURE__ */ jsx4(
10777
+ ] }) : /* @__PURE__ */ jsx5(
10583
10778
  "button",
10584
10779
  {
10585
10780
  type: "button",
@@ -10588,152 +10783,19 @@ function HostMenu() {
10588
10783
  children: end.ending ? "Ending\u2026" : "End meeting for everyone"
10589
10784
  }
10590
10785
  ) : null,
10591
- end.notice !== null ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
10786
+ end.notice !== null ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
10592
10787
  ] });
10593
10788
  }
10594
- function CallButton({
10595
- person,
10596
- mode = "video",
10597
- children
10598
- }) {
10599
- const calls = useCalls();
10600
- if (!calls.canCall) return null;
10601
- return /* @__PURE__ */ jsx4(
10602
- "button",
10603
- {
10604
- type: "button",
10605
- className: "mx-meet__call-button",
10606
- onClick: () => {
10607
- void calls.call([person.userId], mode);
10608
- },
10609
- "aria-label": `Call ${person.displayName}`,
10610
- children: children ?? /* @__PURE__ */ jsx4(PhoneIcon, { width: 18, height: 18 })
10611
- }
10612
- );
10613
- }
10614
- function IncomingCallHost() {
10615
- const calls = useCalls();
10616
- if (calls.incoming.length === 0) return null;
10617
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet__ringing-stack", children: calls.incoming.map((invite) => /* @__PURE__ */ jsx4(IncomingCallCard, { invite }, invite.id)) });
10618
- }
10619
- function IncomingCallCard({ invite }) {
10620
- const calls = useCalls();
10621
- return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__ringing", role: "alertdialog", "aria-label": "Incoming call", children: [
10622
- /* @__PURE__ */ jsx4(Avatar, { name: invite.callerName, url: invite.callerAvatarUrl, size: 56 }),
10623
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__ringing-text", children: [
10624
- /* @__PURE__ */ jsx4("strong", { children: invite.callerName }),
10625
- /* @__PURE__ */ jsx4("span", { children: invite.mode === "video" ? "Incoming video call" : "Incoming call" })
10626
- ] }),
10627
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__ringing-actions", children: [
10628
- /* @__PURE__ */ jsx4(ControlButton, { label: "Decline", danger: true, onClick: () => void calls.decline(invite), children: /* @__PURE__ */ jsx4(PhoneOffIcon, {}) }),
10629
- invite.mode === "video" ? /* @__PURE__ */ jsx4(
10630
- ControlButton,
10631
- {
10632
- label: "Accept without video",
10633
- onClick: () => void calls.accept({ ...invite, mode: "audio" }),
10634
- children: /* @__PURE__ */ jsx4(CameraOffIcon, {})
10635
- }
10636
- ) : null,
10637
- /* @__PURE__ */ jsx4(ControlButton, { label: "Accept", onClick: () => void calls.accept(invite), children: /* @__PURE__ */ jsx4(PhoneIcon, {}) })
10638
- ] })
10639
- ] });
10640
- }
10641
- function ScheduleMeeting(props) {
10642
- const host = useMeetHost();
10643
- if (host === null) return /* @__PURE__ */ jsx4(InertNotice, { what: "Scheduling a meeting" });
10644
- return /* @__PURE__ */ jsx4(ScheduleMeetingBody, { ...props, host });
10645
- }
10646
- function ScheduleMeetingBody({
10647
- appBaseUrl,
10648
- onScheduled,
10649
- host
10650
- }) {
10651
- const [title, setTitle] = useState4("");
10652
- const [when2, setWhen] = useState4("");
10653
- const [kind, setKind] = useState4("scheduled");
10654
- const [busy, setBusy] = useState4(false);
10655
- const [link, setLink] = useState4(null);
10656
- const [error, setError] = useState4(null);
10657
- const disabled = useMemo3(() => title.trim().length === 0 || busy, [title, busy]);
10658
- return /* @__PURE__ */ jsxs3(
10659
- "form",
10660
- {
10661
- className: "mx-meet__schedule",
10662
- onSubmit: (event) => {
10663
- event.preventDefault();
10664
- if (host.identity.userId === null) return;
10665
- setBusy(true);
10666
- setError(null);
10667
- void host.repository.getOrCreateMeeting({
10668
- organizationId: host.identity.organizationId,
10669
- hostUserId: host.identity.userId,
10670
- title: title.trim(),
10671
- kind,
10672
- scheduledFor: when2.length > 0 ? new Date(when2).toISOString() : null
10673
- }).then((meeting) => {
10674
- setLink(meetingLink(appBaseUrl, meeting.slug));
10675
- onScheduled?.(meeting.slug);
10676
- }).catch((thrown) => {
10677
- setError(
10678
- thrown.remedy ?? thrown.message ?? "The meeting could not be created."
10679
- );
10680
- }).finally(() => setBusy(false));
10681
- },
10682
- children: [
10683
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10684
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Title" }),
10685
- /* @__PURE__ */ jsx4(
10686
- "input",
10687
- {
10688
- className: "mx-meet__input",
10689
- value: title,
10690
- onChange: (event) => setTitle(event.target.value),
10691
- placeholder: "Weekly sync"
10692
- }
10693
- )
10694
- ] }),
10695
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10696
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "When" }),
10697
- /* @__PURE__ */ jsx4(
10698
- "input",
10699
- {
10700
- className: "mx-meet__input",
10701
- type: "datetime-local",
10702
- value: when2,
10703
- onChange: (event) => setWhen(event.target.value)
10704
- }
10705
- )
10706
- ] }),
10707
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10708
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "Repeats" }),
10709
- /* @__PURE__ */ jsxs3(
10710
- "select",
10711
- {
10712
- className: "mx-meet__select",
10713
- value: kind,
10714
- onChange: (event) => setKind(event.target.value),
10715
- children: [
10716
- /* @__PURE__ */ jsx4("option", { value: "scheduled", children: "Once" }),
10717
- /* @__PURE__ */ jsx4("option", { value: "recurring", children: "Recurring \u2014 one link, every time" })
10718
- ]
10719
- }
10720
- )
10721
- ] }),
10722
- /* @__PURE__ */ jsx4("button", { type: "submit", className: "mx-meet__primary", disabled, children: busy ? "Creating\u2026" : "Create meeting" }),
10723
- link !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__link-out", children: [
10724
- /* @__PURE__ */ jsx4("span", { children: "Anyone with this link can join \u2014 no account needed." }),
10725
- /* @__PURE__ */ jsx4("code", { children: link })
10726
- ] }) : null,
10727
- error !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__error", children: error }) : null
10728
- ]
10729
- }
10730
- );
10731
- }
10732
10789
  function ReactionOverlay({
10733
10790
  reactions
10734
10791
  }) {
10735
10792
  if (reactions.length === 0) return null;
10736
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet__reactions", "aria-hidden": "true", children: reactions.map((reaction) => /* @__PURE__ */ jsx4("span", { className: "mx-meet__reaction", children: reaction.emoji }, reaction.id)) });
10793
+ return /* @__PURE__ */ jsx5("div", { className: "mx-meet__reactions", "aria-hidden": "true", children: reactions.map((reaction) => /* @__PURE__ */ jsx5("span", { className: "mx-meet__reaction", children: reaction.emoji }, reaction.id)) });
10794
+ }
10795
+ function clockOf(iso) {
10796
+ const at = new Date(iso);
10797
+ if (Number.isNaN(at.getTime())) return "";
10798
+ return at.toLocaleTimeString(void 0, { hour: "numeric", minute: "2-digit" });
10737
10799
  }
10738
10800
  function GuestRecordAccessControl({
10739
10801
  meeting
@@ -10746,10 +10808,10 @@ function GuestRecordAccessControl({
10746
10808
  if (host === null || !isHost) return null;
10747
10809
  const resolved = access.setting === "default" && access.effective !== null ? ` Right now that means: ${guestRecordAccessLabel(access.effective.level).toLowerCase()}.` : "";
10748
10810
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "What guests may read", children: [
10749
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "What guests may read" }),
10811
+ /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "What guests may read" }),
10750
10812
  /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10751
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__field-label", children: "People who attended by link, without an account" }),
10752
- /* @__PURE__ */ jsx4(
10813
+ /* @__PURE__ */ jsx5("span", { className: "mx-meet__field-label", children: "People who attended by link, without an account" }),
10814
+ /* @__PURE__ */ jsx5(
10753
10815
  "select",
10754
10816
  {
10755
10817
  className: "mx-meet__select",
@@ -10760,7 +10822,7 @@ function GuestRecordAccessControl({
10760
10822
  event.target.value
10761
10823
  );
10762
10824
  },
10763
- children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ jsx4("option", { value: choice, children: guestRecordAccessLabel(choice) }, choice))
10825
+ children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ jsx5("option", { value: choice, children: guestRecordAccessLabel(choice) }, choice))
10764
10826
  }
10765
10827
  )
10766
10828
  ] }),
@@ -10768,22 +10830,27 @@ function GuestRecordAccessControl({
10768
10830
  guestRecordAccessExplanation(access.setting),
10769
10831
  resolved
10770
10832
  ] }),
10771
- access.saving ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", role: "status", children: "Saving what guests may read\u2026" }) : null,
10833
+ access.saving ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", role: "status", children: "Saving what guests may read\u2026" }) : null,
10772
10834
  access.error !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: access.error, operation: "Change who can join", origin: "meet/components", children: [
10773
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: access.error.message }),
10774
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: access.error.remedy })
10835
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: access.error.message }),
10836
+ /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-remedy", children: access.error.remedy })
10775
10837
  ] }) : null
10776
10838
  ] });
10777
10839
  }
10840
+
10841
+ // src/react/record.tsx
10842
+ import { useEffect as useEffect7, useState as useState5 } from "react";
10843
+ import { ErrorBox as ErrorBox2 } from "@ai-matrx/design-system";
10844
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
10778
10845
  function MeetingRecordView({
10779
10846
  meeting,
10780
10847
  onRejoin
10781
10848
  }) {
10782
10849
  const host = useMeetHost();
10783
10850
  if (host === null) {
10784
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsx4(InertNotice, { what: "This meeting record" }) });
10851
+ return /* @__PURE__ */ jsx6("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsx6(InertNotice, { what: "This meeting record" }) });
10785
10852
  }
10786
- return /* @__PURE__ */ jsx4(MeetingRecordBody, { meeting, ...onRejoin !== void 0 ? { onRejoin } : {} });
10853
+ return /* @__PURE__ */ jsx6(MeetingRecordBody, { meeting, ...onRejoin !== void 0 ? { onRejoin } : {} });
10787
10854
  }
10788
10855
  function MeetingRecordBody({
10789
10856
  meeting,
@@ -10791,19 +10858,19 @@ function MeetingRecordBody({
10791
10858
  }) {
10792
10859
  const host = useRequiredMeetHost();
10793
10860
  const record = useMeetingRecord(meeting);
10794
- const [question, setQuestion] = useState4("");
10795
- const [tab, setTab] = useState4("summary");
10861
+ const [question, setQuestion] = useState5("");
10862
+ const [tab, setTab] = useState5("summary");
10796
10863
  if (record.failure !== null) {
10797
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__empty", error: record.failure, operation: "Open this meeting record", origin: "meet/components", children: [
10798
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "This meeting record could not be opened" }),
10799
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: record.failure.message }),
10800
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: record.failure.remedy })
10864
+ return /* @__PURE__ */ jsx6("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsxs4(ErrorBox2, { as: "div", className: "mx-meet__empty", error: record.failure, operation: "Open this meeting record", origin: "meet/components", children: [
10865
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__empty-title", children: "This meeting record could not be opened" }),
10866
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__empty-body", children: record.failure.message }),
10867
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__empty-body", children: record.failure.remedy })
10801
10868
  ] }) });
10802
10869
  }
10803
10870
  if (record.loading || record.record === null) {
10804
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
10805
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "Opening the meeting record\u2026" }),
10806
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: "Reading the summary, the notes and the transcript this meeting left behind." })
10871
+ return /* @__PURE__ */ jsx6("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsxs4("div", { className: "mx-meet__empty", role: "status", children: [
10872
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__empty-title", children: "Opening the meeting record\u2026" }),
10873
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__empty-body", children: "Reading the summary, the notes and the transcript this meeting left behind." })
10807
10874
  ] }) });
10808
10875
  }
10809
10876
  const bundle = record.record;
@@ -10822,44 +10889,44 @@ function MeetingRecordBody({
10822
10889
  );
10823
10890
  const entirelyRestricted = everyRecordPartRefused && bundle.attendees.length === 0 && bundle.liveNotes.length === 0 && bundle.transcript.length === 0 && bundle.recording === null && bundle.summary === null && bundle.decisions.length === 0 && bundle.actionItems.length === 0;
10824
10891
  if (entirelyRestricted) {
10825
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet mx-meet--record", children: [
10826
- /* @__PURE__ */ jsx4("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-head-inner", children: [
10827
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
10828
- /* @__PURE__ */ jsx4("h1", { className: "mx-meet__record-title", children: meeting.title }),
10829
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
10830
- onRejoin !== void 0 ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: onRejoin, children: "Open this link again" }) : null
10892
+ return /* @__PURE__ */ jsxs4("div", { className: "mx-meet mx-meet--record", children: [
10893
+ /* @__PURE__ */ jsx6("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-head-inner", children: [
10894
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
10895
+ /* @__PURE__ */ jsx6("h1", { className: "mx-meet__record-title", children: meeting.title }),
10896
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
10897
+ onRejoin !== void 0 ? /* @__PURE__ */ jsx6("button", { type: "button", className: "mx-meet__link", onClick: onRejoin, children: "Open this link again" }) : null
10831
10898
  ] }) }),
10832
- /* @__PURE__ */ jsx4("div", { className: "mx-meet__record-body", children: restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-access", role: "status", children: [
10833
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-title", children: "About this record" }),
10834
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-message", children: notice2.message }),
10835
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-remedy", children: notice2.remedy })
10899
+ /* @__PURE__ */ jsx6("div", { className: "mx-meet__record-body", children: restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-access", role: "status", children: [
10900
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-title", children: "About this record" }),
10901
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-message", children: notice2.message }),
10902
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-remedy", children: notice2.remedy })
10836
10903
  ] }, notice2.parts.join("-"))) })
10837
10904
  ] });
10838
10905
  }
10839
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet mx-meet--record", children: [
10840
- /* @__PURE__ */ jsx4("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-head-inner", children: [
10841
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
10842
- /* @__PURE__ */ jsx4("h1", { className: "mx-meet__record-title", children: meeting.title }),
10843
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
10844
- onRejoin !== void 0 ? /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: onRejoin, children: "Open this link again" }) : null
10906
+ return /* @__PURE__ */ jsxs4("div", { className: "mx-meet mx-meet--record", children: [
10907
+ /* @__PURE__ */ jsx6("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-head-inner", children: [
10908
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
10909
+ /* @__PURE__ */ jsx6("h1", { className: "mx-meet__record-title", children: meeting.title }),
10910
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
10911
+ onRejoin !== void 0 ? /* @__PURE__ */ jsx6("button", { type: "button", className: "mx-meet__link", onClick: onRejoin, children: "Open this link again" }) : null
10845
10912
  ] }) }),
10846
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-body", children: [
10847
- restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-access", role: "status", children: [
10848
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-title", children: "About this record" }),
10849
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-message", children: notice2.message }),
10850
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-access-remedy", children: notice2.remedy })
10913
+ /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-body", children: [
10914
+ restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-access", role: "status", children: [
10915
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-title", children: "About this record" }),
10916
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-message", children: notice2.message }),
10917
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-access-remedy", children: notice2.remedy })
10851
10918
  ] }, notice2.parts.join("-"))),
10852
10919
  attended.length === 0 ? (
10853
10920
  /* NOT SILENCE. A refused attendance read used to remove the whole
10854
10921
  section, so the reader could not tell "nobody" from "not shown". */
10855
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
10856
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
10857
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: absenceSentence(bundle, "attendance", "Nobody is recorded as having attended.") })
10922
+ /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
10923
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
10924
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: absenceSentence(bundle, "attendance", "Nobody is recorded as having attended.") })
10858
10925
  ] })
10859
- ) : /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
10860
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
10861
- /* @__PURE__ */ jsx4("ul", { className: "mx-meet__record-attendees", children: attended.map((person) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__record-attendee", children: [
10862
- /* @__PURE__ */ jsx4(
10926
+ ) : /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
10927
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
10928
+ /* @__PURE__ */ jsx6("ul", { className: "mx-meet__record-attendees", children: attended.map((person) => /* @__PURE__ */ jsxs4("li", { className: "mx-meet__record-attendee", children: [
10929
+ /* @__PURE__ */ jsx6(
10863
10930
  Avatar,
10864
10931
  {
10865
10932
  name: displayNameFor(bundle.names, person.identity, person.displayName),
@@ -10867,26 +10934,26 @@ function MeetingRecordBody({
10867
10934
  size: 28
10868
10935
  }
10869
10936
  ),
10870
- /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
10937
+ /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
10871
10938
  displayNameFor(bundle.names, person.identity, person.displayName),
10872
- person.role === "host" ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Host" }) : null,
10873
- person.role === "guest" ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Guest" }) : null,
10874
- person.isAgent ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null
10939
+ person.role === "host" ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Host" }) : null,
10940
+ person.role === "guest" ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
10941
+ person.isAgent ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null
10875
10942
  ] })
10876
10943
  ] }, person.id)) })
10877
10944
  ] }),
10878
- bundle.recording !== null ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section mx-meet__recording-card", "aria-label": "Recording", children: [
10879
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
10880
- fileId !== null ? /* @__PURE__ */ jsxs3(Fragment, { children: [
10881
- /* @__PURE__ */ jsx4(RecordingPlayer, { fileId }),
10882
- notice !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: notice }) : null
10883
- ] }) : /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: notice ?? "This recording has no file." })
10884
- ] }) : wasRefused(bundle, "recording") ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Recording", children: [
10885
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
10886
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: REFUSED_ABSENCE })
10945
+ bundle.recording !== null ? /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section mx-meet__recording-card", "aria-label": "Recording", children: [
10946
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
10947
+ fileId !== null ? /* @__PURE__ */ jsxs4(Fragment2, { children: [
10948
+ /* @__PURE__ */ jsx6(RecordingPlayer, { fileId }),
10949
+ notice !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: notice }) : null
10950
+ ] }) : /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: notice ?? "This recording has no file." })
10951
+ ] }) : wasRefused(bundle, "recording") ? /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Recording", children: [
10952
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
10953
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: REFUSED_ABSENCE })
10887
10954
  ] }) : null,
10888
- /* @__PURE__ */ jsxs3("nav", { className: "mx-meet__record-tabs", "aria-label": "Meeting record sections", children: [
10889
- /* @__PURE__ */ jsx4(
10955
+ /* @__PURE__ */ jsxs4("nav", { className: "mx-meet__record-tabs", "aria-label": "Meeting record sections", children: [
10956
+ /* @__PURE__ */ jsx6(
10890
10957
  "button",
10891
10958
  {
10892
10959
  type: "button",
@@ -10896,7 +10963,7 @@ function MeetingRecordBody({
10896
10963
  children: "Summary & decisions"
10897
10964
  }
10898
10965
  ),
10899
- /* @__PURE__ */ jsx4(
10966
+ /* @__PURE__ */ jsx6(
10900
10967
  "button",
10901
10968
  {
10902
10969
  type: "button",
@@ -10906,7 +10973,7 @@ function MeetingRecordBody({
10906
10973
  children: "Notes as it happened"
10907
10974
  }
10908
10975
  ),
10909
- /* @__PURE__ */ jsx4(
10976
+ /* @__PURE__ */ jsx6(
10910
10977
  "button",
10911
10978
  {
10912
10979
  type: "button",
@@ -10917,15 +10984,15 @@ function MeetingRecordBody({
10917
10984
  }
10918
10985
  )
10919
10986
  ] }),
10920
- tab === "summary" ? /* @__PURE__ */ jsxs3(Fragment, { children: [
10921
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Summary", children: [
10922
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Summary" }),
10923
- wrapUp.state === "written" ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-summary", children: bundle.summary?.text }) : wrapUp.state === "in-progress" ? /* @__PURE__ */ jsxs3("div", { className: "mx-meet__panel-note", role: "status", children: [
10924
- /* @__PURE__ */ jsx4("p", { children: wrapUp.message }),
10925
- /* @__PURE__ */ jsx4("button", { type: "button", className: "mx-meet__link", onClick: record.reload, children: "Check again" })
10926
- ] }) : /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", role: wrapUp.state === "failed" ? "alert" : void 0, children: wrapUp.message })
10987
+ tab === "summary" ? /* @__PURE__ */ jsxs4(Fragment2, { children: [
10988
+ /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Summary", children: [
10989
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Summary" }),
10990
+ wrapUp.state === "written" ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-summary", children: bundle.summary?.text }) : wrapUp.state === "in-progress" ? /* @__PURE__ */ jsxs4("div", { className: "mx-meet__panel-note", role: "status", children: [
10991
+ /* @__PURE__ */ jsx6("p", { children: wrapUp.message }),
10992
+ /* @__PURE__ */ jsx6("button", { type: "button", className: "mx-meet__link", onClick: record.reload, children: "Check again" })
10993
+ ] }) : /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", role: wrapUp.state === "failed" ? "alert" : void 0, children: wrapUp.message })
10927
10994
  ] }),
10928
- /* @__PURE__ */ jsx4(
10995
+ /* @__PURE__ */ jsx6(
10929
10996
  NoteList,
10930
10997
  {
10931
10998
  title: "Decisions",
@@ -10937,7 +11004,7 @@ function MeetingRecordBody({
10937
11004
  )
10938
11005
  }
10939
11006
  ),
10940
- /* @__PURE__ */ jsx4(
11007
+ /* @__PURE__ */ jsx6(
10941
11008
  NoteList,
10942
11009
  {
10943
11010
  title: "Action items",
@@ -10950,42 +11017,42 @@ function MeetingRecordBody({
10950
11017
  }
10951
11018
  )
10952
11019
  ] }) : null,
10953
- tab === "notes" ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Notes as it happened", children: [
10954
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Notes as it happened" }),
10955
- bundle.liveNotes.length === 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: absenceSentence(
11020
+ tab === "notes" ? /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Notes as it happened", children: [
11021
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Notes as it happened" }),
11022
+ bundle.liveNotes.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: absenceSentence(
10956
11023
  bundle,
10957
11024
  "notes",
10958
11025
  "No live notes are available for this meeting."
10959
- ) }) : /* @__PURE__ */ jsx4("ul", { className: "mx-meet__notes", children: bundle.liveNotes.map((note) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__note", children: [
10960
- note.window !== null ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__badge", children: [
11026
+ ) }) : /* @__PURE__ */ jsx6("ul", { className: "mx-meet__notes", children: bundle.liveNotes.map((note) => /* @__PURE__ */ jsxs4("li", { className: "mx-meet__note", children: [
11027
+ note.window !== null ? /* @__PURE__ */ jsxs4("span", { className: "mx-meet__badge", children: [
10961
11028
  "Window ",
10962
11029
  note.window
10963
11030
  ] }) : null,
10964
11031
  note.text
10965
11032
  ] }, note.id)) })
10966
11033
  ] }) : null,
10967
- tab === "transcript" ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Transcript", children: [
10968
- /* @__PURE__ */ jsxs3("h2", { className: "mx-meet__record-section-title", children: [
11034
+ tab === "transcript" ? /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Transcript", children: [
11035
+ /* @__PURE__ */ jsxs4("h2", { className: "mx-meet__record-section-title", children: [
10969
11036
  "Transcript",
10970
- /* @__PURE__ */ jsx4("span", { className: "mx-meet__record-count", children: bundle.transcript.length === 1 ? "1 line" : `${bundle.transcript.length} lines` })
11037
+ /* @__PURE__ */ jsx6("span", { className: "mx-meet__record-count", children: bundle.transcript.length === 1 ? "1 line" : `${bundle.transcript.length} lines` })
10971
11038
  ] }),
10972
- blocks.length === 0 ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: absenceSentence(
11039
+ blocks.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: absenceSentence(
10973
11040
  bundle,
10974
11041
  "transcript",
10975
11042
  "No transcript is available for this meeting."
10976
- ) }) : /* @__PURE__ */ jsx4("ol", { className: "mx-meet__record-transcript", children: blocks.map((block) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__record-block", children: [
10977
- /* @__PURE__ */ jsxs3("p", { className: "mx-meet__record-speaker", children: [
11043
+ ) }) : /* @__PURE__ */ jsx6("ol", { className: "mx-meet__record-transcript", children: blocks.map((block) => /* @__PURE__ */ jsxs4("li", { className: "mx-meet__record-block", children: [
11044
+ /* @__PURE__ */ jsxs4("p", { className: "mx-meet__record-speaker", children: [
10978
11045
  block.speaker,
10979
- /* @__PURE__ */ jsx4("time", { className: "mx-meet__record-time", dateTime: block.startedAt, children: clockOf(block.startedAt) })
11046
+ /* @__PURE__ */ jsx6("time", { className: "mx-meet__record-time", dateTime: block.startedAt, children: clockOf(block.startedAt) })
10980
11047
  ] }),
10981
- block.lines.map((line) => /* @__PURE__ */ jsx4("p", { className: "mx-meet__record-line", children: line.text }, line.id))
11048
+ block.lines.map((line) => /* @__PURE__ */ jsx6("p", { className: "mx-meet__record-line", children: line.text }, line.id))
10982
11049
  ] }, block.id)) })
10983
11050
  ] }) : null,
10984
- /* @__PURE__ */ jsx4(GuestRecordAccessControl, { meeting }),
10985
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Ask about this meeting", children: [
10986
- /* @__PURE__ */ jsx4("h2", { className: "mx-meet__record-section-title", children: "Ask about this meeting" }),
10987
- guestFinishedMeeting ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: "Sign in to ask the assistant about a meeting after it ends." }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
10988
- /* @__PURE__ */ jsxs3(
11051
+ /* @__PURE__ */ jsx6(GuestRecordAccessControl, { meeting }),
11052
+ /* @__PURE__ */ jsxs4("section", { className: "mx-meet__record-section", "aria-label": "Ask about this meeting", children: [
11053
+ /* @__PURE__ */ jsx6("h2", { className: "mx-meet__record-section-title", children: "Ask about this meeting" }),
11054
+ guestFinishedMeeting ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: "Sign in to ask the assistant about a meeting after it ends." }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
11055
+ /* @__PURE__ */ jsxs4(
10989
11056
  "form",
10990
11057
  {
10991
11058
  className: "mx-meet__composer",
@@ -10996,7 +11063,7 @@ function MeetingRecordBody({
10996
11063
  void record.ask(trimmed);
10997
11064
  },
10998
11065
  children: [
10999
- /* @__PURE__ */ jsx4(
11066
+ /* @__PURE__ */ jsx6(
11000
11067
  "input",
11001
11068
  {
11002
11069
  className: "mx-meet__input",
@@ -11006,7 +11073,7 @@ function MeetingRecordBody({
11006
11073
  "aria-label": "Ask about this meeting"
11007
11074
  }
11008
11075
  ),
11009
- /* @__PURE__ */ jsx4(
11076
+ /* @__PURE__ */ jsx6(
11010
11077
  "button",
11011
11078
  {
11012
11079
  type: "submit",
@@ -11018,8 +11085,8 @@ function MeetingRecordBody({
11018
11085
  ]
11019
11086
  }
11020
11087
  ),
11021
- record.answer !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__answer", children: record.answer }) : null,
11022
- record.coverage !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__coverage", children: [
11088
+ record.answer !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__answer", children: record.answer }) : null,
11089
+ record.coverage !== null ? /* @__PURE__ */ jsxs4("p", { className: "mx-meet__coverage", children: [
11023
11090
  "Answered from ",
11024
11091
  record.coverage.segmentsUsed,
11025
11092
  " of ",
@@ -11030,9 +11097,9 @@ function MeetingRecordBody({
11030
11097
  record.coverage.truncated ? " (the oldest were left out)" : "",
11031
11098
  "."
11032
11099
  ] }) : null,
11033
- record.askError !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: record.askError, operation: "Ask about this meeting", origin: "meet/components", children: [
11034
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: record.askError.message }),
11035
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: record.askError.remedy })
11100
+ record.askError !== null ? /* @__PURE__ */ jsxs4(ErrorBox2, { as: "div", className: "mx-meet__refusal", error: record.askError, operation: "Ask about this meeting", origin: "meet/components", children: [
11101
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__refusal-reason", children: record.askError.message }),
11102
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__refusal-remedy", children: record.askError.remedy })
11036
11103
  ] }) : null
11037
11104
  ] })
11038
11105
  ] })
@@ -11043,21 +11110,21 @@ var STREAM_REFUSED = "Streaming playback did not start, so this recording was do
11043
11110
  var PLAYBACK_RETRY_REMEDY = "Reload the page and try again. If it still will not play, ask a meeting host to check the recording.";
11044
11111
  function RecordingPlayer(props) {
11045
11112
  const host = useMeetHost();
11046
- if (host === null) return /* @__PURE__ */ jsx4(InertNotice, { what: "This recording" });
11047
- return /* @__PURE__ */ jsx4(RecordingPlayerBody, { ...props, host });
11113
+ if (host === null) return /* @__PURE__ */ jsx6(InertNotice, { what: "This recording" });
11114
+ return /* @__PURE__ */ jsx6(RecordingPlayerBody, { ...props, host });
11048
11115
  }
11049
11116
  function RecordingPlayerBody({ fileId, host }) {
11050
- const [media, setMedia] = useState4(null);
11051
- const [loading, setLoading] = useState4(false);
11052
- const [error, setError] = useState4(null);
11053
- useEffect4(() => {
11117
+ const [media, setMedia] = useState5(null);
11118
+ const [loading, setLoading] = useState5(false);
11119
+ const [error, setError] = useState5(null);
11120
+ useEffect7(() => {
11054
11121
  if (media === null || media.kind !== "bytes") return void 0;
11055
11122
  const url = media.url;
11056
11123
  return () => URL.revokeObjectURL(url);
11057
11124
  }, [media]);
11058
11125
  if (media !== null) {
11059
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-section", children: [
11060
- /* @__PURE__ */ jsx4(
11126
+ return /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-section", children: [
11127
+ /* @__PURE__ */ jsx6(
11061
11128
  "video",
11062
11129
  {
11063
11130
  className: "mx-meet__record-player",
@@ -11099,15 +11166,15 @@ function RecordingPlayerBody({ fileId, host }) {
11099
11166
  }
11100
11167
  }
11101
11168
  ),
11102
- media.fallbackReason !== null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note", children: media.fallbackReason }) : null
11169
+ media.fallbackReason !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: media.fallbackReason }) : null
11103
11170
  ] });
11104
11171
  }
11105
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-section", children: [
11106
- error !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error, operation: "Complete this meeting action", origin: "meet/components", children: [
11107
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-reason", children: error.message }),
11108
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__refusal-remedy", children: error.remedy })
11172
+ return /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-section", children: [
11173
+ error !== null ? /* @__PURE__ */ jsxs4(ErrorBox2, { as: "div", className: "mx-meet__refusal", error, operation: "Complete this meeting action", origin: "meet/components", children: [
11174
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__refusal-reason", children: error.message }),
11175
+ /* @__PURE__ */ jsx6("p", { className: "mx-meet__refusal-remedy", children: error.remedy })
11109
11176
  ] }) : null,
11110
- /* @__PURE__ */ jsx4(
11177
+ /* @__PURE__ */ jsx6(
11111
11178
  "button",
11112
11179
  {
11113
11180
  type: "button",
@@ -11135,45 +11202,84 @@ function RecordingPlayerBody({ fileId, host }) {
11135
11202
  )
11136
11203
  ] });
11137
11204
  }
11138
- function clockOf(iso) {
11139
- const at = new Date(iso);
11140
- if (Number.isNaN(at.getTime())) return "";
11141
- return at.toLocaleTimeString(void 0, { hour: "numeric", minute: "2-digit" });
11142
- }
11143
- function MeetingList({ baseUrl }) {
11205
+
11206
+ // src/react/skin-root.tsx
11207
+ import { jsx as jsx7 } from "react/jsx-runtime";
11208
+ function MeetingSkinRoot(props) {
11144
11209
  const host = useMeetHost();
11145
- const list = useMeetings();
11146
- if (host === null) return /* @__PURE__ */ jsx4(InertNotice, { what: "Your meetings" });
11147
- if (list.failure !== null) {
11148
- return /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__empty", error: list.failure, operation: "List your meetings", origin: "meet/components", children: [
11149
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "Your meetings could not be listed" }),
11150
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: list.failure.message }),
11151
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: list.failure.remedy })
11152
- ] });
11153
- }
11154
- if (list.loading) {
11155
- return /* @__PURE__ */ jsx4("div", { className: "mx-meet__empty", role: "status", children: /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "Loading your meetings\u2026" }) });
11210
+ if (host === null) {
11211
+ return /* @__PURE__ */ jsx7(MeetRoot, { meeting: props.meeting, children: /* @__PURE__ */ jsx7("div", { className: "mx-meet", children: /* @__PURE__ */ jsx7(InertNotice, { what: "This meeting" }) }) });
11156
11212
  }
11157
- if (list.meetings.length === 0) {
11158
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
11159
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-title", children: "No meetings yet" }),
11160
- /* @__PURE__ */ jsx4("p", { className: "mx-meet__empty-body", children: "Create one above. Its link works before, during and after the meeting \u2014 afterwards it opens the record." })
11161
- ] });
11213
+ return /* @__PURE__ */ jsx7(MeetRoot, { meeting: props.meeting, children: /* @__PURE__ */ jsx7(MeetingSkinRootBody, { ...props, host }) });
11214
+ }
11215
+ function MeetingSkinRootBody({
11216
+ roomName,
11217
+ meetingId,
11218
+ slug,
11219
+ meeting: given,
11220
+ onLeave,
11221
+ headerControls,
11222
+ host
11223
+ }) {
11224
+ const snapshot = useMeetSnapshot();
11225
+ const phase = snapshot?.phase ?? "idle";
11226
+ useEffect8(() => {
11227
+ host.meetings.watch(roomName);
11228
+ }, [host, roomName]);
11229
+ useEffect8(() => {
11230
+ if (given === void 0) return;
11231
+ if (host.store.snapshot().meeting !== null) return;
11232
+ host.store.patch({ meeting: given, locked: given.locked });
11233
+ }, [host, given]);
11234
+ const watchedId = meetingId ?? snapshot?.meeting?.id ?? null;
11235
+ useEffect8(() => {
11236
+ if (watchedId === null) return;
11237
+ host.meetings.watchMeeting(asMeetingId(watchedId));
11238
+ }, [host, watchedId]);
11239
+ const record = snapshot?.meeting ?? given ?? null;
11240
+ if (hasEnded(record) && phase !== "connected" && phase !== "reconnecting") {
11241
+ return /* @__PURE__ */ jsx7(MeetingRecordView, { meeting: record });
11162
11242
  }
11163
- const origin = baseUrl ?? (typeof window === "undefined" ? "" : window.location.origin);
11164
- return /* @__PURE__ */ jsx4("ul", { className: "mx-meet-list", children: list.meetings.map((meeting) => {
11165
- const ended = meeting.endedAt !== null;
11166
- return /* @__PURE__ */ jsxs3("li", { className: "mx-meet-list__row", children: [
11167
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet-list__main", children: [
11168
- /* @__PURE__ */ jsxs3("span", { className: "mx-meet-list__title", children: [
11169
- meeting.title,
11170
- ended ? /* @__PURE__ */ jsx4("span", { className: "mx-meet__badge", children: "Ended" }) : null
11171
- ] }),
11172
- /* @__PURE__ */ jsx4("span", { className: "mx-meet-list__when", children: meetingWhen(meeting) })
11173
- ] }),
11174
- /* @__PURE__ */ jsx4("a", { className: "mx-meet-list__action", href: meetingLink(origin, meeting.slug), children: ended ? "Open the record" : "Join" })
11175
- ] }, meeting.id);
11176
- }) });
11243
+ return /* @__PURE__ */ jsx7(
11244
+ MeetSkinRoom,
11245
+ {
11246
+ roomName,
11247
+ ...meetingId !== void 0 ? { meetingId } : {},
11248
+ ...slug !== void 0 ? { slug } : {},
11249
+ ...onLeave !== void 0 ? { onLeave } : {},
11250
+ ...headerControls !== void 0 ? { headerControls } : {}
11251
+ }
11252
+ );
11253
+ }
11254
+
11255
+ // src/react/calls-ui.tsx
11256
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
11257
+ function IncomingCallHost() {
11258
+ const calls = useCalls();
11259
+ if (calls.incoming.length === 0) return null;
11260
+ return /* @__PURE__ */ jsx8("div", { className: "mx-meet__ringing-stack", children: calls.incoming.map((invite) => /* @__PURE__ */ jsx8(IncomingCallCard, { invite }, invite.id)) });
11261
+ }
11262
+ function IncomingCallCard({ invite }) {
11263
+ const calls = useCalls();
11264
+ return /* @__PURE__ */ jsxs5("section", { className: "mx-meet__ringing", role: "alertdialog", "aria-label": "Incoming call", children: [
11265
+ /* @__PURE__ */ jsx8(Avatar, { name: invite.callerName, url: invite.callerAvatarUrl, size: 56 }),
11266
+ /* @__PURE__ */ jsxs5("div", { className: "mx-meet__ringing-text", children: [
11267
+ /* @__PURE__ */ jsx8("strong", { children: invite.callerName }),
11268
+ /* @__PURE__ */ jsx8("span", { children: invite.mode === "video" ? "Incoming video call" : "Incoming call" })
11269
+ ] }),
11270
+ /* @__PURE__ */ jsxs5("div", { className: "mx-meet__ringing-actions", children: [
11271
+ /* @__PURE__ */ jsx8(ControlButton, { label: "Decline", danger: true, onClick: () => void calls.decline(invite), children: /* @__PURE__ */ jsx8(PhoneOffIcon, {}) }),
11272
+ invite.mode === "video" ? /* @__PURE__ */ jsx8(
11273
+ ControlButton,
11274
+ {
11275
+ label: "Accept without video",
11276
+ onClick: () => void calls.accept({ ...invite, mode: "audio" }),
11277
+ children: /* @__PURE__ */ jsx8(CameraOffIcon, {})
11278
+ }
11279
+ ) : null,
11280
+ /* @__PURE__ */ jsx8(ControlButton, { label: "Accept", onClick: () => void calls.accept(invite), children: /* @__PURE__ */ jsx8(PhoneIcon, {}) })
11281
+ ] })
11282
+ ] });
11177
11283
  }
11178
11284
 
11179
11285
  // src/core/invitations.ts
@@ -11328,54 +11434,26 @@ async function pushMeetingToGoogleCalendar(api, meetingId, target) {
11328
11434
  }
11329
11435
  export {
11330
11436
  ATTENDANCE_CSV_HEADER,
11331
- ActivitiesControl,
11332
- ActivitiesIcon,
11333
- AiPanel,
11334
- AttendanceNotice,
11335
- Avatar,
11336
- BreakoutBanner,
11337
- BreakoutIcon,
11338
- BreakoutsPanel,
11339
11437
  CALL_INVITE_KIND,
11340
11438
  CALL_INVITE_VERSION,
11341
11439
  CAPTION_LANGUAGES,
11342
11440
  CONSENT_NOTICE_ATTRIBUTE,
11343
- CallButton,
11344
- CameraIcon,
11345
- CameraOffIcon,
11346
- CaptionLanguageSettings,
11347
- Captions,
11348
- ChatIcon,
11349
- ChatPanel,
11350
- CheckIcon,
11351
- CloseIcon,
11352
- ConnectionDot,
11353
- ConsentNotice,
11354
- ControlBar,
11355
- ControlButton,
11356
11441
  DATA_TOPICS,
11357
11442
  DEFAULT_EFFECTS,
11358
11443
  DEFAULT_PAGE_SIZE,
11359
11444
  EMPTY_COLLAB,
11360
11445
  END_MEETING_NOT_SERVED,
11361
11446
  FILE_SESSION_PATH,
11362
- FlagIcon,
11363
11447
  GUEST_RECORD_ACCESS_CHOICES,
11364
11448
  GUEST_RECORD_ACCESS_LEVELS,
11365
11449
  GUEST_RECORD_ACCESS_METADATA_KEY,
11366
11450
  GUEST_RECORD_NOT_SHARED,
11367
11451
  GuestRecordAccessControl,
11368
- HandIcon,
11369
- HostMenu,
11370
11452
  IDLE_MEDIA,
11371
11453
  IDLE_TRACK,
11372
11454
  IncomingCallCard,
11373
11455
  IncomingCallHost,
11374
- KeyboardIcon,
11375
11456
  LISTEN_ONLY_NOTICE,
11376
- LayoutIcon,
11377
- LobbyPanel,
11378
- LockIcon,
11379
11457
  MEETING_INVITE_KIND,
11380
11458
  MEETING_INVITE_VERSION,
11381
11459
  MEETING_RECORD_GRACE_MS,
@@ -11389,33 +11467,15 @@ export {
11389
11467
  MODERATION_ACTIONS,
11390
11468
  MeetError,
11391
11469
  MeetProvider,
11392
- MeetingList,
11393
- MeetingOverlays,
11470
+ MeetRoot,
11394
11471
  MeetingRecordView,
11395
- MeetingRoom,
11396
- MicIcon,
11397
- MicOffIcon,
11398
- MoreIcon,
11472
+ MeetingSkinRoot,
11399
11473
  NOTE_TAKER_IDENTITY_PREFIX,
11400
11474
  NOTE_TAKER_METADATA_KEY,
11401
11475
  NO_GRANTS,
11402
11476
  ORGANIZATION_HEADER,
11403
11477
  PARTICIPANT_CAN_RECORD_ATTRIBUTE,
11404
11478
  PARTICIPANT_ROLE_ATTRIBUTE,
11405
- ParticipantTile,
11406
- PencilIcon,
11407
- PeopleIcon,
11408
- PeoplePanel,
11409
- PersonMenu,
11410
- PhoneIcon,
11411
- PhoneOffIcon,
11412
- PinIcon,
11413
- PollIcon,
11414
- PollsPanel,
11415
- PreJoin,
11416
- QaPanel,
11417
- QualityBars,
11418
- QuestionIcon,
11419
11479
  REACTION_TTL_MS,
11420
11480
  REFUSED_ABSENCE,
11421
11481
  ROLE_RANK,
@@ -11423,30 +11483,13 @@ export {
11423
11483
  ROOM_EVENT_PREFIX,
11424
11484
  ROOM_TOKEN_HEADER,
11425
11485
  RPCS,
11426
- ReactionOverlay,
11427
- RecordIcon,
11428
- RecordingIndicator,
11429
11486
  RecordingPlayer,
11430
- ScheduleMeeting,
11431
- ScreenShareIcon,
11432
- SearchIcon,
11433
- SettingsIcon,
11434
- SettingsPanel,
11435
- ShortcutsSheet,
11436
- SignalIcon,
11437
- SmileIcon,
11438
- SparklesIcon,
11439
- SpeakerIcon,
11440
- SpotlightIcon,
11441
- Stage,
11442
11487
  TABLES,
11443
11488
  TRANSCRIPTION_ATTRIBUTES,
11444
11489
  TRANSCRIPTION_TOPIC,
11445
- WhiteboardIcon,
11446
- WhiteboardPanel,
11447
- WifiLowIcon,
11448
11490
  absenceSentence,
11449
11491
  activeWrapUpSummary,
11492
+ activityAttention,
11450
11493
  announceMeeting,
11451
11494
  applyCollabPacket,
11452
11495
  applyRoomEvent,
@@ -11463,6 +11506,7 @@ export {
11463
11506
  attendanceTotals,
11464
11507
  attendeeKey,
11465
11508
  autoAssign,
11509
+ availableActivities,
11466
11510
  breakoutRemainingMs,
11467
11511
  callInviteAction,
11468
11512
  callInviteText,
@@ -11534,6 +11578,9 @@ export {
11534
11578
  meetingWhen,
11535
11579
  mergeCaption,
11536
11580
  mergeRecord,
11581
+ microphoneNoticeCode,
11582
+ moveToRoom,
11583
+ nextTranslationBatch,
11537
11584
  normalizeDeviceError,
11538
11585
  normalizeMeetError,
11539
11586
  normalizeSpoken,
@@ -11542,9 +11589,15 @@ export {
11542
11589
  noteTakerParticipant,
11543
11590
  noteTakerStatus,
11544
11591
  notesDocument,
11592
+ observe as observeMeeting,
11593
+ observedDevice,
11594
+ observedPhase,
11595
+ observedQuality,
11545
11596
  orderParticipants,
11546
11597
  parseRoomToken,
11598
+ participantAttributes,
11547
11599
  participantSummary,
11600
+ performCollab,
11548
11601
  playableRecordingFileId,
11549
11602
  projectInvitee,
11550
11603
  projectLibraryRecording,
@@ -11564,16 +11617,23 @@ export {
11564
11617
  recordingOffsetMs,
11565
11618
  roleOf,
11566
11619
  roomTopic,
11620
+ rootAttributes,
11567
11621
  searchTranscript,
11568
11622
  sendFollowUp,
11623
+ setCaptionLanguage,
11569
11624
  setGuestRecordAccess,
11570
11625
  settingsPatch,
11571
11626
  snapshotParticipant,
11572
11627
  snippetRuns,
11628
+ staticObservation,
11573
11629
  summarizeMeetingRecordRestrictions,
11630
+ takeMoveRequest,
11631
+ takePanelRequest,
11574
11632
  transcriptDocument,
11575
11633
  unavailableFrom,
11576
11634
  uniqueAttendees,
11635
+ untranslatedLines,
11636
+ useActivityAttention,
11577
11637
  useAudioLevel,
11578
11638
  useAvailableActivities,
11579
11639
  useCalls,
@@ -11583,6 +11643,8 @@ export {
11583
11643
  useCollab,
11584
11644
  useCollabPanelRequest,
11585
11645
  useConsentNotice,
11646
+ useCoreObservation,
11647
+ useCoreRootProps,
11586
11648
  useDeviceSnapshot,
11587
11649
  useElapsed,
11588
11650
  useEndMeeting,
@@ -11596,6 +11658,7 @@ export {
11596
11658
  useLocalUserId,
11597
11659
  useMediaEffects,
11598
11660
  useMeetAi,
11661
+ useMeetCore,
11599
11662
  useMeetHost,
11600
11663
  useMeetShortcuts,
11601
11664
  useMeetSnapshot,