@linto-ai/transcript-ui-webcomponent 0.9.23-unstable.202609181617 → 0.9.23

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.
@@ -3542,6 +3542,23 @@ function renderList(source, renderItem, cache, index) {
3542
3542
  }
3543
3543
  return ret;
3544
3544
  }
3545
+ function createSlots(slots, dynamicSlots) {
3546
+ for (let i2 = 0; i2 < dynamicSlots.length; i2++) {
3547
+ const slot = dynamicSlots[i2];
3548
+ if (isArray(slot)) {
3549
+ for (let j = 0; j < slot.length; j++) {
3550
+ slots[slot[j].name] = slot[j].fn;
3551
+ }
3552
+ } else if (slot) {
3553
+ slots[slot.name] = slot.key ? (...args) => {
3554
+ const res = slot.fn(...args);
3555
+ if (res) res.key = slot.key;
3556
+ return res;
3557
+ } : slot.fn;
3558
+ }
3559
+ }
3560
+ return slots;
3561
+ }
3545
3562
  function renderSlot(slots, name, props, fallback, noSlotted, branchKey) {
3546
3563
  if (props == null) props = {};
3547
3564
  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {
@@ -9549,8 +9566,8 @@ function useCore() {
9549
9566
  }
9550
9567
  return core;
9551
9568
  }
9552
- const _hoisted_1$H = ["aria-label"];
9553
- const _sfc_main$O = /* @__PURE__ */ defineComponent({
9569
+ const _hoisted_1$I = ["aria-label"];
9570
+ const _sfc_main$Q = /* @__PURE__ */ defineComponent({
9554
9571
  __name: "Badge",
9555
9572
  props: {
9556
9573
  ariaLabel: { type: String }
@@ -9562,11 +9579,11 @@ const _sfc_main$O = /* @__PURE__ */ defineComponent({
9562
9579
  "aria-label": __props.ariaLabel
9563
9580
  }, [
9564
9581
  renderSlot(_ctx.$slots, "default", {}, void 0, true)
9565
- ], 8, _hoisted_1$H);
9582
+ ], 8, _hoisted_1$I);
9566
9583
  };
9567
9584
  }
9568
9585
  });
9569
- const _style_0$G = "\n.editor-badge[data-v-392808cc] {\n display: inline-flex;\n align-items: center;\n padding: 2px var(--spacing-sm);\n font-size: var(--font-size-xs);\n font-weight: 500;\n color: var(--color-text-muted);\n background-color: var(--color-surface);\n border: 1px solid var(--color-border-light);\n border-radius: var(--radius-sm);\n white-space: nowrap;\n}\n";
9586
+ const _style_0$H = "\n.editor-badge[data-v-392808cc] {\n display: inline-flex;\n align-items: center;\n padding: 2px var(--spacing-sm);\n font-size: var(--font-size-xs);\n font-weight: 500;\n color: var(--color-text-muted);\n background-color: var(--color-surface);\n border: 1px solid var(--color-border-light);\n border-radius: var(--radius-sm);\n white-space: nowrap;\n}\n";
9570
9587
  const _export_sfc = (sfc, props) => {
9571
9588
  const target = sfc.__vccOpts || sfc;
9572
9589
  for (const [key, val] of props) {
@@ -9574,7 +9591,7 @@ const _export_sfc = (sfc, props) => {
9574
9591
  }
9575
9592
  return target;
9576
9593
  };
9577
- const Badge = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["styles", [_style_0$G]], ["__scopeId", "data-v-392808cc"]]);
9594
+ const Badge = /* @__PURE__ */ _export_sfc(_sfc_main$Q, [["styles", [_style_0$H]], ["__scopeId", "data-v-392808cc"]]);
9578
9595
  const hasA11yProp = (props) => {
9579
9596
  for (const prop in props) {
9580
9597
  if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
@@ -10037,12 +10054,12 @@ const ICON_SIZES = {
10037
10054
  md: 20,
10038
10055
  lg: 24
10039
10056
  };
10040
- const _hoisted_1$G = {
10057
+ const _hoisted_1$H = {
10041
10058
  key: 1,
10042
10059
  class: "editor-icon editor-icon--missing",
10043
10060
  "aria-hidden": "true"
10044
10061
  };
10045
- const _sfc_main$N = /* @__PURE__ */ defineComponent({
10062
+ const _sfc_main$P = /* @__PURE__ */ defineComponent({
10046
10063
  __name: "EditorIcon",
10047
10064
  props: {
10048
10065
  name: { type: String },
@@ -10061,18 +10078,18 @@ const _sfc_main$N = /* @__PURE__ */ defineComponent({
10061
10078
  style: normalizeStyle(style.value),
10062
10079
  class: normalizeClass(["editor-icon", { "editor-icon--spin": __props.spin }]),
10063
10080
  "aria-hidden": "true"
10064
- }, null, 8, ["style", "class"])) : (openBlock(), createElementBlock("span", _hoisted_1$G, "?"));
10081
+ }, null, 8, ["style", "class"])) : (openBlock(), createElementBlock("span", _hoisted_1$H, "?"));
10065
10082
  };
10066
10083
  }
10067
10084
  });
10068
- const _style_0$F = "\n.editor-icon[data-v-bdd2a2df] {\n flex-shrink: 0;\n}\n.editor-icon--missing[data-v-bdd2a2df] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n opacity: 0.5;\n font-size: 1em;\n line-height: 1;\n}\n.editor-icon--spin[data-v-bdd2a2df] {\n animation: editor-icon-spin-bdd2a2df 1s linear infinite;\n}\n@keyframes editor-icon-spin-bdd2a2df {\nto {\n transform: rotate(360deg);\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.editor-icon--spin[data-v-bdd2a2df] {\n animation: none;\n}\n}\n";
10069
- const EditorIcon = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["styles", [_style_0$F]], ["__scopeId", "data-v-bdd2a2df"]]);
10070
- const _hoisted_1$F = ["type", "disabled", "aria-disabled", "aria-label"];
10071
- const _hoisted_2$v = {
10085
+ const _style_0$G = "\n.editor-icon[data-v-bdd2a2df] {\n flex-shrink: 0;\n}\n.editor-icon--missing[data-v-bdd2a2df] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n opacity: 0.5;\n font-size: 1em;\n line-height: 1;\n}\n.editor-icon--spin[data-v-bdd2a2df] {\n animation: editor-icon-spin-bdd2a2df 1s linear infinite;\n}\n@keyframes editor-icon-spin-bdd2a2df {\nto {\n transform: rotate(360deg);\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.editor-icon--spin[data-v-bdd2a2df] {\n animation: none;\n}\n}\n";
10086
+ const EditorIcon = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["styles", [_style_0$G]], ["__scopeId", "data-v-bdd2a2df"]]);
10087
+ const _hoisted_1$G = ["type", "disabled", "aria-disabled", "aria-label"];
10088
+ const _hoisted_2$w = {
10072
10089
  key: 3,
10073
10090
  class: "editor-btn__label"
10074
10091
  };
10075
- const _sfc_main$M = /* @__PURE__ */ defineComponent({
10092
+ const _sfc_main$O = /* @__PURE__ */ defineComponent({
10076
10093
  __name: "Button",
10077
10094
  props: {
10078
10095
  label: { type: String },
@@ -10125,7 +10142,7 @@ const _sfc_main$M = /* @__PURE__ */ defineComponent({
10125
10142
  name: __props.icon,
10126
10143
  size: iconSize.value
10127
10144
  }, null, 8, ["name", "size"])) : _ctx.$slots.icon ? renderSlot(_ctx.$slots, "icon", {}, void 0, true, 2) : createCommentVNode("", true),
10128
- hasLabel.value ? (openBlock(), createElementBlock("span", _hoisted_2$v, [
10145
+ hasLabel.value ? (openBlock(), createElementBlock("span", _hoisted_2$w, [
10129
10146
  renderSlot(_ctx.$slots, "default", {}, () => [
10130
10147
  createTextVNode(toDisplayString(__props.label), 1)
10131
10148
  ], true)
@@ -10135,13 +10152,13 @@ const _sfc_main$M = /* @__PURE__ */ defineComponent({
10135
10152
  name: __props.iconRight,
10136
10153
  size: iconSize.value
10137
10154
  }, null, 8, ["name", "size"])) : _ctx.$slots["icon-right"] ? renderSlot(_ctx.$slots, "icon-right", {}, void 0, true, 5) : createCommentVNode("", true)
10138
- ], 10, _hoisted_1$F);
10155
+ ], 10, _hoisted_1$G);
10139
10156
  };
10140
10157
  }
10141
10158
  });
10142
- const _style_0$E = "\n.transcript-ui-root .editor-btn[data-v-050bd95b] {\n /* Default tokens — overridden by variant/intent/size modifiers */\n --btn-bg: transparent;\n --btn-text: var(--color-text-secondary);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-sm);\n --btn-font-size: var(--font-size-xs);\n --btn-height: 32px;\n --btn-gap: var(--spacing-xs);\n\n /* Same reset as every other custom button in this codebase (see\n EditableText, EditorCheckbox, Tabs, SpeakerPopover, TranscriptionTurn):\n `all: unset` clears the UA button chrome (margin, appearance, inherited\n font mismatches on Safari/Firefox, the Firefox ::-moz-focus-inner\n padding) that the previous per-property overrides below left in place.\n Every property the button actually needs is re-declared after it. */\n all: unset;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--btn-gap);\n height: var(--btn-height);\n padding: var(--btn-padding-y) var(--btn-padding-x);\n font-family: var(--font-family);\n font-size: var(--btn-font-size);\n font-weight: 500;\n line-height: 1;\n color: var(--btn-text);\n background-color: var(--btn-bg);\n border: 1px solid var(--btn-border-color);\n border-radius: var(--radius-sm);\n cursor: pointer;\n white-space: nowrap;\n transition:\n background-color var(--transition-duration),\n color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:hover:not(:disabled) {\n background-color: var(--btn-hover-bg);\n color: var(--btn-hover-text);\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n/* Note: this rule is repeated lower in the file (after variants) to win the\n cascade on the variant CSS vars. Keep this lightweight version for the\n cursor and hover suppression. */\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled {\n cursor: not-allowed;\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled:hover {\n background-color: var(--btn-bg);\n color: var(--btn-text);\n}\n.editor-btn__label[data-v-050bd95b] {\n /* //overflow: hidden;\n text-overflow: ellipsis; */\n text-overflow: ellipsis;\n text-box: cap alphabetic;\n}\n\n/* Sizes.\n .transcript-ui-root prefix here too — not because Nextcloud could ever\n target --btn-* directly, but because these vars are read by the BASE\n .editor-btn rule (also prefixed, so specificity (0,3,0)): if a variant\n rule sets the same custom property at a lower specificity (0,2,0), the\n base rule's default wins over it regardless of source order, silently\n breaking every variant. All rules touching --btn-* must stay at the same\n specificity as the base rule. */\n.transcript-ui-root .editor-btn--sm[data-v-050bd95b] {\n /* defaults */\n}\n.transcript-ui-root .editor-btn--md[data-v-050bd95b] {\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-md);\n --btn-font-size: var(--font-size-sm);\n --btn-height: 40px;\n}\n.transcript-ui-root .editor-btn--lg[data-v-050bd95b] {\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-md);\n --btn-font-size: var(--font-size-base);\n --btn-height: 44px;\n}\n\n/* Icon-only: square */\n.transcript-ui-root .editor-btn--icon-only[data-v-050bd95b] {\n width: var(--btn-height);\n padding: 0;\n}\n.transcript-ui-root .editor-btn--block[data-v-050bd95b] {\n display: flex;\n width: 100%;\n}\n\n/* Variants — default intent */\n.transcript-ui-root .editor-btn--primary[data-v-050bd95b] {\n --btn-bg: var(--color-primary);\n --btn-text: var(--color-white);\n --btn-border-color: var(--color-primary);\n --btn-hover-bg: var(--color-primary-hover);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--secondary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-primary);\n --btn-border-color: var(--color-primary);\n --btn-hover-bg: var(--color-primary);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--tertiary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-text-primary);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n}\n.transcript-ui-root .editor-btn--transparent[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-text-secondary);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n}\n\n/* Literal theme inversion: background = the theme's text color and\n vice-versa — high contrast in both light and dark themes without\n borrowing the primary color's semantics. */\n.transcript-ui-root .editor-btn--inverse[data-v-050bd95b] {\n --btn-bg: var(--color-text-primary);\n --btn-text: var(--color-background);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-text-secondary);\n --btn-hover-text: var(--color-background);\n}\n\n/* Destructive intent overrides */\n.transcript-ui-root .editor-btn--destructive.editor-btn--primary[data-v-050bd95b] {\n --btn-bg: var(--color-danger);\n --btn-text: var(--color-white);\n --btn-border-color: var(--color-danger);\n --btn-hover-bg: var(--color-danger-hover);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--destructive.editor-btn--secondary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-danger);\n --btn-border-color: var(--color-danger);\n --btn-hover-bg: var(--color-danger);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--destructive.editor-btn--tertiary[data-v-050bd95b],\n.transcript-ui-root .editor-btn--destructive.editor-btn--transparent[data-v-050bd95b] {\n --btn-text: var(--color-danger);\n --btn-hover-bg: var(--color-danger-soft);\n --btn-hover-text: var(--color-danger);\n}\n\n/* Disabled: gray-out regardless of variant. Placed after the variants so the\n CSS var overrides win the cascade (same specificity, last declaration). */\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled {\n --btn-bg: var(--color-surface);\n --btn-text: var(--color-text-muted);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface);\n --btn-hover-text: var(--color-text-muted);\n}\n\n/* The transparent variant has no chrome when enabled — disabling it must not\n ADD a box; the muted text alone carries the disabled signal. */\n.transcript-ui-root .editor-btn--transparent[data-v-050bd95b]:disabled {\n --btn-bg: transparent;\n --btn-border-color: transparent;\n --btn-hover-bg: transparent;\n}\n\n/* Inverse stays a filled, borderless chip when disabled — dimmed, but the\n silhouette must not change. */\n.transcript-ui-root .editor-btn--inverse[data-v-050bd95b]:disabled {\n --btn-bg: var(--color-surface-hover);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-surface-hover);\n}\n";
10143
- const Button = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["styles", [_style_0$E]], ["__scopeId", "data-v-050bd95b"]]);
10144
- const _sfc_main$L = /* @__PURE__ */ defineComponent({
10159
+ const _style_0$F = "\n.transcript-ui-root .editor-btn[data-v-050bd95b] {\n /* Default tokens — overridden by variant/intent/size modifiers */\n --btn-bg: transparent;\n --btn-text: var(--color-text-secondary);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-sm);\n --btn-font-size: var(--font-size-xs);\n --btn-height: 32px;\n --btn-gap: var(--spacing-xs);\n\n /* Same reset as every other custom button in this codebase (see\n EditableText, EditorCheckbox, Tabs, SpeakerPopover, TranscriptionTurn):\n `all: unset` clears the UA button chrome (margin, appearance, inherited\n font mismatches on Safari/Firefox, the Firefox ::-moz-focus-inner\n padding) that the previous per-property overrides below left in place.\n Every property the button actually needs is re-declared after it. */\n all: unset;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--btn-gap);\n height: var(--btn-height);\n padding: var(--btn-padding-y) var(--btn-padding-x);\n font-family: var(--font-family);\n font-size: var(--btn-font-size);\n font-weight: 500;\n line-height: 1;\n color: var(--btn-text);\n background-color: var(--btn-bg);\n border: 1px solid var(--btn-border-color);\n border-radius: var(--radius-sm);\n cursor: pointer;\n white-space: nowrap;\n transition:\n background-color var(--transition-duration),\n color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:hover:not(:disabled) {\n background-color: var(--btn-hover-bg);\n color: var(--btn-hover-text);\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n/* Note: this rule is repeated lower in the file (after variants) to win the\n cascade on the variant CSS vars. Keep this lightweight version for the\n cursor and hover suppression. */\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled {\n cursor: not-allowed;\n}\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled:hover {\n background-color: var(--btn-bg);\n color: var(--btn-text);\n}\n.editor-btn__label[data-v-050bd95b] {\n /* //overflow: hidden;\n text-overflow: ellipsis; */\n text-overflow: ellipsis;\n text-box: cap alphabetic;\n}\n\n/* Sizes.\n .transcript-ui-root prefix here too — not because Nextcloud could ever\n target --btn-* directly, but because these vars are read by the BASE\n .editor-btn rule (also prefixed, so specificity (0,3,0)): if a variant\n rule sets the same custom property at a lower specificity (0,2,0), the\n base rule's default wins over it regardless of source order, silently\n breaking every variant. All rules touching --btn-* must stay at the same\n specificity as the base rule. */\n.transcript-ui-root .editor-btn--sm[data-v-050bd95b] {\n /* defaults */\n}\n.transcript-ui-root .editor-btn--md[data-v-050bd95b] {\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-md);\n --btn-font-size: var(--font-size-sm);\n --btn-height: 40px;\n}\n.transcript-ui-root .editor-btn--lg[data-v-050bd95b] {\n --btn-padding-y: 0;\n --btn-padding-x: var(--spacing-md);\n --btn-font-size: var(--font-size-base);\n --btn-height: 44px;\n}\n\n/* Icon-only: square */\n.transcript-ui-root .editor-btn--icon-only[data-v-050bd95b] {\n width: var(--btn-height);\n padding: 0;\n}\n.transcript-ui-root .editor-btn--block[data-v-050bd95b] {\n display: flex;\n width: 100%;\n}\n\n/* Variants — default intent */\n.transcript-ui-root .editor-btn--primary[data-v-050bd95b] {\n --btn-bg: var(--color-primary);\n --btn-text: var(--color-white);\n --btn-border-color: var(--color-primary);\n --btn-hover-bg: var(--color-primary-hover);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--secondary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-primary);\n --btn-border-color: var(--color-primary);\n --btn-hover-bg: var(--color-primary);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--tertiary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-text-primary);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n}\n.transcript-ui-root .editor-btn--transparent[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-text-secondary);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-surface-hover);\n --btn-hover-text: var(--color-text-primary);\n}\n\n/* Literal theme inversion: background = the theme's text color and\n vice-versa — high contrast in both light and dark themes without\n borrowing the primary color's semantics. */\n.transcript-ui-root .editor-btn--inverse[data-v-050bd95b] {\n --btn-bg: var(--color-text-primary);\n --btn-text: var(--color-background);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-text-secondary);\n --btn-hover-text: var(--color-background);\n}\n\n/* Destructive intent overrides */\n.transcript-ui-root .editor-btn--destructive.editor-btn--primary[data-v-050bd95b] {\n --btn-bg: var(--color-danger);\n --btn-text: var(--color-white);\n --btn-border-color: var(--color-danger);\n --btn-hover-bg: var(--color-danger-hover);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--destructive.editor-btn--secondary[data-v-050bd95b] {\n --btn-bg: transparent;\n --btn-text: var(--color-danger);\n --btn-border-color: var(--color-danger);\n --btn-hover-bg: var(--color-danger);\n --btn-hover-text: var(--color-white);\n}\n.transcript-ui-root .editor-btn--destructive.editor-btn--tertiary[data-v-050bd95b],\n.transcript-ui-root .editor-btn--destructive.editor-btn--transparent[data-v-050bd95b] {\n --btn-text: var(--color-danger);\n --btn-hover-bg: var(--color-danger-soft);\n --btn-hover-text: var(--color-danger);\n}\n\n/* Disabled: gray-out regardless of variant. Placed after the variants so the\n CSS var overrides win the cascade (same specificity, last declaration). */\n.transcript-ui-root .editor-btn[data-v-050bd95b]:disabled {\n --btn-bg: var(--color-surface);\n --btn-text: var(--color-text-muted);\n --btn-border-color: var(--color-border);\n --btn-hover-bg: var(--color-surface);\n --btn-hover-text: var(--color-text-muted);\n}\n\n/* The transparent variant has no chrome when enabled — disabling it must not\n ADD a box; the muted text alone carries the disabled signal. */\n.transcript-ui-root .editor-btn--transparent[data-v-050bd95b]:disabled {\n --btn-bg: transparent;\n --btn-border-color: transparent;\n --btn-hover-bg: transparent;\n}\n\n/* Inverse stays a filled, borderless chip when disabled — dimmed, but the\n silhouette must not change. */\n.transcript-ui-root .editor-btn--inverse[data-v-050bd95b]:disabled {\n --btn-bg: var(--color-surface-hover);\n --btn-border-color: transparent;\n --btn-hover-bg: var(--color-surface-hover);\n}\n";
10160
+ const Button = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["styles", [_style_0$F]], ["__scopeId", "data-v-050bd95b"]]);
10161
+ const _sfc_main$N = /* @__PURE__ */ defineComponent({
10145
10162
  __name: "CopyButton",
10146
10163
  props: {
10147
10164
  icon: { default: "copy", type: String },
@@ -10209,8 +10226,8 @@ const _sfc_main$L = /* @__PURE__ */ defineComponent({
10209
10226
  };
10210
10227
  }
10211
10228
  });
10212
- const _style_0$D = "\n.copy-btn--copied[data-v-5b088678] {\n color: var(--color-success, #2e7d32);\n}\n.copy-icon-enter-active[data-v-5b088678],\n.copy-icon-leave-active[data-v-5b088678] {\n transition:\n opacity var(--transition-duration) ease,\n scale var(--transition-duration) ease;\n}\n.copy-icon-enter-from[data-v-5b088678] {\n opacity: 0;\n scale: 0.6;\n}\n.copy-icon-leave-to[data-v-5b088678] {\n opacity: 0;\n scale: 0.6;\n}\n@media (prefers-reduced-motion: reduce) {\n.copy-icon-enter-active[data-v-5b088678],\n .copy-icon-leave-active[data-v-5b088678] {\n transition: none;\n}\n}\n";
10213
- const CopyButton = /* @__PURE__ */ _export_sfc(_sfc_main$L, [["styles", [_style_0$D]], ["__scopeId", "data-v-5b088678"]]);
10229
+ const _style_0$E = "\n.copy-btn--copied[data-v-5b088678] {\n color: var(--color-success, #2e7d32);\n}\n.copy-icon-enter-active[data-v-5b088678],\n.copy-icon-leave-active[data-v-5b088678] {\n transition:\n opacity var(--transition-duration) ease,\n scale var(--transition-duration) ease;\n}\n.copy-icon-enter-from[data-v-5b088678] {\n opacity: 0;\n scale: 0.6;\n}\n.copy-icon-leave-to[data-v-5b088678] {\n opacity: 0;\n scale: 0.6;\n}\n@media (prefers-reduced-motion: reduce) {\n.copy-icon-enter-active[data-v-5b088678],\n .copy-icon-leave-active[data-v-5b088678] {\n transition: none;\n}\n}\n";
10230
+ const CopyButton = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["styles", [_style_0$E]], ["__scopeId", "data-v-5b088678"]]);
10214
10231
  const fr = {
10215
10232
  "editor.loading": "Chargement…",
10216
10233
  "editor.loadError": "Erreur de chargement",
@@ -10527,10 +10544,10 @@ function useI18n() {
10527
10544
  locale: fallbackLocale
10528
10545
  };
10529
10546
  }
10530
- const _hoisted_1$E = { class: "code-block" };
10531
- const _hoisted_2$u = ["innerHTML"];
10532
- const _hoisted_3$n = { key: 1 };
10533
- const _sfc_main$K = /* @__PURE__ */ defineComponent({
10547
+ const _hoisted_1$F = { class: "code-block" };
10548
+ const _hoisted_2$v = ["innerHTML"];
10549
+ const _hoisted_3$o = { key: 1 };
10550
+ const _sfc_main$M = /* @__PURE__ */ defineComponent({
10534
10551
  __name: "CodeBlock",
10535
10552
  props: {
10536
10553
  code: { type: String },
@@ -10553,13 +10570,13 @@ const _sfc_main$K = /* @__PURE__ */ defineComponent({
10553
10570
  highlighted.value = null;
10554
10571
  return;
10555
10572
  }
10556
- const { highlightCode } = await import("./highlight-BL5JP0oD.js");
10573
+ const { highlightCode } = await import("./highlight-BQUzpb6U.js");
10557
10574
  if (run === seq) highlighted.value = highlightCode(code, lang ?? "");
10558
10575
  },
10559
10576
  { immediate: true }
10560
10577
  );
10561
10578
  return (_ctx, _cache) => {
10562
- return openBlock(), createElementBlock("div", _hoisted_1$E, [
10579
+ return openBlock(), createElementBlock("div", _hoisted_1$F, [
10563
10580
  !__props.streaming ? (openBlock(), createBlock(CopyButton, {
10564
10581
  key: 0,
10565
10582
  class: "code-block__copy",
@@ -10572,13 +10589,13 @@ const _sfc_main$K = /* @__PURE__ */ defineComponent({
10572
10589
  highlighted.value ? (openBlock(), createElementBlock("code", {
10573
10590
  key: 0,
10574
10591
  innerHTML: highlighted.value
10575
- }, null, 8, _hoisted_2$u)) : (openBlock(), createElementBlock("code", _hoisted_3$n, toDisplayString(__props.code), 1))
10592
+ }, null, 8, _hoisted_2$v)) : (openBlock(), createElementBlock("code", _hoisted_3$o, toDisplayString(__props.code), 1))
10576
10593
  ])
10577
10594
  ]);
10578
10595
  };
10579
10596
  }
10580
10597
  });
10581
- const _style_0$C = "\n.code-block[data-v-ad87d1e4] {\n position: relative;\n}\n.code-block__copy[data-v-ad87d1e4] {\n position: absolute;\n top: var(--spacing-xs);\n right: var(--spacing-xs);\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.code-block:hover .code-block__copy[data-v-ad87d1e4],\n.code-block:focus-within .code-block__copy[data-v-ad87d1e4] {\n opacity: 1;\n}\n.code-block pre[data-v-ad87d1e4] {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n border: 1px solid var(--color-border);\n}\n.code-block pre code[data-v-ad87d1e4] {\n padding: 0;\n background: none;\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n}\n@media (prefers-reduced-motion: reduce) {\n.code-block__copy[data-v-ad87d1e4] {\n transition: none;\n}\n}\n";
10598
+ const _style_0$D = "\n.code-block[data-v-ad87d1e4] {\n position: relative;\n}\n.code-block__copy[data-v-ad87d1e4] {\n position: absolute;\n top: var(--spacing-xs);\n right: var(--spacing-xs);\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.code-block:hover .code-block__copy[data-v-ad87d1e4],\n.code-block:focus-within .code-block__copy[data-v-ad87d1e4] {\n opacity: 1;\n}\n.code-block pre[data-v-ad87d1e4] {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n border: 1px solid var(--color-border);\n}\n.code-block pre code[data-v-ad87d1e4] {\n padding: 0;\n background: none;\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n}\n@media (prefers-reduced-motion: reduce) {\n.code-block__copy[data-v-ad87d1e4] {\n transition: none;\n}\n}\n";
10582
10599
  const _style_1 = `/**
10583
10600
  * prism.js default theme for JavaScript, CSS and HTML
10584
10601
  * Based on dabblet (http://dabblet.com)
@@ -10704,19 +10721,19 @@ pre[class*="language-"] {
10704
10721
  cursor: help;
10705
10722
  }
10706
10723
  `;
10707
- const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["styles", [_style_0$C, _style_1]], ["__scopeId", "data-v-ad87d1e4"]]);
10708
- const _hoisted_1$D = {
10724
+ const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["styles", [_style_0$D, _style_1]], ["__scopeId", "data-v-ad87d1e4"]]);
10725
+ const _hoisted_1$E = {
10709
10726
  key: 0,
10710
10727
  class: "form-field__header"
10711
10728
  };
10712
- const _hoisted_2$t = ["for"];
10713
- const _hoisted_3$m = {
10729
+ const _hoisted_2$u = ["for"];
10730
+ const _hoisted_3$n = {
10714
10731
  key: 0,
10715
10732
  class: "form-field__required",
10716
10733
  "aria-hidden": "true"
10717
10734
  };
10718
10735
  const _hoisted_4$e = { class: "form-field__input-wrapper" };
10719
- const _hoisted_5$c = ["id", "disabled", "required", "aria-required", "aria-invalid", "aria-describedby"];
10736
+ const _hoisted_5$d = ["id", "disabled", "required", "aria-required", "aria-invalid", "aria-describedby"];
10720
10737
  const _hoisted_6$b = ["value"];
10721
10738
  const _hoisted_7$5 = ["type", "id", "disabled", "readonly", "placeholder", "autocomplete", "required", "aria-required", "aria-invalid", "aria-describedby"];
10722
10739
  const _hoisted_8$3 = {
@@ -10729,8 +10746,8 @@ const _hoisted_9$3 = {
10729
10746
  "aria-hidden": "true"
10730
10747
  };
10731
10748
  const _hoisted_10$3 = ["id"];
10732
- const _hoisted_11$1 = { class: "form-field__error" };
10733
- const _sfc_main$J = /* @__PURE__ */ defineComponent({
10749
+ const _hoisted_11$2 = { class: "form-field__error" };
10750
+ const _sfc_main$L = /* @__PURE__ */ defineComponent({
10734
10751
  __name: "FormInput",
10735
10752
  props: {
10736
10753
  field: { type: Object },
@@ -10840,14 +10857,14 @@ const _sfc_main$J = /* @__PURE__ */ defineComponent({
10840
10857
  return openBlock(), createElementBlock("div", {
10841
10858
  class: normalizeClass(rootClasses.value)
10842
10859
  }, [
10843
- __props.field.label ? (openBlock(), createElementBlock("div", _hoisted_1$D, [
10860
+ __props.field.label ? (openBlock(), createElementBlock("div", _hoisted_1$E, [
10844
10861
  createBaseVNode("label", {
10845
10862
  class: "form-field__label",
10846
10863
  for: id.value
10847
10864
  }, [
10848
10865
  createTextVNode(toDisplayString(__props.field.label) + " ", 1),
10849
- isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$m, "*")) : createCommentVNode("", true)
10850
- ], 8, _hoisted_2$t),
10866
+ isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$n, "*")) : createCommentVNode("", true)
10867
+ ], 8, _hoisted_2$u),
10851
10868
  renderSlot(_ctx.$slots, "content-after-label", {}, void 0, true)
10852
10869
  ])) : createCommentVNode("", true),
10853
10870
  createBaseVNode("div", _hoisted_4$e, [
@@ -10878,7 +10895,7 @@ const _sfc_main$J = /* @__PURE__ */ defineComponent({
10878
10895
  value: opt.value
10879
10896
  }, toDisplayString(opt.label), 9, _hoisted_6$b);
10880
10897
  }), 128))
10881
- ], 16, _hoisted_5$c)), [
10898
+ ], 16, _hoisted_5$d)), [
10882
10899
  [vModelSelect, draft.value]
10883
10900
  ]) : withDirectives((openBlock(), createElementBlock("input", mergeProps({
10884
10901
  key: 2,
@@ -10931,16 +10948,16 @@ const _sfc_main$J = /* @__PURE__ */ defineComponent({
10931
10948
  id: `${id.value}-error`,
10932
10949
  class: "form-field__info"
10933
10950
  }, [
10934
- createBaseVNode("span", _hoisted_11$1, toDisplayString(errorMessage.value), 1)
10951
+ createBaseVNode("span", _hoisted_11$2, toDisplayString(errorMessage.value), 1)
10935
10952
  ], 8, _hoisted_10$3)) : createCommentVNode("", true)
10936
10953
  ], 2);
10937
10954
  };
10938
10955
  }
10939
10956
  });
10940
- const _style_0$B = "\n/* ── Root ──────────────────────────────────────────────────────────── */\n.form-field[data-v-863d0b18] {\n --field-height: 40px;\n --field-padding-x: var(--spacing-md);\n --field-font-size: var(--font-size-sm);\n\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n width: 100%;\n}\n.form-field--sm[data-v-863d0b18] {\n --field-height: 32px;\n --field-padding-x: var(--spacing-sm);\n --field-font-size: var(--font-size-xs);\n}\n.form-field--lg[data-v-863d0b18] {\n --field-height: 44px;\n --field-padding-x: var(--spacing-md);\n --field-font-size: var(--font-size-base);\n}\n.form-field--disabled[data-v-863d0b18] {\n opacity: 0.7;\n}\n\n/* ── Header (label row) ────────────────────────────────────────────── */\n.form-field__header[data-v-863d0b18] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-sm);\n}\n.form-field__label[data-v-863d0b18] {\n display: block;\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: 600;\n line-height: 1.2;\n color: var(--color-text-primary);\n}\n.form-field--error .form-field__label[data-v-863d0b18] {\n color: var(--color-danger);\n}\n.form-field__required[data-v-863d0b18] {\n margin-left: 2px;\n color: var(--color-danger);\n}\n\n/* ── Input wrapper ─────────────────────────────────────────────────── */\n.form-field__input-wrapper[data-v-863d0b18] {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-sm);\n width: 100%;\n}\n\n/* ── Input ─────────────────────────────────────────────────────────── */\n.form-field__input[data-v-863d0b18] {\n flex: 1;\n box-sizing: border-box;\n height: var(--field-height);\n padding: 0 var(--field-padding-x);\n font-family: inherit;\n font-size: var(--field-font-size);\n line-height: 1.4;\n color: var(--color-text-primary);\n background-color: var(--color-background);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-sm);\n outline: none;\n transition:\n border-color var(--transition-duration),\n box-shadow var(--transition-duration);\n}\n.form-field__input[data-v-863d0b18]::placeholder {\n color: var(--color-text-muted);\n opacity: 1;\n}\n.form-field__input[data-v-863d0b18]:hover:not(:disabled) {\n border-color: var(--color-text-muted);\n}\n.form-field__input[data-v-863d0b18]:focus-visible {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px\n color-mix(in srgb, var(--color-primary) 20%, transparent);\n}\n.form-field__input[data-v-863d0b18]:disabled {\n cursor: not-allowed;\n background-color: var(--color-surface);\n color: var(--color-text-muted);\n}\n.form-field__input--fullwidth[data-v-863d0b18] {\n width: 100%;\n max-width: none;\n}\n.form-field__input--select[data-v-863d0b18] {\n cursor: pointer;\n appearance: auto;\n}\n.form-field__input--error[data-v-863d0b18] {\n border-color: var(--color-danger);\n}\n.form-field__input--error[data-v-863d0b18]:focus-visible {\n border-color: var(--color-danger);\n box-shadow: 0 0 0 3px\n color-mix(in srgb, var(--color-danger) 20%, transparent);\n}\n\n/* ── Confirmation actions ──────────────────────────────────────────── */\n.form-field__actions[data-v-863d0b18] {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.form-field__actions--placeholder[data-v-863d0b18] {\n /* Reserve space so showing the buttons doesn't shift layout. */\n width: calc(var(--field-height) * 2 + var(--spacing-xs));\n height: var(--field-height);\n pointer-events: none;\n opacity: 0;\n}\n\n/* ── Info / error ──────────────────────────────────────────────────── */\n.form-field__info[data-v-863d0b18] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n.form-field__error[data-v-863d0b18] {\n margin: 0;\n font-size: var(--font-size-xs);\n line-height: 1.2;\n color: var(--color-danger);\n}\n\n/* ── Inline layout ─────────────────────────────────────────────────── */\n.form-field--inline[data-v-863d0b18] {\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-md);\n}\n.form-field--inline .form-field__header[data-v-863d0b18] {\n flex-shrink: 0;\n min-width: 120px;\n}\n.form-field--inline .form-field__input-wrapper[data-v-863d0b18] {\n flex: 1;\n}\n\n/* ── Reduced motion ────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n.form-field__input[data-v-863d0b18] {\n transition: none;\n}\n}\n";
10941
- const FormInput = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["styles", [_style_0$B]], ["__scopeId", "data-v-863d0b18"]]);
10942
- const _hoisted_1$C = ["disabled", "aria-label"];
10943
- const _sfc_main$I = /* @__PURE__ */ defineComponent({
10957
+ const _style_0$C = "\n/* ── Root ──────────────────────────────────────────────────────────── */\n.form-field[data-v-863d0b18] {\n --field-height: 40px;\n --field-padding-x: var(--spacing-md);\n --field-font-size: var(--font-size-sm);\n\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n width: 100%;\n}\n.form-field--sm[data-v-863d0b18] {\n --field-height: 32px;\n --field-padding-x: var(--spacing-sm);\n --field-font-size: var(--font-size-xs);\n}\n.form-field--lg[data-v-863d0b18] {\n --field-height: 44px;\n --field-padding-x: var(--spacing-md);\n --field-font-size: var(--font-size-base);\n}\n.form-field--disabled[data-v-863d0b18] {\n opacity: 0.7;\n}\n\n/* ── Header (label row) ────────────────────────────────────────────── */\n.form-field__header[data-v-863d0b18] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-sm);\n}\n.form-field__label[data-v-863d0b18] {\n display: block;\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: 600;\n line-height: 1.2;\n color: var(--color-text-primary);\n}\n.form-field--error .form-field__label[data-v-863d0b18] {\n color: var(--color-danger);\n}\n.form-field__required[data-v-863d0b18] {\n margin-left: 2px;\n color: var(--color-danger);\n}\n\n/* ── Input wrapper ─────────────────────────────────────────────────── */\n.form-field__input-wrapper[data-v-863d0b18] {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-sm);\n width: 100%;\n}\n\n/* ── Input ─────────────────────────────────────────────────────────── */\n.form-field__input[data-v-863d0b18] {\n flex: 1;\n box-sizing: border-box;\n height: var(--field-height);\n padding: 0 var(--field-padding-x);\n font-family: inherit;\n font-size: var(--field-font-size);\n line-height: 1.4;\n color: var(--color-text-primary);\n background-color: var(--color-background);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-sm);\n outline: none;\n transition:\n border-color var(--transition-duration),\n box-shadow var(--transition-duration);\n}\n.form-field__input[data-v-863d0b18]::placeholder {\n color: var(--color-text-muted);\n opacity: 1;\n}\n.form-field__input[data-v-863d0b18]:hover:not(:disabled) {\n border-color: var(--color-text-muted);\n}\n.form-field__input[data-v-863d0b18]:focus-visible {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px\n color-mix(in srgb, var(--color-primary) 20%, transparent);\n}\n.form-field__input[data-v-863d0b18]:disabled {\n cursor: not-allowed;\n background-color: var(--color-surface);\n color: var(--color-text-muted);\n}\n.form-field__input--fullwidth[data-v-863d0b18] {\n width: 100%;\n max-width: none;\n}\n.form-field__input--select[data-v-863d0b18] {\n cursor: pointer;\n appearance: auto;\n}\n.form-field__input--error[data-v-863d0b18] {\n border-color: var(--color-danger);\n}\n.form-field__input--error[data-v-863d0b18]:focus-visible {\n border-color: var(--color-danger);\n box-shadow: 0 0 0 3px\n color-mix(in srgb, var(--color-danger) 20%, transparent);\n}\n\n/* ── Confirmation actions ──────────────────────────────────────────── */\n.form-field__actions[data-v-863d0b18] {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.form-field__actions--placeholder[data-v-863d0b18] {\n /* Reserve space so showing the buttons doesn't shift layout. */\n width: calc(var(--field-height) * 2 + var(--spacing-xs));\n height: var(--field-height);\n pointer-events: none;\n opacity: 0;\n}\n\n/* ── Info / error ──────────────────────────────────────────────────── */\n.form-field__info[data-v-863d0b18] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n.form-field__error[data-v-863d0b18] {\n margin: 0;\n font-size: var(--font-size-xs);\n line-height: 1.2;\n color: var(--color-danger);\n}\n\n/* ── Inline layout ─────────────────────────────────────────────────── */\n.form-field--inline[data-v-863d0b18] {\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-md);\n}\n.form-field--inline .form-field__header[data-v-863d0b18] {\n flex-shrink: 0;\n min-width: 120px;\n}\n.form-field--inline .form-field__input-wrapper[data-v-863d0b18] {\n flex: 1;\n}\n\n/* ── Reduced motion ────────────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n.form-field__input[data-v-863d0b18] {\n transition: none;\n}\n}\n";
10958
+ const FormInput = /* @__PURE__ */ _export_sfc(_sfc_main$L, [["styles", [_style_0$C]], ["__scopeId", "data-v-863d0b18"]]);
10959
+ const _hoisted_1$D = ["disabled", "aria-label"];
10960
+ const _sfc_main$K = /* @__PURE__ */ defineComponent({
10944
10961
  __name: "EditableText",
10945
10962
  props: {
10946
10963
  modelValue: { type: String },
@@ -11014,12 +11031,12 @@ const _sfc_main$I = /* @__PURE__ */ defineComponent({
11014
11031
  disabled: __props.disabled,
11015
11032
  "aria-label": __props.ariaLabel,
11016
11033
  onClick: startEdit
11017
- }, toDisplayString(__props.modelValue || __props.placeholder), 9, _hoisted_1$C));
11034
+ }, toDisplayString(__props.modelValue || __props.placeholder), 9, _hoisted_1$D));
11018
11035
  };
11019
11036
  }
11020
11037
  });
11021
- const _style_0$A = "\n.transcript-ui-root .editable-text-display[data-v-ff6456c8] {\n all: unset;\n cursor: text;\n text-align: left;\n font: inherit;\n color: inherit;\n line-height: inherit;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n min-width: 0;\n}\n.transcript-ui-root .editable-text-display[data-v-ff6456c8]:not(:disabled):hover {\n border-color: var(--color-border);\n}\n.transcript-ui-root .editable-text-display[data-v-ff6456c8]:disabled {\n cursor: default;\n}\n";
11022
- const EditableText = /* @__PURE__ */ _export_sfc(_sfc_main$I, [["styles", [_style_0$A]], ["__scopeId", "data-v-ff6456c8"]]);
11038
+ const _style_0$B = "\n.transcript-ui-root .editable-text-display[data-v-ff6456c8] {\n all: unset;\n cursor: text;\n text-align: left;\n font: inherit;\n color: inherit;\n line-height: inherit;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n min-width: 0;\n}\n.transcript-ui-root .editable-text-display[data-v-ff6456c8]:not(:disabled):hover {\n border-color: var(--color-border);\n}\n.transcript-ui-root .editable-text-display[data-v-ff6456c8]:disabled {\n cursor: default;\n}\n";
11039
+ const EditableText = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["styles", [_style_0$B]], ["__scopeId", "data-v-ff6456c8"]]);
11023
11040
  function serialize(input) {
11024
11041
  if (typeof input === "string") return `'${input}'`;
11025
11042
  return new Serializer().serialize(input);
@@ -15436,7 +15453,7 @@ function useFloating(reference, floating, options) {
15436
15453
  update
15437
15454
  };
15438
15455
  }
15439
- const _hoisted_1$B = ["dir"];
15456
+ const _hoisted_1$C = ["dir"];
15440
15457
  const PopperContentPropsDefaultValue = {
15441
15458
  side: "bottom",
15442
15459
  sideOffset: 0,
@@ -15729,7 +15746,7 @@ var PopperContent_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
15729
15746
  "data-align",
15730
15747
  "dir",
15731
15748
  "style"
15732
- ]))], 12, _hoisted_1$B);
15749
+ ]))], 12, _hoisted_1$C);
15733
15750
  };
15734
15751
  }
15735
15752
  });
@@ -17547,7 +17564,7 @@ var DropdownMenuTrigger_vue_vue_type_script_setup_true_lang_default = /* @__PURE
17547
17564
  }
17548
17565
  });
17549
17566
  var DropdownMenuTrigger_default = DropdownMenuTrigger_vue_vue_type_script_setup_true_lang_default;
17550
- const _sfc_main$H = /* @__PURE__ */ defineComponent({
17567
+ const _sfc_main$J = /* @__PURE__ */ defineComponent({
17551
17568
  __name: "EditorCheckbox",
17552
17569
  props: {
17553
17570
  modelValue: { type: Boolean },
@@ -17580,8 +17597,8 @@ const _sfc_main$H = /* @__PURE__ */ defineComponent({
17580
17597
  };
17581
17598
  }
17582
17599
  });
17583
- const _style_0$z = '\n.transcript-ui-root .checkbox[data-v-ed0978f7] {\n all: unset;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-sm);\n background-color: var(--color-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition:\n background-color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .checkbox[data-v-ed0978f7]:hover {\n border-color: var(--color-primary);\n}\n.transcript-ui-root .checkbox[data-v-ed0978f7]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.transcript-ui-root .checkbox[data-state="checked"][data-v-ed0978f7] {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n}\n.checkbox-indicator[data-v-ed0978f7] {\n color: var(--color-white, #fff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n';
17584
- const EditorCheckbox = /* @__PURE__ */ _export_sfc(_sfc_main$H, [["styles", [_style_0$z]], ["__scopeId", "data-v-ed0978f7"]]);
17600
+ const _style_0$A = '\n.transcript-ui-root .checkbox[data-v-ed0978f7] {\n all: unset;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-sm);\n background-color: var(--color-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition:\n background-color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .checkbox[data-v-ed0978f7]:hover {\n border-color: var(--color-primary);\n}\n.transcript-ui-root .checkbox[data-v-ed0978f7]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.transcript-ui-root .checkbox[data-state="checked"][data-v-ed0978f7] {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n}\n.checkbox-indicator[data-v-ed0978f7] {\n color: var(--color-white, #fff);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n';
17601
+ const EditorCheckbox = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["styles", [_style_0$A]], ["__scopeId", "data-v-ed0978f7"]]);
17585
17602
  function extend(destination) {
17586
17603
  for (var i2 = 1; i2 < arguments.length; i2++) {
17587
17604
  var source = arguments[i2];
@@ -21180,17 +21197,23 @@ function renderMarkdownSegments(md) {
21180
21197
  const tokens = f$1.lexer(md);
21181
21198
  const segments = [];
21182
21199
  let buffer = [];
21183
- const flush = () => {
21200
+ function renderGroup(group) {
21201
+ const list = group;
21202
+ list.links = tokens.links;
21203
+ return purify.sanitize(f$1.parser(list));
21204
+ }
21205
+ function flush() {
21184
21206
  if (buffer.length === 0) return;
21185
- const group = buffer;
21186
- group.links = tokens.links;
21187
- segments.push({ type: "html", html: purify.sanitize(f$1.parser(group)) });
21207
+ segments.push({ type: "html", html: renderGroup(buffer) });
21188
21208
  buffer = [];
21189
- };
21209
+ }
21190
21210
  for (const token of tokens) {
21191
21211
  if (token.type === "code") {
21192
21212
  flush();
21193
21213
  segments.push({ type: "code", code: token.text, lang: token.lang ?? "" });
21214
+ } else if (token.type === "table") {
21215
+ flush();
21216
+ segments.push({ type: "table", html: renderGroup([token]) });
21194
21217
  } else {
21195
21218
  buffer.push(token);
21196
21219
  }
@@ -21227,10 +21250,10 @@ function getSelectionFocus(container) {
21227
21250
  function getShadowRootSelection(root2) {
21228
21251
  return root2.getSelection?.() ?? null;
21229
21252
  }
21230
- const _hoisted_1$A = { class: "markdown-editor" };
21231
- const _hoisted_2$s = ["aria-label"];
21232
- const _hoisted_3$l = ["contenteditable"];
21233
- const _sfc_main$G = /* @__PURE__ */ defineComponent({
21253
+ const _hoisted_1$B = { class: "markdown-editor" };
21254
+ const _hoisted_2$t = ["aria-label"];
21255
+ const _hoisted_3$m = ["contenteditable"];
21256
+ const _sfc_main$I = /* @__PURE__ */ defineComponent({
21234
21257
  __name: "MarkdownEditor",
21235
21258
  props: {
21236
21259
  modelValue: { type: String },
@@ -21451,7 +21474,7 @@ const _sfc_main$G = /* @__PURE__ */ defineComponent({
21451
21474
  }
21452
21475
  );
21453
21476
  return (_ctx, _cache) => {
21454
- return openBlock(), createElementBlock("div", _hoisted_1$A, [
21477
+ return openBlock(), createElementBlock("div", _hoisted_1$B, [
21455
21478
  !__props.disabled ? (openBlock(), createElementBlock("div", {
21456
21479
  key: 0,
21457
21480
  class: "markdown-editor__toolbar",
@@ -21562,7 +21585,7 @@ const _sfc_main$G = /* @__PURE__ */ defineComponent({
21562
21585
  title: unref(t2)("mdToolbar.redo"),
21563
21586
  onClick: _cache[8] || (_cache[8] = ($event) => execCmd("redo"))
21564
21587
  }, null, 8, ["aria-label", "title"])
21565
- ], 8, _hoisted_2$s)) : createCommentVNode("", true),
21588
+ ], 8, _hoisted_2$t)) : createCommentVNode("", true),
21566
21589
  createBaseVNode("div", {
21567
21590
  ref: "editorEl",
21568
21591
  class: "markdown-editor__content",
@@ -21572,16 +21595,17 @@ const _sfc_main$G = /* @__PURE__ */ defineComponent({
21572
21595
  onPaste,
21573
21596
  onFocus: startSelectionListener,
21574
21597
  onBlur: stopSelectionListener
21575
- }, null, 40, _hoisted_3$l)
21598
+ }, null, 40, _hoisted_3$m)
21576
21599
  ]);
21577
21600
  };
21578
21601
  }
21579
21602
  });
21580
- const _style_0$y = "\n.markdown-editor[data-v-d9e8bd29] {\n display: flex;\n flex-direction: column;\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n}\n.markdown-editor__toolbar[data-v-d9e8bd29] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n position: sticky;\n top: var(--document-toolbar-height, 49px);\n z-index: 1;\n}\n.markdown-editor__separator[data-v-d9e8bd29] {\n width: 1px;\n height: 20px;\n background-color: var(--color-border);\n margin: 0 var(--spacing-xs);\n}\n.markdown-editor__content[data-v-d9e8bd29] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n outline: none;\n min-height: 200px;\n}\n.markdown-editor__content[data-v-d9e8bd29] > *:first-child {\n margin-top: 0;\n}\n.markdown-editor__content[data-v-d9e8bd29] h1,\n.markdown-editor__content[data-v-d9e8bd29] h2,\n.markdown-editor__content[data-v-d9e8bd29] h3,\n.markdown-editor__content[data-v-d9e8bd29] h4 {\n margin: var(--spacing-lg) 0 var(--spacing-sm);\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.markdown-editor__content[data-v-d9e8bd29] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-editor__content[data-v-d9e8bd29] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-editor__content[data-v-d9e8bd29] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-editor__content[data-v-d9e8bd29] h4 {\n font-size: var(--font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-secondary);\n}\n.markdown-editor__content[data-v-d9e8bd29] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-editor__content[data-v-d9e8bd29] ul,\n.markdown-editor__content[data-v-d9e8bd29] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-editor__content[data-v-d9e8bd29] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-editor__content[data-v-d9e8bd29] blockquote {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-sm) var(--spacing-md);\n border-left: 3px solid var(--color-border);\n color: var(--color-text-secondary);\n font-style: italic;\n}\n.markdown-editor__content[data-v-d9e8bd29] code {\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n padding: 1px 4px;\n background-color: var(--color-surface);\n border-radius: var(--radius-sm);\n}\n.markdown-editor__content[data-v-d9e8bd29] pre {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n}\n.markdown-editor__content[data-v-d9e8bd29] pre code {\n padding: 0;\n background: none;\n}\n.markdown-editor__content[data-v-d9e8bd29] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-editor__content[data-v-d9e8bd29] hr {\n border: 0;\n border-top: 1px solid var(--color-border);\n margin: var(--spacing-lg) 0;\n}\n.markdown-editor__content[data-v-d9e8bd29] strong {\n font-weight: 700;\n}\n.markdown-editor__content[data-v-d9e8bd29] table {\n border-collapse: collapse;\n margin: var(--spacing-md) 0;\n}\n.markdown-editor__content[data-v-d9e8bd29] th,\n.markdown-editor__content[data-v-d9e8bd29] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-editor__content[data-v-d9e8bd29] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21581
- const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["styles", [_style_0$y]], ["__scopeId", "data-v-d9e8bd29"]]);
21582
- const _hoisted_1$z = { class: "markdown-view" };
21583
- const _hoisted_2$r = ["innerHTML"];
21584
- const _sfc_main$F = /* @__PURE__ */ defineComponent({
21603
+ const _style_0$z = "\n.markdown-editor[data-v-a278828c] {\n display: flex;\n flex-direction: column;\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n}\n.markdown-editor__toolbar[data-v-a278828c] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n position: sticky;\n top: var(--document-toolbar-height, 0px);\n z-index: 1;\n}\n.markdown-editor__separator[data-v-a278828c] {\n width: 1px;\n height: 20px;\n background-color: var(--color-border);\n margin: 0 var(--spacing-xs);\n}\n.markdown-editor__content[data-v-a278828c] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n outline: none;\n min-height: 200px;\n}\n.markdown-editor__content[data-v-a278828c] > *:first-child {\n margin-top: 0;\n}\n.markdown-editor__content[data-v-a278828c] h1,\n.markdown-editor__content[data-v-a278828c] h2,\n.markdown-editor__content[data-v-a278828c] h3,\n.markdown-editor__content[data-v-a278828c] h4 {\n margin: var(--spacing-lg) 0 var(--spacing-sm);\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.markdown-editor__content[data-v-a278828c] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-editor__content[data-v-a278828c] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-editor__content[data-v-a278828c] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-editor__content[data-v-a278828c] h4 {\n font-size: var(--font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-secondary);\n}\n.markdown-editor__content[data-v-a278828c] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-editor__content[data-v-a278828c] ul,\n.markdown-editor__content[data-v-a278828c] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-editor__content[data-v-a278828c] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-editor__content[data-v-a278828c] blockquote {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-sm) var(--spacing-md);\n border-left: 3px solid var(--color-border);\n color: var(--color-text-secondary);\n font-style: italic;\n}\n.markdown-editor__content[data-v-a278828c] code {\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n padding: 1px 4px;\n background-color: var(--color-surface);\n border-radius: var(--radius-sm);\n}\n.markdown-editor__content[data-v-a278828c] pre {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n}\n.markdown-editor__content[data-v-a278828c] pre code {\n padding: 0;\n background: none;\n}\n.markdown-editor__content[data-v-a278828c] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-editor__content[data-v-a278828c] hr {\n border: 0;\n border-top: 1px solid var(--color-border);\n margin: var(--spacing-lg) 0;\n}\n.markdown-editor__content[data-v-a278828c] strong {\n font-weight: 700;\n}\n.markdown-editor__content[data-v-a278828c] table {\n border-collapse: collapse;\n margin: var(--spacing-md) 0;\n}\n.markdown-editor__content[data-v-a278828c] th,\n.markdown-editor__content[data-v-a278828c] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-editor__content[data-v-a278828c] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21604
+ const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$I, [["styles", [_style_0$z]], ["__scopeId", "data-v-a278828c"]]);
21605
+ const _hoisted_1$A = { class: "markdown-view" };
21606
+ const _hoisted_2$s = ["innerHTML"];
21607
+ const _hoisted_3$l = ["innerHTML"];
21608
+ const _sfc_main$H = /* @__PURE__ */ defineComponent({
21585
21609
  __name: "MarkdownView",
21586
21610
  props: {
21587
21611
  source: { type: String },
@@ -21591,15 +21615,19 @@ const _sfc_main$F = /* @__PURE__ */ defineComponent({
21591
21615
  const props = __props;
21592
21616
  const segments = computed(() => renderMarkdownSegments(props.source));
21593
21617
  return (_ctx, _cache) => {
21594
- return openBlock(), createElementBlock("div", _hoisted_1$z, [
21618
+ return openBlock(), createElementBlock("div", _hoisted_1$A, [
21595
21619
  (openBlock(true), createElementBlock(Fragment, null, renderList(segments.value, (seg, i2) => {
21596
21620
  return openBlock(), createElementBlock(Fragment, { key: i2 }, [
21597
21621
  seg.type === "html" ? (openBlock(), createElementBlock("div", {
21598
21622
  key: 0,
21599
21623
  class: "markdown-view__html",
21600
21624
  innerHTML: seg.html
21601
- }, null, 8, _hoisted_2$r)) : (openBlock(), createBlock(CodeBlock, {
21625
+ }, null, 8, _hoisted_2$s)) : seg.type === "table" ? (openBlock(), createElementBlock("div", {
21602
21626
  key: 1,
21627
+ class: "markdown-view__table",
21628
+ innerHTML: seg.html
21629
+ }, null, 8, _hoisted_3$l)) : (openBlock(), createBlock(CodeBlock, {
21630
+ key: 2,
21603
21631
  code: seg.code,
21604
21632
  lang: seg.lang,
21605
21633
  streaming: __props.streaming
@@ -21610,18 +21638,18 @@ const _sfc_main$F = /* @__PURE__ */ defineComponent({
21610
21638
  };
21611
21639
  }
21612
21640
  });
21613
- const _style_0$x = "\n.markdown-view[data-v-6e1cc74b] {\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n}\n\n/* No box: block children flow as direct children of .markdown-view so margin\n collapsing keeps working across html/code segment boundaries. */\n.markdown-view__html[data-v-6e1cc74b] {\n display: contents;\n}\n\n/* Trim the outer margins of the first/last rendered block (reach through the\n display:contents wrapper to the real content element). */\n.markdown-view > .markdown-view__html[data-v-6e1cc74b]:first-child > :first-child {\n margin-top: 0;\n}\n.markdown-view > .markdown-view__html[data-v-6e1cc74b]:last-child > :last-child {\n margin-bottom: 0;\n}\n.markdown-view[data-v-6e1cc74b] h1,\n.markdown-view[data-v-6e1cc74b] h2,\n.markdown-view[data-v-6e1cc74b] h3,\n.markdown-view[data-v-6e1cc74b] h4 {\n margin: var(--spacing-lg) 0 var(--spacing-sm);\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.markdown-view[data-v-6e1cc74b] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-view[data-v-6e1cc74b] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-view[data-v-6e1cc74b] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-view[data-v-6e1cc74b] h4 {\n font-size: var(--font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-secondary);\n}\n.markdown-view[data-v-6e1cc74b] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-view[data-v-6e1cc74b] ul,\n.markdown-view[data-v-6e1cc74b] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-view[data-v-6e1cc74b] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-view[data-v-6e1cc74b] blockquote {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-sm) var(--spacing-md);\n border-left: 3px solid var(--color-border);\n color: var(--color-text-secondary);\n font-style: italic;\n}\n\n/* Inline code only — fenced blocks render via <CodeBlock>. Scoped to the html\n wrapper so it never reaches into the CodeBlock component. */\n.markdown-view__html[data-v-6e1cc74b] code {\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n padding: 1px 4px;\n background-color: var(--color-surface);\n border-radius: var(--radius-sm);\n}\n\n/* Fallback for raw <pre> written as literal HTML (not fenced code). */\n.markdown-view__html[data-v-6e1cc74b] pre {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n border: 1px solid var(--color-border);\n}\n.markdown-view__html[data-v-6e1cc74b] pre code {\n padding: 0;\n background: none;\n}\n.markdown-view[data-v-6e1cc74b] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-view[data-v-6e1cc74b] hr {\n border: 0;\n border-top: 1px solid var(--color-border);\n margin: var(--spacing-lg) 0;\n}\n.markdown-view[data-v-6e1cc74b] strong {\n font-weight: 700;\n}\n.markdown-view[data-v-6e1cc74b] table {\n border-collapse: collapse;\n margin: var(--spacing-md) 0;\n}\n.markdown-view[data-v-6e1cc74b] th,\n.markdown-view[data-v-6e1cc74b] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-view[data-v-6e1cc74b] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21614
- const MarkdownView = /* @__PURE__ */ _export_sfc(_sfc_main$F, [["styles", [_style_0$x]], ["__scopeId", "data-v-6e1cc74b"]]);
21615
- const _hoisted_1$y = {
21641
+ const _style_0$y = "\n.markdown-view[data-v-b6eeece0] {\n font-family: var(--font-family);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n /* Long URLs and identifiers wrap instead of running past a narrow\n column (phones, chat), where the overflow would just be clipped. */\n overflow-wrap: break-word;\n}\n\n/* No box: block children flow as direct children of .markdown-view so margin\n collapsing keeps working across html/code segment boundaries. */\n.markdown-view__html[data-v-b6eeece0] {\n display: contents;\n}\n\n/* Trim the outer margins of the first/last rendered block (reach through the\n display:contents wrapper to the real content element). */\n.markdown-view > .markdown-view__html[data-v-b6eeece0]:first-child > :first-child {\n margin-top: 0;\n}\n.markdown-view > .markdown-view__html[data-v-b6eeece0]:last-child > :last-child {\n margin-bottom: 0;\n}\n.markdown-view > .markdown-view__table[data-v-b6eeece0]:first-child {\n margin-top: 0;\n}\n.markdown-view > .markdown-view__table[data-v-b6eeece0]:last-child {\n margin-bottom: 0;\n}\n.markdown-view[data-v-b6eeece0] h1,\n.markdown-view[data-v-b6eeece0] h2,\n.markdown-view[data-v-b6eeece0] h3,\n.markdown-view[data-v-b6eeece0] h4 {\n margin: var(--spacing-lg) 0 var(--spacing-sm);\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.markdown-view[data-v-b6eeece0] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-view[data-v-b6eeece0] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-view[data-v-b6eeece0] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-view[data-v-b6eeece0] h4 {\n font-size: var(--font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-secondary);\n}\n.markdown-view[data-v-b6eeece0] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-view[data-v-b6eeece0] ul,\n.markdown-view[data-v-b6eeece0] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-view[data-v-b6eeece0] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-view[data-v-b6eeece0] blockquote {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-sm) var(--spacing-md);\n border-left: 3px solid var(--color-border);\n color: var(--color-text-secondary);\n font-style: italic;\n}\n\n/* Inline code only — fenced blocks render via <CodeBlock>. Scoped to the html\n wrapper so it never reaches into the CodeBlock component. */\n.markdown-view__html[data-v-b6eeece0] code {\n font-family: var(--font-family-mono);\n font-size: 0.9em;\n padding: 1px 4px;\n background-color: var(--color-surface);\n border-radius: var(--radius-sm);\n}\n\n/* Fallback for raw <pre> written as literal HTML (not fenced code). */\n.markdown-view__html[data-v-b6eeece0] pre {\n margin: var(--spacing-md) 0;\n padding: var(--spacing-md);\n background-color: var(--color-surface);\n border-radius: var(--radius-md);\n overflow-x: auto;\n border: 1px solid var(--color-border);\n}\n.markdown-view__html[data-v-b6eeece0] pre code {\n padding: 0;\n background: none;\n}\n.markdown-view[data-v-b6eeece0] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-view[data-v-b6eeece0] hr {\n border: 0;\n border-top: 1px solid var(--color-border);\n margin: var(--spacing-lg) 0;\n}\n.markdown-view[data-v-b6eeece0] strong {\n font-weight: 700;\n}\n.markdown-view[data-v-b6eeece0] img {\n max-width: 100%;\n height: auto;\n}\n\n/* A table wider than the column scrolls on its own, the text around it\n keeps the column width. */\n.markdown-view__table[data-v-b6eeece0] {\n margin: var(--spacing-md) 0;\n overflow-x: auto;\n}\n.markdown-view[data-v-b6eeece0] table {\n border-collapse: collapse;\n}\n.markdown-view[data-v-b6eeece0] th,\n.markdown-view[data-v-b6eeece0] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-view[data-v-b6eeece0] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21642
+ const MarkdownView = /* @__PURE__ */ _export_sfc(_sfc_main$H, [["styles", [_style_0$y]], ["__scopeId", "data-v-b6eeece0"]]);
21643
+ const _hoisted_1$z = {
21616
21644
  key: 0,
21617
21645
  class: "transcript-ui-popover-list__items"
21618
21646
  };
21619
- const _hoisted_2$q = {
21647
+ const _hoisted_2$r = {
21620
21648
  key: 0,
21621
21649
  class: "transcript-ui-popover-list__divider"
21622
21650
  };
21623
21651
  const _hoisted_3$k = { class: "transcript-ui-popover-list__footer" };
21624
- const _sfc_main$E = /* @__PURE__ */ defineComponent({
21652
+ const _sfc_main$G = /* @__PURE__ */ defineComponent({
21625
21653
  __name: "PopoverList",
21626
21654
  props: {
21627
21655
  items: { type: Array },
@@ -21674,7 +21702,7 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
21674
21702
  "side-offset": __props.sideOffset
21675
21703
  }, {
21676
21704
  default: withCtx(() => [
21677
- __props.items.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_1$y, [
21705
+ __props.items.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_1$z, [
21678
21706
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
21679
21707
  return openBlock(), createBlock(unref(DropdownMenuItem_default), {
21680
21708
  key: keyFor(item, index),
@@ -21690,7 +21718,7 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
21690
21718
  }), 128))
21691
21719
  ])) : createCommentVNode("", true),
21692
21720
  _ctx.$slots.footer ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
21693
- __props.items.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$q)) : createCommentVNode("", true),
21721
+ __props.items.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$r)) : createCommentVNode("", true),
21694
21722
  createBaseVNode("div", _hoisted_3$k, [
21695
21723
  renderSlot(_ctx.$slots, "footer")
21696
21724
  ])
@@ -21707,8 +21735,8 @@ const _sfc_main$E = /* @__PURE__ */ defineComponent({
21707
21735
  };
21708
21736
  }
21709
21737
  });
21710
- const _hoisted_1$x = ["disabled", "aria-current"];
21711
- const _hoisted_2$p = {
21738
+ const _hoisted_1$y = ["disabled", "aria-current"];
21739
+ const _hoisted_2$q = {
21712
21740
  key: 0,
21713
21741
  class: "selectable-list-item__leading"
21714
21742
  };
@@ -21717,11 +21745,11 @@ const _hoisted_4$d = {
21717
21745
  key: 1,
21718
21746
  class: "selectable-list-item__trailing"
21719
21747
  };
21720
- const _hoisted_5$b = {
21748
+ const _hoisted_5$c = {
21721
21749
  key: 0,
21722
21750
  class: "selectable-list-item__actions"
21723
21751
  };
21724
- const _sfc_main$D = /* @__PURE__ */ defineComponent({
21752
+ const _sfc_main$F = /* @__PURE__ */ defineComponent({
21725
21753
  __name: "SelectableListItem",
21726
21754
  props: {
21727
21755
  current: { type: Boolean },
@@ -21746,7 +21774,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
21746
21774
  "aria-current": __props.current ? "true" : void 0,
21747
21775
  onClick: _cache[0] || (_cache[0] = ($event) => emit2("select"))
21748
21776
  }, [
21749
- _ctx.$slots.leading ? (openBlock(), createElementBlock("span", _hoisted_2$p, [
21777
+ _ctx.$slots.leading ? (openBlock(), createElementBlock("span", _hoisted_2$q, [
21750
21778
  renderSlot(_ctx.$slots, "leading", {}, void 0, true)
21751
21779
  ])) : createCommentVNode("", true),
21752
21780
  createBaseVNode("span", _hoisted_3$j, [
@@ -21757,17 +21785,17 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
21757
21785
  _ctx.$slots.trailing ? (openBlock(), createElementBlock("span", _hoisted_4$d, [
21758
21786
  renderSlot(_ctx.$slots, "trailing", {}, void 0, true)
21759
21787
  ])) : createCommentVNode("", true)
21760
- ], 8, _hoisted_1$x),
21761
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_5$b, [
21788
+ ], 8, _hoisted_1$y),
21789
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_5$c, [
21762
21790
  renderSlot(_ctx.$slots, "actions", {}, void 0, true)
21763
21791
  ])) : createCommentVNode("", true)
21764
21792
  ], 2);
21765
21793
  };
21766
21794
  }
21767
21795
  });
21768
- const _style_0$w = "\n.selectable-list-item[data-v-46747619] {\n position: relative;\n display: flex;\n border: 1px solid transparent;\n transition:\n background-color var(--transition-duration),\n box-shadow var(--transition-duration);\n}\n.selectable-list-item--md[data-v-46747619] {\n font-size: var(--font-size-sm);\n}\n.selectable-list-item--sm[data-v-46747619] {\n font-size: var(--font-size-xs);\n}\n.selectable-list-item[data-v-46747619]:hover {\n background-color: var(--color-surface-hover);\n}\n.selectable-list-item--current[data-v-46747619],\n.selectable-list-item--current[data-v-46747619]:hover {\n background-color: color-mix(in srgb, var(--color-primary) 12%, transparent);\n box-shadow: inset 2px 0 0 var(--color-primary);\n}\n\n/* ── The selectable button ── */\n.transcript-ui-root .selectable-list-item__main[data-v-46747619] {\n /* Full reset (same convention as Button, EditableText, Tabs…): the\n previous partial reset (background/border/font only) left margin,\n padding, and appearance to whatever the host page's UA/global styles\n happened to set. */\n all: unset;\n box-sizing: border-box;\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n font: inherit;\n color: var(--color-text-primary);\n text-align: left;\n cursor: pointer;\n}\n.transcript-ui-root .selectable-list-item--md .selectable-list-item__main[data-v-46747619] {\n padding: var(--spacing-sm);\n}\n.transcript-ui-root .selectable-list-item--sm .selectable-list-item__main[data-v-46747619] {\n padding: var(--spacing-xs) var(--spacing-sm);\n color: var(--color-text-secondary);\n}\n.transcript-ui-root .selectable-list-item__main[data-v-46747619]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n}\n.transcript-ui-root .selectable-list-item__main[data-v-46747619]:disabled {\n cursor: not-allowed;\n}\n.transcript-ui-root .selectable-list-item--current .selectable-list-item__main[data-v-46747619] {\n color: var(--color-primary);\n font-weight: 600;\n}\n.selectable-list-item__label[data-v-46747619] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n.selectable-list-item__leading[data-v-46747619],\n.selectable-list-item__trailing[data-v-46747619] {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Trailing content (hints, dates) stays muted even on the active row. */\n.selectable-list-item__trailing[data-v-46747619] {\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n\n/* ── Trailing actions (hover / focus reveal, overlaying the row) ── */\n.selectable-list-item__actions[data-v-46747619] {\n position: absolute;\n inset-block: 0;\n inset-inline-end: 0;\n display: flex;\n align-items: center;\n gap: 2px;\n padding-inline: var(--spacing-md) var(--spacing-xs);\n /* Fade the label out behind the actions, matching the row surface. */\n background: linear-gradient(\n to right,\n transparent,\n var(--color-surface-hover) var(--spacing-md)\n );\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--transition-duration);\n}\n.selectable-list-item:hover .selectable-list-item__actions[data-v-46747619],\n.selectable-list-item:focus-within .selectable-list-item__actions[data-v-46747619] {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* Match the fade to the selected surface on the active row. */\n.selectable-list-item--current .selectable-list-item__actions[data-v-46747619] {\n background: linear-gradient(\n to right,\n transparent,\n color-mix(in srgb, var(--color-primary) 12%, var(--color-surface-hover))\n var(--spacing-md)\n );\n}\n@media (prefers-reduced-motion: reduce) {\n.selectable-list-item[data-v-46747619],\n .selectable-list-item__actions[data-v-46747619] {\n transition: none;\n}\n}\n";
21769
- const SelectableListItem = /* @__PURE__ */ _export_sfc(_sfc_main$D, [["styles", [_style_0$w]], ["__scopeId", "data-v-46747619"]]);
21770
- const _sfc_main$C = /* @__PURE__ */ defineComponent({
21796
+ const _style_0$x = "\n.selectable-list-item[data-v-46747619] {\n position: relative;\n display: flex;\n border: 1px solid transparent;\n transition:\n background-color var(--transition-duration),\n box-shadow var(--transition-duration);\n}\n.selectable-list-item--md[data-v-46747619] {\n font-size: var(--font-size-sm);\n}\n.selectable-list-item--sm[data-v-46747619] {\n font-size: var(--font-size-xs);\n}\n.selectable-list-item[data-v-46747619]:hover {\n background-color: var(--color-surface-hover);\n}\n.selectable-list-item--current[data-v-46747619],\n.selectable-list-item--current[data-v-46747619]:hover {\n background-color: color-mix(in srgb, var(--color-primary) 12%, transparent);\n box-shadow: inset 2px 0 0 var(--color-primary);\n}\n\n/* ── The selectable button ── */\n.transcript-ui-root .selectable-list-item__main[data-v-46747619] {\n /* Full reset (same convention as Button, EditableText, Tabs…): the\n previous partial reset (background/border/font only) left margin,\n padding, and appearance to whatever the host page's UA/global styles\n happened to set. */\n all: unset;\n box-sizing: border-box;\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n font: inherit;\n color: var(--color-text-primary);\n text-align: left;\n cursor: pointer;\n}\n.transcript-ui-root .selectable-list-item--md .selectable-list-item__main[data-v-46747619] {\n padding: var(--spacing-sm);\n}\n.transcript-ui-root .selectable-list-item--sm .selectable-list-item__main[data-v-46747619] {\n padding: var(--spacing-xs) var(--spacing-sm);\n color: var(--color-text-secondary);\n}\n.transcript-ui-root .selectable-list-item__main[data-v-46747619]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n}\n.transcript-ui-root .selectable-list-item__main[data-v-46747619]:disabled {\n cursor: not-allowed;\n}\n.transcript-ui-root .selectable-list-item--current .selectable-list-item__main[data-v-46747619] {\n color: var(--color-primary);\n font-weight: 600;\n}\n.selectable-list-item__label[data-v-46747619] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n.selectable-list-item__leading[data-v-46747619],\n.selectable-list-item__trailing[data-v-46747619] {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Trailing content (hints, dates) stays muted even on the active row. */\n.selectable-list-item__trailing[data-v-46747619] {\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n\n/* ── Trailing actions (hover / focus reveal, overlaying the row) ── */\n.selectable-list-item__actions[data-v-46747619] {\n position: absolute;\n inset-block: 0;\n inset-inline-end: 0;\n display: flex;\n align-items: center;\n gap: 2px;\n padding-inline: var(--spacing-md) var(--spacing-xs);\n /* Fade the label out behind the actions, matching the row surface. */\n background: linear-gradient(\n to right,\n transparent,\n var(--color-surface-hover) var(--spacing-md)\n );\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--transition-duration);\n}\n.selectable-list-item:hover .selectable-list-item__actions[data-v-46747619],\n.selectable-list-item:focus-within .selectable-list-item__actions[data-v-46747619] {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* Match the fade to the selected surface on the active row. */\n.selectable-list-item--current .selectable-list-item__actions[data-v-46747619] {\n background: linear-gradient(\n to right,\n transparent,\n color-mix(in srgb, var(--color-primary) 12%, var(--color-surface-hover))\n var(--spacing-md)\n );\n}\n@media (prefers-reduced-motion: reduce) {\n.selectable-list-item[data-v-46747619],\n .selectable-list-item__actions[data-v-46747619] {\n transition: none;\n}\n}\n";
21797
+ const SelectableListItem = /* @__PURE__ */ _export_sfc(_sfc_main$F, [["styles", [_style_0$x]], ["__scopeId", "data-v-46747619"]]);
21798
+ const _sfc_main$E = /* @__PURE__ */ defineComponent({
21771
21799
  __name: "SpeakerIndicator",
21772
21800
  props: {
21773
21801
  color: { type: String }
@@ -21782,12 +21810,12 @@ const _sfc_main$C = /* @__PURE__ */ defineComponent({
21782
21810
  };
21783
21811
  }
21784
21812
  });
21785
- const _style_0$v = "\n.speaker-indicator[data-v-324978c0] {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n";
21786
- const SpeakerIndicator = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["styles", [_style_0$v]], ["__scopeId", "data-v-324978c0"]]);
21787
- const _hoisted_1$w = { class: "switch" };
21788
- const _hoisted_2$o = ["id", "checked", "disabled"];
21813
+ const _style_0$w = "\n.speaker-indicator[data-v-324978c0] {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n";
21814
+ const SpeakerIndicator = /* @__PURE__ */ _export_sfc(_sfc_main$E, [["styles", [_style_0$w]], ["__scopeId", "data-v-324978c0"]]);
21815
+ const _hoisted_1$x = { class: "switch" };
21816
+ const _hoisted_2$p = ["id", "checked", "disabled"];
21789
21817
  const _hoisted_3$i = ["for"];
21790
- const _sfc_main$B = /* @__PURE__ */ defineComponent({
21818
+ const _sfc_main$D = /* @__PURE__ */ defineComponent({
21791
21819
  __name: "SwitchToggle",
21792
21820
  props: {
21793
21821
  modelValue: { type: Boolean },
@@ -21800,14 +21828,14 @@ const _sfc_main$B = /* @__PURE__ */ defineComponent({
21800
21828
  const emit2 = __emit;
21801
21829
  const inputId = props.id ?? useId$1();
21802
21830
  return (_ctx, _cache) => {
21803
- return openBlock(), createElementBlock("div", _hoisted_1$w, [
21831
+ return openBlock(), createElementBlock("div", _hoisted_1$x, [
21804
21832
  createBaseVNode("input", {
21805
21833
  type: "checkbox",
21806
21834
  id: unref(inputId),
21807
21835
  checked: __props.modelValue,
21808
21836
  disabled: __props.disabled,
21809
21837
  onChange: _cache[0] || (_cache[0] = ($event) => emit2("update:modelValue", $event.target.checked))
21810
- }, null, 40, _hoisted_2$o),
21838
+ }, null, 40, _hoisted_2$p),
21811
21839
  createBaseVNode("label", { for: unref(inputId) }, [..._cache[1] || (_cache[1] = [
21812
21840
  createBaseVNode("div", { class: "switch-slider" }, null, -1)
21813
21841
  ])], 8, _hoisted_3$i)
@@ -21815,15 +21843,15 @@ const _sfc_main$B = /* @__PURE__ */ defineComponent({
21815
21843
  };
21816
21844
  }
21817
21845
  });
21818
- const _style_0$u = "\n.switch[data-v-44d0160b] {\n display: inline-block;\n flex-shrink: 0;\n}\n.switch input[data-v-44d0160b] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n.switch label[data-v-44d0160b] {\n height: 20px;\n width: 40px;\n display: block;\n border: 1px solid var(--color-border);\n border-radius: 20px;\n cursor: pointer;\n background-color: var(--color-border);\n transition: background-color var(--transition-duration);\n}\n.switch .switch-slider[data-v-44d0160b] {\n height: 22px;\n width: 22px;\n border: 1px solid var(--color-border);\n border-radius: 50%;\n position: relative;\n top: -2px;\n left: -2px;\n background-color: var(--color-white);\n transition: left var(--transition-duration);\n}\n.switch input:checked + label[data-v-44d0160b] {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n}\n.switch input:checked + label .switch-slider[data-v-44d0160b] {\n left: 20px;\n border-color: var(--color-primary);\n}\n.switch input:disabled + label[data-v-44d0160b] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n";
21819
- const SwitchToggle = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["styles", [_style_0$u]], ["__scopeId", "data-v-44d0160b"]]);
21846
+ const _style_0$v = "\n.switch[data-v-44d0160b] {\n display: inline-block;\n flex-shrink: 0;\n}\n.switch input[data-v-44d0160b] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n.switch label[data-v-44d0160b] {\n height: 20px;\n width: 40px;\n display: block;\n border: 1px solid var(--color-border);\n border-radius: 20px;\n cursor: pointer;\n background-color: var(--color-border);\n transition: background-color var(--transition-duration);\n}\n.switch .switch-slider[data-v-44d0160b] {\n height: 22px;\n width: 22px;\n border: 1px solid var(--color-border);\n border-radius: 50%;\n position: relative;\n top: -2px;\n left: -2px;\n background-color: var(--color-white);\n transition: left var(--transition-duration);\n}\n.switch input:checked + label[data-v-44d0160b] {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n}\n.switch input:checked + label .switch-slider[data-v-44d0160b] {\n left: 20px;\n border-color: var(--color-primary);\n}\n.switch input:disabled + label[data-v-44d0160b] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n";
21847
+ const SwitchToggle = /* @__PURE__ */ _export_sfc(_sfc_main$D, [["styles", [_style_0$v]], ["__scopeId", "data-v-44d0160b"]]);
21820
21848
  function computeInitials(name) {
21821
21849
  const words = name.trim().split(/\s+/).filter(Boolean);
21822
21850
  if (words.length === 0) return "?";
21823
21851
  return words.slice(0, 2).map((w2) => w2[0].toUpperCase()).join("");
21824
21852
  }
21825
- const _hoisted_1$v = ["title", "aria-label"];
21826
- const _sfc_main$A = /* @__PURE__ */ defineComponent({
21853
+ const _hoisted_1$w = ["title", "aria-label"];
21854
+ const _sfc_main$C = /* @__PURE__ */ defineComponent({
21827
21855
  __name: "UserAvatar",
21828
21856
  props: {
21829
21857
  name: { type: String },
@@ -21839,35 +21867,40 @@ const _sfc_main$A = /* @__PURE__ */ defineComponent({
21839
21867
  role: "img",
21840
21868
  title: title.value,
21841
21869
  "aria-label": title.value
21842
- }, toDisplayString(initials.value), 9, _hoisted_1$v);
21870
+ }, toDisplayString(initials.value), 9, _hoisted_1$w);
21843
21871
  };
21844
21872
  }
21845
21873
  });
21846
- const _style_0$t = "\n.user-avatar[data-v-977a8d17] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n font-weight: 600;\n user-select: none;\n cursor: default;\n}\n";
21847
- const UserAvatar = /* @__PURE__ */ _export_sfc(_sfc_main$A, [["styles", [_style_0$t]], ["__scopeId", "data-v-977a8d17"]]);
21848
- const _hoisted_1$u = ["data-status"];
21849
- const _hoisted_2$n = { class: "document-article__toolbar-left" };
21850
- const _hoisted_3$h = { class: "document-article__toolbar-center" };
21851
- const _hoisted_4$c = { class: "document-article__toolbar-right" };
21852
- const _hoisted_5$a = { class: "document-article__body" };
21853
- const _hoisted_6$a = {
21874
+ const _style_0$u = "\n.user-avatar[data-v-977a8d17] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n font-weight: 600;\n user-select: none;\n cursor: default;\n}\n";
21875
+ const UserAvatar = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["styles", [_style_0$u]], ["__scopeId", "data-v-977a8d17"]]);
21876
+ const _hoisted_1$v = ["data-status"];
21877
+ const _hoisted_2$o = {
21878
+ key: 0,
21879
+ class: "document-article__toolbar",
21880
+ role: "toolbar"
21881
+ };
21882
+ const _hoisted_3$h = { class: "document-article__toolbar-left" };
21883
+ const _hoisted_4$c = { class: "document-article__toolbar-center" };
21884
+ const _hoisted_5$b = { class: "document-article__toolbar-right" };
21885
+ const _hoisted_6$a = { class: "document-article__body" };
21886
+ const _hoisted_7$4 = {
21854
21887
  key: 0,
21855
21888
  class: "document-article__center document-article__center--processing",
21856
21889
  role: "status",
21857
21890
  "aria-live": "polite"
21858
21891
  };
21859
- const _hoisted_7$4 = ["value"];
21860
- const _hoisted_8$2 = {
21892
+ const _hoisted_8$2 = ["value"];
21893
+ const _hoisted_9$2 = {
21861
21894
  key: 0,
21862
21895
  class: "document-article__progress-value"
21863
21896
  };
21864
- const _hoisted_9$2 = {
21897
+ const _hoisted_10$2 = {
21865
21898
  key: 1,
21866
21899
  class: "document-article__center document-article__center--error",
21867
21900
  role: "alert"
21868
21901
  };
21869
- const _hoisted_10$2 = { class: "document-article__error-text" };
21870
- const _sfc_main$z = /* @__PURE__ */ defineComponent({
21902
+ const _hoisted_11$1 = { class: "document-article__error-text" };
21903
+ const _sfc_main$B = /* @__PURE__ */ defineComponent({
21871
21904
  __name: "DocumentArticle",
21872
21905
  props: {
21873
21906
  status: { default: "done", type: String },
@@ -21882,22 +21915,6 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
21882
21915
  const errorText = computed(
21883
21916
  () => props.errorMessage || t2("llmService.errorTemporary")
21884
21917
  );
21885
- const articleEl = /* @__PURE__ */ ref(null);
21886
- const toolbarEl = /* @__PURE__ */ ref(null);
21887
- let toolbarObserver = null;
21888
- function publishToolbarHeight() {
21889
- const height = toolbarEl.value?.offsetHeight ?? 0;
21890
- articleEl.value?.style.setProperty("--document-toolbar-height", `${height}px`);
21891
- }
21892
- onMounted(() => {
21893
- publishToolbarHeight();
21894
- if (typeof ResizeObserver === "undefined" || !toolbarEl.value) return;
21895
- toolbarObserver = new ResizeObserver(publishToolbarHeight);
21896
- toolbarObserver.observe(toolbarEl.value);
21897
- });
21898
- onBeforeUnmount(() => {
21899
- toolbarObserver?.disconnect();
21900
- });
21901
21918
  const progressValue = computed(() => {
21902
21919
  const v2 = props.progress;
21903
21920
  if (v2 == null || !Number.isFinite(v2)) return null;
@@ -21905,30 +21922,22 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
21905
21922
  });
21906
21923
  return (_ctx, _cache) => {
21907
21924
  return openBlock(), createElementBlock("article", {
21908
- ref_key: "articleEl",
21909
- ref: articleEl,
21910
21925
  class: "document-article",
21911
21926
  "data-status": props.status
21912
21927
  }, [
21913
- _ctx.$slots["toolbar-left"] || _ctx.$slots["toolbar-center"] || _ctx.$slots["toolbar-right"] ? (openBlock(), createElementBlock("div", {
21914
- key: 0,
21915
- ref_key: "toolbarEl",
21916
- ref: toolbarEl,
21917
- class: "document-article__toolbar",
21918
- role: "toolbar"
21919
- }, [
21920
- createBaseVNode("div", _hoisted_2$n, [
21928
+ _ctx.$slots["toolbar-left"] || _ctx.$slots["toolbar-center"] || _ctx.$slots["toolbar-right"] ? (openBlock(), createElementBlock("div", _hoisted_2$o, [
21929
+ createBaseVNode("div", _hoisted_3$h, [
21921
21930
  renderSlot(_ctx.$slots, "toolbar-left", {}, void 0, true)
21922
21931
  ]),
21923
- createBaseVNode("div", _hoisted_3$h, [
21932
+ createBaseVNode("div", _hoisted_4$c, [
21924
21933
  renderSlot(_ctx.$slots, "toolbar-center", {}, void 0, true)
21925
21934
  ]),
21926
- createBaseVNode("div", _hoisted_4$c, [
21935
+ createBaseVNode("div", _hoisted_5$b, [
21927
21936
  renderSlot(_ctx.$slots, "toolbar-right", {}, void 0, true)
21928
21937
  ])
21929
- ], 512)) : createCommentVNode("", true),
21930
- createBaseVNode("div", _hoisted_5$a, [
21931
- props.status === "processing" ? (openBlock(), createElementBlock("div", _hoisted_6$a, [
21938
+ ])) : createCommentVNode("", true),
21939
+ createBaseVNode("div", _hoisted_6$a, [
21940
+ props.status === "processing" ? (openBlock(), createElementBlock("div", _hoisted_7$4, [
21932
21941
  createVNode(EditorIcon, {
21933
21942
  name: "spinner",
21934
21943
  spin: "",
@@ -21938,10 +21947,10 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
21938
21947
  class: "document-article__progress",
21939
21948
  max: 100,
21940
21949
  value: progressValue.value ?? void 0
21941
- }, null, 8, _hoisted_7$4),
21942
- progressValue.value !== null ? (openBlock(), createElementBlock("span", _hoisted_8$2, toDisplayString(progressValue.value) + "% ", 1)) : createCommentVNode("", true)
21943
- ])) : props.status === "error" ? (openBlock(), createElementBlock("div", _hoisted_9$2, [
21944
- createBaseVNode("p", _hoisted_10$2, toDisplayString(errorText.value), 1),
21950
+ }, null, 8, _hoisted_8$2),
21951
+ progressValue.value !== null ? (openBlock(), createElementBlock("span", _hoisted_9$2, toDisplayString(progressValue.value) + "% ", 1)) : createCommentVNode("", true)
21952
+ ])) : props.status === "error" ? (openBlock(), createElementBlock("div", _hoisted_10$2, [
21953
+ createBaseVNode("p", _hoisted_11$1, toDisplayString(errorText.value), 1),
21945
21954
  createVNode(Button, {
21946
21955
  variant: "primary",
21947
21956
  icon: "refresh-cw",
@@ -21954,13 +21963,13 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
21954
21963
  })
21955
21964
  ])) : renderSlot(_ctx.$slots, "default", {}, void 0, true, 2)
21956
21965
  ])
21957
- ], 8, _hoisted_1$u);
21966
+ ], 8, _hoisted_1$v);
21958
21967
  };
21959
21968
  }
21960
21969
  });
21961
- const _style_0$s = "\n.document-article[data-v-54a8890c] {\n width: min(1088px, calc(100% - 16px));\n max-width: 1088px;\n margin: var(--spacing-lg) auto;\n background-color: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n display: flex;\n flex-direction: column;\n}\n.document-article__toolbar[data-v-54a8890c] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n position: sticky;\n top: 0;\n background-color: var(--color-surface);\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n z-index: 1;\n}\n.document-article__toolbar-left[data-v-54a8890c],\n.document-article__toolbar-right[data-v-54a8890c] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.document-article__toolbar-center[data-v-54a8890c] {\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 0;\n}\n.document-article__body[data-v-54a8890c] {\n flex: 1;\n min-height: 0;\n}\n.document-article__center[data-v-54a8890c] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xl) var(--spacing-md);\n text-align: center;\n}\n.document-article__center--processing[data-v-54a8890c] {\n color: var(--color-primary);\n}\n.document-article__center--error[data-v-54a8890c] {\n color: var(--color-danger, #d33);\n}\n.document-article__progress[data-v-54a8890c] {\n width: min(280px, 100%);\n height: 6px;\n}\n.document-article__progress-value[data-v-54a8890c] {\n font-size: var(--font-size-xs);\n font-variant-numeric: tabular-nums;\n color: var(--color-text-muted);\n}\n\n/* Phone: the status line takes its own row under the buttons, so nothing\n ever needs to scroll sideways. */\n@media (max-width: 767px) {\n.document-article[data-v-54a8890c] {\n width: calc(100% - 16px);\n margin: var(--spacing-sm) auto;\n}\n.document-article__toolbar-center[data-v-54a8890c] {\n order: 3;\n flex-basis: 100%;\n justify-content: flex-start;\n}\n}\n.document-article__error-text[data-v-54a8890c] {\n margin: 0;\n max-width: 480px;\n font-size: var(--font-size-sm);\n line-height: var(--line-height);\n color: var(--color-text-secondary);\n}\n";
21962
- const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["styles", [_style_0$s]], ["__scopeId", "data-v-54a8890c"]]);
21963
- const _sfc_main$y = /* @__PURE__ */ defineComponent({
21970
+ const _style_0$t = "\n.document-article[data-v-dda12eb4] {\n /* One row of buttons plus padding and border. Declared rather than\n measured: slot content must stay on one line (truncate, don't wrap), and\n content stuck right under the toolbar (the markdown editor's toolbar)\n reads this value as its offset. */\n --document-toolbar-height: 49px;\n\n width: min(1088px, calc(100% - 16px));\n max-width: 1088px;\n margin: var(--spacing-lg) auto;\n background-color: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n display: flex;\n flex-direction: column;\n}\n.document-article__toolbar[data-v-dda12eb4] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n height: var(--document-toolbar-height);\n padding: 0 var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n position: sticky;\n top: 0;\n background-color: var(--color-surface);\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n z-index: 1;\n}\n.document-article__toolbar-left[data-v-dda12eb4],\n.document-article__toolbar-right[data-v-dda12eb4] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.document-article__toolbar-center[data-v-dda12eb4] {\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 0;\n}\n.document-article__body[data-v-dda12eb4] {\n flex: 1;\n min-height: 0;\n}\n.document-article__center[data-v-dda12eb4] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xl) var(--spacing-md);\n text-align: center;\n}\n.document-article__center--processing[data-v-dda12eb4] {\n color: var(--color-primary);\n}\n.document-article__center--error[data-v-dda12eb4] {\n color: var(--color-danger, #d33);\n}\n.document-article__progress[data-v-dda12eb4] {\n width: min(280px, 100%);\n height: 6px;\n}\n.document-article__progress-value[data-v-dda12eb4] {\n font-size: var(--font-size-xs);\n font-variant-numeric: tabular-nums;\n color: var(--color-text-muted);\n}\n@media (max-width: 767px) {\n.document-article[data-v-dda12eb4] {\n margin: var(--spacing-sm) auto;\n}\n}\n.document-article__error-text[data-v-dda12eb4] {\n margin: 0;\n max-width: 480px;\n font-size: var(--font-size-sm);\n line-height: var(--line-height);\n color: var(--color-text-secondary);\n}\n";
21971
+ const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["styles", [_style_0$t]], ["__scopeId", "data-v-dda12eb4"]]);
21972
+ const _sfc_main$A = /* @__PURE__ */ defineComponent({
21964
21973
  __name: "DownloadMenu",
21965
21974
  props: {
21966
21975
  formats: { type: Array },
@@ -21976,7 +21985,7 @@ const _sfc_main$y = /* @__PURE__ */ defineComponent({
21976
21985
  emit2("select", item.format);
21977
21986
  }
21978
21987
  return (_ctx, _cache) => {
21979
- return openBlock(), createBlock(_sfc_main$E, {
21988
+ return openBlock(), createBlock(_sfc_main$G, {
21980
21989
  items: props.formats,
21981
21990
  "item-key": (f2) => f2.format,
21982
21991
  align: "end",
@@ -22004,7 +22013,7 @@ const _sfc_main$y = /* @__PURE__ */ defineComponent({
22004
22013
  };
22005
22014
  }
22006
22015
  });
22007
- const _sfc_main$x = /* @__PURE__ */ defineComponent({
22016
+ const _sfc_main$z = /* @__PURE__ */ defineComponent({
22008
22017
  __name: "SpeakerMenu",
22009
22018
  emits: ["merge"],
22010
22019
  setup(__props, { emit: __emit }) {
@@ -22017,7 +22026,7 @@ const _sfc_main$x = /* @__PURE__ */ defineComponent({
22017
22026
  if (action.id === "merge") emit2("merge");
22018
22027
  }
22019
22028
  return (_ctx, _cache) => {
22020
- return openBlock(), createBlock(_sfc_main$E, {
22029
+ return openBlock(), createBlock(_sfc_main$G, {
22021
22030
  items: items.value,
22022
22031
  "item-key": (a2) => a2.id,
22023
22032
  align: "end",
@@ -22038,13 +22047,13 @@ const _sfc_main$x = /* @__PURE__ */ defineComponent({
22038
22047
  };
22039
22048
  }
22040
22049
  });
22041
- const _hoisted_1$t = ["aria-label"];
22042
- const _hoisted_2$m = ["aria-selected", "aria-disabled", "disabled", "onClick"];
22050
+ const _hoisted_1$u = ["aria-label"];
22051
+ const _hoisted_2$n = ["aria-selected", "aria-disabled", "disabled", "onClick"];
22043
22052
  const _hoisted_3$g = { class: "tab__label" };
22044
22053
  const _hoisted_4$b = ["aria-selected", "aria-label"];
22045
- const _hoisted_5$9 = { class: "tab__label" };
22054
+ const _hoisted_5$a = { class: "tab__label" };
22046
22055
  const _hoisted_6$9 = { class: "tab__menu-item" };
22047
- const _sfc_main$w = /* @__PURE__ */ defineComponent({
22056
+ const _sfc_main$y = /* @__PURE__ */ defineComponent({
22048
22057
  __name: "Tabs",
22049
22058
  props: {
22050
22059
  tabs: { type: Array },
@@ -22104,9 +22113,9 @@ const _sfc_main$w = /* @__PURE__ */ defineComponent({
22104
22113
  ]),
22105
22114
  _: 2
22106
22115
  }, 1024)) : createCommentVNode("", true)
22107
- ], 10, _hoisted_2$m);
22116
+ ], 10, _hoisted_2$n);
22108
22117
  }), 128)),
22109
- collapsedTabs.value.length > 0 ? (openBlock(), createBlock(_sfc_main$E, {
22118
+ collapsedTabs.value.length > 0 ? (openBlock(), createBlock(_sfc_main$G, {
22110
22119
  key: 0,
22111
22120
  items: collapsedTabs.value,
22112
22121
  "item-key": (tab) => tab.value,
@@ -22122,7 +22131,7 @@ const _sfc_main$w = /* @__PURE__ */ defineComponent({
22122
22131
  "aria-selected": activeCollapsedTab.value !== null,
22123
22132
  "aria-label": unref(t2)("tabs.moreLabel")
22124
22133
  }, [
22125
- createBaseVNode("span", _hoisted_5$9, toDisplayString(activeCollapsedTab.value ? activeCollapsedTab.value.label : unref(t2)("tabs.moreLabel")), 1),
22134
+ createBaseVNode("span", _hoisted_5$a, toDisplayString(activeCollapsedTab.value ? activeCollapsedTab.value.label : unref(t2)("tabs.moreLabel")), 1),
22126
22135
  activeCollapsedTab.value?.badge ? (openBlock(), createBlock(Badge, {
22127
22136
  key: 0,
22128
22137
  class: "tab__badge"
@@ -22157,12 +22166,12 @@ const _sfc_main$w = /* @__PURE__ */ defineComponent({
22157
22166
  ]),
22158
22167
  _: 1
22159
22168
  }, 8, ["items", "item-key", "is-current"])) : createCommentVNode("", true)
22160
- ], 8, _hoisted_1$t);
22169
+ ], 8, _hoisted_1$u);
22161
22170
  };
22162
22171
  }
22163
22172
  });
22164
- const _style_0$r = '\n.tabs[data-v-30747b8d] {\n display: flex;\n align-items: stretch;\n gap: var(--spacing-xs);\n padding: 0 var(--spacing-lg);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.transcript-ui-root .tab[data-v-30747b8d] {\n all: unset;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n height: 44px;\n padding: 0 var(--spacing-sm);\n font-family: var(--font-family);\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n white-space: nowrap;\n border-bottom: 2px solid transparent;\n transition:\n color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .tab[data-v-30747b8d]:hover:not([disabled]) {\n color: var(--color-text-primary);\n}\n.transcript-ui-root .tab[data-v-30747b8d]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .tab--active[data-v-30747b8d] {\n color: var(--color-text-primary);\n border-bottom-color: var(--color-primary);\n}\n.transcript-ui-root .tab[disabled][data-v-30747b8d] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.tab__icon[data-v-30747b8d] {\n flex-shrink: 0;\n color: currentColor;\n}\n.tab__label[data-v-30747b8d] {\n text-box: cap alphabetic;\n}\n.tab__badge[data-v-30747b8d] {\n margin-left: var(--spacing-xs);\n}\n.tab__chevron[data-v-30747b8d] {\n flex-shrink: 0;\n color: currentColor;\n}\n.tab__menu-item[data-v-30747b8d] {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n/* Phone: the inline tabs share the width, labels shrink with an ellipsis,\n icons go, nothing scrolls sideways (the rest lives in the "More" menu). */\n@media (max-width: 767px) {\n.tabs[data-v-30747b8d] {\n padding: 0 var(--spacing-sm);\n overflow-x: hidden;\n}\n.transcript-ui-root .tab[data-v-30747b8d] {\n flex: 1;\n min-width: 0;\n justify-content: center;\n padding: 0 var(--spacing-xs);\n font-size: var(--font-size-xs);\n}\n.tab__icon[data-v-30747b8d] {\n display: none;\n}\n.tab__label[data-v-30747b8d] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n}\n';
22165
- const Tabs = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["styles", [_style_0$r]], ["__scopeId", "data-v-30747b8d"]]);
22173
+ const _style_0$s = '\n.tabs[data-v-30747b8d] {\n display: flex;\n align-items: stretch;\n gap: var(--spacing-xs);\n padding: 0 var(--spacing-lg);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n overflow-x: auto;\n scrollbar-width: thin;\n}\n.transcript-ui-root .tab[data-v-30747b8d] {\n all: unset;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n height: 44px;\n padding: 0 var(--spacing-sm);\n font-family: var(--font-family);\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n white-space: nowrap;\n border-bottom: 2px solid transparent;\n transition:\n color var(--transition-duration),\n border-color var(--transition-duration);\n}\n.transcript-ui-root .tab[data-v-30747b8d]:hover:not([disabled]) {\n color: var(--color-text-primary);\n}\n.transcript-ui-root .tab[data-v-30747b8d]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .tab--active[data-v-30747b8d] {\n color: var(--color-text-primary);\n border-bottom-color: var(--color-primary);\n}\n.transcript-ui-root .tab[disabled][data-v-30747b8d] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.tab__icon[data-v-30747b8d] {\n flex-shrink: 0;\n color: currentColor;\n}\n.tab__label[data-v-30747b8d] {\n text-box: cap alphabetic;\n}\n.tab__badge[data-v-30747b8d] {\n margin-left: var(--spacing-xs);\n}\n.tab__chevron[data-v-30747b8d] {\n flex-shrink: 0;\n color: currentColor;\n}\n.tab__menu-item[data-v-30747b8d] {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n/* Phone: the inline tabs share the width, labels shrink with an ellipsis,\n icons go, nothing scrolls sideways (the rest lives in the "More" menu). */\n@media (max-width: 767px) {\n.tabs[data-v-30747b8d] {\n padding: 0 var(--spacing-sm);\n overflow-x: hidden;\n}\n.transcript-ui-root .tab[data-v-30747b8d] {\n flex: 1;\n min-width: 0;\n justify-content: center;\n padding: 0 var(--spacing-xs);\n font-size: var(--font-size-xs);\n}\n.tab__icon[data-v-30747b8d] {\n display: none;\n}\n.tab__label[data-v-30747b8d] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n}\n';
22174
+ const Tabs = /* @__PURE__ */ _export_sfc(_sfc_main$y, [["styles", [_style_0$s]], ["__scopeId", "data-v-30747b8d"]]);
22166
22175
  const TEXT_NODE$1 = 3;
22167
22176
  function placeCaretAt(element, offset2) {
22168
22177
  element.focus({ preventScroll: true });
@@ -22219,8 +22228,8 @@ function computeSelectionOffset(container) {
22219
22228
  if (!focus2 || !container.contains(focus2.node)) return null;
22220
22229
  return computeTextOffsetInContainer(container, focus2.node, focus2.offset);
22221
22230
  }
22222
- const _hoisted_1$s = ["aria-label", "textContent"];
22223
- const _sfc_main$v = /* @__PURE__ */ defineComponent({
22231
+ const _hoisted_1$t = ["aria-label", "textContent"];
22232
+ const _sfc_main$x = /* @__PURE__ */ defineComponent({
22224
22233
  __name: "TurnTextEditor",
22225
22234
  props: {
22226
22235
  text: { type: String },
@@ -22274,22 +22283,22 @@ const _sfc_main$v = /* @__PURE__ */ defineComponent({
22274
22283
  onKeydown,
22275
22284
  onBlur,
22276
22285
  textContent: toDisplayString(__props.text)
22277
- }, null, 40, _hoisted_1$s);
22286
+ }, null, 40, _hoisted_1$t);
22278
22287
  };
22279
22288
  }
22280
22289
  });
22281
- const _style_0$q = "\n.turn-text-editor[data-v-597e2575] {\n margin: 0;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n cursor: text;\n outline: 2px solid var(--color-primary);\n border-radius: var(--radius-sm);\n background-color: var(--color-surface);\n padding: 0;\n}\n";
22282
- const TurnTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$v, [["styles", [_style_0$q]], ["__scopeId", "data-v-597e2575"]]);
22283
- const _hoisted_1$r = { class: "editor-header" };
22284
- const _hoisted_2$l = { class: "header-main" };
22290
+ const _style_0$r = "\n.turn-text-editor[data-v-597e2575] {\n margin: 0;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n cursor: text;\n outline: 2px solid var(--color-primary);\n border-radius: var(--radius-sm);\n background-color: var(--color-surface);\n padding: 0;\n}\n";
22291
+ const TurnTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["styles", [_style_0$r]], ["__scopeId", "data-v-597e2575"]]);
22292
+ const _hoisted_1$s = { class: "editor-header" };
22293
+ const _hoisted_2$m = { class: "header-main" };
22285
22294
  const _hoisted_3$f = { class: "document-title" };
22286
22295
  const _hoisted_4$a = {
22287
22296
  key: 0,
22288
22297
  class: "document-meta"
22289
22298
  };
22290
- const _hoisted_5$8 = { class: "header-right" };
22299
+ const _hoisted_5$9 = { class: "header-right" };
22291
22300
  const _hoisted_6$8 = { key: 0 };
22292
- const _sfc_main$u = /* @__PURE__ */ defineComponent({
22301
+ const _sfc_main$w = /* @__PURE__ */ defineComponent({
22293
22302
  __name: "Header",
22294
22303
  props: {
22295
22304
  title: { type: String },
@@ -22323,8 +22332,8 @@ const _sfc_main$u = /* @__PURE__ */ defineComponent({
22323
22332
  ].filter(Boolean)
22324
22333
  );
22325
22334
  return (_ctx, _cache) => {
22326
- return openBlock(), createElementBlock("header", _hoisted_1$r, [
22327
- createBaseVNode("div", _hoisted_2$l, [
22335
+ return openBlock(), createElementBlock("header", _hoisted_1$s, [
22336
+ createBaseVNode("div", _hoisted_2$m, [
22328
22337
  createBaseVNode("h1", _hoisted_3$f, toDisplayString(formattedTitle.value), 1),
22329
22338
  metaParts.value.length ? (openBlock(), createElementBlock("div", _hoisted_4$a, [
22330
22339
  (openBlock(true), createElementBlock(Fragment, null, renderList(metaParts.value, (part, i2) => {
@@ -22335,7 +22344,7 @@ const _sfc_main$u = /* @__PURE__ */ defineComponent({
22335
22344
  }), 128))
22336
22345
  ])) : createCommentVNode("", true)
22337
22346
  ]),
22338
- createBaseVNode("div", _hoisted_5$8, [
22347
+ createBaseVNode("div", _hoisted_5$9, [
22339
22348
  __props.isMobile ? (openBlock(), createBlock(unref(Button), {
22340
22349
  key: 0,
22341
22350
  variant: "transparent",
@@ -22402,13 +22411,13 @@ const _sfc_main$u = /* @__PURE__ */ defineComponent({
22402
22411
  };
22403
22412
  }
22404
22413
  });
22405
- const _style_0$p = '\n.editor-header[data-v-491cf8ab] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-md);\n padding: var(--spacing-sm) var(--spacing-lg);\n min-height: var(--header-height);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n}\n.header-main[data-v-491cf8ab] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n.document-title[data-v-491cf8ab] {\n font-size: var(--font-size-lg);\n font-weight: 600;\n color: var(--color-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n}\n.document-meta[data-v-491cf8ab] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n.document-meta__part[data-v-491cf8ab] {\n text-box: cap alphabetic;\n}\n.document-meta__part + .document-meta__part[data-v-491cf8ab]::before {\n content: "·";\n margin-right: var(--spacing-xs);\n}\n.header-right[data-v-491cf8ab] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n flex-shrink: 0;\n}\n@media (max-width: 767px) {\n.editor-header[data-v-491cf8ab] {\n padding: var(--spacing-xs) var(--spacing-md);\n}\n.document-title[data-v-491cf8ab] {\n font-size: var(--font-size-base);\n}\n}\n';
22406
- const Header = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["styles", [_style_0$p]], ["__scopeId", "data-v-491cf8ab"]]);
22414
+ const _style_0$q = '\n.editor-header[data-v-491cf8ab] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-md);\n padding: var(--spacing-sm) var(--spacing-lg);\n min-height: var(--header-height);\n border-bottom: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n}\n.header-main[data-v-491cf8ab] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n.document-title[data-v-491cf8ab] {\n font-size: var(--font-size-lg);\n font-weight: 600;\n color: var(--color-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n}\n.document-meta[data-v-491cf8ab] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n.document-meta__part[data-v-491cf8ab] {\n text-box: cap alphabetic;\n}\n.document-meta__part + .document-meta__part[data-v-491cf8ab]::before {\n content: "·";\n margin-right: var(--spacing-xs);\n}\n.header-right[data-v-491cf8ab] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n flex-shrink: 0;\n}\n@media (max-width: 767px) {\n.editor-header[data-v-491cf8ab] {\n padding: var(--spacing-xs) var(--spacing-md);\n}\n.document-title[data-v-491cf8ab] {\n font-size: var(--font-size-base);\n}\n}\n';
22415
+ const Header = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["styles", [_style_0$q]], ["__scopeId", "data-v-491cf8ab"]]);
22407
22416
  const TRANSCRIPTION_TAB = "__transcription__";
22408
22417
  const VERBATIM_TAB = "__verbatim__";
22409
22418
  const MOBILE_BREAKPOINT = "(max-width: 767px)";
22410
22419
  function useIsMobile() {
22411
- const isMobile = /* @__PURE__ */ ref(false);
22420
+ const isMobile = /* @__PURE__ */ ref(window.matchMedia(MOBILE_BREAKPOINT).matches);
22412
22421
  let mql = null;
22413
22422
  function onChange(e3) {
22414
22423
  isMobile.value = e3.matches;
@@ -22423,7 +22432,7 @@ function useIsMobile() {
22423
22432
  });
22424
22433
  return { isMobile };
22425
22434
  }
22426
- const _sfc_main$t = /* @__PURE__ */ defineComponent({
22435
+ const _sfc_main$v = /* @__PURE__ */ defineComponent({
22427
22436
  __name: "TabBar",
22428
22437
  props: {
22429
22438
  modelValue: { type: String },
@@ -22843,7 +22852,7 @@ function useStickToBottom(options = {}) {
22843
22852
  };
22844
22853
  }
22845
22854
  var StickToBottomKey = /* @__PURE__ */ Symbol("StickToBottom");
22846
- var _hoisted_1$q = { style: {
22855
+ var _hoisted_1$r = { style: {
22847
22856
  "position": "relative",
22848
22857
  "height": "100%",
22849
22858
  "width": "100%",
@@ -22909,7 +22918,7 @@ var StickToBottom_default = /* @__PURE__ */ defineComponent({
22909
22918
  stopScroll
22910
22919
  }));
22911
22920
  return (_ctx, _cache) => {
22912
- return openBlock(), createElementBlock("div", null, [createBaseVNode("div", _hoisted_1$q, [createBaseVNode("div", {
22921
+ return openBlock(), createElementBlock("div", null, [createBaseVNode("div", _hoisted_1$r, [createBaseVNode("div", {
22913
22922
  ref_key: "scrollRef",
22914
22923
  ref: scrollRef,
22915
22924
  style: normalizeStyle({
@@ -22926,12 +22935,12 @@ var StickToBottom_default = /* @__PURE__ */ defineComponent({
22926
22935
  };
22927
22936
  }
22928
22937
  });
22929
- const _hoisted_1$p = ["datetime"];
22930
- const _hoisted_2$k = {
22938
+ const _hoisted_1$q = ["datetime"];
22939
+ const _hoisted_2$l = {
22931
22940
  key: 2,
22932
22941
  class: "lang"
22933
22942
  };
22934
- const _sfc_main$s = /* @__PURE__ */ defineComponent({
22943
+ const _sfc_main$u = /* @__PURE__ */ defineComponent({
22935
22944
  __name: "SpeakerLabel",
22936
22945
  props: {
22937
22946
  speaker: { type: Object },
@@ -22983,19 +22992,19 @@ const _sfc_main$s = /* @__PURE__ */ defineComponent({
22983
22992
  key: 1,
22984
22993
  class: "timestamp",
22985
22994
  datetime: timestamp.value.datetime
22986
- }, toDisplayString(timestamp.value.text), 9, _hoisted_1$p)) : createCommentVNode("", true),
22987
- languageName.value ? (openBlock(), createElementBlock("span", _hoisted_2$k, toDisplayString(languageName.value), 1)) : createCommentVNode("", true)
22995
+ }, toDisplayString(timestamp.value.text), 9, _hoisted_1$q)) : createCommentVNode("", true),
22996
+ languageName.value ? (openBlock(), createElementBlock("span", _hoisted_2$l, toDisplayString(languageName.value), 1)) : createCommentVNode("", true)
22988
22997
  ], 2);
22989
22998
  };
22990
22999
  }
22991
23000
  });
22992
- const _style_0$o = "\n.speaker-label[data-v-76cb4ed6] {\n display: flex;\n border-bottom: 2px solid transparent;\n align-items: center;\n gap: var(--spacing-sm);\n}\n.speaker-name[data-v-76cb4ed6] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.speaker-name--unknown[data-v-76cb4ed6] {\n font-weight: 400;\n font-style: italic;\n color: var(--color-text-muted);\n}\n.speaker-label--interactive:hover .speaker-name[data-v-76cb4ed6] {\n text-decoration: underline;\n}\n.timestamp[data-v-76cb4ed6] {\n font-size: var(--font-size-xs);\n font-family: var(--font-family-mono);\n color: var(--color-text-muted);\n /* not supported on firefox yet */\n text-box: trim-both cap alphabetic;\n}\n.lang[data-v-76cb4ed6] {\n font-size: var(--font-size-xs);\n font-weight: 400;\n /* not supported on firefox yet */\n text-box: trim-both cap alphabetic;\n}\n";
22993
- const SpeakerLabel = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["styles", [_style_0$o]], ["__scopeId", "data-v-76cb4ed6"]]);
22994
- const _hoisted_1$o = {
23001
+ const _style_0$p = "\n.speaker-label[data-v-76cb4ed6] {\n display: flex;\n border-bottom: 2px solid transparent;\n align-items: center;\n gap: var(--spacing-sm);\n}\n.speaker-name[data-v-76cb4ed6] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.speaker-name--unknown[data-v-76cb4ed6] {\n font-weight: 400;\n font-style: italic;\n color: var(--color-text-muted);\n}\n.speaker-label--interactive:hover .speaker-name[data-v-76cb4ed6] {\n text-decoration: underline;\n}\n.timestamp[data-v-76cb4ed6] {\n font-size: var(--font-size-xs);\n font-family: var(--font-family-mono);\n color: var(--color-text-muted);\n /* not supported on firefox yet */\n text-box: trim-both cap alphabetic;\n}\n.lang[data-v-76cb4ed6] {\n font-size: var(--font-size-xs);\n font-weight: 400;\n /* not supported on firefox yet */\n text-box: trim-both cap alphabetic;\n}\n";
23002
+ const SpeakerLabel = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["styles", [_style_0$p]], ["__scopeId", "data-v-76cb4ed6"]]);
23003
+ const _hoisted_1$p = {
22995
23004
  key: 0,
22996
23005
  class: "merge-turns"
22997
23006
  };
22998
- const _sfc_main$r = /* @__PURE__ */ defineComponent({
23007
+ const _sfc_main$t = /* @__PURE__ */ defineComponent({
22999
23008
  __name: "MergeTurnsButton",
23000
23009
  props: {
23001
23010
  firstTurnId: { type: String },
@@ -23015,7 +23024,7 @@ const _sfc_main$r = /* @__PURE__ */ defineComponent({
23015
23024
  core.transcriptionEditor.mergeTurns(props.firstTurnId, props.secondTurnId);
23016
23025
  }
23017
23026
  return (_ctx, _cache) => {
23018
- return canShow.value ? (openBlock(), createElementBlock("div", _hoisted_1$o, [
23027
+ return canShow.value ? (openBlock(), createElementBlock("div", _hoisted_1$p, [
23019
23028
  createVNode(unref(Button), {
23020
23029
  size: "sm",
23021
23030
  variant: "inverse",
@@ -23028,8 +23037,8 @@ const _sfc_main$r = /* @__PURE__ */ defineComponent({
23028
23037
  };
23029
23038
  }
23030
23039
  });
23031
- const _style_0$n = "\n.merge-turns[data-v-8d977feb] {\n display: flex;\n justify-content: center;\n}\n\n/* Compact: the control sits in the gap between turns without inflating it. */\n.merge-turns[data-v-8d977feb] .editor-btn {\n --btn-height: 22px;\n}\n";
23032
- const MergeTurnsButton = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["styles", [_style_0$n]], ["__scopeId", "data-v-8d977feb"]]);
23040
+ const _style_0$o = "\n.merge-turns[data-v-8d977feb] {\n display: flex;\n justify-content: center;\n}\n\n/* Compact: the control sits in the gap between turns without inflating it. */\n.merge-turns[data-v-8d977feb] .editor-btn {\n --btn-height: 22px;\n}\n";
23041
+ const MergeTurnsButton = /* @__PURE__ */ _export_sfc(_sfc_main$t, [["styles", [_style_0$o]], ["__scopeId", "data-v-8d977feb"]]);
23033
23042
  function renameSpeaker$1(core, speakerId, newName) {
23034
23043
  const trimmed = newName.trim();
23035
23044
  const existing = core.speakers.all.get(speakerId);
@@ -23092,12 +23101,12 @@ const helpers = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
23092
23101
  switchTurnSpeaker: switchTurnSpeaker$1,
23093
23102
  updateTurnWords
23094
23103
  }, Symbol.toStringTag, { value: "Module" }));
23095
- const _hoisted_1$n = {
23104
+ const _hoisted_1$o = {
23096
23105
  type: "button",
23097
23106
  class: "speaker-popover-trigger"
23098
23107
  };
23099
- const _hoisted_2$j = { class: "speaker-popover-name" };
23100
- const _sfc_main$q = /* @__PURE__ */ defineComponent({
23108
+ const _hoisted_2$k = { class: "speaker-popover-name" };
23109
+ const _sfc_main$s = /* @__PURE__ */ defineComponent({
23101
23110
  __name: "SpeakerPopover",
23102
23111
  props: {
23103
23112
  turnId: { type: String },
@@ -23163,7 +23172,7 @@ const _sfc_main$q = /* @__PURE__ */ defineComponent({
23163
23172
  isCreatingNew.value = false;
23164
23173
  }
23165
23174
  return (_ctx, _cache) => {
23166
- return openBlock(), createBlock(unref(_sfc_main$E), {
23175
+ return openBlock(), createBlock(unref(_sfc_main$G), {
23167
23176
  open: isOpen.value,
23168
23177
  "onUpdate:open": _cache[1] || (_cache[1] = ($event) => isOpen.value = $event),
23169
23178
  items: speakers.value,
@@ -23172,7 +23181,7 @@ const _sfc_main$q = /* @__PURE__ */ defineComponent({
23172
23181
  onSelect: onPickExisting
23173
23182
  }, {
23174
23183
  trigger: withCtx(() => [
23175
- createBaseVNode("button", _hoisted_1$n, [
23184
+ createBaseVNode("button", _hoisted_1$o, [
23176
23185
  renderSlot(_ctx.$slots, "default", {}, void 0, true)
23177
23186
  ])
23178
23187
  ]),
@@ -23180,7 +23189,7 @@ const _sfc_main$q = /* @__PURE__ */ defineComponent({
23180
23189
  createVNode(unref(SpeakerIndicator), {
23181
23190
  color: item.color
23182
23191
  }, null, 8, ["color"]),
23183
- createBaseVNode("span", _hoisted_2$j, toDisplayString(item.name), 1)
23192
+ createBaseVNode("span", _hoisted_2$k, toDisplayString(item.name), 1)
23184
23193
  ]),
23185
23194
  footer: withCtx(() => [
23186
23195
  !isCreatingNew.value ? (openBlock(), createBlock(unref(Button), {
@@ -23213,8 +23222,8 @@ const _sfc_main$q = /* @__PURE__ */ defineComponent({
23213
23222
  };
23214
23223
  }
23215
23224
  });
23216
- const _style_0$m = "\n.transcript-ui-root .speaker-popover-trigger[data-v-0679fde9] {\n all: unset;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .speaker-popover-trigger[data-v-0679fde9]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.speaker-popover-name[data-v-0679fde9] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
23217
- const SpeakerPopover = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["styles", [_style_0$m]], ["__scopeId", "data-v-0679fde9"]]);
23225
+ const _style_0$n = "\n.transcript-ui-root .speaker-popover-trigger[data-v-0679fde9] {\n all: unset;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .speaker-popover-trigger[data-v-0679fde9]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.speaker-popover-name[data-v-0679fde9] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
23226
+ const SpeakerPopover = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["styles", [_style_0$n]], ["__scopeId", "data-v-0679fde9"]]);
23218
23227
  const turnSelectionKey = /* @__PURE__ */ Symbol("turnSelection");
23219
23228
  function getTurnText(turn) {
23220
23229
  if (turn.words.length > 0) {
@@ -23360,14 +23369,14 @@ function findWordAtOffset(words, offset2) {
23360
23369
  (w2) => w2.charStart != null && w2.charEnd != null && w2.charStart <= offset2 && offset2 < w2.charEnd
23361
23370
  );
23362
23371
  }
23363
- const _hoisted_1$m = ["data-turn-active", "aria-selected"];
23364
- const _hoisted_2$i = {
23372
+ const _hoisted_1$n = ["data-turn-active", "aria-selected"];
23373
+ const _hoisted_2$j = {
23365
23374
  key: 4,
23366
23375
  class: "turn-edit-actions"
23367
23376
  };
23368
23377
  const _hoisted_3$e = ["role", "tabindex", "aria-label", "aria-disabled"];
23369
23378
  const _hoisted_4$9 = ["data-word-active"];
23370
- const _sfc_main$p = /* @__PURE__ */ defineComponent({
23379
+ const _sfc_main$r = /* @__PURE__ */ defineComponent({
23371
23380
  __name: "TranscriptionTurn",
23372
23381
  props: {
23373
23382
  turn: { type: Object },
@@ -23548,7 +23557,7 @@ const _sfc_main$p = /* @__PURE__ */ defineComponent({
23548
23557
  "start-date": __props.turn.startDate,
23549
23558
  language: __props.turn.language
23550
23559
  }, null, 8, ["speaker", "start-time", "start-date", "language"])),
23551
- isEditing.value || turnLock.value ? (openBlock(), createElementBlock("div", _hoisted_2$i, [
23560
+ isEditing.value || turnLock.value ? (openBlock(), createElementBlock("div", _hoisted_2$j, [
23552
23561
  isEditing.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
23553
23562
  createVNode(unref(Button), {
23554
23563
  size: "sm",
@@ -23610,43 +23619,43 @@ const _sfc_main$p = /* @__PURE__ */ defineComponent({
23610
23619
  createTextVNode(toDisplayString(__props.turn.text), 1)
23611
23620
  ], 64)) : createCommentVNode("", true)
23612
23621
  ], 42, _hoisted_3$e))
23613
- ], 14, _hoisted_1$m);
23622
+ ], 14, _hoisted_1$n);
23614
23623
  };
23615
23624
  }
23616
23625
  });
23617
- const _style_0$l = "\n.turn[data-v-5a13b85e] {\n padding: var(--spacing-sm) var(--spacing-lg);\n}\n.turn-header[data-v-5a13b85e] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n border-radius: var(--radius-sm);\n padding: var(--spacing-xxs) 0;\n /* Reserve the edit-actions height (Button sm) so entering/leaving edit\n mode never shifts the layout. */\n min-height: 36px;\n}\n.turn-edit-actions[data-v-5a13b85e] {\n margin-left: auto;\n display: flex;\n gap: var(--spacing-xs);\n}\n\n/* Same reset as the popover's own trigger: the label IS the button. */\n.transcript-ui-root .speaker-trigger[data-v-5a13b85e] {\n all: unset;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .speaker-trigger[data-v-5a13b85e]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.turn[data-v-5a13b85e]:has(.turn-header:hover) {\n background-color: var(--color-surface-hover);\n}\n.turn-text[data-v-5a13b85e] {\n margin-top: var(--spacing-xs);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n}\n.turn-text--editable[data-v-5a13b85e] {\n cursor: text;\n}\n.turn-text--editable[data-v-5a13b85e]:focus-visible {\n outline: 2px solid var(--color-primary);\n border-radius: var(--radius-sm);\n}\n.turn--selected[data-v-5a13b85e] {\n background-color: color-mix(in srgb, var(--color-primary) 8%, transparent);\n border-left: 3px solid var(--color-primary);\n padding-left: calc(var(--spacing-lg) - 3px);\n}\n.turn--active[data-v-5a13b85e]:not(.turn--selected) {\n border-left: 3px solid var(--speaker-color);\n background-color: color-mix(in srgb, var(--speaker-color) 8%, transparent);\n padding-left: calc(var(--spacing-lg) - 3px);\n}\n.word--active[data-v-5a13b85e] {\n text-decoration: underline;\n text-decoration-color: var(--color-primary);\n text-decoration-thickness: 2px;\n text-underline-offset: 3px;\n color: var(--color-primary);\n}\n.turn--partial .turn-text[data-v-5a13b85e] {\n font-style: italic;\n color: var(--color-text-muted);\n animation: partial-fade-in-5a13b85e 200ms ease;\n}\n@keyframes partial-fade-in-5a13b85e {\nfrom {\n opacity: 0;\n}\nto {\n opacity: 1;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.turn--partial .turn-text[data-v-5a13b85e] {\n animation: none;\n}\n}\n@media (max-width: 767px) {\n.turn[data-v-5a13b85e] {\n padding: var(--spacing-sm) var(--spacing-md);\n}\n.turn--selected[data-v-5a13b85e],\n .turn--active[data-v-5a13b85e]:not(.turn--selected) {\n padding-left: calc(var(--spacing-md) - 3px);\n}\n}\n";
23618
- const TranscriptionTurn = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["styles", [_style_0$l]], ["__scopeId", "data-v-5a13b85e"]]);
23619
- const _sfc_main$o = {};
23620
- const _hoisted_1$l = {
23626
+ const _style_0$m = "\n.turn[data-v-5a13b85e] {\n padding: var(--spacing-sm) var(--spacing-lg);\n}\n.turn-header[data-v-5a13b85e] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n border-radius: var(--radius-sm);\n padding: var(--spacing-xxs) 0;\n /* Reserve the edit-actions height (Button sm) so entering/leaving edit\n mode never shifts the layout. */\n min-height: 36px;\n}\n.turn-edit-actions[data-v-5a13b85e] {\n margin-left: auto;\n display: flex;\n gap: var(--spacing-xs);\n}\n\n/* Same reset as the popover's own trigger: the label IS the button. */\n.transcript-ui-root .speaker-trigger[data-v-5a13b85e] {\n all: unset;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n border-radius: var(--radius-sm);\n}\n.transcript-ui-root .speaker-trigger[data-v-5a13b85e]:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n.turn[data-v-5a13b85e]:has(.turn-header:hover) {\n background-color: var(--color-surface-hover);\n}\n.turn-text[data-v-5a13b85e] {\n margin-top: var(--spacing-xs);\n font-size: var(--font-size-base);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n}\n.turn-text--editable[data-v-5a13b85e] {\n cursor: text;\n}\n.turn-text--editable[data-v-5a13b85e]:focus-visible {\n outline: 2px solid var(--color-primary);\n border-radius: var(--radius-sm);\n}\n.turn--selected[data-v-5a13b85e] {\n background-color: color-mix(in srgb, var(--color-primary) 8%, transparent);\n border-left: 3px solid var(--color-primary);\n padding-left: calc(var(--spacing-lg) - 3px);\n}\n.turn--active[data-v-5a13b85e]:not(.turn--selected) {\n border-left: 3px solid var(--speaker-color);\n background-color: color-mix(in srgb, var(--speaker-color) 8%, transparent);\n padding-left: calc(var(--spacing-lg) - 3px);\n}\n.word--active[data-v-5a13b85e] {\n text-decoration: underline;\n text-decoration-color: var(--color-primary);\n text-decoration-thickness: 2px;\n text-underline-offset: 3px;\n color: var(--color-primary);\n}\n.turn--partial .turn-text[data-v-5a13b85e] {\n font-style: italic;\n color: var(--color-text-muted);\n animation: partial-fade-in-5a13b85e 200ms ease;\n}\n@keyframes partial-fade-in-5a13b85e {\nfrom {\n opacity: 0;\n}\nto {\n opacity: 1;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.turn--partial .turn-text[data-v-5a13b85e] {\n animation: none;\n}\n}\n@media (max-width: 767px) {\n.turn[data-v-5a13b85e] {\n padding: var(--spacing-sm) var(--spacing-md);\n}\n.turn--selected[data-v-5a13b85e],\n .turn--active[data-v-5a13b85e]:not(.turn--selected) {\n padding-left: calc(var(--spacing-md) - 3px);\n}\n}\n";
23627
+ const TranscriptionTurn = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["styles", [_style_0$m]], ["__scopeId", "data-v-5a13b85e"]]);
23628
+ const _sfc_main$q = {};
23629
+ const _hoisted_1$m = {
23621
23630
  viewBox: "0 0 938 604",
23622
23631
  fill: "none",
23623
23632
  xmlns: "http://www.w3.org/2000/svg"
23624
23633
  };
23625
23634
  function _sfc_render(_ctx, _cache) {
23626
- return openBlock(), createElementBlock("svg", _hoisted_1$l, [..._cache[0] || (_cache[0] = [
23635
+ return openBlock(), createElementBlock("svg", _hoisted_1$m, [..._cache[0] || (_cache[0] = [
23627
23636
  createStaticVNode('<polygon points="331.5,533.5 331.5,520.5 702.5,428.5 705.5,443.5" fill="#3f3d56" transform="matrix(1.8176168,0,0,1.8176168,-452.14416,-495.30213)"></polygon><polygon points="564.5,469.5 555.5,452.5 544.5,455.5 542.5,472.5" fill="#3f3d56" transform="matrix(1.8176168,0,0,1.8176168,-452.14416,-495.30213)"></polygon><path d="m 317.61655,19.99224 c 0,0 79.97514,-5.452851 101.78654,56.34612 21.81141,61.79897 72.70468,172.67359 92.69846,189.03214 19.99379,16.35855 41.80519,59.98136 38.16995,74.52229" stroke="#3f3d56" stroke-miterlimit="10" stroke-width="9.08808"></path><path d="m 329.43106,19.083431 c 0,8.532657 -9.0733,15.449743 -23.62902,15.449743 -14.55571,0 -21.8114,-6.917086 -21.8114,-15.449743 0,-8.532657 7.25569,-15.4497427 21.8114,-15.4497427 14.55572,0 23.62902,6.9170857 23.62902,15.4497427 z" fill="currentColor" style="fill:#999999;"></path><polygon points="691.5,439.5 364.5,521.5 377.5,602.5 666.5,602.5" fill="#3f3d56" transform="matrix(1.8176168,0,0,1.8176168,-456.32371,-492.51252)"></polygon>', 5)
23628
23637
  ])]);
23629
23638
  }
23630
- const MicrophoneIllustration = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["render", _sfc_render]]);
23631
- const _hoisted_1$k = { class: "transcription-empty" };
23632
- const _hoisted_2$h = { class: "message" };
23633
- const _sfc_main$n = /* @__PURE__ */ defineComponent({
23639
+ const MicrophoneIllustration = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["render", _sfc_render]]);
23640
+ const _hoisted_1$l = { class: "transcription-empty" };
23641
+ const _hoisted_2$i = { class: "message" };
23642
+ const _sfc_main$p = /* @__PURE__ */ defineComponent({
23634
23643
  __name: "TranscriptionEmpty",
23635
23644
  setup(__props) {
23636
23645
  const { t: t2 } = useI18n();
23637
23646
  return (_ctx, _cache) => {
23638
- return openBlock(), createElementBlock("div", _hoisted_1$k, [
23647
+ return openBlock(), createElementBlock("div", _hoisted_1$l, [
23639
23648
  createVNode(MicrophoneIllustration, {
23640
23649
  class: "illustration",
23641
23650
  "aria-hidden": "true"
23642
23651
  }),
23643
- createBaseVNode("p", _hoisted_2$h, toDisplayString(unref(t2)("transcription.empty")), 1)
23652
+ createBaseVNode("p", _hoisted_2$i, toDisplayString(unref(t2)("transcription.empty")), 1)
23644
23653
  ]);
23645
23654
  };
23646
23655
  }
23647
23656
  });
23648
- const _style_0$k = "\n.transcription-empty[data-v-585c4f2b] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-lg);\n padding: var(--spacing-xl);\n}\n.illustration[data-v-585c4f2b] {\n width: 180px;\n height: auto;\n color: var(--color-text-muted);\n opacity: 0.5;\n}\n.message[data-v-585c4f2b] {\n color: var(--color-text-muted);\n font-size: var(--font-size-sm);\n text-align: center;\n margin: 0;\n}\n";
23649
- const TranscriptionEmpty = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["styles", [_style_0$k]], ["__scopeId", "data-v-585c4f2b"]]);
23657
+ const _style_0$l = "\n.transcription-empty[data-v-585c4f2b] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-lg);\n padding: var(--spacing-xl);\n}\n.illustration[data-v-585c4f2b] {\n width: 180px;\n height: auto;\n color: var(--color-text-muted);\n opacity: 0.5;\n}\n.message[data-v-585c4f2b] {\n color: var(--color-text-muted);\n font-size: var(--font-size-sm);\n text-align: center;\n margin: 0;\n}\n";
23658
+ const TranscriptionEmpty = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["styles", [_style_0$l]], ["__scopeId", "data-v-585c4f2b"]]);
23650
23659
  function activeWordRange(root2, core, wordId2) {
23651
23660
  const parsed = parseWordId(wordId2);
23652
23661
  if (!parsed) return null;
@@ -23781,8 +23790,8 @@ function useFollowPlayback(scrollContainer) {
23781
23790
  }
23782
23791
  return { isFollowing, resumeFollow };
23783
23792
  }
23784
- const _hoisted_1$j = { class: "transcription-panel" };
23785
- const _hoisted_2$g = {
23793
+ const _hoisted_1$k = { class: "transcription-panel" };
23794
+ const _hoisted_2$h = {
23786
23795
  ref: "scrollContainer",
23787
23796
  class: "scroll-container"
23788
23797
  };
@@ -23792,7 +23801,7 @@ const _hoisted_4$8 = {
23792
23801
  class: "history-loading",
23793
23802
  role: "status"
23794
23803
  };
23795
- const _hoisted_5$7 = {
23804
+ const _hoisted_5$8 = {
23796
23805
  key: 1,
23797
23806
  class: "history-start"
23798
23807
  };
@@ -23800,7 +23809,7 @@ const _hoisted_6$7 = {
23800
23809
  key: 0,
23801
23810
  class: "resume-scroll-anchor"
23802
23811
  };
23803
- const _sfc_main$m = /* @__PURE__ */ defineComponent({
23812
+ const _sfc_main$o = /* @__PURE__ */ defineComponent({
23804
23813
  __name: "TranscriptionPanel",
23805
23814
  props: {
23806
23815
  turns: { type: Array },
@@ -23897,13 +23906,13 @@ const _sfc_main$m = /* @__PURE__ */ defineComponent({
23897
23906
  scrollContainerRef.value?.removeEventListener("scroll", onScrollTop);
23898
23907
  });
23899
23908
  return (_ctx, _cache) => {
23900
- return openBlock(), createElementBlock("article", _hoisted_1$j, [
23901
- createBaseVNode("div", _hoisted_2$g, [
23909
+ return openBlock(), createElementBlock("article", _hoisted_1$k, [
23910
+ createBaseVNode("div", _hoisted_2$h, [
23902
23911
  createBaseVNode("div", _hoisted_3$d, [
23903
23912
  isLoadingHistory.value ? (openBlock(), createElementBlock("div", _hoisted_4$8, [..._cache[2] || (_cache[2] = [
23904
23913
  createBaseVNode("progress", null, null, -1)
23905
23914
  ])])) : createCommentVNode("", true),
23906
- !hasMoreHistory.value && __props.turns.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5$7, toDisplayString(unref(t2)("transcription.historyStart")), 1)) : createCommentVNode("", true),
23915
+ !hasMoreHistory.value && __props.turns.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5$8, toDisplayString(unref(t2)("transcription.historyStart")), 1)) : createCommentVNode("", true),
23907
23916
  __props.turns.length === 0 && !isLoadingHistory.value && !partialTurn.value ? (openBlock(), createBlock(TranscriptionEmpty, {
23908
23917
  key: 2,
23909
23918
  class: "transcription-empty"
@@ -23957,13 +23966,13 @@ const _sfc_main$m = /* @__PURE__ */ defineComponent({
23957
23966
  };
23958
23967
  }
23959
23968
  });
23960
- const _style_0$j = "\n.transcription-panel[data-v-66b767d7] {\n min-height: 0;\n overflow: hidden;\n background-color: var(--color-surface);\n}\n.scroll-container[data-v-66b767d7] {\n height: 100%;\n overflow: auto;\n position: relative;\n}\n.turns-container[data-v-66b767d7] {\n max-width: 80ch;\n margin-inline: auto;\n padding: var(--spacing-lg);\n}\n.turns-container[data-v-66b767d7]:has(.transcription-empty) {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n}\n.history-loading[data-v-66b767d7] {\n text-align: center;\n padding: var(--spacing-md);\n}\n.history-loading progress[data-v-66b767d7] {\n width: 120px;\n}\n.history-start[data-v-66b767d7] {\n text-align: center;\n padding: var(--spacing-md);\n color: var(--color-text-muted);\n font-size: var(--font-size-sm);\n}\n\n/* Resume scroll button — placement lives on this wrapper, never on the\n button itself: Button.vue's `.editor-btn` base rule resets `position` via\n `all: unset` (and, in the webcomponent build, gets re-injected a second\n time after everything else to reach teleported popovers/dialogs — see\n packages/webcomponent/src/index.ts), so any positioning put directly on\n the button is one rebuild away from being silently overridden again. */\n.resume-scroll-anchor[data-v-66b767d7] {\n position: sticky;\n bottom: var(--spacing-lg);\n z-index: var(--z-sticky);\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.resume-scroll-btn[data-v-66b767d7] {\n /* No backdrop-filter: this button is sticky inside the tall scroll\n container, where a backdrop-filter makes WebRender allocate a render\n target spanning the whole scroll height — multi-GB on a long transcript. */\n background: white !important;\n border: 1px solid var(--color-border);\n box-shadow: var(--shadow-sm);\n}\n\n/* Transition */\n.fade-slide-enter-active[data-v-66b767d7],\n.fade-slide-leave-active[data-v-66b767d7] {\n transition:\n opacity 200ms ease,\n translate 200ms ease;\n}\n.fade-slide-enter-from[data-v-66b767d7],\n.fade-slide-leave-to[data-v-66b767d7] {\n opacity: 0;\n translate: 0 8px;\n}\n@media (prefers-reduced-motion: reduce) {\n.fade-slide-enter-active[data-v-66b767d7],\n .fade-slide-leave-active[data-v-66b767d7] {\n transition: none;\n}\n}\n@media (max-width: 767px) {\n.turns-container[data-v-66b767d7] {\n padding: var(--spacing-md);\n}\n}\n";
23961
- const TranscriptionPanel = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["styles", [_style_0$j]], ["__scopeId", "data-v-66b767d7"]]);
23962
- const _hoisted_1$i = { class: "verbatim-panel" };
23963
- const _hoisted_2$f = { class: "verbatim-panel__content" };
23969
+ const _style_0$k = "\n.transcription-panel[data-v-66b767d7] {\n min-height: 0;\n overflow: hidden;\n background-color: var(--color-surface);\n}\n.scroll-container[data-v-66b767d7] {\n height: 100%;\n overflow: auto;\n position: relative;\n}\n.turns-container[data-v-66b767d7] {\n max-width: 80ch;\n margin-inline: auto;\n padding: var(--spacing-lg);\n}\n.turns-container[data-v-66b767d7]:has(.transcription-empty) {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n}\n.history-loading[data-v-66b767d7] {\n text-align: center;\n padding: var(--spacing-md);\n}\n.history-loading progress[data-v-66b767d7] {\n width: 120px;\n}\n.history-start[data-v-66b767d7] {\n text-align: center;\n padding: var(--spacing-md);\n color: var(--color-text-muted);\n font-size: var(--font-size-sm);\n}\n\n/* Resume scroll button — placement lives on this wrapper, never on the\n button itself: Button.vue's `.editor-btn` base rule resets `position` via\n `all: unset` (and, in the webcomponent build, gets re-injected a second\n time after everything else to reach teleported popovers/dialogs — see\n packages/webcomponent/src/index.ts), so any positioning put directly on\n the button is one rebuild away from being silently overridden again. */\n.resume-scroll-anchor[data-v-66b767d7] {\n position: sticky;\n bottom: var(--spacing-lg);\n z-index: var(--z-sticky);\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.resume-scroll-btn[data-v-66b767d7] {\n /* No backdrop-filter: this button is sticky inside the tall scroll\n container, where a backdrop-filter makes WebRender allocate a render\n target spanning the whole scroll height — multi-GB on a long transcript. */\n background: white !important;\n border: 1px solid var(--color-border);\n box-shadow: var(--shadow-sm);\n}\n\n/* Transition */\n.fade-slide-enter-active[data-v-66b767d7],\n.fade-slide-leave-active[data-v-66b767d7] {\n transition:\n opacity 200ms ease,\n translate 200ms ease;\n}\n.fade-slide-enter-from[data-v-66b767d7],\n.fade-slide-leave-to[data-v-66b767d7] {\n opacity: 0;\n translate: 0 8px;\n}\n@media (prefers-reduced-motion: reduce) {\n.fade-slide-enter-active[data-v-66b767d7],\n .fade-slide-leave-active[data-v-66b767d7] {\n transition: none;\n}\n}\n@media (max-width: 767px) {\n.turns-container[data-v-66b767d7] {\n padding: var(--spacing-md);\n}\n}\n";
23970
+ const TranscriptionPanel = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["styles", [_style_0$k]], ["__scopeId", "data-v-66b767d7"]]);
23971
+ const _hoisted_1$j = { class: "verbatim-panel" };
23972
+ const _hoisted_2$g = { class: "verbatim-panel__content" };
23964
23973
  const _hoisted_3$c = { class: "verbatim-panel__header" };
23965
23974
  const _hoisted_4$7 = { class: "verbatim-panel__doc-title" };
23966
- const _hoisted_5$6 = { class: "verbatim-panel__turns" };
23975
+ const _hoisted_5$7 = { class: "verbatim-panel__turns" };
23967
23976
  const _hoisted_6$6 = { class: "verbatim-panel__turn-header" };
23968
23977
  const _hoisted_7$3 = { class: "verbatim-panel__speaker-name" };
23969
23978
  const _hoisted_8$1 = {
@@ -23975,7 +23984,7 @@ const _hoisted_9$1 = {
23975
23984
  class: "verbatim-panel__meta"
23976
23985
  };
23977
23986
  const _hoisted_10$1 = { class: "verbatim-panel__text" };
23978
- const _sfc_main$l = /* @__PURE__ */ defineComponent({
23987
+ const _sfc_main$n = /* @__PURE__ */ defineComponent({
23979
23988
  __name: "VerbatimPanel",
23980
23989
  setup(__props) {
23981
23990
  const core = useCore();
@@ -24021,20 +24030,20 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
24021
24030
  core.emit("verbatim:export", { format: format2 });
24022
24031
  }
24023
24032
  return (_ctx, _cache) => {
24024
- return openBlock(), createElementBlock("section", _hoisted_1$i, [
24033
+ return openBlock(), createElementBlock("section", _hoisted_1$j, [
24025
24034
  createVNode(unref(DocumentArticle), null, {
24026
24035
  "toolbar-right": withCtx(() => [
24027
- createVNode(unref(_sfc_main$y), {
24036
+ createVNode(unref(_sfc_main$A), {
24028
24037
  formats: unref(core).verbatimFormats.value,
24029
24038
  onSelect: onExport
24030
24039
  }, null, 8, ["formats"])
24031
24040
  ]),
24032
24041
  default: withCtx(() => [
24033
- createBaseVNode("article", _hoisted_2$f, [
24042
+ createBaseVNode("article", _hoisted_2$g, [
24034
24043
  createBaseVNode("header", _hoisted_3$c, [
24035
24044
  createBaseVNode("h1", _hoisted_4$7, toDisplayString(title.value), 1)
24036
24045
  ]),
24037
- createBaseVNode("ul", _hoisted_5$6, [
24046
+ createBaseVNode("ul", _hoisted_5$7, [
24038
24047
  (openBlock(true), createElementBlock(Fragment, null, renderList(turns.value, (turn) => {
24039
24048
  return openBlock(), createElementBlock("li", {
24040
24049
  key: turn.id,
@@ -24069,9 +24078,9 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
24069
24078
  };
24070
24079
  }
24071
24080
  });
24072
- const _style_0$i = "\n.verbatim-panel[data-v-7a077f5a] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n.verbatim-panel__content[data-v-7a077f5a] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n}\n.verbatim-panel__header[data-v-7a077f5a] {\n margin-bottom: var(--spacing-lg);\n padding-bottom: var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n}\n.verbatim-panel__doc-title[data-v-7a077f5a] {\n font-size: var(--font-size-xl);\n font-weight: 700;\n margin: 0;\n color: var(--color-text-primary);\n}\n.verbatim-panel__turns[data-v-7a077f5a] {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-lg);\n}\n.verbatim-panel__turn[data-v-7a077f5a] {\n display: block;\n}\n.verbatim-panel__turn-header[data-v-7a077f5a] {\n margin: 0 0 var(--spacing-xs);\n font-size: var(--font-size-base);\n line-height: 1.4;\n}\n.verbatim-panel__speaker-name[data-v-7a077f5a] {\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.verbatim-panel__meta[data-v-7a077f5a] {\n color: var(--color-text-muted);\n font-weight: 400;\n}\n.verbatim-panel__sep[data-v-7a077f5a] {\n margin: 0 0.35em;\n}\n.verbatim-panel__text[data-v-7a077f5a] {\n margin: 0;\n font-size: var(--font-size-base);\n line-height: 1.6;\n color: var(--color-text-primary);\n}\n\n";
24073
- const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["styles", [_style_0$i]], ["__scopeId", "data-v-7a077f5a"]]);
24074
- const _sfc_main$k = /* @__PURE__ */ defineComponent({
24081
+ const _style_0$j = "\n.verbatim-panel[data-v-7a077f5a] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n.verbatim-panel__content[data-v-7a077f5a] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n}\n.verbatim-panel__header[data-v-7a077f5a] {\n margin-bottom: var(--spacing-lg);\n padding-bottom: var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n}\n.verbatim-panel__doc-title[data-v-7a077f5a] {\n font-size: var(--font-size-xl);\n font-weight: 700;\n margin: 0;\n color: var(--color-text-primary);\n}\n.verbatim-panel__turns[data-v-7a077f5a] {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-lg);\n}\n.verbatim-panel__turn[data-v-7a077f5a] {\n display: block;\n}\n.verbatim-panel__turn-header[data-v-7a077f5a] {\n margin: 0 0 var(--spacing-xs);\n font-size: var(--font-size-base);\n line-height: 1.4;\n}\n.verbatim-panel__speaker-name[data-v-7a077f5a] {\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.verbatim-panel__meta[data-v-7a077f5a] {\n color: var(--color-text-muted);\n font-weight: 400;\n}\n.verbatim-panel__sep[data-v-7a077f5a] {\n margin: 0 0.35em;\n}\n.verbatim-panel__text[data-v-7a077f5a] {\n margin: 0;\n font-size: var(--font-size-base);\n line-height: 1.6;\n color: var(--color-text-primary);\n}\n\n";
24082
+ const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["styles", [_style_0$j]], ["__scopeId", "data-v-7a077f5a"]]);
24083
+ const _sfc_main$m = /* @__PURE__ */ defineComponent({
24075
24084
  __name: "ChannelSelector",
24076
24085
  props: {
24077
24086
  channels: { type: Array },
@@ -24097,7 +24106,7 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
24097
24106
  };
24098
24107
  }
24099
24108
  });
24100
- const _sfc_main$j = /* @__PURE__ */ defineComponent({
24109
+ const _sfc_main$l = /* @__PURE__ */ defineComponent({
24101
24110
  __name: "TranslationSelector",
24102
24111
  props: {
24103
24112
  translations: { type: Array },
@@ -24129,10 +24138,10 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
24129
24138
  };
24130
24139
  }
24131
24140
  });
24132
- const _hoisted_1$h = { class: "merge-dialog-title" };
24133
- const _hoisted_2$e = { class: "merge-dialog-description" };
24141
+ const _hoisted_1$i = { class: "merge-dialog-title" };
24142
+ const _hoisted_2$f = { class: "merge-dialog-description" };
24134
24143
  const _hoisted_3$b = { class: "merge-dialog-actions" };
24135
- const _sfc_main$i = /* @__PURE__ */ defineComponent({
24144
+ const _sfc_main$k = /* @__PURE__ */ defineComponent({
24136
24145
  __name: "MergeDialog",
24137
24146
  props: {
24138
24147
  open: { type: Boolean },
@@ -24200,8 +24209,8 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
24200
24209
  class: "merge-dialog-form",
24201
24210
  onSubmit: withModifiers(onConfirm, ["prevent"])
24202
24211
  }, [
24203
- createBaseVNode("h2", _hoisted_1$h, toDisplayString(unref(t2)("mergeDialog.title")), 1),
24204
- createBaseVNode("p", _hoisted_2$e, [
24212
+ createBaseVNode("h2", _hoisted_1$i, toDisplayString(unref(t2)("mergeDialog.title")), 1),
24213
+ createBaseVNode("p", _hoisted_2$f, [
24205
24214
  createBaseVNode("strong", null, toDisplayString(fromSpeaker.value.name), 1),
24206
24215
  createTextVNode(" · " + toDisplayString(affectedCount.value) + " " + toDisplayString(unref(t2)("mergeDialog.turnsAffected")), 1)
24207
24216
  ]),
@@ -24239,10 +24248,10 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
24239
24248
  };
24240
24249
  }
24241
24250
  });
24242
- const _style_0$h = "\n.merge-dialog[data-v-e658bcd0] {\n margin: auto;\n max-width: 420px;\n width: 90vw;\n padding: var(--spacing-lg);\n background-color: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n color: var(--color-text-primary);\n box-shadow: 0 16px 48px color-mix(in srgb, var(--color-text-primary) 20%, transparent);\n}\n.merge-dialog[data-v-e658bcd0]::backdrop {\n /* No backdrop-filter: a full-viewport backdrop blur is a large WebRender\n render target; the dim background alone is enough. */\n background-color: color-mix(in srgb, var(--color-text-primary) 35%, transparent);\n}\n.merge-dialog-form[data-v-e658bcd0] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n}\n.merge-dialog-title[data-v-e658bcd0] {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n}\n.merge-dialog-description[data-v-e658bcd0] {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n.merge-dialog-actions[data-v-e658bcd0] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-sm);\n}\n";
24243
- const MergeDialog = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["styles", [_style_0$h]], ["__scopeId", "data-v-e658bcd0"]]);
24244
- const _hoisted_1$g = { class: "speaker-sidebar" };
24245
- const _hoisted_2$d = {
24251
+ const _style_0$i = "\n.merge-dialog[data-v-e658bcd0] {\n margin: auto;\n max-width: 420px;\n width: 90vw;\n padding: var(--spacing-lg);\n background-color: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n color: var(--color-text-primary);\n box-shadow: 0 16px 48px color-mix(in srgb, var(--color-text-primary) 20%, transparent);\n}\n.merge-dialog[data-v-e658bcd0]::backdrop {\n /* No backdrop-filter: a full-viewport backdrop blur is a large WebRender\n render target; the dim background alone is enough. */\n background-color: color-mix(in srgb, var(--color-text-primary) 35%, transparent);\n}\n.merge-dialog-form[data-v-e658bcd0] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n}\n.merge-dialog-title[data-v-e658bcd0] {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n}\n.merge-dialog-description[data-v-e658bcd0] {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n.merge-dialog-actions[data-v-e658bcd0] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-sm);\n}\n";
24252
+ const MergeDialog = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["styles", [_style_0$i]], ["__scopeId", "data-v-e658bcd0"]]);
24253
+ const _hoisted_1$h = { class: "speaker-sidebar" };
24254
+ const _hoisted_2$e = {
24246
24255
  key: 0,
24247
24256
  class: "sidebar-section sidebar-section--selector"
24248
24257
  };
@@ -24251,7 +24260,7 @@ const _hoisted_4$6 = {
24251
24260
  key: 1,
24252
24261
  class: "sidebar-section sidebar-section--selector"
24253
24262
  };
24254
- const _hoisted_5$5 = { class: "sidebar-title" };
24263
+ const _hoisted_5$6 = { class: "sidebar-title" };
24255
24264
  const _hoisted_6$5 = {
24256
24265
  key: 2,
24257
24266
  class: "sidebar-section"
@@ -24294,7 +24303,7 @@ const _hoisted_27 = {
24294
24303
  };
24295
24304
  const _hoisted_28 = { class: "sidebar-title" };
24296
24305
  const _hoisted_29 = { class: "speaker-list" };
24297
- const _sfc_main$h = /* @__PURE__ */ defineComponent({
24306
+ const _sfc_main$j = /* @__PURE__ */ defineComponent({
24298
24307
  __name: "SpeakerSidebar",
24299
24308
  props: {
24300
24309
  speakers: { type: Array },
@@ -24379,18 +24388,18 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
24379
24388
  core.emit("llmService:selectVersion", { id: service.id, versionNumber });
24380
24389
  }
24381
24390
  return (_ctx, _cache) => {
24382
- return openBlock(), createElementBlock("aside", _hoisted_1$g, [
24383
- __props.channels.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_2$d, [
24391
+ return openBlock(), createElementBlock("aside", _hoisted_1$h, [
24392
+ __props.channels.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_2$e, [
24384
24393
  createBaseVNode("h2", _hoisted_3$a, toDisplayString(unref(t2)("sidebar.channel")), 1),
24385
- createVNode(_sfc_main$k, {
24394
+ createVNode(_sfc_main$m, {
24386
24395
  channels: __props.channels,
24387
24396
  "selected-channel-id": __props.selectedChannelId,
24388
24397
  "onUpdate:selectedChannelId": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:selectedChannelId", $event))
24389
24398
  }, null, 8, ["channels", "selected-channel-id"])
24390
24399
  ])) : createCommentVNode("", true),
24391
24400
  __props.translations.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_4$6, [
24392
- createBaseVNode("h2", _hoisted_5$5, toDisplayString(unref(t2)("sidebar.translation")), 1),
24393
- createVNode(_sfc_main$j, {
24401
+ createBaseVNode("h2", _hoisted_5$6, toDisplayString(unref(t2)("sidebar.translation")), 1),
24402
+ createVNode(_sfc_main$l, {
24394
24403
  translations: __props.translations,
24395
24404
  "selected-translation-id": __props.selectedTranslationId,
24396
24405
  "onUpdate:selectedTranslationId": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:selectedTranslationId", $event))
@@ -24535,7 +24544,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
24535
24544
  "aria-label": unref(t2)("sidebar.renameSpeaker"),
24536
24545
  onCommit: ($event) => onRename(speaker.id, $event)
24537
24546
  }, null, 8, ["model-value", "disabled", "aria-label", "onCommit"]),
24538
- canEditSpeakers.value && __props.speakers.length > 1 ? (openBlock(), createBlock(unref(_sfc_main$x), {
24547
+ canEditSpeakers.value && __props.speakers.length > 1 ? (openBlock(), createBlock(unref(_sfc_main$z), {
24539
24548
  key: 0,
24540
24549
  "speaker-name": speaker.name,
24541
24550
  onMerge: ($event) => onOpenMerge(speaker.id)
@@ -24554,9 +24563,9 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
24554
24563
  };
24555
24564
  }
24556
24565
  });
24557
- const _style_0$g = '\n.speaker-sidebar[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-lg);\n padding: var(--spacing-lg);\n border-left: 1px solid var(--color-border);\n background-color: var(--color-surface);\n overflow-y: auto;\n}\n.sidebar-section[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n.sidebar-title[data-v-3b1e278f] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.speaker-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n}\n.speaker-item[data-v-3b1e278f] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm);\n border-radius: var(--radius-md);\n transition: background-color var(--transition-duration);\n}\n.speaker-item[data-v-3b1e278f]:hover {\n background-color: var(--color-surface-hover);\n}\n.speaker-name[data-v-3b1e278f] {\n flex: 1;\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-text-primary);\n}\n.subtitle-toggle[data-v-3b1e278f] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm);\n border-radius: var(--radius-md);\n}\n.subtitle-toggle-label[data-v-3b1e278f] {\n font-size: var(--font-size-sm);\n color: var(--color-text-primary);\n}\n.voice-playback-hint[data-v-3b1e278f] {\n padding: 0 var(--spacing-sm);\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n.voice-playback-hint--warning[data-v-3b1e278f] {\n color: var(--color-danger);\n}\n.subtitle-slider[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n padding: var(--spacing-sm);\n}\n.subtitle-slider-label[data-v-3b1e278f] {\n display: flex;\n justify-content: space-between;\n font-size: var(--font-size-sm);\n color: var(--color-text-primary);\n}\n.subtitle-slider-value[data-v-3b1e278f] {\n color: var(--color-text-muted);\n font-variant-numeric: tabular-nums;\n}\n.subtitle-slider input[type="range"][data-v-3b1e278f] {\n width: 100%;\n accent-color: var(--color-primary);\n}\n.subtitle-slider input[type="range"][data-v-3b1e278f]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ── History (LLM generations + versions) ──────────────────────────── */\n.sidebar-section--busy[data-v-3b1e278f] {\n opacity: 0.6;\n pointer-events: none;\n}\n.history-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n margin: 0;\n padding: 0;\n}\n.history-generation[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n}\n.history-generation__status--completed[data-v-3b1e278f] {\n color: var(--color-success, #2e7d32);\n}\n.history-generation__status--error[data-v-3b1e278f] {\n color: var(--color-danger, #d33);\n}\n.history-generation__status--processing[data-v-3b1e278f],\n.history-generation__status--queued[data-v-3b1e278f] {\n color: var(--color-primary);\n}\n.history-version-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: var(--spacing-xs) 0 0 var(--spacing-md);\n padding: 0;\n border-left: 1px solid var(--color-border);\n}\n\n/* Nudge nested version rows off the connecting border line. */\n.history-version-list[data-v-3b1e278f] .selectable-list-item {\n margin-left: var(--spacing-xs);\n}\n@media (max-width: 767px) {\n.speaker-sidebar[data-v-3b1e278f] {\n border-left: none;\n}\n.sidebar-section--selector[data-v-3b1e278f] {\n display: none;\n}\n}\n';
24558
- const SpeakerSidebar = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["styles", [_style_0$g]], ["__scopeId", "data-v-3b1e278f"]]);
24559
- const _sfc_main$g = /* @__PURE__ */ defineComponent({
24566
+ const _style_0$h = '\n.speaker-sidebar[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-lg);\n padding: var(--spacing-lg);\n border-left: 1px solid var(--color-border);\n background-color: var(--color-surface);\n overflow-y: auto;\n}\n.sidebar-section[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n.sidebar-title[data-v-3b1e278f] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.speaker-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n}\n.speaker-item[data-v-3b1e278f] {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm);\n border-radius: var(--radius-md);\n transition: background-color var(--transition-duration);\n}\n.speaker-item[data-v-3b1e278f]:hover {\n background-color: var(--color-surface-hover);\n}\n.speaker-name[data-v-3b1e278f] {\n flex: 1;\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-text-primary);\n}\n.subtitle-toggle[data-v-3b1e278f] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm);\n border-radius: var(--radius-md);\n}\n.subtitle-toggle-label[data-v-3b1e278f] {\n font-size: var(--font-size-sm);\n color: var(--color-text-primary);\n}\n.voice-playback-hint[data-v-3b1e278f] {\n padding: 0 var(--spacing-sm);\n font-size: var(--font-size-xs);\n color: var(--color-text-muted);\n}\n.voice-playback-hint--warning[data-v-3b1e278f] {\n color: var(--color-danger);\n}\n.subtitle-slider[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n padding: var(--spacing-sm);\n}\n.subtitle-slider-label[data-v-3b1e278f] {\n display: flex;\n justify-content: space-between;\n font-size: var(--font-size-sm);\n color: var(--color-text-primary);\n}\n.subtitle-slider-value[data-v-3b1e278f] {\n color: var(--color-text-muted);\n font-variant-numeric: tabular-nums;\n}\n.subtitle-slider input[type="range"][data-v-3b1e278f] {\n width: 100%;\n accent-color: var(--color-primary);\n}\n.subtitle-slider input[type="range"][data-v-3b1e278f]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ── History (LLM generations + versions) ──────────────────────────── */\n.sidebar-section--busy[data-v-3b1e278f] {\n opacity: 0.6;\n pointer-events: none;\n}\n.history-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n margin: 0;\n padding: 0;\n}\n.history-generation[data-v-3b1e278f] {\n display: flex;\n flex-direction: column;\n}\n.history-generation__status--completed[data-v-3b1e278f] {\n color: var(--color-success, #2e7d32);\n}\n.history-generation__status--error[data-v-3b1e278f] {\n color: var(--color-danger, #d33);\n}\n.history-generation__status--processing[data-v-3b1e278f],\n.history-generation__status--queued[data-v-3b1e278f] {\n color: var(--color-primary);\n}\n.history-version-list[data-v-3b1e278f] {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: var(--spacing-xs) 0 0 var(--spacing-md);\n padding: 0;\n border-left: 1px solid var(--color-border);\n}\n\n/* Nudge nested version rows off the connecting border line. */\n.history-version-list[data-v-3b1e278f] .selectable-list-item {\n margin-left: var(--spacing-xs);\n}\n@media (max-width: 767px) {\n.speaker-sidebar[data-v-3b1e278f] {\n border-left: none;\n}\n.sidebar-section--selector[data-v-3b1e278f] {\n display: none;\n}\n}\n';
24567
+ const SpeakerSidebar = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["styles", [_style_0$h]], ["__scopeId", "data-v-3b1e278f"]]);
24568
+ const _sfc_main$i = /* @__PURE__ */ defineComponent({
24560
24569
  __name: "SidebarDrawer",
24561
24570
  props: {
24562
24571
  "open": { type: Boolean, ...{ required: true } },
@@ -24605,10 +24614,10 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
24605
24614
  };
24606
24615
  }
24607
24616
  });
24608
- const _hoisted_1$f = ["aria-label"];
24609
- const _hoisted_2$c = { class: "selection-count" };
24617
+ const _hoisted_1$g = ["aria-label"];
24618
+ const _hoisted_2$d = { class: "selection-count" };
24610
24619
  const _hoisted_3$9 = { class: "selection-actions" };
24611
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
24620
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
24612
24621
  __name: "SelectionActionBar",
24613
24622
  setup(__props) {
24614
24623
  const selection = useTurnSelection();
@@ -24620,7 +24629,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
24620
24629
  role: "toolbar",
24621
24630
  "aria-label": unref(t2)("selection.count")
24622
24631
  }, [
24623
- createBaseVNode("span", _hoisted_2$c, toDisplayString(unref(selection).count.value) + " " + toDisplayString(unref(t2)("selection.count")), 1),
24632
+ createBaseVNode("span", _hoisted_2$d, toDisplayString(unref(selection).count.value) + " " + toDisplayString(unref(t2)("selection.count")), 1),
24624
24633
  createBaseVNode("div", _hoisted_3$9, [
24625
24634
  createVNode(unref(CopyButton), {
24626
24635
  icon: "clipboard-type",
@@ -24652,18 +24661,18 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
24652
24661
  _: 1
24653
24662
  })
24654
24663
  ])
24655
- ], 8, _hoisted_1$f)) : createCommentVNode("", true);
24664
+ ], 8, _hoisted_1$g)) : createCommentVNode("", true);
24656
24665
  };
24657
24666
  }
24658
24667
  });
24659
- const _style_0$f = "\n.selection-bar[data-v-9bad1410] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-xs) var(--spacing-lg);\n /* No backdrop-filter: it forces a WebRender backdrop render target sized to\n the content behind, a heavy GPU-memory cost on long transcripts. The\n semi-opaque glass background stays legible without the blur. */\n background: var(--glass-background);\n border-bottom: 1px solid var(--color-border);\n animation: bar-slide-down-9bad1410 var(--transition-duration) ease;\n}\n.selection-count[data-v-9bad1410] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-primary);\n}\n.selection-actions[data-v-9bad1410] {\n display: flex;\n gap: var(--spacing-xs);\n}\n@keyframes bar-slide-down-9bad1410 {\nfrom {\n opacity: 0;\n translate: 0 -4px;\n}\nto {\n opacity: 1;\n translate: 0 0;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.selection-bar[data-v-9bad1410] {\n animation: none;\n}\n}\n@media (max-width: 767px) {\n.selection-bar[data-v-9bad1410] {\n padding: var(--spacing-xs) var(--spacing-md);\n flex-wrap: wrap;\n gap: var(--spacing-xs);\n}\n}\n";
24660
- const SelectionActionBar = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["styles", [_style_0$f]], ["__scopeId", "data-v-9bad1410"]]);
24661
- const _hoisted_1$e = { class: "editor-layout" };
24662
- const _hoisted_2$b = {
24668
+ const _style_0$g = "\n.selection-bar[data-v-9bad1410] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-xs) var(--spacing-lg);\n /* No backdrop-filter: it forces a WebRender backdrop render target sized to\n the content behind, a heavy GPU-memory cost on long transcripts. The\n semi-opaque glass background stays legible without the blur. */\n background: var(--glass-background);\n border-bottom: 1px solid var(--color-border);\n animation: bar-slide-down-9bad1410 var(--transition-duration) ease;\n}\n.selection-count[data-v-9bad1410] {\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-primary);\n}\n.selection-actions[data-v-9bad1410] {\n display: flex;\n gap: var(--spacing-xs);\n}\n@keyframes bar-slide-down-9bad1410 {\nfrom {\n opacity: 0;\n translate: 0 -4px;\n}\nto {\n opacity: 1;\n translate: 0 0;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.selection-bar[data-v-9bad1410] {\n animation: none;\n}\n}\n@media (max-width: 767px) {\n.selection-bar[data-v-9bad1410] {\n padding: var(--spacing-xs) var(--spacing-md);\n flex-wrap: wrap;\n gap: var(--spacing-xs);\n}\n}\n";
24669
+ const SelectionActionBar = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["styles", [_style_0$g]], ["__scopeId", "data-v-9bad1410"]]);
24670
+ const _hoisted_1$f = { class: "editor-layout" };
24671
+ const _hoisted_2$c = {
24663
24672
  key: 6,
24664
24673
  class: "mobile-selectors"
24665
24674
  };
24666
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
24675
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
24667
24676
  __name: "Layout",
24668
24677
  props: {
24669
24678
  showHeader: { type: Boolean, default: true },
@@ -24728,7 +24737,9 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24728
24737
  () => props.showVerbatim,
24729
24738
  (canShow) => {
24730
24739
  if (canShow) return;
24731
- const withoutVerbatim = shownPanels.value.filter((id) => id !== VERBATIM_TAB);
24740
+ const withoutVerbatim = shownPanels.value.filter(
24741
+ (id) => id !== VERBATIM_TAB
24742
+ );
24732
24743
  shownPanels.value = withoutVerbatim.length > 0 ? withoutVerbatim : [TRANSCRIPTION_TAB];
24733
24744
  }
24734
24745
  );
@@ -24753,7 +24764,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24753
24764
  core.activeChannel.value?.setActiveTranslation(translationId);
24754
24765
  }
24755
24766
  return (_ctx, _cache) => {
24756
- return openBlock(), createElementBlock("div", _hoisted_1$e, [
24767
+ return openBlock(), createElementBlock("div", _hoisted_1$f, [
24757
24768
  props.showHeader ? (openBlock(), createBlock(Header, {
24758
24769
  key: 0,
24759
24770
  title: unref(core).title.value,
@@ -24769,7 +24780,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24769
24780
  onUndo: _cache[2] || (_cache[2] = ($event) => unref(core).transcriptionEditor?.undo()),
24770
24781
  onRedo: _cache[3] || (_cache[3] = ($event) => unref(core).transcriptionEditor?.redo())
24771
24782
  }, null, 8, ["title", "date", "duration", "speaker-count", "is-mobile", "can-ask", "can-undo", "can-redo"])) : createCommentVNode("", true),
24772
- createVNode(_sfc_main$t, {
24783
+ createVNode(_sfc_main$v, {
24773
24784
  "model-value": activeTab.value,
24774
24785
  "show-verbatim": props.showVerbatim,
24775
24786
  "onUpdate:modelValue": _cache[4] || (_cache[4] = (tab) => shownPanels.value = [tab])
@@ -24809,7 +24820,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24809
24820
  "onUpdate:selectedChannelId": onChannelChange,
24810
24821
  "onUpdate:selectedTranslationId": onTranslationChange
24811
24822
  }, null, 8, ["speakers", "channels", "selected-channel-id", "translations", "selected-translation-id", "show-speakers"])) : createCommentVNode("", true),
24812
- unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$g, {
24823
+ unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$i, {
24813
24824
  key: 1,
24814
24825
  open: isSidebarOpen.value,
24815
24826
  "onUpdate:open": _cache[6] || (_cache[6] = ($event) => isSidebarOpen.value = $event)
@@ -24838,14 +24849,14 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24838
24849
  unref(core).subtitle?.isVisible.value && !unref(isMobile) && !unref(core).subtitle.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleBanner), { key: 3 })) : createCommentVNode("", true),
24839
24850
  unref(core).subtitle?.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleFullscreen), { key: 4 })) : createCommentVNode("", true),
24840
24851
  unref(core).chat ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.chatDrawer), { key: 5 })) : createCommentVNode("", true),
24841
- unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_2$b, [
24842
- channels.value.length > 1 ? (openBlock(), createBlock(_sfc_main$k, {
24852
+ unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_2$c, [
24853
+ channels.value.length > 1 ? (openBlock(), createBlock(_sfc_main$m, {
24843
24854
  key: 0,
24844
24855
  channels: channels.value,
24845
24856
  "selected-channel-id": unref(core).activeChannelId.value,
24846
24857
  "onUpdate:selectedChannelId": onChannelChange
24847
24858
  }, null, 8, ["channels", "selected-channel-id"])) : createCommentVNode("", true),
24848
- translations.value.length > 1 ? (openBlock(), createBlock(_sfc_main$j, {
24859
+ translations.value.length > 1 ? (openBlock(), createBlock(_sfc_main$l, {
24849
24860
  key: 1,
24850
24861
  translations: translations.value,
24851
24862
  "selected-translation-id": activeTranslationId.value,
@@ -24856,41 +24867,41 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24856
24867
  };
24857
24868
  }
24858
24869
  });
24859
- const _style_0$e = "\n.editor-layout[data-v-972b2fff] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background-color: var(--color-background);\n}\n.editor-body[data-v-972b2fff] {\n display: grid;\n grid-template-columns: 1fr var(--sidebar-width);\n flex: 1;\n min-height: 0;\n}\n\n/* Split mode: two panels already share the body between them, no room (or\n need) for the speaker sidebar too — see Layout's panels/isSplit state. */\n.editor-body--no-sidebar[data-v-972b2fff] {\n grid-template-columns: 1fr;\n}\n.editor-body__panels[data-v-972b2fff] {\n display: flex;\n min-width: 0;\n min-height: 0;\n}\n.editor-body__panels[data-v-972b2fff] > * {\n flex: 1;\n min-width: 0;\n}\n.editor-body__panels--split[data-v-972b2fff] > * + * {\n border-left: 1px solid var(--color-border);\n}\n.mobile-selectors[data-v-972b2fff] {\n display: flex;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n border-top: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n box-shadow: var(--shadow-md);\n align-items: end;\n}\n.mobile-selectors[data-v-972b2fff] > * {\n flex: 1;\n min-width: 0;\n}\n@media (max-width: 767px) {\n.editor-body[data-v-972b2fff] {\n grid-template-columns: 1fr;\n}\n}\n";
24860
- const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$e]], ["__scopeId", "data-v-972b2fff"]]);
24861
- const _hoisted_1$d = {
24870
+ const _style_0$f = "\n.editor-layout[data-v-c7029599] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background-color: var(--color-background);\n}\n.editor-body[data-v-c7029599] {\n display: grid;\n grid-template-columns: 1fr var(--sidebar-width);\n flex: 1;\n min-height: 0;\n}\n\n/* Split mode: two panels already share the body between them, no room (or\n need) for the speaker sidebar too — see Layout's panels/isSplit state. */\n.editor-body--no-sidebar[data-v-c7029599] {\n grid-template-columns: 1fr;\n}\n.editor-body__panels[data-v-c7029599] {\n display: flex;\n min-width: 0;\n min-height: 0;\n}\n.editor-body__panels[data-v-c7029599] > * {\n flex: 1;\n min-width: 0;\n}\n.editor-body__panels--split[data-v-c7029599] > * + * {\n border-left: 1px solid var(--color-border);\n}\n.mobile-selectors[data-v-c7029599] {\n display: flex;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n border-top: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n box-shadow: var(--shadow-md);\n align-items: end;\n}\n.mobile-selectors[data-v-c7029599] > * {\n flex: 1;\n min-width: 0;\n}\n@media (max-width: 767px) {\n.editor-body[data-v-c7029599] {\n grid-template-columns: 1fr;\n}\n}\n";
24871
+ const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["styles", [_style_0$f]], ["__scopeId", "data-v-c7029599"]]);
24872
+ const _hoisted_1$e = {
24862
24873
  class: "editor-loading",
24863
24874
  role: "status",
24864
24875
  "aria-live": "polite"
24865
24876
  };
24866
- const _hoisted_2$a = { class: "editor-loading__label" };
24867
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
24877
+ const _hoisted_2$b = { class: "editor-loading__label" };
24878
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
24868
24879
  __name: "EditorLoadingOverlay",
24869
24880
  setup(__props) {
24870
24881
  const { t: t2 } = useI18n();
24871
24882
  return (_ctx, _cache) => {
24872
- return openBlock(), createElementBlock("div", _hoisted_1$d, [
24883
+ return openBlock(), createElementBlock("div", _hoisted_1$e, [
24873
24884
  _cache[0] || (_cache[0] = createBaseVNode("span", {
24874
24885
  class: "editor-loading__spinner",
24875
24886
  "aria-hidden": "true"
24876
24887
  }, null, -1)),
24877
- createBaseVNode("span", _hoisted_2$a, toDisplayString(unref(t2)("editor.loading")), 1)
24888
+ createBaseVNode("span", _hoisted_2$b, toDisplayString(unref(t2)("editor.loading")), 1)
24878
24889
  ]);
24879
24890
  };
24880
24891
  }
24881
24892
  });
24882
- const _style_0$d = "\n.editor-loading[data-v-f56c39db] {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-md);\n /* Opaque so the half-built layout never flashes behind while collab syncs.\n No backdrop-filter: it is banned in this package (WebRender GTT freeze). */\n background-color: var(--color-background);\n color: var(--color-text-secondary);\n font-family: var(--font-family);\n font-size: var(--font-size-sm);\n}\n.editor-loading__spinner[data-v-f56c39db] {\n width: 32px;\n height: 32px;\n border: 3px solid var(--color-border);\n border-top-color: var(--color-primary);\n border-radius: 50%;\n animation: editor-loading-spin-f56c39db 0.8s linear infinite;\n}\n@keyframes editor-loading-spin-f56c39db {\nto {\n transform: rotate(360deg);\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.editor-loading__spinner[data-v-f56c39db] {\n animation: none;\n}\n}\n";
24883
- const EditorLoadingOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["styles", [_style_0$d]], ["__scopeId", "data-v-f56c39db"]]);
24884
- const _hoisted_1$c = {
24893
+ const _style_0$e = "\n.editor-loading[data-v-f56c39db] {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-md);\n /* Opaque so the half-built layout never flashes behind while collab syncs.\n No backdrop-filter: it is banned in this package (WebRender GTT freeze). */\n background-color: var(--color-background);\n color: var(--color-text-secondary);\n font-family: var(--font-family);\n font-size: var(--font-size-sm);\n}\n.editor-loading__spinner[data-v-f56c39db] {\n width: 32px;\n height: 32px;\n border: 3px solid var(--color-border);\n border-top-color: var(--color-primary);\n border-radius: 50%;\n animation: editor-loading-spin-f56c39db 0.8s linear infinite;\n}\n@keyframes editor-loading-spin-f56c39db {\nto {\n transform: rotate(360deg);\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.editor-loading__spinner[data-v-f56c39db] {\n animation: none;\n}\n}\n";
24894
+ const EditorLoadingOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["styles", [_style_0$e]], ["__scopeId", "data-v-f56c39db"]]);
24895
+ const _hoisted_1$d = {
24885
24896
  class: "editor-error",
24886
24897
  role: "alert"
24887
24898
  };
24888
- const _hoisted_2$9 = { class: "editor-error__title" };
24899
+ const _hoisted_2$a = { class: "editor-error__title" };
24889
24900
  const _hoisted_3$8 = {
24890
24901
  key: 0,
24891
24902
  class: "editor-error__detail"
24892
24903
  };
24893
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
24904
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24894
24905
  __name: "EditorErrorOverlay",
24895
24906
  props: {
24896
24907
  message: { type: [String, null] }
@@ -24898,20 +24909,20 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
24898
24909
  setup(__props) {
24899
24910
  const { t: t2 } = useI18n();
24900
24911
  return (_ctx, _cache) => {
24901
- return openBlock(), createElementBlock("div", _hoisted_1$c, [
24912
+ return openBlock(), createElementBlock("div", _hoisted_1$d, [
24902
24913
  createVNode(unref(EditorIcon), {
24903
24914
  name: "warning",
24904
24915
  size: 40,
24905
24916
  class: "editor-error__icon"
24906
24917
  }),
24907
- createBaseVNode("p", _hoisted_2$9, toDisplayString(unref(t2)("editor.loadError")), 1),
24918
+ createBaseVNode("p", _hoisted_2$a, toDisplayString(unref(t2)("editor.loadError")), 1),
24908
24919
  __props.message ? (openBlock(), createElementBlock("p", _hoisted_3$8, toDisplayString(__props.message), 1)) : createCommentVNode("", true)
24909
24920
  ]);
24910
24921
  };
24911
24922
  }
24912
24923
  });
24913
- const _style_0$c = "\n.editor-error[data-v-eefc2d23] {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xl);\n text-align: center;\n /* Opaque so the half-built layout never shows behind. No backdrop-filter:\n it is banned in this package (WebRender GTT freeze). */\n background-color: var(--color-background);\n font-family: var(--font-family);\n}\n.editor-error__icon[data-v-eefc2d23] {\n color: var(--color-danger);\n}\n.editor-error__title[data-v-eefc2d23] {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.editor-error__detail[data-v-eefc2d23] {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--color-text-muted);\n}\n";
24914
- const EditorErrorOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["styles", [_style_0$c]], ["__scopeId", "data-v-eefc2d23"]]);
24924
+ const _style_0$d = "\n.editor-error[data-v-eefc2d23] {\n position: absolute;\n inset: 0;\n z-index: 20;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xl);\n text-align: center;\n /* Opaque so the half-built layout never shows behind. No backdrop-filter:\n it is banned in this package (WebRender GTT freeze). */\n background-color: var(--color-background);\n font-family: var(--font-family);\n}\n.editor-error__icon[data-v-eefc2d23] {\n color: var(--color-danger);\n}\n.editor-error__title[data-v-eefc2d23] {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.editor-error__detail[data-v-eefc2d23] {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--color-text-muted);\n}\n";
24925
+ const EditorErrorOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$d]], ["__scopeId", "data-v-eefc2d23"]]);
24915
24926
  const READY_TIMEOUT_MS = 2e4;
24916
24927
  function useEditorReady(core) {
24917
24928
  const isLoading = /* @__PURE__ */ ref(true);
@@ -24945,8 +24956,8 @@ function useEditorReady(core) {
24945
24956
  });
24946
24957
  return { isLoading, error };
24947
24958
  }
24948
- const _hoisted_1$b = { class: "transcript-ui-root" };
24949
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
24959
+ const _hoisted_1$c = { class: "transcript-ui-root" };
24960
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
24950
24961
  __name: "TranscriptUI",
24951
24962
  props: {
24952
24963
  locale: { default: "fr", type: String },
@@ -24969,7 +24980,7 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
24969
24980
  onBeforeUnmount(() => core.destroy());
24970
24981
  __expose({ core });
24971
24982
  return (_ctx, _cache) => {
24972
- return openBlock(), createElementBlock("div", _hoisted_1$b, [
24983
+ return openBlock(), createElementBlock("div", _hoisted_1$c, [
24973
24984
  unref(core).channels.size ? (openBlock(), createBlock(Layout, {
24974
24985
  key: 0,
24975
24986
  "show-header": !props.noHeader,
@@ -24983,7 +24994,7 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
24983
24994
  };
24984
24995
  }
24985
24996
  });
24986
- const _style_0$b = `
24997
+ const _style_0$c = `
24987
24998
  /* NOT fonts.css: a @font-face declared inside a shadow root isn't reliably
24988
24999
  * applied by browsers (document.fonts never registers it) — dead weight in
24989
25000
  * the webcomponent bundle specifically, which always runs shadow-DOM'd. The
@@ -25310,7 +25321,7 @@ section.turn:has([data-state="open"]) {
25310
25321
  height: 100%;
25311
25322
  }
25312
25323
  `;
25313
- const TranscriptUI = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["styles", [_style_0$b]]]);
25324
+ const TranscriptUI = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["styles", [_style_0$c]]]);
25314
25325
  function mapApiTurns(apiTurns) {
25315
25326
  return apiTurns.map((t2) => {
25316
25327
  const words = wordsFromApi$2(t2.turn_id, t2.words);
@@ -25677,14 +25688,14 @@ function createLivePlugin(options = {}) {
25677
25688
  }
25678
25689
  };
25679
25690
  }
25680
- const _hoisted_1$a = { class: "player-controls" };
25681
- const _hoisted_2$8 = { class: "controls-left" };
25691
+ const _hoisted_1$b = { class: "player-controls" };
25692
+ const _hoisted_2$9 = { class: "controls-left" };
25682
25693
  const _hoisted_3$7 = { class: "controls-time" };
25683
25694
  const _hoisted_4$5 = { class: "time-display" };
25684
- const _hoisted_5$4 = { class: "time-display" };
25695
+ const _hoisted_5$5 = { class: "time-display" };
25685
25696
  const _hoisted_6$4 = { class: "controls-right" };
25686
25697
  const _hoisted_7$1 = ["value", "aria-label", "disabled"];
25687
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
25698
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
25688
25699
  __name: "AudioPlayerControls",
25689
25700
  props: {
25690
25701
  isPlaying: { type: Boolean },
@@ -25705,8 +25716,8 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
25705
25716
  emit2("update:volume", parseFloat(target.value));
25706
25717
  }
25707
25718
  return (_ctx, _cache) => {
25708
- return openBlock(), createElementBlock("div", _hoisted_1$a, [
25709
- createBaseVNode("div", _hoisted_2$8, [
25719
+ return openBlock(), createElementBlock("div", _hoisted_1$b, [
25720
+ createBaseVNode("div", _hoisted_2$9, [
25710
25721
  createVNode(unref(Button), {
25711
25722
  variant: "transparent",
25712
25723
  size: "md",
@@ -25756,7 +25767,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
25756
25767
  createBaseVNode("div", _hoisted_3$7, [
25757
25768
  createBaseVNode("time", _hoisted_4$5, toDisplayString(__props.currentTime), 1),
25758
25769
  _cache[7] || (_cache[7] = createBaseVNode("span", { class: "time-separator" }, "/", -1)),
25759
- createBaseVNode("time", _hoisted_5$4, toDisplayString(__props.duration), 1)
25770
+ createBaseVNode("time", _hoisted_5$5, toDisplayString(__props.duration), 1)
25760
25771
  ]),
25761
25772
  createBaseVNode("div", _hoisted_6$4, [
25762
25773
  createBaseVNode("div", {
@@ -25814,8 +25825,8 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
25814
25825
  };
25815
25826
  }
25816
25827
  });
25817
- const _style_0$a = "\n.player-controls[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n padding: var(--spacing-xs) var(--spacing-lg);\n height: 44px;\n}\n.controls-left[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n.controls-time[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xxs);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--color-text-muted);\n user-select: none;\n}\n.time-separator[data-v-fb293305] {\n color: var(--color-text-muted);\n opacity: 0.5;\n}\n.controls-right[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n margin-left: auto;\n}\n.volume-group[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n.volume-slider[data-v-fb293305] {\n width: 80px;\n height: 4px;\n accent-color: var(--color-primary);\n cursor: pointer;\n}\n.volume-slider[data-v-fb293305]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.play-button[data-v-fb293305] {\n width: 40px;\n height: 40px;\n}\n.speed-button[data-v-fb293305] {\n font-size: var(--font-size-sm);\n font-family: var(--font-family-mono);\n}\n@media (max-width: 767px) {\n.skip-button[data-v-fb293305] {\n display: none;\n}\n.volume-slider[data-v-fb293305] {\n display: none;\n}\n.player-controls[data-v-fb293305] {\n padding: var(--spacing-xs) var(--spacing-md);\n gap: var(--spacing-sm);\n}\n}\n";
25818
- const AudioPlayerControls = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["styles", [_style_0$a]], ["__scopeId", "data-v-fb293305"]]);
25828
+ const _style_0$b = "\n.player-controls[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n padding: var(--spacing-xs) var(--spacing-lg);\n height: 44px;\n}\n.controls-left[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n.controls-time[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xxs);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--color-text-muted);\n user-select: none;\n}\n.time-separator[data-v-fb293305] {\n color: var(--color-text-muted);\n opacity: 0.5;\n}\n.controls-right[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n margin-left: auto;\n}\n.volume-group[data-v-fb293305] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n.volume-slider[data-v-fb293305] {\n width: 80px;\n height: 4px;\n accent-color: var(--color-primary);\n cursor: pointer;\n}\n.volume-slider[data-v-fb293305]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.play-button[data-v-fb293305] {\n width: 40px;\n height: 40px;\n}\n.speed-button[data-v-fb293305] {\n font-size: var(--font-size-sm);\n font-family: var(--font-family-mono);\n}\n@media (max-width: 767px) {\n.skip-button[data-v-fb293305] {\n display: none;\n}\n.volume-slider[data-v-fb293305] {\n display: none;\n}\n.player-controls[data-v-fb293305] {\n padding: var(--spacing-xs) var(--spacing-md);\n gap: var(--spacing-sm);\n}\n}\n";
25829
+ const AudioPlayerControls = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["styles", [_style_0$b]], ["__scopeId", "data-v-fb293305"]]);
25819
25830
  function t$1(t2, e3, i2, n2) {
25820
25831
  return new (i2 || (i2 = Promise))((function(s2, r2) {
25821
25832
  function o2(t3) {
@@ -27747,8 +27758,8 @@ function useAudioPlayer(options) {
27747
27758
  toggleMute
27748
27759
  };
27749
27760
  }
27750
- const _hoisted_1$9 = { class: "audio-player" };
27751
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
27761
+ const _hoisted_1$a = { class: "audio-player" };
27762
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
27752
27763
  __name: "AudioPlayer",
27753
27764
  props: {
27754
27765
  audioSrc: { type: String }
@@ -27778,7 +27789,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
27778
27789
  });
27779
27790
  __expose({ seekTo, pause });
27780
27791
  return (_ctx, _cache) => {
27781
- return openBlock(), createElementBlock("footer", _hoisted_1$9, [
27792
+ return openBlock(), createElementBlock("footer", _hoisted_1$a, [
27782
27793
  createBaseVNode("div", {
27783
27794
  ref_key: "waveformRef",
27784
27795
  ref: waveformRef,
@@ -27803,8 +27814,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
27803
27814
  };
27804
27815
  }
27805
27816
  });
27806
- const _style_0$9 = "\n.audio-player[data-v-580c393d] {\n border-top: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n}\n.transcript-ui-waveform-container[data-v-580c393d] {\n min-height: 32px;\n}\n.transcript-ui-waveform-container--loading[data-v-580c393d] {\n background: linear-gradient(\n 90deg,\n var(--color-border-light, var(--color-border)) 25%,\n var(--color-border) 50%,\n var(--color-border-light, var(--color-border)) 75%\n );\n background-size: 200% 100%;\n animation: shimmer-580c393d 1.5s ease-in-out infinite;\n border-radius: var(--radius-sm);\n}\n@keyframes shimmer-580c393d {\n0% {\n background-position: 200% 0;\n}\n100% {\n background-position: -200% 0;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.transcript-ui-waveform-container--loading[data-v-580c393d] {\n animation: none;\n}\n}\n";
27807
- const AudioPlayer = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["styles", [_style_0$9]], ["__scopeId", "data-v-580c393d"]]);
27817
+ const _style_0$a = "\n.audio-player[data-v-580c393d] {\n border-top: 1px solid var(--color-border);\n background-color: var(--color-surface);\n flex-shrink: 0;\n}\n.transcript-ui-waveform-container[data-v-580c393d] {\n min-height: 32px;\n}\n.transcript-ui-waveform-container--loading[data-v-580c393d] {\n background: linear-gradient(\n 90deg,\n var(--color-border-light, var(--color-border)) 25%,\n var(--color-border) 50%,\n var(--color-border-light, var(--color-border)) 75%\n );\n background-size: 200% 100%;\n animation: shimmer-580c393d 1.5s ease-in-out infinite;\n border-radius: var(--radius-sm);\n}\n@keyframes shimmer-580c393d {\n0% {\n background-position: 200% 0;\n}\n100% {\n background-position: -200% 0;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.transcript-ui-waveform-container--loading[data-v-580c393d] {\n animation: none;\n}\n}\n";
27818
+ const AudioPlayer = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["styles", [_style_0$a]], ["__scopeId", "data-v-580c393d"]]);
27808
27819
  const { findActiveWord, firstWordStart, lastWordEnd } = utils;
27809
27820
  const WORD_TRACK_INTERVAL = 0.05;
27810
27821
  function createAudioPlugin(options = {}) {
@@ -28522,14 +28533,14 @@ function parseWatermark(content, tokens) {
28522
28533
  }
28523
28534
  return parts;
28524
28535
  }
28525
- const _hoisted_1$8 = {
28536
+ const _hoisted_1$9 = {
28526
28537
  key: 0,
28527
28538
  class: "watermark",
28528
28539
  "aria-hidden": "true"
28529
28540
  };
28530
- const _hoisted_2$7 = ["src", "alt"];
28541
+ const _hoisted_2$8 = ["src", "alt"];
28531
28542
  const _hoisted_3$6 = { key: 1 };
28532
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28543
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
28533
28544
  __name: "SubtitleWatermark",
28534
28545
  props: {
28535
28546
  visible: { type: Boolean }
@@ -28544,7 +28555,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28544
28555
  return (_ctx, _cache) => {
28545
28556
  return openBlock(), createBlock(Transition, { name: "watermark" }, {
28546
28557
  default: withCtx(() => [
28547
- __props.visible && unref(watermark) ? (openBlock(), createElementBlock("div", _hoisted_1$8, [
28558
+ __props.visible && unref(watermark) ? (openBlock(), createElementBlock("div", _hoisted_1$9, [
28548
28559
  (openBlock(true), createElementBlock(Fragment, null, renderList(parts.value, (part, i2) => {
28549
28560
  return openBlock(), createElementBlock(Fragment, { key: i2 }, [
28550
28561
  part.type === "token" ? (openBlock(), createElementBlock("img", {
@@ -28552,7 +28563,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28552
28563
  src: part.src,
28553
28564
  alt: part.alt,
28554
28565
  class: "watermark__img"
28555
- }, null, 8, _hoisted_2$7)) : (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(part.value), 1))
28566
+ }, null, 8, _hoisted_2$8)) : (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(part.value), 1))
28556
28567
  ], 64);
28557
28568
  }), 128))
28558
28569
  ])) : createCommentVNode("", true)
@@ -28562,10 +28573,10 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28562
28573
  };
28563
28574
  }
28564
28575
  });
28565
- const _style_0$8 = "\n.watermark[data-v-eb604a8e] {\n position: absolute;\n right: var(--spacing-md, 16px);\n bottom: 4px;\n display: inline-flex;\n align-items: center;\n gap: 0.25em;\n font-size: 1.2rem;\n color: var(--color-white, #fff);\n pointer-events: none;\n line-height: 1;\n}\n.watermark__img[data-v-eb604a8e] {\n height: 1em;\n vertical-align: middle;\n}\n.watermark-enter-active[data-v-eb604a8e],\n.watermark-leave-active[data-v-eb604a8e] {\n transition:\n opacity 0.4s ease,\n transform 0.4s ease;\n}\n.watermark-enter-from[data-v-eb604a8e],\n.watermark-leave-to[data-v-eb604a8e] {\n opacity: 0;\n transform: translate(6px, 6px);\n}\n@media (prefers-reduced-motion: reduce) {\n.watermark-enter-active[data-v-eb604a8e],\n .watermark-leave-active[data-v-eb604a8e] {\n transition: opacity 0.01s;\n transform: none;\n}\n}\n";
28566
- const SubtitleWatermark = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["styles", [_style_0$8]], ["__scopeId", "data-v-eb604a8e"]]);
28567
- const _hoisted_1$7 = ["height"];
28568
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
28576
+ const _style_0$9 = "\n.watermark[data-v-eb604a8e] {\n position: absolute;\n right: var(--spacing-md, 16px);\n bottom: 4px;\n display: inline-flex;\n align-items: center;\n gap: 0.25em;\n font-size: 1.2rem;\n color: var(--color-white, #fff);\n pointer-events: none;\n line-height: 1;\n}\n.watermark__img[data-v-eb604a8e] {\n height: 1em;\n vertical-align: middle;\n}\n.watermark-enter-active[data-v-eb604a8e],\n.watermark-leave-active[data-v-eb604a8e] {\n transition:\n opacity 0.4s ease,\n transform 0.4s ease;\n}\n.watermark-enter-from[data-v-eb604a8e],\n.watermark-leave-to[data-v-eb604a8e] {\n opacity: 0;\n transform: translate(6px, 6px);\n}\n@media (prefers-reduced-motion: reduce) {\n.watermark-enter-active[data-v-eb604a8e],\n .watermark-leave-active[data-v-eb604a8e] {\n transition: opacity 0.01s;\n transform: none;\n}\n}\n";
28577
+ const SubtitleWatermark = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["styles", [_style_0$9]], ["__scopeId", "data-v-eb604a8e"]]);
28578
+ const _hoisted_1$8 = ["height"];
28579
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
28569
28580
  __name: "SubtitleBanner",
28570
28581
  setup(__props) {
28571
28582
  const core = useCore();
@@ -28599,20 +28610,20 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
28599
28610
  ref: "canvas",
28600
28611
  class: normalizeClass(["subtitle-canvas", { "subtitle-canvas--shrunk": unref(watermarkVisible) }]),
28601
28612
  height: canvasHeight.value
28602
- }, null, 10, _hoisted_1$7),
28613
+ }, null, 10, _hoisted_1$8),
28603
28614
  createVNode(SubtitleWatermark, { visible: unref(watermarkVisible) }, null, 8, ["visible"])
28604
28615
  ], 4);
28605
28616
  };
28606
28617
  }
28607
28618
  });
28608
- const _style_0$7 = "\n.subtitle-banner[data-v-6b9b2fb2] {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n flex-shrink: 0;\n background-color: var(--color-black);\n overflow: hidden;\n z-index: 1001;\n}\n.subtitle-canvas[data-v-6b9b2fb2] {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform 0.4s ease;\n transform-origin: top center;\n}\n.subtitle-canvas--shrunk[data-v-6b9b2fb2] {\n transform: scale(0.8) translateY(-8%);\n}\n@media (prefers-reduced-motion: reduce) {\n.subtitle-canvas[data-v-6b9b2fb2] {\n transition: none;\n}\n}\n";
28609
- const SubtitleBanner = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["styles", [_style_0$7]], ["__scopeId", "data-v-6b9b2fb2"]]);
28610
- const _hoisted_1$6 = {
28619
+ const _style_0$8 = "\n.subtitle-banner[data-v-6b9b2fb2] {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n flex-shrink: 0;\n background-color: var(--color-black);\n overflow: hidden;\n z-index: 1001;\n}\n.subtitle-canvas[data-v-6b9b2fb2] {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform 0.4s ease;\n transform-origin: top center;\n}\n.subtitle-canvas--shrunk[data-v-6b9b2fb2] {\n transform: scale(0.8) translateY(-8%);\n}\n@media (prefers-reduced-motion: reduce) {\n.subtitle-canvas[data-v-6b9b2fb2] {\n transition: none;\n}\n}\n";
28620
+ const SubtitleBanner = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["styles", [_style_0$8]], ["__scopeId", "data-v-6b9b2fb2"]]);
28621
+ const _hoisted_1$7 = {
28611
28622
  ref: "container",
28612
28623
  class: "subtitle-fullscreen"
28613
28624
  };
28614
- const _hoisted_2$6 = ["aria-label"];
28615
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
28625
+ const _hoisted_2$7 = ["aria-label"];
28626
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28616
28627
  __name: "SubtitleFullscreen",
28617
28628
  setup(__props) {
28618
28629
  const core = useCore();
@@ -28670,14 +28681,14 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
28670
28681
  }
28671
28682
  });
28672
28683
  return (_ctx, _cache) => {
28673
- return openBlock(), createElementBlock("div", _hoisted_1$6, [
28684
+ return openBlock(), createElementBlock("div", _hoisted_1$7, [
28674
28685
  createBaseVNode("button", {
28675
28686
  class: "subtitle-fullscreen__close",
28676
28687
  "aria-label": unref(t2)("subtitle.exitFullscreen"),
28677
28688
  onClick: close
28678
28689
  }, [
28679
28690
  createVNode(unref(X$1), { size: 24 })
28680
- ], 8, _hoisted_2$6),
28691
+ ], 8, _hoisted_2$7),
28681
28692
  createBaseVNode("canvas", {
28682
28693
  ref: "canvas",
28683
28694
  class: normalizeClass(["subtitle-fullscreen__canvas", { "subtitle-fullscreen__canvas--shrunk": unref(watermarkVisible) }])
@@ -28687,8 +28698,8 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
28687
28698
  };
28688
28699
  }
28689
28700
  });
28690
- const _style_0$6 = "\n.subtitle-fullscreen[data-v-4dac7247] {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: var(--color-black);\n}\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247] {\n /* Full reset (same convention as Button, EditableText, Tabs…): the\n previous partial reset (border/background only) left margin, padding,\n and appearance to whatever the host page's UA/global styles set. */\n all: unset;\n box-sizing: border-box;\n position: absolute;\n top: var(--spacing-md, 16px);\n right: var(--spacing-md, 16px);\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: rgba(255, 255, 255, 0.1);\n color: var(--color-white);\n border-radius: var(--radius-md, 8px);\n cursor: pointer;\n transition: background-color var(--transition-duration) ease;\n}\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247]:hover,\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247]:focus-visible {\n background: rgba(255, 255, 255, 0.25);\n outline: 2px solid rgba(255, 255, 255, 0.5);\n outline-offset: 2px;\n}\n.subtitle-fullscreen__canvas[data-v-4dac7247] {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform 0.4s ease;\n transform-origin: center;\n}\n.subtitle-fullscreen__canvas--shrunk[data-v-4dac7247] {\n transform: scale(0.85) translateY(-4%);\n}\n@media (prefers-reduced-motion: reduce) {\n.subtitle-fullscreen__close[data-v-4dac7247],\n .subtitle-fullscreen__canvas[data-v-4dac7247] {\n transition: none;\n}\n}\n";
28691
- const SubtitleFullscreen = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["styles", [_style_0$6]], ["__scopeId", "data-v-4dac7247"]]);
28701
+ const _style_0$7 = "\n.subtitle-fullscreen[data-v-4dac7247] {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background-color: var(--color-black);\n}\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247] {\n /* Full reset (same convention as Button, EditableText, Tabs…): the\n previous partial reset (border/background only) left margin, padding,\n and appearance to whatever the host page's UA/global styles set. */\n all: unset;\n box-sizing: border-box;\n position: absolute;\n top: var(--spacing-md, 16px);\n right: var(--spacing-md, 16px);\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: rgba(255, 255, 255, 0.1);\n color: var(--color-white);\n border-radius: var(--radius-md, 8px);\n cursor: pointer;\n transition: background-color var(--transition-duration) ease;\n}\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247]:hover,\n.transcript-ui-root .subtitle-fullscreen__close[data-v-4dac7247]:focus-visible {\n background: rgba(255, 255, 255, 0.25);\n outline: 2px solid rgba(255, 255, 255, 0.5);\n outline-offset: 2px;\n}\n.subtitle-fullscreen__canvas[data-v-4dac7247] {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform 0.4s ease;\n transform-origin: center;\n}\n.subtitle-fullscreen__canvas--shrunk[data-v-4dac7247] {\n transform: scale(0.85) translateY(-4%);\n}\n@media (prefers-reduced-motion: reduce) {\n.subtitle-fullscreen__close[data-v-4dac7247],\n .subtitle-fullscreen__canvas[data-v-4dac7247] {\n transition: none;\n}\n}\n";
28702
+ const SubtitleFullscreen = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["styles", [_style_0$7]], ["__scopeId", "data-v-4dac7247"]]);
28692
28703
  function createSubtitlePlugin(options = {}) {
28693
28704
  return {
28694
28705
  name: "subtitle",
@@ -29490,15 +29501,48 @@ function createTranscriptionEditorPlugin(options = {}) {
29490
29501
  }
29491
29502
  };
29492
29503
  }
29504
+ const _hoisted_1$6 = ["title"];
29505
+ const _hoisted_2$6 = { class: "llm-service-status__label" };
29506
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
29507
+ __name: "LLMServiceStatus",
29508
+ props: {
29509
+ isUpdated: { type: Boolean }
29510
+ },
29511
+ setup(__props) {
29512
+ const props = __props;
29513
+ const { t: t2 } = useI18n();
29514
+ const label = computed(
29515
+ () => props.isUpdated ? t2("llmService.statusUpdated") : t2("llmService.statusOutdated")
29516
+ );
29517
+ return (_ctx, _cache) => {
29518
+ return openBlock(), createElementBlock("span", {
29519
+ class: normalizeClass([
29520
+ "llm-service-status",
29521
+ __props.isUpdated ? "llm-service-status--ok" : "llm-service-status--warn"
29522
+ ]),
29523
+ title: label.value
29524
+ }, [
29525
+ createVNode(unref(EditorIcon), {
29526
+ name: __props.isUpdated ? "check" : "warning",
29527
+ size: 14
29528
+ }, null, 8, ["name"]),
29529
+ createBaseVNode("span", _hoisted_2$6, toDisplayString(label.value), 1)
29530
+ ], 10, _hoisted_1$6);
29531
+ };
29532
+ }
29533
+ });
29534
+ const _style_0$6 = "\n.llm-service-status[data-v-f6c4d61b] {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n min-width: 0;\n font-size: var(--font-size-xs);\n font-weight: 500;\n}\n.llm-service-status--ok[data-v-f6c4d61b] {\n color: var(--color-success, #2e7d32);\n}\n.llm-service-status--warn[data-v-f6c4d61b] {\n color: var(--color-warning, #ed6c02);\n}\n.llm-service-status[data-v-f6c4d61b] .editor-icon {\n flex-shrink: 0;\n}\n.llm-service-status__label[data-v-f6c4d61b] {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
29535
+ const LLMServiceStatus = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["styles", [_style_0$6]], ["__scopeId", "data-v-f6c4d61b"]]);
29493
29536
  const _hoisted_1$5 = { class: "llm-service-panel" };
29494
- const _hoisted_2$5 = { class: "llm-service-panel__download-label" };
29495
- const _hoisted_3$5 = {
29537
+ const _hoisted_2$5 = {
29496
29538
  key: 0,
29497
29539
  class: "llm-service-panel__empty",
29498
29540
  role: "status"
29499
29541
  };
29500
- const _hoisted_4$4 = { class: "llm-service-panel__empty-text" };
29501
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29542
+ const _hoisted_3$5 = { class: "llm-service-panel__empty-text" };
29543
+ const _hoisted_4$4 = { class: "llm-service-panel__reading-status" };
29544
+ const _hoisted_5$4 = { class: "llm-service-panel__reading-actions" };
29545
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
29502
29546
  __name: "LLMServicePanel",
29503
29547
  props: {
29504
29548
  service: { type: Object },
@@ -29510,6 +29554,8 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29510
29554
  const emit2 = __emit;
29511
29555
  const core = useCore();
29512
29556
  const { t: t2 } = useI18n();
29557
+ const { isMobile } = useIsMobile();
29558
+ const isReadOnly = computed(() => isMobile.value);
29513
29559
  function toggleSplit() {
29514
29560
  emit2("update:split", !props.split);
29515
29561
  }
@@ -29576,66 +29622,10 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29576
29622
  status: articleStatus.value,
29577
29623
  progress: progress.value,
29578
29624
  onRetry: onRegenerate
29579
- }, {
29580
- "toolbar-left": withCtx(() => [
29581
- createVNode(unref(Button), {
29582
- variant: "primary",
29583
- icon: "save",
29584
- disabled: !dirty.value || busy.value,
29585
- "aria-label": unref(t2)("llmService.save"),
29586
- title: unref(t2)("llmService.save"),
29587
- onClick: onSave
29588
- }, null, 8, ["disabled", "aria-label", "title"]),
29589
- createVNode(unref(Button), {
29590
- variant: "secondary",
29591
- icon: "refresh-cw",
29592
- loading: articleStatus.value === "processing",
29593
- disabled: isUpdated.value || busy.value || articleStatus.value === "processing",
29594
- "aria-label": unref(t2)("llmService.regenerate"),
29595
- title: unref(t2)("llmService.regenerate"),
29596
- onClick: onRegenerate
29597
- }, null, 8, ["loading", "disabled", "aria-label", "title"])
29598
- ]),
29599
- "toolbar-center": withCtx(() => [
29600
- createBaseVNode("span", {
29601
- class: normalizeClass(["llm-service-panel__status", [
29602
- isUpdated.value ? "llm-service-panel__status--ok" : "llm-service-panel__status--warn"
29603
- ]])
29604
- }, [
29605
- createVNode(unref(EditorIcon), {
29606
- name: isUpdated.value ? "check" : "warning",
29607
- size: 14
29608
- }, null, 8, ["name"]),
29609
- createBaseVNode("span", null, toDisplayString(isUpdated.value ? unref(t2)("llmService.statusUpdated") : unref(t2)("llmService.statusOutdated")), 1)
29610
- ], 2)
29611
- ]),
29612
- "toolbar-right": withCtx(() => [
29613
- createVNode(unref(Button), {
29614
- variant: "primary",
29615
- icon: "download",
29616
- disabled: articleStatus.value === "processing" || !hasContent.value,
29617
- "aria-label": unref(t2)("llmService.download"),
29618
- title: unref(t2)("llmService.download"),
29619
- onClick: onExport
29620
- }, {
29621
- default: withCtx(() => [
29622
- createBaseVNode("span", _hoisted_2$5, toDisplayString(unref(t2)("llmService.download")), 1)
29623
- ]),
29624
- _: 1
29625
- }, 8, ["disabled", "aria-label", "title"]),
29626
- createVNode(unref(Button), {
29627
- class: "llm-service-panel__split",
29628
- variant: __props.split ? "primary" : "secondary",
29629
- icon: "panel-right",
29630
- "aria-pressed": !!__props.split,
29631
- "aria-label": unref(t2)("llmService.split"),
29632
- title: unref(t2)("llmService.split"),
29633
- onClick: toggleSplit
29634
- }, null, 8, ["variant", "aria-pressed", "aria-label", "title"])
29635
- ]),
29625
+ }, createSlots({
29636
29626
  default: withCtx(() => [
29637
- isEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_3$5, [
29638
- createBaseVNode("p", _hoisted_4$4, toDisplayString(unref(t2)("llmService.empty")), 1),
29627
+ isEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_2$5, [
29628
+ createBaseVNode("p", _hoisted_3$5, toDisplayString(unref(t2)("llmService.empty")), 1),
29639
29629
  createVNode(unref(Button), {
29640
29630
  variant: "primary",
29641
29631
  icon: "sparkles",
@@ -29647,21 +29637,108 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29647
29637
  ]),
29648
29638
  _: 1
29649
29639
  }, 8, ["disabled"])
29650
- ])) : (openBlock(), createBlock(unref(MarkdownEditor), {
29640
+ ])) : !isReadOnly.value ? (openBlock(), createBlock(unref(MarkdownEditor), {
29651
29641
  key: 1,
29652
29642
  modelValue: draft.value,
29653
29643
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => draft.value = $event),
29654
29644
  disabled: busy.value
29655
- }, null, 8, ["modelValue", "disabled"]))
29645
+ }, null, 8, ["modelValue", "disabled"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
29646
+ createBaseVNode("div", _hoisted_4$4, [
29647
+ createVNode(LLMServiceStatus, { "is-updated": isUpdated.value }, null, 8, ["is-updated"]),
29648
+ createBaseVNode("div", _hoisted_5$4, [
29649
+ !isUpdated.value ? (openBlock(), createBlock(unref(Button), {
29650
+ key: 0,
29651
+ variant: "secondary",
29652
+ icon: "refresh-cw",
29653
+ disabled: busy.value,
29654
+ onClick: onRegenerate
29655
+ }, {
29656
+ default: withCtx(() => [
29657
+ createTextVNode(toDisplayString(unref(t2)("llmService.regenerate")), 1)
29658
+ ]),
29659
+ _: 1
29660
+ }, 8, ["disabled"])) : createCommentVNode("", true),
29661
+ createVNode(unref(Button), {
29662
+ variant: "primary",
29663
+ icon: "download",
29664
+ "aria-label": unref(t2)("llmService.download"),
29665
+ title: unref(t2)("llmService.download"),
29666
+ onClick: onExport
29667
+ }, null, 8, ["aria-label", "title"])
29668
+ ])
29669
+ ]),
29670
+ createVNode(unref(MarkdownView), {
29671
+ class: "llm-service-panel__reading",
29672
+ source: draft.value
29673
+ }, null, 8, ["source"])
29674
+ ], 64))
29656
29675
  ]),
29657
- _: 1
29658
- }, 8, ["status", "progress"])
29676
+ _: 2
29677
+ }, [
29678
+ !isReadOnly.value ? {
29679
+ name: "toolbar-left",
29680
+ fn: withCtx(() => [
29681
+ createVNode(unref(Button), {
29682
+ variant: "primary",
29683
+ icon: "save",
29684
+ disabled: !dirty.value || busy.value,
29685
+ "aria-label": unref(t2)("llmService.save"),
29686
+ title: unref(t2)("llmService.save"),
29687
+ onClick: onSave
29688
+ }, null, 8, ["disabled", "aria-label", "title"]),
29689
+ createVNode(unref(Button), {
29690
+ variant: "secondary",
29691
+ icon: "refresh-cw",
29692
+ loading: articleStatus.value === "processing",
29693
+ disabled: isUpdated.value || busy.value || articleStatus.value === "processing",
29694
+ "aria-label": unref(t2)("llmService.regenerate"),
29695
+ title: unref(t2)("llmService.regenerate"),
29696
+ onClick: onRegenerate
29697
+ }, null, 8, ["loading", "disabled", "aria-label", "title"])
29698
+ ]),
29699
+ key: "0"
29700
+ } : void 0,
29701
+ !isReadOnly.value ? {
29702
+ name: "toolbar-center",
29703
+ fn: withCtx(() => [
29704
+ createVNode(LLMServiceStatus, { "is-updated": isUpdated.value }, null, 8, ["is-updated"])
29705
+ ]),
29706
+ key: "1"
29707
+ } : void 0,
29708
+ !isReadOnly.value ? {
29709
+ name: "toolbar-right",
29710
+ fn: withCtx(() => [
29711
+ createVNode(unref(Button), {
29712
+ variant: "primary",
29713
+ icon: "download",
29714
+ disabled: articleStatus.value === "processing" || !hasContent.value,
29715
+ "aria-label": unref(t2)("llmService.download"),
29716
+ title: unref(t2)("llmService.download"),
29717
+ onClick: onExport
29718
+ }, {
29719
+ default: withCtx(() => [
29720
+ createTextVNode(toDisplayString(unref(t2)("llmService.download")), 1)
29721
+ ]),
29722
+ _: 1
29723
+ }, 8, ["disabled", "aria-label", "title"]),
29724
+ createVNode(unref(Button), {
29725
+ variant: __props.split ? "primary" : "secondary",
29726
+ icon: "panel-right",
29727
+ "aria-pressed": !!__props.split,
29728
+ "aria-label": unref(t2)("llmService.split"),
29729
+ title: unref(t2)("llmService.split"),
29730
+ onClick: toggleSplit
29731
+ }, null, 8, ["variant", "aria-pressed", "aria-label", "title"])
29732
+ ]),
29733
+ key: "2"
29734
+ } : void 0
29735
+ ]), 1032, ["status", "progress"])
29659
29736
  ]);
29660
29737
  };
29661
29738
  }
29662
29739
  });
29663
- const _style_0$5 = "\n.llm-service-panel[data-v-920b527a] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n.llm-service-panel__status[data-v-920b527a] {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n font-weight: 500;\n}\n.llm-service-panel__status--ok[data-v-920b527a] {\n color: var(--color-success, #2e7d32);\n}\n.llm-service-panel__status--warn[data-v-920b527a] {\n color: var(--color-warning, #ed6c02);\n}\n.llm-service-panel__empty[data-v-920b527a] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-md);\n padding: var(--spacing-xl) var(--spacing-md);\n text-align: center;\n}\n.llm-service-panel__empty-text[data-v-920b527a] {\n margin: 0;\n max-width: 400px;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n\n/* Phone: no side-by-side (Layout forces split off below 767px), and the\n download button keeps its icon only. */\n@media (max-width: 767px) {\n.llm-service-panel[data-v-920b527a] {\n padding: var(--spacing-sm) 0;\n}\n.llm-service-panel__split[data-v-920b527a],\n .llm-service-panel__download-label[data-v-920b527a] {\n display: none;\n}\n}\n";
29664
- const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$5]], ["__scopeId", "data-v-920b527a"]]);
29740
+ const _style_0$5 = "\n.llm-service-panel[data-v-2d38dcc6] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n}\n.llm-service-panel__reading-status[data-v-2d38dcc6] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n border-bottom: 1px solid var(--color-border);\n}\n.llm-service-panel__reading-actions[data-v-2d38dcc6] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n margin-left: auto;\n}\n.llm-service-panel__reading[data-v-2d38dcc6] {\n padding: var(--spacing-xl) var(--spacing-lg);\n}\n.llm-service-panel__empty[data-v-2d38dcc6] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-md);\n padding: var(--spacing-xl) var(--spacing-md);\n text-align: center;\n}\n.llm-service-panel__empty-text[data-v-2d38dcc6] {\n margin: 0;\n max-width: 400px;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n";
29741
+ const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["styles", [_style_0$5]], ["__scopeId", "data-v-2d38dcc6"]]);
29665
29742
  function createService(init) {
29666
29743
  return {
29667
29744
  id: init.id,
@@ -29862,7 +29939,7 @@ const _hoisted_5$3 = {
29862
29939
  class: "chat-session-confirm"
29863
29940
  };
29864
29941
  const _hoisted_6$3 = { class: "chat-session-confirm__text" };
29865
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
29942
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29866
29943
  __name: "ChatSessionList",
29867
29944
  props: {
29868
29945
  sessions: { type: Array },
@@ -29994,7 +30071,48 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
29994
30071
  }
29995
30072
  });
29996
30073
  const _style_0$4 = "\n.chat-session-list[data-v-c13478f0] {\n width: var(--chat-session-list-width, 200px);\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--color-border);\n background-color: var(--color-surface-hover);\n transition: width 0.2s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n.chat-session-list[data-v-c13478f0] {\n transition: none;\n}\n}\n.chat-session-list__header[data-v-c13478f0] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm) var(--spacing-md);\n}\n.chat-session-list__title[data-v-c13478f0] {\n margin: 0;\n font-size: var(--font-size-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-text-muted);\n}\n.chat-session-list__items[data-v-c13478f0] {\n flex: 1;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-y: auto;\n}\n\n/* Delete confirmation row */\n.chat-session-confirm[data-v-c13478f0] {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.chat-session-confirm__text[data-v-c13478f0] {\n flex: 1;\n min-width: 0;\n font-size: var(--font-size-xs);\n color: var(--color-danger);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n";
29997
- const ChatSessionList = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["styles", [_style_0$4]], ["__scopeId", "data-v-c13478f0"]]);
30074
+ const ChatSessionList = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$4]], ["__scopeId", "data-v-c13478f0"]]);
30075
+ function computeSessionOptions(sessions, activeSessionId, newSessionLabel) {
30076
+ const options = sessions.map((session) => ({
30077
+ value: session.id,
30078
+ label: session.title || newSessionLabel
30079
+ }));
30080
+ const isActiveListed = sessions.some((s2) => s2.id === activeSessionId);
30081
+ if (isActiveListed) return options;
30082
+ return [{ value: activeSessionId ?? "", label: newSessionLabel }, ...options];
30083
+ }
30084
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
30085
+ __name: "ChatSessionSelect",
30086
+ props: {
30087
+ sessions: { type: Array },
30088
+ activeSessionId: { type: [String, null] }
30089
+ },
30090
+ emits: ["select"],
30091
+ setup(__props, { emit: __emit }) {
30092
+ const props = __props;
30093
+ const emit2 = __emit;
30094
+ const { t: t2 } = useI18n();
30095
+ const options = computed(
30096
+ () => computeSessionOptions(props.sessions, props.activeSessionId, t2("chat.newChat"))
30097
+ );
30098
+ const field = computed(() => ({
30099
+ customParams: { "aria-label": t2("chat.history") }
30100
+ }));
30101
+ function onChange(sessionId) {
30102
+ if (sessionId && sessionId !== props.activeSessionId) emit2("select", sessionId);
30103
+ }
30104
+ return (_ctx, _cache) => {
30105
+ return openBlock(), createBlock(unref(FormInput), {
30106
+ select: "",
30107
+ "full-width": "",
30108
+ field: field.value,
30109
+ options: options.value,
30110
+ "model-value": __props.activeSessionId ?? "",
30111
+ "onUpdate:modelValue": onChange
30112
+ }, null, 8, ["field", "options", "model-value"]);
30113
+ };
30114
+ }
30115
+ });
29998
30116
  const _hoisted_1$3 = {
29999
30117
  key: 0,
30000
30118
  class: "chat-message chat-message--user"
@@ -30177,6 +30295,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
30177
30295
  class: "chat-composer__textarea",
30178
30296
  placeholder: unref(t2)("chat.placeholder"),
30179
30297
  disabled: __props.disabled,
30298
+ enterkeyhint: "send",
30180
30299
  rows: "2",
30181
30300
  ref: "chat-composer__textarea",
30182
30301
  onKeydown
@@ -30195,8 +30314,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
30195
30314
  };
30196
30315
  }
30197
30316
  });
30198
- const _style_0$1 = "\n.chat-composer[data-v-05dbe7e6] {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-sm);\n padding: var(--spacing-md);\n border-top: 1px solid var(--color-border);\n flex-shrink: 0;\n /* Match the message column width when the panel is expanded. */\n width: 100%;\n max-width: var(--chat-content-max-width, 760px);\n margin-inline: auto;\n}\n.chat-composer__textarea[data-v-05dbe7e6] {\n flex: 1;\n resize: none;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-sm) var(--spacing-md);\n font-family: inherit;\n font-size: var(--font-size-sm);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n background-color: var(--color-surface);\n outline: none;\n}\n.chat-composer__textarea[data-v-05dbe7e6]:focus {\n border-color: var(--color-primary);\n}\n.chat-composer__textarea[data-v-05dbe7e6]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n";
30199
- const ChatComposer = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["styles", [_style_0$1]], ["__scopeId", "data-v-05dbe7e6"]]);
30317
+ const _style_0$1 = "\n.chat-composer[data-v-037fb976] {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-sm);\n padding: var(--spacing-md);\n border-top: 1px solid var(--color-border);\n flex-shrink: 0;\n /* Match the message column width when the panel is expanded. */\n width: 100%;\n max-width: var(--chat-content-max-width, 760px);\n margin-inline: auto;\n}\n.chat-composer__textarea[data-v-037fb976] {\n flex: 1;\n resize: none;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-sm) var(--spacing-md);\n font-family: inherit;\n font-size: var(--font-size-sm);\n line-height: var(--line-height);\n color: var(--color-text-primary);\n background-color: var(--color-surface);\n outline: none;\n}\n.chat-composer__textarea[data-v-037fb976]:focus {\n border-color: var(--color-primary);\n}\n.chat-composer__textarea[data-v-037fb976]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n";
30318
+ const ChatComposer = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["styles", [_style_0$1]], ["__scopeId", "data-v-037fb976"]]);
30200
30319
  const _hoisted_1 = ["aria-labelledby"];
30201
30320
  const _hoisted_2 = { class: "chat-drawer__header" };
30202
30321
  const _hoisted_3 = ["id"];
@@ -30208,6 +30327,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30208
30327
  setup(__props) {
30209
30328
  const core = useCore();
30210
30329
  const { t: t2 } = useI18n();
30330
+ const { isMobile } = useIsMobile();
30211
30331
  const chat = core.chat;
30212
30332
  const titleId = useId$1();
30213
30333
  const expanded = /* @__PURE__ */ ref(false);
@@ -30257,7 +30377,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30257
30377
  onClick: withModifiers(close, ["self"])
30258
30378
  }, [
30259
30379
  createBaseVNode("aside", {
30260
- class: normalizeClass(["chat-drawer", { "chat-drawer--expanded": expanded.value }]),
30380
+ class: normalizeClass(["chat-drawer", { "chat-drawer--expanded": expanded.value && !unref(isMobile) }]),
30261
30381
  role: "dialog",
30262
30382
  "aria-modal": "true",
30263
30383
  "aria-labelledby": unref(titleId)
@@ -30265,23 +30385,37 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30265
30385
  createBaseVNode("header", _hoisted_2, [
30266
30386
  createBaseVNode("h2", {
30267
30387
  id: unref(titleId),
30268
- class: "chat-drawer__title"
30388
+ class: normalizeClass(["chat-drawer__title", { "transcript-ui-sr-only": unref(isMobile) }])
30269
30389
  }, [
30270
30390
  createVNode(unref(EditorIcon), {
30271
30391
  name: "sparkles",
30272
30392
  size: 18
30273
30393
  }),
30274
30394
  createTextVNode(" " + toDisplayString(unref(t2)("chat.title")), 1)
30275
- ], 8, _hoisted_3),
30395
+ ], 10, _hoisted_3),
30396
+ unref(isMobile) ? (openBlock(), createBlock(_sfc_main$4, {
30397
+ key: 0,
30398
+ class: "chat-drawer__session-select",
30399
+ sessions: unref(chat).sessions.value,
30400
+ "active-session-id": unref(chat).activeSessionId.value,
30401
+ onSelect
30402
+ }, null, 8, ["sessions", "active-session-id"])) : createCommentVNode("", true),
30276
30403
  createBaseVNode("div", _hoisted_4, [
30277
- createVNode(unref(Button), {
30278
- class: "chat-drawer__expand",
30404
+ unref(isMobile) ? (openBlock(), createBlock(unref(Button), {
30405
+ key: 0,
30406
+ icon: "plus",
30407
+ variant: "tertiary",
30408
+ size: "sm",
30409
+ "aria-label": unref(t2)("chat.newChat"),
30410
+ onClick: onCreate
30411
+ }, null, 8, ["aria-label"])) : (openBlock(), createBlock(unref(Button), {
30412
+ key: 1,
30279
30413
  icon: expanded.value ? "minimize" : "maximize",
30280
30414
  variant: "tertiary",
30281
30415
  size: "sm",
30282
30416
  "aria-label": expanded.value ? unref(t2)("chat.collapse") : unref(t2)("chat.expand"),
30283
30417
  onClick: toggleExpanded
30284
- }, null, 8, ["icon", "aria-label"]),
30418
+ }, null, 8, ["icon", "aria-label"])),
30285
30419
  createVNode(unref(Button), {
30286
30420
  icon: "x",
30287
30421
  variant: "tertiary",
@@ -30292,14 +30426,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30292
30426
  ])
30293
30427
  ]),
30294
30428
  createBaseVNode("div", _hoisted_5, [
30295
- createVNode(ChatSessionList, {
30429
+ !unref(isMobile) ? (openBlock(), createBlock(ChatSessionList, {
30430
+ key: 0,
30296
30431
  sessions: unref(chat).sessions.value,
30297
30432
  "active-session-id": unref(chat).activeSessionId.value,
30298
30433
  onSelect,
30299
30434
  onCreate,
30300
30435
  onRename,
30301
30436
  onDelete
30302
- }, null, 8, ["sessions", "active-session-id"]),
30437
+ }, null, 8, ["sessions", "active-session-id"])) : createCommentVNode("", true),
30303
30438
  createBaseVNode("div", _hoisted_6, [
30304
30439
  createVNode(ChatMessageList, {
30305
30440
  messages: unref(chat).allMessages.value,
@@ -30320,8 +30455,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30320
30455
  };
30321
30456
  }
30322
30457
  });
30323
- const _style_0 = "\n.chat-overlay[data-v-673d2314] {\n position: fixed;\n inset: 0;\n z-index: var(--z-drawer);\n background-color: rgba(0, 0, 0, 0.4);\n display: flex;\n justify-content: flex-end;\n}\n.chat-drawer[data-v-673d2314] {\n /* Centered reading column for messages + composer; cascades to the child\n components through the DOM regardless of scoped styles. */\n --chat-content-max-width: 760px;\n --chat-session-list-width: 200px;\n width: min(620px, 100vw);\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--color-surface);\n box-shadow: var(--shadow-md);\n transition: width 0.2s ease;\n}\n\n/* Near-full-width: keeps a backdrop strip on the left so click-outside still\n closes the panel. */\n.chat-drawer--expanded[data-v-673d2314] {\n width: min(1400px, 96vw);\n --chat-session-list-width: 300px;\n}\n.chat-drawer__header[data-v-673d2314] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n min-height: var(--header-height);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n.chat-drawer__title[data-v-673d2314] {\n margin: 0;\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n font-size: var(--font-size-base);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.chat-drawer__title[data-v-673d2314] .editor-icon {\n color: var(--color-primary);\n}\n.chat-drawer__actions[data-v-673d2314] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n/* The expand toggle is desktop-only: on phones the panel is already full-width. */\n@media (max-width: 640px) {\n.chat-drawer__expand[data-v-673d2314] {\n display: none;\n}\n}\n.chat-drawer__body[data-v-673d2314] {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.chat-drawer__main[data-v-673d2314] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* ── Slide + fade transition ── */\n.chat-drawer-enter-active[data-v-673d2314],\n.chat-drawer-leave-active[data-v-673d2314] {\n transition: opacity 0.2s ease;\n}\n.chat-drawer-enter-active .chat-drawer[data-v-673d2314],\n.chat-drawer-leave-active .chat-drawer[data-v-673d2314] {\n transition: transform 0.25s ease;\n}\n.chat-drawer-enter-from[data-v-673d2314],\n.chat-drawer-leave-to[data-v-673d2314] {\n opacity: 0;\n}\n.chat-drawer-enter-from .chat-drawer[data-v-673d2314],\n.chat-drawer-leave-to .chat-drawer[data-v-673d2314] {\n transform: translateX(100%);\n}\n@media (prefers-reduced-motion: reduce) {\n.chat-drawer[data-v-673d2314],\n .chat-drawer-enter-active[data-v-673d2314],\n .chat-drawer-leave-active[data-v-673d2314],\n .chat-drawer-enter-active .chat-drawer[data-v-673d2314],\n .chat-drawer-leave-active .chat-drawer[data-v-673d2314] {\n transition: none;\n}\n}\n";
30324
- const ChatDrawer = /* @__PURE__ */ _export_sfc(_sfc_main, [["styles", [_style_0]], ["__scopeId", "data-v-673d2314"]]);
30458
+ const _style_0 = "\n.chat-overlay[data-v-25f4e0cf] {\n position: fixed;\n inset: 0;\n z-index: var(--z-drawer);\n background-color: rgba(0, 0, 0, 0.4);\n display: flex;\n justify-content: flex-end;\n}\n.chat-drawer[data-v-25f4e0cf] {\n /* Centered reading column for messages + composer; cascades to the child\n components through the DOM regardless of scoped styles. */\n --chat-content-max-width: 760px;\n --chat-session-list-width: 200px;\n width: min(620px, 100vw);\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--color-surface);\n box-shadow: var(--shadow-md);\n transition: width 0.2s ease;\n}\n\n/* Near-full-width: keeps a backdrop strip on the left so click-outside still\n closes the panel. */\n.chat-drawer--expanded[data-v-25f4e0cf] {\n width: min(1400px, 96vw);\n --chat-session-list-width: 300px;\n}\n.chat-drawer__header[data-v-25f4e0cf] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n min-height: var(--header-height);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n.chat-drawer__title[data-v-25f4e0cf] {\n margin: 0;\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n font-size: var(--font-size-base);\n font-weight: 600;\n color: var(--color-text-primary);\n}\n.chat-drawer__title[data-v-25f4e0cf] .editor-icon {\n color: var(--color-primary);\n}\n.chat-drawer__session-select[data-v-25f4e0cf] {\n flex: 1;\n min-width: 0;\n}\n.chat-drawer__actions[data-v-25f4e0cf] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n.chat-drawer__body[data-v-25f4e0cf] {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.chat-drawer__main[data-v-25f4e0cf] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* ── Slide + fade transition ── */\n.chat-drawer-enter-active[data-v-25f4e0cf],\n.chat-drawer-leave-active[data-v-25f4e0cf] {\n transition: opacity 0.2s ease;\n}\n.chat-drawer-enter-active .chat-drawer[data-v-25f4e0cf],\n.chat-drawer-leave-active .chat-drawer[data-v-25f4e0cf] {\n transition: transform 0.25s ease;\n}\n.chat-drawer-enter-from[data-v-25f4e0cf],\n.chat-drawer-leave-to[data-v-25f4e0cf] {\n opacity: 0;\n}\n.chat-drawer-enter-from .chat-drawer[data-v-25f4e0cf],\n.chat-drawer-leave-to .chat-drawer[data-v-25f4e0cf] {\n transform: translateX(100%);\n}\n@media (prefers-reduced-motion: reduce) {\n.chat-drawer[data-v-25f4e0cf],\n .chat-drawer-enter-active[data-v-25f4e0cf],\n .chat-drawer-leave-active[data-v-25f4e0cf],\n .chat-drawer-enter-active .chat-drawer[data-v-25f4e0cf],\n .chat-drawer-leave-active .chat-drawer[data-v-25f4e0cf] {\n transition: none;\n}\n}\n";
30459
+ const ChatDrawer = /* @__PURE__ */ _export_sfc(_sfc_main, [["styles", [_style_0]], ["__scopeId", "data-v-25f4e0cf"]]);
30325
30460
  const STREAMING_MESSAGE_ID = "__streaming__";
30326
30461
  function createChatPlugin() {
30327
30462
  return {
@@ -30450,4 +30585,4 @@ export {
30450
30585
  purify as p,
30451
30586
  register as r
30452
30587
  };
30453
- //# sourceMappingURL=index-FoYxoCOv.js.map
30588
+ //# sourceMappingURL=index-j-ZNERBE.js.map