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