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

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.
@@ -116,10 +116,10 @@ var LintoEditor = (function(exports) {
116
116
  }
117
117
  const listDelimiterRE = /;(?![^(]*\))/g;
118
118
  const propertyDelimiterRE = /:([^]+)/;
119
- const styleCommentRE = /\/\*[^]*?\*\//g;
119
+ const styleCommentRE = /"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;
120
120
  function parseStringStyle(cssText) {
121
121
  const ret = {};
122
- cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
122
+ cssText.replace(styleCommentRE, (match) => match.startsWith("/*") ? "" : match).split(listDelimiterRE).forEach((item) => {
123
123
  if (item) {
124
124
  const tmp = item.split(propertyDelimiterRE);
125
125
  tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
@@ -163,22 +163,22 @@ var LintoEditor = (function(exports) {
163
163
  function includeBooleanAttr(value) {
164
164
  return !!value || value === "";
165
165
  }
166
- function looseCompareArrays(a2, b2) {
166
+ function looseCompareArrays(a2, b2, seen) {
167
167
  if (a2.length !== b2.length) return false;
168
168
  let equal = true;
169
169
  for (let i2 = 0; equal && i2 < a2.length; i2++) {
170
- equal = looseEqual(a2[i2], b2[i2]);
170
+ equal = looseEqual(a2[i2], b2[i2], seen);
171
171
  }
172
172
  return equal;
173
173
  }
174
- function looseCompareCollections(a2, b2) {
174
+ function looseCompareCollections(a2, b2, seen) {
175
175
  if (a2.size !== b2.size) return false;
176
176
  const candidates = Array.from(b2);
177
177
  const matched = new Uint8Array(candidates.length);
178
178
  for (const item of a2) {
179
179
  let index = -1;
180
180
  for (let i2 = 0; i2 < candidates.length; i2++) {
181
- if (!matched[i2] && looseEqual(item, candidates[i2])) {
181
+ if (!matched[i2] && looseEqual(item, candidates[i2], seen)) {
182
182
  index = i2;
183
183
  break;
184
184
  }
@@ -188,7 +188,47 @@ var LintoEditor = (function(exports) {
188
188
  }
189
189
  return true;
190
190
  }
191
- function looseEqual(a2, b2) {
191
+ function looseCompareObjects(a2, b2, seen) {
192
+ let aValidType = isMap(a2);
193
+ let bValidType = isMap(b2);
194
+ if (aValidType || bValidType) {
195
+ return aValidType && bValidType ? looseCompareCollections(a2, b2, seen) : false;
196
+ }
197
+ aValidType = isSet(a2);
198
+ bValidType = isSet(b2);
199
+ if (aValidType || bValidType) {
200
+ return aValidType && bValidType ? looseCompareCollections(a2, b2, seen) : false;
201
+ }
202
+ const aKeysCount = Object.keys(a2).length;
203
+ const bKeysCount = Object.keys(b2).length;
204
+ if (aKeysCount !== bKeysCount) {
205
+ return false;
206
+ }
207
+ for (const key in a2) {
208
+ const aHasKey = a2.hasOwnProperty(key);
209
+ const bHasKey = b2.hasOwnProperty(key);
210
+ if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a2[key], b2[key], seen)) {
211
+ return false;
212
+ }
213
+ }
214
+ return String(a2) === String(b2);
215
+ }
216
+ function looseCompareNested(a2, b2, seen, compare) {
217
+ if (!seen) {
218
+ seen = [/* @__PURE__ */ new Map(), /* @__PURE__ */ new Map()];
219
+ }
220
+ const [seenA, seenB] = seen;
221
+ if (seenA.has(a2) || seenB.has(b2)) {
222
+ return seenA.get(a2) === b2 && seenB.get(b2) === a2;
223
+ }
224
+ seenA.set(a2, b2);
225
+ seenB.set(b2, a2);
226
+ const equal = compare(a2, b2, seen);
227
+ seenA.delete(a2);
228
+ seenB.delete(b2);
229
+ return equal;
230
+ }
231
+ function looseEqual(a2, b2, seen) {
192
232
  if (a2 === b2) return true;
193
233
  let aValidType = isDate(a2);
194
234
  let bValidType = isDate(b2);
@@ -203,7 +243,7 @@ var LintoEditor = (function(exports) {
203
243
  aValidType = isArray(a2);
204
244
  bValidType = isArray(b2);
205
245
  if (aValidType || bValidType) {
206
- return aValidType && bValidType ? looseCompareArrays(a2, b2) : false;
246
+ return aValidType && bValidType ? looseCompareNested(a2, b2, seen, looseCompareArrays) : false;
207
247
  }
208
248
  aValidType = isObject$1(a2);
209
249
  bValidType = isObject$1(b2);
@@ -211,28 +251,7 @@ var LintoEditor = (function(exports) {
211
251
  if (!aValidType || !bValidType) {
212
252
  return false;
213
253
  }
214
- aValidType = isMap(a2);
215
- bValidType = isMap(b2);
216
- if (aValidType || bValidType) {
217
- return aValidType && bValidType ? looseCompareCollections(a2, b2) : false;
218
- }
219
- aValidType = isSet(a2);
220
- bValidType = isSet(b2);
221
- if (aValidType || bValidType) {
222
- return aValidType && bValidType ? looseCompareCollections(a2, b2) : false;
223
- }
224
- const aKeysCount = Object.keys(a2).length;
225
- const bKeysCount = Object.keys(b2).length;
226
- if (aKeysCount !== bKeysCount) {
227
- return false;
228
- }
229
- for (const key in a2) {
230
- const aHasKey = a2.hasOwnProperty(key);
231
- const bHasKey = b2.hasOwnProperty(key);
232
- if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a2[key], b2[key])) {
233
- return false;
234
- }
235
- }
254
+ return looseCompareNested(a2, b2, seen, looseCompareObjects);
236
255
  }
237
256
  return String(a2) === String(b2);
238
257
  }
@@ -889,7 +908,9 @@ var LintoEditor = (function(exports) {
889
908
  const raw = /* @__PURE__ */ toRaw(array);
890
909
  if (raw === array) return raw;
891
910
  track(raw, "iterate", ARRAY_ITERATE_KEY);
892
- return /* @__PURE__ */ isShallow(array) ? raw : raw.map(toReactive);
911
+ if (/* @__PURE__ */ isShallow(array)) return raw;
912
+ if (!/* @__PURE__ */ isReadonly(array)) return raw.map(toReactive);
913
+ return /* @__PURE__ */ isReactive(array) ? raw.map((item) => toReadonly(toReactive(item))) : raw.map(toReadonly);
893
914
  }
894
915
  function shallowReadArray(arr) {
895
916
  track(arr = /* @__PURE__ */ toRaw(arr), "iterate", ARRAY_ITERATE_KEY);
@@ -3523,6 +3544,23 @@ var LintoEditor = (function(exports) {
3523
3544
  }
3524
3545
  return ret;
3525
3546
  }
3547
+ function createSlots(slots, dynamicSlots) {
3548
+ for (let i2 = 0; i2 < dynamicSlots.length; i2++) {
3549
+ const slot = dynamicSlots[i2];
3550
+ if (isArray(slot)) {
3551
+ for (let j = 0; j < slot.length; j++) {
3552
+ slots[slot[j].name] = slot[j].fn;
3553
+ }
3554
+ } else if (slot) {
3555
+ slots[slot.name] = slot.key ? (...args) => {
3556
+ const res = slot.fn(...args);
3557
+ if (res) res.key = slot.key;
3558
+ return res;
3559
+ } : slot.fn;
3560
+ }
3561
+ }
3562
+ return slots;
3563
+ }
3526
3564
  function renderSlot(slots, name, props, fallback, noSlotted, branchKey) {
3527
3565
  if (props == null) props = {};
3528
3566
  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {
@@ -4975,6 +5013,12 @@ var LintoEditor = (function(exports) {
4975
5013
  optimized = false;
4976
5014
  n2.dynamicChildren = null;
4977
5015
  }
5016
+ if (n2.dynamicChildren && n1 && n1.dynamicChildren && n1.dynamicChildren.hasOnce) {
5017
+ if (n2.dynamicChildren === EMPTY_ARR) {
5018
+ n2.dynamicChildren = [];
5019
+ }
5020
+ n2.dynamicChildren.hasOnce = true;
5021
+ }
4978
5022
  const { type, ref: ref3, shapeFlag } = n2;
4979
5023
  switch (type) {
4980
5024
  case Text:
@@ -5527,6 +5571,7 @@ var LintoEditor = (function(exports) {
5527
5571
  const instance = n2.component = n1.component;
5528
5572
  if (shouldUpdateComponent(n1, n2, optimized)) {
5529
5573
  if (instance.asyncDep && !instance.asyncResolved) {
5574
+ n2.el = n1.el;
5530
5575
  updateComponentPreRender(instance, n2, optimized);
5531
5576
  return;
5532
5577
  } else {
@@ -5872,7 +5917,7 @@ var LintoEditor = (function(exports) {
5872
5917
  keyToNewIndexMap.set(nextChild.key, i2);
5873
5918
  }
5874
5919
  }
5875
- let j2;
5920
+ let j;
5876
5921
  let patched = 0;
5877
5922
  const toBePatched = e2 - s2 + 1;
5878
5923
  let moved = false;
@@ -5889,9 +5934,9 @@ var LintoEditor = (function(exports) {
5889
5934
  if (prevChild.key != null) {
5890
5935
  newIndex = keyToNewIndexMap.get(prevChild.key);
5891
5936
  } else {
5892
- for (j2 = s2; j2 <= e2; j2++) {
5893
- if (newIndexToOldIndexMap[j2 - s2] === 0 && isSameVNodeType(prevChild, c2[j2])) {
5894
- newIndex = j2;
5937
+ for (j = s2; j <= e2; j++) {
5938
+ if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
5939
+ newIndex = j;
5895
5940
  break;
5896
5941
  }
5897
5942
  }
@@ -5920,7 +5965,7 @@ var LintoEditor = (function(exports) {
5920
5965
  }
5921
5966
  }
5922
5967
  const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
5923
- j2 = increasingNewIndexSequence.length - 1;
5968
+ j = increasingNewIndexSequence.length - 1;
5924
5969
  for (i2 = toBePatched - 1; i2 >= 0; i2--) {
5925
5970
  const nextIndex = s2 + i2;
5926
5971
  const nextChild = c2[nextIndex];
@@ -5942,10 +5987,10 @@ var LintoEditor = (function(exports) {
5942
5987
  optimized
5943
5988
  );
5944
5989
  } else if (moved) {
5945
- if (j2 < 0 || i2 !== increasingNewIndexSequence[j2]) {
5990
+ if (j < 0 || i2 !== increasingNewIndexSequence[j]) {
5946
5991
  move(nextChild, container, anchor, 2);
5947
5992
  } else {
5948
- j2--;
5993
+ j--;
5949
5994
  }
5950
5995
  }
5951
5996
  }
@@ -6036,7 +6081,7 @@ var LintoEditor = (function(exports) {
6036
6081
  cacheIndex,
6037
6082
  memo
6038
6083
  } = vnode;
6039
- if (patchFlag === -2) {
6084
+ if (patchFlag === -2 || dynamicChildren && dynamicChildren.hasOnce) {
6040
6085
  optimized = false;
6041
6086
  }
6042
6087
  if (ref3 != null) {
@@ -6044,7 +6089,7 @@ var LintoEditor = (function(exports) {
6044
6089
  setRef(ref3, null, parentSuspense, vnode, true);
6045
6090
  resetTracking();
6046
6091
  }
6047
- if (cacheIndex != null) {
6092
+ if (cacheIndex != null && (!vnode.ctx || vnode.ctx === parentComponent)) {
6048
6093
  parentComponent.renderCache[cacheIndex] = void 0;
6049
6094
  }
6050
6095
  if (shapeFlag & 256) {
@@ -6117,6 +6162,9 @@ var LintoEditor = (function(exports) {
6117
6162
  }
6118
6163
  if (type === Static) {
6119
6164
  removeStaticNode(vnode);
6165
+ if (transition && !transition.persisted && transition.afterLeave) {
6166
+ transition.afterLeave();
6167
+ }
6120
6168
  return;
6121
6169
  }
6122
6170
  const performRemove = () => {
@@ -6157,6 +6205,9 @@ var LintoEditor = (function(exports) {
6157
6205
  if (job) {
6158
6206
  job.flags |= 8;
6159
6207
  unmount(subTree, instance, parentSuspense, doRemove);
6208
+ } else if (instance.vnode.el && subTree) {
6209
+ subTree.transition = instance.vnode.transition;
6210
+ unmount(subTree, instance, parentSuspense, doRemove);
6160
6211
  }
6161
6212
  if (um) {
6162
6213
  queuePostRenderEffect(um, parentSuspense);
@@ -6272,14 +6323,14 @@ var LintoEditor = (function(exports) {
6272
6323
  function getSequence(arr) {
6273
6324
  const p2 = arr.slice();
6274
6325
  const result = [0];
6275
- let i2, j2, u2, v2, c2;
6326
+ let i2, j, u2, v2, c2;
6276
6327
  const len = arr.length;
6277
6328
  for (i2 = 0; i2 < len; i2++) {
6278
6329
  const arrI = arr[i2];
6279
6330
  if (arrI !== 0) {
6280
- j2 = result[result.length - 1];
6281
- if (arr[j2] < arrI) {
6282
- p2[i2] = j2;
6331
+ j = result[result.length - 1];
6332
+ if (arr[j] < arrI) {
6333
+ p2[i2] = j;
6283
6334
  result.push(i2);
6284
6335
  continue;
6285
6336
  }
@@ -6570,7 +6621,8 @@ var LintoEditor = (function(exports) {
6570
6621
  el: vnode.el,
6571
6622
  anchor: vnode.anchor,
6572
6623
  ctx: vnode.ctx,
6573
- ce: vnode.ce
6624
+ ce: vnode.ce,
6625
+ cacheIndex: vnode.cacheIndex
6574
6626
  };
6575
6627
  if (transition && cloneTransition) {
6576
6628
  setTransitionHooks(
@@ -7031,7 +7083,7 @@ var LintoEditor = (function(exports) {
7031
7083
  }
7032
7084
  return true;
7033
7085
  }
7034
- const version = "3.5.42";
7086
+ const version = "3.5.43";
7035
7087
  let policy = void 0;
7036
7088
  const tt$1 = typeof window !== "undefined" && window.trustedTypes;
7037
7089
  if (tt$1) {
@@ -8529,7 +8581,7 @@ var LintoEditor = (function(exports) {
8529
8581
  }
8530
8582
  const eventKey = hyphenate(event.key);
8531
8583
  if (modifiers.some(
8532
- (k2) => k2 === eventKey || keyNames[k2] === eventKey
8584
+ (k) => k === eventKey || keyNames[k] === eventKey
8533
8585
  )) {
8534
8586
  return fn(event);
8535
8587
  }
@@ -9179,7 +9231,7 @@ var LintoEditor = (function(exports) {
9179
9231
  const start = Math.floor(i2 * scale);
9180
9232
  const end = Math.max(start + 1, Math.floor((i2 + step * 2) * scale));
9181
9233
  let sum = 0;
9182
- for (let j2 = start; j2 < end; j2++) sum += Math.abs(channel[j2] ?? 0);
9234
+ for (let j = start; j < end; j++) sum += Math.abs(channel[j] ?? 0);
9183
9235
  const value = sum / (end - start);
9184
9236
  let x2 = i2;
9185
9237
  let y2 = value * (height / 2);
@@ -9516,8 +9568,8 @@ var LintoEditor = (function(exports) {
9516
9568
  }
9517
9569
  return core;
9518
9570
  }
9519
- const _hoisted_1$H = ["aria-label"];
9520
- const _sfc_main$O = /* @__PURE__ */ defineComponent({
9571
+ const _hoisted_1$I = ["aria-label"];
9572
+ const _sfc_main$Q = /* @__PURE__ */ defineComponent({
9521
9573
  __name: "Badge",
9522
9574
  props: {
9523
9575
  ariaLabel: { type: String }
@@ -9529,11 +9581,11 @@ var LintoEditor = (function(exports) {
9529
9581
  "aria-label": __props.ariaLabel
9530
9582
  }, [
9531
9583
  renderSlot(_ctx.$slots, "default", {}, void 0, true)
9532
- ], 8, _hoisted_1$H);
9584
+ ], 8, _hoisted_1$I);
9533
9585
  };
9534
9586
  }
9535
9587
  });
9536
- 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";
9588
+ 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";
9537
9589
  const _export_sfc = (sfc, props) => {
9538
9590
  const target = sfc.__vccOpts || sfc;
9539
9591
  for (const [key, val] of props) {
@@ -9541,7 +9593,7 @@ var LintoEditor = (function(exports) {
9541
9593
  }
9542
9594
  return target;
9543
9595
  };
9544
- const Badge = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["styles", [_style_0$G]], ["__scopeId", "data-v-392808cc"]]);
9596
+ const Badge = /* @__PURE__ */ _export_sfc(_sfc_main$Q, [["styles", [_style_0$H]], ["__scopeId", "data-v-392808cc"]]);
9545
9597
  const hasA11yProp = (props) => {
9546
9598
  for (const prop in props) {
9547
9599
  if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
@@ -10004,12 +10056,12 @@ var LintoEditor = (function(exports) {
10004
10056
  md: 20,
10005
10057
  lg: 24
10006
10058
  };
10007
- const _hoisted_1$G = {
10059
+ const _hoisted_1$H = {
10008
10060
  key: 1,
10009
10061
  class: "editor-icon editor-icon--missing",
10010
10062
  "aria-hidden": "true"
10011
10063
  };
10012
- const _sfc_main$N = /* @__PURE__ */ defineComponent({
10064
+ const _sfc_main$P = /* @__PURE__ */ defineComponent({
10013
10065
  __name: "EditorIcon",
10014
10066
  props: {
10015
10067
  name: { type: String },
@@ -10028,18 +10080,18 @@ var LintoEditor = (function(exports) {
10028
10080
  style: normalizeStyle(style.value),
10029
10081
  class: normalizeClass(["editor-icon", { "editor-icon--spin": __props.spin }]),
10030
10082
  "aria-hidden": "true"
10031
- }, null, 8, ["style", "class"])) : (openBlock(), createElementBlock("span", _hoisted_1$G, "?"));
10083
+ }, null, 8, ["style", "class"])) : (openBlock(), createElementBlock("span", _hoisted_1$H, "?"));
10032
10084
  };
10033
10085
  }
10034
10086
  });
10035
- 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";
10036
- const EditorIcon = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["styles", [_style_0$F]], ["__scopeId", "data-v-bdd2a2df"]]);
10037
- const _hoisted_1$F = ["type", "disabled", "aria-disabled", "aria-label"];
10038
- const _hoisted_2$v = {
10087
+ 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";
10088
+ const EditorIcon = /* @__PURE__ */ _export_sfc(_sfc_main$P, [["styles", [_style_0$G]], ["__scopeId", "data-v-bdd2a2df"]]);
10089
+ const _hoisted_1$G = ["type", "disabled", "aria-disabled", "aria-label"];
10090
+ const _hoisted_2$w = {
10039
10091
  key: 3,
10040
10092
  class: "editor-btn__label"
10041
10093
  };
10042
- const _sfc_main$M = /* @__PURE__ */ defineComponent({
10094
+ const _sfc_main$O = /* @__PURE__ */ defineComponent({
10043
10095
  __name: "Button",
10044
10096
  props: {
10045
10097
  label: { type: String },
@@ -10092,7 +10144,7 @@ var LintoEditor = (function(exports) {
10092
10144
  name: __props.icon,
10093
10145
  size: iconSize.value
10094
10146
  }, null, 8, ["name", "size"])) : _ctx.$slots.icon ? renderSlot(_ctx.$slots, "icon", {}, void 0, true, 2) : createCommentVNode("", true),
10095
- hasLabel.value ? (openBlock(), createElementBlock("span", _hoisted_2$v, [
10147
+ hasLabel.value ? (openBlock(), createElementBlock("span", _hoisted_2$w, [
10096
10148
  renderSlot(_ctx.$slots, "default", {}, () => [
10097
10149
  createTextVNode(toDisplayString(__props.label), 1)
10098
10150
  ], true)
@@ -10102,13 +10154,13 @@ var LintoEditor = (function(exports) {
10102
10154
  name: __props.iconRight,
10103
10155
  size: iconSize.value
10104
10156
  }, null, 8, ["name", "size"])) : _ctx.$slots["icon-right"] ? renderSlot(_ctx.$slots, "icon-right", {}, void 0, true, 5) : createCommentVNode("", true)
10105
- ], 10, _hoisted_1$F);
10157
+ ], 10, _hoisted_1$G);
10106
10158
  };
10107
10159
  }
10108
10160
  });
10109
- 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";
10110
- const Button = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["styles", [_style_0$E]], ["__scopeId", "data-v-050bd95b"]]);
10111
- const _sfc_main$L = /* @__PURE__ */ defineComponent({
10161
+ 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";
10162
+ const Button = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["styles", [_style_0$F]], ["__scopeId", "data-v-050bd95b"]]);
10163
+ const _sfc_main$N = /* @__PURE__ */ defineComponent({
10112
10164
  __name: "CopyButton",
10113
10165
  props: {
10114
10166
  icon: { default: "copy", type: String },
@@ -10176,8 +10228,8 @@ var LintoEditor = (function(exports) {
10176
10228
  };
10177
10229
  }
10178
10230
  });
10179
- 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";
10180
- const CopyButton = /* @__PURE__ */ _export_sfc(_sfc_main$L, [["styles", [_style_0$D]], ["__scopeId", "data-v-5b088678"]]);
10231
+ 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";
10232
+ const CopyButton = /* @__PURE__ */ _export_sfc(_sfc_main$N, [["styles", [_style_0$E]], ["__scopeId", "data-v-5b088678"]]);
10181
10233
  const fr = {
10182
10234
  "editor.loading": "Chargement…",
10183
10235
  "editor.loadError": "Erreur de chargement",
@@ -10494,10 +10546,10 @@ var LintoEditor = (function(exports) {
10494
10546
  locale: fallbackLocale
10495
10547
  };
10496
10548
  }
10497
- const _hoisted_1$E = { class: "code-block" };
10498
- const _hoisted_2$u = ["innerHTML"];
10499
- const _hoisted_3$n = { key: 1 };
10500
- const _sfc_main$K = /* @__PURE__ */ defineComponent({
10549
+ const _hoisted_1$F = { class: "code-block" };
10550
+ const _hoisted_2$v = ["innerHTML"];
10551
+ const _hoisted_3$o = { key: 1 };
10552
+ const _sfc_main$M = /* @__PURE__ */ defineComponent({
10501
10553
  __name: "CodeBlock",
10502
10554
  props: {
10503
10555
  code: { type: String },
@@ -10526,7 +10578,7 @@ var LintoEditor = (function(exports) {
10526
10578
  { immediate: true }
10527
10579
  );
10528
10580
  return (_ctx, _cache) => {
10529
- return openBlock(), createElementBlock("div", _hoisted_1$E, [
10581
+ return openBlock(), createElementBlock("div", _hoisted_1$F, [
10530
10582
  !__props.streaming ? (openBlock(), createBlock(CopyButton, {
10531
10583
  key: 0,
10532
10584
  class: "code-block__copy",
@@ -10539,13 +10591,13 @@ var LintoEditor = (function(exports) {
10539
10591
  highlighted.value ? (openBlock(), createElementBlock("code", {
10540
10592
  key: 0,
10541
10593
  innerHTML: highlighted.value
10542
- }, null, 8, _hoisted_2$u)) : (openBlock(), createElementBlock("code", _hoisted_3$n, toDisplayString(__props.code), 1))
10594
+ }, null, 8, _hoisted_2$v)) : (openBlock(), createElementBlock("code", _hoisted_3$o, toDisplayString(__props.code), 1))
10543
10595
  ])
10544
10596
  ]);
10545
10597
  };
10546
10598
  }
10547
10599
  });
10548
- 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";
10600
+ 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";
10549
10601
  const _style_1 = `/**
10550
10602
  * prism.js default theme for JavaScript, CSS and HTML
10551
10603
  * Based on dabblet (http://dabblet.com)
@@ -10671,20 +10723,20 @@ pre[class*="language-"] {
10671
10723
  cursor: help;
10672
10724
  }
10673
10725
  `;
10674
- const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["styles", [_style_0$C, _style_1]], ["__scopeId", "data-v-ad87d1e4"]]);
10675
- const _hoisted_1$D = {
10726
+ const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main$M, [["styles", [_style_0$D, _style_1]], ["__scopeId", "data-v-ad87d1e4"]]);
10727
+ const _hoisted_1$E = {
10676
10728
  key: 0,
10677
10729
  class: "form-field__header"
10678
10730
  };
10679
- const _hoisted_2$t = ["for"];
10680
- const _hoisted_3$m = {
10731
+ const _hoisted_2$u = ["for"];
10732
+ const _hoisted_3$n = {
10681
10733
  key: 0,
10682
10734
  class: "form-field__required",
10683
10735
  "aria-hidden": "true"
10684
10736
  };
10685
- const _hoisted_4$c = { class: "form-field__input-wrapper" };
10686
- const _hoisted_5$b = ["id", "disabled", "required", "aria-required", "aria-invalid", "aria-describedby"];
10687
- const _hoisted_6$a = ["value"];
10737
+ const _hoisted_4$e = { class: "form-field__input-wrapper" };
10738
+ const _hoisted_5$d = ["id", "disabled", "required", "aria-required", "aria-invalid", "aria-describedby"];
10739
+ const _hoisted_6$b = ["value"];
10688
10740
  const _hoisted_7$5 = ["type", "id", "disabled", "readonly", "placeholder", "autocomplete", "required", "aria-required", "aria-invalid", "aria-describedby"];
10689
10741
  const _hoisted_8$3 = {
10690
10742
  key: 3,
@@ -10697,7 +10749,7 @@ pre[class*="language-"] {
10697
10749
  };
10698
10750
  const _hoisted_10$3 = ["id"];
10699
10751
  const _hoisted_11$2 = { class: "form-field__error" };
10700
- const _sfc_main$J = /* @__PURE__ */ defineComponent({
10752
+ const _sfc_main$L = /* @__PURE__ */ defineComponent({
10701
10753
  __name: "FormInput",
10702
10754
  props: {
10703
10755
  field: { type: Object },
@@ -10807,17 +10859,17 @@ pre[class*="language-"] {
10807
10859
  return openBlock(), createElementBlock("div", {
10808
10860
  class: normalizeClass(rootClasses.value)
10809
10861
  }, [
10810
- __props.field.label ? (openBlock(), createElementBlock("div", _hoisted_1$D, [
10862
+ __props.field.label ? (openBlock(), createElementBlock("div", _hoisted_1$E, [
10811
10863
  createBaseVNode("label", {
10812
10864
  class: "form-field__label",
10813
10865
  for: id.value
10814
10866
  }, [
10815
10867
  createTextVNode(toDisplayString(__props.field.label) + " ", 1),
10816
- isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$m, "*")) : createCommentVNode("", true)
10817
- ], 8, _hoisted_2$t),
10868
+ isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$n, "*")) : createCommentVNode("", true)
10869
+ ], 8, _hoisted_2$u),
10818
10870
  renderSlot(_ctx.$slots, "content-after-label", {}, void 0, true)
10819
10871
  ])) : createCommentVNode("", true),
10820
- createBaseVNode("div", _hoisted_4$c, [
10872
+ createBaseVNode("div", _hoisted_4$e, [
10821
10873
  renderSlot(_ctx.$slots, "default", {}, void 0, true),
10822
10874
  _ctx.$slots["custom-input"] ? renderSlot(_ctx.$slots, "custom-input", {
10823
10875
  id: id.value,
@@ -10843,9 +10895,9 @@ pre[class*="language-"] {
10843
10895
  return openBlock(), createElementBlock("option", {
10844
10896
  key: opt.value,
10845
10897
  value: opt.value
10846
- }, toDisplayString(opt.label), 9, _hoisted_6$a);
10898
+ }, toDisplayString(opt.label), 9, _hoisted_6$b);
10847
10899
  }), 128))
10848
- ], 16, _hoisted_5$b)), [
10900
+ ], 16, _hoisted_5$d)), [
10849
10901
  [vModelSelect, draft.value]
10850
10902
  ]) : withDirectives((openBlock(), createElementBlock("input", mergeProps({
10851
10903
  key: 2,
@@ -10904,10 +10956,10 @@ pre[class*="language-"] {
10904
10956
  };
10905
10957
  }
10906
10958
  });
10907
- 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";
10908
- const FormInput = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["styles", [_style_0$B]], ["__scopeId", "data-v-863d0b18"]]);
10909
- const _hoisted_1$C = ["disabled", "aria-label"];
10910
- const _sfc_main$I = /* @__PURE__ */ defineComponent({
10959
+ 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";
10960
+ const FormInput = /* @__PURE__ */ _export_sfc(_sfc_main$L, [["styles", [_style_0$C]], ["__scopeId", "data-v-863d0b18"]]);
10961
+ const _hoisted_1$D = ["disabled", "aria-label"];
10962
+ const _sfc_main$K = /* @__PURE__ */ defineComponent({
10911
10963
  __name: "EditableText",
10912
10964
  props: {
10913
10965
  modelValue: { type: String },
@@ -10981,12 +11033,12 @@ pre[class*="language-"] {
10981
11033
  disabled: __props.disabled,
10982
11034
  "aria-label": __props.ariaLabel,
10983
11035
  onClick: startEdit
10984
- }, toDisplayString(__props.modelValue || __props.placeholder), 9, _hoisted_1$C));
11036
+ }, toDisplayString(__props.modelValue || __props.placeholder), 9, _hoisted_1$D));
10985
11037
  };
10986
11038
  }
10987
11039
  });
10988
- 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";
10989
- const EditableText = /* @__PURE__ */ _export_sfc(_sfc_main$I, [["styles", [_style_0$A]], ["__scopeId", "data-v-ff6456c8"]]);
11040
+ 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";
11041
+ const EditableText = /* @__PURE__ */ _export_sfc(_sfc_main$K, [["styles", [_style_0$B]], ["__scopeId", "data-v-ff6456c8"]]);
10990
11042
  function serialize(input) {
10991
11043
  if (typeof input === "string") return `'${input}'`;
10992
11044
  return new Serializer().serialize(input);
@@ -12710,11 +12762,11 @@ pre[class*="language-"] {
12710
12762
  function isPointInPolygon(point, polygon) {
12711
12763
  const { x: x2, y: y2 } = point;
12712
12764
  let inside = false;
12713
- for (let i2 = 0, j2 = polygon.length - 1; i2 < polygon.length; j2 = i2++) {
12765
+ for (let i2 = 0, j = polygon.length - 1; i2 < polygon.length; j = i2++) {
12714
12766
  const xi = polygon[i2].x;
12715
12767
  const yi = polygon[i2].y;
12716
- const xj = polygon[j2].x;
12717
- const yj = polygon[j2].y;
12768
+ const xj = polygon[j].x;
12769
+ const yj = polygon[j].y;
12718
12770
  const intersect = yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi;
12719
12771
  if (intersect) inside = !inside;
12720
12772
  }
@@ -15403,7 +15455,7 @@ pre[class*="language-"] {
15403
15455
  update
15404
15456
  };
15405
15457
  }
15406
- const _hoisted_1$B = ["dir"];
15458
+ const _hoisted_1$C = ["dir"];
15407
15459
  const PopperContentPropsDefaultValue = {
15408
15460
  side: "bottom",
15409
15461
  sideOffset: 0,
@@ -15696,7 +15748,7 @@ pre[class*="language-"] {
15696
15748
  "data-align",
15697
15749
  "dir",
15698
15750
  "style"
15699
- ]))], 12, _hoisted_1$B);
15751
+ ]))], 12, _hoisted_1$C);
15700
15752
  };
15701
15753
  }
15702
15754
  });
@@ -17514,7 +17566,7 @@ pre[class*="language-"] {
17514
17566
  }
17515
17567
  });
17516
17568
  var DropdownMenuTrigger_default = DropdownMenuTrigger_vue_vue_type_script_setup_true_lang_default;
17517
- const _sfc_main$H = /* @__PURE__ */ defineComponent({
17569
+ const _sfc_main$J = /* @__PURE__ */ defineComponent({
17518
17570
  __name: "EditorCheckbox",
17519
17571
  props: {
17520
17572
  modelValue: { type: Boolean },
@@ -17547,8 +17599,8 @@ pre[class*="language-"] {
17547
17599
  };
17548
17600
  }
17549
17601
  });
17550
- 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';
17551
- const EditorCheckbox = /* @__PURE__ */ _export_sfc(_sfc_main$H, [["styles", [_style_0$z]], ["__scopeId", "data-v-ed0978f7"]]);
17602
+ 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';
17603
+ const EditorCheckbox = /* @__PURE__ */ _export_sfc(_sfc_main$J, [["styles", [_style_0$A]], ["__scopeId", "data-v-ed0978f7"]]);
17552
17604
  function extend(destination) {
17553
17605
  for (var i2 = 1; i2 < arguments.length; i2++) {
17554
17606
  var source = arguments[i2];
@@ -18317,120 +18369,146 @@ pre[class*="language-"] {
18317
18369
  return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null };
18318
18370
  }
18319
18371
  var T = A();
18320
- function j(u2) {
18321
- T = u2;
18372
+ function U(l2) {
18373
+ T = l2;
18322
18374
  }
18323
18375
  var E$1 = { exec: () => null };
18324
- function I(u2) {
18376
+ function I(l2) {
18325
18377
  let e2 = [];
18326
18378
  return (t2) => {
18327
- let n2 = Math.max(0, Math.min(3, t2 - 1)), s2 = e2[n2];
18328
- return s2 || (s2 = u2(n2), e2[n2] = s2), s2;
18379
+ let n2 = Math.max(0, Math.min(3, t2 - 1)), i2 = e2[n2];
18380
+ return i2 || (i2 = l2(n2), e2[n2] = i2), i2;
18329
18381
  };
18330
18382
  }
18331
- function k(u2, e2 = "") {
18332
- let t2 = typeof u2 == "string" ? u2 : u2.source, n2 = { replace: (s2, r2) => {
18383
+ function d$2(l2, e2 = "") {
18384
+ let t2 = typeof l2 == "string" ? l2 : l2.source, n2 = { replace: (i2, r2) => {
18333
18385
  let o2 = typeof r2 == "string" ? r2 : r2.source;
18334
- return o2 = o2.replace(m$1.caret, "$1"), t2 = t2.replace(s2, o2), n2;
18386
+ return o2 = o2.replace(m$1.caret, "$1"), t2 = t2.replace(i2, o2), n2;
18335
18387
  }, getRegex: () => new RegExp(t2, e2) };
18336
18388
  return n2;
18337
18389
  }
18338
- var Te = ((u2 = "") => {
18390
+ var we = ((l2 = "") => {
18339
18391
  try {
18340
- return !!new RegExp("(?<=1)(?<!1)" + u2);
18392
+ return !!new RegExp("(?<=1)(?<!1)" + l2);
18341
18393
  } catch {
18342
18394
  return false;
18343
18395
  }
18344
- })(), m$1 = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, endingSpaceTabChar: /[ \t]$/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] +\S/, listReplaceTask: /^\[[ xX]\] +/, listTaskCheckbox: /\[[ xX]\]/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^<a /i, endATag: /^<\/a>/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^</, endAngleBracket: />$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u2) => new RegExp(`^( {0,3}${u2})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: I((u2) => new RegExp(`^ {0,${u2}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), hrRegex: I((u2) => new RegExp(`^ {0,${u2}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), fencesBeginRegex: I((u2) => new RegExp(`^ {0,${u2}}(?:\`\`\`|~~~)`)), headingBeginRegex: I((u2) => new RegExp(`^ {0,${u2}}#`)), htmlBeginRegex: I((u2) => new RegExp(`^ {0,${u2}}<(?:[a-z].*>|!--)`, "i")), blockquoteBeginRegex: I((u2) => new RegExp(`^ {0,${u2}}>`)) }, Oe = /^(?:[ \t]*(?:\n|$))+/, we = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, ye = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, q = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Pe = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, U = / {0,3}(?:[*+-]|\d{1,9}[.)])/, oe = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, ae = k(oe).replace(/bull/g, U).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}(?:\s|$)/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Se = k(oe).replace(/bull/g, U).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}(?:\s|$)/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), K = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/, _e = /^[^\n]+/, W = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, $e = k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", W).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Le = k(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g, U).getRegex(), Q = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", X = /<!--(?:-?>|[\s\S]*?(?:-->|$))/, ze = k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", X).replace("tag", Q).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), le = (u2) => k(K).replace("hr", q).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", u2).replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Q).getRegex(), Ee = le(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/), Me = le(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/), Ae = k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Me).getRegex(), J = { blockquote: Ae, code: we, def: $e, fences: ye, heading: Pe, hr: q, html: ze, lheading: ae, list: Le, newline: Oe, paragraph: Ee, table: E$1, text: _e }, se = k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", q).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Q).getRegex(), Ie = { ...J, lheading: Se, table: se, paragraph: k(K).replace("hr", q).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", se).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", Q).getRegex() }, Ce = { ...J, html: k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", X).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E$1, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: k(K).replace("hr", q).replace("heading", ` *#{1,6} *[^
18345
- ]`).replace("lheading", ae).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }, Be = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, De = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, ue = /^( {2,}|\\)\n(?!\s*$)/, qe = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, _ = /[\p{P}\p{S}]/u, C$1 = /[\s\p{P}\p{S}]/u, v$1 = /[^\s\p{P}\p{S}]/u, ve = k(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, C$1).getRegex(), He = /[\p{Pi}\p{Ps}"']/u, pe = /(?!~)[\p{P}\p{S}]/u, Ze = /(?!~)[\s\p{P}\p{S}]/u, Ge = /(?:[^\s\p{P}\p{S}]|~)/u, Qe = k(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Te ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), ce = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, Ne = k(ce, "u").replace(/punct/g, _).getRegex(), je = k(ce, "u").replace(/punct/g, pe).getRegex(), Fe = /^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/, Ue = k(Fe, "u").replace(/openQuote/g, He).replace(/punct/g, _).getRegex(), he = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", Ke = k(he, "gu").replace(/notPunctSpace/g, v$1).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), We = k(he, "gu").replace(/notPunctSpace/g, Ge).replace(/punctSpace/g, Ze).replace(/punct/g, pe).getRegex(), Xe = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)", Je = k(Xe, "gu").replace(/notPunctSpace/g, v$1).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), Ve = k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, v$1).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), Ye = "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)", et = k(Ye, "gu").replace(/notPunctSpace/g, v$1).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), tt = k(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, _).getRegex(), nt = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", rt = k(nt, "gu").replace(/notPunctSpace/g, v$1).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), st = k(/\\(punct)/, "gu").replace(/punct/g, _).getRegex(), it = k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), ot = k(X).replace("(?:-->|$)", "-->").getRegex(), at = k("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", ot).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), lt = /\[(?:\\[\s\S]|[^\[\]\\])*\]/, G = k(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets", lt).getRegex(), ut = k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", G).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), ke = k(/^!?\[(label)\]\[(ref)\]/).replace("label", G).replace("ref", W).getRegex(), de = k(/^!?\[(ref)\](?:\[\])?/).replace("ref", W).getRegex(), pt = k("reflink|nolink(?!\\()", "g").replace("reflink", ke).replace("nolink", de).getRegex(), ie = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, V = { _backpedal: E$1, anyPunctuation: st, autolink: it, blockSkip: Qe, br: ue, code: De, del: E$1, delLDelim: E$1, delRDelim: E$1, emStrongLDelim: Ne, emStrongRDelimAst: Ke, emStrongRDelimUnd: Ve, escape: Be, link: ut, nolink: de, punctuation: ve, reflink: ke, reflinkSearch: pt, tag: at, text: qe, url: E$1 }, ct = { ...V, emStrongLDelim: Ue, emStrongRDelimAst: Je, emStrongRDelimUnd: et, link: k(/^!?\[(label)\]\((.*?)\)/).replace("label", G).getRegex(), reflink: k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", G).getRegex() }, F = { ...V, emStrongRDelimAst: We, emStrongLDelim: je, delLDelim: tt, delRDelim: rt, url: k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", ie).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: k(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", ie).getRegex() }, ht = { ...F, br: k(ue).replace("{2,}", "*").getRegex(), text: k(F.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() }, H = { normal: J, gfm: Ie, pedantic: Ce }, B = { normal: V, gfm: F, breaks: ht, pedantic: ct };
18346
- var kt = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }, ge = (u2) => kt[u2];
18347
- function R(u2, e2) {
18396
+ })(), m$1 = { codeRemoveIndent: /^(?: {0,3}\t| {1,4})/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, endingSpaceTabChar: /[ \t]$/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] +\S/, listReplaceTask: /^\[[ xX]\] +/, listTaskCheckbox: /\[[ xX]\]/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^<a /i, endATag: /^<\/a>/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^</, endAngleBracket: />$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (l2) => new RegExp(`^( {0,3}${l2})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: I((l2) => new RegExp(`^ {0,${l2}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)), hrRegex: I((l2) => new RegExp(`^ {0,${l2}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)), fencesBeginRegex: I((l2) => new RegExp(`^ {0,${l2}}(?:\`\`\`|~~~)`)), headingBeginRegex: I((l2) => new RegExp(`^ {0,${l2}}#`)), htmlBeginRegex: I((l2) => new RegExp(`^ {0,${l2}}(?:</?(?:${H})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`, "i")), blockquoteBeginRegex: I((l2) => new RegExp(`^ {0,${l2}}>`)) }, ye = /^(?:[ \t]*(?:\n|$))+/, Pe = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Se = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, v$1 = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, _e = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, K = / {0,3}(?:[*+-]|\d{1,9}[.)])/, le = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, ue = d$2(le).replace(/bull/g, K).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}(?:\s|$)/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), $e = d$2(le).replace(/bull/g, K).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}(?:\s|$)/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), W = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/, Le = /^[^\n]+/, X = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, ze = d$2(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", X).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Ee = d$2(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g, K).getRegex(), H = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", J = /<!--(?:-?>|[\s\S]*?(?:-->|$))/, Me = d$2("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", J).replace("tag", H).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), pe = (l2) => d$2(W).replace("hr", v$1).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", l2).replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex(), Ae = pe(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/), Ie = pe(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/), Ce = d$2(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Ie).getRegex(), V = { blockquote: Ce, code: Pe, def: ze, fences: Se, heading: _e, hr: v$1, html: Me, lheading: ue, list: Ee, newline: ye, paragraph: Ae, table: E$1, text: Le }, ie = d$2("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", v$1).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex(), Be = { ...V, lheading: $e, table: ie, paragraph: d$2(W).replace("hr", v$1).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", ie).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex() }, De = { ...V, html: d$2(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", J).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: E$1, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d$2(W).replace("hr", v$1).replace("heading", ` *#{1,6} *[^
18397
+ ]`).replace("lheading", ue).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }, qe = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, ve = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, ce = /^( {2,}|\\)\n(?!\s*$)[ \t]*/, He = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/, _ = /[\p{P}\p{S}]/u, C$1 = /[\s\p{P}\p{S}]/u, Z = /[^\s\p{P}\p{S}]/u, Ze = d$2(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, C$1).getRegex(), Ge = /[\p{Pi}\p{Ps}"']/u, he = /(?!~)[\p{P}\p{S}]/u, Qe = /(?!~)[\s\p{P}\p{S}]/u, Ne = /(?:[^\s\p{P}\p{S}]|~)/u, je = d$2(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", we ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), de = /^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/, Ue = d$2(de, "u").replace(/punct/g, _).getRegex(), Fe = d$2(de, "u").replace(/punct/g, he).getRegex(), Ke = /^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/, We = d$2(Ke, "u").replace(/openQuote/g, Ge).replace(/punct/g, _).getRegex(), ke = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", Xe = d$2(ke, "gu").replace(/notPunctSpace/g, Z).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), Je = d$2(ke, "gu").replace(/notPunctSpace/g, Ne).replace(/punctSpace/g, Qe).replace(/punct/g, he).getRegex(), Ve = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)", Ye = d$2(Ve, "gu").replace(/notPunctSpace/g, Z).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), et = d$2("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, Z).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), tt = "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)", nt = d$2(tt, "gu").replace(/notPunctSpace/g, Z).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), rt = d$2(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, _).getRegex(), st = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)", it = d$2(st, "gu").replace(/notPunctSpace/g, Z).replace(/punctSpace/g, C$1).replace(/punct/g, _).getRegex(), ot = d$2(/\\(punct)/, "gu").replace(/punct/g, _).getRegex(), at = d$2(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), lt = d$2(J).replace("(?:-->|$)", "-->").getRegex(), ut = d$2("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", lt).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), ge = /\[(?:\\[\s\S]|[^\[\]\\])*\]/, N = d$2(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets", ge).getRegex(), pt = d$2(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label", N).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), ct = d$2(/^!?\[(label)\]\[(ref)\]/).replace("label", N).replace("ref", X).getRegex(), ht = d$2(/^!?\[(ref)\](?:\[\])?/).replace("ref", X).getRegex(), oe = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/, dt = d$2(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace("brackets", ge).getRegex(), kt = d$2("reflink|nolink(?!\\()", "g").replace("reflink", d$2(/^!?\[(label)\]\[(ref)\]/).replace("label", dt).replace("ref", oe).getRegex()).replace("nolink", d$2(/^!?\[(ref)\](?:\[\])?/).replace("ref", oe).getRegex()).getRegex(), ae = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, Y = { _backpedal: E$1, anyPunctuation: ot, autolink: at, blockSkip: je, br: ce, code: ve, del: E$1, delLDelim: E$1, delRDelim: E$1, emStrongLDelim: Ue, emStrongRDelimAst: Xe, emStrongRDelimUnd: et, escape: qe, link: pt, nolink: ht, punctuation: Ze, reflink: ct, reflinkSearch: kt, tag: ut, text: He, url: E$1 }, gt = { ...Y, emStrongLDelim: We, emStrongRDelimAst: Ye, emStrongRDelimUnd: nt, link: d$2(/^!?\[(label)\]\((.*?)\)/).replace("label", N).getRegex(), reflink: d$2(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", N).getRegex() }, F = { ...Y, emStrongRDelimAst: Je, emStrongLDelim: Fe, delLDelim: rt, delRDelim: it, url: d$2(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", ae).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: d$2(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", ae).getRegex() }, ft = { ...F, br: d$2(ce).replace("{2,}", "*").getRegex(), text: d$2(F.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() }, G = { normal: V, gfm: Be, pedantic: De }, B = { normal: Y, gfm: F, breaks: ft, pedantic: gt };
18398
+ var mt = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }, fe = (l2) => mt[l2];
18399
+ function R(l2, e2) {
18348
18400
  if (e2) {
18349
- if (m$1.escapeTest.test(u2)) return u2.replace(m$1.escapeReplace, ge);
18350
- } else if (m$1.escapeTestNoEncode.test(u2)) return u2.replace(m$1.escapeReplaceNoEncode, ge);
18351
- return u2;
18401
+ if (m$1.escapeTest.test(l2)) return l2.replace(m$1.escapeReplace, fe);
18402
+ } else if (m$1.escapeTestNoEncode.test(l2)) return l2.replace(m$1.escapeReplaceNoEncode, fe);
18403
+ return l2;
18352
18404
  }
18353
- function Y(u2) {
18405
+ function ee(l2) {
18354
18406
  try {
18355
- u2 = encodeURI(u2).replace(m$1.percentDecode, "%");
18407
+ l2 = encodeURI(l2).replace(m$1.percentDecode, "%");
18356
18408
  } catch {
18357
18409
  return null;
18358
18410
  }
18359
- return u2;
18411
+ return l2;
18360
18412
  }
18361
- function ee(u2, e2) {
18362
- let t2 = u2.replace(m$1.findPipe, (r2, o2, i2) => {
18363
- let l2 = false, a2 = o2;
18364
- for (; --a2 >= 0 && i2[a2] === "\\"; ) l2 = !l2;
18365
- return l2 ? "|" : " |";
18366
- }), n2 = t2.split(m$1.splitPipe), s2 = 0;
18413
+ function te(l2, e2) {
18414
+ let t2 = l2.replace(m$1.findPipe, (r2, o2, s2) => {
18415
+ let u2 = false, a2 = o2;
18416
+ for (; --a2 >= 0 && s2[a2] === "\\"; ) u2 = !u2;
18417
+ return u2 ? "|" : " |";
18418
+ }), n2 = t2.split(m$1.splitPipe), i2 = 0;
18367
18419
  if (n2[0].trim() || n2.shift(), n2.length > 0 && !n2.at(-1)?.trim() && n2.pop(), e2) if (n2.length > e2) n2.splice(e2);
18368
18420
  else for (; n2.length < e2; ) n2.push("");
18369
- for (; s2 < n2.length; s2++) n2[s2] = n2[s2].trim().replace(m$1.slashPipe, "|");
18421
+ for (; i2 < n2.length; i2++) n2[i2] = n2[i2].trim().replace(m$1.slashPipe, "|");
18370
18422
  return n2;
18371
18423
  }
18372
- function $(u2, e2, t2) {
18373
- let n2 = u2.length;
18424
+ function $(l2, e2, t2) {
18425
+ let n2 = l2.length;
18374
18426
  if (n2 === 0) return "";
18375
- let s2 = 0;
18376
- for (; s2 < n2; ) {
18377
- let r2 = u2.charAt(n2 - s2 - 1);
18378
- if (r2 === e2 && true) s2++;
18427
+ let i2 = 0;
18428
+ for (; i2 < n2; ) {
18429
+ let r2 = l2.charAt(n2 - i2 - 1);
18430
+ if (r2 === e2 && true) i2++;
18379
18431
  else break;
18380
18432
  }
18381
- return u2.slice(0, n2 - s2);
18433
+ return l2.slice(0, n2 - i2);
18382
18434
  }
18383
- function te(u2) {
18384
- let e2 = u2.split(`
18435
+ function ne(l2) {
18436
+ let e2 = l2.split(`
18385
18437
  `), t2 = e2.length - 1;
18386
18438
  for (; t2 >= 0 && m$1.blankLine.test(e2[t2]); ) t2--;
18387
- return e2.length - t2 <= 2 ? u2 : e2.slice(0, t2 + 1).join(`
18439
+ return e2.length - t2 <= 2 ? l2 : e2.slice(0, t2 + 1).join(`
18388
18440
  `);
18389
18441
  }
18390
- function fe(u2, e2) {
18391
- if (u2.indexOf(e2[1]) === -1) return -1;
18442
+ function D(l2) {
18443
+ return l2.toLowerCase().toUpperCase().toLowerCase();
18444
+ }
18445
+ function me(l2, e2) {
18446
+ if (l2.indexOf(e2[1]) === -1) return -1;
18392
18447
  let t2 = 0;
18393
- for (let n2 = 0; n2 < u2.length; n2++) if (u2[n2] === "\\") n2++;
18394
- else if (u2[n2] === e2[0]) t2++;
18395
- else if (u2[n2] === e2[1] && (t2--, t2 < 0)) return n2;
18448
+ for (let n2 = 0; n2 < l2.length; n2++) if (l2[n2] === "\\") n2++;
18449
+ else if (l2[n2] === e2[0]) t2++;
18450
+ else if (l2[n2] === e2[1] && (t2--, t2 < 0)) return n2;
18396
18451
  return t2 > 0 ? -2 : -1;
18397
18452
  }
18398
- function me(u2, e2 = 0) {
18453
+ function xe(l2, e2 = 0) {
18399
18454
  let t2 = e2, n2 = "";
18400
- for (let s2 of u2) if (s2 === " ") {
18455
+ for (let i2 of l2) if (i2 === " ") {
18401
18456
  let r2 = 4 - t2 % 4;
18402
18457
  n2 += " ".repeat(r2), t2 += r2;
18403
- } else n2 += s2, t2++;
18458
+ } else n2 += i2, t2++;
18404
18459
  return n2;
18405
18460
  }
18406
- function xe(u2, e2, t2, n2, s2) {
18407
- let r2 = e2.href, o2 = e2.title || null, i2 = u2[1].replace(s2.other.outputLinkReplace, "$1"), l2 = u2[0].charAt(0) === "!";
18461
+ function be(l2, e2, t2, n2, i2) {
18462
+ let r2 = e2.href, o2 = e2.title || null, s2 = l2[1].replace(i2.other.outputLinkReplace, "$1"), u2 = l2[0].charAt(0) === "!";
18408
18463
  n2.state.inLink = true;
18409
18464
  let a2 = n2.state.linkEmitted, p2 = n2.state.inRawBlock;
18410
18465
  n2.state.linkEmitted = false;
18411
- let c2 = n2.inlineTokens(i2), h2 = n2.state.linkEmitted;
18412
- if (n2.state.linkEmitted = a2, n2.state.inLink = false, !l2) {
18466
+ let c2 = n2.inlineTokens(s2), h2 = n2.state.linkEmitted;
18467
+ if (n2.state.linkEmitted = a2, n2.state.inLink = false, !u2) {
18413
18468
  if (h2) {
18414
18469
  n2.state.inRawBlock = p2;
18415
18470
  return;
18416
18471
  }
18417
18472
  n2.state.linkEmitted = true;
18418
18473
  }
18419
- return { type: l2 ? "image" : "link", raw: t2, href: r2, title: o2, text: i2, tokens: c2 };
18474
+ return { type: u2 ? "image" : "link", raw: t2, href: r2, title: o2, text: s2, tokens: c2 };
18420
18475
  }
18421
- function dt(u2, e2, t2) {
18422
- let n2 = u2.match(t2.other.indentCodeCompensation);
18476
+ function xt(l2, e2, t2) {
18477
+ let n2 = l2.match(t2.other.indentCodeCompensation);
18423
18478
  if (n2 === null) return e2;
18424
- let s2 = n2[1];
18479
+ let i2 = n2[1];
18425
18480
  return e2.split(`
18426
18481
  `).map((r2) => {
18427
18482
  let o2 = r2.match(t2.other.beginningSpace);
18428
18483
  if (o2 === null) return r2;
18429
- let [i2] = o2;
18430
- return r2.slice(Math.min(i2.length, s2.length));
18484
+ let [s2] = o2;
18485
+ return r2.slice(Math.min(s2.length, i2.length));
18431
18486
  }).join(`
18432
18487
  `);
18433
18488
  }
18489
+ function Re(l2, e2, t2, n2) {
18490
+ if (!e2.includes("<")) return false;
18491
+ for (let i2 = 0; i2 < e2.length; i2++) {
18492
+ if (e2[i2] === "\\") {
18493
+ i2++;
18494
+ continue;
18495
+ }
18496
+ if (e2[i2] === "`") {
18497
+ let s2 = n2.inline.code.exec(e2.slice(i2));
18498
+ if (s2) {
18499
+ i2 += s2[0].length - 1;
18500
+ continue;
18501
+ }
18502
+ }
18503
+ if (e2[i2] !== "<") continue;
18504
+ let r2 = l2.slice(t2 + i2), o2 = n2.inline.tag.exec(r2) || n2.inline.autolink.exec(r2);
18505
+ if (o2) {
18506
+ if (o2[0].length > e2.length - i2) return true;
18507
+ i2 += o2[0].length - 1;
18508
+ }
18509
+ }
18510
+ return false;
18511
+ }
18434
18512
  var y$1 = class y {
18435
18513
  options;
18436
18514
  rules;
@@ -18445,15 +18523,15 @@ pre[class*="language-"] {
18445
18523
  code(e2) {
18446
18524
  let t2 = this.rules.block.code.exec(e2);
18447
18525
  if (t2) {
18448
- let n2 = this.options.pedantic ? t2[0] : te(t2[0]), s2 = n2.replace(this.rules.other.codeRemoveIndent, "");
18449
- return { type: "code", raw: n2, codeBlockStyle: "indented", text: s2 };
18526
+ let n2 = this.options.pedantic ? t2[0] : ne(t2[0]), i2 = n2.replace(this.rules.other.codeRemoveIndent, "");
18527
+ return { type: "code", raw: n2, codeBlockStyle: "indented", text: i2 };
18450
18528
  }
18451
18529
  }
18452
18530
  fences(e2) {
18453
18531
  let t2 = this.rules.block.fences.exec(e2);
18454
18532
  if (t2) {
18455
- let n2 = t2[0], s2 = dt(n2, t2[3] || "", this.rules);
18456
- return { type: "code", raw: n2, lang: t2[2] ? t2[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t2[2], text: s2 };
18533
+ let n2 = t2[0], i2 = xt(n2, t2[3] || "", this.rules);
18534
+ return { type: "code", raw: n2, lang: t2[2] ? t2[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t2[2], text: i2 };
18457
18535
  }
18458
18536
  }
18459
18537
  heading(e2) {
@@ -18461,8 +18539,8 @@ pre[class*="language-"] {
18461
18539
  if (t2) {
18462
18540
  let n2 = t2[2].trim();
18463
18541
  if (this.rules.other.endingHash.test(n2)) {
18464
- let s2 = $(n2, "#");
18465
- (this.options.pedantic || !s2 || this.rules.other.endingSpaceTabChar.test(s2)) && (n2 = s2.trim());
18542
+ let i2 = $(n2, "#");
18543
+ (this.options.pedantic || !i2 || this.rules.other.endingSpaceTabChar.test(i2)) && (n2 = i2.trim());
18466
18544
  }
18467
18545
  return { type: "heading", raw: $(t2[0], `
18468
18546
  `), depth: t2[1].length, text: n2, tokens: this.lexer.inline(n2) };
@@ -18478,77 +18556,77 @@ pre[class*="language-"] {
18478
18556
  if (t2) {
18479
18557
  let n2 = $(t2[0], `
18480
18558
  `).split(`
18481
- `), s2 = "", r2 = "", o2 = [];
18559
+ `), i2 = "", r2 = "", o2 = [];
18482
18560
  for (; n2.length > 0; ) {
18483
- let i2 = false, l2 = [], a2;
18484
- for (a2 = 0; a2 < n2.length; a2++) if (this.rules.other.blockquoteStart.test(n2[a2])) l2.push(n2[a2]), i2 = true;
18485
- else if (!i2) l2.push(n2[a2]);
18561
+ let s2 = false, u2 = [], a2;
18562
+ for (a2 = 0; a2 < n2.length; a2++) if (this.rules.other.blockquoteStart.test(n2[a2])) u2.push(n2[a2]), s2 = true;
18563
+ else if (!s2) u2.push(n2[a2]);
18486
18564
  else break;
18487
18565
  n2 = n2.slice(a2);
18488
- let p2 = l2.join(`
18566
+ let p2 = u2.join(`
18489
18567
  `), c2 = p2.replace(this.rules.other.blockquoteSetextReplace, `
18490
18568
  $1`).replace(this.rules.other.blockquoteSetextReplace2, "");
18491
- s2 = s2 ? `${s2}
18569
+ i2 = i2 ? `${i2}
18492
18570
  ${p2}` : p2, r2 = r2 ? `${r2}
18493
18571
  ${c2}` : c2;
18494
18572
  let h2 = this.lexer.state.top;
18495
18573
  if (this.lexer.state.top = true, this.lexer.blockTokens(c2, o2, true), this.lexer.state.top = h2, n2.length === 0) break;
18496
- let d2 = o2.at(-1);
18497
- if (d2?.type === "code") break;
18498
- if (d2?.type === "blockquote") {
18499
- let O = d2, g2 = n2.join(`
18574
+ let k = o2.at(-1);
18575
+ if (k?.type === "code") break;
18576
+ if (k?.type === "blockquote") {
18577
+ let O = k, g2 = n2.join(`
18500
18578
  `), w2 = O.raw + `
18501
18579
  ` + g2.replace(this.rules.other.blockquoteSetextReplace2, ""), z = this.blockquote(w2);
18502
- o2[o2.length - 1] = z, s2 = `${s2}
18580
+ o2[o2.length - 1] = z, i2 = `${i2}
18503
18581
  ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18504
18582
  break;
18505
- } else if (d2?.type === "list") {
18506
- let O = d2, g2 = O.raw + `
18583
+ } else if (k?.type === "list") {
18584
+ let O = k, g2 = O.raw + `
18507
18585
  ` + n2.join(`
18508
18586
  `), w2 = this.list(g2);
18509
- o2[o2.length - 1] = w2, s2 = s2.substring(0, s2.length - d2.raw.length) + w2.raw, r2 = r2.substring(0, r2.length - O.raw.length) + w2.raw, n2 = g2.substring(o2.at(-1).raw.length).split(`
18587
+ o2[o2.length - 1] = w2, i2 = i2.substring(0, i2.length - k.raw.length) + w2.raw, r2 = r2.substring(0, r2.length - O.raw.length) + w2.raw, n2 = g2.substring(o2.at(-1).raw.length).split(`
18510
18588
  `);
18511
18589
  continue;
18512
18590
  }
18513
18591
  }
18514
- return { type: "blockquote", raw: s2, tokens: o2, text: r2 };
18592
+ return { type: "blockquote", raw: i2, tokens: o2, text: r2 };
18515
18593
  }
18516
18594
  }
18517
18595
  list(e2) {
18518
18596
  let t2 = this.rules.block.list.exec(e2);
18519
18597
  if (t2) {
18520
- let n2 = t2[1].trim(), s2 = n2.length > 1, r2 = { type: "list", raw: "", ordered: s2, start: s2 ? +n2.slice(0, -1) : "", loose: false, items: [] };
18521
- n2 = s2 ? `\\d{1,9}\\${n2.slice(-1)}` : `\\${n2}`, this.options.pedantic && (n2 = s2 ? n2 : "[*+-]");
18522
- let o2 = this.rules.other.listItemRegex(n2), i2 = false;
18598
+ let n2 = t2[1].trim(), i2 = n2.length > 1, r2 = { type: "list", raw: "", ordered: i2, start: i2 ? +n2.slice(0, -1) : "", loose: false, items: [] };
18599
+ n2 = i2 ? `\\d{1,9}\\${n2.slice(-1)}` : `\\${n2}`, this.options.pedantic && (n2 = i2 ? n2 : "[*+-]");
18600
+ let o2 = this.rules.other.listItemRegex(n2), s2 = false;
18523
18601
  for (; e2; ) {
18524
18602
  let a2 = false, p2 = "", c2 = "";
18525
18603
  if (!(t2 = o2.exec(e2)) || this.rules.block.hr.test(e2)) break;
18526
18604
  p2 = t2[0], e2 = e2.substring(p2.length);
18527
- let h2 = me(t2[2].split(`
18528
- `, 1)[0], t2[1].length), d2 = e2.split(`
18605
+ let h2 = xe(t2[2].split(`
18606
+ `, 1)[0], t2[1].length), k = e2.split(`
18529
18607
  `, 1)[0], O = !h2.trim(), g2 = 0;
18530
- if (this.options.pedantic ? (g2 = 2, c2 = h2.trimStart()) : O ? g2 = t2[1].length + 1 : (g2 = h2.search(this.rules.other.nonSpaceChar), g2 = g2 > 4 ? 1 : g2, c2 = h2.slice(g2), g2 += t2[1].length), O && this.rules.other.blankLine.test(d2) && (p2 += d2 + `
18531
- `, e2 = e2.substring(d2.length + 1), a2 = true), !a2) {
18532
- let w2 = this.rules.other.nextBulletRegex(g2), z = this.rules.other.hrRegex(g2), ne = this.rules.other.fencesBeginRegex(g2), re = this.rules.other.headingBeginRegex(g2), be = this.rules.other.htmlBeginRegex(g2), Re = this.rules.other.blockquoteBeginRegex(g2);
18608
+ if (this.options.pedantic ? (g2 = 2, c2 = h2.trimStart()) : O ? g2 = t2[1].length + 1 : (g2 = h2.search(this.rules.other.nonSpaceChar), g2 = g2 > 4 ? 1 : g2, c2 = h2.slice(g2), g2 += t2[1].length), O && this.rules.other.blankLine.test(k) && (p2 += k + `
18609
+ `, e2 = e2.substring(k.length + 1), a2 = true), !a2) {
18610
+ let w2 = this.rules.other.nextBulletRegex(g2), z = this.rules.other.hrRegex(g2), re = this.rules.other.fencesBeginRegex(g2), se = this.rules.other.headingBeginRegex(g2), Te = this.rules.other.htmlBeginRegex(g2), Oe = this.rules.other.blockquoteBeginRegex(g2);
18533
18611
  for (; e2; ) {
18534
- let N = e2.split(`
18535
- `, 1)[0], D;
18536
- if (d2 = N, this.options.pedantic ? (d2 = d2.replace(this.rules.other.listReplaceNesting, " "), D = d2) : D = d2.replace(this.rules.other.tabCharGlobal, " "), ne.test(d2) || re.test(d2) || be.test(d2) || Re.test(d2) || w2.test(d2) || z.test(d2)) break;
18537
- if (D.search(this.rules.other.nonSpaceChar) >= g2 || !d2.trim()) c2 += `
18538
- ` + D.slice(g2);
18612
+ let j = e2.split(`
18613
+ `, 1)[0], q;
18614
+ if (k = j, this.options.pedantic ? (k = k.replace(this.rules.other.listReplaceNesting, " "), q = k) : q = k.replace(this.rules.other.tabCharGlobal, " "), re.test(k) || se.test(k) || Te.test(k) || Oe.test(k) || w2.test(k) || z.test(k)) break;
18615
+ if (q.search(this.rules.other.nonSpaceChar) >= g2 || !k.trim()) c2 += `
18616
+ ` + q.slice(g2);
18539
18617
  else {
18540
- if (O || h2.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || ne.test(h2) || re.test(h2) || z.test(h2)) break;
18618
+ if (O || h2.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || re.test(h2) || se.test(h2) || z.test(h2)) break;
18541
18619
  c2 += `
18542
- ` + d2;
18620
+ ` + k;
18543
18621
  }
18544
- O = !d2.trim(), p2 += N + `
18545
- `, e2 = e2.substring(N.length + 1), h2 = D.slice(g2);
18622
+ O = !k.trim(), p2 += j + `
18623
+ `, e2 = e2.substring(j.length + 1), h2 = q.slice(g2);
18546
18624
  }
18547
18625
  }
18548
- r2.loose || (i2 ? r2.loose = true : this.rules.other.doubleBlankLine.test(p2) && (i2 = true)), r2.items.push({ type: "list_item", raw: p2, task: !!this.options.gfm && this.rules.other.listIsTask.test(c2), loose: false, text: c2, tokens: [] }), r2.raw += p2;
18626
+ r2.loose || (s2 ? r2.loose = true : this.rules.other.doubleBlankLine.test(p2) && (s2 = true)), r2.items.push({ type: "list_item", raw: p2, task: !!this.options.gfm && this.rules.other.listIsTask.test(c2), loose: false, text: c2, tokens: [] }), r2.raw += p2;
18549
18627
  }
18550
- let l2 = r2.items.at(-1);
18551
- if (l2) l2.raw = l2.raw.trimEnd(), l2.text = l2.text.trimEnd();
18628
+ let u2 = r2.items.at(-1);
18629
+ if (u2) u2.raw = u2.raw.trimEnd(), u2.text = u2.text.trimEnd();
18552
18630
  else return;
18553
18631
  r2.raw = r2.raw.trimEnd();
18554
18632
  for (let a2 of r2.items) if (this.lexer.state.top = false, a2.tokens = this.lexer.blockTokens(a2.text, []), !r2.loose) {
@@ -18580,28 +18658,28 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18580
18658
  html(e2) {
18581
18659
  let t2 = this.rules.block.html.exec(e2);
18582
18660
  if (t2) {
18583
- let n2 = te(t2[0]);
18661
+ let n2 = ne(t2[0]);
18584
18662
  return { type: "html", block: true, raw: n2, pre: t2[1] === "pre" || t2[1] === "script" || t2[1] === "style", text: n2 };
18585
18663
  }
18586
18664
  }
18587
18665
  def(e2) {
18588
18666
  let t2 = this.rules.block.def.exec(e2);
18589
18667
  if (t2) {
18590
- let n2 = t2[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), s2 = t2[2] ? t2[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r2 = t2[3] ? t2[3].substring(1, t2[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t2[3];
18668
+ let n2 = D(t2[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i2 = t2[2] ? t2[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", r2 = t2[3] ? t2[3].substring(1, t2[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t2[3];
18591
18669
  return { type: "def", tag: n2, raw: $(t2[0], `
18592
- `), href: s2, title: r2 };
18670
+ `), href: i2, title: r2 };
18593
18671
  }
18594
18672
  }
18595
18673
  table(e2) {
18596
18674
  let t2 = this.rules.block.table.exec(e2);
18597
18675
  if (!t2 || !this.rules.other.tableDelimiter.test(t2[2])) return;
18598
- let n2 = ee(t2[1]), s2 = t2[2].replace(this.rules.other.tableAlignChars, "").split("|"), r2 = t2[3]?.trim() ? t2[3].replace(this.rules.other.tableRowBlankLine, "").split(`
18676
+ let n2 = te(t2[1]), i2 = t2[2].replace(this.rules.other.tableAlignChars, "").split("|"), r2 = t2[3]?.trim() ? t2[3].replace(this.rules.other.tableRowBlankLine, "").split(`
18599
18677
  `) : [], o2 = { type: "table", raw: $(t2[0], `
18600
18678
  `), header: [], align: [], rows: [] };
18601
- if (n2.length === s2.length) {
18602
- for (let i2 of s2) this.rules.other.tableAlignRight.test(i2) ? o2.align.push("right") : this.rules.other.tableAlignCenter.test(i2) ? o2.align.push("center") : this.rules.other.tableAlignLeft.test(i2) ? o2.align.push("left") : o2.align.push(null);
18603
- for (let i2 = 0; i2 < n2.length; i2++) o2.header.push({ text: n2[i2], tokens: this.lexer.inline(n2[i2]), header: true, align: o2.align[i2] });
18604
- for (let i2 of r2) o2.rows.push(ee(i2, o2.header.length).map((l2, a2) => ({ text: l2, tokens: this.lexer.inline(l2), header: false, align: o2.align[a2] })));
18679
+ if (n2.length === i2.length) {
18680
+ for (let s2 of i2) this.rules.other.tableAlignRight.test(s2) ? o2.align.push("right") : this.rules.other.tableAlignCenter.test(s2) ? o2.align.push("center") : this.rules.other.tableAlignLeft.test(s2) ? o2.align.push("left") : o2.align.push(null);
18681
+ for (let s2 = 0; s2 < n2.length; s2++) o2.header.push({ text: n2[s2], tokens: this.lexer.inline(n2[s2]), header: true, align: o2.align[s2] });
18682
+ for (let s2 of r2) o2.rows.push(te(s2, o2.header.length).map((u2, a2) => ({ text: u2, tokens: this.lexer.inline(u2), header: false, align: o2.align[a2] })));
18605
18683
  return o2;
18606
18684
  }
18607
18685
  }
@@ -18636,59 +18714,63 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18636
18714
  link(e2) {
18637
18715
  let t2 = this.rules.inline.link.exec(e2);
18638
18716
  if (t2) {
18639
- let n2 = t2[2].trim();
18640
- if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n2)) {
18641
- if (!this.rules.other.endAngleBracket.test(n2)) return;
18642
- let o2 = $(n2.slice(0, -1), "\\");
18643
- if ((n2.length - o2.length) % 2 === 0) return;
18717
+ let n2 = t2[0].charAt(0) === "!" ? 2 : 1;
18718
+ if (!this.options.pedantic && Re(e2, t2[1], n2, this.rules)) return;
18719
+ let i2 = t2[2].trim();
18720
+ if (!this.options.pedantic && this.rules.other.startAngleBracket.test(i2)) {
18721
+ if (!this.rules.other.endAngleBracket.test(i2)) return;
18722
+ let s2 = $(i2.slice(0, -1), "\\");
18723
+ if ((i2.length - s2.length) % 2 === 0) return;
18644
18724
  } else {
18645
- let o2 = fe(t2[2], "()");
18646
- if (o2 === -2) return;
18647
- if (o2 > -1) {
18648
- let l2 = (t2[0].indexOf("!") === 0 ? 5 : 4) + t2[1].length + o2;
18649
- t2[2] = t2[2].substring(0, o2), t2[0] = t2[0].substring(0, l2).trim(), t2[3] = "";
18725
+ let s2 = me(t2[2], "()");
18726
+ if (s2 === -2) return;
18727
+ if (s2 > -1) {
18728
+ let a2 = (t2[0].indexOf("!") === 0 ? 5 : 4) + t2[1].length + s2;
18729
+ t2[2] = t2[2].substring(0, s2), t2[0] = t2[0].substring(0, a2).trim(), t2[3] = "";
18650
18730
  }
18651
18731
  }
18652
- let s2 = t2[2], r2 = "";
18732
+ let r2 = t2[2], o2 = "";
18653
18733
  if (this.options.pedantic) {
18654
- let o2 = this.rules.other.pedanticHrefTitle.exec(s2);
18655
- o2 && (s2 = o2[1], r2 = o2[3]);
18656
- } else r2 = t2[3] ? t2[3].slice(1, -1) : "";
18657
- return s2 = s2.trim(), this.rules.other.startAngleBracket.test(s2) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n2) ? s2 = s2.slice(1) : s2 = s2.slice(1, -1)), xe(t2, { href: s2 && s2.replace(this.rules.inline.anyPunctuation, "$1"), title: r2 && r2.replace(this.rules.inline.anyPunctuation, "$1") }, t2[0], this.lexer, this.rules);
18734
+ let s2 = this.rules.other.pedanticHrefTitle.exec(r2);
18735
+ s2 && (r2 = s2[1], o2 = s2[3]);
18736
+ } else o2 = t2[3] ? t2[3].slice(1, -1) : "";
18737
+ return r2 = r2.trim(), this.rules.other.startAngleBracket.test(r2) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(i2) ? r2 = r2.slice(1) : r2 = r2.slice(1, -1)), be(t2, { href: r2 && r2.replace(this.rules.inline.anyPunctuation, "$1"), title: o2 && o2.replace(this.rules.inline.anyPunctuation, "$1") }, t2[0], this.lexer, this.rules);
18658
18738
  }
18659
18739
  }
18660
18740
  reflink(e2, t2) {
18661
18741
  let n2;
18662
18742
  if ((n2 = this.rules.inline.reflink.exec(e2)) || (n2 = this.rules.inline.nolink.exec(e2))) {
18663
- let s2 = (n2[2] || n2[1]).replace(this.rules.other.multipleSpaceGlobal, " "), r2 = t2[s2.toLowerCase()];
18664
- if (!r2) {
18665
- let o2 = n2[0].charAt(0);
18666
- return { type: "text", raw: o2, text: o2 };
18743
+ let i2 = n2[0].charAt(0) === "!" ? 2 : 1;
18744
+ if (!this.options.pedantic && Re(e2, n2[1], i2, this.rules)) return;
18745
+ let r2 = (n2[2] || n2[1]).replace(this.rules.other.multipleSpaceGlobal, " "), o2 = t2[D(r2)];
18746
+ if (!o2) {
18747
+ let s2 = n2[0].charAt(0);
18748
+ return { type: "text", raw: s2, text: s2 };
18667
18749
  }
18668
- return xe(n2, r2, n2[0], this.lexer, this.rules);
18750
+ return be(n2, o2, n2[0], this.lexer, this.rules);
18669
18751
  }
18670
18752
  }
18671
18753
  emStrong(e2, t2, n2 = "") {
18672
- let s2 = this.rules.inline.emStrongLDelim.exec(e2);
18673
- if (!s2 || !s2[1] && !s2[2] && !s2[3] && !s2[4] || s2[4] && n2.match(this.rules.other.unicodeAlphaNumeric)) return;
18674
- if (!(s2[1] || s2[3] || "") || !n2 || this.rules.inline.punctuation.exec(n2)) {
18675
- let o2 = [...s2[0]].length - 1, i2, l2, a2 = o2, p2 = 0, c2 = s2[0][0], h2 = n2 === c2, d2 = c2 === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
18676
- for (d2.lastIndex = 0, t2 = t2.slice(-1 * e2.length + o2); (s2 = d2.exec(t2)) !== null; ) {
18677
- if (i2 = s2[1] || s2[2] || s2[3] || s2[4] || s2[5] || s2[6], !i2) continue;
18678
- if (l2 = [...i2].length, s2[3] || s2[4]) {
18679
- a2 += l2;
18754
+ let i2 = this.rules.inline.emStrongLDelim.exec(e2);
18755
+ if (!i2 || !i2[1] && !i2[2] && !i2[3] && !i2[4] || i2[4] && n2.match(this.rules.other.unicodeAlphaNumeric)) return;
18756
+ if (!(i2[1] || i2[3] || "") || !n2 || this.rules.inline.punctuation.exec(n2)) {
18757
+ let o2 = [...i2[0]].length - 1, s2, u2, a2 = o2, p2 = 0, c2 = i2[0][0], h2 = n2 === c2, k = c2 === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
18758
+ for (k.lastIndex = 0, t2 = t2.slice(-1 * e2.length + o2); (i2 = k.exec(t2)) !== null; ) {
18759
+ if (s2 = i2[1] || i2[2] || i2[3] || i2[4] || i2[5] || i2[6], !s2) continue;
18760
+ if (u2 = [...s2].length, i2[3] || i2[4]) {
18761
+ a2 += u2;
18680
18762
  continue;
18681
- } else if (s2[5] || s2[6]) {
18682
- if (o2 % 3 && !((o2 + l2) % 3)) {
18683
- p2 += l2;
18763
+ } else if (i2[5] || i2[6]) {
18764
+ if (o2 % 3 && !((o2 + u2) % 3)) {
18765
+ p2 += u2;
18684
18766
  continue;
18685
18767
  }
18686
18768
  if (h2) break;
18687
18769
  }
18688
- if (a2 -= l2, a2 > 0) continue;
18689
- l2 = Math.min(l2, l2 + a2 + p2);
18690
- let O = [...s2[0]][0].length, g2 = e2.slice(0, o2 + s2.index + O + l2);
18691
- if (Math.min(o2, l2) % 2) {
18770
+ if (a2 -= u2, a2 > 0) continue;
18771
+ u2 = Math.min(u2, u2 + a2 + p2);
18772
+ let O = [...i2[0]][0].length, g2 = e2.slice(0, o2 + i2.index + O + u2);
18773
+ if (Math.min(o2, u2) % 2) {
18692
18774
  let z = g2.slice(1, -1);
18693
18775
  return { type: "em", raw: g2, text: z, tokens: this.lexer.inlineTokens(z) };
18694
18776
  }
@@ -18700,8 +18782,8 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18700
18782
  codespan(e2) {
18701
18783
  let t2 = this.rules.inline.code.exec(e2);
18702
18784
  if (t2) {
18703
- let n2 = t2[2].replace(this.rules.other.newLineCharGlobal, " "), s2 = this.rules.other.nonSpaceChar.test(n2), r2 = this.rules.other.startingSpaceChar.test(n2) && this.rules.other.endingSpaceChar.test(n2);
18704
- return s2 && r2 && (n2 = n2.substring(1, n2.length - 1)), { type: "codespan", raw: t2[0], text: n2 };
18785
+ let n2 = t2[2].replace(this.rules.other.newLineCharGlobal, " "), i2 = this.rules.other.nonSpaceChar.test(n2), r2 = this.rules.other.startingSpaceChar.test(n2) && this.rules.other.endingSpaceChar.test(n2);
18786
+ return i2 && r2 && (n2 = n2.substring(1, n2.length - 1)), { type: "codespan", raw: t2[0], text: n2 };
18705
18787
  }
18706
18788
  }
18707
18789
  br(e2) {
@@ -18709,43 +18791,43 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18709
18791
  if (t2) return { type: "br", raw: t2[0] };
18710
18792
  }
18711
18793
  del(e2, t2, n2 = "") {
18712
- let s2 = this.rules.inline.delLDelim.exec(e2);
18713
- if (!s2) return;
18714
- if (!(s2[1] || "") || !n2 || this.rules.inline.punctuation.exec(n2)) {
18715
- let o2 = [...s2[0]].length - 1, i2, l2, a2 = o2, p2 = this.rules.inline.delRDelim;
18716
- for (p2.lastIndex = 0, t2 = t2.slice(-1 * e2.length + o2); (s2 = p2.exec(t2)) !== null; ) {
18717
- if (i2 = s2[1] || s2[2] || s2[3] || s2[4] || s2[5] || s2[6], !i2 || (l2 = [...i2].length, l2 !== o2)) continue;
18718
- if (s2[3] || s2[4]) {
18719
- a2 += l2;
18794
+ let i2 = this.rules.inline.delLDelim.exec(e2);
18795
+ if (!i2) return;
18796
+ if (!(i2[1] || "") || !n2 || this.rules.inline.punctuation.exec(n2)) {
18797
+ let o2 = [...i2[0]].length - 1, s2, u2, a2 = o2, p2 = this.rules.inline.delRDelim;
18798
+ for (p2.lastIndex = 0, t2 = t2.slice(-1 * e2.length + o2); (i2 = p2.exec(t2)) !== null; ) {
18799
+ if (s2 = i2[1] || i2[2] || i2[3] || i2[4] || i2[5] || i2[6], !s2 || (u2 = [...s2].length, u2 !== o2)) continue;
18800
+ if (i2[3] || i2[4]) {
18801
+ a2 += u2;
18720
18802
  continue;
18721
18803
  }
18722
- if (a2 -= l2, a2 > 0) continue;
18723
- l2 = Math.min(l2, l2 + a2);
18724
- let c2 = [...s2[0]][0].length, h2 = e2.slice(0, o2 + s2.index + c2 + l2), d2 = h2.slice(o2, -o2);
18725
- return { type: "del", raw: h2, text: d2, tokens: this.lexer.inlineTokens(d2) };
18804
+ if (a2 -= u2, a2 > 0) continue;
18805
+ u2 = Math.min(u2, u2 + a2);
18806
+ let c2 = [...i2[0]][0].length, h2 = e2.slice(0, o2 + i2.index + c2 + u2), k = h2.slice(o2, -o2);
18807
+ return { type: "del", raw: h2, text: k, tokens: this.lexer.inlineTokens(k) };
18726
18808
  }
18727
18809
  }
18728
18810
  }
18729
18811
  autolink(e2) {
18730
18812
  let t2 = this.rules.inline.autolink.exec(e2);
18731
18813
  if (t2) {
18732
- let n2, s2;
18733
- return t2[2] === "@" ? (n2 = t2[1], s2 = "mailto:" + n2) : (n2 = t2[1], s2 = n2), { type: "link", raw: t2[0], text: n2, href: s2, autolink: true, tokens: [{ type: "text", raw: n2, text: n2 }] };
18814
+ let n2, i2;
18815
+ return t2[2] === "@" ? (n2 = t2[1], i2 = "mailto:" + n2) : (n2 = t2[1], i2 = n2), { type: "link", raw: t2[0], text: n2, href: i2, autolink: true, tokens: [{ type: "text", raw: n2, text: n2 }] };
18734
18816
  }
18735
18817
  }
18736
18818
  url(e2) {
18737
18819
  let t2;
18738
18820
  if (t2 = this.rules.inline.url.exec(e2)) {
18739
- let n2, s2;
18740
- if (t2[2] === "@") n2 = t2[0], s2 = "mailto:" + n2;
18821
+ let n2, i2;
18822
+ if (t2[2] === "@") n2 = t2[0], i2 = "mailto:" + n2;
18741
18823
  else {
18742
18824
  let r2;
18743
18825
  do
18744
18826
  r2 = t2[0], t2[0] = this.rules.inline._backpedal.exec(t2[0])?.[0] ?? "";
18745
18827
  while (r2 !== t2[0]);
18746
- n2 = t2[0], t2[1] === "www." ? s2 = "http://" + t2[0] : s2 = t2[0];
18828
+ n2 = t2[0], t2[1] === "www." ? i2 = "http://" + t2[0] : i2 = t2[0];
18747
18829
  }
18748
- return { type: "link", raw: t2[0], text: n2, href: s2, autolink: true, tokens: [{ type: "text", raw: n2, text: n2 }] };
18830
+ return { type: "link", raw: t2[0], text: n2, href: i2, autolink: true, tokens: [{ type: "text", raw: n2, text: n2 }] };
18749
18831
  }
18750
18832
  }
18751
18833
  inlineText(e2) {
@@ -18756,7 +18838,7 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18756
18838
  }
18757
18839
  }
18758
18840
  };
18759
- var x = class u2 {
18841
+ var x = class l2 {
18760
18842
  tokens;
18761
18843
  options;
18762
18844
  state;
@@ -18764,17 +18846,17 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18764
18846
  tokenizer;
18765
18847
  constructor(e2) {
18766
18848
  this.tokens = [], this.tokens.links = /* @__PURE__ */ Object.create(null), this.options = e2 || T, this.options.tokenizer = this.options.tokenizer || new y$1(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: false, inRawBlock: false, linkEmitted: false, top: true };
18767
- let t2 = { other: m$1, block: H.normal, inline: B.normal };
18768
- this.options.pedantic ? (t2.block = H.pedantic, t2.inline = B.pedantic) : this.options.gfm && (t2.block = H.gfm, this.options.breaks ? t2.inline = B.breaks : t2.inline = B.gfm), this.tokenizer.rules = t2;
18849
+ let t2 = { other: m$1, block: G.normal, inline: B.normal };
18850
+ this.options.pedantic ? (t2.block = G.pedantic, t2.inline = B.pedantic) : this.options.gfm && (t2.block = G.gfm, this.options.breaks ? t2.inline = B.breaks : t2.inline = B.gfm), this.tokenizer.rules = t2;
18769
18851
  }
18770
18852
  static get rules() {
18771
- return { block: H, inline: B };
18853
+ return { block: G, inline: B };
18772
18854
  }
18773
18855
  static lex(e2, t2) {
18774
- return new u2(t2).lex(e2);
18856
+ return new l2(t2).lex(e2);
18775
18857
  }
18776
18858
  static lexInline(e2, t2) {
18777
- return new u2(t2).inlineTokens(e2);
18859
+ return new l2(t2).inlineTokens(e2);
18778
18860
  }
18779
18861
  lex(e2) {
18780
18862
  e2 = e2.replace(m$1.carriageReturn, `
@@ -18787,29 +18869,29 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18787
18869
  }
18788
18870
  blockTokens(e2, t2 = [], n2 = false) {
18789
18871
  this.tokenizer.lexer = this, this.options.pedantic && (e2 = e2.replace(m$1.tabCharGlobal, " ").replace(m$1.spaceLine, ""));
18790
- let s2 = 1 / 0;
18872
+ let i2 = 1 / 0;
18791
18873
  for (; e2; ) {
18792
- if (e2.length < s2) s2 = e2.length;
18874
+ if (e2.length < i2) i2 = e2.length;
18793
18875
  else {
18794
18876
  this.infiniteLoopError(e2.charCodeAt(0));
18795
18877
  break;
18796
18878
  }
18797
18879
  let r2;
18798
- if (this.options.extensions?.block?.some((i2) => (r2 = i2.call({ lexer: this }, e2, t2)) ? (e2 = e2.substring(r2.raw.length), t2.push(r2), true) : false)) continue;
18880
+ if (this.options.extensions?.block?.some((s2) => (r2 = s2.call({ lexer: this }, e2, t2)) ? (e2 = e2.substring(r2.raw.length), t2.push(r2), true) : false)) continue;
18799
18881
  if (r2 = this.tokenizer.space(e2)) {
18800
18882
  e2 = e2.substring(r2.raw.length);
18801
- let i2 = t2.at(-1);
18802
- r2.raw.length === 1 && i2 !== void 0 ? i2.raw += `
18883
+ let s2 = t2.at(-1);
18884
+ r2.raw.length === 1 && s2 !== void 0 ? s2.raw += `
18803
18885
  ` : t2.push(r2);
18804
18886
  continue;
18805
18887
  }
18806
18888
  if (r2 = this.tokenizer.code(e2)) {
18807
18889
  e2 = e2.substring(r2.raw.length);
18808
- let i2 = t2.at(-1);
18809
- i2?.type === "paragraph" || i2?.type === "text" ? (i2.raw += (i2.raw.endsWith(`
18890
+ let s2 = t2.at(-1);
18891
+ s2?.type === "paragraph" || s2?.type === "text" ? (s2.raw += (s2.raw.endsWith(`
18810
18892
  `) ? "" : `
18811
- `) + r2.raw, i2.text += `
18812
- ` + r2.text, this.inlineQueue.at(-1).src = i2.text) : t2.push(r2);
18893
+ `) + r2.raw, s2.text += `
18894
+ ` + r2.text, this.inlineQueue.at(-1).src = s2.text) : t2.push(r2);
18813
18895
  continue;
18814
18896
  }
18815
18897
  if (r2 = this.tokenizer.fences(e2)) {
@@ -18838,11 +18920,11 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18838
18920
  }
18839
18921
  if (r2 = this.tokenizer.def(e2)) {
18840
18922
  e2 = e2.substring(r2.raw.length);
18841
- let i2 = t2.at(-1);
18842
- i2?.type === "paragraph" || i2?.type === "text" ? (i2.raw += (i2.raw.endsWith(`
18923
+ let s2 = t2.at(-1);
18924
+ s2?.type === "paragraph" || s2?.type === "text" ? (s2.raw += (s2.raw.endsWith(`
18843
18925
  `) ? "" : `
18844
- `) + r2.raw, i2.text += `
18845
- ` + r2.raw, this.inlineQueue.at(-1).src = i2.text) : this.tokens.links[r2.tag] || (this.tokens.links[r2.tag] = { href: r2.href, title: r2.title }, t2.push(r2));
18926
+ `) + r2.raw, s2.text += `
18927
+ ` + r2.raw, this.inlineQueue.at(-1).src = s2.text) : this.tokens.links[r2.tag] || (this.tokens.links[r2.tag] = { href: r2.href, title: r2.title }, t2.push(r2));
18846
18928
  continue;
18847
18929
  }
18848
18930
  if (r2 = this.tokenizer.table(e2)) {
@@ -18855,26 +18937,26 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18855
18937
  }
18856
18938
  let o2 = e2;
18857
18939
  if (this.options.extensions?.startBlock) {
18858
- let i2 = 1 / 0, l2 = e2.slice(1), a2;
18940
+ let s2 = 1 / 0, u2 = e2.slice(1), a2;
18859
18941
  this.options.extensions.startBlock.forEach((p2) => {
18860
- a2 = p2.call({ lexer: this }, l2), typeof a2 == "number" && a2 >= 0 && (i2 = Math.min(i2, a2));
18861
- }), i2 < 1 / 0 && i2 >= 0 && (o2 = e2.substring(0, i2 + 1));
18942
+ a2 = p2.call({ lexer: this }, u2), typeof a2 == "number" && a2 >= 0 && (s2 = Math.min(s2, a2));
18943
+ }), s2 < 1 / 0 && s2 >= 0 && (o2 = e2.substring(0, s2 + 1));
18862
18944
  }
18863
18945
  if (this.state.top && (r2 = this.tokenizer.paragraph(o2))) {
18864
- let i2 = t2.at(-1);
18865
- n2 && i2?.type === "paragraph" ? (i2.raw += (i2.raw.endsWith(`
18946
+ let s2 = t2.at(-1);
18947
+ n2 && s2?.type === "paragraph" ? (s2.raw += (s2.raw.endsWith(`
18866
18948
  `) ? "" : `
18867
- `) + r2.raw, i2.text += `
18868
- ` + r2.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = i2.text) : t2.push(r2), n2 = o2.length !== e2.length, e2 = e2.substring(r2.raw.length);
18949
+ `) + r2.raw, s2.text += `
18950
+ ` + r2.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s2.text) : t2.push(r2), n2 = o2.length !== e2.length, e2 = e2.substring(r2.raw.length);
18869
18951
  continue;
18870
18952
  }
18871
18953
  if (r2 = this.tokenizer.text(e2)) {
18872
18954
  e2 = e2.substring(r2.raw.length);
18873
- let i2 = t2.at(-1);
18874
- i2?.type === "text" ? (i2.raw += (i2.raw.endsWith(`
18955
+ let s2 = t2.at(-1);
18956
+ s2?.type === "text" ? (s2.raw += (s2.raw.endsWith(`
18875
18957
  `) ? "" : `
18876
- `) + r2.raw, i2.text += `
18877
- ` + r2.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = i2.text) : t2.push(r2);
18958
+ `) + r2.raw, s2.text += `
18959
+ ` + r2.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s2.text) : t2.push(r2);
18878
18960
  continue;
18879
18961
  }
18880
18962
  if (e2) {
@@ -18892,8 +18974,8 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18892
18974
  let t2 = this.tokenizer.rules.inline.link;
18893
18975
  for (let n2 of e2.matchAll(this.tokenizer.rules.inline.blockSkip)) if (t2.test(n2[0]) && e2.charAt(n2.index - 1) !== "!") return true;
18894
18976
  for (let n2 of e2.matchAll(this.tokenizer.rules.inline.reflinkSearch)) {
18895
- let s2 = n2[0], r2 = s2.lastIndexOf("[");
18896
- if (!(s2.charAt(0) === "!" || !Object.hasOwn(this.tokens.links, s2.slice(r2 + 1, -1))) && !(r2 > 1 && this.linkInText(s2.slice(1, r2 - 1)))) return true;
18977
+ let i2 = n2[0], r2 = i2.lastIndexOf("[");
18978
+ if (!(i2.charAt(0) === "!" || !Object.hasOwn(this.tokens.links, D(i2.slice(r2 + 1, -1)))) && !(r2 > 1 && this.linkInText(i2.slice(1, r2 - 1)))) return true;
18897
18979
  }
18898
18980
  return false;
18899
18981
  }
@@ -18901,84 +18983,84 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
18901
18983
  this.tokenizer.lexer = this;
18902
18984
  let n2 = e2;
18903
18985
  if (this.tokens.links && e2.includes("[")) {
18904
- let i2 = this.tokenizer.rules.inline.reflinkSearch, l2 = (a2) => {
18986
+ let s2 = this.tokenizer.rules.inline.reflinkSearch, u2 = (a2) => {
18905
18987
  let p2 = a2.lastIndexOf("[");
18906
- if (!Object.hasOwn(this.tokens.links, a2.slice(p2 + 1, -1))) return a2;
18988
+ if (!Object.hasOwn(this.tokens.links, D(a2.slice(p2 + 1, -1)))) return a2;
18907
18989
  if (p2 > 1 && a2.charAt(0) !== "!") {
18908
18990
  let c2 = a2.slice(1, p2 - 1);
18909
- if (this.linkInText(c2)) return "[" + c2.replace(i2, l2) + "][" + "a".repeat(a2.length - p2 - 2) + "]";
18991
+ if (this.linkInText(c2)) return "[" + c2.replace(s2, u2) + "][" + "a".repeat(a2.length - p2 - 2) + "]";
18910
18992
  }
18911
18993
  return "[" + "a".repeat(a2.length - 2) + "]";
18912
18994
  };
18913
- n2 = n2.replace(i2, l2);
18995
+ n2 = n2.replace(s2, u2);
18914
18996
  }
18915
- n2 = n2.replace(this.tokenizer.rules.inline.anyPunctuation, (i2) => "+".repeat(i2.length)), n2 = n2.replace(this.tokenizer.rules.inline.blockSkip, (i2, l2, a2) => {
18997
+ n2 = n2.replace(this.tokenizer.rules.inline.anyPunctuation, (s2) => "+".repeat(s2.length)), n2 = n2.replace(this.tokenizer.rules.inline.blockSkip, (s2, u2, a2) => {
18916
18998
  let p2 = a2 ? a2.length : 0;
18917
- return i2.slice(0, p2) + "[" + "a".repeat(i2.length - p2 - 2) + "]";
18999
+ return s2.slice(0, p2) + "[" + "a".repeat(s2.length - p2 - 2) + "]";
18918
19000
  }), n2 = this.options.hooks?.emStrongMask?.call({ lexer: this }, n2) ?? n2;
18919
- let s2 = false, r2 = "", o2 = 1 / 0;
19001
+ let i2 = false, r2 = "", o2 = 1 / 0;
18920
19002
  for (; e2; ) {
18921
19003
  if (e2.length < o2) o2 = e2.length;
18922
19004
  else {
18923
19005
  this.infiniteLoopError(e2.charCodeAt(0));
18924
19006
  break;
18925
19007
  }
18926
- s2 || (r2 = ""), s2 = false;
18927
- let i2;
18928
- if (this.options.extensions?.inline?.some((a2) => (i2 = a2.call({ lexer: this }, e2, t2)) ? (e2 = e2.substring(i2.raw.length), t2.push(i2), true) : false)) continue;
18929
- if (i2 = this.tokenizer.escape(e2)) {
18930
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19008
+ i2 || (r2 = ""), i2 = false;
19009
+ let s2;
19010
+ if (this.options.extensions?.inline?.some((a2) => (s2 = a2.call({ lexer: this }, e2, t2)) ? (e2 = e2.substring(s2.raw.length), t2.push(s2), true) : false)) continue;
19011
+ if (s2 = this.tokenizer.escape(e2)) {
19012
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18931
19013
  continue;
18932
19014
  }
18933
- if (i2 = this.tokenizer.tag(e2)) {
18934
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19015
+ if (s2 = this.tokenizer.tag(e2)) {
19016
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18935
19017
  continue;
18936
19018
  }
18937
- if (i2 = this.tokenizer.link(e2)) {
18938
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19019
+ if (s2 = this.tokenizer.link(e2)) {
19020
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18939
19021
  continue;
18940
19022
  }
18941
- if (i2 = this.tokenizer.reflink(e2, this.tokens.links)) {
18942
- e2 = e2.substring(i2.raw.length);
19023
+ if (s2 = this.tokenizer.reflink(e2, this.tokens.links)) {
19024
+ e2 = e2.substring(s2.raw.length);
18943
19025
  let a2 = t2.at(-1);
18944
- i2.type === "text" && a2?.type === "text" ? (a2.raw += i2.raw, a2.text += i2.text) : t2.push(i2);
19026
+ s2.type === "text" && a2?.type === "text" ? (a2.raw += s2.raw, a2.text += s2.text) : t2.push(s2);
18945
19027
  continue;
18946
19028
  }
18947
- if (i2 = this.tokenizer.emStrong(e2, n2, r2)) {
18948
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19029
+ if (s2 = this.tokenizer.emStrong(e2, n2, r2)) {
19030
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18949
19031
  continue;
18950
19032
  }
18951
- if (i2 = this.tokenizer.codespan(e2)) {
18952
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19033
+ if (s2 = this.tokenizer.codespan(e2)) {
19034
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18953
19035
  continue;
18954
19036
  }
18955
- if (i2 = this.tokenizer.br(e2)) {
18956
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19037
+ if (s2 = this.tokenizer.br(e2)) {
19038
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18957
19039
  continue;
18958
19040
  }
18959
- if (i2 = this.tokenizer.del(e2, n2, r2)) {
18960
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19041
+ if (s2 = this.tokenizer.del(e2, n2, r2)) {
19042
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18961
19043
  continue;
18962
19044
  }
18963
- if (i2 = this.tokenizer.autolink(e2)) {
18964
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19045
+ if (s2 = this.tokenizer.autolink(e2)) {
19046
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18965
19047
  continue;
18966
19048
  }
18967
- if (!this.state.inLink && (i2 = this.tokenizer.url(e2))) {
18968
- e2 = e2.substring(i2.raw.length), t2.push(i2);
19049
+ if (!this.state.inLink && (s2 = this.tokenizer.url(e2))) {
19050
+ e2 = e2.substring(s2.raw.length), t2.push(s2);
18969
19051
  continue;
18970
19052
  }
18971
- let l2 = e2;
19053
+ let u2 = e2;
18972
19054
  if (this.options.extensions?.startInline) {
18973
19055
  let a2 = 1 / 0, p2 = e2.slice(1), c2;
18974
19056
  this.options.extensions.startInline.forEach((h2) => {
18975
19057
  c2 = h2.call({ lexer: this }, p2), typeof c2 == "number" && c2 >= 0 && (a2 = Math.min(a2, c2));
18976
- }), a2 < 1 / 0 && a2 >= 0 && (l2 = e2.substring(0, a2 + 1));
19058
+ }), a2 < 1 / 0 && a2 >= 0 && (u2 = e2.substring(0, a2 + 1));
18977
19059
  }
18978
- if (i2 = this.tokenizer.inlineText(l2)) {
18979
- e2 = e2.substring(i2.raw.length), i2.raw.slice(-1) !== "_" && (r2 = i2.raw.slice(-1)), s2 = true;
19060
+ if (s2 = this.tokenizer.inlineText(u2)) {
19061
+ e2 = e2.substring(s2.raw.length), s2.raw.slice(-1) !== "_" && (r2 = s2.raw.slice(-1)), i2 = true;
18980
19062
  let a2 = t2.at(-1);
18981
- a2?.type === "text" ? (a2.raw += i2.raw, a2.text += i2.text) : t2.push(i2);
19063
+ a2?.type === "text" ? (a2.raw += s2.raw, a2.text += s2.text) : t2.push(s2);
18982
19064
  continue;
18983
19065
  }
18984
19066
  if (e2) {
@@ -19004,9 +19086,9 @@ ${g2}`, r2 = r2.substring(0, r2.length - O.text.length) + z.text;
19004
19086
  return "";
19005
19087
  }
19006
19088
  code({ text: e2, lang: t2, escaped: n2 }) {
19007
- let s2 = (t2 || "").match(m$1.notSpaceStart)?.[0], r2 = e2 ? e2.replace(m$1.endingNewline, "") + `
19089
+ let i2 = (t2 || "").match(m$1.notSpaceStart)?.[0], r2 = e2 ? e2.replace(m$1.endingNewline, "") + `
19008
19090
  ` : "";
19009
- return s2 ? '<pre><code class="language-' + R(s2) + '">' + (n2 ? r2 : R(r2, true)) + `</code></pre>
19091
+ return i2 ? '<pre><code class="language-' + R(i2) + '">' + (n2 ? r2 : R(r2, true)) + `</code></pre>
19010
19092
  ` : "<pre><code>" + (n2 ? r2 : R(r2, true)) + `</code></pre>
19011
19093
  `;
19012
19094
  }
@@ -19030,14 +19112,14 @@ ${this.parser.parse(e2)}</blockquote>
19030
19112
  `;
19031
19113
  }
19032
19114
  list(e2) {
19033
- let t2 = e2.ordered, n2 = e2.start, s2 = "";
19034
- for (let i2 = 0; i2 < e2.items.length; i2++) {
19035
- let l2 = e2.items[i2];
19036
- s2 += this.listitem(l2);
19115
+ let t2 = e2.ordered, n2 = e2.start, i2 = "";
19116
+ for (let s2 = 0; s2 < e2.items.length; s2++) {
19117
+ let u2 = e2.items[s2];
19118
+ i2 += this.listitem(u2);
19037
19119
  }
19038
19120
  let r2 = t2 ? "ol" : "ul", o2 = t2 && n2 !== 1 ? ' start="' + n2 + '"' : "";
19039
19121
  return "<" + r2 + o2 + `>
19040
- ` + s2 + "</" + r2 + `>
19122
+ ` + i2 + "</" + r2 + `>
19041
19123
  `;
19042
19124
  }
19043
19125
  listitem(e2) {
@@ -19055,17 +19137,17 @@ ${this.parser.parse(e2)}</blockquote>
19055
19137
  let t2 = "", n2 = "";
19056
19138
  for (let r2 = 0; r2 < e2.header.length; r2++) n2 += this.tablecell(e2.header[r2]);
19057
19139
  t2 += this.tablerow({ text: n2 });
19058
- let s2 = "";
19140
+ let i2 = "";
19059
19141
  for (let r2 = 0; r2 < e2.rows.length; r2++) {
19060
19142
  let o2 = e2.rows[r2];
19061
19143
  n2 = "";
19062
- for (let i2 = 0; i2 < o2.length; i2++) n2 += this.tablecell(o2[i2]);
19063
- s2 += this.tablerow({ text: n2 });
19144
+ for (let s2 = 0; s2 < o2.length; s2++) n2 += this.tablecell(o2[s2]);
19145
+ i2 += this.tablerow({ text: n2 });
19064
19146
  }
19065
- return s2 && (s2 = `<tbody>${s2}</tbody>`), `<table>
19147
+ return i2 && (i2 = `<tbody>${i2}</tbody>`), `<table>
19066
19148
  <thead>
19067
19149
  ` + t2 + `</thead>
19068
- ` + s2 + `</table>
19150
+ ` + i2 + `</table>
19069
19151
  `;
19070
19152
  }
19071
19153
  tablerow({ text: e2 }) {
@@ -19093,16 +19175,16 @@ ${e2}</tr>
19093
19175
  del({ tokens: e2 }) {
19094
19176
  return `<del>${this.parser.parseInline(e2)}</del>`;
19095
19177
  }
19096
- link({ href: e2, title: t2, text: n2, tokens: s2, autolink: r2 }) {
19097
- let o2 = r2 ? R(n2, true) : this.parser.parseInline(s2), i2 = Y(e2);
19098
- if (i2 === null) return o2;
19099
- e2 = R(i2, r2);
19100
- let l2 = '<a href="' + e2 + '"';
19101
- return t2 && (l2 += ' title="' + R(t2) + '"'), l2 += ">" + o2 + "</a>", l2;
19178
+ link({ href: e2, title: t2, text: n2, tokens: i2, autolink: r2 }) {
19179
+ let o2 = r2 ? R(n2, true) : this.parser.parseInline(i2), s2 = ee(e2);
19180
+ if (s2 === null) return o2;
19181
+ e2 = R(s2, r2);
19182
+ let u2 = '<a href="' + e2 + '"';
19183
+ return t2 && (u2 += ' title="' + R(t2) + '"'), u2 += ">" + o2 + "</a>", u2;
19102
19184
  }
19103
- image({ href: e2, title: t2, text: n2, tokens: s2 }) {
19104
- s2 && (n2 = this.parser.parseInline(s2, this.parser.textRenderer));
19105
- let r2 = Y(e2);
19185
+ image({ href: e2, title: t2, text: n2, tokens: i2 }) {
19186
+ i2 && (n2 = this.parser.parseInline(i2, this.parser.textRenderer));
19187
+ let r2 = ee(e2);
19106
19188
  if (r2 === null) return R(n2);
19107
19189
  e2 = r2;
19108
19190
  let o2 = `<img src="${R(e2)}" alt="${R(n2)}"`;
@@ -19144,7 +19226,7 @@ ${e2}</tr>
19144
19226
  return e2;
19145
19227
  }
19146
19228
  };
19147
- var b$1 = class u2 {
19229
+ var b$1 = class l2 {
19148
19230
  options;
19149
19231
  renderer;
19150
19232
  textRenderer;
@@ -19152,24 +19234,24 @@ ${e2}</tr>
19152
19234
  this.options = e2 || T, this.options.renderer = this.options.renderer || new P$1(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new L();
19153
19235
  }
19154
19236
  static parse(e2, t2) {
19155
- return new u2(t2).parse(e2);
19237
+ return new l2(t2).parse(e2);
19156
19238
  }
19157
19239
  static parseInline(e2, t2) {
19158
- return new u2(t2).parseInline(e2);
19240
+ return new l2(t2).parseInline(e2);
19159
19241
  }
19160
19242
  parse(e2) {
19161
19243
  this.renderer.parser = this;
19162
19244
  let t2 = "";
19163
19245
  for (let n2 = 0; n2 < e2.length; n2++) {
19164
- let s2 = e2[n2];
19165
- if (this.options.extensions?.renderers?.[s2.type]) {
19166
- let o2 = s2, i2 = this.options.extensions.renderers[o2.type].call({ parser: this }, o2);
19167
- if (i2 !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "checkbox", "html", "def", "paragraph", "text"].includes(o2.type)) {
19168
- t2 += i2 || "";
19246
+ let i2 = e2[n2];
19247
+ if (this.options.extensions?.renderers?.[i2.type]) {
19248
+ let o2 = i2, s2 = this.options.extensions.renderers[o2.type].call({ parser: this }, o2);
19249
+ if (s2 !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "checkbox", "html", "def", "paragraph", "text"].includes(o2.type)) {
19250
+ t2 += s2 || "";
19169
19251
  continue;
19170
19252
  }
19171
19253
  }
19172
- let r2 = s2;
19254
+ let r2 = i2;
19173
19255
  switch (r2.type) {
19174
19256
  case "space": {
19175
19257
  t2 += this.renderer.space(r2);
@@ -19231,12 +19313,12 @@ ${e2}</tr>
19231
19313
  parseInline(e2, t2 = this.renderer) {
19232
19314
  this.renderer.parser = this;
19233
19315
  let n2 = "";
19234
- for (let s2 = 0; s2 < e2.length; s2++) {
19235
- let r2 = e2[s2];
19316
+ for (let i2 = 0; i2 < e2.length; i2++) {
19317
+ let r2 = e2[i2];
19236
19318
  if (this.options.extensions?.renderers?.[r2.type]) {
19237
- let i2 = this.options.extensions.renderers[r2.type].call({ parser: this }, r2);
19238
- if (i2 !== false || !["escape", "html", "link", "image", "checkbox", "strong", "em", "codespan", "br", "del", "text"].includes(r2.type)) {
19239
- n2 += i2 || "";
19319
+ let s2 = this.options.extensions.renderers[r2.type].call({ parser: this }, r2);
19320
+ if (s2 !== false || !["escape", "html", "link", "image", "checkbox", "strong", "em", "codespan", "br", "del", "text"].includes(r2.type)) {
19321
+ n2 += s2 || "";
19240
19322
  continue;
19241
19323
  }
19242
19324
  }
@@ -19287,9 +19369,9 @@ ${e2}</tr>
19287
19369
  break;
19288
19370
  }
19289
19371
  default: {
19290
- let i2 = 'Token with "' + o2.type + '" type was not found.';
19291
- if (this.options.silent) return console.error(i2), "";
19292
- throw new Error(i2);
19372
+ let s2 = 'Token with "' + o2.type + '" type was not found.';
19373
+ if (this.options.silent) return console.error(s2), "";
19374
+ throw new Error(s2);
19293
19375
  }
19294
19376
  }
19295
19377
  }
@@ -19323,7 +19405,7 @@ ${e2}</tr>
19323
19405
  return e2 ? b$1.parse : b$1.parseInline;
19324
19406
  }
19325
19407
  };
19326
- var Z = class {
19408
+ var Q = class {
19327
19409
  defaults = A();
19328
19410
  options = this.setOptions;
19329
19411
  parse = this.parseMarkdown(true);
@@ -19339,23 +19421,23 @@ ${e2}</tr>
19339
19421
  }
19340
19422
  walkTokens(e2, t2) {
19341
19423
  let n2 = [];
19342
- for (let s2 of e2) switch (n2 = n2.concat(t2.call(this, s2)), s2.type) {
19424
+ for (let i2 of e2) switch (n2 = n2.concat(t2.call(this, i2)), i2.type) {
19343
19425
  case "table": {
19344
- let r2 = s2;
19426
+ let r2 = i2;
19345
19427
  for (let o2 of r2.header) n2 = n2.concat(this.walkTokens(o2.tokens, t2));
19346
- for (let o2 of r2.rows) for (let i2 of o2) n2 = n2.concat(this.walkTokens(i2.tokens, t2));
19428
+ for (let o2 of r2.rows) for (let s2 of o2) n2 = n2.concat(this.walkTokens(s2.tokens, t2));
19347
19429
  break;
19348
19430
  }
19349
19431
  case "list": {
19350
- let r2 = s2;
19432
+ let r2 = i2;
19351
19433
  n2 = n2.concat(this.walkTokens(r2.items, t2));
19352
19434
  break;
19353
19435
  }
19354
19436
  default: {
19355
- let r2 = s2;
19437
+ let r2 = i2;
19356
19438
  this.defaults.extensions?.childTokens?.[r2.type] ? this.defaults.extensions.childTokens[r2.type].forEach((o2) => {
19357
- let i2 = r2[o2].flat(1 / 0);
19358
- n2 = n2.concat(this.walkTokens(i2, t2));
19439
+ let s2 = r2[o2].flat(1 / 0);
19440
+ n2 = n2.concat(this.walkTokens(s2, t2));
19359
19441
  }) : r2.tokens && (n2 = n2.concat(this.walkTokens(r2.tokens, t2)));
19360
19442
  }
19361
19443
  }
@@ -19364,14 +19446,14 @@ ${e2}</tr>
19364
19446
  use(...e2) {
19365
19447
  let t2 = this.defaults.extensions || { renderers: {}, childTokens: {} };
19366
19448
  return e2.forEach((n2) => {
19367
- let s2 = { ...n2 };
19368
- if (s2.async = this.defaults.async || s2.async || false, n2.extensions && (n2.extensions.forEach((r2) => {
19449
+ let i2 = { ...n2 };
19450
+ if (i2.async = this.defaults.async || i2.async || false, n2.extensions && (n2.extensions.forEach((r2) => {
19369
19451
  if (!r2.name) throw new Error("extension name required");
19370
19452
  if ("renderer" in r2) {
19371
19453
  let o2 = t2.renderers[r2.name];
19372
- o2 ? t2.renderers[r2.name] = function(...i2) {
19373
- let l2 = r2.renderer.apply(this, i2);
19374
- return l2 === false && (l2 = o2.apply(this, i2)), l2;
19454
+ o2 ? t2.renderers[r2.name] = function(...s2) {
19455
+ let u2 = r2.renderer.apply(this, s2);
19456
+ return u2 === false && (u2 = o2.apply(this, s2)), u2;
19375
19457
  } : t2.renderers[r2.name] = r2.renderer;
19376
19458
  }
19377
19459
  if ("tokenizer" in r2) {
@@ -19380,64 +19462,64 @@ ${e2}</tr>
19380
19462
  o2 ? o2.unshift(r2.tokenizer) : t2[r2.level] = [r2.tokenizer], r2.start && (r2.level === "block" ? t2.startBlock ? t2.startBlock.push(r2.start) : t2.startBlock = [r2.start] : r2.level === "inline" && (t2.startInline ? t2.startInline.push(r2.start) : t2.startInline = [r2.start]));
19381
19463
  }
19382
19464
  "childTokens" in r2 && r2.childTokens && (t2.childTokens[r2.name] = r2.childTokens);
19383
- }), s2.extensions = t2), n2.renderer) {
19465
+ }), i2.extensions = t2), n2.renderer) {
19384
19466
  let r2 = this.defaults.renderer || new P$1(this.defaults);
19385
19467
  for (let o2 in n2.renderer) {
19386
19468
  if (!(o2 in r2)) throw new Error(`renderer '${o2}' does not exist`);
19387
19469
  if (["options", "parser"].includes(o2)) continue;
19388
- let i2 = o2, l2 = n2.renderer[i2], a2 = r2[i2];
19389
- r2[i2] = (...p2) => {
19390
- let c2 = l2.apply(r2, p2);
19470
+ let s2 = o2, u2 = n2.renderer[s2], a2 = r2[s2];
19471
+ r2[s2] = (...p2) => {
19472
+ let c2 = u2.apply(r2, p2);
19391
19473
  return c2 === false && (c2 = a2.apply(r2, p2)), c2 || "";
19392
19474
  };
19393
19475
  }
19394
- s2.renderer = r2;
19476
+ i2.renderer = r2;
19395
19477
  }
19396
19478
  if (n2.tokenizer) {
19397
19479
  let r2 = this.defaults.tokenizer || new y$1(this.defaults);
19398
19480
  for (let o2 in n2.tokenizer) {
19399
19481
  if (!(o2 in r2)) throw new Error(`tokenizer '${o2}' does not exist`);
19400
19482
  if (["options", "rules", "lexer"].includes(o2)) continue;
19401
- let i2 = o2, l2 = n2.tokenizer[i2], a2 = r2[i2];
19402
- r2[i2] = (...p2) => {
19403
- let c2 = l2.apply(r2, p2);
19483
+ let s2 = o2, u2 = n2.tokenizer[s2], a2 = r2[s2];
19484
+ r2[s2] = (...p2) => {
19485
+ let c2 = u2.apply(r2, p2);
19404
19486
  return c2 === false && (c2 = a2.apply(r2, p2)), c2;
19405
19487
  };
19406
19488
  }
19407
- s2.tokenizer = r2;
19489
+ i2.tokenizer = r2;
19408
19490
  }
19409
19491
  if (n2.hooks) {
19410
19492
  let r2 = this.defaults.hooks || new S$1();
19411
19493
  for (let o2 in n2.hooks) {
19412
19494
  if (!(o2 in r2)) throw new Error(`hook '${o2}' does not exist`);
19413
19495
  if (["options", "block"].includes(o2)) continue;
19414
- let i2 = o2, l2 = n2.hooks[i2], a2 = r2[i2];
19415
- S$1.passThroughHooks.has(o2) ? r2[i2] = (p2) => {
19496
+ let s2 = o2, u2 = n2.hooks[s2], a2 = r2[s2];
19497
+ S$1.passThroughHooks.has(o2) ? r2[s2] = (p2) => {
19416
19498
  if (this.defaults.async && S$1.passThroughHooksRespectAsync.has(o2)) return (async () => {
19417
- let h2 = await l2.call(r2, p2);
19499
+ let h2 = await u2.call(r2, p2);
19418
19500
  return a2.call(r2, h2);
19419
19501
  })();
19420
- let c2 = l2.call(r2, p2);
19502
+ let c2 = u2.call(r2, p2);
19421
19503
  return a2.call(r2, c2);
19422
- } : r2[i2] = (...p2) => {
19504
+ } : r2[s2] = (...p2) => {
19423
19505
  if (this.defaults.async) return (async () => {
19424
- let h2 = await l2.apply(r2, p2);
19506
+ let h2 = await u2.apply(r2, p2);
19425
19507
  return h2 === false && (h2 = await a2.apply(r2, p2)), h2;
19426
19508
  })();
19427
- let c2 = l2.apply(r2, p2);
19509
+ let c2 = u2.apply(r2, p2);
19428
19510
  return c2 === false && (c2 = a2.apply(r2, p2)), c2;
19429
19511
  };
19430
19512
  }
19431
- s2.hooks = r2;
19513
+ i2.hooks = r2;
19432
19514
  }
19433
19515
  if (n2.walkTokens) {
19434
19516
  let r2 = this.defaults.walkTokens, o2 = n2.walkTokens;
19435
- s2.walkTokens = function(i2) {
19436
- let l2 = [];
19437
- return l2.push(o2.call(this, i2)), r2 && (l2 = l2.concat(r2.call(this, i2))), l2;
19517
+ i2.walkTokens = function(s2) {
19518
+ let u2 = [];
19519
+ return u2.push(o2.call(this, s2)), r2 && (u2 = u2.concat(r2.call(this, s2))), u2;
19438
19520
  };
19439
19521
  }
19440
- this.defaults = { ...this.defaults, ...s2 };
19522
+ this.defaults = { ...this.defaults, ...i2 };
19441
19523
  }), this;
19442
19524
  }
19443
19525
  setOptions(e2) {
@@ -19450,25 +19532,25 @@ ${e2}</tr>
19450
19532
  return b$1.parse(e2, t2 ?? this.defaults);
19451
19533
  }
19452
19534
  parseMarkdown(e2) {
19453
- return (n2, s2) => {
19454
- let r2 = { ...s2 }, o2 = { ...this.defaults, ...r2 }, i2 = this.onError(!!o2.silent, !!o2.async);
19455
- if (this.defaults.async === true && r2.async === false) return i2(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
19456
- if (typeof n2 > "u" || n2 === null) return i2(new Error("marked(): input parameter is undefined or null"));
19457
- if (typeof n2 != "string") return i2(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n2) + ", string expected"));
19535
+ return (n2, i2) => {
19536
+ let r2 = { ...i2 }, o2 = { ...this.defaults, ...r2 }, s2 = this.onError(!!o2.silent, !!o2.async);
19537
+ if (this.defaults.async === true && r2.async === false) return s2(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
19538
+ if (typeof n2 > "u" || n2 === null) return s2(new Error("marked(): input parameter is undefined or null"));
19539
+ if (typeof n2 != "string") return s2(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n2) + ", string expected"));
19458
19540
  if (o2.hooks && (o2.hooks.options = o2, o2.hooks.block = e2), o2.async) return (async () => {
19459
- let l2 = o2.hooks ? await o2.hooks.preprocess(n2) : n2, p2 = await (o2.hooks ? await o2.hooks.provideLexer(e2) : e2 ? x.lex : x.lexInline)(l2, o2), c2 = o2.hooks ? await o2.hooks.processAllTokens(p2) : p2;
19541
+ let u2 = o2.hooks ? await o2.hooks.preprocess(n2) : n2, p2 = await (o2.hooks ? await o2.hooks.provideLexer(e2) : e2 ? x.lex : x.lexInline)(u2, o2), c2 = o2.hooks ? await o2.hooks.processAllTokens(p2) : p2;
19460
19542
  o2.walkTokens && await Promise.all(this.walkTokens(c2, o2.walkTokens));
19461
- let d2 = await (o2.hooks ? await o2.hooks.provideParser(e2) : e2 ? b$1.parse : b$1.parseInline)(c2, o2);
19462
- return o2.hooks ? await o2.hooks.postprocess(d2) : d2;
19463
- })().catch(i2);
19543
+ let k = await (o2.hooks ? await o2.hooks.provideParser(e2) : e2 ? b$1.parse : b$1.parseInline)(c2, o2);
19544
+ return o2.hooks ? await o2.hooks.postprocess(k) : k;
19545
+ })().catch(s2);
19464
19546
  try {
19465
19547
  o2.hooks && (n2 = o2.hooks.preprocess(n2));
19466
19548
  let a2 = (o2.hooks ? o2.hooks.provideLexer(e2) : e2 ? x.lex : x.lexInline)(n2, o2);
19467
19549
  o2.hooks && (a2 = o2.hooks.processAllTokens(a2)), o2.walkTokens && this.walkTokens(a2, o2.walkTokens);
19468
19550
  let c2 = (o2.hooks ? o2.hooks.provideParser(e2) : e2 ? b$1.parse : b$1.parseInline)(a2, o2);
19469
19551
  return o2.hooks && (c2 = o2.hooks.postprocess(c2)), c2;
19470
- } catch (l2) {
19471
- return i2(l2);
19552
+ } catch (u2) {
19553
+ return s2(u2);
19472
19554
  }
19473
19555
  };
19474
19556
  }
@@ -19476,29 +19558,29 @@ ${e2}</tr>
19476
19558
  return (n2) => {
19477
19559
  if (n2.message += `
19478
19560
  Please report this to https://github.com/markedjs/marked.`, e2) {
19479
- let s2 = "<p>An error occurred:</p><pre>" + R(n2.message + "", true) + "</pre>";
19480
- return t2 ? Promise.resolve(s2) : s2;
19561
+ let i2 = "<p>An error occurred:</p><pre>" + R(n2.message + "", true) + "</pre>";
19562
+ return t2 ? Promise.resolve(i2) : i2;
19481
19563
  }
19482
19564
  if (t2) return Promise.reject(n2);
19483
19565
  throw n2;
19484
19566
  };
19485
19567
  }
19486
19568
  };
19487
- var M = new Z();
19488
- function f$1(u2, e2) {
19489
- return M.parse(u2, e2);
19569
+ var M = new Q();
19570
+ function f$1(l2, e2) {
19571
+ return M.parse(l2, e2);
19490
19572
  }
19491
- f$1.options = f$1.setOptions = function(u2) {
19492
- return M.setOptions(u2), f$1.defaults = M.defaults, j(f$1.defaults), f$1;
19573
+ f$1.options = f$1.setOptions = function(l2) {
19574
+ return M.setOptions(l2), f$1.defaults = M.defaults, U(f$1.defaults), f$1;
19493
19575
  };
19494
19576
  f$1.getDefaults = A;
19495
19577
  f$1.defaults = T;
19496
- function gt(...u2) {
19497
- return M.use(...u2), f$1.defaults = M.defaults, j(f$1.defaults), f$1;
19578
+ function bt(...l2) {
19579
+ return M.use(...l2), f$1.defaults = M.defaults, U(f$1.defaults), f$1;
19498
19580
  }
19499
- f$1.use = gt;
19500
- f$1.walkTokens = function(u2, e2) {
19501
- return M.walkTokens(u2, e2);
19581
+ f$1.use = bt;
19582
+ f$1.walkTokens = function(l2, e2) {
19583
+ return M.walkTokens(l2, e2);
19502
19584
  };
19503
19585
  f$1.parseInline = M.parseInline;
19504
19586
  f$1.Parser = b$1;
@@ -21117,17 +21199,23 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21117
21199
  const tokens = f$1.lexer(md);
21118
21200
  const segments = [];
21119
21201
  let buffer = [];
21120
- const flush = () => {
21202
+ function renderGroup(group) {
21203
+ const list = group;
21204
+ list.links = tokens.links;
21205
+ return purify.sanitize(f$1.parser(list));
21206
+ }
21207
+ function flush() {
21121
21208
  if (buffer.length === 0) return;
21122
- const group = buffer;
21123
- group.links = tokens.links;
21124
- segments.push({ type: "html", html: purify.sanitize(f$1.parser(group)) });
21209
+ segments.push({ type: "html", html: renderGroup(buffer) });
21125
21210
  buffer = [];
21126
- };
21211
+ }
21127
21212
  for (const token of tokens) {
21128
21213
  if (token.type === "code") {
21129
21214
  flush();
21130
21215
  segments.push({ type: "code", code: token.text, lang: token.lang ?? "" });
21216
+ } else if (token.type === "table") {
21217
+ flush();
21218
+ segments.push({ type: "table", html: renderGroup([token]) });
21131
21219
  } else {
21132
21220
  buffer.push(token);
21133
21221
  }
@@ -21164,10 +21252,10 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21164
21252
  function getShadowRootSelection(root2) {
21165
21253
  return root2.getSelection?.() ?? null;
21166
21254
  }
21167
- const _hoisted_1$A = { class: "markdown-editor" };
21168
- const _hoisted_2$s = ["aria-label"];
21169
- const _hoisted_3$l = ["contenteditable"];
21170
- const _sfc_main$G = /* @__PURE__ */ defineComponent({
21255
+ const _hoisted_1$B = { class: "markdown-editor" };
21256
+ const _hoisted_2$t = ["aria-label"];
21257
+ const _hoisted_3$m = ["contenteditable"];
21258
+ const _sfc_main$I = /* @__PURE__ */ defineComponent({
21171
21259
  __name: "MarkdownEditor",
21172
21260
  props: {
21173
21261
  modelValue: { type: String },
@@ -21388,7 +21476,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21388
21476
  }
21389
21477
  );
21390
21478
  return (_ctx, _cache) => {
21391
- return openBlock(), createElementBlock("div", _hoisted_1$A, [
21479
+ return openBlock(), createElementBlock("div", _hoisted_1$B, [
21392
21480
  !__props.disabled ? (openBlock(), createElementBlock("div", {
21393
21481
  key: 0,
21394
21482
  class: "markdown-editor__toolbar",
@@ -21499,7 +21587,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21499
21587
  title: unref(t2)("mdToolbar.redo"),
21500
21588
  onClick: _cache[8] || (_cache[8] = ($event) => execCmd("redo"))
21501
21589
  }, null, 8, ["aria-label", "title"])
21502
- ], 8, _hoisted_2$s)) : createCommentVNode("", true),
21590
+ ], 8, _hoisted_2$t)) : createCommentVNode("", true),
21503
21591
  createBaseVNode("div", {
21504
21592
  ref: "editorEl",
21505
21593
  class: "markdown-editor__content",
@@ -21509,16 +21597,17 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21509
21597
  onPaste,
21510
21598
  onFocus: startSelectionListener,
21511
21599
  onBlur: stopSelectionListener
21512
- }, null, 40, _hoisted_3$l)
21600
+ }, null, 40, _hoisted_3$m)
21513
21601
  ]);
21514
21602
  };
21515
21603
  }
21516
21604
  });
21517
- const _style_0$y = "\n.markdown-editor[data-v-b3d64419] {\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-b3d64419] {\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: 49px;\n z-index: 1;\n}\n.markdown-editor__separator[data-v-b3d64419] {\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-b3d64419] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n outline: none;\n min-height: 200px;\n}\n.markdown-editor__content[data-v-b3d64419] > *:first-child {\n margin-top: 0;\n}\n.markdown-editor__content[data-v-b3d64419] h1,\n.markdown-editor__content[data-v-b3d64419] h2,\n.markdown-editor__content[data-v-b3d64419] h3,\n.markdown-editor__content[data-v-b3d64419] 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-b3d64419] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-editor__content[data-v-b3d64419] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-editor__content[data-v-b3d64419] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-editor__content[data-v-b3d64419] 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-b3d64419] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-editor__content[data-v-b3d64419] ul,\n.markdown-editor__content[data-v-b3d64419] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-editor__content[data-v-b3d64419] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-editor__content[data-v-b3d64419] 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-b3d64419] 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-b3d64419] 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-b3d64419] pre code {\n padding: 0;\n background: none;\n}\n.markdown-editor__content[data-v-b3d64419] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-editor__content[data-v-b3d64419] 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-b3d64419] strong {\n font-weight: 700;\n}\n.markdown-editor__content[data-v-b3d64419] table {\n border-collapse: collapse;\n margin: var(--spacing-md) 0;\n}\n.markdown-editor__content[data-v-b3d64419] th,\n.markdown-editor__content[data-v-b3d64419] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-editor__content[data-v-b3d64419] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21518
- const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["styles", [_style_0$y]], ["__scopeId", "data-v-b3d64419"]]);
21519
- const _hoisted_1$z = { class: "markdown-view" };
21520
- const _hoisted_2$r = ["innerHTML"];
21521
- const _sfc_main$F = /* @__PURE__ */ defineComponent({
21605
+ 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";
21606
+ const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$I, [["styles", [_style_0$z]], ["__scopeId", "data-v-a278828c"]]);
21607
+ const _hoisted_1$A = { class: "markdown-view" };
21608
+ const _hoisted_2$s = ["innerHTML"];
21609
+ const _hoisted_3$l = ["innerHTML"];
21610
+ const _sfc_main$H = /* @__PURE__ */ defineComponent({
21522
21611
  __name: "MarkdownView",
21523
21612
  props: {
21524
21613
  source: { type: String },
@@ -21528,15 +21617,19 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21528
21617
  const props = __props;
21529
21618
  const segments = computed(() => renderMarkdownSegments(props.source));
21530
21619
  return (_ctx, _cache) => {
21531
- return openBlock(), createElementBlock("div", _hoisted_1$z, [
21620
+ return openBlock(), createElementBlock("div", _hoisted_1$A, [
21532
21621
  (openBlock(true), createElementBlock(Fragment, null, renderList(segments.value, (seg, i2) => {
21533
21622
  return openBlock(), createElementBlock(Fragment, { key: i2 }, [
21534
21623
  seg.type === "html" ? (openBlock(), createElementBlock("div", {
21535
21624
  key: 0,
21536
21625
  class: "markdown-view__html",
21537
21626
  innerHTML: seg.html
21538
- }, null, 8, _hoisted_2$r)) : (openBlock(), createBlock(CodeBlock, {
21627
+ }, null, 8, _hoisted_2$s)) : seg.type === "table" ? (openBlock(), createElementBlock("div", {
21539
21628
  key: 1,
21629
+ class: "markdown-view__table",
21630
+ innerHTML: seg.html
21631
+ }, null, 8, _hoisted_3$l)) : (openBlock(), createBlock(CodeBlock, {
21632
+ key: 2,
21540
21633
  code: seg.code,
21541
21634
  lang: seg.lang,
21542
21635
  streaming: __props.streaming
@@ -21547,18 +21640,18 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21547
21640
  };
21548
21641
  }
21549
21642
  });
21550
- 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";
21551
- const MarkdownView = /* @__PURE__ */ _export_sfc(_sfc_main$F, [["styles", [_style_0$x]], ["__scopeId", "data-v-6e1cc74b"]]);
21552
- const _hoisted_1$y = {
21643
+ 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";
21644
+ const MarkdownView = /* @__PURE__ */ _export_sfc(_sfc_main$H, [["styles", [_style_0$y]], ["__scopeId", "data-v-b6eeece0"]]);
21645
+ const _hoisted_1$z = {
21553
21646
  key: 0,
21554
21647
  class: "transcript-ui-popover-list__items"
21555
21648
  };
21556
- const _hoisted_2$q = {
21649
+ const _hoisted_2$r = {
21557
21650
  key: 0,
21558
21651
  class: "transcript-ui-popover-list__divider"
21559
21652
  };
21560
21653
  const _hoisted_3$k = { class: "transcript-ui-popover-list__footer" };
21561
- const _sfc_main$E = /* @__PURE__ */ defineComponent({
21654
+ const _sfc_main$G = /* @__PURE__ */ defineComponent({
21562
21655
  __name: "PopoverList",
21563
21656
  props: {
21564
21657
  items: { type: Array },
@@ -21611,7 +21704,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21611
21704
  "side-offset": __props.sideOffset
21612
21705
  }, {
21613
21706
  default: withCtx(() => [
21614
- __props.items.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_1$y, [
21707
+ __props.items.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_1$z, [
21615
21708
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
21616
21709
  return openBlock(), createBlock(unref(DropdownMenuItem_default), {
21617
21710
  key: keyFor(item, index),
@@ -21627,7 +21720,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21627
21720
  }), 128))
21628
21721
  ])) : createCommentVNode("", true),
21629
21722
  _ctx.$slots.footer ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
21630
- __props.items.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$q)) : createCommentVNode("", true),
21723
+ __props.items.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$r)) : createCommentVNode("", true),
21631
21724
  createBaseVNode("div", _hoisted_3$k, [
21632
21725
  renderSlot(_ctx.$slots, "footer")
21633
21726
  ])
@@ -21644,21 +21737,21 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21644
21737
  };
21645
21738
  }
21646
21739
  });
21647
- const _hoisted_1$x = ["disabled", "aria-current"];
21648
- const _hoisted_2$p = {
21740
+ const _hoisted_1$y = ["disabled", "aria-current"];
21741
+ const _hoisted_2$q = {
21649
21742
  key: 0,
21650
21743
  class: "selectable-list-item__leading"
21651
21744
  };
21652
21745
  const _hoisted_3$j = { class: "selectable-list-item__label" };
21653
- const _hoisted_4$b = {
21746
+ const _hoisted_4$d = {
21654
21747
  key: 1,
21655
21748
  class: "selectable-list-item__trailing"
21656
21749
  };
21657
- const _hoisted_5$a = {
21750
+ const _hoisted_5$c = {
21658
21751
  key: 0,
21659
21752
  class: "selectable-list-item__actions"
21660
21753
  };
21661
- const _sfc_main$D = /* @__PURE__ */ defineComponent({
21754
+ const _sfc_main$F = /* @__PURE__ */ defineComponent({
21662
21755
  __name: "SelectableListItem",
21663
21756
  props: {
21664
21757
  current: { type: Boolean },
@@ -21683,7 +21776,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21683
21776
  "aria-current": __props.current ? "true" : void 0,
21684
21777
  onClick: _cache[0] || (_cache[0] = ($event) => emit2("select"))
21685
21778
  }, [
21686
- _ctx.$slots.leading ? (openBlock(), createElementBlock("span", _hoisted_2$p, [
21779
+ _ctx.$slots.leading ? (openBlock(), createElementBlock("span", _hoisted_2$q, [
21687
21780
  renderSlot(_ctx.$slots, "leading", {}, void 0, true)
21688
21781
  ])) : createCommentVNode("", true),
21689
21782
  createBaseVNode("span", _hoisted_3$j, [
@@ -21691,20 +21784,20 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21691
21784
  createTextVNode(toDisplayString(__props.label), 1)
21692
21785
  ], true)
21693
21786
  ]),
21694
- _ctx.$slots.trailing ? (openBlock(), createElementBlock("span", _hoisted_4$b, [
21787
+ _ctx.$slots.trailing ? (openBlock(), createElementBlock("span", _hoisted_4$d, [
21695
21788
  renderSlot(_ctx.$slots, "trailing", {}, void 0, true)
21696
21789
  ])) : createCommentVNode("", true)
21697
- ], 8, _hoisted_1$x),
21698
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_5$a, [
21790
+ ], 8, _hoisted_1$y),
21791
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_5$c, [
21699
21792
  renderSlot(_ctx.$slots, "actions", {}, void 0, true)
21700
21793
  ])) : createCommentVNode("", true)
21701
21794
  ], 2);
21702
21795
  };
21703
21796
  }
21704
21797
  });
21705
- 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";
21706
- const SelectableListItem = /* @__PURE__ */ _export_sfc(_sfc_main$D, [["styles", [_style_0$w]], ["__scopeId", "data-v-46747619"]]);
21707
- const _sfc_main$C = /* @__PURE__ */ defineComponent({
21798
+ 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";
21799
+ const SelectableListItem = /* @__PURE__ */ _export_sfc(_sfc_main$F, [["styles", [_style_0$x]], ["__scopeId", "data-v-46747619"]]);
21800
+ const _sfc_main$E = /* @__PURE__ */ defineComponent({
21708
21801
  __name: "SpeakerIndicator",
21709
21802
  props: {
21710
21803
  color: { type: String }
@@ -21719,12 +21812,12 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21719
21812
  };
21720
21813
  }
21721
21814
  });
21722
- 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";
21723
- const SpeakerIndicator = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["styles", [_style_0$v]], ["__scopeId", "data-v-324978c0"]]);
21724
- const _hoisted_1$w = { class: "switch" };
21725
- const _hoisted_2$o = ["id", "checked", "disabled"];
21815
+ 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";
21816
+ const SpeakerIndicator = /* @__PURE__ */ _export_sfc(_sfc_main$E, [["styles", [_style_0$w]], ["__scopeId", "data-v-324978c0"]]);
21817
+ const _hoisted_1$x = { class: "switch" };
21818
+ const _hoisted_2$p = ["id", "checked", "disabled"];
21726
21819
  const _hoisted_3$i = ["for"];
21727
- const _sfc_main$B = /* @__PURE__ */ defineComponent({
21820
+ const _sfc_main$D = /* @__PURE__ */ defineComponent({
21728
21821
  __name: "SwitchToggle",
21729
21822
  props: {
21730
21823
  modelValue: { type: Boolean },
@@ -21737,14 +21830,14 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21737
21830
  const emit2 = __emit;
21738
21831
  const inputId = props.id ?? useId$1();
21739
21832
  return (_ctx, _cache) => {
21740
- return openBlock(), createElementBlock("div", _hoisted_1$w, [
21833
+ return openBlock(), createElementBlock("div", _hoisted_1$x, [
21741
21834
  createBaseVNode("input", {
21742
21835
  type: "checkbox",
21743
21836
  id: unref(inputId),
21744
21837
  checked: __props.modelValue,
21745
21838
  disabled: __props.disabled,
21746
21839
  onChange: _cache[0] || (_cache[0] = ($event) => emit2("update:modelValue", $event.target.checked))
21747
- }, null, 40, _hoisted_2$o),
21840
+ }, null, 40, _hoisted_2$p),
21748
21841
  createBaseVNode("label", { for: unref(inputId) }, [..._cache[1] || (_cache[1] = [
21749
21842
  createBaseVNode("div", { class: "switch-slider" }, null, -1)
21750
21843
  ])], 8, _hoisted_3$i)
@@ -21752,15 +21845,15 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21752
21845
  };
21753
21846
  }
21754
21847
  });
21755
- 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";
21756
- const SwitchToggle = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["styles", [_style_0$u]], ["__scopeId", "data-v-44d0160b"]]);
21848
+ 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";
21849
+ const SwitchToggle = /* @__PURE__ */ _export_sfc(_sfc_main$D, [["styles", [_style_0$v]], ["__scopeId", "data-v-44d0160b"]]);
21757
21850
  function computeInitials(name) {
21758
21851
  const words = name.trim().split(/\s+/).filter(Boolean);
21759
21852
  if (words.length === 0) return "?";
21760
21853
  return words.slice(0, 2).map((w2) => w2[0].toUpperCase()).join("");
21761
21854
  }
21762
- const _hoisted_1$v = ["title", "aria-label"];
21763
- const _sfc_main$A = /* @__PURE__ */ defineComponent({
21855
+ const _hoisted_1$w = ["title", "aria-label"];
21856
+ const _sfc_main$C = /* @__PURE__ */ defineComponent({
21764
21857
  __name: "UserAvatar",
21765
21858
  props: {
21766
21859
  name: { type: String },
@@ -21776,22 +21869,22 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21776
21869
  role: "img",
21777
21870
  title: title.value,
21778
21871
  "aria-label": title.value
21779
- }, toDisplayString(initials.value), 9, _hoisted_1$v);
21872
+ }, toDisplayString(initials.value), 9, _hoisted_1$w);
21780
21873
  };
21781
21874
  }
21782
21875
  });
21783
- 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";
21784
- const UserAvatar = /* @__PURE__ */ _export_sfc(_sfc_main$A, [["styles", [_style_0$t]], ["__scopeId", "data-v-977a8d17"]]);
21785
- const _hoisted_1$u = ["data-status"];
21786
- const _hoisted_2$n = {
21876
+ 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";
21877
+ const UserAvatar = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["styles", [_style_0$u]], ["__scopeId", "data-v-977a8d17"]]);
21878
+ const _hoisted_1$v = ["data-status"];
21879
+ const _hoisted_2$o = {
21787
21880
  key: 0,
21788
21881
  class: "document-article__toolbar",
21789
21882
  role: "toolbar"
21790
21883
  };
21791
21884
  const _hoisted_3$h = { class: "document-article__toolbar-left" };
21792
- const _hoisted_4$a = { class: "document-article__toolbar-center" };
21793
- const _hoisted_5$9 = { class: "document-article__toolbar-right" };
21794
- const _hoisted_6$9 = { class: "document-article__body" };
21885
+ const _hoisted_4$c = { class: "document-article__toolbar-center" };
21886
+ const _hoisted_5$b = { class: "document-article__toolbar-right" };
21887
+ const _hoisted_6$a = { class: "document-article__body" };
21795
21888
  const _hoisted_7$4 = {
21796
21889
  key: 0,
21797
21890
  class: "document-article__center document-article__center--processing",
@@ -21809,7 +21902,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21809
21902
  role: "alert"
21810
21903
  };
21811
21904
  const _hoisted_11$1 = { class: "document-article__error-text" };
21812
- const _sfc_main$z = /* @__PURE__ */ defineComponent({
21905
+ const _sfc_main$B = /* @__PURE__ */ defineComponent({
21813
21906
  __name: "DocumentArticle",
21814
21907
  props: {
21815
21908
  status: { default: "done", type: String },
@@ -21834,18 +21927,18 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21834
21927
  class: "document-article",
21835
21928
  "data-status": props.status
21836
21929
  }, [
21837
- _ctx.$slots["toolbar-left"] || _ctx.$slots["toolbar-center"] || _ctx.$slots["toolbar-right"] ? (openBlock(), createElementBlock("div", _hoisted_2$n, [
21930
+ _ctx.$slots["toolbar-left"] || _ctx.$slots["toolbar-center"] || _ctx.$slots["toolbar-right"] ? (openBlock(), createElementBlock("div", _hoisted_2$o, [
21838
21931
  createBaseVNode("div", _hoisted_3$h, [
21839
21932
  renderSlot(_ctx.$slots, "toolbar-left", {}, void 0, true)
21840
21933
  ]),
21841
- createBaseVNode("div", _hoisted_4$a, [
21934
+ createBaseVNode("div", _hoisted_4$c, [
21842
21935
  renderSlot(_ctx.$slots, "toolbar-center", {}, void 0, true)
21843
21936
  ]),
21844
- createBaseVNode("div", _hoisted_5$9, [
21937
+ createBaseVNode("div", _hoisted_5$b, [
21845
21938
  renderSlot(_ctx.$slots, "toolbar-right", {}, void 0, true)
21846
21939
  ])
21847
21940
  ])) : createCommentVNode("", true),
21848
- createBaseVNode("div", _hoisted_6$9, [
21941
+ createBaseVNode("div", _hoisted_6$a, [
21849
21942
  props.status === "processing" ? (openBlock(), createElementBlock("div", _hoisted_7$4, [
21850
21943
  createVNode(EditorIcon, {
21851
21944
  name: "spinner",
@@ -21872,13 +21965,13 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21872
21965
  })
21873
21966
  ])) : renderSlot(_ctx.$slots, "default", {}, void 0, true, 2)
21874
21967
  ])
21875
- ], 8, _hoisted_1$u);
21968
+ ], 8, _hoisted_1$v);
21876
21969
  };
21877
21970
  }
21878
21971
  });
21879
- const _style_0$s = "\n.document-article[data-v-e3f4ca33] {\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-e3f4ca33] {\n display: flex;\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-e3f4ca33],\n.document-article__toolbar-right[data-v-e3f4ca33] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.document-article__toolbar-center[data-v-e3f4ca33] {\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-e3f4ca33] {\n flex: 1;\n min-height: 0;\n}\n.document-article__center[data-v-e3f4ca33] {\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-e3f4ca33] {\n color: var(--color-primary);\n}\n.document-article__center--error[data-v-e3f4ca33] {\n color: var(--color-danger, #d33);\n}\n.document-article__progress[data-v-e3f4ca33] {\n width: min(280px, 100%);\n height: 6px;\n}\n.document-article__progress-value[data-v-e3f4ca33] {\n font-size: var(--font-size-xs);\n font-variant-numeric: tabular-nums;\n color: var(--color-text-muted);\n}\n.document-article__error-text[data-v-e3f4ca33] {\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";
21880
- const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["styles", [_style_0$s]], ["__scopeId", "data-v-e3f4ca33"]]);
21881
- const _sfc_main$y = /* @__PURE__ */ defineComponent({
21972
+ 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";
21973
+ const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$B, [["styles", [_style_0$t]], ["__scopeId", "data-v-dda12eb4"]]);
21974
+ const _sfc_main$A = /* @__PURE__ */ defineComponent({
21882
21975
  __name: "DownloadMenu",
21883
21976
  props: {
21884
21977
  formats: { type: Array },
@@ -21894,7 +21987,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21894
21987
  emit2("select", item.format);
21895
21988
  }
21896
21989
  return (_ctx, _cache) => {
21897
- return openBlock(), createBlock(_sfc_main$E, {
21990
+ return openBlock(), createBlock(_sfc_main$G, {
21898
21991
  items: props.formats,
21899
21992
  "item-key": (f2) => f2.format,
21900
21993
  align: "end",
@@ -21922,7 +22015,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21922
22015
  };
21923
22016
  }
21924
22017
  });
21925
- const _sfc_main$x = /* @__PURE__ */ defineComponent({
22018
+ const _sfc_main$z = /* @__PURE__ */ defineComponent({
21926
22019
  __name: "SpeakerMenu",
21927
22020
  emits: ["merge"],
21928
22021
  setup(__props, { emit: __emit }) {
@@ -21935,7 +22028,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21935
22028
  if (action.id === "merge") emit2("merge");
21936
22029
  }
21937
22030
  return (_ctx, _cache) => {
21938
- return openBlock(), createBlock(_sfc_main$E, {
22031
+ return openBlock(), createBlock(_sfc_main$G, {
21939
22032
  items: items.value,
21940
22033
  "item-key": (a2) => a2.id,
21941
22034
  align: "end",
@@ -21956,20 +22049,34 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21956
22049
  };
21957
22050
  }
21958
22051
  });
21959
- const _hoisted_1$t = ["aria-label"];
21960
- const _hoisted_2$m = ["aria-selected", "aria-disabled", "disabled", "onClick"];
22052
+ const _hoisted_1$u = ["aria-label"];
22053
+ const _hoisted_2$n = ["aria-selected", "aria-disabled", "disabled", "onClick"];
21961
22054
  const _hoisted_3$g = { class: "tab__label" };
21962
- const _sfc_main$w = /* @__PURE__ */ defineComponent({
22055
+ const _hoisted_4$b = ["aria-selected", "aria-label"];
22056
+ const _hoisted_5$a = { class: "tab__label" };
22057
+ const _hoisted_6$9 = { class: "tab__menu-item" };
22058
+ const _sfc_main$y = /* @__PURE__ */ defineComponent({
21963
22059
  __name: "Tabs",
21964
22060
  props: {
21965
22061
  tabs: { type: Array },
21966
22062
  modelValue: { type: null },
21967
- ariaLabel: { type: String }
22063
+ ariaLabel: { type: String },
22064
+ collapseFrom: { type: Number }
21968
22065
  },
21969
22066
  emits: ["update:modelValue"],
21970
22067
  setup(__props, { emit: __emit }) {
21971
22068
  const props = __props;
21972
22069
  const emit2 = __emit;
22070
+ const { t: t2 } = useI18n();
22071
+ const inlineTabs = computed(
22072
+ () => props.collapseFrom === void 0 ? props.tabs : props.tabs.slice(0, props.collapseFrom)
22073
+ );
22074
+ const collapsedTabs = computed(
22075
+ () => props.collapseFrom === void 0 ? [] : props.tabs.slice(props.collapseFrom)
22076
+ );
22077
+ const activeCollapsedTab = computed(
22078
+ () => collapsedTabs.value.find((tab) => tab.value === props.modelValue) ?? null
22079
+ );
21973
22080
  function onSelect(tab) {
21974
22081
  if (tab.disabled) return;
21975
22082
  if (tab.value === props.modelValue) return;
@@ -21981,7 +22088,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21981
22088
  role: "tablist",
21982
22089
  "aria-label": __props.ariaLabel
21983
22090
  }, [
21984
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tabs, (tab) => {
22091
+ (openBlock(true), createElementBlock(Fragment, null, renderList(inlineTabs.value, (tab) => {
21985
22092
  return openBlock(), createElementBlock("button", {
21986
22093
  key: tab.value,
21987
22094
  type: "button",
@@ -22008,14 +22115,65 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22008
22115
  ]),
22009
22116
  _: 2
22010
22117
  }, 1024)) : createCommentVNode("", true)
22011
- ], 10, _hoisted_2$m);
22012
- }), 128))
22013
- ], 8, _hoisted_1$t);
22118
+ ], 10, _hoisted_2$n);
22119
+ }), 128)),
22120
+ collapsedTabs.value.length > 0 ? (openBlock(), createBlock(_sfc_main$G, {
22121
+ key: 0,
22122
+ items: collapsedTabs.value,
22123
+ "item-key": (tab) => tab.value,
22124
+ "is-current": (tab) => tab.value === __props.modelValue,
22125
+ align: "end",
22126
+ onSelect
22127
+ }, {
22128
+ trigger: withCtx(() => [
22129
+ createBaseVNode("button", {
22130
+ type: "button",
22131
+ role: "tab",
22132
+ class: normalizeClass(["tab tab--more", { "tab--active": activeCollapsedTab.value !== null }]),
22133
+ "aria-selected": activeCollapsedTab.value !== null,
22134
+ "aria-label": unref(t2)("tabs.moreLabel")
22135
+ }, [
22136
+ createBaseVNode("span", _hoisted_5$a, toDisplayString(activeCollapsedTab.value ? activeCollapsedTab.value.label : unref(t2)("tabs.moreLabel")), 1),
22137
+ activeCollapsedTab.value?.badge ? (openBlock(), createBlock(Badge, {
22138
+ key: 0,
22139
+ class: "tab__badge"
22140
+ }, {
22141
+ default: withCtx(() => [
22142
+ createTextVNode(toDisplayString(activeCollapsedTab.value.badge), 1)
22143
+ ]),
22144
+ _: 1
22145
+ })) : createCommentVNode("", true),
22146
+ createVNode(EditorIcon, {
22147
+ name: "chevron-down",
22148
+ size: 14,
22149
+ class: "tab__chevron"
22150
+ })
22151
+ ], 10, _hoisted_4$b)
22152
+ ]),
22153
+ item: withCtx(({ item }) => [
22154
+ createBaseVNode("span", _hoisted_6$9, [
22155
+ unref(resolveIcon)(item.icon) ? (openBlock(), createBlock(EditorIcon, {
22156
+ key: 0,
22157
+ name: item.icon,
22158
+ size: 16
22159
+ }, null, 8, ["name"])) : createCommentVNode("", true),
22160
+ createBaseVNode("span", null, toDisplayString(item.label), 1),
22161
+ item.badge ? (openBlock(), createBlock(Badge, { key: 1 }, {
22162
+ default: withCtx(() => [
22163
+ createTextVNode(toDisplayString(item.badge), 1)
22164
+ ]),
22165
+ _: 2
22166
+ }, 1024)) : createCommentVNode("", true)
22167
+ ])
22168
+ ]),
22169
+ _: 1
22170
+ }, 8, ["items", "item-key", "is-current"])) : createCommentVNode("", true)
22171
+ ], 8, _hoisted_1$u);
22014
22172
  };
22015
22173
  }
22016
22174
  });
22017
- const _style_0$r = "\n.tabs[data-v-b17b8689] {\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-b17b8689] {\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-b17b8689]:hover:not([disabled]) {\n color: var(--color-text-primary);\n}\n.transcript-ui-root .tab[data-v-b17b8689]: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-b17b8689] {\n color: var(--color-text-primary);\n border-bottom-color: var(--color-primary);\n}\n.transcript-ui-root .tab[disabled][data-v-b17b8689] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.tab__icon[data-v-b17b8689] {\n flex-shrink: 0;\n color: currentColor;\n}\n.tab__label[data-v-b17b8689] {\n text-box: cap alphabetic;\n}\n.tab__badge[data-v-b17b8689] {\n margin-left: var(--spacing-xs);\n}\n";
22018
- const Tabs = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["styles", [_style_0$r]], ["__scopeId", "data-v-b17b8689"]]);
22175
+ 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';
22176
+ const Tabs = /* @__PURE__ */ _export_sfc(_sfc_main$y, [["styles", [_style_0$s]], ["__scopeId", "data-v-30747b8d"]]);
22019
22177
  const TEXT_NODE$1 = 3;
22020
22178
  function placeCaretAt(element, offset2) {
22021
22179
  element.focus({ preventScroll: true });
@@ -22072,8 +22230,8 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22072
22230
  if (!focus2 || !container.contains(focus2.node)) return null;
22073
22231
  return computeTextOffsetInContainer(container, focus2.node, focus2.offset);
22074
22232
  }
22075
- const _hoisted_1$s = ["aria-label", "textContent"];
22076
- const _sfc_main$v = /* @__PURE__ */ defineComponent({
22233
+ const _hoisted_1$t = ["aria-label", "textContent"];
22234
+ const _sfc_main$x = /* @__PURE__ */ defineComponent({
22077
22235
  __name: "TurnTextEditor",
22078
22236
  props: {
22079
22237
  text: { type: String },
@@ -22127,22 +22285,22 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22127
22285
  onKeydown,
22128
22286
  onBlur,
22129
22287
  textContent: toDisplayString(__props.text)
22130
- }, null, 40, _hoisted_1$s);
22288
+ }, null, 40, _hoisted_1$t);
22131
22289
  };
22132
22290
  }
22133
22291
  });
22134
- 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";
22135
- const TurnTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$v, [["styles", [_style_0$q]], ["__scopeId", "data-v-597e2575"]]);
22136
- const _hoisted_1$r = { class: "editor-header" };
22137
- const _hoisted_2$l = { class: "header-main" };
22292
+ 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";
22293
+ const TurnTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["styles", [_style_0$r]], ["__scopeId", "data-v-597e2575"]]);
22294
+ const _hoisted_1$s = { class: "editor-header" };
22295
+ const _hoisted_2$m = { class: "header-main" };
22138
22296
  const _hoisted_3$f = { class: "document-title" };
22139
- const _hoisted_4$9 = {
22297
+ const _hoisted_4$a = {
22140
22298
  key: 0,
22141
22299
  class: "document-meta"
22142
22300
  };
22143
- const _hoisted_5$8 = { class: "header-right" };
22301
+ const _hoisted_5$9 = { class: "header-right" };
22144
22302
  const _hoisted_6$8 = { key: 0 };
22145
- const _sfc_main$u = /* @__PURE__ */ defineComponent({
22303
+ const _sfc_main$w = /* @__PURE__ */ defineComponent({
22146
22304
  __name: "Header",
22147
22305
  props: {
22148
22306
  title: { type: String },
@@ -22176,10 +22334,10 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22176
22334
  ].filter(Boolean)
22177
22335
  );
22178
22336
  return (_ctx, _cache) => {
22179
- return openBlock(), createElementBlock("header", _hoisted_1$r, [
22180
- createBaseVNode("div", _hoisted_2$l, [
22337
+ return openBlock(), createElementBlock("header", _hoisted_1$s, [
22338
+ createBaseVNode("div", _hoisted_2$m, [
22181
22339
  createBaseVNode("h1", _hoisted_3$f, toDisplayString(formattedTitle.value), 1),
22182
- metaParts.value.length ? (openBlock(), createElementBlock("div", _hoisted_4$9, [
22340
+ metaParts.value.length ? (openBlock(), createElementBlock("div", _hoisted_4$a, [
22183
22341
  (openBlock(true), createElementBlock(Fragment, null, renderList(metaParts.value, (part, i2) => {
22184
22342
  return openBlock(), createElementBlock("span", {
22185
22343
  key: i2,
@@ -22188,7 +22346,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22188
22346
  }), 128))
22189
22347
  ])) : createCommentVNode("", true)
22190
22348
  ]),
22191
- createBaseVNode("div", _hoisted_5$8, [
22349
+ createBaseVNode("div", _hoisted_5$9, [
22192
22350
  __props.isMobile ? (openBlock(), createBlock(unref(Button), {
22193
22351
  key: 0,
22194
22352
  variant: "transparent",
@@ -22255,11 +22413,28 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22255
22413
  };
22256
22414
  }
22257
22415
  });
22258
- 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';
22259
- const Header = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["styles", [_style_0$p]], ["__scopeId", "data-v-491cf8ab"]]);
22416
+ 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';
22417
+ const Header = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["styles", [_style_0$q]], ["__scopeId", "data-v-491cf8ab"]]);
22260
22418
  const TRANSCRIPTION_TAB = "__transcription__";
22261
22419
  const VERBATIM_TAB = "__verbatim__";
22262
- const _sfc_main$t = /* @__PURE__ */ defineComponent({
22420
+ const MOBILE_BREAKPOINT = "(max-width: 767px)";
22421
+ function useIsMobile() {
22422
+ const isMobile = /* @__PURE__ */ ref(window.matchMedia(MOBILE_BREAKPOINT).matches);
22423
+ let mql = null;
22424
+ function onChange(e2) {
22425
+ isMobile.value = e2.matches;
22426
+ }
22427
+ onMounted(() => {
22428
+ mql = window.matchMedia(MOBILE_BREAKPOINT);
22429
+ isMobile.value = mql.matches;
22430
+ mql.addEventListener("change", onChange);
22431
+ });
22432
+ onBeforeUnmount(() => {
22433
+ mql?.removeEventListener("change", onChange);
22434
+ });
22435
+ return { isMobile };
22436
+ }
22437
+ const _sfc_main$v = /* @__PURE__ */ defineComponent({
22263
22438
  __name: "TabBar",
22264
22439
  props: {
22265
22440
  modelValue: { type: String },
@@ -22271,6 +22446,11 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22271
22446
  const emit2 = __emit;
22272
22447
  const core = useCore();
22273
22448
  const { t: t2 } = useI18n();
22449
+ const { isMobile } = useIsMobile();
22450
+ const collapseFrom = computed(() => {
22451
+ if (!isMobile.value) return void 0;
22452
+ return props.showVerbatim ? 2 : 1;
22453
+ });
22274
22454
  const tabs = computed(() => {
22275
22455
  const services = core.llmServices?.list.value ?? [];
22276
22456
  return [
@@ -22302,8 +22482,9 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22302
22482
  key: 0,
22303
22483
  tabs: tabs.value,
22304
22484
  "model-value": __props.modelValue,
22485
+ "collapse-from": collapseFrom.value,
22305
22486
  "onUpdate:modelValue": onSelect
22306
- }, null, 8, ["tabs", "model-value"])) : createCommentVNode("", true);
22487
+ }, null, 8, ["tabs", "model-value", "collapse-from"])) : createCommentVNode("", true);
22307
22488
  };
22308
22489
  }
22309
22490
  });
@@ -22673,7 +22854,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22673
22854
  };
22674
22855
  }
22675
22856
  var StickToBottomKey = /* @__PURE__ */ Symbol("StickToBottom");
22676
- var _hoisted_1$q = { style: {
22857
+ var _hoisted_1$r = { style: {
22677
22858
  "position": "relative",
22678
22859
  "height": "100%",
22679
22860
  "width": "100%",
@@ -22739,7 +22920,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22739
22920
  stopScroll
22740
22921
  }));
22741
22922
  return (_ctx, _cache) => {
22742
- return openBlock(), createElementBlock("div", null, [createBaseVNode("div", _hoisted_1$q, [createBaseVNode("div", {
22923
+ return openBlock(), createElementBlock("div", null, [createBaseVNode("div", _hoisted_1$r, [createBaseVNode("div", {
22743
22924
  ref_key: "scrollRef",
22744
22925
  ref: scrollRef,
22745
22926
  style: normalizeStyle({
@@ -22756,12 +22937,12 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22756
22937
  };
22757
22938
  }
22758
22939
  });
22759
- const _hoisted_1$p = ["datetime"];
22760
- const _hoisted_2$k = {
22940
+ const _hoisted_1$q = ["datetime"];
22941
+ const _hoisted_2$l = {
22761
22942
  key: 2,
22762
22943
  class: "lang"
22763
22944
  };
22764
- const _sfc_main$s = /* @__PURE__ */ defineComponent({
22945
+ const _sfc_main$u = /* @__PURE__ */ defineComponent({
22765
22946
  __name: "SpeakerLabel",
22766
22947
  props: {
22767
22948
  speaker: { type: Object },
@@ -22813,19 +22994,19 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22813
22994
  key: 1,
22814
22995
  class: "timestamp",
22815
22996
  datetime: timestamp.value.datetime
22816
- }, toDisplayString(timestamp.value.text), 9, _hoisted_1$p)) : createCommentVNode("", true),
22817
- languageName.value ? (openBlock(), createElementBlock("span", _hoisted_2$k, toDisplayString(languageName.value), 1)) : createCommentVNode("", true)
22997
+ }, toDisplayString(timestamp.value.text), 9, _hoisted_1$q)) : createCommentVNode("", true),
22998
+ languageName.value ? (openBlock(), createElementBlock("span", _hoisted_2$l, toDisplayString(languageName.value), 1)) : createCommentVNode("", true)
22818
22999
  ], 2);
22819
23000
  };
22820
23001
  }
22821
23002
  });
22822
- 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";
22823
- const SpeakerLabel = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["styles", [_style_0$o]], ["__scopeId", "data-v-76cb4ed6"]]);
22824
- const _hoisted_1$o = {
23003
+ 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";
23004
+ const SpeakerLabel = /* @__PURE__ */ _export_sfc(_sfc_main$u, [["styles", [_style_0$p]], ["__scopeId", "data-v-76cb4ed6"]]);
23005
+ const _hoisted_1$p = {
22825
23006
  key: 0,
22826
23007
  class: "merge-turns"
22827
23008
  };
22828
- const _sfc_main$r = /* @__PURE__ */ defineComponent({
23009
+ const _sfc_main$t = /* @__PURE__ */ defineComponent({
22829
23010
  __name: "MergeTurnsButton",
22830
23011
  props: {
22831
23012
  firstTurnId: { type: String },
@@ -22845,7 +23026,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22845
23026
  core.transcriptionEditor.mergeTurns(props.firstTurnId, props.secondTurnId);
22846
23027
  }
22847
23028
  return (_ctx, _cache) => {
22848
- return canShow.value ? (openBlock(), createElementBlock("div", _hoisted_1$o, [
23029
+ return canShow.value ? (openBlock(), createElementBlock("div", _hoisted_1$p, [
22849
23030
  createVNode(unref(Button), {
22850
23031
  size: "sm",
22851
23032
  variant: "inverse",
@@ -22858,8 +23039,8 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22858
23039
  };
22859
23040
  }
22860
23041
  });
22861
- 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";
22862
- const MergeTurnsButton = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["styles", [_style_0$n]], ["__scopeId", "data-v-8d977feb"]]);
23042
+ 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";
23043
+ const MergeTurnsButton = /* @__PURE__ */ _export_sfc(_sfc_main$t, [["styles", [_style_0$o]], ["__scopeId", "data-v-8d977feb"]]);
22863
23044
  function renameSpeaker$1(core, speakerId, newName) {
22864
23045
  const trimmed = newName.trim();
22865
23046
  const existing = core.speakers.all.get(speakerId);
@@ -22922,12 +23103,12 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22922
23103
  switchTurnSpeaker: switchTurnSpeaker$1,
22923
23104
  updateTurnWords
22924
23105
  }, Symbol.toStringTag, { value: "Module" }));
22925
- const _hoisted_1$n = {
23106
+ const _hoisted_1$o = {
22926
23107
  type: "button",
22927
23108
  class: "speaker-popover-trigger"
22928
23109
  };
22929
- const _hoisted_2$j = { class: "speaker-popover-name" };
22930
- const _sfc_main$q = /* @__PURE__ */ defineComponent({
23110
+ const _hoisted_2$k = { class: "speaker-popover-name" };
23111
+ const _sfc_main$s = /* @__PURE__ */ defineComponent({
22931
23112
  __name: "SpeakerPopover",
22932
23113
  props: {
22933
23114
  turnId: { type: String },
@@ -22993,7 +23174,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22993
23174
  isCreatingNew.value = false;
22994
23175
  }
22995
23176
  return (_ctx, _cache) => {
22996
- return openBlock(), createBlock(unref(_sfc_main$E), {
23177
+ return openBlock(), createBlock(unref(_sfc_main$G), {
22997
23178
  open: isOpen.value,
22998
23179
  "onUpdate:open": _cache[1] || (_cache[1] = ($event) => isOpen.value = $event),
22999
23180
  items: speakers.value,
@@ -23002,7 +23183,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
23002
23183
  onSelect: onPickExisting
23003
23184
  }, {
23004
23185
  trigger: withCtx(() => [
23005
- createBaseVNode("button", _hoisted_1$n, [
23186
+ createBaseVNode("button", _hoisted_1$o, [
23006
23187
  renderSlot(_ctx.$slots, "default", {}, void 0, true)
23007
23188
  ])
23008
23189
  ]),
@@ -23010,7 +23191,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
23010
23191
  createVNode(unref(SpeakerIndicator), {
23011
23192
  color: item.color
23012
23193
  }, null, 8, ["color"]),
23013
- createBaseVNode("span", _hoisted_2$j, toDisplayString(item.name), 1)
23194
+ createBaseVNode("span", _hoisted_2$k, toDisplayString(item.name), 1)
23014
23195
  ]),
23015
23196
  footer: withCtx(() => [
23016
23197
  !isCreatingNew.value ? (openBlock(), createBlock(unref(Button), {
@@ -23043,8 +23224,8 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
23043
23224
  };
23044
23225
  }
23045
23226
  });
23046
- 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";
23047
- const SpeakerPopover = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["styles", [_style_0$m]], ["__scopeId", "data-v-0679fde9"]]);
23227
+ 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";
23228
+ const SpeakerPopover = /* @__PURE__ */ _export_sfc(_sfc_main$s, [["styles", [_style_0$n]], ["__scopeId", "data-v-0679fde9"]]);
23048
23229
  const turnSelectionKey = /* @__PURE__ */ Symbol("turnSelection");
23049
23230
  function getTurnText(turn) {
23050
23231
  if (turn.words.length > 0) {
@@ -23190,14 +23371,14 @@ ${text2}` : text2;
23190
23371
  (w2) => w2.charStart != null && w2.charEnd != null && w2.charStart <= offset2 && offset2 < w2.charEnd
23191
23372
  );
23192
23373
  }
23193
- const _hoisted_1$m = ["data-turn-active", "aria-selected"];
23194
- const _hoisted_2$i = {
23374
+ const _hoisted_1$n = ["data-turn-active", "aria-selected"];
23375
+ const _hoisted_2$j = {
23195
23376
  key: 4,
23196
23377
  class: "turn-edit-actions"
23197
23378
  };
23198
23379
  const _hoisted_3$e = ["role", "tabindex", "aria-label", "aria-disabled"];
23199
- const _hoisted_4$8 = ["data-word-active"];
23200
- const _sfc_main$p = /* @__PURE__ */ defineComponent({
23380
+ const _hoisted_4$9 = ["data-word-active"];
23381
+ const _sfc_main$r = /* @__PURE__ */ defineComponent({
23201
23382
  __name: "TranscriptionTurn",
23202
23383
  props: {
23203
23384
  turn: { type: Object },
@@ -23378,7 +23559,7 @@ ${text2}` : text2;
23378
23559
  "start-date": __props.turn.startDate,
23379
23560
  language: __props.turn.language
23380
23561
  }, null, 8, ["speaker", "start-time", "start-date", "language"])),
23381
- isEditing.value || turnLock.value ? (openBlock(), createElementBlock("div", _hoisted_2$i, [
23562
+ isEditing.value || turnLock.value ? (openBlock(), createElementBlock("div", _hoisted_2$j, [
23382
23563
  isEditing.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
23383
23564
  createVNode(unref(Button), {
23384
23565
  size: "sm",
@@ -23433,50 +23614,50 @@ ${text2}` : text2;
23433
23614
  createBaseVNode("span", {
23434
23615
  class: normalizeClass({ "word--active": word.id === activeWordId.value }),
23435
23616
  "data-word-active": word.id === activeWordId.value || void 0
23436
- }, toDisplayString(word.text), 11, _hoisted_4$8),
23617
+ }, toDisplayString(word.text), 11, _hoisted_4$9),
23437
23618
  createTextVNode(toDisplayString(i2 < __props.turn.words.length - 1 ? " " : ""), 1)
23438
23619
  ], 64);
23439
23620
  }), 128)) : __props.turn.text ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
23440
23621
  createTextVNode(toDisplayString(__props.turn.text), 1)
23441
23622
  ], 64)) : createCommentVNode("", true)
23442
23623
  ], 42, _hoisted_3$e))
23443
- ], 14, _hoisted_1$m);
23624
+ ], 14, _hoisted_1$n);
23444
23625
  };
23445
23626
  }
23446
23627
  });
23447
- 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";
23448
- const TranscriptionTurn = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["styles", [_style_0$l]], ["__scopeId", "data-v-5a13b85e"]]);
23449
- const _sfc_main$o = {};
23450
- const _hoisted_1$l = {
23628
+ 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";
23629
+ const TranscriptionTurn = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["styles", [_style_0$m]], ["__scopeId", "data-v-5a13b85e"]]);
23630
+ const _sfc_main$q = {};
23631
+ const _hoisted_1$m = {
23451
23632
  viewBox: "0 0 938 604",
23452
23633
  fill: "none",
23453
23634
  xmlns: "http://www.w3.org/2000/svg"
23454
23635
  };
23455
23636
  function _sfc_render(_ctx, _cache) {
23456
- return openBlock(), createElementBlock("svg", _hoisted_1$l, [..._cache[0] || (_cache[0] = [
23637
+ return openBlock(), createElementBlock("svg", _hoisted_1$m, [..._cache[0] || (_cache[0] = [
23457
23638
  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)
23458
23639
  ])]);
23459
23640
  }
23460
- const MicrophoneIllustration = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["render", _sfc_render]]);
23461
- const _hoisted_1$k = { class: "transcription-empty" };
23462
- const _hoisted_2$h = { class: "message" };
23463
- const _sfc_main$n = /* @__PURE__ */ defineComponent({
23641
+ const MicrophoneIllustration = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["render", _sfc_render]]);
23642
+ const _hoisted_1$l = { class: "transcription-empty" };
23643
+ const _hoisted_2$i = { class: "message" };
23644
+ const _sfc_main$p = /* @__PURE__ */ defineComponent({
23464
23645
  __name: "TranscriptionEmpty",
23465
23646
  setup(__props) {
23466
23647
  const { t: t2 } = useI18n();
23467
23648
  return (_ctx, _cache) => {
23468
- return openBlock(), createElementBlock("div", _hoisted_1$k, [
23649
+ return openBlock(), createElementBlock("div", _hoisted_1$l, [
23469
23650
  createVNode(MicrophoneIllustration, {
23470
23651
  class: "illustration",
23471
23652
  "aria-hidden": "true"
23472
23653
  }),
23473
- createBaseVNode("p", _hoisted_2$h, toDisplayString(unref(t2)("transcription.empty")), 1)
23654
+ createBaseVNode("p", _hoisted_2$i, toDisplayString(unref(t2)("transcription.empty")), 1)
23474
23655
  ]);
23475
23656
  };
23476
23657
  }
23477
23658
  });
23478
- 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";
23479
- const TranscriptionEmpty = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["styles", [_style_0$k]], ["__scopeId", "data-v-585c4f2b"]]);
23659
+ 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";
23660
+ const TranscriptionEmpty = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["styles", [_style_0$l]], ["__scopeId", "data-v-585c4f2b"]]);
23480
23661
  function activeWordRange(root2, core, wordId2) {
23481
23662
  const parsed = parseWordId(wordId2);
23482
23663
  if (!parsed) return null;
@@ -23611,18 +23792,18 @@ ${text2}` : text2;
23611
23792
  }
23612
23793
  return { isFollowing, resumeFollow };
23613
23794
  }
23614
- const _hoisted_1$j = { class: "transcription-panel" };
23615
- const _hoisted_2$g = {
23795
+ const _hoisted_1$k = { class: "transcription-panel" };
23796
+ const _hoisted_2$h = {
23616
23797
  ref: "scrollContainer",
23617
23798
  class: "scroll-container"
23618
23799
  };
23619
23800
  const _hoisted_3$d = { class: "turns-container" };
23620
- const _hoisted_4$7 = {
23801
+ const _hoisted_4$8 = {
23621
23802
  key: 0,
23622
23803
  class: "history-loading",
23623
23804
  role: "status"
23624
23805
  };
23625
- const _hoisted_5$7 = {
23806
+ const _hoisted_5$8 = {
23626
23807
  key: 1,
23627
23808
  class: "history-start"
23628
23809
  };
@@ -23630,7 +23811,7 @@ ${text2}` : text2;
23630
23811
  key: 0,
23631
23812
  class: "resume-scroll-anchor"
23632
23813
  };
23633
- const _sfc_main$m = /* @__PURE__ */ defineComponent({
23814
+ const _sfc_main$o = /* @__PURE__ */ defineComponent({
23634
23815
  __name: "TranscriptionPanel",
23635
23816
  props: {
23636
23817
  turns: { type: Array },
@@ -23727,13 +23908,13 @@ ${text2}` : text2;
23727
23908
  scrollContainerRef.value?.removeEventListener("scroll", onScrollTop);
23728
23909
  });
23729
23910
  return (_ctx, _cache) => {
23730
- return openBlock(), createElementBlock("article", _hoisted_1$j, [
23731
- createBaseVNode("div", _hoisted_2$g, [
23911
+ return openBlock(), createElementBlock("article", _hoisted_1$k, [
23912
+ createBaseVNode("div", _hoisted_2$h, [
23732
23913
  createBaseVNode("div", _hoisted_3$d, [
23733
- isLoadingHistory.value ? (openBlock(), createElementBlock("div", _hoisted_4$7, [..._cache[2] || (_cache[2] = [
23914
+ isLoadingHistory.value ? (openBlock(), createElementBlock("div", _hoisted_4$8, [..._cache[2] || (_cache[2] = [
23734
23915
  createBaseVNode("progress", null, null, -1)
23735
23916
  ])])) : createCommentVNode("", true),
23736
- !hasMoreHistory.value && __props.turns.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5$7, toDisplayString(unref(t2)("transcription.historyStart")), 1)) : createCommentVNode("", true),
23917
+ !hasMoreHistory.value && __props.turns.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5$8, toDisplayString(unref(t2)("transcription.historyStart")), 1)) : createCommentVNode("", true),
23737
23918
  __props.turns.length === 0 && !isLoadingHistory.value && !partialTurn.value ? (openBlock(), createBlock(TranscriptionEmpty, {
23738
23919
  key: 2,
23739
23920
  class: "transcription-empty"
@@ -23787,13 +23968,13 @@ ${text2}` : text2;
23787
23968
  };
23788
23969
  }
23789
23970
  });
23790
- 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";
23791
- const TranscriptionPanel = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["styles", [_style_0$j]], ["__scopeId", "data-v-66b767d7"]]);
23792
- const _hoisted_1$i = { class: "verbatim-panel" };
23793
- const _hoisted_2$f = { class: "verbatim-panel__content" };
23971
+ 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";
23972
+ const TranscriptionPanel = /* @__PURE__ */ _export_sfc(_sfc_main$o, [["styles", [_style_0$k]], ["__scopeId", "data-v-66b767d7"]]);
23973
+ const _hoisted_1$j = { class: "verbatim-panel" };
23974
+ const _hoisted_2$g = { class: "verbatim-panel__content" };
23794
23975
  const _hoisted_3$c = { class: "verbatim-panel__header" };
23795
- const _hoisted_4$6 = { class: "verbatim-panel__doc-title" };
23796
- const _hoisted_5$6 = { class: "verbatim-panel__turns" };
23976
+ const _hoisted_4$7 = { class: "verbatim-panel__doc-title" };
23977
+ const _hoisted_5$7 = { class: "verbatim-panel__turns" };
23797
23978
  const _hoisted_6$6 = { class: "verbatim-panel__turn-header" };
23798
23979
  const _hoisted_7$3 = { class: "verbatim-panel__speaker-name" };
23799
23980
  const _hoisted_8$1 = {
@@ -23805,7 +23986,7 @@ ${text2}` : text2;
23805
23986
  class: "verbatim-panel__meta"
23806
23987
  };
23807
23988
  const _hoisted_10$1 = { class: "verbatim-panel__text" };
23808
- const _sfc_main$l = /* @__PURE__ */ defineComponent({
23989
+ const _sfc_main$n = /* @__PURE__ */ defineComponent({
23809
23990
  __name: "VerbatimPanel",
23810
23991
  setup(__props) {
23811
23992
  const core = useCore();
@@ -23851,20 +24032,20 @@ ${text2}` : text2;
23851
24032
  core.emit("verbatim:export", { format: format2 });
23852
24033
  }
23853
24034
  return (_ctx, _cache) => {
23854
- return openBlock(), createElementBlock("section", _hoisted_1$i, [
24035
+ return openBlock(), createElementBlock("section", _hoisted_1$j, [
23855
24036
  createVNode(unref(DocumentArticle), null, {
23856
24037
  "toolbar-right": withCtx(() => [
23857
- createVNode(unref(_sfc_main$y), {
24038
+ createVNode(unref(_sfc_main$A), {
23858
24039
  formats: unref(core).verbatimFormats.value,
23859
24040
  onSelect: onExport
23860
24041
  }, null, 8, ["formats"])
23861
24042
  ]),
23862
24043
  default: withCtx(() => [
23863
- createBaseVNode("article", _hoisted_2$f, [
24044
+ createBaseVNode("article", _hoisted_2$g, [
23864
24045
  createBaseVNode("header", _hoisted_3$c, [
23865
- createBaseVNode("h1", _hoisted_4$6, toDisplayString(title.value), 1)
24046
+ createBaseVNode("h1", _hoisted_4$7, toDisplayString(title.value), 1)
23866
24047
  ]),
23867
- createBaseVNode("ul", _hoisted_5$6, [
24048
+ createBaseVNode("ul", _hoisted_5$7, [
23868
24049
  (openBlock(true), createElementBlock(Fragment, null, renderList(turns.value, (turn) => {
23869
24050
  return openBlock(), createElementBlock("li", {
23870
24051
  key: turn.id,
@@ -23899,9 +24080,9 @@ ${text2}` : text2;
23899
24080
  };
23900
24081
  }
23901
24082
  });
23902
- const _style_0$i = "\n.verbatim-panel[data-v-4bbe16ed] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n}\n.verbatim-panel__content[data-v-4bbe16ed] {\n padding: 4rem clamp(1.5rem, 6rem, 8%);\n}\n.verbatim-panel__header[data-v-4bbe16ed] {\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-4bbe16ed] {\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-4bbe16ed] {\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-4bbe16ed] {\n display: block;\n}\n.verbatim-panel__turn-header[data-v-4bbe16ed] {\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-4bbe16ed] {\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.verbatim-panel__meta[data-v-4bbe16ed] {\n color: var(--color-text-muted);\n font-weight: 400;\n}\n.verbatim-panel__sep[data-v-4bbe16ed] {\n margin: 0 0.35em;\n}\n.verbatim-panel__text[data-v-4bbe16ed] {\n margin: 0;\n font-size: var(--font-size-base);\n line-height: 1.6;\n color: var(--color-text-primary);\n}\n\n";
23903
- const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["styles", [_style_0$i]], ["__scopeId", "data-v-4bbe16ed"]]);
23904
- const _sfc_main$k = /* @__PURE__ */ defineComponent({
24083
+ 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";
24084
+ const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["styles", [_style_0$j]], ["__scopeId", "data-v-7a077f5a"]]);
24085
+ const _sfc_main$m = /* @__PURE__ */ defineComponent({
23905
24086
  __name: "ChannelSelector",
23906
24087
  props: {
23907
24088
  channels: { type: Array },
@@ -23927,7 +24108,7 @@ ${text2}` : text2;
23927
24108
  };
23928
24109
  }
23929
24110
  });
23930
- const _sfc_main$j = /* @__PURE__ */ defineComponent({
24111
+ const _sfc_main$l = /* @__PURE__ */ defineComponent({
23931
24112
  __name: "TranslationSelector",
23932
24113
  props: {
23933
24114
  translations: { type: Array },
@@ -23959,10 +24140,10 @@ ${text2}` : text2;
23959
24140
  };
23960
24141
  }
23961
24142
  });
23962
- const _hoisted_1$h = { class: "merge-dialog-title" };
23963
- const _hoisted_2$e = { class: "merge-dialog-description" };
24143
+ const _hoisted_1$i = { class: "merge-dialog-title" };
24144
+ const _hoisted_2$f = { class: "merge-dialog-description" };
23964
24145
  const _hoisted_3$b = { class: "merge-dialog-actions" };
23965
- const _sfc_main$i = /* @__PURE__ */ defineComponent({
24146
+ const _sfc_main$k = /* @__PURE__ */ defineComponent({
23966
24147
  __name: "MergeDialog",
23967
24148
  props: {
23968
24149
  open: { type: Boolean },
@@ -24030,8 +24211,8 @@ ${text2}` : text2;
24030
24211
  class: "merge-dialog-form",
24031
24212
  onSubmit: withModifiers(onConfirm, ["prevent"])
24032
24213
  }, [
24033
- createBaseVNode("h2", _hoisted_1$h, toDisplayString(unref(t2)("mergeDialog.title")), 1),
24034
- createBaseVNode("p", _hoisted_2$e, [
24214
+ createBaseVNode("h2", _hoisted_1$i, toDisplayString(unref(t2)("mergeDialog.title")), 1),
24215
+ createBaseVNode("p", _hoisted_2$f, [
24035
24216
  createBaseVNode("strong", null, toDisplayString(fromSpeaker.value.name), 1),
24036
24217
  createTextVNode(" · " + toDisplayString(affectedCount.value) + " " + toDisplayString(unref(t2)("mergeDialog.turnsAffected")), 1)
24037
24218
  ]),
@@ -24069,19 +24250,19 @@ ${text2}` : text2;
24069
24250
  };
24070
24251
  }
24071
24252
  });
24072
- 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";
24073
- const MergeDialog = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["styles", [_style_0$h]], ["__scopeId", "data-v-e658bcd0"]]);
24074
- const _hoisted_1$g = { class: "speaker-sidebar" };
24075
- const _hoisted_2$d = {
24253
+ 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";
24254
+ const MergeDialog = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["styles", [_style_0$i]], ["__scopeId", "data-v-e658bcd0"]]);
24255
+ const _hoisted_1$h = { class: "speaker-sidebar" };
24256
+ const _hoisted_2$e = {
24076
24257
  key: 0,
24077
24258
  class: "sidebar-section sidebar-section--selector"
24078
24259
  };
24079
24260
  const _hoisted_3$a = { class: "sidebar-title" };
24080
- const _hoisted_4$5 = {
24261
+ const _hoisted_4$6 = {
24081
24262
  key: 1,
24082
24263
  class: "sidebar-section sidebar-section--selector"
24083
24264
  };
24084
- const _hoisted_5$5 = { class: "sidebar-title" };
24265
+ const _hoisted_5$6 = { class: "sidebar-title" };
24085
24266
  const _hoisted_6$5 = {
24086
24267
  key: 2,
24087
24268
  class: "sidebar-section"
@@ -24124,7 +24305,7 @@ ${text2}` : text2;
24124
24305
  };
24125
24306
  const _hoisted_28 = { class: "sidebar-title" };
24126
24307
  const _hoisted_29 = { class: "speaker-list" };
24127
- const _sfc_main$h = /* @__PURE__ */ defineComponent({
24308
+ const _sfc_main$j = /* @__PURE__ */ defineComponent({
24128
24309
  __name: "SpeakerSidebar",
24129
24310
  props: {
24130
24311
  speakers: { type: Array },
@@ -24209,18 +24390,18 @@ ${text2}` : text2;
24209
24390
  core.emit("llmService:selectVersion", { id: service.id, versionNumber });
24210
24391
  }
24211
24392
  return (_ctx, _cache) => {
24212
- return openBlock(), createElementBlock("aside", _hoisted_1$g, [
24213
- __props.channels.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_2$d, [
24393
+ return openBlock(), createElementBlock("aside", _hoisted_1$h, [
24394
+ __props.channels.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_2$e, [
24214
24395
  createBaseVNode("h2", _hoisted_3$a, toDisplayString(unref(t2)("sidebar.channel")), 1),
24215
- createVNode(_sfc_main$k, {
24396
+ createVNode(_sfc_main$m, {
24216
24397
  channels: __props.channels,
24217
24398
  "selected-channel-id": __props.selectedChannelId,
24218
24399
  "onUpdate:selectedChannelId": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:selectedChannelId", $event))
24219
24400
  }, null, 8, ["channels", "selected-channel-id"])
24220
24401
  ])) : createCommentVNode("", true),
24221
- __props.translations.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_4$5, [
24222
- createBaseVNode("h2", _hoisted_5$5, toDisplayString(unref(t2)("sidebar.translation")), 1),
24223
- createVNode(_sfc_main$j, {
24402
+ __props.translations.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_4$6, [
24403
+ createBaseVNode("h2", _hoisted_5$6, toDisplayString(unref(t2)("sidebar.translation")), 1),
24404
+ createVNode(_sfc_main$l, {
24224
24405
  translations: __props.translations,
24225
24406
  "selected-translation-id": __props.selectedTranslationId,
24226
24407
  "onUpdate:selectedTranslationId": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:selectedTranslationId", $event))
@@ -24365,7 +24546,7 @@ ${text2}` : text2;
24365
24546
  "aria-label": unref(t2)("sidebar.renameSpeaker"),
24366
24547
  onCommit: ($event) => onRename(speaker.id, $event)
24367
24548
  }, null, 8, ["model-value", "disabled", "aria-label", "onCommit"]),
24368
- canEditSpeakers.value && __props.speakers.length > 1 ? (openBlock(), createBlock(unref(_sfc_main$x), {
24549
+ canEditSpeakers.value && __props.speakers.length > 1 ? (openBlock(), createBlock(unref(_sfc_main$z), {
24369
24550
  key: 0,
24370
24551
  "speaker-name": speaker.name,
24371
24552
  onMerge: ($event) => onOpenMerge(speaker.id)
@@ -24384,9 +24565,9 @@ ${text2}` : text2;
24384
24565
  };
24385
24566
  }
24386
24567
  });
24387
- 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';
24388
- const SpeakerSidebar = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["styles", [_style_0$g]], ["__scopeId", "data-v-3b1e278f"]]);
24389
- const _sfc_main$g = /* @__PURE__ */ defineComponent({
24568
+ 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';
24569
+ const SpeakerSidebar = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["styles", [_style_0$h]], ["__scopeId", "data-v-3b1e278f"]]);
24570
+ const _sfc_main$i = /* @__PURE__ */ defineComponent({
24390
24571
  __name: "SidebarDrawer",
24391
24572
  props: {
24392
24573
  "open": { type: Boolean, ...{ required: true } },
@@ -24435,10 +24616,10 @@ ${text2}` : text2;
24435
24616
  };
24436
24617
  }
24437
24618
  });
24438
- const _hoisted_1$f = ["aria-label"];
24439
- const _hoisted_2$c = { class: "selection-count" };
24619
+ const _hoisted_1$g = ["aria-label"];
24620
+ const _hoisted_2$d = { class: "selection-count" };
24440
24621
  const _hoisted_3$9 = { class: "selection-actions" };
24441
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
24622
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
24442
24623
  __name: "SelectionActionBar",
24443
24624
  setup(__props) {
24444
24625
  const selection = useTurnSelection();
@@ -24450,7 +24631,7 @@ ${text2}` : text2;
24450
24631
  role: "toolbar",
24451
24632
  "aria-label": unref(t2)("selection.count")
24452
24633
  }, [
24453
- createBaseVNode("span", _hoisted_2$c, toDisplayString(unref(selection).count.value) + " " + toDisplayString(unref(t2)("selection.count")), 1),
24634
+ createBaseVNode("span", _hoisted_2$d, toDisplayString(unref(selection).count.value) + " " + toDisplayString(unref(t2)("selection.count")), 1),
24454
24635
  createBaseVNode("div", _hoisted_3$9, [
24455
24636
  createVNode(unref(CopyButton), {
24456
24637
  icon: "clipboard-type",
@@ -24482,35 +24663,18 @@ ${text2}` : text2;
24482
24663
  _: 1
24483
24664
  })
24484
24665
  ])
24485
- ], 8, _hoisted_1$f)) : createCommentVNode("", true);
24666
+ ], 8, _hoisted_1$g)) : createCommentVNode("", true);
24486
24667
  };
24487
24668
  }
24488
24669
  });
24489
- 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";
24490
- const SelectionActionBar = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["styles", [_style_0$f]], ["__scopeId", "data-v-9bad1410"]]);
24491
- const MOBILE_BREAKPOINT = "(max-width: 767px)";
24492
- function useIsMobile() {
24493
- const isMobile = /* @__PURE__ */ ref(false);
24494
- let mql = null;
24495
- function onChange(e2) {
24496
- isMobile.value = e2.matches;
24497
- }
24498
- onMounted(() => {
24499
- mql = window.matchMedia(MOBILE_BREAKPOINT);
24500
- isMobile.value = mql.matches;
24501
- mql.addEventListener("change", onChange);
24502
- });
24503
- onBeforeUnmount(() => {
24504
- mql?.removeEventListener("change", onChange);
24505
- });
24506
- return { isMobile };
24507
- }
24508
- const _hoisted_1$e = { class: "editor-layout" };
24509
- const _hoisted_2$b = {
24670
+ 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";
24671
+ const SelectionActionBar = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["styles", [_style_0$g]], ["__scopeId", "data-v-9bad1410"]]);
24672
+ const _hoisted_1$f = { class: "editor-layout" };
24673
+ const _hoisted_2$c = {
24510
24674
  key: 6,
24511
24675
  class: "mobile-selectors"
24512
24676
  };
24513
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
24677
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
24514
24678
  __name: "Layout",
24515
24679
  props: {
24516
24680
  showHeader: { type: Boolean, default: true },
@@ -24552,6 +24716,9 @@ ${text2}` : text2;
24552
24716
  );
24553
24717
  const speakerList = computed(() => Array.from(speakers.values()));
24554
24718
  const showTranscription = computed(() => activeTab.value === TRANSCRIPTION_TAB);
24719
+ watch(isMobile, (mobile) => {
24720
+ if (mobile && isSplit.value) isSplit.value = false;
24721
+ });
24555
24722
  watch(activeTab, (id) => {
24556
24723
  if (!core.llmServices) return;
24557
24724
  if (id === TRANSCRIPTION_TAB || id === VERBATIM_TAB) {
@@ -24572,7 +24739,9 @@ ${text2}` : text2;
24572
24739
  () => props.showVerbatim,
24573
24740
  (canShow) => {
24574
24741
  if (canShow) return;
24575
- const withoutVerbatim = shownPanels.value.filter((id) => id !== VERBATIM_TAB);
24742
+ const withoutVerbatim = shownPanels.value.filter(
24743
+ (id) => id !== VERBATIM_TAB
24744
+ );
24576
24745
  shownPanels.value = withoutVerbatim.length > 0 ? withoutVerbatim : [TRANSCRIPTION_TAB];
24577
24746
  }
24578
24747
  );
@@ -24597,7 +24766,7 @@ ${text2}` : text2;
24597
24766
  core.activeChannel.value?.setActiveTranslation(translationId);
24598
24767
  }
24599
24768
  return (_ctx, _cache) => {
24600
- return openBlock(), createElementBlock("div", _hoisted_1$e, [
24769
+ return openBlock(), createElementBlock("div", _hoisted_1$f, [
24601
24770
  props.showHeader ? (openBlock(), createBlock(Header, {
24602
24771
  key: 0,
24603
24772
  title: unref(core).title.value,
@@ -24613,7 +24782,7 @@ ${text2}` : text2;
24613
24782
  onUndo: _cache[2] || (_cache[2] = ($event) => unref(core).transcriptionEditor?.undo()),
24614
24783
  onRedo: _cache[3] || (_cache[3] = ($event) => unref(core).transcriptionEditor?.redo())
24615
24784
  }, null, 8, ["title", "date", "duration", "speaker-count", "is-mobile", "can-ask", "can-undo", "can-redo"])) : createCommentVNode("", true),
24616
- createVNode(_sfc_main$t, {
24785
+ createVNode(_sfc_main$v, {
24617
24786
  "model-value": activeTab.value,
24618
24787
  "show-verbatim": props.showVerbatim,
24619
24788
  "onUpdate:modelValue": _cache[4] || (_cache[4] = (tab) => shownPanels.value = [tab])
@@ -24653,7 +24822,7 @@ ${text2}` : text2;
24653
24822
  "onUpdate:selectedChannelId": onChannelChange,
24654
24823
  "onUpdate:selectedTranslationId": onTranslationChange
24655
24824
  }, null, 8, ["speakers", "channels", "selected-channel-id", "translations", "selected-translation-id", "show-speakers"])) : createCommentVNode("", true),
24656
- unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$g, {
24825
+ unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$i, {
24657
24826
  key: 1,
24658
24827
  open: isSidebarOpen.value,
24659
24828
  "onUpdate:open": _cache[6] || (_cache[6] = ($event) => isSidebarOpen.value = $event)
@@ -24682,14 +24851,14 @@ ${text2}` : text2;
24682
24851
  unref(core).subtitle?.isVisible.value && !unref(isMobile) && !unref(core).subtitle.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleBanner), { key: 3 })) : createCommentVNode("", true),
24683
24852
  unref(core).subtitle?.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleFullscreen), { key: 4 })) : createCommentVNode("", true),
24684
24853
  unref(core).chat ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.chatDrawer), { key: 5 })) : createCommentVNode("", true),
24685
- unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_2$b, [
24686
- channels.value.length > 1 ? (openBlock(), createBlock(_sfc_main$k, {
24854
+ unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_2$c, [
24855
+ channels.value.length > 1 ? (openBlock(), createBlock(_sfc_main$m, {
24687
24856
  key: 0,
24688
24857
  channels: channels.value,
24689
24858
  "selected-channel-id": unref(core).activeChannelId.value,
24690
24859
  "onUpdate:selectedChannelId": onChannelChange
24691
24860
  }, null, 8, ["channels", "selected-channel-id"])) : createCommentVNode("", true),
24692
- translations.value.length > 1 ? (openBlock(), createBlock(_sfc_main$j, {
24861
+ translations.value.length > 1 ? (openBlock(), createBlock(_sfc_main$l, {
24693
24862
  key: 1,
24694
24863
  translations: translations.value,
24695
24864
  "selected-translation-id": activeTranslationId.value,
@@ -24700,41 +24869,41 @@ ${text2}` : text2;
24700
24869
  };
24701
24870
  }
24702
24871
  });
24703
- const _style_0$e = "\n.editor-layout[data-v-540cad68] {\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-540cad68] {\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-540cad68] {\n grid-template-columns: 1fr;\n}\n.editor-body__panels[data-v-540cad68] {\n display: flex;\n min-width: 0;\n min-height: 0;\n}\n.editor-body__panels[data-v-540cad68] > * {\n flex: 1;\n min-width: 0;\n}\n.editor-body__panels--split[data-v-540cad68] > * + * {\n border-left: 1px solid var(--color-border);\n}\n.mobile-selectors[data-v-540cad68] {\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-540cad68] > * {\n flex: 1;\n min-width: 0;\n}\n@media (max-width: 767px) {\n.editor-body[data-v-540cad68] {\n grid-template-columns: 1fr;\n}\n}\n";
24704
- const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$e]], ["__scopeId", "data-v-540cad68"]]);
24705
- const _hoisted_1$d = {
24872
+ 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";
24873
+ const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["styles", [_style_0$f]], ["__scopeId", "data-v-c7029599"]]);
24874
+ const _hoisted_1$e = {
24706
24875
  class: "editor-loading",
24707
24876
  role: "status",
24708
24877
  "aria-live": "polite"
24709
24878
  };
24710
- const _hoisted_2$a = { class: "editor-loading__label" };
24711
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
24879
+ const _hoisted_2$b = { class: "editor-loading__label" };
24880
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
24712
24881
  __name: "EditorLoadingOverlay",
24713
24882
  setup(__props) {
24714
24883
  const { t: t2 } = useI18n();
24715
24884
  return (_ctx, _cache) => {
24716
- return openBlock(), createElementBlock("div", _hoisted_1$d, [
24885
+ return openBlock(), createElementBlock("div", _hoisted_1$e, [
24717
24886
  _cache[0] || (_cache[0] = createBaseVNode("span", {
24718
24887
  class: "editor-loading__spinner",
24719
24888
  "aria-hidden": "true"
24720
24889
  }, null, -1)),
24721
- createBaseVNode("span", _hoisted_2$a, toDisplayString(unref(t2)("editor.loading")), 1)
24890
+ createBaseVNode("span", _hoisted_2$b, toDisplayString(unref(t2)("editor.loading")), 1)
24722
24891
  ]);
24723
24892
  };
24724
24893
  }
24725
24894
  });
24726
- 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";
24727
- const EditorLoadingOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["styles", [_style_0$d]], ["__scopeId", "data-v-f56c39db"]]);
24728
- const _hoisted_1$c = {
24895
+ 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";
24896
+ const EditorLoadingOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["styles", [_style_0$e]], ["__scopeId", "data-v-f56c39db"]]);
24897
+ const _hoisted_1$d = {
24729
24898
  class: "editor-error",
24730
24899
  role: "alert"
24731
24900
  };
24732
- const _hoisted_2$9 = { class: "editor-error__title" };
24901
+ const _hoisted_2$a = { class: "editor-error__title" };
24733
24902
  const _hoisted_3$8 = {
24734
24903
  key: 0,
24735
24904
  class: "editor-error__detail"
24736
24905
  };
24737
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
24906
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
24738
24907
  __name: "EditorErrorOverlay",
24739
24908
  props: {
24740
24909
  message: { type: [String, null] }
@@ -24742,20 +24911,20 @@ ${text2}` : text2;
24742
24911
  setup(__props) {
24743
24912
  const { t: t2 } = useI18n();
24744
24913
  return (_ctx, _cache) => {
24745
- return openBlock(), createElementBlock("div", _hoisted_1$c, [
24914
+ return openBlock(), createElementBlock("div", _hoisted_1$d, [
24746
24915
  createVNode(unref(EditorIcon), {
24747
24916
  name: "warning",
24748
24917
  size: 40,
24749
24918
  class: "editor-error__icon"
24750
24919
  }),
24751
- createBaseVNode("p", _hoisted_2$9, toDisplayString(unref(t2)("editor.loadError")), 1),
24920
+ createBaseVNode("p", _hoisted_2$a, toDisplayString(unref(t2)("editor.loadError")), 1),
24752
24921
  __props.message ? (openBlock(), createElementBlock("p", _hoisted_3$8, toDisplayString(__props.message), 1)) : createCommentVNode("", true)
24753
24922
  ]);
24754
24923
  };
24755
24924
  }
24756
24925
  });
24757
- 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";
24758
- const EditorErrorOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["styles", [_style_0$c]], ["__scopeId", "data-v-eefc2d23"]]);
24926
+ 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";
24927
+ const EditorErrorOverlay = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$d]], ["__scopeId", "data-v-eefc2d23"]]);
24759
24928
  const READY_TIMEOUT_MS = 2e4;
24760
24929
  function useEditorReady(core) {
24761
24930
  const isLoading = /* @__PURE__ */ ref(true);
@@ -24789,8 +24958,8 @@ ${text2}` : text2;
24789
24958
  });
24790
24959
  return { isLoading, error };
24791
24960
  }
24792
- const _hoisted_1$b = { class: "transcript-ui-root" };
24793
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
24961
+ const _hoisted_1$c = { class: "transcript-ui-root" };
24962
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
24794
24963
  __name: "TranscriptUI",
24795
24964
  props: {
24796
24965
  locale: { default: "fr", type: String },
@@ -24813,7 +24982,7 @@ ${text2}` : text2;
24813
24982
  onBeforeUnmount(() => core.destroy());
24814
24983
  __expose({ core });
24815
24984
  return (_ctx, _cache) => {
24816
- return openBlock(), createElementBlock("div", _hoisted_1$b, [
24985
+ return openBlock(), createElementBlock("div", _hoisted_1$c, [
24817
24986
  unref(core).channels.size ? (openBlock(), createBlock(Layout, {
24818
24987
  key: 0,
24819
24988
  "show-header": !props.noHeader,
@@ -24827,7 +24996,7 @@ ${text2}` : text2;
24827
24996
  };
24828
24997
  }
24829
24998
  });
24830
- const _style_0$b = `
24999
+ const _style_0$c = `
24831
25000
  /* NOT fonts.css: a @font-face declared inside a shadow root isn't reliably
24832
25001
  * applied by browsers (document.fonts never registers it) — dead weight in
24833
25002
  * the webcomponent bundle specifically, which always runs shadow-DOM'd. The
@@ -25154,7 +25323,7 @@ section.turn:has([data-state="open"]) {
25154
25323
  height: 100%;
25155
25324
  }
25156
25325
  `;
25157
- const TranscriptUI = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["styles", [_style_0$b]]]);
25326
+ const TranscriptUI = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["styles", [_style_0$c]]]);
25158
25327
  function mapApiTurns(apiTurns) {
25159
25328
  return apiTurns.map((t2) => {
25160
25329
  const words = wordsFromApi$2(t2.turn_id, t2.words);
@@ -25521,14 +25690,14 @@ section.turn:has([data-state="open"]) {
25521
25690
  }
25522
25691
  };
25523
25692
  }
25524
- const _hoisted_1$a = { class: "player-controls" };
25525
- const _hoisted_2$8 = { class: "controls-left" };
25693
+ const _hoisted_1$b = { class: "player-controls" };
25694
+ const _hoisted_2$9 = { class: "controls-left" };
25526
25695
  const _hoisted_3$7 = { class: "controls-time" };
25527
- const _hoisted_4$4 = { class: "time-display" };
25528
- const _hoisted_5$4 = { class: "time-display" };
25696
+ const _hoisted_4$5 = { class: "time-display" };
25697
+ const _hoisted_5$5 = { class: "time-display" };
25529
25698
  const _hoisted_6$4 = { class: "controls-right" };
25530
25699
  const _hoisted_7$1 = ["value", "aria-label", "disabled"];
25531
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
25700
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
25532
25701
  __name: "AudioPlayerControls",
25533
25702
  props: {
25534
25703
  isPlaying: { type: Boolean },
@@ -25549,8 +25718,8 @@ section.turn:has([data-state="open"]) {
25549
25718
  emit2("update:volume", parseFloat(target.value));
25550
25719
  }
25551
25720
  return (_ctx, _cache) => {
25552
- return openBlock(), createElementBlock("div", _hoisted_1$a, [
25553
- createBaseVNode("div", _hoisted_2$8, [
25721
+ return openBlock(), createElementBlock("div", _hoisted_1$b, [
25722
+ createBaseVNode("div", _hoisted_2$9, [
25554
25723
  createVNode(unref(Button), {
25555
25724
  variant: "transparent",
25556
25725
  size: "md",
@@ -25598,9 +25767,9 @@ section.turn:has([data-state="open"]) {
25598
25767
  }, 8, ["aria-label", "disabled"])
25599
25768
  ]),
25600
25769
  createBaseVNode("div", _hoisted_3$7, [
25601
- createBaseVNode("time", _hoisted_4$4, toDisplayString(__props.currentTime), 1),
25770
+ createBaseVNode("time", _hoisted_4$5, toDisplayString(__props.currentTime), 1),
25602
25771
  _cache[7] || (_cache[7] = createBaseVNode("span", { class: "time-separator" }, "/", -1)),
25603
- createBaseVNode("time", _hoisted_5$4, toDisplayString(__props.duration), 1)
25772
+ createBaseVNode("time", _hoisted_5$5, toDisplayString(__props.duration), 1)
25604
25773
  ]),
25605
25774
  createBaseVNode("div", _hoisted_6$4, [
25606
25775
  createBaseVNode("div", {
@@ -25658,8 +25827,8 @@ section.turn:has([data-state="open"]) {
25658
25827
  };
25659
25828
  }
25660
25829
  });
25661
- 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";
25662
- const AudioPlayerControls = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["styles", [_style_0$a]], ["__scopeId", "data-v-fb293305"]]);
25830
+ 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";
25831
+ const AudioPlayerControls = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["styles", [_style_0$b]], ["__scopeId", "data-v-fb293305"]]);
25663
25832
  function t$1(t2, e2, i2, n2) {
25664
25833
  return new (i2 || (i2 = Promise))((function(s2, r2) {
25665
25834
  function o2(t3) {
@@ -27591,8 +27760,8 @@ section.turn:has([data-state="open"]) {
27591
27760
  toggleMute
27592
27761
  };
27593
27762
  }
27594
- const _hoisted_1$9 = { class: "audio-player" };
27595
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
27763
+ const _hoisted_1$a = { class: "audio-player" };
27764
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
27596
27765
  __name: "AudioPlayer",
27597
27766
  props: {
27598
27767
  audioSrc: { type: String }
@@ -27622,7 +27791,7 @@ section.turn:has([data-state="open"]) {
27622
27791
  });
27623
27792
  __expose({ seekTo, pause });
27624
27793
  return (_ctx, _cache) => {
27625
- return openBlock(), createElementBlock("footer", _hoisted_1$9, [
27794
+ return openBlock(), createElementBlock("footer", _hoisted_1$a, [
27626
27795
  createBaseVNode("div", {
27627
27796
  ref_key: "waveformRef",
27628
27797
  ref: waveformRef,
@@ -27647,8 +27816,8 @@ section.turn:has([data-state="open"]) {
27647
27816
  };
27648
27817
  }
27649
27818
  });
27650
- 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";
27651
- const AudioPlayer = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["styles", [_style_0$9]], ["__scopeId", "data-v-580c393d"]]);
27819
+ 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";
27820
+ const AudioPlayer = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["styles", [_style_0$a]], ["__scopeId", "data-v-580c393d"]]);
27652
27821
  const { findActiveWord, firstWordStart, lastWordEnd } = utils;
27653
27822
  const WORD_TRACK_INTERVAL = 0.05;
27654
27823
  function createAudioPlugin(options = {}) {
@@ -28366,14 +28535,14 @@ section.turn:has([data-state="open"]) {
28366
28535
  }
28367
28536
  return parts;
28368
28537
  }
28369
- const _hoisted_1$8 = {
28538
+ const _hoisted_1$9 = {
28370
28539
  key: 0,
28371
28540
  class: "watermark",
28372
28541
  "aria-hidden": "true"
28373
28542
  };
28374
- const _hoisted_2$7 = ["src", "alt"];
28543
+ const _hoisted_2$8 = ["src", "alt"];
28375
28544
  const _hoisted_3$6 = { key: 1 };
28376
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28545
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
28377
28546
  __name: "SubtitleWatermark",
28378
28547
  props: {
28379
28548
  visible: { type: Boolean }
@@ -28388,7 +28557,7 @@ section.turn:has([data-state="open"]) {
28388
28557
  return (_ctx, _cache) => {
28389
28558
  return openBlock(), createBlock(Transition, { name: "watermark" }, {
28390
28559
  default: withCtx(() => [
28391
- __props.visible && unref(watermark) ? (openBlock(), createElementBlock("div", _hoisted_1$8, [
28560
+ __props.visible && unref(watermark) ? (openBlock(), createElementBlock("div", _hoisted_1$9, [
28392
28561
  (openBlock(true), createElementBlock(Fragment, null, renderList(parts.value, (part, i2) => {
28393
28562
  return openBlock(), createElementBlock(Fragment, { key: i2 }, [
28394
28563
  part.type === "token" ? (openBlock(), createElementBlock("img", {
@@ -28396,7 +28565,7 @@ section.turn:has([data-state="open"]) {
28396
28565
  src: part.src,
28397
28566
  alt: part.alt,
28398
28567
  class: "watermark__img"
28399
- }, null, 8, _hoisted_2$7)) : (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(part.value), 1))
28568
+ }, null, 8, _hoisted_2$8)) : (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(part.value), 1))
28400
28569
  ], 64);
28401
28570
  }), 128))
28402
28571
  ])) : createCommentVNode("", true)
@@ -28406,10 +28575,10 @@ section.turn:has([data-state="open"]) {
28406
28575
  };
28407
28576
  }
28408
28577
  });
28409
- 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";
28410
- const SubtitleWatermark = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["styles", [_style_0$8]], ["__scopeId", "data-v-eb604a8e"]]);
28411
- const _hoisted_1$7 = ["height"];
28412
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
28578
+ 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";
28579
+ const SubtitleWatermark = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["styles", [_style_0$9]], ["__scopeId", "data-v-eb604a8e"]]);
28580
+ const _hoisted_1$8 = ["height"];
28581
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
28413
28582
  __name: "SubtitleBanner",
28414
28583
  setup(__props) {
28415
28584
  const core = useCore();
@@ -28443,20 +28612,20 @@ section.turn:has([data-state="open"]) {
28443
28612
  ref: "canvas",
28444
28613
  class: normalizeClass(["subtitle-canvas", { "subtitle-canvas--shrunk": unref(watermarkVisible) }]),
28445
28614
  height: canvasHeight.value
28446
- }, null, 10, _hoisted_1$7),
28615
+ }, null, 10, _hoisted_1$8),
28447
28616
  createVNode(SubtitleWatermark, { visible: unref(watermarkVisible) }, null, 8, ["visible"])
28448
28617
  ], 4);
28449
28618
  };
28450
28619
  }
28451
28620
  });
28452
- 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";
28453
- const SubtitleBanner = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["styles", [_style_0$7]], ["__scopeId", "data-v-6b9b2fb2"]]);
28454
- const _hoisted_1$6 = {
28621
+ 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";
28622
+ const SubtitleBanner = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["styles", [_style_0$8]], ["__scopeId", "data-v-6b9b2fb2"]]);
28623
+ const _hoisted_1$7 = {
28455
28624
  ref: "container",
28456
28625
  class: "subtitle-fullscreen"
28457
28626
  };
28458
- const _hoisted_2$6 = ["aria-label"];
28459
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
28627
+ const _hoisted_2$7 = ["aria-label"];
28628
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
28460
28629
  __name: "SubtitleFullscreen",
28461
28630
  setup(__props) {
28462
28631
  const core = useCore();
@@ -28514,14 +28683,14 @@ section.turn:has([data-state="open"]) {
28514
28683
  }
28515
28684
  });
28516
28685
  return (_ctx, _cache) => {
28517
- return openBlock(), createElementBlock("div", _hoisted_1$6, [
28686
+ return openBlock(), createElementBlock("div", _hoisted_1$7, [
28518
28687
  createBaseVNode("button", {
28519
28688
  class: "subtitle-fullscreen__close",
28520
28689
  "aria-label": unref(t2)("subtitle.exitFullscreen"),
28521
28690
  onClick: close
28522
28691
  }, [
28523
28692
  createVNode(unref(X$1), { size: 24 })
28524
- ], 8, _hoisted_2$6),
28693
+ ], 8, _hoisted_2$7),
28525
28694
  createBaseVNode("canvas", {
28526
28695
  ref: "canvas",
28527
28696
  class: normalizeClass(["subtitle-fullscreen__canvas", { "subtitle-fullscreen__canvas--shrunk": unref(watermarkVisible) }])
@@ -28531,8 +28700,8 @@ section.turn:has([data-state="open"]) {
28531
28700
  };
28532
28701
  }
28533
28702
  });
28534
- 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";
28535
- const SubtitleFullscreen = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["styles", [_style_0$6]], ["__scopeId", "data-v-4dac7247"]]);
28703
+ 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";
28704
+ const SubtitleFullscreen = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["styles", [_style_0$7]], ["__scopeId", "data-v-4dac7247"]]);
28536
28705
  function createSubtitlePlugin(options = {}) {
28537
28706
  return {
28538
28707
  name: "subtitle",
@@ -29334,6 +29503,38 @@ section.turn:has([data-state="open"]) {
29334
29503
  }
29335
29504
  };
29336
29505
  }
29506
+ const _hoisted_1$6 = ["title"];
29507
+ const _hoisted_2$6 = { class: "llm-service-status__label" };
29508
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
29509
+ __name: "LLMServiceStatus",
29510
+ props: {
29511
+ isUpdated: { type: Boolean }
29512
+ },
29513
+ setup(__props) {
29514
+ const props = __props;
29515
+ const { t: t2 } = useI18n();
29516
+ const label = computed(
29517
+ () => props.isUpdated ? t2("llmService.statusUpdated") : t2("llmService.statusOutdated")
29518
+ );
29519
+ return (_ctx, _cache) => {
29520
+ return openBlock(), createElementBlock("span", {
29521
+ class: normalizeClass([
29522
+ "llm-service-status",
29523
+ __props.isUpdated ? "llm-service-status--ok" : "llm-service-status--warn"
29524
+ ]),
29525
+ title: label.value
29526
+ }, [
29527
+ createVNode(unref(EditorIcon), {
29528
+ name: __props.isUpdated ? "check" : "warning",
29529
+ size: 14
29530
+ }, null, 8, ["name"]),
29531
+ createBaseVNode("span", _hoisted_2$6, toDisplayString(label.value), 1)
29532
+ ], 10, _hoisted_1$6);
29533
+ };
29534
+ }
29535
+ });
29536
+ 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";
29537
+ const LLMServiceStatus = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["styles", [_style_0$6]], ["__scopeId", "data-v-f6c4d61b"]]);
29337
29538
  const _hoisted_1$5 = { class: "llm-service-panel" };
29338
29539
  const _hoisted_2$5 = {
29339
29540
  key: 0,
@@ -29341,7 +29542,9 @@ section.turn:has([data-state="open"]) {
29341
29542
  role: "status"
29342
29543
  };
29343
29544
  const _hoisted_3$5 = { class: "llm-service-panel__empty-text" };
29344
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29545
+ const _hoisted_4$4 = { class: "llm-service-panel__reading-status" };
29546
+ const _hoisted_5$4 = { class: "llm-service-panel__reading-actions" };
29547
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
29345
29548
  __name: "LLMServicePanel",
29346
29549
  props: {
29347
29550
  service: { type: Object },
@@ -29353,6 +29556,8 @@ section.turn:has([data-state="open"]) {
29353
29556
  const emit2 = __emit;
29354
29557
  const core = useCore();
29355
29558
  const { t: t2 } = useI18n();
29559
+ const { isMobile } = useIsMobile();
29560
+ const isReadOnly = computed(() => isMobile.value);
29356
29561
  function toggleSplit() {
29357
29562
  emit2("update:split", !props.split);
29358
29563
  }
@@ -29419,62 +29624,7 @@ section.turn:has([data-state="open"]) {
29419
29624
  status: articleStatus.value,
29420
29625
  progress: progress.value,
29421
29626
  onRetry: onRegenerate
29422
- }, {
29423
- "toolbar-left": withCtx(() => [
29424
- createVNode(unref(Button), {
29425
- variant: "primary",
29426
- icon: "save",
29427
- disabled: !dirty.value || busy.value,
29428
- "aria-label": unref(t2)("llmService.save"),
29429
- title: unref(t2)("llmService.save"),
29430
- onClick: onSave
29431
- }, null, 8, ["disabled", "aria-label", "title"]),
29432
- createVNode(unref(Button), {
29433
- variant: "secondary",
29434
- icon: "refresh-cw",
29435
- loading: articleStatus.value === "processing",
29436
- disabled: isUpdated.value || busy.value || articleStatus.value === "processing",
29437
- "aria-label": unref(t2)("llmService.regenerate"),
29438
- title: unref(t2)("llmService.regenerate"),
29439
- onClick: onRegenerate
29440
- }, null, 8, ["loading", "disabled", "aria-label", "title"])
29441
- ]),
29442
- "toolbar-center": withCtx(() => [
29443
- createBaseVNode("span", {
29444
- class: normalizeClass(["llm-service-panel__status", [
29445
- isUpdated.value ? "llm-service-panel__status--ok" : "llm-service-panel__status--warn"
29446
- ]])
29447
- }, [
29448
- createVNode(unref(EditorIcon), {
29449
- name: isUpdated.value ? "check" : "warning",
29450
- size: 14
29451
- }, null, 8, ["name"]),
29452
- createBaseVNode("span", null, toDisplayString(isUpdated.value ? unref(t2)("llmService.statusUpdated") : unref(t2)("llmService.statusOutdated")), 1)
29453
- ], 2)
29454
- ]),
29455
- "toolbar-right": withCtx(() => [
29456
- createVNode(unref(Button), {
29457
- variant: "primary",
29458
- icon: "download",
29459
- disabled: articleStatus.value === "processing" || !hasContent.value,
29460
- "aria-label": unref(t2)("llmService.download"),
29461
- title: unref(t2)("llmService.download"),
29462
- onClick: onExport
29463
- }, {
29464
- default: withCtx(() => [
29465
- createTextVNode(toDisplayString(unref(t2)("llmService.download")), 1)
29466
- ]),
29467
- _: 1
29468
- }, 8, ["disabled", "aria-label", "title"]),
29469
- createVNode(unref(Button), {
29470
- variant: __props.split ? "primary" : "secondary",
29471
- icon: "panel-right",
29472
- "aria-pressed": !!__props.split,
29473
- "aria-label": unref(t2)("llmService.split"),
29474
- title: unref(t2)("llmService.split"),
29475
- onClick: toggleSplit
29476
- }, null, 8, ["variant", "aria-pressed", "aria-label", "title"])
29477
- ]),
29627
+ }, createSlots({
29478
29628
  default: withCtx(() => [
29479
29629
  isEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_2$5, [
29480
29630
  createBaseVNode("p", _hoisted_3$5, toDisplayString(unref(t2)("llmService.empty")), 1),
@@ -29489,21 +29639,108 @@ section.turn:has([data-state="open"]) {
29489
29639
  ]),
29490
29640
  _: 1
29491
29641
  }, 8, ["disabled"])
29492
- ])) : (openBlock(), createBlock(unref(MarkdownEditor), {
29642
+ ])) : !isReadOnly.value ? (openBlock(), createBlock(unref(MarkdownEditor), {
29493
29643
  key: 1,
29494
29644
  modelValue: draft.value,
29495
29645
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => draft.value = $event),
29496
29646
  disabled: busy.value
29497
- }, null, 8, ["modelValue", "disabled"]))
29647
+ }, null, 8, ["modelValue", "disabled"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
29648
+ createBaseVNode("div", _hoisted_4$4, [
29649
+ createVNode(LLMServiceStatus, { "is-updated": isUpdated.value }, null, 8, ["is-updated"]),
29650
+ createBaseVNode("div", _hoisted_5$4, [
29651
+ !isUpdated.value ? (openBlock(), createBlock(unref(Button), {
29652
+ key: 0,
29653
+ variant: "secondary",
29654
+ icon: "refresh-cw",
29655
+ disabled: busy.value,
29656
+ onClick: onRegenerate
29657
+ }, {
29658
+ default: withCtx(() => [
29659
+ createTextVNode(toDisplayString(unref(t2)("llmService.regenerate")), 1)
29660
+ ]),
29661
+ _: 1
29662
+ }, 8, ["disabled"])) : createCommentVNode("", true),
29663
+ createVNode(unref(Button), {
29664
+ variant: "primary",
29665
+ icon: "download",
29666
+ "aria-label": unref(t2)("llmService.download"),
29667
+ title: unref(t2)("llmService.download"),
29668
+ onClick: onExport
29669
+ }, null, 8, ["aria-label", "title"])
29670
+ ])
29671
+ ]),
29672
+ createVNode(unref(MarkdownView), {
29673
+ class: "llm-service-panel__reading",
29674
+ source: draft.value
29675
+ }, null, 8, ["source"])
29676
+ ], 64))
29498
29677
  ]),
29499
- _: 1
29500
- }, 8, ["status", "progress"])
29678
+ _: 2
29679
+ }, [
29680
+ !isReadOnly.value ? {
29681
+ name: "toolbar-left",
29682
+ fn: withCtx(() => [
29683
+ createVNode(unref(Button), {
29684
+ variant: "primary",
29685
+ icon: "save",
29686
+ disabled: !dirty.value || busy.value,
29687
+ "aria-label": unref(t2)("llmService.save"),
29688
+ title: unref(t2)("llmService.save"),
29689
+ onClick: onSave
29690
+ }, null, 8, ["disabled", "aria-label", "title"]),
29691
+ createVNode(unref(Button), {
29692
+ variant: "secondary",
29693
+ icon: "refresh-cw",
29694
+ loading: articleStatus.value === "processing",
29695
+ disabled: isUpdated.value || busy.value || articleStatus.value === "processing",
29696
+ "aria-label": unref(t2)("llmService.regenerate"),
29697
+ title: unref(t2)("llmService.regenerate"),
29698
+ onClick: onRegenerate
29699
+ }, null, 8, ["loading", "disabled", "aria-label", "title"])
29700
+ ]),
29701
+ key: "0"
29702
+ } : void 0,
29703
+ !isReadOnly.value ? {
29704
+ name: "toolbar-center",
29705
+ fn: withCtx(() => [
29706
+ createVNode(LLMServiceStatus, { "is-updated": isUpdated.value }, null, 8, ["is-updated"])
29707
+ ]),
29708
+ key: "1"
29709
+ } : void 0,
29710
+ !isReadOnly.value ? {
29711
+ name: "toolbar-right",
29712
+ fn: withCtx(() => [
29713
+ createVNode(unref(Button), {
29714
+ variant: "primary",
29715
+ icon: "download",
29716
+ disabled: articleStatus.value === "processing" || !hasContent.value,
29717
+ "aria-label": unref(t2)("llmService.download"),
29718
+ title: unref(t2)("llmService.download"),
29719
+ onClick: onExport
29720
+ }, {
29721
+ default: withCtx(() => [
29722
+ createTextVNode(toDisplayString(unref(t2)("llmService.download")), 1)
29723
+ ]),
29724
+ _: 1
29725
+ }, 8, ["disabled", "aria-label", "title"]),
29726
+ createVNode(unref(Button), {
29727
+ variant: __props.split ? "primary" : "secondary",
29728
+ icon: "panel-right",
29729
+ "aria-pressed": !!__props.split,
29730
+ "aria-label": unref(t2)("llmService.split"),
29731
+ title: unref(t2)("llmService.split"),
29732
+ onClick: toggleSplit
29733
+ }, null, 8, ["variant", "aria-pressed", "aria-label", "title"])
29734
+ ]),
29735
+ key: "2"
29736
+ } : void 0
29737
+ ]), 1032, ["status", "progress"])
29501
29738
  ]);
29502
29739
  };
29503
29740
  }
29504
29741
  });
29505
- const _style_0$5 = "\n.llm-service-panel[data-v-0222a168] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n}\n.llm-service-panel__status[data-v-0222a168] {\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-0222a168] {\n color: var(--color-success, #2e7d32);\n}\n.llm-service-panel__status--warn[data-v-0222a168] {\n color: var(--color-warning, #ed6c02);\n}\n.llm-service-panel__empty[data-v-0222a168] {\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-0222a168] {\n margin: 0;\n max-width: 400px;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n@media (max-width: 767px) {\n.llm-service-panel[data-v-0222a168] {\n padding: var(--spacing-md);\n}\n}\n";
29506
- const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$5]], ["__scopeId", "data-v-0222a168"]]);
29742
+ 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";
29743
+ const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["styles", [_style_0$5]], ["__scopeId", "data-v-2d38dcc6"]]);
29507
29744
  function createService(init) {
29508
29745
  return {
29509
29746
  id: init.id,
@@ -29704,7 +29941,7 @@ section.turn:has([data-state="open"]) {
29704
29941
  class: "chat-session-confirm"
29705
29942
  };
29706
29943
  const _hoisted_6$3 = { class: "chat-session-confirm__text" };
29707
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
29944
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
29708
29945
  __name: "ChatSessionList",
29709
29946
  props: {
29710
29947
  sessions: { type: Array },
@@ -29836,7 +30073,48 @@ section.turn:has([data-state="open"]) {
29836
30073
  }
29837
30074
  });
29838
30075
  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";
29839
- const ChatSessionList = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["styles", [_style_0$4]], ["__scopeId", "data-v-c13478f0"]]);
30076
+ const ChatSessionList = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$4]], ["__scopeId", "data-v-c13478f0"]]);
30077
+ function computeSessionOptions(sessions, activeSessionId, newSessionLabel) {
30078
+ const options = sessions.map((session) => ({
30079
+ value: session.id,
30080
+ label: session.title || newSessionLabel
30081
+ }));
30082
+ const isActiveListed = sessions.some((s2) => s2.id === activeSessionId);
30083
+ if (isActiveListed) return options;
30084
+ return [{ value: activeSessionId ?? "", label: newSessionLabel }, ...options];
30085
+ }
30086
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
30087
+ __name: "ChatSessionSelect",
30088
+ props: {
30089
+ sessions: { type: Array },
30090
+ activeSessionId: { type: [String, null] }
30091
+ },
30092
+ emits: ["select"],
30093
+ setup(__props, { emit: __emit }) {
30094
+ const props = __props;
30095
+ const emit2 = __emit;
30096
+ const { t: t2 } = useI18n();
30097
+ const options = computed(
30098
+ () => computeSessionOptions(props.sessions, props.activeSessionId, t2("chat.newChat"))
30099
+ );
30100
+ const field = computed(() => ({
30101
+ customParams: { "aria-label": t2("chat.history") }
30102
+ }));
30103
+ function onChange(sessionId) {
30104
+ if (sessionId && sessionId !== props.activeSessionId) emit2("select", sessionId);
30105
+ }
30106
+ return (_ctx, _cache) => {
30107
+ return openBlock(), createBlock(unref(FormInput), {
30108
+ select: "",
30109
+ "full-width": "",
30110
+ field: field.value,
30111
+ options: options.value,
30112
+ "model-value": __props.activeSessionId ?? "",
30113
+ "onUpdate:modelValue": onChange
30114
+ }, null, 8, ["field", "options", "model-value"]);
30115
+ };
30116
+ }
30117
+ });
29840
30118
  const _hoisted_1$3 = {
29841
30119
  key: 0,
29842
30120
  class: "chat-message chat-message--user"
@@ -30019,6 +30297,7 @@ section.turn:has([data-state="open"]) {
30019
30297
  class: "chat-composer__textarea",
30020
30298
  placeholder: unref(t2)("chat.placeholder"),
30021
30299
  disabled: __props.disabled,
30300
+ enterkeyhint: "send",
30022
30301
  rows: "2",
30023
30302
  ref: "chat-composer__textarea",
30024
30303
  onKeydown
@@ -30037,8 +30316,8 @@ section.turn:has([data-state="open"]) {
30037
30316
  };
30038
30317
  }
30039
30318
  });
30040
- 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";
30041
- const ChatComposer = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["styles", [_style_0$1]], ["__scopeId", "data-v-05dbe7e6"]]);
30319
+ 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";
30320
+ const ChatComposer = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["styles", [_style_0$1]], ["__scopeId", "data-v-037fb976"]]);
30042
30321
  const _hoisted_1 = ["aria-labelledby"];
30043
30322
  const _hoisted_2 = { class: "chat-drawer__header" };
30044
30323
  const _hoisted_3 = ["id"];
@@ -30050,6 +30329,7 @@ section.turn:has([data-state="open"]) {
30050
30329
  setup(__props) {
30051
30330
  const core = useCore();
30052
30331
  const { t: t2 } = useI18n();
30332
+ const { isMobile } = useIsMobile();
30053
30333
  const chat = core.chat;
30054
30334
  const titleId = useId$1();
30055
30335
  const expanded = /* @__PURE__ */ ref(false);
@@ -30099,7 +30379,7 @@ section.turn:has([data-state="open"]) {
30099
30379
  onClick: withModifiers(close, ["self"])
30100
30380
  }, [
30101
30381
  createBaseVNode("aside", {
30102
- class: normalizeClass(["chat-drawer", { "chat-drawer--expanded": expanded.value }]),
30382
+ class: normalizeClass(["chat-drawer", { "chat-drawer--expanded": expanded.value && !unref(isMobile) }]),
30103
30383
  role: "dialog",
30104
30384
  "aria-modal": "true",
30105
30385
  "aria-labelledby": unref(titleId)
@@ -30107,23 +30387,37 @@ section.turn:has([data-state="open"]) {
30107
30387
  createBaseVNode("header", _hoisted_2, [
30108
30388
  createBaseVNode("h2", {
30109
30389
  id: unref(titleId),
30110
- class: "chat-drawer__title"
30390
+ class: normalizeClass(["chat-drawer__title", { "transcript-ui-sr-only": unref(isMobile) }])
30111
30391
  }, [
30112
30392
  createVNode(unref(EditorIcon), {
30113
30393
  name: "sparkles",
30114
30394
  size: 18
30115
30395
  }),
30116
30396
  createTextVNode(" " + toDisplayString(unref(t2)("chat.title")), 1)
30117
- ], 8, _hoisted_3),
30397
+ ], 10, _hoisted_3),
30398
+ unref(isMobile) ? (openBlock(), createBlock(_sfc_main$4, {
30399
+ key: 0,
30400
+ class: "chat-drawer__session-select",
30401
+ sessions: unref(chat).sessions.value,
30402
+ "active-session-id": unref(chat).activeSessionId.value,
30403
+ onSelect
30404
+ }, null, 8, ["sessions", "active-session-id"])) : createCommentVNode("", true),
30118
30405
  createBaseVNode("div", _hoisted_4, [
30119
- createVNode(unref(Button), {
30120
- class: "chat-drawer__expand",
30406
+ unref(isMobile) ? (openBlock(), createBlock(unref(Button), {
30407
+ key: 0,
30408
+ icon: "plus",
30409
+ variant: "tertiary",
30410
+ size: "sm",
30411
+ "aria-label": unref(t2)("chat.newChat"),
30412
+ onClick: onCreate
30413
+ }, null, 8, ["aria-label"])) : (openBlock(), createBlock(unref(Button), {
30414
+ key: 1,
30121
30415
  icon: expanded.value ? "minimize" : "maximize",
30122
30416
  variant: "tertiary",
30123
30417
  size: "sm",
30124
30418
  "aria-label": expanded.value ? unref(t2)("chat.collapse") : unref(t2)("chat.expand"),
30125
30419
  onClick: toggleExpanded
30126
- }, null, 8, ["icon", "aria-label"]),
30420
+ }, null, 8, ["icon", "aria-label"])),
30127
30421
  createVNode(unref(Button), {
30128
30422
  icon: "x",
30129
30423
  variant: "tertiary",
@@ -30134,14 +30428,15 @@ section.turn:has([data-state="open"]) {
30134
30428
  ])
30135
30429
  ]),
30136
30430
  createBaseVNode("div", _hoisted_5, [
30137
- createVNode(ChatSessionList, {
30431
+ !unref(isMobile) ? (openBlock(), createBlock(ChatSessionList, {
30432
+ key: 0,
30138
30433
  sessions: unref(chat).sessions.value,
30139
30434
  "active-session-id": unref(chat).activeSessionId.value,
30140
30435
  onSelect,
30141
30436
  onCreate,
30142
30437
  onRename,
30143
30438
  onDelete
30144
- }, null, 8, ["sessions", "active-session-id"]),
30439
+ }, null, 8, ["sessions", "active-session-id"])) : createCommentVNode("", true),
30145
30440
  createBaseVNode("div", _hoisted_6, [
30146
30441
  createVNode(ChatMessageList, {
30147
30442
  messages: unref(chat).allMessages.value,
@@ -30162,8 +30457,8 @@ section.turn:has([data-state="open"]) {
30162
30457
  };
30163
30458
  }
30164
30459
  });
30165
- 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";
30166
- const ChatDrawer = /* @__PURE__ */ _export_sfc(_sfc_main, [["styles", [_style_0]], ["__scopeId", "data-v-673d2314"]]);
30460
+ 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";
30461
+ const ChatDrawer = /* @__PURE__ */ _export_sfc(_sfc_main, [["styles", [_style_0]], ["__scopeId", "data-v-25f4e0cf"]]);
30167
30462
  const STREAMING_MESSAGE_ID = "__streaming__";
30168
30463
  function createChatPlugin() {
30169
30464
  return {
@@ -31006,11 +31301,11 @@ section.turn:has([data-state="open"]) {
31006
31301
  }
31007
31302
  var patterns = grammar[token];
31008
31303
  patterns = Array.isArray(patterns) ? patterns : [patterns];
31009
- for (var j2 = 0; j2 < patterns.length; ++j2) {
31010
- if (rematch && rematch.cause == token + "," + j2) {
31304
+ for (var j = 0; j < patterns.length; ++j) {
31305
+ if (rematch && rematch.cause == token + "," + j) {
31011
31306
  return;
31012
31307
  }
31013
- var patternObj = patterns[j2];
31308
+ var patternObj = patterns[j];
31014
31309
  var inside = patternObj.inside;
31015
31310
  var lookbehind = !!patternObj.lookbehind;
31016
31311
  var greedy = !!patternObj.greedy;
@@ -31051,9 +31346,9 @@ section.turn:has([data-state="open"]) {
31051
31346
  if (currentNode.value instanceof Token) {
31052
31347
  continue;
31053
31348
  }
31054
- for (var k2 = currentNode; k2 !== tokenList.tail && (p2 < to || typeof k2.value === "string"); k2 = k2.next) {
31349
+ for (var k = currentNode; k !== tokenList.tail && (p2 < to || typeof k.value === "string"); k = k.next) {
31055
31350
  removeCount++;
31056
- p2 += k2.value.length;
31351
+ p2 += k.value.length;
31057
31352
  }
31058
31353
  removeCount--;
31059
31354
  str = text2.slice(pos, p2);
@@ -31085,7 +31380,7 @@ section.turn:has([data-state="open"]) {
31085
31380
  }
31086
31381
  if (removeCount > 1) {
31087
31382
  var nestedRematch = {
31088
- cause: token + "," + j2,
31383
+ cause: token + "," + j,
31089
31384
  reach
31090
31385
  };
31091
31386
  matchGrammar(text2, tokenList, grammar, currentNode.prev, pos, nestedRematch);