@ai-matrx/meet 0.7.75 → 0.7.76

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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog — `@ai-matrx/meet`
2
2
 
3
+ ## 0.7.76
4
+
5
+ **The pre-join lobby is the design system, not a second one.** Before this, the
6
+ lobby rendered native `<select>`, `<input type="checkbox">` and pill `<button>`s
7
+ styled by this package's own CSS, so the first screen of every meeting looked
8
+ like a different product, and its settings column was `0.8fr` of the screen
9
+ (≈1,000px wide on a 2560px display, Join button stranded at the far edge).
10
+
11
+ - Device pickers (`DevicePicker`, also used in the in-room settings) are the
12
+ design-system `Select`; noise suppression and the join toggles are `Checkbox`
13
+ + `Label`; the background choice is `SegmentedControl`; Test and Join now are
14
+ `Button`; the recording-consent notice is `Alert` (`info`).
15
+ - Layout: the settings column holds at 300–400px and the composition centres
16
+ inside 1,200px.
17
+ - Guard: `components.test.tsx` "the pre-join lobby renders design-system
18
+ controls, never native ones" (fails on 0.7.75, passes here).
19
+
20
+ Consumer action: none.
21
+
3
22
  ## 0.7.75
4
23
 
5
24
  Automatic changed-only republish (docs/metadata drift since the last tag — see
package/dist/react.cjs CHANGED
@@ -9849,38 +9849,40 @@ function EffectsSettings({ preview }) {
9849
9849
  }
9850
9850
  };
9851
9851
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "mx-meet__section", "aria-label": "Effects", children: [
9852
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
9852
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__check", children: [
9853
9853
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
9854
- "input",
9854
+ import_design_system.Checkbox,
9855
9855
  {
9856
- type: "checkbox",
9856
+ id: "mx-meet-noise",
9857
9857
  checked: effects.effects.noiseSuppression,
9858
- onChange: (event) => apply({ noiseSuppression: event.target.checked })
9858
+ onCheckedChange: (checked) => apply({ noiseSuppression: checked === true })
9859
9859
  }
9860
9860
  ),
9861
- "Noise suppression",
9862
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
9861
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__check-text", children: [
9862
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
9863
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
9864
+ ] })
9863
9865
  ] }),
9864
9866
  supported ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__field", children: [
9865
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: "Background" }),
9866
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-meet__pills", role: "radiogroup", "aria-label": "Background", children: ["none", "blur", "image"].map((kind) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
9867
- "button",
9867
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Label, { children: "Background" }),
9868
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
9869
+ import_design_system.SegmentedControl,
9868
9870
  {
9869
- type: "button",
9870
- role: "radio",
9871
- "aria-checked": effects.effects.background === kind,
9872
- className: effects.effects.background === kind ? "mx-meet__pill mx-meet__pill--on" : "mx-meet__pill",
9873
- onClick: () => {
9871
+ value: effects.effects.background,
9872
+ onValueChange: (kind) => {
9874
9873
  if (kind === "image") {
9875
9874
  fileRef.current?.click();
9876
9875
  return;
9877
9876
  }
9878
9877
  apply({ background: kind });
9879
9878
  },
9880
- children: kind === "none" ? "None" : kind === "blur" ? "Blur" : "Picture\u2026"
9881
- },
9882
- kind
9883
- )) }),
9879
+ data: [
9880
+ { value: "none", label: "None" },
9881
+ { value: "blur", label: "Blur" },
9882
+ { value: "image", label: "Picture\u2026" }
9883
+ ]
9884
+ }
9885
+ ),
9884
9886
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
9885
9887
  "input",
9886
9888
  {
@@ -10264,10 +10266,10 @@ function PreJoinBody({
10264
10266
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__field-row", children: [
10265
10267
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
10266
10268
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10267
- "button",
10269
+ import_design_system.Button,
10268
10270
  {
10269
10271
  type: "button",
10270
- className: "mx-meet__chip",
10272
+ variant: "outline",
10271
10273
  disabled: speakerTesting,
10272
10274
  onClick: () => {
10273
10275
  setSpeakerTesting(true);
@@ -10276,7 +10278,7 @@ function PreJoinBody({
10276
10278
  );
10277
10279
  },
10278
10280
  children: [
10279
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SpeakerIcon, { width: 14, height: 14 }),
10281
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SpeakerIcon, {}),
10280
10282
  " ",
10281
10283
  speakerTesting ? "Playing\u2026" : "Test"
10282
10284
  ]
@@ -10285,35 +10287,36 @@ function PreJoinBody({
10285
10287
  ] }),
10286
10288
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(DevicePicker, { kind: "videoinput", label: "Camera" }),
10287
10289
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(EffectsSettings, { preview: preview.preview }),
10288
- recording.consentNotice !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mx-meet__consent", children: recording.consentNotice }) : null,
10290
+ recording.consentNotice !== null ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Alert, { variant: "info", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.AlertDescription, { children: recording.consentNotice }) }) : null,
10289
10291
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__prejoin-actions", children: [
10290
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
10292
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__check", children: [
10291
10293
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10292
- "input",
10294
+ import_design_system.Checkbox,
10293
10295
  {
10294
- type: "checkbox",
10296
+ id: "mx-meet-join-video",
10295
10297
  checked: mode === "video",
10296
- onChange: (event) => setMode(event.target.checked ? "video" : "audio")
10298
+ onCheckedChange: (checked) => setMode(checked === true ? "video" : "audio")
10297
10299
  }
10298
10300
  ),
10299
- "Join with video"
10301
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
10300
10302
  ] }),
10301
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__toggle", children: [
10303
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__check", children: [
10302
10304
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10303
- "input",
10305
+ import_design_system.Checkbox,
10304
10306
  {
10305
- type: "checkbox",
10307
+ id: "mx-meet-join-mic",
10306
10308
  checked: microphone,
10307
- onChange: (event) => setMicrophone(event.target.checked)
10309
+ onCheckedChange: (checked) => setMicrophone(checked === true)
10308
10310
  }
10309
10311
  ),
10310
- "Join with microphone"
10312
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
10311
10313
  ] }),
10312
10314
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10313
- "button",
10315
+ import_design_system.Button,
10314
10316
  {
10315
10317
  type: "button",
10316
- className: "mx-meet__primary",
10318
+ className: "mx-meet__join",
10319
+ disabled: joining,
10317
10320
  onClick: () => {
10318
10321
  setJoining(true);
10319
10322
  preview.release();
@@ -10386,18 +10389,24 @@ function DevicePicker({
10386
10389
  const devices = useDeviceSnapshot();
10387
10390
  const list = devices?.devices[kind] ?? [];
10388
10391
  if (list.length === 0) return null;
10389
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "mx-meet__field", children: [
10390
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "mx-meet__field-label", children: label }),
10391
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10392
- "select",
10392
+ const triggerId = `mx-meet-device-${kind}`;
10393
+ const valueOf = (deviceId2) => deviceId2.length > 0 ? deviceId2 : "default";
10394
+ const current = devices?.selected[kind] ?? host.devices.resolve(kind) ?? "";
10395
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-meet__field", children: [
10396
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.Label, { htmlFor: triggerId, children: label }),
10397
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10398
+ import_design_system.Select,
10393
10399
  {
10394
- className: "mx-meet__select",
10395
- value: devices?.selected[kind] ?? host.devices.resolve(kind) ?? "",
10396
- onChange: (event) => {
10397
- if (onPick !== void 0) onPick(kind, event.target.value);
10398
- else host.devices.select(kind, event.target.value);
10400
+ ...current.length > 0 ? { value: valueOf(current) } : {},
10401
+ onValueChange: (value) => {
10402
+ const deviceId2 = list.find((device) => valueOf(device.deviceId) === value)?.deviceId ?? value;
10403
+ if (onPick !== void 0) onPick(kind, deviceId2);
10404
+ else host.devices.select(kind, deviceId2);
10399
10405
  },
10400
- children: list.map((device) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: device.deviceId, children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId))
10406
+ children: [
10407
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.SelectValue, { placeholder: label }) }),
10408
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.SelectContent, { children: list.map((device) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_design_system.SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
10409
+ ]
10401
10410
  }
10402
10411
  )
10403
10412
  ] });