@linto-ai/transcript-ui-webcomponent 0.9.14 → 0.9.16

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.
@@ -9760,6 +9760,10 @@ var LintoEditor = (function(exports) {
9760
9760
  ["path", { d: "M3 16h3a2 2 0 0 1 2 2v3", key: "198tvr" }],
9761
9761
  ["path", { d: "M16 21v-3a2 2 0 0 1 2-2h3", key: "ph8mxp" }]
9762
9762
  ]);
9763
+ const PanelRight = createLucideIcon("panel-right", [
9764
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
9765
+ ["path", { d: "M15 3v18", key: "14nvp0" }]
9766
+ ]);
9763
9767
  const Pause = createLucideIcon("pause", [
9764
9768
  ["rect", { x: "14", y: "3", width: "5", height: "18", rx: "1", key: "kaeet6" }],
9765
9769
  ["rect", { x: "5", y: "3", width: "5", height: "18", rx: "1", key: "1wsw3u" }]
@@ -9988,7 +9992,8 @@ var LintoEditor = (function(exports) {
9988
9992
  "file-text": FileText,
9989
9993
  "message-circle": MessageCircle,
9990
9994
  "refresh-cw": RefreshCw,
9991
- sparkles: Sparkles
9995
+ sparkles: Sparkles,
9996
+ "panel-right": PanelRight
9992
9997
  };
9993
9998
  function resolveIcon(name) {
9994
9999
  if (!name) return void 0;
@@ -10256,6 +10261,7 @@ var LintoEditor = (function(exports) {
10256
10261
  "tabs.moreSelect": "Sélectionner…",
10257
10262
  "llmService.regenerate": "Régénérer",
10258
10263
  "llmService.download": "Télécharger",
10264
+ "llmService.split": "Afficher le verbatim à côté",
10259
10265
  "llmService.generated": "Généré par IA",
10260
10266
  "llmService.processing": "Génération en cours…",
10261
10267
  "llmService.queued": "En file d'attente…",
@@ -10393,6 +10399,7 @@ var LintoEditor = (function(exports) {
10393
10399
  "tabs.moreSelect": "Select…",
10394
10400
  "llmService.regenerate": "Regenerate",
10395
10401
  "llmService.download": "Download",
10402
+ "llmService.split": "Show verbatim alongside",
10396
10403
  "llmService.generated": "AI-generated",
10397
10404
  "llmService.processing": "Generating…",
10398
10405
  "llmService.queued": "Queued…",
@@ -10489,7 +10496,7 @@ var LintoEditor = (function(exports) {
10489
10496
  }
10490
10497
  const _hoisted_1$E = { class: "code-block" };
10491
10498
  const _hoisted_2$u = ["innerHTML"];
10492
- const _hoisted_3$o = { key: 1 };
10499
+ const _hoisted_3$n = { key: 1 };
10493
10500
  const _sfc_main$K = /* @__PURE__ */ defineComponent({
10494
10501
  __name: "CodeBlock",
10495
10502
  props: {
@@ -10532,7 +10539,7 @@ var LintoEditor = (function(exports) {
10532
10539
  highlighted.value ? (openBlock(), createElementBlock("code", {
10533
10540
  key: 0,
10534
10541
  innerHTML: highlighted.value
10535
- }, null, 8, _hoisted_2$u)) : (openBlock(), createElementBlock("code", _hoisted_3$o, toDisplayString(__props.code), 1))
10542
+ }, null, 8, _hoisted_2$u)) : (openBlock(), createElementBlock("code", _hoisted_3$n, toDisplayString(__props.code), 1))
10536
10543
  ])
10537
10544
  ]);
10538
10545
  };
@@ -10670,7 +10677,7 @@ pre[class*="language-"] {
10670
10677
  class: "form-field__header"
10671
10678
  };
10672
10679
  const _hoisted_2$t = ["for"];
10673
- const _hoisted_3$n = {
10680
+ const _hoisted_3$m = {
10674
10681
  key: 0,
10675
10682
  class: "form-field__required",
10676
10683
  "aria-hidden": "true"
@@ -10806,7 +10813,7 @@ pre[class*="language-"] {
10806
10813
  for: id.value
10807
10814
  }, [
10808
10815
  createTextVNode(toDisplayString(__props.field.label) + " ", 1),
10809
- isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$n, "*")) : createCommentVNode("", true)
10816
+ isRequired.value ? (openBlock(), createElementBlock("span", _hoisted_3$m, "*")) : createCommentVNode("", true)
10810
10817
  ], 8, _hoisted_2$t),
10811
10818
  renderSlot(_ctx.$slots, "content-after-label", {}, void 0, true)
10812
10819
  ])) : createCommentVNode("", true),
@@ -21143,7 +21150,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21143
21150
  }
21144
21151
  const _hoisted_1$A = { class: "markdown-editor" };
21145
21152
  const _hoisted_2$s = ["aria-label"];
21146
- const _hoisted_3$m = ["contenteditable"];
21153
+ const _hoisted_3$l = ["contenteditable"];
21147
21154
  const _sfc_main$G = /* @__PURE__ */ defineComponent({
21148
21155
  __name: "MarkdownEditor",
21149
21156
  props: {
@@ -21486,13 +21493,13 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21486
21493
  onPaste,
21487
21494
  onFocus: startSelectionListener,
21488
21495
  onBlur: stopSelectionListener
21489
- }, null, 40, _hoisted_3$m)
21496
+ }, null, 40, _hoisted_3$l)
21490
21497
  ]);
21491
21498
  };
21492
21499
  }
21493
21500
  });
21494
- const _style_0$y = "\n.markdown-editor[data-v-e5fdd0e6] {\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-e5fdd0e6] {\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: 0;\n z-index: 1;\n}\n.markdown-editor__separator[data-v-e5fdd0e6] {\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-e5fdd0e6] {\n padding: var(--spacing-md) var(--spacing-md);\n outline: none;\n min-height: 200px;\n}\n.markdown-editor__content[data-v-e5fdd0e6] > *:first-child {\n margin-top: 0;\n}\n.markdown-editor__content[data-v-e5fdd0e6] h1,\n.markdown-editor__content[data-v-e5fdd0e6] h2,\n.markdown-editor__content[data-v-e5fdd0e6] h3,\n.markdown-editor__content[data-v-e5fdd0e6] 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-e5fdd0e6] h1 {\n font-size: var(--font-size-xl);\n}\n.markdown-editor__content[data-v-e5fdd0e6] h2 {\n font-size: var(--font-size-lg);\n}\n.markdown-editor__content[data-v-e5fdd0e6] h3 {\n font-size: var(--font-size-base);\n}\n.markdown-editor__content[data-v-e5fdd0e6] 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-e5fdd0e6] p {\n margin: 0 0 var(--spacing-md);\n}\n.markdown-editor__content[data-v-e5fdd0e6] ul,\n.markdown-editor__content[data-v-e5fdd0e6] ol {\n margin: 0 0 var(--spacing-md);\n padding-left: var(--spacing-lg);\n}\n.markdown-editor__content[data-v-e5fdd0e6] li {\n margin: var(--spacing-xs) 0;\n}\n.markdown-editor__content[data-v-e5fdd0e6] 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-e5fdd0e6] 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-e5fdd0e6] 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-e5fdd0e6] pre code {\n padding: 0;\n background: none;\n}\n.markdown-editor__content[data-v-e5fdd0e6] a {\n color: var(--color-primary);\n text-decoration: underline;\n}\n.markdown-editor__content[data-v-e5fdd0e6] 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-e5fdd0e6] strong {\n font-weight: 700;\n}\n.markdown-editor__content[data-v-e5fdd0e6] table {\n border-collapse: collapse;\n margin: var(--spacing-md) 0;\n}\n.markdown-editor__content[data-v-e5fdd0e6] th,\n.markdown-editor__content[data-v-e5fdd0e6] td {\n border: 1px solid var(--color-border);\n padding: var(--spacing-xs) var(--spacing-sm);\n}\n.markdown-editor__content[data-v-e5fdd0e6] th {\n background-color: var(--color-surface);\n font-weight: 600;\n}\n";
21495
- const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["styles", [_style_0$y]], ["__scopeId", "data-v-e5fdd0e6"]]);
21501
+ 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";
21502
+ const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["styles", [_style_0$y]], ["__scopeId", "data-v-b3d64419"]]);
21496
21503
  const _hoisted_1$z = { class: "markdown-view" };
21497
21504
  const _hoisted_2$r = ["innerHTML"];
21498
21505
  const _sfc_main$F = /* @__PURE__ */ defineComponent({
@@ -21534,7 +21541,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21534
21541
  key: 0,
21535
21542
  class: "transcript-ui-popover-list__divider"
21536
21543
  };
21537
- const _hoisted_3$l = { class: "transcript-ui-popover-list__footer" };
21544
+ const _hoisted_3$k = { class: "transcript-ui-popover-list__footer" };
21538
21545
  const _sfc_main$E = /* @__PURE__ */ defineComponent({
21539
21546
  __name: "PopoverList",
21540
21547
  props: {
@@ -21605,7 +21612,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21605
21612
  ])) : createCommentVNode("", true),
21606
21613
  _ctx.$slots.footer ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
21607
21614
  __props.items.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$q)) : createCommentVNode("", true),
21608
- createBaseVNode("div", _hoisted_3$l, [
21615
+ createBaseVNode("div", _hoisted_3$k, [
21609
21616
  renderSlot(_ctx.$slots, "footer")
21610
21617
  ])
21611
21618
  ], 64)) : createCommentVNode("", true)
@@ -21626,7 +21633,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21626
21633
  key: 0,
21627
21634
  class: "selectable-list-item__leading"
21628
21635
  };
21629
- const _hoisted_3$k = { class: "selectable-list-item__label" };
21636
+ const _hoisted_3$j = { class: "selectable-list-item__label" };
21630
21637
  const _hoisted_4$b = {
21631
21638
  key: 1,
21632
21639
  class: "selectable-list-item__trailing"
@@ -21663,7 +21670,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21663
21670
  _ctx.$slots.leading ? (openBlock(), createElementBlock("span", _hoisted_2$p, [
21664
21671
  renderSlot(_ctx.$slots, "leading", {}, void 0, true)
21665
21672
  ])) : createCommentVNode("", true),
21666
- createBaseVNode("span", _hoisted_3$k, [
21673
+ createBaseVNode("span", _hoisted_3$j, [
21667
21674
  renderSlot(_ctx.$slots, "default", {}, () => [
21668
21675
  createTextVNode(toDisplayString(__props.label), 1)
21669
21676
  ], true)
@@ -21700,7 +21707,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21700
21707
  const SpeakerIndicator = /* @__PURE__ */ _export_sfc(_sfc_main$C, [["styles", [_style_0$v]], ["__scopeId", "data-v-324978c0"]]);
21701
21708
  const _hoisted_1$w = { class: "switch" };
21702
21709
  const _hoisted_2$o = ["id", "checked", "disabled"];
21703
- const _hoisted_3$j = ["for"];
21710
+ const _hoisted_3$i = ["for"];
21704
21711
  const _sfc_main$B = /* @__PURE__ */ defineComponent({
21705
21712
  __name: "SwitchToggle",
21706
21713
  props: {
@@ -21724,7 +21731,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21724
21731
  }, null, 40, _hoisted_2$o),
21725
21732
  createBaseVNode("label", { for: unref(inputId) }, [..._cache[1] || (_cache[1] = [
21726
21733
  createBaseVNode("div", { class: "switch-slider" }, null, -1)
21727
- ])], 8, _hoisted_3$j)
21734
+ ])], 8, _hoisted_3$i)
21728
21735
  ]);
21729
21736
  };
21730
21737
  }
@@ -21765,7 +21772,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21765
21772
  class: "document-article__toolbar",
21766
21773
  role: "toolbar"
21767
21774
  };
21768
- const _hoisted_3$i = { class: "document-article__toolbar-left" };
21775
+ const _hoisted_3$h = { class: "document-article__toolbar-left" };
21769
21776
  const _hoisted_4$a = { class: "document-article__toolbar-center" };
21770
21777
  const _hoisted_5$9 = { class: "document-article__toolbar-right" };
21771
21778
  const _hoisted_6$8 = { class: "document-article__body" };
@@ -21812,7 +21819,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21812
21819
  "data-status": props.status
21813
21820
  }, [
21814
21821
  _ctx.$slots["toolbar-left"] || _ctx.$slots["toolbar-center"] || _ctx.$slots["toolbar-right"] ? (openBlock(), createElementBlock("div", _hoisted_2$n, [
21815
- createBaseVNode("div", _hoisted_3$i, [
21822
+ createBaseVNode("div", _hoisted_3$h, [
21816
21823
  renderSlot(_ctx.$slots, "toolbar-left", {}, void 0, true)
21817
21824
  ]),
21818
21825
  createBaseVNode("div", _hoisted_4$a, [
@@ -21853,8 +21860,8 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21853
21860
  };
21854
21861
  }
21855
21862
  });
21856
- const _style_0$s = "\n.document-article[data-v-c606ad2f] {\n width: 100%;\n max-width: 760px;\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-c606ad2f] {\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-c606ad2f],\n.document-article__toolbar-right[data-v-c606ad2f] {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-shrink: 0;\n}\n.document-article__toolbar-center[data-v-c606ad2f] {\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-c606ad2f] {\n flex: 1;\n min-height: 0;\n}\n.document-article__center[data-v-c606ad2f] {\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-c606ad2f] {\n color: var(--color-primary);\n}\n.document-article__center--error[data-v-c606ad2f] {\n color: var(--color-danger, #d33);\n}\n.document-article__progress[data-v-c606ad2f] {\n width: min(280px, 100%);\n height: 6px;\n}\n.document-article__progress-value[data-v-c606ad2f] {\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-c606ad2f] {\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";
21857
- const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["styles", [_style_0$s]], ["__scopeId", "data-v-c606ad2f"]]);
21863
+ 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";
21864
+ const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["styles", [_style_0$s]], ["__scopeId", "data-v-e3f4ca33"]]);
21858
21865
  const _sfc_main$y = /* @__PURE__ */ defineComponent({
21859
21866
  __name: "DownloadMenu",
21860
21867
  props: {
@@ -21935,7 +21942,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21935
21942
  });
21936
21943
  const _hoisted_1$t = ["aria-label"];
21937
21944
  const _hoisted_2$m = ["aria-selected", "aria-disabled", "disabled", "onClick"];
21938
- const _hoisted_3$h = { class: "tab__label" };
21945
+ const _hoisted_3$g = { class: "tab__label" };
21939
21946
  const _sfc_main$w = /* @__PURE__ */ defineComponent({
21940
21947
  __name: "Tabs",
21941
21948
  props: {
@@ -21975,7 +21982,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
21975
21982
  size: 16,
21976
21983
  class: "tab__icon"
21977
21984
  }, null, 8, ["name"])) : createCommentVNode("", true),
21978
- createBaseVNode("span", _hoisted_3$h, toDisplayString(tab.label), 1),
21985
+ createBaseVNode("span", _hoisted_3$g, toDisplayString(tab.label), 1),
21979
21986
  tab.badge ? (openBlock(), createBlock(Badge, {
21980
21987
  key: 1,
21981
21988
  class: "tab__badge"
@@ -22112,7 +22119,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22112
22119
  const TurnTextEditor = /* @__PURE__ */ _export_sfc(_sfc_main$v, [["styles", [_style_0$q]], ["__scopeId", "data-v-597e2575"]]);
22113
22120
  const _hoisted_1$r = { class: "editor-header" };
22114
22121
  const _hoisted_2$l = { class: "header-main" };
22115
- const _hoisted_3$g = { class: "document-title" };
22122
+ const _hoisted_3$f = { class: "document-title" };
22116
22123
  const _hoisted_4$9 = {
22117
22124
  key: 0,
22118
22125
  class: "document-meta"
@@ -22155,7 +22162,7 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
22155
22162
  return (_ctx, _cache) => {
22156
22163
  return openBlock(), createElementBlock("header", _hoisted_1$r, [
22157
22164
  createBaseVNode("div", _hoisted_2$l, [
22158
- createBaseVNode("h1", _hoisted_3$g, toDisplayString(formattedTitle.value), 1),
22165
+ createBaseVNode("h1", _hoisted_3$f, toDisplayString(formattedTitle.value), 1),
22159
22166
  metaParts.value.length ? (openBlock(), createElementBlock("div", _hoisted_4$9, [
22160
22167
  (openBlock(true), createElementBlock(Fragment, null, renderList(metaParts.value, (part, i2) => {
22161
22168
  return openBlock(), createElementBlock("span", {
@@ -23166,7 +23173,7 @@ ${text2}` : text2;
23166
23173
  key: 4,
23167
23174
  class: "turn-edit-actions"
23168
23175
  };
23169
- const _hoisted_3$f = ["role", "tabindex", "aria-label", "aria-disabled"];
23176
+ const _hoisted_3$e = ["role", "tabindex", "aria-label", "aria-disabled"];
23170
23177
  const _hoisted_4$8 = ["data-word-active"];
23171
23178
  const _sfc_main$p = /* @__PURE__ */ defineComponent({
23172
23179
  __name: "TranscriptionTurn",
@@ -23410,7 +23417,7 @@ ${text2}` : text2;
23410
23417
  }), 128)) : __props.turn.text ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
23411
23418
  createTextVNode(toDisplayString(__props.turn.text), 1)
23412
23419
  ], 64)) : createCommentVNode("", true)
23413
- ], 42, _hoisted_3$f))
23420
+ ], 42, _hoisted_3$e))
23414
23421
  ], 14, _hoisted_1$m);
23415
23422
  };
23416
23423
  }
@@ -23585,7 +23592,7 @@ ${text2}` : text2;
23585
23592
  ref: "scrollContainer",
23586
23593
  class: "scroll-container"
23587
23594
  };
23588
- const _hoisted_3$e = { class: "turns-container" };
23595
+ const _hoisted_3$d = { class: "turns-container" };
23589
23596
  const _hoisted_4$7 = {
23590
23597
  key: 0,
23591
23598
  class: "history-loading",
@@ -23694,7 +23701,7 @@ ${text2}` : text2;
23694
23701
  return (_ctx, _cache) => {
23695
23702
  return openBlock(), createElementBlock("article", _hoisted_1$j, [
23696
23703
  createBaseVNode("div", _hoisted_2$g, [
23697
- createBaseVNode("div", _hoisted_3$e, [
23704
+ createBaseVNode("div", _hoisted_3$d, [
23698
23705
  isLoadingHistory.value ? (openBlock(), createElementBlock("div", _hoisted_4$7, [..._cache[2] || (_cache[2] = [
23699
23706
  createBaseVNode("progress", null, null, -1)
23700
23707
  ])])) : createCommentVNode("", true),
@@ -23755,7 +23762,7 @@ ${text2}` : text2;
23755
23762
  const TranscriptionPanel = /* @__PURE__ */ _export_sfc(_sfc_main$m, [["styles", [_style_0$j]], ["__scopeId", "data-v-7f4303ed"]]);
23756
23763
  const _hoisted_1$i = { class: "verbatim-panel" };
23757
23764
  const _hoisted_2$f = { class: "verbatim-panel__content" };
23758
- const _hoisted_3$d = { class: "verbatim-panel__header" };
23765
+ const _hoisted_3$c = { class: "verbatim-panel__header" };
23759
23766
  const _hoisted_4$6 = { class: "verbatim-panel__doc-title" };
23760
23767
  const _hoisted_5$6 = { class: "verbatim-panel__turns" };
23761
23768
  const _hoisted_6$6 = { class: "verbatim-panel__turn-header" };
@@ -23825,7 +23832,7 @@ ${text2}` : text2;
23825
23832
  ]),
23826
23833
  default: withCtx(() => [
23827
23834
  createBaseVNode("article", _hoisted_2$f, [
23828
- createBaseVNode("header", _hoisted_3$d, [
23835
+ createBaseVNode("header", _hoisted_3$c, [
23829
23836
  createBaseVNode("h1", _hoisted_4$6, toDisplayString(title.value), 1)
23830
23837
  ]),
23831
23838
  createBaseVNode("ul", _hoisted_5$6, [
@@ -23863,8 +23870,8 @@ ${text2}` : text2;
23863
23870
  };
23864
23871
  }
23865
23872
  });
23866
- const _style_0$i = "\n.verbatim-panel[data-v-86e548c0] {\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-86e548c0] {\n padding: var(--spacing-md) var(--spacing-lg);\n}\n.verbatim-panel__header[data-v-86e548c0] {\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-86e548c0] {\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-86e548c0] {\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-86e548c0] {\n display: block;\n}\n.verbatim-panel__turn-header[data-v-86e548c0] {\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-86e548c0] {\n font-weight: 700;\n color: var(--color-text-primary);\n}\n.verbatim-panel__meta[data-v-86e548c0] {\n color: var(--color-text-muted);\n font-weight: 400;\n}\n.verbatim-panel__sep[data-v-86e548c0] {\n margin: 0 0.35em;\n}\n.verbatim-panel__text[data-v-86e548c0] {\n margin: 0;\n font-size: var(--font-size-base);\n line-height: 1.6;\n color: var(--color-text-primary);\n}\n@media (max-width: 767px) {\n.verbatim-panel[data-v-86e548c0] {\n padding: var(--spacing-md);\n}\n}\n";
23867
- const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["styles", [_style_0$i]], ["__scopeId", "data-v-86e548c0"]]);
23873
+ 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";
23874
+ const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["styles", [_style_0$i]], ["__scopeId", "data-v-4bbe16ed"]]);
23868
23875
  const _sfc_main$k = /* @__PURE__ */ defineComponent({
23869
23876
  __name: "ChannelSelector",
23870
23877
  props: {
@@ -23925,7 +23932,7 @@ ${text2}` : text2;
23925
23932
  });
23926
23933
  const _hoisted_1$h = { class: "merge-dialog-title" };
23927
23934
  const _hoisted_2$e = { class: "merge-dialog-description" };
23928
- const _hoisted_3$c = { class: "merge-dialog-actions" };
23935
+ const _hoisted_3$b = { class: "merge-dialog-actions" };
23929
23936
  const _sfc_main$i = /* @__PURE__ */ defineComponent({
23930
23937
  __name: "MergeDialog",
23931
23938
  props: {
@@ -24006,7 +24013,7 @@ ${text2}` : text2;
24006
24013
  modelValue: targetId.value,
24007
24014
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => targetId.value = $event)
24008
24015
  }, null, 8, ["field", "options", "modelValue"]),
24009
- createBaseVNode("div", _hoisted_3$c, [
24016
+ createBaseVNode("div", _hoisted_3$b, [
24010
24017
  createVNode(unref(Button), {
24011
24018
  variant: "tertiary",
24012
24019
  type: "button",
@@ -24040,7 +24047,7 @@ ${text2}` : text2;
24040
24047
  key: 0,
24041
24048
  class: "sidebar-section sidebar-section--selector"
24042
24049
  };
24043
- const _hoisted_3$b = { class: "sidebar-title" };
24050
+ const _hoisted_3$a = { class: "sidebar-title" };
24044
24051
  const _hoisted_4$5 = {
24045
24052
  key: 1,
24046
24053
  class: "sidebar-section sidebar-section--selector"
@@ -24175,7 +24182,7 @@ ${text2}` : text2;
24175
24182
  return (_ctx, _cache) => {
24176
24183
  return openBlock(), createElementBlock("aside", _hoisted_1$g, [
24177
24184
  __props.channels.length > 1 ? (openBlock(), createElementBlock("section", _hoisted_2$d, [
24178
- createBaseVNode("h2", _hoisted_3$b, toDisplayString(unref(t2)("sidebar.channel")), 1),
24185
+ createBaseVNode("h2", _hoisted_3$a, toDisplayString(unref(t2)("sidebar.channel")), 1),
24179
24186
  createVNode(_sfc_main$k, {
24180
24187
  channels: __props.channels,
24181
24188
  "selected-channel-id": __props.selectedChannelId,
@@ -24401,7 +24408,7 @@ ${text2}` : text2;
24401
24408
  });
24402
24409
  const _hoisted_1$f = ["aria-label"];
24403
24410
  const _hoisted_2$c = { class: "selection-count" };
24404
- const _hoisted_3$a = { class: "selection-actions" };
24411
+ const _hoisted_3$9 = { class: "selection-actions" };
24405
24412
  const _sfc_main$f = /* @__PURE__ */ defineComponent({
24406
24413
  __name: "SelectionActionBar",
24407
24414
  setup(__props) {
@@ -24415,7 +24422,7 @@ ${text2}` : text2;
24415
24422
  "aria-label": unref(t2)("selection.count")
24416
24423
  }, [
24417
24424
  createBaseVNode("span", _hoisted_2$c, toDisplayString(unref(selection).count.value) + " " + toDisplayString(unref(t2)("selection.count")), 1),
24418
- createBaseVNode("div", _hoisted_3$a, [
24425
+ createBaseVNode("div", _hoisted_3$9, [
24419
24426
  createVNode(unref(CopyButton), {
24420
24427
  icon: "clipboard-type",
24421
24428
  "copy-fn": unref(selection).copyText,
@@ -24470,8 +24477,7 @@ ${text2}` : text2;
24470
24477
  return { isMobile };
24471
24478
  }
24472
24479
  const _hoisted_1$e = { class: "editor-layout" };
24473
- const _hoisted_2$b = { class: "editor-body" };
24474
- const _hoisted_3$9 = {
24480
+ const _hoisted_2$b = {
24475
24481
  key: 6,
24476
24482
  class: "mobile-selectors"
24477
24483
  };
@@ -24485,7 +24491,22 @@ ${text2}` : text2;
24485
24491
  const core = useCore();
24486
24492
  const { isMobile } = useIsMobile();
24487
24493
  const isSidebarOpen = /* @__PURE__ */ ref(false);
24488
- const activeTab = /* @__PURE__ */ ref(TRANSCRIPTION_TAB);
24494
+ const shownPanels = /* @__PURE__ */ ref([TRANSCRIPTION_TAB]);
24495
+ const activeTab = computed(() => shownPanels.value[0] ?? TRANSCRIPTION_TAB);
24496
+ const isSplit = computed({
24497
+ get: () => shownPanels.value.length > 1,
24498
+ set: (value) => {
24499
+ shownPanels.value = value ? [...shownPanels.value, VERBATIM_TAB] : shownPanels.value.filter((id) => id !== VERBATIM_TAB);
24500
+ }
24501
+ });
24502
+ const panels = computed(
24503
+ () => shownPanels.value.map((id) => {
24504
+ if (id === TRANSCRIPTION_TAB) return { id, kind: "transcription" };
24505
+ if (id === VERBATIM_TAB) return { id, kind: "verbatim" };
24506
+ const service = core.llmServices?.get(id);
24507
+ return service ? { id, kind: "service", service } : { id, kind: "transcription" };
24508
+ })
24509
+ );
24489
24510
  const activeTurns = computed(
24490
24511
  () => core.activeChannel.value?.activeTranslation.value.turns.value ?? []
24491
24512
  );
@@ -24500,11 +24521,6 @@ ${text2}` : text2;
24500
24521
  );
24501
24522
  const speakerList = computed(() => Array.from(speakers.values()));
24502
24523
  const showTranscription = computed(() => activeTab.value === TRANSCRIPTION_TAB);
24503
- const showVerbatim = computed(() => activeTab.value === VERBATIM_TAB);
24504
- const activeService = computed(() => {
24505
- if (showTranscription.value || showVerbatim.value) return null;
24506
- return core.llmServices?.get(activeTab.value) ?? null;
24507
- });
24508
24524
  watch(activeTab, (id) => {
24509
24525
  if (!core.llmServices) return;
24510
24526
  if (id === TRANSCRIPTION_TAB || id === VERBATIM_TAB) {
@@ -24517,7 +24533,7 @@ ${text2}` : text2;
24517
24533
  () => core.llmServices?.list.value.map((s2) => s2.id).join("|"),
24518
24534
  () => {
24519
24535
  if (activeTab.value !== TRANSCRIPTION_TAB && activeTab.value !== VERBATIM_TAB && !core.llmServices?.get(activeTab.value)) {
24520
- activeTab.value = TRANSCRIPTION_TAB;
24536
+ shownPanels.value = [TRANSCRIPTION_TAB];
24521
24537
  }
24522
24538
  }
24523
24539
  );
@@ -24559,25 +24575,35 @@ ${text2}` : text2;
24559
24575
  onRedo: _cache[3] || (_cache[3] = ($event) => unref(core).transcriptionEditor?.redo())
24560
24576
  }, null, 8, ["title", "date", "duration", "speaker-count", "is-mobile", "can-ask", "can-undo", "can-redo"])) : createCommentVNode("", true),
24561
24577
  createVNode(_sfc_main$t, {
24562
- modelValue: activeTab.value,
24563
- "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => activeTab.value = $event)
24564
- }, null, 8, ["modelValue"]),
24578
+ "model-value": activeTab.value,
24579
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = (tab) => shownPanels.value = [tab])
24580
+ }, null, 8, ["model-value"]),
24565
24581
  showTranscription.value ? (openBlock(), createBlock(SelectionActionBar, { key: 1 })) : createCommentVNode("", true),
24566
- createBaseVNode("main", _hoisted_2$b, [
24567
- showTranscription.value ? (openBlock(), createBlock(TranscriptionPanel, {
24582
+ createBaseVNode("main", {
24583
+ class: normalizeClass(["editor-body", { "editor-body--no-sidebar": panels.value.length > 1 }])
24584
+ }, [
24585
+ createBaseVNode("div", {
24586
+ class: normalizeClass(["editor-body__panels", { "editor-body__panels--split": panels.value.length > 1 }])
24587
+ }, [
24588
+ (openBlock(true), createElementBlock(Fragment, null, renderList(panels.value, (panel) => {
24589
+ return openBlock(), createElementBlock(Fragment, {
24590
+ key: panel.id
24591
+ }, [
24592
+ panel.kind === "transcription" ? (openBlock(), createBlock(TranscriptionPanel, {
24593
+ key: 0,
24594
+ turns: activeTurns.value,
24595
+ speakers: unref(speakers)
24596
+ }, null, 8, ["turns", "speakers"])) : panel.kind === "verbatim" ? (openBlock(), createBlock(VerbatimPanel, { key: 1 })) : (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.llmServicePanel), {
24597
+ key: 2,
24598
+ service: panel.service,
24599
+ split: isSplit.value,
24600
+ "onUpdate:split": _cache[5] || (_cache[5] = ($event) => isSplit.value = $event)
24601
+ }, null, 40, ["service", "split"]))
24602
+ ], 64);
24603
+ }), 128))
24604
+ ], 2),
24605
+ !unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(SpeakerSidebar, {
24568
24606
  key: 0,
24569
- turns: activeTurns.value,
24570
- speakers: unref(speakers)
24571
- }, null, 8, ["turns", "speakers"])) : showVerbatim.value ? (openBlock(), createBlock(VerbatimPanel, { key: 1 })) : activeService.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.llmServicePanel), {
24572
- key: activeService.value.id,
24573
- service: activeService.value
24574
- }, null, 8, ["service"])) : (openBlock(), createBlock(TranscriptionPanel, {
24575
- key: 3,
24576
- turns: activeTurns.value,
24577
- speakers: unref(speakers)
24578
- }, null, 8, ["turns", "speakers"])),
24579
- !unref(isMobile) ? (openBlock(), createBlock(SpeakerSidebar, {
24580
- key: 4,
24581
24607
  speakers: speakerList.value,
24582
24608
  channels: channels.value,
24583
24609
  "selected-channel-id": unref(core).activeChannelId.value,
@@ -24587,10 +24613,10 @@ ${text2}` : text2;
24587
24613
  "onUpdate:selectedChannelId": onChannelChange,
24588
24614
  "onUpdate:selectedTranslationId": onTranslationChange
24589
24615
  }, null, 8, ["speakers", "channels", "selected-channel-id", "translations", "selected-translation-id", "show-speakers"])) : createCommentVNode("", true),
24590
- unref(isMobile) ? (openBlock(), createBlock(_sfc_main$g, {
24591
- key: 5,
24616
+ unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$g, {
24617
+ key: 1,
24592
24618
  open: isSidebarOpen.value,
24593
- "onUpdate:open": _cache[5] || (_cache[5] = ($event) => isSidebarOpen.value = $event)
24619
+ "onUpdate:open": _cache[6] || (_cache[6] = ($event) => isSidebarOpen.value = $event)
24594
24620
  }, {
24595
24621
  default: withCtx(() => [
24596
24622
  createVNode(SpeakerSidebar, {
@@ -24606,7 +24632,7 @@ ${text2}` : text2;
24606
24632
  ]),
24607
24633
  _: 1
24608
24634
  }, 8, ["open"])) : createCommentVNode("", true)
24609
- ]),
24635
+ ], 2),
24610
24636
  unref(core).audio?.src.value ? withDirectives((openBlock(), createBlock(resolveDynamicComponent(unref(core).components.player), {
24611
24637
  key: 2,
24612
24638
  "audio-src": unref(core).audio.src.value
@@ -24616,7 +24642,7 @@ ${text2}` : text2;
24616
24642
  unref(core).subtitle?.isVisible.value && !unref(isMobile) && !unref(core).subtitle.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleBanner), { key: 3 })) : createCommentVNode("", true),
24617
24643
  unref(core).subtitle?.isFullscreen.value ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.subtitleFullscreen), { key: 4 })) : createCommentVNode("", true),
24618
24644
  unref(core).chat ? (openBlock(), createBlock(resolveDynamicComponent(unref(core).components.chatDrawer), { key: 5 })) : createCommentVNode("", true),
24619
- unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_3$9, [
24645
+ unref(isMobile) && (channels.value.length > 1 || translations.value.length > 1) ? (openBlock(), createElementBlock("div", _hoisted_2$b, [
24620
24646
  channels.value.length > 1 ? (openBlock(), createBlock(_sfc_main$k, {
24621
24647
  key: 0,
24622
24648
  channels: channels.value,
@@ -24634,8 +24660,8 @@ ${text2}` : text2;
24634
24660
  };
24635
24661
  }
24636
24662
  });
24637
- const _style_0$e = "\n.editor-layout[data-v-70777145] {\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-70777145] {\n display: grid;\n grid-template-columns: 1fr var(--sidebar-width);\n flex: 1;\n min-height: 0;\n}\n.mobile-selectors[data-v-70777145] {\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-70777145] > * {\n flex: 1;\n min-width: 0;\n}\n@media (max-width: 767px) {\n.editor-body[data-v-70777145] {\n grid-template-columns: 1fr;\n}\n}\n";
24638
- const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$e]], ["__scopeId", "data-v-70777145"]]);
24663
+ const _style_0$e = "\n.editor-layout[data-v-ca7b1d66] {\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-ca7b1d66] {\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-ca7b1d66] {\n grid-template-columns: 1fr;\n}\n.editor-body__panels[data-v-ca7b1d66] {\n display: flex;\n min-width: 0;\n min-height: 0;\n}\n.editor-body__panels[data-v-ca7b1d66] > * {\n flex: 1;\n min-width: 0;\n}\n.editor-body__panels--split[data-v-ca7b1d66] > * + * {\n border-left: 1px solid var(--color-border);\n}\n.mobile-selectors[data-v-ca7b1d66] {\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-ca7b1d66] > * {\n flex: 1;\n min-width: 0;\n}\n@media (max-width: 767px) {\n.editor-body[data-v-ca7b1d66] {\n grid-template-columns: 1fr;\n}\n}\n";
24664
+ const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$e]], ["__scopeId", "data-v-ca7b1d66"]]);
24639
24665
  const _hoisted_1$d = {
24640
24666
  class: "editor-loading",
24641
24667
  role: "status",
@@ -24759,7 +24785,333 @@ ${text2}` : text2;
24759
24785
  };
24760
24786
  }
24761
24787
  });
24762
- const _style_0$b = '/* Atkinson Hyperlegible Next — main font */\n@font-face {\n font-family: "Atkinson Hyperlegible Next";\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleNext-Regular.woff2") format("woff2");\n}\n@font-face {\n font-family: "Atkinson Hyperlegible Next";\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleNext-Medium.woff2") format("woff2");\n}\n@font-face {\n font-family: "Atkinson Hyperlegible Next";\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleNext-SemiBold.woff2") format("woff2");\n}\n@font-face {\n font-family: "Atkinson Hyperlegible Next";\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleNext-Bold.woff2") format("woff2");\n}\n\n/* Atkinson Hyperlegible Mono — monospace font */\n@font-face {\n font-family: "Atkinson Hyperlegible Mono";\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleMono-Regular.woff2") format("woff2");\n}\n@font-face {\n font-family: "Atkinson Hyperlegible Mono";\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url("/fonts/AtkinsonHyperlegibleMono-Medium.woff2") format("woff2");\n}\n/*\n * Design tokens\n *\n * Public theming API — these CSS custom properties can be overridden from\n * outside the web component by setting them on the <linto-editor> element:\n *\n * linto-editor {\n * --color-primary: #e63946;\n * --color-background: #fafafa;\n * }\n *\n * Colors:\n * --color-primary Accent / brand color\n * --color-primary-hover Primary hover state\n * --color-background Page background\n * --color-surface Cards, panels, player\n * --color-surface-hover Hover on surfaces\n * --color-text-primary Main text\n * --color-text-secondary Secondary text (timestamps…)\n * --color-text-muted Muted text (labels)\n * --color-border Borders\n * --color-border-light Light borders\n *\n * Typography, spacing, radius, and shadows are also overridable.\n *\n * Scoped to .transcript-ui-root (the embedder\'s root element) instead of\n * :root — until the web-component wrapper puts this behind a real Shadow\n * DOM, `:root`/`body`/`*` here would leak straight onto the host app\'s own\n * page (its tokens, its font, its box-sizing reset on every element). :host\n * stays for that future shadow-root case.\n */\n.transcript-ui-root,\n:host {\n /* Colors — light theme */\n --color-background: #f8f9fa;\n --color-surface: #ffffff;\n --color-surface-hover: #f1f3f5;\n --color-text-primary: #1a1d21;\n --color-text-secondary: #495057;\n --color-text-muted: #6c757d;\n --color-primary: #4263eb;\n --color-primary-hover: #3b5bdb;\n --color-border: #dee2e6;\n --color-border-light: #e9ecef;\n --color-white: #ffffff;\n --color-black: #000000;\n --color-danger: #e53935;\n --color-danger-hover: #c62828;\n --color-danger-soft: #fdecea;\n\n /* Typography */\n --font-family:\n "Atkinson Hyperlegible Next", system-ui, -apple-system, sans-serif;\n --font-family-mono: "Atkinson Hyperlegible Mono", ui-monospace, monospace;\n --font-size-xs: 0.875rem;\n --font-size-sm: 1rem;\n --font-size-base: 1.125rem;\n --font-size-lg: 1.25rem;\n --font-size-xl: 1.75rem;\n --line-height: 1.6;\n\n /* Spacing */\n --spacing-xxs: 0.125rem;\n --spacing-xs: 0.25rem;\n --spacing-sm: 0.5rem;\n --spacing-md: 1rem;\n --spacing-lg: 1.5rem;\n --spacing-xl: 2rem;\n\n /* Radius */\n --radius-sm: 4px;\n --radius-md: 8px;\n --radius-lg: 12px;\n\n /* Layout */\n --sidebar-width: 300px;\n --header-height: 56px;\n\n /* Shadows */\n --shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.1);\n --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.15);\n\n /* Transitions */\n --transition-duration: 150ms;\n\n /* Z-index scale */\n --z-sticky: 10;\n --z-overlay: 50;\n --z-drawer: 1000;\n --z-dropdown: 1100;\n\n /* Glass effect — backdrop blur intentionally removed: each backdrop-filter\n forces a WebRender render target, which on long transcripts (one waveform\n region per turn, tall scroll container) balloons GPU memory to several GB\n and freezes weaker machines. Keep the semi-opaque background only. */\n --glass-background: rgba(255, 255, 255, 0.8);\n --glass-border: rgba(255, 255, 255, 0.3);\n}\n.transcript-ui-root,\n:host {\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 background-color: var(--color-background);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n:host {\n display: block;\n height: 100%;\n overflow: hidden;\n}\n\n/* Reset, scoped to our own subtree so the host app\'s elements outside\n .transcript-ui-root keep their own margin/padding/box-sizing. */\n.transcript-ui-root,\n.transcript-ui-root *,\n.transcript-ui-root *::before,\n.transcript-ui-root *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n/* Dev mode SPA (ignored in Shadow DOM — these elements don\'t exist) */\nhtml,\nbody {\n height: 100%;\n overflow: hidden;\n}\n#app {\n height: 100%;\n overflow: hidden;\n}\n/* Utility */\n.transcript-ui-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n/* Overlay (shared by sidebar drawer + sheet select) */\n.transcript-ui-overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n z-index: var(--z-overlay);\n animation: transcript-ui-overlay-fade-in 200ms ease;\n}\n\n/* Drawer mobile (sidebar) */\n.transcript-ui-sidebar-drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(320px, 85vw);\n z-index: var(--z-drawer);\n background-color: var(--color-surface);\n box-shadow: var(--shadow-md);\n animation: transcript-ui-drawer-slide-in 250ms ease;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n.transcript-ui-sidebar-close {\n position: absolute;\n top: var(--spacing-sm);\n right: var(--spacing-sm);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: none;\n color: var(--color-text-muted);\n border-radius: var(--radius-md);\n cursor: pointer;\n z-index: 1;\n}\n.transcript-ui-sidebar-close:hover {\n background-color: var(--color-surface-hover);\n color: var(--color-text-primary);\n}\n\n/* Keyframes */\n@keyframes transcript-ui-overlay-fade-in {\nfrom {\n opacity: 0;\n}\nto {\n opacity: 1;\n}\n}\n@keyframes transcript-ui-drawer-slide-in {\nfrom {\n translate: 100% 0;\n}\nto {\n translate: 0 0;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.transcript-ui-overlay,\n .transcript-ui-sidebar-drawer {\n animation: none;\n}\n}\n\n/* Wavesurfer ::part (cannot work in scoped styles) */\n/* No backdrop-filter: there is one region per turn (hundreds on a long\n transcript), and each backdrop-filter forces a separate WebRender backdrop\n render target — on a multi-hour document this balloons GPU/GTT memory to\n several GB and freezes weaker machines. The border/shadow alone read fine. */\n.transcript-ui-waveform-container ::part(region) {\n border-top: 2px solid var(--region-color, rgba(255, 255, 255, 0.4));\n border-bottom: 1px solid var(--region-color, rgba(255, 255, 255, 0.4));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.2),\n 0 1px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Turn nodes use `content-visibility: auto` for long-document perf, which\n implies paint containment and clips any overflow to the turn\'s box. The\n speaker popover floats out of the turn, so it gets cut off at the turn\'s\n bottom edge. While its trigger is open (Reka sets data-state="open"), drop\n the containment on that turn so the popover can overflow freely. The turn is\n on-screen when open, so lifting content-visibility causes no layout shift.\n Global (not scoped) because the open trigger is rendered by another\n component, so a scoped :has() selector would not match it. */\nsection.turn:has([data-state="open"]) {\n content-visibility: visible;\n}\n/* Shared surface and row styles for PopoverList and similar anchored panels.\n Kept global because Reka portals render outside the component\'s scoped\n CSS boundary. */\n.transcript-ui-root .transcript-ui-popover-list {\n min-width: 180px;\n padding: var(--spacing-xs);\n background-color: var(--color-surface);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n box-shadow: 0 8px 24px\n color-mix(in srgb, var(--color-text-primary) 15%, transparent);\n z-index: 50;\n}\n.transcript-ui-root .transcript-ui-popover-list__items {\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin: 0;\n padding: 0;\n max-height: 280px;\n overflow-y: auto;\n}\n.transcript-ui-root .transcript-ui-popover-list__item {\n all: unset;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n width: 100%;\n padding: var(--spacing-xs) var(--spacing-sm);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-sm);\n color: var(--color-text-primary);\n cursor: pointer;\n}\n.transcript-ui-root .transcript-ui-popover-list__item:hover,\n.transcript-ui-root .transcript-ui-popover-list__item[data-highlighted] {\n background-color: var(--color-surface-hover);\n}\n.transcript-ui-root .transcript-ui-popover-list__item:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n}\n.transcript-ui-root .transcript-ui-popover-list__item--current {\n background-color: color-mix(\n in srgb,\n var(--color-primary) 10%,\n transparent\n );\n}\n.transcript-ui-root .transcript-ui-popover-list__divider {\n height: 1px;\n background-color: var(--color-border);\n margin: var(--spacing-xs) 0;\n}\n.transcript-ui-root .transcript-ui-popover-list__footer {\n padding: var(--spacing-xs);\n}\n\n/* Positioning context for the absolute loading overlay. */\n.transcript-ui-root {\n position: relative;\n height: 100%;\n}\n';
24788
+ const _style_0$b = `
24789
+ /* NOT fonts.css: a @font-face declared inside a shadow root isn't reliably
24790
+ * applied by browsers (document.fonts never registers it) — dead weight in
24791
+ * the webcomponent bundle specifically, which always runs shadow-DOM'd. The
24792
+ * host declares --font-family's actual font at document level instead (see
24793
+ * variables.css's token doc). A direct, non-shadow-DOM Vue embedder of this
24794
+ * package (no such limitation) can still opt in: \`@import
24795
+ * "@linto-ai/transcript-ui-ui/styles/fonts.css"\` themselves. */
24796
+ /*
24797
+ * Design tokens
24798
+ *
24799
+ * Public theming API — these CSS custom properties can be overridden from
24800
+ * outside the web component by setting them on the <linto-editor> element:
24801
+ *
24802
+ * linto-editor {
24803
+ * --color-primary: #e63946;
24804
+ * --color-background: #fafafa;
24805
+ * }
24806
+ *
24807
+ * Colors:
24808
+ * --color-primary Accent / brand color
24809
+ * --color-primary-hover Primary hover state
24810
+ * --color-background Page background
24811
+ * --color-surface Cards, panels, player
24812
+ * --color-surface-hover Hover on surfaces
24813
+ * --color-text-primary Main text
24814
+ * --color-text-secondary Secondary text (timestamps…)
24815
+ * --color-text-muted Muted text (labels)
24816
+ * --color-border Borders
24817
+ * --color-border-light Light borders
24818
+ *
24819
+ * Typography, spacing, radius, and shadows are also overridable.
24820
+ *
24821
+ * --font-family names "Atkinson Hyperlegible Next" as the design's actual
24822
+ * font, but this package does NOT ship or load it (see fonts.css, an opt-in
24823
+ * file for a direct — non-shadow-DOM — Vue embedder; the webcomponent
24824
+ * doesn't import it at all). A @font-face declared inside a shadow root
24825
+ * isn't reliably applied by browsers, so shipping it there was dead weight.
24826
+ * A host that wants the exact intended look declares the @font-face itself,
24827
+ * at document level (outside any shadow root) — see fonts.css for the
24828
+ * ready-made rules to copy, and studio-frontend's public/fonts/atkinson.css
24829
+ * for a real example. Without it, --font-family's own fallback chain
24830
+ * (system-ui, -apple-system, sans-serif) applies — never broken, just not
24831
+ * the exact intended type.
24832
+ *
24833
+ * Scoped to .transcript-ui-root (the embedder's root element) instead of
24834
+ * :root — until the web-component wrapper puts this behind a real Shadow
24835
+ * DOM, \`:root\`/\`body\`/\`*\` here would leak straight onto the host app's own
24836
+ * page (its tokens, its font, its box-sizing reset on every element). :host
24837
+ * stays for that future shadow-root case.
24838
+ */
24839
+ .transcript-ui-root,
24840
+ :host {
24841
+ /* Colors — light theme */
24842
+ --color-background: #f8f9fa;
24843
+ --color-surface: #ffffff;
24844
+ --color-surface-hover: #f1f3f5;
24845
+ --color-text-primary: #1a1d21;
24846
+ --color-text-secondary: #495057;
24847
+ --color-text-muted: #6c757d;
24848
+ --color-primary: #4263eb;
24849
+ --color-primary-hover: #3b5bdb;
24850
+ --color-border: #dee2e6;
24851
+ --color-border-light: #e9ecef;
24852
+ --color-white: #ffffff;
24853
+ --color-black: #000000;
24854
+ --color-danger: #e53935;
24855
+ --color-danger-hover: #c62828;
24856
+ --color-danger-soft: #fdecea;
24857
+
24858
+ /* Typography */
24859
+ --font-family:
24860
+ "Atkinson Hyperlegible Next", system-ui, -apple-system, sans-serif;
24861
+ --font-family-mono: "Atkinson Hyperlegible Mono", ui-monospace, monospace;
24862
+ --font-size-xs: 0.875rem;
24863
+ --font-size-sm: 1rem;
24864
+ --font-size-base: 1.125rem;
24865
+ --font-size-lg: 1.25rem;
24866
+ --font-size-xl: 1.75rem;
24867
+ --line-height: 1.6;
24868
+
24869
+ /* Spacing */
24870
+ --spacing-xxs: 0.125rem;
24871
+ --spacing-xs: 0.25rem;
24872
+ --spacing-sm: 0.5rem;
24873
+ --spacing-md: 1rem;
24874
+ --spacing-lg: 1.5rem;
24875
+ --spacing-xl: 2rem;
24876
+
24877
+ /* Radius */
24878
+ --radius-sm: 4px;
24879
+ --radius-md: 8px;
24880
+ --radius-lg: 12px;
24881
+
24882
+ /* Layout */
24883
+ --sidebar-width: 300px;
24884
+ --header-height: 56px;
24885
+
24886
+ /* Shadows */
24887
+ --shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.1);
24888
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.15);
24889
+
24890
+ /* Transitions */
24891
+ --transition-duration: 150ms;
24892
+
24893
+ /* Z-index scale */
24894
+ --z-sticky: 10;
24895
+ --z-overlay: 50;
24896
+ --z-drawer: 1000;
24897
+ --z-dropdown: 1100;
24898
+
24899
+ /* Glass effect — backdrop blur intentionally removed: each backdrop-filter
24900
+ forces a WebRender render target, which on long transcripts (one waveform
24901
+ region per turn, tall scroll container) balloons GPU memory to several GB
24902
+ and freezes weaker machines. Keep the semi-opaque background only. */
24903
+ --glass-background: rgba(255, 255, 255, 0.8);
24904
+ --glass-border: rgba(255, 255, 255, 0.3);
24905
+ }
24906
+ .transcript-ui-root,
24907
+ :host {
24908
+ font-family: var(--font-family);
24909
+ font-size: var(--font-size-base);
24910
+ line-height: var(--line-height);
24911
+ color: var(--color-text-primary);
24912
+ background-color: var(--color-background);
24913
+ -webkit-font-smoothing: antialiased;
24914
+ -moz-osx-font-smoothing: grayscale;
24915
+ }
24916
+ :host {
24917
+ display: block;
24918
+ height: 100%;
24919
+ overflow: hidden;
24920
+ }
24921
+
24922
+ /* Reset, scoped to our own subtree so the host app's elements outside
24923
+ .transcript-ui-root keep their own margin/padding/box-sizing. */
24924
+ .transcript-ui-root,
24925
+ .transcript-ui-root *,
24926
+ .transcript-ui-root *::before,
24927
+ .transcript-ui-root *::after {
24928
+ box-sizing: border-box;
24929
+ margin: 0;
24930
+ padding: 0;
24931
+ }
24932
+
24933
+ /* Dev mode SPA (ignored in Shadow DOM — these elements don't exist) */
24934
+ html,
24935
+ body {
24936
+ height: 100%;
24937
+ overflow: hidden;
24938
+ }
24939
+ #app {
24940
+ height: 100%;
24941
+ overflow: hidden;
24942
+ }
24943
+ /* Utility */
24944
+ .transcript-ui-sr-only {
24945
+ position: absolute;
24946
+ width: 1px;
24947
+ height: 1px;
24948
+ padding: 0;
24949
+ margin: -1px;
24950
+ overflow: hidden;
24951
+ clip: rect(0, 0, 0, 0);
24952
+ white-space: nowrap;
24953
+ border-width: 0;
24954
+ }
24955
+
24956
+ /* Overlay (shared by sidebar drawer + sheet select) */
24957
+ .transcript-ui-overlay {
24958
+ position: fixed;
24959
+ inset: 0;
24960
+ background-color: rgba(0, 0, 0, 0.4);
24961
+ z-index: var(--z-overlay);
24962
+ animation: transcript-ui-overlay-fade-in 200ms ease;
24963
+ }
24964
+
24965
+ /* Drawer mobile (sidebar) */
24966
+ .transcript-ui-sidebar-drawer {
24967
+ position: fixed;
24968
+ top: 0;
24969
+ right: 0;
24970
+ bottom: 0;
24971
+ width: min(320px, 85vw);
24972
+ z-index: var(--z-drawer);
24973
+ background-color: var(--color-surface);
24974
+ box-shadow: var(--shadow-md);
24975
+ animation: transcript-ui-drawer-slide-in 250ms ease;
24976
+ overflow-y: auto;
24977
+ display: flex;
24978
+ flex-direction: column;
24979
+ }
24980
+ .transcript-ui-sidebar-close {
24981
+ position: absolute;
24982
+ top: var(--spacing-sm);
24983
+ right: var(--spacing-sm);
24984
+ display: inline-flex;
24985
+ align-items: center;
24986
+ justify-content: center;
24987
+ width: 32px;
24988
+ height: 32px;
24989
+ border: none;
24990
+ background: none;
24991
+ color: var(--color-text-muted);
24992
+ border-radius: var(--radius-md);
24993
+ cursor: pointer;
24994
+ z-index: 1;
24995
+ }
24996
+ .transcript-ui-sidebar-close:hover {
24997
+ background-color: var(--color-surface-hover);
24998
+ color: var(--color-text-primary);
24999
+ }
25000
+
25001
+ /* Keyframes */
25002
+ @keyframes transcript-ui-overlay-fade-in {
25003
+ from {
25004
+ opacity: 0;
25005
+ }
25006
+ to {
25007
+ opacity: 1;
25008
+ }
25009
+ }
25010
+ @keyframes transcript-ui-drawer-slide-in {
25011
+ from {
25012
+ translate: 100% 0;
25013
+ }
25014
+ to {
25015
+ translate: 0 0;
25016
+ }
25017
+ }
25018
+ @media (prefers-reduced-motion: reduce) {
25019
+ .transcript-ui-overlay,
25020
+ .transcript-ui-sidebar-drawer {
25021
+ animation: none;
25022
+ }
25023
+ }
25024
+
25025
+ /* Wavesurfer ::part (cannot work in scoped styles) */
25026
+ /* No backdrop-filter: there is one region per turn (hundreds on a long
25027
+ transcript), and each backdrop-filter forces a separate WebRender backdrop
25028
+ render target — on a multi-hour document this balloons GPU/GTT memory to
25029
+ several GB and freezes weaker machines. The border/shadow alone read fine. */
25030
+ .transcript-ui-waveform-container ::part(region) {
25031
+ border-top: 2px solid var(--region-color, rgba(255, 255, 255, 0.4));
25032
+ border-bottom: 1px solid var(--region-color, rgba(255, 255, 255, 0.4));
25033
+ box-shadow:
25034
+ inset 0 1px 0 rgba(255, 255, 255, 0.2),
25035
+ 0 1px 4px rgba(0, 0, 0, 0.1);
25036
+ }
25037
+
25038
+ /* Turn nodes use \`content-visibility: auto\` for long-document perf, which
25039
+ implies paint containment and clips any overflow to the turn's box. The
25040
+ speaker popover floats out of the turn, so it gets cut off at the turn's
25041
+ bottom edge. While its trigger is open (Reka sets data-state="open"), drop
25042
+ the containment on that turn so the popover can overflow freely. The turn is
25043
+ on-screen when open, so lifting content-visibility causes no layout shift.
25044
+ Global (not scoped) because the open trigger is rendered by another
25045
+ component, so a scoped :has() selector would not match it. */
25046
+ section.turn:has([data-state="open"]) {
25047
+ content-visibility: visible;
25048
+ }
25049
+ /* Shared surface and row styles for PopoverList and similar anchored panels.
25050
+ Kept global because Reka portals render outside the component's scoped
25051
+ CSS boundary. */
25052
+ .transcript-ui-root .transcript-ui-popover-list {
25053
+ min-width: 180px;
25054
+ padding: var(--spacing-xs);
25055
+ background-color: var(--color-surface);
25056
+ border: 1px solid var(--color-border);
25057
+ border-radius: var(--radius-md);
25058
+ box-shadow: 0 8px 24px
25059
+ color-mix(in srgb, var(--color-text-primary) 15%, transparent);
25060
+ z-index: 50;
25061
+ }
25062
+ .transcript-ui-root .transcript-ui-popover-list__items {
25063
+ list-style: none;
25064
+ display: flex;
25065
+ flex-direction: column;
25066
+ gap: 2px;
25067
+ margin: 0;
25068
+ padding: 0;
25069
+ max-height: 280px;
25070
+ overflow-y: auto;
25071
+ }
25072
+ .transcript-ui-root .transcript-ui-popover-list__item {
25073
+ all: unset;
25074
+ box-sizing: border-box;
25075
+ display: flex;
25076
+ align-items: center;
25077
+ gap: var(--spacing-sm);
25078
+ width: 100%;
25079
+ padding: var(--spacing-xs) var(--spacing-sm);
25080
+ border-radius: var(--radius-sm);
25081
+ font-size: var(--font-size-sm);
25082
+ color: var(--color-text-primary);
25083
+ cursor: pointer;
25084
+ }
25085
+ .transcript-ui-root .transcript-ui-popover-list__item:hover,
25086
+ .transcript-ui-root .transcript-ui-popover-list__item[data-highlighted] {
25087
+ background-color: var(--color-surface-hover);
25088
+ }
25089
+ .transcript-ui-root .transcript-ui-popover-list__item:focus-visible {
25090
+ outline: 2px solid var(--color-primary);
25091
+ outline-offset: -2px;
25092
+ }
25093
+ .transcript-ui-root .transcript-ui-popover-list__item--current {
25094
+ background-color: color-mix(
25095
+ in srgb,
25096
+ var(--color-primary) 10%,
25097
+ transparent
25098
+ );
25099
+ }
25100
+ .transcript-ui-root .transcript-ui-popover-list__divider {
25101
+ height: 1px;
25102
+ background-color: var(--color-border);
25103
+ margin: var(--spacing-xs) 0;
25104
+ }
25105
+ .transcript-ui-root .transcript-ui-popover-list__footer {
25106
+ padding: var(--spacing-xs);
25107
+ }
25108
+
25109
+ /* Positioning context for the absolute loading overlay. */
25110
+ .transcript-ui-root {
25111
+ position: relative;
25112
+ height: 100%;
25113
+ }
25114
+ `;
24763
25115
  const TranscriptUI = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["styles", [_style_0$b]]]);
24764
25116
  function mapApiTurns(apiTurns) {
24765
25117
  return apiTurns.map((t2) => {
@@ -28979,12 +29331,18 @@ ${text2}` : text2;
28979
29331
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
28980
29332
  __name: "LLMServicePanel",
28981
29333
  props: {
28982
- service: { type: Object }
29334
+ service: { type: Object },
29335
+ split: { type: Boolean }
28983
29336
  },
28984
- setup(__props) {
29337
+ emits: ["update:split"],
29338
+ setup(__props, { emit: __emit }) {
28985
29339
  const props = __props;
29340
+ const emit2 = __emit;
28986
29341
  const core = useCore();
28987
29342
  const { t: t2 } = useI18n();
29343
+ function toggleSplit() {
29344
+ emit2("update:split", !props.split);
29345
+ }
28988
29346
  const articleStatus = computed(() => {
28989
29347
  const s2 = props.service.status.value;
28990
29348
  if (s2 === "queued" || s2 === "processing") return "processing";
@@ -29091,7 +29449,15 @@ ${text2}` : text2;
29091
29449
  createTextVNode(toDisplayString(unref(t2)("llmService.download")), 1)
29092
29450
  ]),
29093
29451
  _: 1
29094
- }, 8, ["disabled", "aria-label", "title"])
29452
+ }, 8, ["disabled", "aria-label", "title"]),
29453
+ createVNode(unref(Button), {
29454
+ variant: __props.split ? "primary" : "secondary",
29455
+ icon: "panel-right",
29456
+ "aria-pressed": !!__props.split,
29457
+ "aria-label": unref(t2)("llmService.split"),
29458
+ title: unref(t2)("llmService.split"),
29459
+ onClick: toggleSplit
29460
+ }, null, 8, ["variant", "aria-pressed", "aria-label", "title"])
29095
29461
  ]),
29096
29462
  default: withCtx(() => [
29097
29463
  isEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_2$5, [
@@ -29120,8 +29486,8 @@ ${text2}` : text2;
29120
29486
  };
29121
29487
  }
29122
29488
  });
29123
- const _style_0$5 = "\n.llm-service-panel[data-v-85d1396e] {\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-85d1396e] {\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-85d1396e] {\n color: var(--color-success, #2e7d32);\n}\n.llm-service-panel__status--warn[data-v-85d1396e] {\n color: var(--color-warning, #ed6c02);\n}\n.llm-service-panel__empty[data-v-85d1396e] {\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-85d1396e] {\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-85d1396e] {\n padding: var(--spacing-md);\n}\n}\n";
29124
- const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$5]], ["__scopeId", "data-v-85d1396e"]]);
29489
+ const _style_0$5 = "\n.llm-service-panel[data-v-b3e9aba7] {\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-b3e9aba7] {\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-b3e9aba7] {\n color: var(--color-success, #2e7d32);\n}\n.llm-service-panel__status--warn[data-v-b3e9aba7] {\n color: var(--color-warning, #ed6c02);\n}\n.llm-service-panel__empty[data-v-b3e9aba7] {\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-b3e9aba7] {\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-b3e9aba7] {\n padding: var(--spacing-md);\n}\n}\n";
29490
+ const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$5]], ["__scopeId", "data-v-b3e9aba7"]]);
29125
29491
  function createService(init) {
29126
29492
  return {
29127
29493
  id: init.id,