@ai-matrx/meet 0.7.84 → 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}` : ""}`;
@@ -7201,23 +7199,15 @@ function useGuestRecordAccess(meeting) {
7201
7199
  };
7202
7200
  }
7203
7201
 
7204
- // src/react/components.tsx
7205
- import { useEffect as useEffect5, useLayoutEffect, useMemo as useMemo4, useRef as useRef5, useState as useState4 } from "react";
7206
- import {
7207
- Alert,
7208
- AlertDescription,
7209
- Button,
7210
- Checkbox,
7211
- ErrorBox,
7212
- Label,
7213
- SegmentedControl,
7214
- Select,
7215
- SelectContent,
7216
- SelectItem,
7217
- SelectTrigger,
7218
- SelectValue
7219
- } from "@ai-matrx/design-system";
7220
- 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";
7221
7211
 
7222
7212
  // src/core/after.ts
7223
7213
  import { toDelimited } from "@ai-matrx/kit/delimited";
@@ -7654,11 +7644,151 @@ function countLabel(count2, singular, plural = `${singular}s`) {
7654
7644
  return `${count2} ${count2 === 1 ? singular : plural}`;
7655
7645
  }
7656
7646
 
7657
- // src/react/collab.tsx
7658
- import { useEffect as useEffect4, useRef as useRef4, useState as useState3 } from "react";
7659
- 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
+ }
7660
7712
 
7661
- // src/react/icons.tsx
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";
7790
+
7791
+ // src/skins/meet/icons.tsx
7662
7792
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
7663
7793
  function Icon({ children, ...props }) {
7664
7794
  return /* @__PURE__ */ jsx3(
@@ -7754,12 +7884,6 @@ function LockIcon(props) {
7754
7884
  /* @__PURE__ */ jsx3("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
7755
7885
  ] });
7756
7886
  }
7757
- function LayoutIcon(props) {
7758
- return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7759
- /* @__PURE__ */ jsx3("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
7760
- /* @__PURE__ */ jsx3("path", { d: "M3 9h18M9 21V9" })
7761
- ] });
7762
- }
7763
7887
  function SettingsIcon(props) {
7764
7888
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7765
7889
  /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "3" }),
@@ -7778,12 +7902,6 @@ function PinIcon(props) {
7778
7902
  /* @__PURE__ */ jsx3("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
7779
7903
  ] });
7780
7904
  }
7781
- function WifiLowIcon(props) {
7782
- return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7783
- /* @__PURE__ */ jsx3("path", { d: "M12 20h.01" }),
7784
- /* @__PURE__ */ jsx3("path", { d: "M8.5 16.5a5 5 0 0 1 7 0" })
7785
- ] });
7786
- }
7787
7905
  function SmileIcon(props) {
7788
7906
  return /* @__PURE__ */ jsxs(Icon, { ...props, children: [
7789
7907
  /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
@@ -7896,40 +8014,11 @@ function UndoIcon(props) {
7896
8014
  ] });
7897
8015
  }
7898
8016
 
7899
- // src/react/collab.tsx
8017
+ // src/skins/meet/collab.tsx
7900
8018
  import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
7901
- function useCollab() {
7902
- const host = useMeetHost();
7903
- const snapshot = useMeetSnapshot();
7904
- const isHost = useIsHost();
7905
- return {
7906
- collab: snapshot?.collab ?? null,
7907
- isHost,
7908
- localIdentity: snapshot?.localIdentity ?? null,
7909
- breakoutRoomId: snapshot?.breakoutRoomId ?? null,
7910
- async act(request) {
7911
- if (host === null) return { ok: false, message: "This meeting is not connected." };
7912
- try {
7913
- const result = await host.inRoom.collab(request);
7914
- return { ok: true, message: result.message, itemId: result.itemId };
7915
- } catch (error) {
7916
- return { ok: false, message: error.message ?? "That did not work." };
7917
- }
7918
- },
7919
- async moveTo(roomId) {
7920
- if (host === null) return { ok: false, message: "This meeting is not connected." };
7921
- try {
7922
- await host.engine.moveToBreakout(roomId);
7923
- return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
7924
- } catch (error) {
7925
- return { ok: false, message: error.message ?? "That room could not be joined." };
7926
- }
7927
- }
7928
- };
7929
- }
7930
8019
  function useNotice() {
7931
8020
  const [notice, setNotice] = useState3(null);
7932
- useEffect4(() => {
8021
+ useEffect5(() => {
7933
8022
  if (notice === null) return void 0;
7934
8023
  const timer = setTimeout(() => setNotice(null), notice.failed ? 7e3 : 3e3);
7935
8024
  return () => clearTimeout(timer);
@@ -7953,24 +8042,6 @@ function ActivityIcon({ panel }) {
7953
8042
  if (panel === "whiteboard") return /* @__PURE__ */ jsx4(WhiteboardIcon, { ...props });
7954
8043
  return /* @__PURE__ */ jsx4(BreakoutIcon, { ...props });
7955
8044
  }
7956
- function useAvailableActivities() {
7957
- const { collab, isHost } = useCollab();
7958
- const settings = collab?.settings ?? null;
7959
- if (settings === null) return [];
7960
- const out = [];
7961
- if (settings.whiteboardEnabled) out.push("whiteboard");
7962
- if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
7963
- if (settings.qaEnabled) out.push("qa");
7964
- if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
7965
- return out;
7966
- }
7967
- function useActivityAttention() {
7968
- const { collab, isHost } = useCollab();
7969
- if (collab === null) return false;
7970
- if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
7971
- if (isHost && collab.questions.some((q) => q.state === "open")) return true;
7972
- return false;
7973
- }
7974
8045
  function ActivitiesControl({
7975
8046
  active,
7976
8047
  onOpen
@@ -8090,7 +8161,7 @@ function PollCard({ poll }) {
8090
8161
  const { act, isHost } = useCollab();
8091
8162
  const [picked, setPicked] = useState3(poll.myVote.slice());
8092
8163
  const [notice, show] = useNotice();
8093
- useEffect4(() => setPicked(poll.myVote.slice()), [poll.myVote]);
8164
+ useEffect5(() => setPicked(poll.myVote.slice()), [poll.myVote]);
8094
8165
  const counts = poll.options.some((o) => o.votes !== void 0);
8095
8166
  const total = poll.options.reduce((sum, o) => sum + (o.votes ?? 0), 0);
8096
8167
  const canVote = poll.state === "live";
@@ -8348,7 +8419,7 @@ function WhiteboardPanel({ onClose }) {
8348
8419
  const [drawing, setDrawing] = useState3(null);
8349
8420
  const [pending, setPending] = useState3([]);
8350
8421
  const [notice, show] = useNotice();
8351
- const svgRef = useRef4(null);
8422
+ const svgRef = useRef5(null);
8352
8423
  const strokes = collab?.strokes ?? [];
8353
8424
  const mine = strokes.filter((s) => s.by === localIdentity);
8354
8425
  const point = (event) => {
@@ -8490,7 +8561,7 @@ function clock(ms2) {
8490
8561
  var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
8491
8562
  function useNow(active) {
8492
8563
  const [now, setNow] = useState3(() => Date.now());
8493
- useEffect4(() => {
8564
+ useEffect5(() => {
8494
8565
  if (!active) return void 0;
8495
8566
  const timer = setInterval(() => setNow(Date.now()), 1e3);
8496
8567
  return () => clearInterval(timer);
@@ -8736,17 +8807,17 @@ function BreakoutBanner() {
8736
8807
  const assigned = assignedRoom(open, localIdentity);
8737
8808
  const [dismissedBroadcast, setDismissedBroadcast] = useState3(null);
8738
8809
  const [failure, setFailure] = useState3(null);
8739
- const expireAsked = useRef4(null);
8810
+ const expireAsked = useRef5(null);
8740
8811
  const moveAt = collab?.moveRequest?.at ?? null;
8741
- useEffect4(() => {
8742
- const request = host?.store.snapshot().collab.moveRequest ?? null;
8743
- if (request === null || host === null) return;
8744
- 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;
8745
8816
  const here = host.store.snapshot().breakoutRoomId;
8746
8817
  if ((here ?? null) === request.roomId) return;
8747
8818
  void moveTo(request.roomId).then((result) => setFailure(result.ok ? null : result.message));
8748
8819
  }, [moveAt, host, moveTo]);
8749
- useEffect4(() => {
8820
+ useEffect5(() => {
8750
8821
  if (open === null || remaining === null || remaining > 0) return;
8751
8822
  const asked = expireAsked.current;
8752
8823
  if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
@@ -8791,26 +8862,6 @@ function BreakoutBanner() {
8791
8862
  ] }) : null
8792
8863
  ] });
8793
8864
  }
8794
- function useCaptionTranslation(lines) {
8795
- const host = useMeetHost();
8796
- const snapshot = useMeetSnapshot();
8797
- const collab = snapshot?.collab ?? null;
8798
- const language = collab?.captionLanguage ?? null;
8799
- const asked = useRef4(/* @__PURE__ */ new Set());
8800
- const translations = collab?.captionTranslations ?? {};
8801
- const missing = lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text: text3 }) => ({ id, text: text3 }));
8802
- const key = `${language ?? ""}|${missing.map((l) => l.id).join(",")}`;
8803
- const pending = useRef4(missing);
8804
- pending.current = missing;
8805
- useEffect4(() => {
8806
- if (host === null || language === null) return;
8807
- const batch = pending.current.filter((line) => !asked.current.has(`${language}:${line.id}`)).slice(-20);
8808
- if (batch.length === 0) return;
8809
- for (const line of batch) asked.current.add(`${language}:${line.id}`);
8810
- void host.inRoom.translateCaptions(language, batch).catch(() => void 0);
8811
- }, [host, language, key]);
8812
- return { language, translations, error: collab?.captionTranslationError ?? null };
8813
- }
8814
8865
  function CaptionLanguageSettings() {
8815
8866
  const host = useMeetHost();
8816
8867
  const snapshot = useMeetSnapshot();
@@ -8831,14 +8882,7 @@ function CaptionLanguageSettings() {
8831
8882
  value: current,
8832
8883
  onChange: (event) => {
8833
8884
  const next = event.target.value === "" ? null : event.target.value;
8834
- host.store.patch({
8835
- collab: {
8836
- ...host.store.snapshot().collab,
8837
- captionLanguage: next,
8838
- captionTranslations: {},
8839
- captionTranslationError: null
8840
- }
8841
- });
8885
+ setCaptionLanguage(host.store, next);
8842
8886
  },
8843
8887
  children: [
8844
8888
  /* @__PURE__ */ jsx4("option", { value: "", children: "Off \u2014 as spoken" }),
@@ -8854,20 +8898,8 @@ function CaptionLanguageSettings() {
8854
8898
  collab?.captionTranslationError != null ? /* @__PURE__ */ jsx4("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
8855
8899
  ] });
8856
8900
  }
8857
- function useCollabPanelRequest(onRequest) {
8858
- const host = useMeetHost();
8859
- const at = useMeetSnapshot()?.collab.panelRequest?.at ?? null;
8860
- const callback = useRef4(onRequest);
8861
- callback.current = onRequest;
8862
- useEffect4(() => {
8863
- const request = host?.store.snapshot().collab.panelRequest ?? null;
8864
- if (request === null || host === null) return;
8865
- host.store.patch({ collab: { ...host.store.snapshot().collab, panelRequest: null } });
8866
- callback.current(request.panel);
8867
- }, [at, host]);
8868
- }
8869
8901
 
8870
- // src/react/components.tsx
8902
+ // src/skins/meet/components.tsx
8871
8903
  import { Fragment, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
8872
8904
  function InertNotice({ what }) {
8873
8905
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
@@ -8951,10 +8983,6 @@ function RecordingIndicator() {
8951
8983
  }
8952
8984
  );
8953
8985
  }
8954
- function ConnectionDot({ quality }) {
8955
- if (quality === "excellent" || quality === "good" || quality === "unknown") return null;
8956
- return /* @__PURE__ */ jsx5("span", { className: `mx-meet__quality mx-meet__quality--${quality}`, title: `Connection ${quality}`, children: /* @__PURE__ */ jsx5(WifiLowIcon, { width: 14, height: 14 }) });
8957
- }
8958
8986
  function RoleBadge({ role }) {
8959
8987
  if (role === "host") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Host" });
8960
8988
  if (role === "cohost") return /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Co-host" });
@@ -9079,7 +9107,6 @@ function Stage({ pageSize }) {
9079
9107
  ] }) : null
9080
9108
  ] });
9081
9109
  }
9082
- var MEET_REACTIONS = ["\u{1F496}", "\u{1F44D}", "\u{1F389}", "\u{1F44F}", "\u{1F602}", "\u{1F62E}", "\u{1F622}", "\u{1F914}", "\u{1F44E}"];
9083
9110
  function ControlBar({ onLeave }) {
9084
9111
  const room = useRoom();
9085
9112
  const recording = useRecording();
@@ -9104,7 +9131,7 @@ function ControlBar({ onLeave }) {
9104
9131
  });
9105
9132
  const privateChatAt = snapshot?.privateChatRequest?.at ?? null;
9106
9133
  const meetStore = useMeetHost()?.store ?? null;
9107
- useEffect5(() => {
9134
+ useEffect6(() => {
9108
9135
  const request = meetStore?.snapshot().privateChatRequest ?? null;
9109
9136
  if (request === null) return;
9110
9137
  setChatTo(request.to);
@@ -9343,12 +9370,12 @@ function useUnreadChat(open) {
9343
9370
  const chat = snapshot?.chat ?? [];
9344
9371
  const local = snapshot?.localIdentity ?? null;
9345
9372
  const [seen, setSeen] = useState4(0);
9346
- useEffect5(() => {
9373
+ useEffect6(() => {
9347
9374
  if (open) setSeen(chat.length);
9348
9375
  }, [open, chat.length]);
9349
9376
  const loaded = snapshot?.chatLoaded === true;
9350
9377
  const [baseline, setBaseline] = useState4(null);
9351
- useEffect5(() => {
9378
+ useEffect6(() => {
9352
9379
  if (loaded && baseline === null) setBaseline(chat.length);
9353
9380
  }, [loaded, baseline, chat.length]);
9354
9381
  if (open) return 0;
@@ -9361,7 +9388,7 @@ function Popover({
9361
9388
  children,
9362
9389
  placement = "up"
9363
9390
  }) {
9364
- const ref = useRef5(null);
9391
+ const ref = useRef6(null);
9365
9392
  const [style, setStyle] = useState4({
9366
9393
  position: "fixed",
9367
9394
  top: 0,
@@ -9413,7 +9440,7 @@ function Popover({
9413
9440
  window.removeEventListener("scroll", place, true);
9414
9441
  };
9415
9442
  }, [placement]);
9416
- useEffect5(() => {
9443
+ useEffect6(() => {
9417
9444
  const onKey = (event) => {
9418
9445
  if (event.key === "Escape") onClose();
9419
9446
  };
@@ -9447,7 +9474,7 @@ function MenuItem({
9447
9474
  );
9448
9475
  }
9449
9476
  function Toast({ text: text3, failed, onDone }) {
9450
- useEffect5(() => {
9477
+ useEffect6(() => {
9451
9478
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
9452
9479
  return () => clearTimeout(timer);
9453
9480
  }, [text3, failed, onDone]);
@@ -9486,7 +9513,7 @@ function MeetingOverlays() {
9486
9513
  ] });
9487
9514
  }
9488
9515
  function ShortcutsSheet({ onClose }) {
9489
- useEffect5(() => {
9516
+ useEffect6(() => {
9490
9517
  const onKey = (event) => {
9491
9518
  if (event.key === "Escape") onClose();
9492
9519
  };
@@ -9524,7 +9551,7 @@ function PanelShell({
9524
9551
  onClose,
9525
9552
  children
9526
9553
  }) {
9527
- const ref = useRef5(null);
9554
+ const ref = useRef6(null);
9528
9555
  useLayoutEffect(() => {
9529
9556
  const panel = ref.current;
9530
9557
  const root = panel?.closest(".mx-meet");
@@ -9554,15 +9581,15 @@ function ChatPanel({
9554
9581
  const room = useRoom();
9555
9582
  const [draft, setDraft] = useState4("");
9556
9583
  const [recipient, setRecipient] = useState4(to);
9557
- const listRef = useRef5(null);
9584
+ const listRef = useRef6(null);
9558
9585
  const messages = snapshot?.chat ?? [];
9559
9586
  const local = snapshot?.localIdentity ?? null;
9560
9587
  const people = (snapshot?.participants ?? []).filter(
9561
9588
  (participant) => !participant.isLocal && !participant.isAgent
9562
9589
  );
9563
9590
  const recipientName = recipient === null ? null : people.find((p) => p.identity === recipient)?.displayName ?? null;
9564
- useEffect5(() => setRecipient(to), [to]);
9565
- useEffect5(() => {
9591
+ useEffect6(() => setRecipient(to), [to]);
9592
+ useEffect6(() => {
9566
9593
  const list = listRef.current;
9567
9594
  if (list !== null) list.scrollTop = list.scrollHeight;
9568
9595
  }, [messages.length]);
@@ -10018,7 +10045,7 @@ function DeviceSettings({
10018
10045
  const stream = useMicrophoneStream(microphone);
10019
10046
  const level = useAudioLevel(stream);
10020
10047
  const [testing, setTesting] = useState4(false);
10021
- useEffect5(() => {
10048
+ useEffect6(() => {
10022
10049
  void host.devices.refresh();
10023
10050
  }, [host]);
10024
10051
  return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__section", "aria-label": "Devices", children: [
@@ -10048,7 +10075,7 @@ function DeviceSettings({
10048
10075
  function EffectsSettings({ preview }) {
10049
10076
  const effects = useMediaEffects();
10050
10077
  const [error, setError] = useState4(null);
10051
- const fileRef = useRef5(null);
10078
+ const fileRef = useRef6(null);
10052
10079
  const supported = effects.backgroundsSupported || preview != null || videoEffectsSupported();
10053
10080
  const apply = (next) => {
10054
10081
  setError(null);
@@ -10171,7 +10198,7 @@ async function playTestSound(sinkId) {
10171
10198
  }
10172
10199
  function useMicrophoneStream(deviceId2) {
10173
10200
  const [stream, setStream] = useState4(null);
10174
- useEffect5(() => {
10201
+ useEffect6(() => {
10175
10202
  if (deviceId2 === "off") return void 0;
10176
10203
  let live = true;
10177
10204
  let opened = null;
@@ -10455,7 +10482,7 @@ function PreJoinBody({
10455
10482
  const micStream = useMicrophoneStream(microphone ? mic : "off");
10456
10483
  const level = useAudioLevel(micStream);
10457
10484
  const [speakerTesting, setSpeakerTesting] = useState4(false);
10458
- useEffect5(() => {
10485
+ useEffect6(() => {
10459
10486
  void host.devices.refresh();
10460
10487
  }, [host]);
10461
10488
  return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__prejoin", children: [
@@ -10573,10 +10600,10 @@ function PreJoinBody({
10573
10600
  function useCameraPreview(deviceId2, effects) {
10574
10601
  const [preview, setPreview] = useState4(null);
10575
10602
  const [error, setError] = useState4(null);
10576
- const current = useRef5(null);
10577
- const initialEffect = useRef5(toVideoEffect(effects));
10603
+ const current = useRef6(null);
10604
+ const initialEffect = useRef6(toVideoEffect(effects));
10578
10605
  initialEffect.current = toVideoEffect(effects);
10579
- useEffect5(() => {
10606
+ useEffect6(() => {
10580
10607
  if (deviceId2 === void 0) return void 0;
10581
10608
  let live = true;
10582
10609
  setError(null);
@@ -10642,43 +10669,17 @@ function DevicePicker({
10642
10669
  )
10643
10670
  ] });
10644
10671
  }
10645
- function MeetingRoom(props) {
10646
- const host = useMeetHost();
10647
- if (host === null) {
10648
- return /* @__PURE__ */ jsx5(MeetRoot, { meeting: props.meeting, children: /* @__PURE__ */ jsx5("div", { className: "mx-meet", children: /* @__PURE__ */ jsx5(InertNotice, { what: "This meeting" }) }) });
10649
- }
10650
- return /* @__PURE__ */ jsx5(MeetRoot, { meeting: props.meeting, children: /* @__PURE__ */ jsx5(MeetingRoomBody, { ...props, host }) });
10651
- }
10652
- function MeetingRoomBody({
10672
+ function MeetSkinRoom({
10653
10673
  roomName,
10654
10674
  meetingId,
10655
10675
  slug,
10656
- meeting: given,
10657
10676
  onLeave,
10658
- headerControls,
10659
- host
10677
+ headerControls
10660
10678
  }) {
10661
- const snapshot = useMeetSnapshot();
10662
- const isHost = useIsHost();
10679
+ const { host, snapshot, isHost } = useMeetCore();
10663
10680
  const elapsed = useElapsed(snapshot?.meeting?.startedAt ?? null);
10664
10681
  const phase = snapshot?.phase ?? "idle";
10665
- useEffect5(() => {
10666
- host.meetings.watch(roomName);
10667
- }, [host, roomName]);
10668
- useEffect5(() => {
10669
- if (given === void 0) return;
10670
- if (host.store.snapshot().meeting !== null) return;
10671
- host.store.patch({ meeting: given, locked: given.locked });
10672
- }, [host, given]);
10673
- const watchedId = meetingId ?? snapshot?.meeting?.id ?? null;
10674
- useEffect5(() => {
10675
- if (watchedId === null) return;
10676
- host.meetings.watchMeeting(asMeetingId(watchedId));
10677
- }, [host, watchedId]);
10678
- const record = snapshot?.meeting ?? given ?? null;
10679
- if (hasEnded(record) && phase !== "connected" && phase !== "reconnecting") {
10680
- return /* @__PURE__ */ jsx5(MeetingRecordView, { meeting: record });
10681
- }
10682
+ if (host === null) return null;
10682
10683
  if (phase === "idle" || phase === "failed" || phase === "left") {
10683
10684
  return /* @__PURE__ */ jsx5("div", { className: "mx-meet", children: /* @__PURE__ */ jsx5(
10684
10685
  PreJoin,
@@ -10699,7 +10700,7 @@ function MeetingRoomBody({
10699
10700
  /* @__PURE__ */ jsx5("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
10700
10701
  /* @__PURE__ */ jsxs3("span", { className: "mx-meet__meta", children: [
10701
10702
  participantSummary(snapshot?.participants ?? []),
10702
- elapsed > 0 ? ` \xB7 ${formatDurationMs4(elapsed)}` : ""
10703
+ elapsed > 0 ? ` \xB7 ${formatDurationMs3(elapsed)}` : ""
10703
10704
  ] }),
10704
10705
  /* @__PURE__ */ jsx5(RecordingIndicator, {}),
10705
10706
  snapshot?.locked === true ? /* @__PURE__ */ jsxs3("span", { className: "mx-meet__badge", children: [
@@ -10716,8 +10717,8 @@ function MeetingRoomBody({
10716
10717
  ] });
10717
10718
  }
10718
10719
  function WaitingRoom({ roomName, host }) {
10719
- const knocked = useRef5(false);
10720
- useEffect5(() => {
10720
+ const knocked = useRef6(false);
10721
+ useEffect6(() => {
10721
10722
  if (knocked.current) return;
10722
10723
  knocked.current = true;
10723
10724
  host.meetings.knock(roomName);
@@ -10785,150 +10786,17 @@ function HostMenu() {
10785
10786
  end.notice !== null ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
10786
10787
  ] });
10787
10788
  }
10788
- function CallButton({
10789
- person,
10790
- mode = "video",
10791
- children
10792
- }) {
10793
- const calls = useCalls();
10794
- if (!calls.canCall) return null;
10795
- return /* @__PURE__ */ jsx5(
10796
- "button",
10797
- {
10798
- type: "button",
10799
- className: "mx-meet__call-button",
10800
- onClick: () => {
10801
- void calls.call([person.userId], mode);
10802
- },
10803
- "aria-label": `Call ${person.displayName}`,
10804
- children: children ?? /* @__PURE__ */ jsx5(PhoneIcon, { width: 18, height: 18 })
10805
- }
10806
- );
10807
- }
10808
- function IncomingCallHost() {
10809
- const calls = useCalls();
10810
- if (calls.incoming.length === 0) return null;
10811
- return /* @__PURE__ */ jsx5("div", { className: "mx-meet__ringing-stack", children: calls.incoming.map((invite) => /* @__PURE__ */ jsx5(IncomingCallCard, { invite }, invite.id)) });
10812
- }
10813
- function IncomingCallCard({ invite }) {
10814
- const calls = useCalls();
10815
- return /* @__PURE__ */ jsxs3("section", { className: "mx-meet__ringing", role: "alertdialog", "aria-label": "Incoming call", children: [
10816
- /* @__PURE__ */ jsx5(Avatar, { name: invite.callerName, url: invite.callerAvatarUrl, size: 56 }),
10817
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__ringing-text", children: [
10818
- /* @__PURE__ */ jsx5("strong", { children: invite.callerName }),
10819
- /* @__PURE__ */ jsx5("span", { children: invite.mode === "video" ? "Incoming video call" : "Incoming call" })
10820
- ] }),
10821
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__ringing-actions", children: [
10822
- /* @__PURE__ */ jsx5(ControlButton, { label: "Decline", danger: true, onClick: () => void calls.decline(invite), children: /* @__PURE__ */ jsx5(PhoneOffIcon, {}) }),
10823
- invite.mode === "video" ? /* @__PURE__ */ jsx5(
10824
- ControlButton,
10825
- {
10826
- label: "Accept without video",
10827
- onClick: () => void calls.accept({ ...invite, mode: "audio" }),
10828
- children: /* @__PURE__ */ jsx5(CameraOffIcon, {})
10829
- }
10830
- ) : null,
10831
- /* @__PURE__ */ jsx5(ControlButton, { label: "Accept", onClick: () => void calls.accept(invite), children: /* @__PURE__ */ jsx5(PhoneIcon, {}) })
10832
- ] })
10833
- ] });
10834
- }
10835
- function ScheduleMeeting(props) {
10836
- const host = useMeetHost();
10837
- if (host === null) return /* @__PURE__ */ jsx5(InertNotice, { what: "Scheduling a meeting" });
10838
- return /* @__PURE__ */ jsx5(ScheduleMeetingBody, { ...props, host });
10839
- }
10840
- function ScheduleMeetingBody({
10841
- appBaseUrl,
10842
- onScheduled,
10843
- host
10844
- }) {
10845
- const [title, setTitle] = useState4("");
10846
- const [when2, setWhen] = useState4("");
10847
- const [kind, setKind] = useState4("scheduled");
10848
- const [busy, setBusy] = useState4(false);
10849
- const [link, setLink] = useState4(null);
10850
- const [error, setError] = useState4(null);
10851
- const disabled = useMemo4(() => title.trim().length === 0 || busy, [title, busy]);
10852
- return /* @__PURE__ */ jsxs3(
10853
- "form",
10854
- {
10855
- className: "mx-meet__schedule",
10856
- onSubmit: (event) => {
10857
- event.preventDefault();
10858
- if (host.identity.userId === null) return;
10859
- setBusy(true);
10860
- setError(null);
10861
- void host.repository.getOrCreateMeeting({
10862
- organizationId: host.identity.organizationId,
10863
- hostUserId: host.identity.userId,
10864
- title: title.trim(),
10865
- kind,
10866
- scheduledFor: when2.length > 0 ? new Date(when2).toISOString() : null
10867
- }).then((meeting) => {
10868
- setLink(meetingLink(appBaseUrl, meeting.slug));
10869
- onScheduled?.(meeting.slug);
10870
- }).catch((thrown) => {
10871
- setError(
10872
- thrown.remedy ?? thrown.message ?? "The meeting could not be created."
10873
- );
10874
- }).finally(() => setBusy(false));
10875
- },
10876
- children: [
10877
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10878
- /* @__PURE__ */ jsx5("span", { className: "mx-meet__field-label", children: "Title" }),
10879
- /* @__PURE__ */ jsx5(
10880
- "input",
10881
- {
10882
- className: "mx-meet__input",
10883
- value: title,
10884
- onChange: (event) => setTitle(event.target.value),
10885
- placeholder: "Weekly sync"
10886
- }
10887
- )
10888
- ] }),
10889
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10890
- /* @__PURE__ */ jsx5("span", { className: "mx-meet__field-label", children: "When" }),
10891
- /* @__PURE__ */ jsx5(
10892
- "input",
10893
- {
10894
- className: "mx-meet__input",
10895
- type: "datetime-local",
10896
- value: when2,
10897
- onChange: (event) => setWhen(event.target.value)
10898
- }
10899
- )
10900
- ] }),
10901
- /* @__PURE__ */ jsxs3("label", { className: "mx-meet__field", children: [
10902
- /* @__PURE__ */ jsx5("span", { className: "mx-meet__field-label", children: "Repeats" }),
10903
- /* @__PURE__ */ jsxs3(
10904
- "select",
10905
- {
10906
- className: "mx-meet__select",
10907
- value: kind,
10908
- onChange: (event) => setKind(event.target.value),
10909
- children: [
10910
- /* @__PURE__ */ jsx5("option", { value: "scheduled", children: "Once" }),
10911
- /* @__PURE__ */ jsx5("option", { value: "recurring", children: "Recurring \u2014 one link, every time" })
10912
- ]
10913
- }
10914
- )
10915
- ] }),
10916
- /* @__PURE__ */ jsx5("button", { type: "submit", className: "mx-meet__primary", disabled, children: busy ? "Creating\u2026" : "Create meeting" }),
10917
- link !== null ? /* @__PURE__ */ jsxs3("p", { className: "mx-meet__link-out", children: [
10918
- /* @__PURE__ */ jsx5("span", { children: "Anyone with this link can join \u2014 no account needed." }),
10919
- /* @__PURE__ */ jsx5("code", { children: link })
10920
- ] }) : null,
10921
- error !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__error", children: error }) : null
10922
- ]
10923
- }
10924
- );
10925
- }
10926
10789
  function ReactionOverlay({
10927
10790
  reactions
10928
10791
  }) {
10929
10792
  if (reactions.length === 0) return null;
10930
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)) });
10931
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" });
10799
+ }
10932
10800
  function GuestRecordAccessControl({
10933
10801
  meeting
10934
10802
  }) {
@@ -10969,15 +10837,20 @@ function GuestRecordAccessControl({
10969
10837
  ] }) : null
10970
10838
  ] });
10971
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";
10972
10845
  function MeetingRecordView({
10973
10846
  meeting,
10974
10847
  onRejoin
10975
10848
  }) {
10976
10849
  const host = useMeetHost();
10977
10850
  if (host === null) {
10978
- return /* @__PURE__ */ jsx5("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsx5(InertNotice, { what: "This meeting record" }) });
10851
+ return /* @__PURE__ */ jsx6("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsx6(InertNotice, { what: "This meeting record" }) });
10979
10852
  }
10980
- return /* @__PURE__ */ jsx5(MeetingRecordBody, { meeting, ...onRejoin !== void 0 ? { onRejoin } : {} });
10853
+ return /* @__PURE__ */ jsx6(MeetingRecordBody, { meeting, ...onRejoin !== void 0 ? { onRejoin } : {} });
10981
10854
  }
10982
10855
  function MeetingRecordBody({
10983
10856
  meeting,
@@ -10985,19 +10858,19 @@ function MeetingRecordBody({
10985
10858
  }) {
10986
10859
  const host = useRequiredMeetHost();
10987
10860
  const record = useMeetingRecord(meeting);
10988
- const [question, setQuestion] = useState4("");
10989
- const [tab, setTab] = useState4("summary");
10861
+ const [question, setQuestion] = useState5("");
10862
+ const [tab, setTab] = useState5("summary");
10990
10863
  if (record.failure !== null) {
10991
- return /* @__PURE__ */ jsx5("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: [
10992
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-title", children: "This meeting record could not be opened" }),
10993
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-body", children: record.failure.message }),
10994
- /* @__PURE__ */ jsx5("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 })
10995
10868
  ] }) });
10996
10869
  }
10997
10870
  if (record.loading || record.record === null) {
10998
- return /* @__PURE__ */ jsx5("div", { className: "mx-meet mx-meet--record", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
10999
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-title", children: "Opening the meeting record\u2026" }),
11000
- /* @__PURE__ */ jsx5("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." })
11001
10874
  ] }) });
11002
10875
  }
11003
10876
  const bundle = record.record;
@@ -11016,44 +10889,44 @@ function MeetingRecordBody({
11016
10889
  );
11017
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;
11018
10891
  if (entirelyRestricted) {
11019
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet mx-meet--record", children: [
11020
- /* @__PURE__ */ jsx5("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-head-inner", children: [
11021
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
11022
- /* @__PURE__ */ jsx5("h1", { className: "mx-meet__record-title", children: meeting.title }),
11023
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
11024
- onRejoin !== void 0 ? /* @__PURE__ */ jsx5("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
11025
10898
  ] }) }),
11026
- /* @__PURE__ */ jsx5("div", { className: "mx-meet__record-body", children: restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-access", role: "status", children: [
11027
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-access-title", children: "About this record" }),
11028
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-access-message", children: notice2.message }),
11029
- /* @__PURE__ */ jsx5("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 })
11030
10903
  ] }, notice2.parts.join("-"))) })
11031
10904
  ] });
11032
10905
  }
11033
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet mx-meet--record", children: [
11034
- /* @__PURE__ */ jsx5("header", { className: "mx-meet__record-head", children: /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-head-inner", children: [
11035
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-eyebrow", children: "Meeting record" }),
11036
- /* @__PURE__ */ jsx5("h1", { className: "mx-meet__record-title", children: meeting.title }),
11037
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-when", children: meetingWhen(meeting) }),
11038
- onRejoin !== void 0 ? /* @__PURE__ */ jsx5("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
11039
10912
  ] }) }),
11040
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-body", children: [
11041
- restrictionNotices.map((notice2) => /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-access", role: "status", children: [
11042
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-access-title", children: "About this record" }),
11043
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__record-access-message", children: notice2.message }),
11044
- /* @__PURE__ */ jsx5("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 })
11045
10918
  ] }, notice2.parts.join("-"))),
11046
10919
  attended.length === 0 ? (
11047
10920
  /* NOT SILENCE. A refused attendance read used to remove the whole
11048
10921
  section, so the reader could not tell "nobody" from "not shown". */
11049
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
11050
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
11051
- /* @__PURE__ */ jsx5("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.") })
11052
10925
  ] })
11053
- ) : /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Who attended", children: [
11054
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Who attended" }),
11055
- /* @__PURE__ */ jsx5("ul", { className: "mx-meet__record-attendees", children: attended.map((person) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__record-attendee", children: [
11056
- /* @__PURE__ */ jsx5(
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(
11057
10930
  Avatar,
11058
10931
  {
11059
10932
  name: displayNameFor(bundle.names, person.identity, person.displayName),
@@ -11061,26 +10934,26 @@ function MeetingRecordBody({
11061
10934
  size: 28
11062
10935
  }
11063
10936
  ),
11064
- /* @__PURE__ */ jsxs3("span", { className: "mx-meet__person-name", children: [
10937
+ /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
11065
10938
  displayNameFor(bundle.names, person.identity, person.displayName),
11066
- person.role === "host" ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Host" }) : null,
11067
- person.role === "guest" ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Guest" }) : null,
11068
- person.isAgent ? /* @__PURE__ */ jsx5("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
11069
10942
  ] })
11070
10943
  ] }, person.id)) })
11071
10944
  ] }),
11072
- bundle.recording !== null ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section mx-meet__recording-card", "aria-label": "Recording", children: [
11073
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
11074
- fileId !== null ? /* @__PURE__ */ jsxs3(Fragment, { children: [
11075
- /* @__PURE__ */ jsx5(RecordingPlayer, { fileId }),
11076
- notice !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: notice }) : null
11077
- ] }) : /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: notice ?? "This recording has no file." })
11078
- ] }) : wasRefused(bundle, "recording") ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Recording", children: [
11079
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Recording" }),
11080
- /* @__PURE__ */ jsx5("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 })
11081
10954
  ] }) : null,
11082
- /* @__PURE__ */ jsxs3("nav", { className: "mx-meet__record-tabs", "aria-label": "Meeting record sections", children: [
11083
- /* @__PURE__ */ jsx5(
10955
+ /* @__PURE__ */ jsxs4("nav", { className: "mx-meet__record-tabs", "aria-label": "Meeting record sections", children: [
10956
+ /* @__PURE__ */ jsx6(
11084
10957
  "button",
11085
10958
  {
11086
10959
  type: "button",
@@ -11090,7 +10963,7 @@ function MeetingRecordBody({
11090
10963
  children: "Summary & decisions"
11091
10964
  }
11092
10965
  ),
11093
- /* @__PURE__ */ jsx5(
10966
+ /* @__PURE__ */ jsx6(
11094
10967
  "button",
11095
10968
  {
11096
10969
  type: "button",
@@ -11100,7 +10973,7 @@ function MeetingRecordBody({
11100
10973
  children: "Notes as it happened"
11101
10974
  }
11102
10975
  ),
11103
- /* @__PURE__ */ jsx5(
10976
+ /* @__PURE__ */ jsx6(
11104
10977
  "button",
11105
10978
  {
11106
10979
  type: "button",
@@ -11111,15 +10984,15 @@ function MeetingRecordBody({
11111
10984
  }
11112
10985
  )
11113
10986
  ] }),
11114
- tab === "summary" ? /* @__PURE__ */ jsxs3(Fragment, { children: [
11115
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Summary", children: [
11116
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Summary" }),
11117
- wrapUp.state === "written" ? /* @__PURE__ */ jsx5("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: [
11118
- /* @__PURE__ */ jsx5("p", { children: wrapUp.message }),
11119
- /* @__PURE__ */ jsx5("button", { type: "button", className: "mx-meet__link", onClick: record.reload, children: "Check again" })
11120
- ] }) : /* @__PURE__ */ jsx5("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 })
11121
10994
  ] }),
11122
- /* @__PURE__ */ jsx5(
10995
+ /* @__PURE__ */ jsx6(
11123
10996
  NoteList,
11124
10997
  {
11125
10998
  title: "Decisions",
@@ -11131,7 +11004,7 @@ function MeetingRecordBody({
11131
11004
  )
11132
11005
  }
11133
11006
  ),
11134
- /* @__PURE__ */ jsx5(
11007
+ /* @__PURE__ */ jsx6(
11135
11008
  NoteList,
11136
11009
  {
11137
11010
  title: "Action items",
@@ -11144,42 +11017,42 @@ function MeetingRecordBody({
11144
11017
  }
11145
11018
  )
11146
11019
  ] }) : null,
11147
- tab === "notes" ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Notes as it happened", children: [
11148
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Notes as it happened" }),
11149
- bundle.liveNotes.length === 0 ? /* @__PURE__ */ jsx5("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(
11150
11023
  bundle,
11151
11024
  "notes",
11152
11025
  "No live notes are available for this meeting."
11153
- ) }) : /* @__PURE__ */ jsx5("ul", { className: "mx-meet__notes", children: bundle.liveNotes.map((note) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__note", children: [
11154
- 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: [
11155
11028
  "Window ",
11156
11029
  note.window
11157
11030
  ] }) : null,
11158
11031
  note.text
11159
11032
  ] }, note.id)) })
11160
11033
  ] }) : null,
11161
- tab === "transcript" ? /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Transcript", children: [
11162
- /* @__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: [
11163
11036
  "Transcript",
11164
- /* @__PURE__ */ jsx5("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` })
11165
11038
  ] }),
11166
- blocks.length === 0 ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: absenceSentence(
11039
+ blocks.length === 0 ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__panel-note", children: absenceSentence(
11167
11040
  bundle,
11168
11041
  "transcript",
11169
11042
  "No transcript is available for this meeting."
11170
- ) }) : /* @__PURE__ */ jsx5("ol", { className: "mx-meet__record-transcript", children: blocks.map((block) => /* @__PURE__ */ jsxs3("li", { className: "mx-meet__record-block", children: [
11171
- /* @__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: [
11172
11045
  block.speaker,
11173
- /* @__PURE__ */ jsx5("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) })
11174
11047
  ] }),
11175
- block.lines.map((line) => /* @__PURE__ */ jsx5("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))
11176
11049
  ] }, block.id)) })
11177
11050
  ] }) : null,
11178
- /* @__PURE__ */ jsx5(GuestRecordAccessControl, { meeting }),
11179
- /* @__PURE__ */ jsxs3("section", { className: "mx-meet__record-section", "aria-label": "Ask about this meeting", children: [
11180
- /* @__PURE__ */ jsx5("h2", { className: "mx-meet__record-section-title", children: "Ask about this meeting" }),
11181
- guestFinishedMeeting ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__panel-note", children: "Sign in to ask the assistant about a meeting after it ends." }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
11182
- /* @__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(
11183
11056
  "form",
11184
11057
  {
11185
11058
  className: "mx-meet__composer",
@@ -11190,7 +11063,7 @@ function MeetingRecordBody({
11190
11063
  void record.ask(trimmed);
11191
11064
  },
11192
11065
  children: [
11193
- /* @__PURE__ */ jsx5(
11066
+ /* @__PURE__ */ jsx6(
11194
11067
  "input",
11195
11068
  {
11196
11069
  className: "mx-meet__input",
@@ -11200,7 +11073,7 @@ function MeetingRecordBody({
11200
11073
  "aria-label": "Ask about this meeting"
11201
11074
  }
11202
11075
  ),
11203
- /* @__PURE__ */ jsx5(
11076
+ /* @__PURE__ */ jsx6(
11204
11077
  "button",
11205
11078
  {
11206
11079
  type: "submit",
@@ -11212,8 +11085,8 @@ function MeetingRecordBody({
11212
11085
  ]
11213
11086
  }
11214
11087
  ),
11215
- record.answer !== null ? /* @__PURE__ */ jsx5("p", { className: "mx-meet__answer", children: record.answer }) : null,
11216
- 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: [
11217
11090
  "Answered from ",
11218
11091
  record.coverage.segmentsUsed,
11219
11092
  " of ",
@@ -11224,9 +11097,9 @@ function MeetingRecordBody({
11224
11097
  record.coverage.truncated ? " (the oldest were left out)" : "",
11225
11098
  "."
11226
11099
  ] }) : null,
11227
- record.askError !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error: record.askError, operation: "Ask about this meeting", origin: "meet/components", children: [
11228
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: record.askError.message }),
11229
- /* @__PURE__ */ jsx5("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 })
11230
11103
  ] }) : null
11231
11104
  ] })
11232
11105
  ] })
@@ -11237,21 +11110,21 @@ var STREAM_REFUSED = "Streaming playback did not start, so this recording was do
11237
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.";
11238
11111
  function RecordingPlayer(props) {
11239
11112
  const host = useMeetHost();
11240
- if (host === null) return /* @__PURE__ */ jsx5(InertNotice, { what: "This recording" });
11241
- return /* @__PURE__ */ jsx5(RecordingPlayerBody, { ...props, host });
11113
+ if (host === null) return /* @__PURE__ */ jsx6(InertNotice, { what: "This recording" });
11114
+ return /* @__PURE__ */ jsx6(RecordingPlayerBody, { ...props, host });
11242
11115
  }
11243
11116
  function RecordingPlayerBody({ fileId, host }) {
11244
- const [media, setMedia] = useState4(null);
11245
- const [loading, setLoading] = useState4(false);
11246
- const [error, setError] = useState4(null);
11247
- useEffect5(() => {
11117
+ const [media, setMedia] = useState5(null);
11118
+ const [loading, setLoading] = useState5(false);
11119
+ const [error, setError] = useState5(null);
11120
+ useEffect7(() => {
11248
11121
  if (media === null || media.kind !== "bytes") return void 0;
11249
11122
  const url = media.url;
11250
11123
  return () => URL.revokeObjectURL(url);
11251
11124
  }, [media]);
11252
11125
  if (media !== null) {
11253
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-section", children: [
11254
- /* @__PURE__ */ jsx5(
11126
+ return /* @__PURE__ */ jsxs4("div", { className: "mx-meet__record-section", children: [
11127
+ /* @__PURE__ */ jsx6(
11255
11128
  "video",
11256
11129
  {
11257
11130
  className: "mx-meet__record-player",
@@ -11293,15 +11166,15 @@ function RecordingPlayerBody({ fileId, host }) {
11293
11166
  }
11294
11167
  }
11295
11168
  ),
11296
- media.fallbackReason !== null ? /* @__PURE__ */ jsx5("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
11297
11170
  ] });
11298
11171
  }
11299
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__record-section", children: [
11300
- error !== null ? /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__refusal", error, operation: "Complete this meeting action", origin: "meet/components", children: [
11301
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__refusal-reason", children: error.message }),
11302
- /* @__PURE__ */ jsx5("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 })
11303
11176
  ] }) : null,
11304
- /* @__PURE__ */ jsx5(
11177
+ /* @__PURE__ */ jsx6(
11305
11178
  "button",
11306
11179
  {
11307
11180
  type: "button",
@@ -11329,45 +11202,84 @@ function RecordingPlayerBody({ fileId, host }) {
11329
11202
  )
11330
11203
  ] });
11331
11204
  }
11332
- function clockOf(iso) {
11333
- const at = new Date(iso);
11334
- if (Number.isNaN(at.getTime())) return "";
11335
- return at.toLocaleTimeString(void 0, { hour: "numeric", minute: "2-digit" });
11336
- }
11337
- function MeetingList({ baseUrl }) {
11205
+
11206
+ // src/react/skin-root.tsx
11207
+ import { jsx as jsx7 } from "react/jsx-runtime";
11208
+ function MeetingSkinRoot(props) {
11338
11209
  const host = useMeetHost();
11339
- const list = useMeetings();
11340
- if (host === null) return /* @__PURE__ */ jsx5(InertNotice, { what: "Your meetings" });
11341
- if (list.failure !== null) {
11342
- return /* @__PURE__ */ jsxs3(ErrorBox, { as: "div", className: "mx-meet__empty", error: list.failure, operation: "List your meetings", origin: "meet/components", children: [
11343
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-title", children: "Your meetings could not be listed" }),
11344
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-body", children: list.failure.message }),
11345
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-body", children: list.failure.remedy })
11346
- ] });
11347
- }
11348
- if (list.loading) {
11349
- return /* @__PURE__ */ jsx5("div", { className: "mx-meet__empty", role: "status", children: /* @__PURE__ */ jsx5("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" }) }) });
11350
11212
  }
11351
- if (list.meetings.length === 0) {
11352
- return /* @__PURE__ */ jsxs3("div", { className: "mx-meet__empty", role: "status", children: [
11353
- /* @__PURE__ */ jsx5("p", { className: "mx-meet__empty-title", children: "No meetings yet" }),
11354
- /* @__PURE__ */ jsx5("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." })
11355
- ] });
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 });
11356
11242
  }
11357
- const origin = baseUrl ?? (typeof window === "undefined" ? "" : window.location.origin);
11358
- return /* @__PURE__ */ jsx5("ul", { className: "mx-meet-list", children: list.meetings.map((meeting) => {
11359
- const ended = meeting.endedAt !== null;
11360
- return /* @__PURE__ */ jsxs3("li", { className: "mx-meet-list__row", children: [
11361
- /* @__PURE__ */ jsxs3("div", { className: "mx-meet-list__main", children: [
11362
- /* @__PURE__ */ jsxs3("span", { className: "mx-meet-list__title", children: [
11363
- meeting.title,
11364
- ended ? /* @__PURE__ */ jsx5("span", { className: "mx-meet__badge", children: "Ended" }) : null
11365
- ] }),
11366
- /* @__PURE__ */ jsx5("span", { className: "mx-meet-list__when", children: meetingWhen(meeting) })
11367
- ] }),
11368
- /* @__PURE__ */ jsx5("a", { className: "mx-meet-list__action", href: meetingLink(origin, meeting.slug), children: ended ? "Open the record" : "Join" })
11369
- ] }, meeting.id);
11370
- }) });
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
+ ] });
11371
11283
  }
11372
11284
 
11373
11285
  // src/core/invitations.ts
@@ -11522,54 +11434,26 @@ async function pushMeetingToGoogleCalendar(api, meetingId, target) {
11522
11434
  }
11523
11435
  export {
11524
11436
  ATTENDANCE_CSV_HEADER,
11525
- ActivitiesControl,
11526
- ActivitiesIcon,
11527
- AiPanel,
11528
- AttendanceNotice,
11529
- Avatar,
11530
- BreakoutBanner,
11531
- BreakoutIcon,
11532
- BreakoutsPanel,
11533
11437
  CALL_INVITE_KIND,
11534
11438
  CALL_INVITE_VERSION,
11535
11439
  CAPTION_LANGUAGES,
11536
11440
  CONSENT_NOTICE_ATTRIBUTE,
11537
- CallButton,
11538
- CameraIcon,
11539
- CameraOffIcon,
11540
- CaptionLanguageSettings,
11541
- Captions,
11542
- ChatIcon,
11543
- ChatPanel,
11544
- CheckIcon,
11545
- CloseIcon,
11546
- ConnectionDot,
11547
- ConsentNotice,
11548
- ControlBar,
11549
- ControlButton,
11550
11441
  DATA_TOPICS,
11551
11442
  DEFAULT_EFFECTS,
11552
11443
  DEFAULT_PAGE_SIZE,
11553
11444
  EMPTY_COLLAB,
11554
11445
  END_MEETING_NOT_SERVED,
11555
11446
  FILE_SESSION_PATH,
11556
- FlagIcon,
11557
11447
  GUEST_RECORD_ACCESS_CHOICES,
11558
11448
  GUEST_RECORD_ACCESS_LEVELS,
11559
11449
  GUEST_RECORD_ACCESS_METADATA_KEY,
11560
11450
  GUEST_RECORD_NOT_SHARED,
11561
11451
  GuestRecordAccessControl,
11562
- HandIcon,
11563
- HostMenu,
11564
11452
  IDLE_MEDIA,
11565
11453
  IDLE_TRACK,
11566
11454
  IncomingCallCard,
11567
11455
  IncomingCallHost,
11568
- KeyboardIcon,
11569
11456
  LISTEN_ONLY_NOTICE,
11570
- LayoutIcon,
11571
- LobbyPanel,
11572
- LockIcon,
11573
11457
  MEETING_INVITE_KIND,
11574
11458
  MEETING_INVITE_VERSION,
11575
11459
  MEETING_RECORD_GRACE_MS,
@@ -11584,33 +11468,14 @@ export {
11584
11468
  MeetError,
11585
11469
  MeetProvider,
11586
11470
  MeetRoot,
11587
- MeetingList,
11588
- MeetingOverlays,
11589
11471
  MeetingRecordView,
11590
- MeetingRoom,
11591
- MicIcon,
11592
- MicOffIcon,
11593
- MoreIcon,
11472
+ MeetingSkinRoot,
11594
11473
  NOTE_TAKER_IDENTITY_PREFIX,
11595
11474
  NOTE_TAKER_METADATA_KEY,
11596
11475
  NO_GRANTS,
11597
11476
  ORGANIZATION_HEADER,
11598
11477
  PARTICIPANT_CAN_RECORD_ATTRIBUTE,
11599
11478
  PARTICIPANT_ROLE_ATTRIBUTE,
11600
- ParticipantTile,
11601
- PencilIcon,
11602
- PeopleIcon,
11603
- PeoplePanel,
11604
- PersonMenu,
11605
- PhoneIcon,
11606
- PhoneOffIcon,
11607
- PinIcon,
11608
- PollIcon,
11609
- PollsPanel,
11610
- PreJoin,
11611
- QaPanel,
11612
- QualityBars,
11613
- QuestionIcon,
11614
11479
  REACTION_TTL_MS,
11615
11480
  REFUSED_ABSENCE,
11616
11481
  ROLE_RANK,
@@ -11618,30 +11483,13 @@ export {
11618
11483
  ROOM_EVENT_PREFIX,
11619
11484
  ROOM_TOKEN_HEADER,
11620
11485
  RPCS,
11621
- ReactionOverlay,
11622
- RecordIcon,
11623
- RecordingIndicator,
11624
11486
  RecordingPlayer,
11625
- ScheduleMeeting,
11626
- ScreenShareIcon,
11627
- SearchIcon,
11628
- SettingsIcon,
11629
- SettingsPanel,
11630
- ShortcutsSheet,
11631
- SignalIcon,
11632
- SmileIcon,
11633
- SparklesIcon,
11634
- SpeakerIcon,
11635
- SpotlightIcon,
11636
- Stage,
11637
11487
  TABLES,
11638
11488
  TRANSCRIPTION_ATTRIBUTES,
11639
11489
  TRANSCRIPTION_TOPIC,
11640
- WhiteboardIcon,
11641
- WhiteboardPanel,
11642
- WifiLowIcon,
11643
11490
  absenceSentence,
11644
11491
  activeWrapUpSummary,
11492
+ activityAttention,
11645
11493
  announceMeeting,
11646
11494
  applyCollabPacket,
11647
11495
  applyRoomEvent,
@@ -11658,6 +11506,7 @@ export {
11658
11506
  attendanceTotals,
11659
11507
  attendeeKey,
11660
11508
  autoAssign,
11509
+ availableActivities,
11661
11510
  breakoutRemainingMs,
11662
11511
  callInviteAction,
11663
11512
  callInviteText,
@@ -11730,6 +11579,8 @@ export {
11730
11579
  mergeCaption,
11731
11580
  mergeRecord,
11732
11581
  microphoneNoticeCode,
11582
+ moveToRoom,
11583
+ nextTranslationBatch,
11733
11584
  normalizeDeviceError,
11734
11585
  normalizeMeetError,
11735
11586
  normalizeSpoken,
@@ -11746,6 +11597,7 @@ export {
11746
11597
  parseRoomToken,
11747
11598
  participantAttributes,
11748
11599
  participantSummary,
11600
+ performCollab,
11749
11601
  playableRecordingFileId,
11750
11602
  projectInvitee,
11751
11603
  projectLibraryRecording,
@@ -11768,15 +11620,20 @@ export {
11768
11620
  rootAttributes,
11769
11621
  searchTranscript,
11770
11622
  sendFollowUp,
11623
+ setCaptionLanguage,
11771
11624
  setGuestRecordAccess,
11772
11625
  settingsPatch,
11773
11626
  snapshotParticipant,
11774
11627
  snippetRuns,
11775
11628
  staticObservation,
11776
11629
  summarizeMeetingRecordRestrictions,
11630
+ takeMoveRequest,
11631
+ takePanelRequest,
11777
11632
  transcriptDocument,
11778
11633
  unavailableFrom,
11779
11634
  uniqueAttendees,
11635
+ untranslatedLines,
11636
+ useActivityAttention,
11780
11637
  useAudioLevel,
11781
11638
  useAvailableActivities,
11782
11639
  useCalls,
@@ -11801,6 +11658,7 @@ export {
11801
11658
  useLocalUserId,
11802
11659
  useMediaEffects,
11803
11660
  useMeetAi,
11661
+ useMeetCore,
11804
11662
  useMeetHost,
11805
11663
  useMeetShortcuts,
11806
11664
  useMeetSnapshot,