@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.
- package/README.md +3 -1
- package/dist/{highlight-BWR22PHo.js → highlight-DcaGiZlF.js} +2 -2
- package/dist/{highlight-BWR22PHo.js.map → highlight-DcaGiZlF.js.map} +1 -1
- package/dist/{index--DNvC8BA.js → index-DQ9v_akJ.js} +444 -78
- package/dist/index-DQ9v_akJ.js.map +1 -0
- package/dist/linto-editor.iife.js +442 -76
- package/dist/linto-editor.iife.js.map +1 -1
- package/dist/linto-editor.js +1 -1
- package/package.json +10 -10
- package/dist/index--DNvC8BA.js.map +0 -1
|
@@ -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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
21496
|
+
}, null, 40, _hoisted_3$l)
|
|
21490
21497
|
]);
|
|
21491
21498
|
};
|
|
21492
21499
|
}
|
|
21493
21500
|
});
|
|
21494
|
-
const _style_0$y = "\n.markdown-editor[data-v-
|
|
21495
|
-
const MarkdownEditor = /* @__PURE__ */ _export_sfc(_sfc_main$G, [["styles", [_style_0$y]], ["__scopeId", "data-v-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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-
|
|
21857
|
-
const DocumentArticle = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["styles", [_style_0$s]], ["__scopeId", "data-v-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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-
|
|
23867
|
-
const VerbatimPanel = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["styles", [_style_0$i]], ["__scopeId", "data-v-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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 = {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
24563
|
-
"onUpdate:modelValue": _cache[4] || (_cache[4] = (
|
|
24564
|
-
}, null, 8, ["
|
|
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",
|
|
24567
|
-
|
|
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:
|
|
24616
|
+
unref(isMobile) && panels.value.length === 1 ? (openBlock(), createBlock(_sfc_main$g, {
|
|
24617
|
+
key: 1,
|
|
24592
24618
|
open: isSidebarOpen.value,
|
|
24593
|
-
"onUpdate:open": _cache[
|
|
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",
|
|
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-
|
|
24638
|
-
const Layout = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["styles", [_style_0$e]], ["__scopeId", "data-v-
|
|
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
|
-
|
|
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-
|
|
29124
|
-
const LLMServicePanel = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["styles", [_style_0$5]], ["__scopeId", "data-v-
|
|
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,
|