@omniloy/sofia-sdk 1.0.10 → 1.0.12
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/legacy/webcomponents.d.ts +155 -0
- package/dist/legacy/webcomponents.es.js +918 -327
- package/dist/legacy/webcomponents.umd.js +918 -327
- package/dist/react/index.css +59 -39
- package/dist/react/index.d.ts +155 -0
- package/dist/react/index.es.js +756 -133
- package/dist/webcomponents.d.ts +155 -0
- package/dist/webcomponents.es.js +634 -39
- package/dist/webcomponents.umd.js +634 -39
- package/package.json +1 -1
package/dist/webcomponents.es.js
CHANGED
|
@@ -21972,7 +21972,7 @@ const {
|
|
|
21972
21972
|
create: create$1,
|
|
21973
21973
|
} = axios;
|
|
21974
21974
|
|
|
21975
|
-
const version$2 = "1.0.
|
|
21975
|
+
const version$2 = "1.0.12";
|
|
21976
21976
|
|
|
21977
21977
|
const handleApiError$1 = async (error) => {
|
|
21978
21978
|
return Promise.reject(error);
|
|
@@ -22710,6 +22710,11 @@ const ar = {
|
|
|
22710
22710
|
"Generation failed": "فشل الإنشاء",
|
|
22711
22711
|
"Could not generate {category}. Please try again.": "تعذّر إنشاء {category}. يرجى المحاولة مرة أخرى.",
|
|
22712
22712
|
"The new note is waiting for this review — apply or cancel to continue.": "الملاحظة الجديدة في انتظار هذه المراجعة — طبّق أو ألغِ للمتابعة.",
|
|
22713
|
+
" +{count} more": " +{count} أخرى",
|
|
22714
|
+
"{count} mandatory fields missing in this group": "{count, plural, zero {# حقل إلزامي ناقص} one {# حقل إلزامي ناقص} two {حقلان إلزاميان ناقصان} few {# حقول إلزامية ناقصة} many {# حقلاً إلزامياً ناقصاً} other {# حقل إلزامي ناقص}} في هذه المجموعة",
|
|
22715
|
+
"{group} · row {row}": "{group} · الصف {row}",
|
|
22716
|
+
"{group} · row {row} · {field}": "{group} · الصف {row} · {field}",
|
|
22717
|
+
"{count} rows need a type selected in this group": "{count, plural, zero {# صف يحتاج} one {# صف يحتاج} two {صفّان يحتاجان} few {# صفوف تحتاج} many {# صفاً يحتاج} other {# صف يحتاج}} إلى تحديد النوع في هذه المجموعة",
|
|
22713
22718
|
};
|
|
22714
22719
|
|
|
22715
22720
|
const Add$b = "Afegir";
|
|
@@ -23080,6 +23085,11 @@ const ca = {
|
|
|
23080
23085
|
"Generation failed": "La generació ha fallat",
|
|
23081
23086
|
"Could not generate {category}. Please try again.": "No s'ha pogut generar {category}. Torna-ho a provar.",
|
|
23082
23087
|
"The new note is waiting for this review — apply or cancel to continue.": "La nova nota està esperant aquesta revisió: aplica o cancel·la per continuar.",
|
|
23088
|
+
" +{count} more": " +{count} més",
|
|
23089
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {Falta # camp obligatori} other {Falten # camps obligatoris}} en aquest grup",
|
|
23090
|
+
"{group} · row {row}": "{group} · fila {row}",
|
|
23091
|
+
"{group} · row {row} · {field}": "{group} · fila {row} · {field}",
|
|
23092
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# fila necessita} other {# files necessiten}} que se seleccioni un tipus en aquest grup",
|
|
23083
23093
|
};
|
|
23084
23094
|
|
|
23085
23095
|
const Add$a = "Afegir";
|
|
@@ -23450,6 +23460,11 @@ const ca_valencia = {
|
|
|
23450
23460
|
"Generation failed": "La generació ha fallat",
|
|
23451
23461
|
"Could not generate {category}. Please try again.": "No s'ha pogut generar {category}. Torna-ho a provar.",
|
|
23452
23462
|
"The new note is waiting for this review — apply or cancel to continue.": "La nova nota està esperant aquesta revisió: aplica o cancel·la per continuar.",
|
|
23463
|
+
" +{count} more": " +{count} més",
|
|
23464
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {Falta # camp obligatori} other {Falten # camps obligatoris}} en este grup",
|
|
23465
|
+
"{group} · row {row}": "{group} · fila {row}",
|
|
23466
|
+
"{group} · row {row} · {field}": "{group} · fila {row} · {field}",
|
|
23467
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# fila necessita} other {# files necessiten}} que se seleccione un tipus en este grup",
|
|
23453
23468
|
};
|
|
23454
23469
|
|
|
23455
23470
|
const Add$9 = "Přidat";
|
|
@@ -23820,6 +23835,11 @@ const cs = {
|
|
|
23820
23835
|
"Generation failed": "Generování se nezdařilo",
|
|
23821
23836
|
"Could not generate {category}. Please try again.": "Nepodařilo se vygenerovat {category}. Zkuste to znovu.",
|
|
23822
23837
|
"The new note is waiting for this review — apply or cancel to continue.": "Nová poznámka čeká na tuto kontrolu — potvrďte ji, nebo ji zrušte, aby mohla pokračovat.",
|
|
23838
|
+
" +{count} more": " +{count} dalších",
|
|
23839
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {Chybí # povinné pole} few {Chybí # povinná pole} other {Chybí # povinných polí}} v této skupině",
|
|
23840
|
+
"{group} · row {row}": "{group} · řádek {row}",
|
|
23841
|
+
"{group} · row {row} · {field}": "{group} · řádek {row} · {field}",
|
|
23842
|
+
"{count} rows need a type selected in this group": "{count, plural, one {U # řádku} few {U # řádků} other {U # řádků}} v této skupině je třeba vybrat typ",
|
|
23823
23843
|
};
|
|
23824
23844
|
|
|
23825
23845
|
const Add$8 = "Add";
|
|
@@ -24190,6 +24210,11 @@ const en_GB = {
|
|
|
24190
24210
|
"Generation failed": "Generation failed",
|
|
24191
24211
|
"Could not generate {category}. Please try again.": "Could not generate {category}. Please try again.",
|
|
24192
24212
|
"The new note is waiting for this review — apply or cancel to continue.": "The new note is waiting for this review — apply or cancel to continue.",
|
|
24213
|
+
" +{count} more": " +{count} more",
|
|
24214
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {# mandatory field missing} other {# mandatory fields missing}} in this group",
|
|
24215
|
+
"{group} · row {row}": "{group} · row {row}",
|
|
24216
|
+
"{group} · row {row} · {field}": "{group} · row {row} · {field}",
|
|
24217
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# row needs} other {# rows need}} a type selected in this group",
|
|
24193
24218
|
};
|
|
24194
24219
|
|
|
24195
24220
|
const Add$7 = "Add";
|
|
@@ -24561,6 +24586,11 @@ const en_US = {
|
|
|
24561
24586
|
"Generation failed": "Generation failed",
|
|
24562
24587
|
"Could not generate {category}. Please try again.": "Could not generate {category}. Please try again.",
|
|
24563
24588
|
"The new note is waiting for this review — apply or cancel to continue.": "The new note is waiting for this review — apply or cancel to continue.",
|
|
24589
|
+
" +{count} more": " +{count} more",
|
|
24590
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {# mandatory field missing} other {# mandatory fields missing}} in this group",
|
|
24591
|
+
"{group} · row {row}": "{group} · row {row}",
|
|
24592
|
+
"{group} · row {row} · {field}": "{group} · row {row} · {field}",
|
|
24593
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# row needs} other {# rows need}} a type selected in this group",
|
|
24564
24594
|
};
|
|
24565
24595
|
|
|
24566
24596
|
const Add$6 = "Añadir";
|
|
@@ -24944,6 +24974,11 @@ const es = {
|
|
|
24944
24974
|
"{name} has expressly refused the use of AI, so recording and report generation are unavailable in this consultation.": "{name} ha rechazado expresamente el uso de IA, así que no se puede grabar ni generar informes en esta consulta.",
|
|
24945
24975
|
"{name} expressly refused the use of AI on {date}, so recording and report generation are unavailable in this consultation.": "{name} rechazó expresamente el uso de IA el {date}, así que no se puede grabar ni generar informes en esta consulta.",
|
|
24946
24976
|
"this patient": "este paciente",
|
|
24977
|
+
" +{count} more": " +{count} más",
|
|
24978
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {Falta # campo obligatorio} other {Faltan # campos obligatorios}} en este grupo",
|
|
24979
|
+
"{group} · row {row}": "{group} · fila {row}",
|
|
24980
|
+
"{group} · row {row} · {field}": "{group} · fila {row} · {field}",
|
|
24981
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# fila necesita} other {# filas necesitan}} que se seleccione un tipo en este grupo",
|
|
24947
24982
|
};
|
|
24948
24983
|
|
|
24949
24984
|
const Add$5 = "Ajouter";
|
|
@@ -25314,6 +25349,11 @@ const fr = {
|
|
|
25314
25349
|
"Generation failed": "Échec de la génération",
|
|
25315
25350
|
"Could not generate {category}. Please try again.": "Impossible de générer {category}. Veuillez réessayer.",
|
|
25316
25351
|
"The new note is waiting for this review — apply or cancel to continue.": "La nouvelle note attend cette révision : appliquez ou annulez pour continuer.",
|
|
25352
|
+
" +{count} more": " +{count} de plus",
|
|
25353
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {# champ obligatoire manquant} other {# champs obligatoires manquants}} dans ce groupe",
|
|
25354
|
+
"{group} · row {row}": "{group} · ligne {row}",
|
|
25355
|
+
"{group} · row {row} · {field}": "{group} · ligne {row} · {field}",
|
|
25356
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# ligne nécessite} other {# lignes nécessitent}} la sélection d'un type dans ce groupe",
|
|
25317
25357
|
};
|
|
25318
25358
|
|
|
25319
25359
|
const Add$4 = "जोड़ें";
|
|
@@ -25663,6 +25703,11 @@ const hi = {
|
|
|
25663
25703
|
"Generation failed": "जनरेशन विफल रहा",
|
|
25664
25704
|
"Could not generate {category}. Please try again.": "{category} जनरेट नहीं किया जा सका। कृपया पुनः प्रयास करें।",
|
|
25665
25705
|
"The new note is waiting for this review — apply or cancel to continue.": "नई नोट इस समीक्षा की प्रतीक्षा कर रही है — जारी रखने के लिए लागू करें या रद्द करें।",
|
|
25706
|
+
" +{count} more": " +{count} और",
|
|
25707
|
+
"{count} mandatory fields missing in this group": "इस समूह में {count, plural, one {# अनिवार्य फ़ील्ड खाली है} other {# अनिवार्य फ़ील्ड खाली हैं}}",
|
|
25708
|
+
"{group} · row {row}": "{group} · पंक्ति {row}",
|
|
25709
|
+
"{group} · row {row} · {field}": "{group} · पंक्ति {row} · {field}",
|
|
25710
|
+
"{count} rows need a type selected in this group": "इस समूह में {count, plural, one {# पंक्ति के लिए} other {# पंक्तियों के लिए}} प्रकार चुनना आवश्यक है",
|
|
25666
25711
|
};
|
|
25667
25712
|
|
|
25668
25713
|
const Add$3 = "Tambahkan";
|
|
@@ -26011,6 +26056,11 @@ const id = {
|
|
|
26011
26056
|
"Generation failed": "Pembuatan gagal",
|
|
26012
26057
|
"Could not generate {category}. Please try again.": "Tidak dapat membuat {category}. Silakan coba lagi.",
|
|
26013
26058
|
"The new note is waiting for this review — apply or cancel to continue.": "Catatan baru menunggu tinjauan ini — terapkan atau batalkan untuk melanjutkan.",
|
|
26059
|
+
" +{count} more": " +{count} lainnya",
|
|
26060
|
+
"{count} mandatory fields missing in this group": "{count, plural, other {# bidang wajib belum diisi}} di grup ini",
|
|
26061
|
+
"{group} · row {row}": "{group} · baris {row}",
|
|
26062
|
+
"{group} · row {row} · {field}": "{group} · baris {row} · {field}",
|
|
26063
|
+
"{count} rows need a type selected in this group": "{count, plural, other {# baris perlu dipilih jenisnya}} di grup ini",
|
|
26014
26064
|
};
|
|
26015
26065
|
|
|
26016
26066
|
const Add$2 = "ਸ਼ਾਮਲ ਕਰੋ";
|
|
@@ -26381,6 +26431,11 @@ const pa = {
|
|
|
26381
26431
|
"Generation failed": "ਜਨਰੇਸ਼ਨ ਅਸਫਲ ਰਹੀ",
|
|
26382
26432
|
"Could not generate {category}. Please try again.": "{category} ਜਨਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
|
|
26383
26433
|
"The new note is waiting for this review — apply or cancel to continue.": "ਨਵਾਂ ਨੋਟ ਇਸ ਸਮੀਖਿਆ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ — ਜਾਰੀ ਰੱਖਣ ਲਈ ਲਾਗੂ ਕਰੋ ਜਾਂ ਰੱਦ ਕਰੋ।",
|
|
26434
|
+
" +{count} more": " +{count} ਹੋਰ",
|
|
26435
|
+
"{count} mandatory fields missing in this group": "ਇਸ ਸਮੂਹ ਵਿੱਚ {count, plural, one {# ਲਾਜ਼ਮੀ ਖੇਤਰ ਖਾਲੀ ਹੈ} other {# ਲਾਜ਼ਮੀ ਖੇਤਰ ਖਾਲੀ ਹਨ}}",
|
|
26436
|
+
"{group} · row {row}": "{group} · ਕਤਾਰ {row}",
|
|
26437
|
+
"{group} · row {row} · {field}": "{group} · ਕਤਾਰ {row} · {field}",
|
|
26438
|
+
"{count} rows need a type selected in this group": "ਇਸ ਸਮੂਹ ਵਿੱਚ {count, plural, one {# ਕਤਾਰ ਲਈ} other {# ਕਤਾਰਾਂ ਲਈ}} ਕਿਸਮ ਚੁਣਨੀ ਲਾਜ਼ਮੀ ਹੈ",
|
|
26384
26439
|
};
|
|
26385
26440
|
|
|
26386
26441
|
const Add$1 = "Lägg till";
|
|
@@ -26751,6 +26806,11 @@ const sv = {
|
|
|
26751
26806
|
"Generation failed": "Genereringen misslyckades",
|
|
26752
26807
|
"Could not generate {category}. Please try again.": "Det gick inte att generera {category}. Försök igen.",
|
|
26753
26808
|
"The new note is waiting for this review — apply or cancel to continue.": "Den nya anteckningen väntar på den här granskningen — tillämpa eller avbryt för att fortsätta.",
|
|
26809
|
+
" +{count} more": " +{count} till",
|
|
26810
|
+
"{count} mandatory fields missing in this group": "{count, plural, one {# obligatoriskt fält saknas} other {# obligatoriska fält saknas}} i den här gruppen",
|
|
26811
|
+
"{group} · row {row}": "{group} · rad {row}",
|
|
26812
|
+
"{group} · row {row} · {field}": "{group} · rad {row} · {field}",
|
|
26813
|
+
"{count} rows need a type selected in this group": "{count, plural, one {# rad behöver} other {# rader behöver}} en vald typ i den här gruppen",
|
|
26754
26814
|
};
|
|
26755
26815
|
|
|
26756
26816
|
const Add = "شامل کریں";
|
|
@@ -27122,6 +27182,11 @@ const ur = {
|
|
|
27122
27182
|
"Generation failed": "تخلیق ناکام ہو گئی",
|
|
27123
27183
|
"Could not generate {category}. Please try again.": "{category} تیار نہیں کیا جا سکا۔ براہ کرم دوبارہ کوشش کریں۔",
|
|
27124
27184
|
"The new note is waiting for this review — apply or cancel to continue.": "نیا نوٹ اس جائزے کا منتظر ہے — جاری رکھنے کے لیے لاگو کریں یا منسوخ کریں۔",
|
|
27185
|
+
" +{count} more": " +{count} مزید",
|
|
27186
|
+
"{count} mandatory fields missing in this group": "اس گروپ میں {count, plural, one {# لازمی خانہ خالی ہے} other {# لازمی خانے خالی ہیں}}",
|
|
27187
|
+
"{group} · row {row}": "{group} · قطار {row}",
|
|
27188
|
+
"{group} · row {row} · {field}": "{group} · قطار {row} · {field}",
|
|
27189
|
+
"{count} rows need a type selected in this group": "اس گروپ میں {count, plural, one {# قطار کے لیے} other {# قطاروں کے لیے}} قسم منتخب کرنا ضروری ہے",
|
|
27125
27190
|
};
|
|
27126
27191
|
|
|
27127
27192
|
var LanguageCode;
|
|
@@ -27848,6 +27913,283 @@ const useVadCoverage = () => {
|
|
|
27848
27913
|
};
|
|
27849
27914
|
};
|
|
27850
27915
|
|
|
27916
|
+
const KNOWN_SDK_EVENT_NAMES = [
|
|
27917
|
+
"recording.started",
|
|
27918
|
+
"recording.stopped",
|
|
27919
|
+
"recording.audio_lost",
|
|
27920
|
+
"recording.microphone_disconnected",
|
|
27921
|
+
"recording.heartbeat",
|
|
27922
|
+
"activity.interaction",
|
|
27923
|
+
"activity.typing",
|
|
27924
|
+
"report.generation_started",
|
|
27925
|
+
"report.settled",
|
|
27926
|
+
"lifecycle.ready",
|
|
27927
|
+
"lifecycle.closed"
|
|
27928
|
+
];
|
|
27929
|
+
const SDK_EVENT_FAMILIES = [
|
|
27930
|
+
"recording",
|
|
27931
|
+
"activity",
|
|
27932
|
+
"report",
|
|
27933
|
+
"lifecycle"
|
|
27934
|
+
];
|
|
27935
|
+
const FAMILIES = SDK_EVENT_FAMILIES;
|
|
27936
|
+
const familyOf = (name) => {
|
|
27937
|
+
const prefix = name.split(".")[0];
|
|
27938
|
+
return FAMILIES.includes(prefix) ? prefix : "lifecycle";
|
|
27939
|
+
};
|
|
27940
|
+
|
|
27941
|
+
const KNOWN_NAMES = new Set(KNOWN_SDK_EVENT_NAMES);
|
|
27942
|
+
const KNOWN_FAMILIES = new Set(SDK_EVENT_FAMILIES);
|
|
27943
|
+
const distance = (a, b) => {
|
|
27944
|
+
const prev = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
27945
|
+
for (let i = 1; i <= a.length; i++) {
|
|
27946
|
+
let corner = prev[0];
|
|
27947
|
+
prev[0] = i;
|
|
27948
|
+
for (let j = 1; j <= b.length; j++) {
|
|
27949
|
+
const next = Math.min(prev[j] + 1, prev[j - 1] + 1, corner + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
27950
|
+
corner = prev[j];
|
|
27951
|
+
prev[j] = next;
|
|
27952
|
+
}
|
|
27953
|
+
}
|
|
27954
|
+
return prev[b.length];
|
|
27955
|
+
};
|
|
27956
|
+
const describeEntry = (entry) => {
|
|
27957
|
+
try {
|
|
27958
|
+
return JSON.stringify(entry) ?? `<${typeof entry}>`;
|
|
27959
|
+
} catch {
|
|
27960
|
+
return `<unserializable ${typeof entry}>`;
|
|
27961
|
+
}
|
|
27962
|
+
};
|
|
27963
|
+
const suggest = (value, candidates) => {
|
|
27964
|
+
let best = null;
|
|
27965
|
+
let bestScore = Infinity;
|
|
27966
|
+
for (const candidate of candidates) {
|
|
27967
|
+
const score = distance(value, candidate);
|
|
27968
|
+
if (score < bestScore) {
|
|
27969
|
+
bestScore = score;
|
|
27970
|
+
best = candidate;
|
|
27971
|
+
}
|
|
27972
|
+
}
|
|
27973
|
+
return best !== null && bestScore <= Math.max(3, best.length / 3) ? ` Did you mean "${best}"?` : "";
|
|
27974
|
+
};
|
|
27975
|
+
const REJECTED_KEY_CHARS = 40;
|
|
27976
|
+
const scanSubscriptions = (input) => {
|
|
27977
|
+
if (input === void 0 || input === null) {
|
|
27978
|
+
return { patterns: [], rejected: [], unusable: false, key: "" };
|
|
27979
|
+
}
|
|
27980
|
+
const raw = typeof input === "string" ? [input] : input;
|
|
27981
|
+
if (!Array.isArray(raw)) {
|
|
27982
|
+
return {
|
|
27983
|
+
patterns: [],
|
|
27984
|
+
rejected: [],
|
|
27985
|
+
unusable: true,
|
|
27986
|
+
key: `!${typeof input}`
|
|
27987
|
+
};
|
|
27988
|
+
}
|
|
27989
|
+
const patterns = [];
|
|
27990
|
+
const rejected = [];
|
|
27991
|
+
for (const entry of raw) {
|
|
27992
|
+
if (typeof entry !== "string") {
|
|
27993
|
+
rejected.push(entry);
|
|
27994
|
+
continue;
|
|
27995
|
+
}
|
|
27996
|
+
const pattern = entry.trim();
|
|
27997
|
+
if (pattern === "" || patterns.includes(pattern))
|
|
27998
|
+
continue;
|
|
27999
|
+
patterns.push(pattern);
|
|
28000
|
+
}
|
|
28001
|
+
const key = JSON.stringify(patterns) + (rejected.length > 0 ? `!${rejected.map((entry) => describeEntry(entry).slice(0, REJECTED_KEY_CHARS)).join(",")}` : "");
|
|
28002
|
+
return { patterns, rejected, unusable: false, key };
|
|
28003
|
+
};
|
|
28004
|
+
const normalizeSubscriptions = (input) => {
|
|
28005
|
+
const { patterns, rejected, unusable, key } = scanSubscriptions(input);
|
|
28006
|
+
const problems = [];
|
|
28007
|
+
const warnings = [];
|
|
28008
|
+
if (unusable) {
|
|
28009
|
+
problems.push(`eventSubscriptions must be an array of strings, received ${typeof input}. No events will be delivered.`);
|
|
28010
|
+
return { patterns, key, problems, warnings };
|
|
28011
|
+
}
|
|
28012
|
+
for (const entry of rejected) {
|
|
28013
|
+
problems.push(`eventSubscriptions entry ${describeEntry(entry)} is not a string and was ignored.`);
|
|
28014
|
+
}
|
|
28015
|
+
for (const pattern of patterns) {
|
|
28016
|
+
if (pattern === "*" || KNOWN_NAMES.has(pattern))
|
|
28017
|
+
continue;
|
|
28018
|
+
if (pattern.endsWith(".*")) {
|
|
28019
|
+
const family = pattern.slice(0, -2);
|
|
28020
|
+
if (!KNOWN_FAMILIES.has(family)) {
|
|
28021
|
+
const hint2 = suggest(family, KNOWN_FAMILIES);
|
|
28022
|
+
(hint2 ? problems : warnings).push(`"${pattern}" is not a known event family.${hint2}`);
|
|
28023
|
+
}
|
|
28024
|
+
continue;
|
|
28025
|
+
}
|
|
28026
|
+
const hint = suggest(pattern, KNOWN_NAMES);
|
|
28027
|
+
(hint ? problems : warnings).push(`"${pattern}" is not an event this SDK version emits.${hint}`);
|
|
28028
|
+
}
|
|
28029
|
+
const present = input !== void 0 && input !== null;
|
|
28030
|
+
if (present && patterns.length === 0 && problems.length === 0) {
|
|
28031
|
+
problems.push('eventSubscriptions is empty, so onEvent will never fire. Pass e.g. ["recording.*", "activity.*"] or ["*"].');
|
|
28032
|
+
}
|
|
28033
|
+
return { patterns, key, problems, warnings };
|
|
28034
|
+
};
|
|
28035
|
+
const reported = /* @__PURE__ */ new Set();
|
|
28036
|
+
const VALID_VALUES = `Valid values are "*", a family wildcard (${SDK_EVENT_FAMILIES.map((f) => `"${f}.*"`).join(", ")}), or an exact name (${KNOWN_SDK_EVENT_NAMES.join(", ")}).`;
|
|
28037
|
+
const reportOnce = (level, signature, message) => {
|
|
28038
|
+
if (reported.has(signature))
|
|
28039
|
+
return;
|
|
28040
|
+
reported.add(signature);
|
|
28041
|
+
if (level === "error")
|
|
28042
|
+
logger.configError(message);
|
|
28043
|
+
else
|
|
28044
|
+
logger.warn(message);
|
|
28045
|
+
};
|
|
28046
|
+
const reportSubscriptionProblems = ({ key, problems, warnings }) => {
|
|
28047
|
+
if (problems.length > 0) {
|
|
28048
|
+
reportOnce("error", `error:${key}:${problems.join("|")}`, `[Sofia SDK] eventSubscriptions: ${problems.join(" ")} ${VALID_VALUES}`);
|
|
28049
|
+
}
|
|
28050
|
+
if (warnings.length > 0) {
|
|
28051
|
+
reportOnce("warn", `warn:${key}:${warnings.join("|")}`, `[Sofia SDK] eventSubscriptions: ${warnings.join(" ")} ${VALID_VALUES}`);
|
|
28052
|
+
}
|
|
28053
|
+
};
|
|
28054
|
+
const reportHandlerWithoutSubscriptions = () => {
|
|
28055
|
+
reportOnce("error", "onEvent:no-subscriptions", "[Sofia SDK] onEvent: onEvent was provided without eventSubscriptions, so no events will be delivered. " + VALID_VALUES);
|
|
28056
|
+
};
|
|
28057
|
+
const compileSubscription = (input) => {
|
|
28058
|
+
const normalized = normalizeSubscriptions(input);
|
|
28059
|
+
reportSubscriptionProblems(normalized);
|
|
28060
|
+
const { patterns } = normalized;
|
|
28061
|
+
if (patterns.length === 0)
|
|
28062
|
+
return () => false;
|
|
28063
|
+
if (patterns.includes("*"))
|
|
28064
|
+
return () => true;
|
|
28065
|
+
const exact = /* @__PURE__ */ new Set();
|
|
28066
|
+
const families = /* @__PURE__ */ new Set();
|
|
28067
|
+
for (const pattern of patterns) {
|
|
28068
|
+
if (pattern.endsWith(".*"))
|
|
28069
|
+
families.add(pattern.slice(0, -2));
|
|
28070
|
+
else
|
|
28071
|
+
exact.add(pattern);
|
|
28072
|
+
}
|
|
28073
|
+
if (families.size === 0)
|
|
28074
|
+
return (name) => exact.has(name);
|
|
28075
|
+
return (name) => {
|
|
28076
|
+
if (exact.has(name))
|
|
28077
|
+
return true;
|
|
28078
|
+
const dot = name.indexOf(".");
|
|
28079
|
+
return dot > 0 && families.has(name.slice(0, dot));
|
|
28080
|
+
};
|
|
28081
|
+
};
|
|
28082
|
+
const subscriptionKey = (input) => scanSubscriptions(input).key;
|
|
28083
|
+
|
|
28084
|
+
const QUEUE_CAP = 200;
|
|
28085
|
+
let handler = null;
|
|
28086
|
+
let matches = () => false;
|
|
28087
|
+
let sessionId = null;
|
|
28088
|
+
let seq = 0;
|
|
28089
|
+
let queue$1 = [];
|
|
28090
|
+
let draining = false;
|
|
28091
|
+
let handlerFailed = false;
|
|
28092
|
+
let registrations = 0;
|
|
28093
|
+
const drain = () => {
|
|
28094
|
+
draining = false;
|
|
28095
|
+
const batch = queue$1;
|
|
28096
|
+
queue$1 = [];
|
|
28097
|
+
const current = handler;
|
|
28098
|
+
if (!current)
|
|
28099
|
+
return;
|
|
28100
|
+
for (const event of batch) {
|
|
28101
|
+
try {
|
|
28102
|
+
current(event);
|
|
28103
|
+
} catch {
|
|
28104
|
+
if (!handlerFailed) {
|
|
28105
|
+
handlerFailed = true;
|
|
28106
|
+
logger.warn("[SdkEvents] onEvent handler threw; further failures suppressed");
|
|
28107
|
+
}
|
|
28108
|
+
}
|
|
28109
|
+
}
|
|
28110
|
+
};
|
|
28111
|
+
const schedule = () => {
|
|
28112
|
+
if (draining)
|
|
28113
|
+
return;
|
|
28114
|
+
draining = true;
|
|
28115
|
+
queueMicrotask(drain);
|
|
28116
|
+
};
|
|
28117
|
+
const SdkEventBus = {
|
|
28118
|
+
/**
|
|
28119
|
+
* Installs the host handler. Returns an unsubscribe. Events that matched
|
|
28120
|
+
* the subscription but arrived before a handler existed are queued and
|
|
28121
|
+
* delivered on the next microtask. That window is real: React runs child
|
|
28122
|
+
* effects before parent ones, so a provider below `Omniscribe` can emit
|
|
28123
|
+
* after `setSubscription` and before this call.
|
|
28124
|
+
*/
|
|
28125
|
+
setHandler(next) {
|
|
28126
|
+
registrations += 1;
|
|
28127
|
+
if (next && handler && registrations > 1) {
|
|
28128
|
+
logger.warn("[SdkEvents] a second onEvent handler was registered. The SDK supports one <Omniscribe> per page; the newest handler wins.");
|
|
28129
|
+
}
|
|
28130
|
+
handler = next;
|
|
28131
|
+
if (next && queue$1.length > 0)
|
|
28132
|
+
schedule();
|
|
28133
|
+
return () => {
|
|
28134
|
+
if (handler === next)
|
|
28135
|
+
handler = null;
|
|
28136
|
+
};
|
|
28137
|
+
},
|
|
28138
|
+
setSubscription(patterns) {
|
|
28139
|
+
matches = compileSubscription(patterns);
|
|
28140
|
+
},
|
|
28141
|
+
setSessionId(next) {
|
|
28142
|
+
sessionId = next;
|
|
28143
|
+
},
|
|
28144
|
+
/**
|
|
28145
|
+
* Cheap guard for callers on a hot path who would otherwise build a
|
|
28146
|
+
* payload for nobody.
|
|
28147
|
+
*/
|
|
28148
|
+
wants(name) {
|
|
28149
|
+
return matches(name);
|
|
28150
|
+
},
|
|
28151
|
+
/**
|
|
28152
|
+
* Queues an event for delivery on the next microtask.
|
|
28153
|
+
*
|
|
28154
|
+
* Never throws. Deferring delivery does three things at once: host code
|
|
28155
|
+
* never runs inside React's render phase (where a `setState` would
|
|
28156
|
+
* throw), a slow handler cannot block `socket.onmessage` on the audio
|
|
28157
|
+
* path, and a handler that itself triggers an event cannot recurse —
|
|
28158
|
+
* the re-entrant call only appends to a queue the current drain has
|
|
28159
|
+
* already taken. One shared drain, not one microtask per event, so `seq`
|
|
28160
|
+
* ordering is preserved.
|
|
28161
|
+
*/
|
|
28162
|
+
emit(name, payload, level = "info") {
|
|
28163
|
+
if (!matches(name))
|
|
28164
|
+
return;
|
|
28165
|
+
queue$1.push({
|
|
28166
|
+
name,
|
|
28167
|
+
family: familyOf(name),
|
|
28168
|
+
level,
|
|
28169
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
28170
|
+
seq: ++seq,
|
|
28171
|
+
sdkVersion: version$2,
|
|
28172
|
+
sessionId,
|
|
28173
|
+
payload
|
|
28174
|
+
});
|
|
28175
|
+
if (queue$1.length > QUEUE_CAP)
|
|
28176
|
+
queue$1.shift();
|
|
28177
|
+
if (handler)
|
|
28178
|
+
schedule();
|
|
28179
|
+
},
|
|
28180
|
+
/** Test-only: restores the module to its initial state. */
|
|
28181
|
+
__resetForTests() {
|
|
28182
|
+
handler = null;
|
|
28183
|
+
matches = () => false;
|
|
28184
|
+
sessionId = null;
|
|
28185
|
+
seq = 0;
|
|
28186
|
+
queue$1 = [];
|
|
28187
|
+
draining = false;
|
|
28188
|
+
handlerFailed = false;
|
|
28189
|
+
registrations = 0;
|
|
28190
|
+
}
|
|
28191
|
+
};
|
|
28192
|
+
|
|
27851
28193
|
const SettingsContext = React.createContext(void 0);
|
|
27852
28194
|
const useSettingsContext = () => {
|
|
27853
28195
|
const context = React.useContext(SettingsContext);
|
|
@@ -27872,6 +28214,7 @@ const SettingsProvider = ({ predefinedLanguage, templateId, toolArgs, updateTemp
|
|
|
27872
28214
|
const [minorPolicy, setMinorPolicy] = React.useState(DEFAULT_MINOR_POLICY);
|
|
27873
28215
|
const [minorAgeThreshold, setMinorAgeThreshold] = React.useState(DEFAULT_MINOR_AGE_THRESHOLD);
|
|
27874
28216
|
const [isLoading, setIsLoading] = React.useState(true);
|
|
28217
|
+
const hasEmittedReadyRef = React.useRef(false);
|
|
27875
28218
|
const isInitializedRef = React.useRef(false);
|
|
27876
28219
|
const applySettings = React.useCallback((parsed) => {
|
|
27877
28220
|
setDictionary(parsed.dictionary);
|
|
@@ -27922,6 +28265,10 @@ const SettingsProvider = ({ predefinedLanguage, templateId, toolArgs, updateTemp
|
|
|
27922
28265
|
SettingsCache.getInstance().clear();
|
|
27923
28266
|
} finally {
|
|
27924
28267
|
setIsLoading(false);
|
|
28268
|
+
if (!hasEmittedReadyRef.current) {
|
|
28269
|
+
hasEmittedReadyRef.current = true;
|
|
28270
|
+
SdkEventBus.emit("lifecycle.ready", {});
|
|
28271
|
+
}
|
|
27925
28272
|
}
|
|
27926
28273
|
}, [toolArgs, templateId, predefinedLanguage, applySettings]);
|
|
27927
28274
|
const reloadSettings = React.useCallback(async () => {
|
|
@@ -33649,8 +33996,151 @@ const evaluateMinorRule = ({ birthDate, policy, threshold, now }) => {
|
|
|
33649
33996
|
|
|
33650
33997
|
const postAppEvent = (event) => requester.post("/app-events", event).catch(() => void 0);
|
|
33651
33998
|
|
|
33999
|
+
const ACTIVITY_THROTTLE_MS = 5e3;
|
|
34000
|
+
const lastEmittedAt = /* @__PURE__ */ new Map();
|
|
34001
|
+
const shouldEmit = (key) => {
|
|
34002
|
+
const now = Date.now();
|
|
34003
|
+
const previous = lastEmittedAt.get(key);
|
|
34004
|
+
if (previous !== void 0 && now - previous < ACTIVITY_THROTTLE_MS) {
|
|
34005
|
+
return false;
|
|
34006
|
+
}
|
|
34007
|
+
lastEmittedAt.set(key, now);
|
|
34008
|
+
return true;
|
|
34009
|
+
};
|
|
34010
|
+
const emitInteraction = (kind) => {
|
|
34011
|
+
if (!SdkEventBus.wants("activity.interaction"))
|
|
34012
|
+
return;
|
|
34013
|
+
if (!shouldEmit(`interaction:${kind}`))
|
|
34014
|
+
return;
|
|
34015
|
+
SdkEventBus.emit("activity.interaction", { kind });
|
|
34016
|
+
};
|
|
34017
|
+
const emitTyping = (surface) => {
|
|
34018
|
+
if (!SdkEventBus.wants("activity.typing"))
|
|
34019
|
+
return;
|
|
34020
|
+
if (!shouldEmit(`typing:${surface}`))
|
|
34021
|
+
return;
|
|
34022
|
+
SdkEventBus.emit("activity.typing", { surface });
|
|
34023
|
+
};
|
|
34024
|
+
|
|
34025
|
+
let open$1 = false;
|
|
34026
|
+
const openReportBracket = () => {
|
|
34027
|
+
if (open$1)
|
|
34028
|
+
return;
|
|
34029
|
+
open$1 = true;
|
|
34030
|
+
SdkEventBus.emit("report.generation_started", {});
|
|
34031
|
+
};
|
|
34032
|
+
const closeReportBracket = (ok) => {
|
|
34033
|
+
if (!open$1)
|
|
34034
|
+
return;
|
|
34035
|
+
open$1 = false;
|
|
34036
|
+
SdkEventBus.emit("report.settled", { ok });
|
|
34037
|
+
};
|
|
34038
|
+
|
|
34039
|
+
const RECORDING_HEARTBEAT_MS = 3e4;
|
|
34040
|
+
let lastBeatAt = null;
|
|
34041
|
+
const emitRecordingHeartbeat = () => {
|
|
34042
|
+
if (!SdkEventBus.wants("recording.heartbeat"))
|
|
34043
|
+
return;
|
|
34044
|
+
const now = Date.now();
|
|
34045
|
+
if (lastBeatAt !== null && now - lastBeatAt < RECORDING_HEARTBEAT_MS)
|
|
34046
|
+
return;
|
|
34047
|
+
lastBeatAt = now;
|
|
34048
|
+
SdkEventBus.emit("recording.heartbeat", {});
|
|
34049
|
+
};
|
|
34050
|
+
const resetRecordingHeartbeat = () => {
|
|
34051
|
+
lastBeatAt = null;
|
|
34052
|
+
};
|
|
34053
|
+
|
|
34054
|
+
const INTERACTION_KIND = {
|
|
34055
|
+
recording_button: "recording",
|
|
34056
|
+
chat_mic_button: "chat",
|
|
34057
|
+
attach_file_button: "chat",
|
|
34058
|
+
remove_file_button: "chat",
|
|
34059
|
+
edit_message_button: "chat",
|
|
34060
|
+
cancel_edit_message_button: "chat",
|
|
34061
|
+
send_edit_message_button: "chat",
|
|
34062
|
+
copy_human_message_button: "chat",
|
|
34063
|
+
copy_ai_message_button: "chat",
|
|
34064
|
+
settings_button: "settings",
|
|
34065
|
+
settings_back_button: "settings",
|
|
34066
|
+
settings_section_button: "settings",
|
|
34067
|
+
select_audio_environment: "settings",
|
|
34068
|
+
compile_summary_button: "report",
|
|
34069
|
+
regenerate_summary_button: "report",
|
|
34070
|
+
generate_extras_button: "report",
|
|
34071
|
+
expand_transcription_button: "transcript",
|
|
34072
|
+
history_thread_item: "history",
|
|
34073
|
+
close_widget_button: "widget",
|
|
34074
|
+
main_menu_button: "widget",
|
|
34075
|
+
play_panel_button: "widget"
|
|
34076
|
+
};
|
|
34077
|
+
const CLICK_FALLBACK_KIND = "widget";
|
|
34078
|
+
const RECORDING_MODES = ["consultation", "dictation"];
|
|
34079
|
+
const AUDIO_LOSS_CAUSES = ["mic", "network", "server"];
|
|
34080
|
+
const readNumber = (payload, key) => {
|
|
34081
|
+
const value = payload?.[key];
|
|
34082
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
34083
|
+
};
|
|
34084
|
+
const readMode = (payload) => {
|
|
34085
|
+
const value = payload?.mode;
|
|
34086
|
+
return typeof value === "string" && RECORDING_MODES.includes(value) ? value : "consultation";
|
|
34087
|
+
};
|
|
34088
|
+
const readCause = (payload) => {
|
|
34089
|
+
const value = payload?.cause;
|
|
34090
|
+
return typeof value === "string" && AUDIO_LOSS_CAUSES.includes(value) ? value : "server";
|
|
34091
|
+
};
|
|
34092
|
+
const fanOutAppEvent = (input) => {
|
|
34093
|
+
try {
|
|
34094
|
+
const { event_type, event_name, payload } = input;
|
|
34095
|
+
if (event_type === "click") {
|
|
34096
|
+
emitInteraction(INTERACTION_KIND[event_name] ?? CLICK_FALLBACK_KIND);
|
|
34097
|
+
}
|
|
34098
|
+
switch (event_name) {
|
|
34099
|
+
case "recording_started":
|
|
34100
|
+
resetRecordingHeartbeat();
|
|
34101
|
+
SdkEventBus.emit("recording.started", { mode: readMode(payload) });
|
|
34102
|
+
break;
|
|
34103
|
+
case "recording_stopped":
|
|
34104
|
+
SdkEventBus.emit("recording.stopped", {
|
|
34105
|
+
mode: readMode(payload),
|
|
34106
|
+
durationSeconds: readNumber(payload, "duration_seconds")
|
|
34107
|
+
});
|
|
34108
|
+
break;
|
|
34109
|
+
// The mic/network emitter reports the length of the gap once audio
|
|
34110
|
+
// recovers. The server-close emitter has no gap to measure — capture
|
|
34111
|
+
// is torn down on the spot — and reports the recording position
|
|
34112
|
+
// instead, so fall back to that rather than hand the host a silent 0.
|
|
34113
|
+
case "audio_lost":
|
|
34114
|
+
SdkEventBus.emit("recording.audio_lost", {
|
|
34115
|
+
cause: readCause(payload),
|
|
34116
|
+
durationSeconds: readNumber(payload, "duration_seconds") || readNumber(payload, "recording_position_seconds")
|
|
34117
|
+
}, "warn");
|
|
34118
|
+
break;
|
|
34119
|
+
case "mic_disconnected":
|
|
34120
|
+
SdkEventBus.emit("recording.microphone_disconnected", {}, "warn");
|
|
34121
|
+
break;
|
|
34122
|
+
// A report request is in flight. The host must suppress its idle
|
|
34123
|
+
// timer until report.settled, or it will close the widget during
|
|
34124
|
+
// generation — which looks exactly like idleness and loses the note.
|
|
34125
|
+
// openReportBracket ignores a second click while one is in flight, so
|
|
34126
|
+
// the pair stays balanced.
|
|
34127
|
+
case "compile_summary_button":
|
|
34128
|
+
case "regenerate_summary_button":
|
|
34129
|
+
openReportBracket();
|
|
34130
|
+
break;
|
|
34131
|
+
case "close_widget_button":
|
|
34132
|
+
SdkEventBus.emit("lifecycle.closed", {});
|
|
34133
|
+
break;
|
|
34134
|
+
default:
|
|
34135
|
+
break;
|
|
34136
|
+
}
|
|
34137
|
+
} catch {
|
|
34138
|
+
}
|
|
34139
|
+
};
|
|
34140
|
+
|
|
33652
34141
|
const EventTracker = {
|
|
33653
34142
|
track(input) {
|
|
34143
|
+
fanOutAppEvent(input);
|
|
33654
34144
|
const event = {
|
|
33655
34145
|
event_type: input.event_type,
|
|
33656
34146
|
event_name: input.event_name,
|
|
@@ -36923,6 +37413,7 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
36923
37413
|
const audioData16kHz = resampleTo16kHZ(input, audioContext.sampleRate);
|
|
36924
37414
|
socket.send(audioData16kHz);
|
|
36925
37415
|
lastSendAtRef.current = Date.now();
|
|
37416
|
+
emitRecordingHeartbeat();
|
|
36926
37417
|
}
|
|
36927
37418
|
};
|
|
36928
37419
|
audioTracks.forEach((t) => {
|
|
@@ -38356,6 +38847,7 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38356
38847
|
});
|
|
38357
38848
|
}, []);
|
|
38358
38849
|
const setScalarEdit = React.useCallback((entryKey, value) => {
|
|
38850
|
+
emitTyping("note");
|
|
38359
38851
|
setEdits((prev) => {
|
|
38360
38852
|
const next = new Map(prev);
|
|
38361
38853
|
next.set(entryKey, value);
|
|
@@ -38363,6 +38855,7 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38363
38855
|
});
|
|
38364
38856
|
}, []);
|
|
38365
38857
|
const setRowFieldEdit = React.useCallback((entryKey, rowIndex, fieldKey, value) => {
|
|
38858
|
+
emitTyping("note");
|
|
38366
38859
|
setEdits((prev) => {
|
|
38367
38860
|
const next = new Map(prev);
|
|
38368
38861
|
next.set(rowFieldEditKey(entryKey, rowIndex, fieldKey), value);
|
|
@@ -38370,6 +38863,7 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38370
38863
|
});
|
|
38371
38864
|
}, []);
|
|
38372
38865
|
const setScalarGapValue = React.useCallback((key, value) => {
|
|
38866
|
+
emitTyping("note");
|
|
38373
38867
|
setFilledScalarGaps((prev) => {
|
|
38374
38868
|
const next = new Map(prev);
|
|
38375
38869
|
next.set(key, value);
|
|
@@ -38390,22 +38884,24 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38390
38884
|
selectedRows,
|
|
38391
38885
|
filledScalarGaps
|
|
38392
38886
|
}), [entries, selectedKeys, selectedRows, filledScalarGaps]);
|
|
38393
|
-
const
|
|
38394
|
-
|
|
38887
|
+
const blockingGaps = React.useMemo(() => {
|
|
38888
|
+
const out = [];
|
|
38395
38889
|
for (const g of scalarGaps) {
|
|
38396
38890
|
if (!g.mandatory)
|
|
38397
38891
|
continue;
|
|
38398
38892
|
const filled = filledScalarGaps.get(g.key);
|
|
38399
|
-
if (isEmptyValue(filled))
|
|
38400
|
-
|
|
38893
|
+
if (isEmptyValue(filled)) {
|
|
38894
|
+
out.push({ scope: "field", key: g.key, label: g.descriptor.label });
|
|
38895
|
+
}
|
|
38401
38896
|
}
|
|
38402
38897
|
for (const e of entries) {
|
|
38403
38898
|
if (!selectedKeys.has(e.key))
|
|
38404
38899
|
continue;
|
|
38405
38900
|
if (e.descriptor.kind !== "array-of-objects" && e.descriptor.mandatory) {
|
|
38406
38901
|
const v = edits.has(e.key) ? edits.get(e.key) : e.value;
|
|
38407
|
-
if (isEmptyValue(v))
|
|
38408
|
-
|
|
38902
|
+
if (isEmptyValue(v)) {
|
|
38903
|
+
out.push({ scope: "field", key: e.key, label: e.descriptor.label });
|
|
38904
|
+
}
|
|
38409
38905
|
}
|
|
38410
38906
|
if (e.descriptor.kind !== "array-of-objects")
|
|
38411
38907
|
continue;
|
|
@@ -38415,17 +38911,33 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38415
38911
|
return;
|
|
38416
38912
|
const row = mergeRowEdits(e.key, idx, rawRow, edits);
|
|
38417
38913
|
if (e.descriptor.discriminator && !pickBranch(e.descriptor, row)) {
|
|
38418
|
-
|
|
38914
|
+
out.push({
|
|
38915
|
+
scope: "row",
|
|
38916
|
+
key: e.key,
|
|
38917
|
+
groupLabel: e.descriptor.label,
|
|
38918
|
+
rowIndex: idx,
|
|
38919
|
+
label: null,
|
|
38920
|
+
fieldKey: e.descriptor.discriminator.propertyName
|
|
38921
|
+
});
|
|
38419
38922
|
return;
|
|
38420
38923
|
}
|
|
38421
|
-
const
|
|
38422
|
-
|
|
38423
|
-
|
|
38424
|
-
|
|
38924
|
+
for (const f of effectiveItemFields(e.descriptor, row)) {
|
|
38925
|
+
if (!f.mandatory)
|
|
38926
|
+
continue;
|
|
38927
|
+
if (isEmptyValue(row[f.key])) {
|
|
38928
|
+
out.push({
|
|
38929
|
+
scope: "row",
|
|
38930
|
+
key: e.key,
|
|
38931
|
+
groupLabel: e.descriptor.label,
|
|
38932
|
+
rowIndex: idx,
|
|
38933
|
+
label: f.label,
|
|
38934
|
+
fieldKey: f.key
|
|
38935
|
+
});
|
|
38936
|
+
}
|
|
38425
38937
|
}
|
|
38426
38938
|
});
|
|
38427
38939
|
}
|
|
38428
|
-
return
|
|
38940
|
+
return out;
|
|
38429
38941
|
}, [
|
|
38430
38942
|
entries,
|
|
38431
38943
|
scalarGaps,
|
|
@@ -38434,9 +38946,11 @@ const useReportPreviewState = ({ descriptors, report }) => {
|
|
|
38434
38946
|
edits,
|
|
38435
38947
|
filledScalarGaps
|
|
38436
38948
|
]);
|
|
38949
|
+
const blockingMandatoryCount = blockingGaps.length;
|
|
38437
38950
|
return {
|
|
38438
38951
|
entries,
|
|
38439
38952
|
scalarGaps,
|
|
38953
|
+
blockingGaps,
|
|
38440
38954
|
rowGaps,
|
|
38441
38955
|
selectedKeys,
|
|
38442
38956
|
selectedRows,
|
|
@@ -38824,10 +39338,22 @@ const InsertionPreviewModal = ({ template, report, classNames = {}, onApply, onC
|
|
|
38824
39338
|
}) : formatMessage({
|
|
38825
39339
|
id: "Re-extracting the report… the new fields will replace this preview when ready.",
|
|
38826
39340
|
defaultMessage: "Re-extracting the report… the new fields will replace this preview when ready."
|
|
38827
|
-
}) })] })] }), (state.scalarGaps.length > 0 || state.blockingMandatoryCount > 0) && jsxRuntimeExports.jsx("p", { className: "omniscribe_insertion-preview__sub", children: state.blockingMandatoryCount > 0 ? jsxRuntimeExports.
|
|
39341
|
+
}) })] })] }), (state.scalarGaps.length > 0 || state.blockingMandatoryCount > 0) && jsxRuntimeExports.jsx("p", { className: "omniscribe_insertion-preview__sub", children: state.blockingMandatoryCount > 0 ? jsxRuntimeExports.jsxs("strong", { className: "omniscribe_insertion-preview__sub--blocking", children: [formatMessage({
|
|
38828
39342
|
id: "{count} mandatory fields must be filled before applying",
|
|
38829
39343
|
defaultMessage: "{count, plural, one {# mandatory field} other {# mandatory fields}} must be filled before applying"
|
|
38830
|
-
}, { count: state.blockingMandatoryCount })
|
|
39344
|
+
}, { count: state.blockingMandatoryCount }), ": ", state.blockingGaps.slice(0, BLOCKING_GAPS_SHOWN).map((g) => g.scope === "field" ? g.label : g.label === null ? formatMessage({
|
|
39345
|
+
id: "{group} · row {row}",
|
|
39346
|
+
defaultMessage: "{group} · row {row}"
|
|
39347
|
+
}, { group: g.groupLabel, row: g.rowIndex + 1 }) : formatMessage({
|
|
39348
|
+
id: "{group} · row {row} · {field}",
|
|
39349
|
+
defaultMessage: "{group} · row {row} · {field}"
|
|
39350
|
+
}, {
|
|
39351
|
+
group: g.groupLabel,
|
|
39352
|
+
row: g.rowIndex + 1,
|
|
39353
|
+
field: g.label
|
|
39354
|
+
})).join(", "), state.blockingGaps.length > BLOCKING_GAPS_SHOWN && formatMessage({ id: " +{count} more", defaultMessage: " +{count} more" }, {
|
|
39355
|
+
count: state.blockingGaps.length - BLOCKING_GAPS_SHOWN
|
|
39356
|
+
})] }) : formatMessage({
|
|
38831
39357
|
id: "{count} fields need your attention",
|
|
38832
39358
|
defaultMessage: "{count, plural, one {# field needs} other {# fields need}} your attention"
|
|
38833
39359
|
}, { count: state.scalarGaps.length }) }), jsxRuntimeExports.jsxs("div", { className: cx("omniscribe_insertion-preview__body", classNames.body), children: [jsxRuntimeExports.jsx(AttachmentsSection, { attachments }), state.entries.map((entry) => jsxRuntimeExports.jsx(EntrySection, { entry, state, classNames }, entry.key)), state.scalarGaps.length > 0 && jsxRuntimeExports.jsxs("section", { className: cx("omniscribe_insertion-preview__group omniscribe_insertion-preview__group--gaps", classNames.group), children: [jsxRuntimeExports.jsxs("header", { className: "omniscribe_insertion-preview__group-head", children: [jsxRuntimeExports.jsx("span", { className: "omniscribe_insertion-preview__group-name omniscribe_insertion-preview__group-name--gap", children: formatMessage({
|
|
@@ -38870,18 +39396,38 @@ const InsertionPreviewModal = ({ template, report, classNames = {}, onApply, onC
|
|
|
38870
39396
|
};
|
|
38871
39397
|
const EntrySection = ({ entry, state, classNames }) => {
|
|
38872
39398
|
const { formatMessage } = useIntl();
|
|
38873
|
-
const
|
|
38874
|
-
|
|
38875
|
-
|
|
38876
|
-
|
|
39399
|
+
const blockingRows = reactExports.useMemo(() => state.blockingGaps.filter((g) => g.scope === "row" && g.key === entry.key), [state.blockingGaps, entry.key]);
|
|
39400
|
+
const hasMandatoryRowGap = blockingRows.length > 0;
|
|
39401
|
+
const missingFieldCount = blockingRows.filter((g) => g.scope === "row" && g.label !== null).length;
|
|
39402
|
+
const untypedRowCount = blockingRows.length - missingFieldCount;
|
|
39403
|
+
const groupGapSummary = [
|
|
39404
|
+
missingFieldCount > 0 && formatMessage({
|
|
39405
|
+
id: "{count} mandatory fields missing in this group",
|
|
39406
|
+
defaultMessage: "{count, plural, one {# mandatory field missing} other {# mandatory fields missing}} in this group"
|
|
39407
|
+
}, { count: missingFieldCount }),
|
|
39408
|
+
untypedRowCount > 0 && formatMessage({
|
|
39409
|
+
id: "{count} rows need a type selected in this group",
|
|
39410
|
+
defaultMessage: "{count, plural, one {# row needs} other {# rows need}} a type selected in this group"
|
|
39411
|
+
}, { count: untypedRowCount })
|
|
39412
|
+
].filter(Boolean).join(" · ");
|
|
38877
39413
|
const [expanded, setExpanded] = reactExports.useState(hasMandatoryRowGap);
|
|
38878
39414
|
reactExports.useEffect(() => {
|
|
38879
39415
|
if (hasMandatoryRowGap)
|
|
38880
39416
|
setExpanded(true);
|
|
38881
39417
|
}, [hasMandatoryRowGap]);
|
|
39418
|
+
const missingKeysOfRow = (idx) => {
|
|
39419
|
+
const keys = new Set(state.rowGaps.get(entry.key)?.find((g) => g.index === idx)?.missingKeys);
|
|
39420
|
+
for (const g of blockingRows) {
|
|
39421
|
+
if (g.scope === "row" && g.rowIndex === idx)
|
|
39422
|
+
keys.add(g.fieldKey);
|
|
39423
|
+
}
|
|
39424
|
+
return [...keys];
|
|
39425
|
+
};
|
|
38882
39426
|
if (entry.descriptor.kind === "array-of-objects") {
|
|
38883
39427
|
const rows = entry.value;
|
|
38884
|
-
return jsxRuntimeExports.jsxs("section", { className: cx("omniscribe_insertion-preview__group", classNames.group), children: [jsxRuntimeExports.jsxs("header", { className: "omniscribe_insertion-preview__group-head", children: [jsxRuntimeExports.jsxs("label", { className: "omniscribe_insertion-preview__row", children: [jsxRuntimeExports.jsx("input", { type: "checkbox", className: "omniscribe_insertion-preview__row-checkbox", checked: state.selectedKeys.has(entry.key), onChange: () => state.toggleEntry(entry.key), "aria-label": formatMessage({ id: "Toggle {label}", defaultMessage: "Toggle {label}" }, { label: entry.descriptor.label }) }), jsxRuntimeExports.jsx("div", { className: "omniscribe_insertion-preview__row-body", children: jsxRuntimeExports.jsxs("div", { className: "omniscribe_insertion-preview__row-label", children: [entry.descriptor.label, " · ", rows.length
|
|
39428
|
+
return jsxRuntimeExports.jsxs("section", { className: cx("omniscribe_insertion-preview__group", classNames.group), children: [jsxRuntimeExports.jsxs("header", { className: "omniscribe_insertion-preview__group-head", children: [jsxRuntimeExports.jsxs("label", { className: "omniscribe_insertion-preview__row", children: [jsxRuntimeExports.jsx("input", { type: "checkbox", className: "omniscribe_insertion-preview__row-checkbox", checked: state.selectedKeys.has(entry.key), onChange: () => state.toggleEntry(entry.key), "aria-label": formatMessage({ id: "Toggle {label}", defaultMessage: "Toggle {label}" }, { label: entry.descriptor.label }) }), jsxRuntimeExports.jsx("div", { className: "omniscribe_insertion-preview__row-body", children: jsxRuntimeExports.jsxs("div", { className: "omniscribe_insertion-preview__row-label", children: [entry.descriptor.label, " · ", rows.length, hasMandatoryRowGap && // `role="img"` + `aria-label`: a `title` alone is not exposed
|
|
39429
|
+
// reliably, so a screen reader announced only "star 1".
|
|
39430
|
+
jsxRuntimeExports.jsxs("span", { className: "omniscribe_insertion-preview__group-count--gap", role: "img", title: groupGapSummary, "aria-label": groupGapSummary, children: [" ", "★ ", blockingRows.length] })] }) })] }), jsxRuntimeExports.jsx("button", { type: "button", className: "omniscribe_insertion-preview__btn", onClick: () => setExpanded((v) => !v), children: expanded ? formatMessage({ id: "Collapse", defaultMessage: "Collapse" }) : formatMessage({ id: "Edit", defaultMessage: "Edit" }) })] }), expanded && rows.map((row, idx) => jsxRuntimeExports.jsx(RowItem, { entryKey: entry.key, rowIndex: idx, row, descriptor: entry.descriptor, state, missingKeys: missingKeysOfRow(idx), classNames }, idx))] });
|
|
38885
39431
|
}
|
|
38886
39432
|
return jsxRuntimeExports.jsx("section", { className: cx("omniscribe_insertion-preview__group", classNames.group), children: jsxRuntimeExports.jsxs("label", { className: cx("omniscribe_insertion-preview__row", classNames.row), children: [jsxRuntimeExports.jsx("input", { type: "checkbox", className: "omniscribe_insertion-preview__row-checkbox", checked: state.selectedKeys.has(entry.key), onChange: () => state.toggleEntry(entry.key), "aria-label": `Toggle ${entry.descriptor.label}` }), jsxRuntimeExports.jsxs("div", { className: "omniscribe_insertion-preview__row-body", children: [jsxRuntimeExports.jsx("div", { className: "omniscribe_insertion-preview__row-label", children: entry.descriptor.label }), jsxRuntimeExports.jsx(FieldEditControl, { descriptor: entry.descriptor, value: state.edits.has(entry.key) ? state.edits.get(entry.key) : entry.value, onChange: (v) => state.setScalarEdit(entry.key, v) })] })] }) });
|
|
38887
39433
|
};
|
|
@@ -38922,6 +39468,7 @@ const RowItem = ({ entryKey, rowIndex, row, descriptor, state, missingKeys, clas
|
|
|
38922
39468
|
})] })] }), jsxRuntimeExports.jsx(FieldEditControl, { descriptor: fd, value, onChange: (v) => state.setRowFieldEdit(entryKey, rowIndex, fd.key, v) })] }, fd.key);
|
|
38923
39469
|
}) })] })] });
|
|
38924
39470
|
};
|
|
39471
|
+
const BLOCKING_GAPS_SHOWN = 3;
|
|
38925
39472
|
const ScalarGapRow = ({ descriptor, value, onChange, classNames, mandatory }) => {
|
|
38926
39473
|
const { formatMessage } = useIntl();
|
|
38927
39474
|
return jsxRuntimeExports.jsxs("div", { className: cx(`omniscribe_insertion-preview__row omniscribe_insertion-preview__row--gap${mandatory ? " omniscribe_insertion-preview__row--mandatory" : ""}`, classNames.gapRow), children: [jsxRuntimeExports.jsx("span", { className: `omniscribe_insertion-preview__gap-icon${mandatory ? " omniscribe_insertion-preview__gap-icon--mandatory" : ""}`, "aria-hidden": true, children: mandatory ? "★" : "⚠" }), jsxRuntimeExports.jsxs("div", { className: "omniscribe_insertion-preview__row-body", children: [jsxRuntimeExports.jsxs("div", { className: "omniscribe_insertion-preview__row-label", children: [descriptor.label, mandatory && jsxRuntimeExports.jsx("span", { className: "omniscribe_insertion-preview__mandatory-pill", "aria-label": formatMessage({
|
|
@@ -39462,6 +40009,7 @@ const useReportGeneration = (options) => {
|
|
|
39462
40009
|
} finally {
|
|
39463
40010
|
setState((prev) => ({ ...prev, generating: false }));
|
|
39464
40011
|
regenerateInflightRef.current = false;
|
|
40012
|
+
closeReportBracket(false);
|
|
39465
40013
|
}
|
|
39466
40014
|
}, [
|
|
39467
40015
|
abortIfBlocked,
|
|
@@ -39501,6 +40049,7 @@ const useReportGeneration = (options) => {
|
|
|
39501
40049
|
handleReport?.(result);
|
|
39502
40050
|
}
|
|
39503
40051
|
trackEvent("event", "summary_compiled");
|
|
40052
|
+
closeReportBracket(true);
|
|
39504
40053
|
if (patientId && doctorId) {
|
|
39505
40054
|
await saveDayData({
|
|
39506
40055
|
patientId,
|
|
@@ -39642,6 +40191,7 @@ const useReportGeneration = (options) => {
|
|
|
39642
40191
|
}
|
|
39643
40192
|
} finally {
|
|
39644
40193
|
generateInflightRef.current = false;
|
|
40194
|
+
closeReportBracket(false);
|
|
39645
40195
|
setUserPendingClick(false);
|
|
39646
40196
|
const finalPid = appointmentData?.patientId;
|
|
39647
40197
|
const finalDid = appointmentData?.doctorId;
|
|
@@ -163083,29 +163633,24 @@ const ChatFooter = ({ inputValue, inputIsValid, inputMaxLength, textareaRef, onI
|
|
|
163083
163633
|
isLoading: generateState.isUserReportLoading,
|
|
163084
163634
|
onClick: () => generateState.tryStartGenerate(generateState.showRegenerateReport ? "regenerate" : "generate")
|
|
163085
163635
|
}
|
|
163086
|
-
), generateState && showExtras && !generateState.isRecording && !generateState.enabled && !generateState.connectionLoading && jsxRuntimeExports.jsx(ExtrasButtons, { categories, disabled: reportLoading || isActivationBlocked })] }), jsxRuntimeExports.jsxs("
|
|
163636
|
+
), generateState && showExtras && !generateState.isRecording && !generateState.enabled && !generateState.connectionLoading && jsxRuntimeExports.jsx(ExtrasButtons, { categories, disabled: reportLoading || isActivationBlocked })] }), jsxRuntimeExports.jsxs("div", { className: "omniscribe_chat-view-combined-footer-row", children: [jsxRuntimeExports.jsx("input", { ref: fileInputRef, type: "file", multiple: true, accept: "image/*,.pdf", onChange: onFileSelect, style: { display: "none" } }), jsxRuntimeExports.jsxs("div", { className: `omniscribe_chat-view-combined-input-container${uploadedFiles.length > 0 ? " omniscribe_chat-view-combined-input-container--with-files" : ""}`, children: [uploadedFiles.length > 0 && jsxRuntimeExports.jsx("div", { className: "omniscribe_chat-view-combined-files-row", children: jsxRuntimeExports.jsx(FilePreview, { files: uploadedFiles, onRemove: onFileRemove }) }), jsxRuntimeExports.jsxs("div", { className: "omniscribe_chat-view-combined-input-row", children: [jsxRuntimeExports.jsx(Tooltip, { message: formatMessage({ id: "Attach file" }), side: "top", children: jsxRuntimeExports.jsx("button", { type: "button", className: "omniscribe_chat-view-combined-clip-icon", onClick: () => {
|
|
163087
163637
|
trackEvent("click", "attach_file_button");
|
|
163088
163638
|
onAttachClick();
|
|
163089
163639
|
}, disabled: uploadedFiles.length >= MAX_FILES, "aria-label": formatMessage({ id: "Attach file" }), children: jsxRuntimeExports.jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntimeExports.jsx("path", { d: "M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48" }) }) }) }), jsxRuntimeExports.jsx(Textarea, { ref: textareaRef, rows: 1, "data-testid": "sofia-chat-input", value: inputValue, variant: "secondary", onChange: onInputChange, onKeyDown: (e) => {
|
|
163090
163640
|
if (e.key === "Enter" && !e.shiftKey && !e.metaKey) {
|
|
163091
163641
|
e.preventDefault();
|
|
163092
|
-
|
|
163093
|
-
const form = el?.closest("form");
|
|
163094
|
-
form?.requestSubmit();
|
|
163642
|
+
onSubmit(e);
|
|
163095
163643
|
}
|
|
163096
163644
|
}, maxLength: inputMaxLength, className: "omniscribe_chat-view-combined-textarea no-scrollbar text-p", placeholder: formatMessage({
|
|
163097
163645
|
id: "What do you need to know?"
|
|
163098
163646
|
}) }), isLoading ? jsxRuntimeExports.jsx("button", { type: "button", "data-testid": "sofia-chat-stop", onClick: onStop, className: "omniscribe_chat-view-combined-send-btn omniscribe_chat-view-combined-stop-btn", title: formatMessage({ id: "Stop" }), children: jsxRuntimeExports.jsx(SquareIcon, { width: 10, height: 10 }) }) : inputValue.length > 0 ? jsxRuntimeExports.jsx("button", {
|
|
163099
163647
|
// Intentionally `type="button"` (not "submit"): some host
|
|
163100
|
-
// platforms
|
|
163101
|
-
// button as a sign-out trigger
|
|
163102
|
-
//
|
|
163648
|
+
// platforms treat any submit-typed
|
|
163649
|
+
// button as a sign-out trigger / page reload. The click
|
|
163650
|
+
// calls onSubmit directly — no form, no submit event. SOF-524.
|
|
163103
163651
|
type: "button",
|
|
163104
163652
|
"data-testid": "sofia-chat-send",
|
|
163105
|
-
onClick:
|
|
163106
|
-
const form = e.currentTarget.closest("form");
|
|
163107
|
-
form?.requestSubmit();
|
|
163108
|
-
},
|
|
163653
|
+
onClick: onSubmit,
|
|
163109
163654
|
className: "omniscribe_chat-view-combined-send-btn",
|
|
163110
163655
|
disabled: isLoading || !inputIsValid,
|
|
163111
163656
|
title: formatMessage({ id: "Send" }),
|
|
@@ -163663,6 +164208,7 @@ const ChatView = () => {
|
|
|
163663
164208
|
appointmentData?.doctorId
|
|
163664
164209
|
]);
|
|
163665
164210
|
const handleInputChange = (e) => {
|
|
164211
|
+
emitTyping("chat");
|
|
163666
164212
|
input.onChange(e);
|
|
163667
164213
|
setInputIsValid(InputValidator.validate(e.target.value, CHAT_INPUT_VALIDATION).isValid);
|
|
163668
164214
|
};
|
|
@@ -166458,6 +167004,9 @@ const SessionProvider = ({ children }) => {
|
|
|
166458
167004
|
prevPatientIdRef.current = patientId;
|
|
166459
167005
|
setSessionId(patientId ? generateUuid() : null);
|
|
166460
167006
|
}, [patientId]);
|
|
167007
|
+
reactExports.useEffect(() => {
|
|
167008
|
+
SdkEventBus.setSessionId(sessionId);
|
|
167009
|
+
}, [sessionId]);
|
|
166461
167010
|
return jsxRuntimeExports.jsx(SessionContext.Provider, { value: { sessionId }, children });
|
|
166462
167011
|
};
|
|
166463
167012
|
|
|
@@ -166625,11 +167174,12 @@ const useBrowserCapabilityCheck = () => {
|
|
|
166625
167174
|
}, []);
|
|
166626
167175
|
};
|
|
166627
167176
|
|
|
167177
|
+
const MISSING_SUBSCRIPTIONS_GRACE_MS = 1e3;
|
|
166628
167178
|
const BrowserCapabilityProbe = () => {
|
|
166629
167179
|
useBrowserCapabilityCheck();
|
|
166630
167180
|
return null;
|
|
166631
167181
|
};
|
|
166632
|
-
const Omniscribe = ({ baseurl, wssurl, apikey, userid, patientid, templateid = "", template, toolsargs, isopen, setIsOpen, patientdata, transcriptorselectvalues, handleReport, renderReportContent, handleFill, toast, sofiatitle, language, isscreenloading, disableactions, isonlychat, disablegenerate, debug, usermedicalspecialty, setGetLastReport, insertionPreviewClassNames, onReportApply, updateTemplate, templateExtras, handleExtras }) => {
|
|
167182
|
+
const Omniscribe = ({ baseurl, wssurl, apikey, userid, patientid, templateid = "", template, toolsargs, isopen, setIsOpen, patientdata, transcriptorselectvalues, handleReport, renderReportContent, handleFill, toast, sofiatitle, language, isscreenloading, disableactions, isonlychat, disablegenerate, debug, usermedicalspecialty, setGetLastReport, insertionPreviewClassNames, onReportApply, updateTemplate, templateExtras, handleExtras, onEvent, eventSubscriptions }) => {
|
|
166633
167183
|
const templateFields = template ?? toolsargs;
|
|
166634
167184
|
const effectiveBaseUrl = reactExports.useMemo(() => resolveBaseUrlFromApiKey(apikey, baseurl), [apikey, baseurl]);
|
|
166635
167185
|
const safeLanguage = isSupportedLanguage(language) ? language : void 0;
|
|
@@ -166669,6 +167219,27 @@ const Omniscribe = ({ baseurl, wssurl, apikey, userid, patientid, templateid = "
|
|
|
166669
167219
|
reactExports.useEffect(() => {
|
|
166670
167220
|
logger.setDebugMode(debug || false);
|
|
166671
167221
|
}, [debug]);
|
|
167222
|
+
const onEventRef = reactExports.useRef(onEvent);
|
|
167223
|
+
onEventRef.current = onEvent;
|
|
167224
|
+
const hasEventHandler = onEvent !== void 0;
|
|
167225
|
+
const subscriptionsRef = reactExports.useRef(eventSubscriptions);
|
|
167226
|
+
subscriptionsRef.current = eventSubscriptions;
|
|
167227
|
+
const subscriptions = subscriptionKey(eventSubscriptions);
|
|
167228
|
+
reactExports.useEffect(() => {
|
|
167229
|
+
SdkEventBus.setSubscription(subscriptionsRef.current);
|
|
167230
|
+
}, [subscriptions]);
|
|
167231
|
+
reactExports.useEffect(() => {
|
|
167232
|
+
if (!hasEventHandler)
|
|
167233
|
+
return;
|
|
167234
|
+
return SdkEventBus.setHandler((event) => onEventRef.current?.(event));
|
|
167235
|
+
}, [hasEventHandler]);
|
|
167236
|
+
const hasSubscriptionsProp = eventSubscriptions !== void 0 && eventSubscriptions !== null;
|
|
167237
|
+
reactExports.useEffect(() => {
|
|
167238
|
+
if (!hasEventHandler || hasSubscriptionsProp)
|
|
167239
|
+
return;
|
|
167240
|
+
const timer = setTimeout(reportHandlerWithoutSubscriptions, MISSING_SUBSCRIPTIONS_GRACE_MS);
|
|
167241
|
+
return () => clearTimeout(timer);
|
|
167242
|
+
}, [hasEventHandler, hasSubscriptionsProp]);
|
|
166672
167243
|
reactExports.useEffect(() => {
|
|
166673
167244
|
if (apikey && apikey.trim() !== "") {
|
|
166674
167245
|
setEncryptionSeed(apikey);
|
|
@@ -166852,6 +167423,10 @@ const r2wcProps = {
|
|
|
166852
167423
|
transcriptorselectvalues: "json",
|
|
166853
167424
|
toast: "json",
|
|
166854
167425
|
insertionPreviewClassNames: "json",
|
|
167426
|
+
// Which SDK events `onEvent` receives: exact names, family wildcards
|
|
167427
|
+
// ('recording.*'), or '*'. Not in SENSITIVE_ATTRS — a subscription list
|
|
167428
|
+
// carries no PHI, and leaving it in the DOM keeps the wiring inspectable.
|
|
167429
|
+
eventSubscriptions: "json",
|
|
166855
167430
|
// Function props
|
|
166856
167431
|
handleReport: "function",
|
|
166857
167432
|
// NOTE: this kebab-case alias has been here historically. r2wc writes any
|
|
@@ -166868,9 +167443,13 @@ const r2wcProps = {
|
|
|
166868
167443
|
handleFill: "function",
|
|
166869
167444
|
onReportApply: "function",
|
|
166870
167445
|
updateTemplate: "function",
|
|
166871
|
-
handleExtras: "function"
|
|
167446
|
+
handleExtras: "function",
|
|
167447
|
+
onEvent: "function"
|
|
166872
167448
|
};
|
|
166873
|
-
const
|
|
167449
|
+
const toAttributeName = (prop) => prop.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
167450
|
+
const JSON_ATTRS = new Set(Object.entries(r2wcProps).filter(([, type]) => type === "json").map(([prop]) => toAttributeName(prop)));
|
|
167451
|
+
const EVENT_SUBSCRIPTIONS_ATTR = toAttributeName("eventSubscriptions");
|
|
167452
|
+
const looksLikeJson = (value) => /^\s*[[{"]/.test(value);
|
|
166874
167453
|
const SofiaSDK = s$1(Omniscribe, {
|
|
166875
167454
|
props: r2wcProps,
|
|
166876
167455
|
shadow: "open"
|
|
@@ -166883,7 +167462,8 @@ const FUNCTION_PROPS = [
|
|
|
166883
167462
|
"renderReportContent",
|
|
166884
167463
|
"handleFill",
|
|
166885
167464
|
"onReportApply",
|
|
166886
|
-
"updateTemplate"
|
|
167465
|
+
"updateTemplate",
|
|
167466
|
+
"onEvent"
|
|
166887
167467
|
];
|
|
166888
167468
|
const R2WC_PROPS = Symbol.for("r2wc.props");
|
|
166889
167469
|
const R2WC_RENDER = Symbol.for("r2wc.render");
|
|
@@ -166900,7 +167480,18 @@ for (const prop of FUNCTION_PROPS) {
|
|
|
166900
167480
|
}
|
|
166901
167481
|
});
|
|
166902
167482
|
}
|
|
166903
|
-
const SENSITIVE_ATTRS = [
|
|
167483
|
+
const SENSITIVE_ATTRS = [
|
|
167484
|
+
"apikey",
|
|
167485
|
+
"userid",
|
|
167486
|
+
"patientid",
|
|
167487
|
+
"patientdata",
|
|
167488
|
+
"baseurl",
|
|
167489
|
+
"wssurl",
|
|
167490
|
+
"toolsargs",
|
|
167491
|
+
"templateid",
|
|
167492
|
+
"template",
|
|
167493
|
+
"template-extras"
|
|
167494
|
+
];
|
|
166904
167495
|
let _sanitizing = false;
|
|
166905
167496
|
async function injectStyles(shadowRoot) {
|
|
166906
167497
|
if (!shadowRoot)
|
|
@@ -166923,8 +167514,12 @@ SofiaSDK.prototype.attributeChangedCallback = function(name, oldValue, newValue)
|
|
|
166923
167514
|
try {
|
|
166924
167515
|
JSON.parse(newValue);
|
|
166925
167516
|
} catch {
|
|
166926
|
-
|
|
166927
|
-
|
|
167517
|
+
if (name === EVENT_SUBSCRIPTIONS_ATTR && !looksLikeJson(newValue)) {
|
|
167518
|
+
newValue = JSON.stringify(newValue);
|
|
167519
|
+
} else {
|
|
167520
|
+
logger.configError(`Ignoring malformed JSON in the "${name}" property.`);
|
|
167521
|
+
return;
|
|
167522
|
+
}
|
|
166928
167523
|
}
|
|
166929
167524
|
}
|
|
166930
167525
|
if (originalAttributeChangedCallback) {
|
|
@@ -169186,7 +169781,7 @@ const zig$1 = /*#__PURE__*/_mergeNamespaces({
|
|
|
169186
169781
|
default: zig
|
|
169187
169782
|
}, [zigExports]);
|
|
169188
169783
|
|
|
169189
|
-
const injectedCss = "/* Source: index.css */\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@700&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap');\n\n/* ------------------------------------------------------------------ */\n/* Theming hooks (host-overridable). */\n/* */\n/* CSS custom properties defined on the `<sofia-sdk>` element inherit */\n/* across the shadow DOM boundary. Hosts override any of these on the */\n/* element to retheme the SDK without touching internals: */\n/* */\n/* <sofia-sdk style=\"--omniscribe-primary: #1f6f5f\"></sofia-sdk> */\n/* */\n/* Internal tokens that map to a host override use */\n/* `var(--omniscribe-*, <default>)`. */\n/* */\n/* Available hooks: */\n/* --omniscribe-font-family */\n/* --omniscribe-primary main brand / primary action */\n/* --omniscribe-primary-soft light tint of primary */\n/* --omniscribe-secondary secondary action */\n/* --omniscribe-secondary-hover secondary hover state */\n/* --omniscribe-accent highlight / report color */\n/* --omniscribe-warning gap / warning chrome */\n/* --omniscribe-text primary text */\n/* --omniscribe-text-muted secondary text */\n/* --omniscribe-surface card / panel background */\n/* --omniscribe-surface-alt header / footer / hover bg */\n/* --omniscribe-border primary border */\n/* --omniscribe-border-soft in-card separators */\n/* */\n/* The insertion-preview modal has its own (more granular) variables */\n/* documented in InsertionPreviewModal.css. */\n/* ------------------------------------------------------------------ */\n\n/* Color scheme of the shadow subtree. Defaults to light so native */\n/* form controls (<select>, <input>) and assistant-ui surfaces don't */\n/* follow the host OS dark mode. A host that themes the SDK dark */\n/* (e.g. the radiology reading room) sets --omniscribe-color-scheme: */\n/* dark so native controls render light-on-dark and stay legible. */\n:host {\n color-scheme: var(--omniscribe-color-scheme, light);\n}\n\n#Omniscribe {\n font-family: var(--omniscribe-font-family, 'Lato', sans-serif);\n color-scheme: var(--omniscribe-color-scheme, light);\n /* define colors */\n --active: #0a3785;\n --background-primary: var(--omniscribe-primary-soft, #e7effd);\n --warning: var(--omniscribe-warning, #ffc107);\n --grey-50: #f9fafb;\n --grey-100: #f6f7f9;\n --grey-200: #e5e7eb;\n --grey-700: #6f7d95;\n --grey-800: #4a5364;\n --grey-900: #252a32;\n --active-black: #252a32;\n --placeholder: #a4adbc;\n --line: var(--omniscribe-border, #e5e7ec);\n --custom-black: #13161a;\n --primary: var(--omniscribe-primary, #105bdb);\n --border: var(--omniscribe-border, #e5e7ec);\n --white: var(--omniscribe-surface, #fdfdfd);\n --omni: #daf2ff;\n --omni-secondary: rgba(219, 219, 219, 0.75);\n --primary-button: var(--omniscribe-primary, #105bdb);\n --primary-text: #36a3cf;\n --primary-900: var(--omniscribe-primary, #061044);\n --blue-100: var(--omniscribe-primary-soft, #dbeafe);\n --blue-200: var(--omniscribe-primary-soft, #bfdbfe);\n --blue-500: var(--omniscribe-primary, #105bdb);\n --blue-600: var(--omniscribe-primary, #2563eb);\n --blue-700: var(--omniscribe-primary, #1d4ed8);\n --report: var(--primary-button);\n --gray: #616161;\n --black: #1b2125;\n --sky-blue: var(--omniscribe-primary-soft, #dbecff);\n --blue: var(--omniscribe-primary, #5886ba);\n --blue-600: var(--omniscribe-primary, #0b1962);\n --background: var(--omniscribe-surface-alt, #f3f3f3bb);\n --foreground: var(--omniscribe-text, oklch(0.145 0 0));\n --primary: var(--omniscribe-primary, #061044);\n --primary-foreground: var(--omniscribe-on-accent, oklch(0.985 0 0));\n --secondary: var(--omniscribe-secondary, #132caa);\n --secondary-foreground: var(--omniscribe-on-accent, #fff);\n --secondary-hover: var(--omniscribe-secondary-hover, #2847e7);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: var(--omniscribe-surface-alt, oklch(0.97 0 0));\n --accent-foreground: var(--omniscribe-text, oklch(0.205 0 0));\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --light-border: oklch(0.922 0 0);\n --input: var(--omniscribe-border, oklch(0.922 0 0));\n --ring: oklch(0.87 0 0);\n --radius: 0.625rem;\n /* TEXT */\n --text-3xs: 8px;\n --text-3xs--line-height: calc(0.5 / 0.25);\n --text-2xs: 10px;\n --text-2xs--line-height: calc(0.75 / 0.5);\n --text-xs: 12px;\n --text-xs--line-height: 14.4px;\n --text-xs--letter-spacing: 0.05px;\n --text-sm: 14px;\n --text-sm--line-height: 16.8px;\n --text-xs--letter-spacing: 0.05px;\n --text-base: 16px;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 18px;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 20px;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 22px;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 24px;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 26px;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 28px;\n --text-5xl--line-height: 1;\n --text-6xl: 30px;\n --text-6xl--line-height: 1;\n --text-7xl: 32px;\n --text-7xl--line-height: 1;\n --text-8xl: 34px;\n --text-8xl--line-height: 1;\n --text-9xl: 46px;\n --text-9xl--line-height: 1;\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n /* custom colors */\n --color-white: var(--white);\n --color-light-border: var(--light-border);\n --color-omni: var(--omni);\n --color-report: var(--report);\n --color-omni-secondary: var(--omni-secondary);\n --color-primary-text: var(--primary-text);\n --color-primary-900: var(--primary-900);\n --color-blue-500: var(--blue-500);\n --color-gray: var(--gray);\n --color-black: var(--black);\n --color-sky-blue: var(--sky-blue);\n --color-cream: var(--cream);\n --color-pink: var(--pink);\n --color-blue: var(--blue);\n --color-blue-600: var(--blue-600);\n --color-sky-blue-100: var(--sky-blue-100);\n --color-white-2: var(--white-2);\n --color-primary-700: var(--primary-700);\n --color-primary-500: var(--primary-500);\n --color-neutral-800: var(--neutral-800);\n --color-blue-2: var(--blue-2);\n --color-light-blue: var(--light-blue);\n --color-primary-100: var(--primary-100);\n --color-primary-300: var(--primary-300);\n --color-black-2: var(--black-2);\n --color-primary-button: var(--primary-button);\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: #f3f4f6;\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n /* rounded */\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: 12px;\n --radius-xl: calc(var(--radius) + 4px);\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n /* spacing */\n --spacing-layout-w: var(--layout-w);\n --spacing-layout-h: var(--layout-h);\n --spacing: 0.25rem;\n /* size */\n --container-md: 28rem;\n --container-xl: 36rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n\n --tracking-tight: -0.025em;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n\n .no-scrollbar::-webkit-scrollbar {\n display: none;\n }\n a,\n p,\n textarea,\n button,\n span,\n h1,\n h2,\n h3,\n h4,\n h5,\n div {\n font-family: 'Lato', sans-serif;\n }\n /* Hide scrollbar for IE, Edge and Firefox */\n .no-scrollbar {\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n }\n .shadow-inner-right {\n box-shadow: inset -9px 0 6px -1px rgb(0 0 0 / 0.02);\n }\n .shadow-inner-left {\n box-shadow: inset 9px 0 6px -1px rgb(0 0 0 / 0.02);\n }\n .annotation {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-normal);\n }\n .annotation-semi {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-semibold);\n }\n .annotation-bold {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-semibold);\n }\n .info {\n font-size: var(--text-2xs);\n font-weight: var(--font-weight-normal);\n }\n .info-semi {\n font-size: var(--text-2s);\n font-weight: var(--font-weight-semibold);\n }\n .info-bold {\n font-size: var(--text-2s);\n font-weight: var(--font-weight-semibold);\n }\n .text-p-xs {\n font-size: var(--text-xs) !important;\n font-weight: var(--font-weight-normal);\n line-height: var(--text-xs--line-height);\n letter-spacing: var(--text-xs--letter-spacing);\n }\n .text-p {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-normal);\n letter-spacing: var(--text-sm--letter-spacing);\n }\n .text-p-semi {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-semibold);\n }\n .text-p-bold {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-semibold);\n }\n .omniscribe_shadow-xl {\n box-shadow:\n 0 20px 25px -5px rgb(0 0 0 / 0.1),\n 0 8px 10px -6px rgb(0 0 0 / 0.1);\n }\n .scrollbar-pretty {\n &::-webkit-scrollbar {\n width: 6px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 10px;\n background-color: var(--omni-secondary);\n }\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n }\n\n .omniscribe_visible {\n visibility: visible;\n display: flex;\n flex: 1;\n }\n .omniscribe_hidden {\n display: none;\n height: 0;\n }\n\n .omniscribe_animate-spin {\n animation: spin 1s linear infinite;\n }\n}\n\n\n/* Source: modules/chat/components/AudioCutsWarningDialog.css */\n/* The shared Modal overlay uses position: absolute anchored to its\n nearest positioned ancestor — which in our case is the chat footer,\n not the widget root. That puts the modal at the bottom of the widget.\n Override to position: fixed so the overlay covers the full viewport\n and the modal truly centers regardless of where in the React tree it\n was rendered. */\n.omniscribe_modal-overlay:has(.omniscribe_audio-cuts-modal) {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.omniscribe_audio-cuts-modal {\n width: 480px;\n max-width: 90vw;\n padding: 24px !important;\n}\n\n/* Override Modal's giant default h2 size for this dialog. */\n.omniscribe_audio-cuts-modal .omniscribe_modal-title-container {\n margin-bottom: 16px;\n align-items: flex-start;\n}\n\n.omniscribe_audio-cuts-modal .omniscribe_modal-title {\n font-size: 18px;\n line-height: 1.3;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_audio-cuts-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Summary card: warning icon + paragraph in a soft container. */\n.omniscribe_audio-cuts-summary {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.omniscribe_audio-cuts-summary-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 9999px;\n background-color: #fef3c7;\n color: #b45309;\n}\n\n.omniscribe_audio-cuts-summary-text {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--color-gray-800, #1f2937);\n flex: 1;\n}\n\n/* Cut list: rounded gray container, clock icon per row, no bullets. */\n.omniscribe_audio-cuts-list {\n margin: 0;\n padding: 12px 14px;\n border-radius: 12px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--color-gray-200, #e5e7eb);\n list-style: none;\n max-height: 240px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_audio-cuts-item {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--omniscribe-text-muted, #374151);\n font-variant-numeric: tabular-nums;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.omniscribe_audio-cuts-item-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--omniscribe-text-muted, #6b7280);\n}\n\n/* Action row: right-aligned, secondary as text-link, primary as blue pill. */\n.omniscribe_audio-cuts-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 16px;\n margin-top: 4px;\n}\n\n.omniscribe_audio-cuts-secondary {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #374151);\n border-radius: 9999px;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_audio-cuts-secondary:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_audio-cuts-primary {\n border-radius: 9999px !important;\n gap: 8px;\n padding-block: 10px !important;\n padding-inline: 18px !important;\n height: auto !important;\n font-weight: 600;\n}\n\n\n/* Source: modules/chat/components/ChatView.css */\n.omniscribe_chat-view-container {\n flex: 1;\n border-style: none;\n display: flex;\n overflow: hidden;\n background: transparent;\n bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n margin-block: calc(var(--spacing) * 0) /* 0rem = 0px */;\n right: 20px;\n border-bottom-left-radius: 12px;\n width: 100%;\n}\n\n.omniscribe_chat-view-container-history-cont {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 0;\n z-index: 30;\n height: 100%;\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n display: block;\n border-top-left-radius: 12px;\n border-bottom-left-radius: 12px;\n overflow: hidden;\n background-color: var(--omniscribe-surface, white);\n transition:\n width 300ms cubic-bezier(0.4, 0, 0.2, 1),\n min-width 300ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.omniscribe_chat-view-container-history-cont-open {\n width: 33%;\n}\n\n/* Overlay that covers the chat when history is open */\n.omniscribe_chat-view-overlay {\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n z-index: 25;\n opacity: 0;\n pointer-events: none;\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n border-radius: 12px;\n}\n\n.omniscribe_chat-view-overlay-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.omniscribe_chat-view-content-container {\n display: flex;\n flex: 1;\n width: 100%;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n border-bottom-right-radius: 12px;\n}\n\n.omniscribe_chat-view-stick-to-bottom {\n font-size: 14px;\n}\n.omniscribe_chat-view-stick-to-bottom-content {\n position: absolute;\n inset: 0;\n overflow-y: scroll;\n overflow-x: hidden;\n display: grid;\n grid-template-rows: 1fr auto;\n}\n\n/* Disable scroll when SummaryLoading is shown */\n.omniscribe_chat-view-stick-to-bottom-content--no-scroll {\n overflow-y: hidden;\n}\n\n.omniscribe_chat-view-stick-to-bottom-content-class {\n padding-bottom: calc(var(--spacing) * 13);\n display: flex;\n flex-direction: column;\n padding-left: calc(var(--spacing) * 4);\n padding-right: calc(var(--spacing) * 4);\n min-width: 0;\n padding-top: 12px;\n}\n\n.omniscribe_chat-view-footer-container {\n position: sticky;\n display: flex;\n background-color: var(--omniscribe-surface, white);\n flex-direction: column;\n align-items: center;\n bottom: 0;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n/*\n * The footer is sticky inside the scroll container, so mid-scroll the\n * conversation passes behind it and was cut off mid-line — text simply ended\n * where the buttons began. This is not a spacing problem: at rest the content\n * clears the footer. What was missing is a boundary, so the last visible line\n * dissolves into the footer's surface instead of being guillotined by it.\n */\n.omniscribe_chat-view-footer-container::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 100%;\n /*\n * Tall enough to dissolve two or three lines. A short band is worse than no\n * band at all: at one line-height it ghosts a single row of text and reads as\n * a rendering fault rather than a transition.\n */\n height: 64px;\n pointer-events: none;\n /* Fallback first: browsers without color-mix keep this. */\n background: linear-gradient(\n to bottom,\n transparent,\n var(--omniscribe-surface, #fff)\n );\n /*\n * Fading to `transparent` interpolates through transparent BLACK, which\n * greys the middle of the band. Fading from the surface colour at zero alpha\n * keeps it clean and still themable.\n */\n background: linear-gradient(\n to bottom,\n color-mix(in srgb, var(--omniscribe-surface, #fff) 0%, transparent) 0%,\n var(--omniscribe-surface, #fff) 100%\n );\n}\n\n/*\n * Floats over the conversation, so it needs to be opaque. It inherited the\n * outline button's translucent fill, which let the text underneath read\n * straight through it — the label and the message competing in the same\n * pixels. A solid fill plus a shadow is what makes it read as a control\n * sitting above the content rather than printed onto it.\n */\n/*\n * Pinned to the footer's top edge, not to the viewport.\n *\n * It used to be `position: fixed; bottom: 17%`, i.e. anchored to the browser\n * window: its distance from the composer depended on the window height, and at\n * common sizes it landed ON the action buttons — measured 3px below the\n * footer's top edge. Anchoring to the footer instead means it tracks whatever\n * the footer currently is: with or without the action row, with the\n * transcription panel expanded, with files attached.\n */\n.omniscribe_chat-view-footer-scroll-to-bottom {\n position: absolute;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n z-index: 2;\n}\n\n/*\n * Qualified with `.omniscribe_button` on purpose. The outline variant sets the\n * same properties at equal specificity and `button.css` is concatenated after\n * this file, so a single-class selector here loses on source order alone.\n */\n.omniscribe_button.omniscribe_chat-view-footer-scroll-to-bottom {\n background-color: var(--omniscribe-surface, #fff);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n box-shadow: 0 2px 10px rgba(16, 23, 37, 0.16);\n}\n\n.omniscribe_button.omniscribe_chat-view-footer-scroll-to-bottom:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_chat-view-down-btn {\n width: calc(0.25rem /* 4px */ * 4);\n height: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Combined Footer - Frame 532 Design */\n.omniscribe_chat-view-combined-footer {\n width: 100%;\n padding-bottom: 12px;\n background-color: var(--omniscribe-surface, white);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n position: relative;\n}\n\n/* Action row — no background of its own; only the pills carry a border */\n.omniscribe_chat-footer-actions-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding-inline: calc(var(--spacing) * 4);\n padding-bottom: 8px;\n flex-shrink: 0;\n min-width: 0;\n width: 100%;\n box-sizing: border-box;\n transition: padding-top 0.5s ease;\n}\n\n/* With the transcription expanded, keeps the buttons off the panel's bottom\n line (the expanded wrapper's border-bottom). */\n.omniscribe_transcription-panel-wrapper--expanded\n + .omniscribe_chat-footer-actions-row {\n padding-top: 10px;\n}\n\n.omniscribe_chat-view-combined-footer-row {\n display: flex;\n flex-direction: row;\n align-items: end;\n box-sizing: border-box;\n width: 100%;\n gap: 8px;\n flex-shrink: 0;\n background-color: var(--omniscribe-surface, white);\n overflow: hidden;\n padding-inline: calc(var(--spacing) * 4);\n padding-top: 7px;\n}\n\n/* Frame 34 - Input container */\n.omniscribe_chat-view-combined-input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n padding: 8px;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 20px;\n background-color: var(--omniscribe-surface, white);\n gap: 0;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n box-sizing: border-box;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25);\n margin-bottom: 7px;\n margin-right: 1px;\n}\n\n/* When files are attached, change border-radius to rounded rectangle */\n/*\n * Attaching a file must not resize the composer. There is deliberately no\n * max-width here: the base rule is `flex: 1`, and capping it made the composer\n * jump from the full footer width down to a fixed size the moment a file was\n * added — a leftover from a narrower Figma frame, and the only place that\n * number appeared. Several files scroll horizontally inside\n * `.omniscribe_chat-view-combined-files-row`, which owns `overflow-x: auto`.\n */\n.omniscribe_chat-view-combined-input-container--with-files {\n gap: 12px;\n align-items: flex-start;\n min-width: 0;\n overflow: hidden;\n}\n\n/* Files row inside input container - horizontal scroll, no wrapping */\n.omniscribe_chat-view-combined-files-row {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n gap: 8px;\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n padding-bottom: 4px;\n scrollbar-width: thin;\n min-width: 0;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar {\n height: 4px;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar-thumb {\n background-color: var(--color-gray-300, #d1d5db);\n border-radius: 4px;\n}\n\n/* Input row with clip icon, textarea, and action button */\n.omniscribe_chat-view-combined-input-row {\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n}\n\n/* Clip icon */\n.omniscribe_chat-view-combined-clip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n height: 24px;\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, white);\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: solid 1px var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_chat-view-combined-clip-icon:hover {\n background-color: var(--omniscribe-surface-alt, #e5e7eb);\n color: var(--color-gray-600);\n}\n\n/* Action button inside input */\n.omniscribe_chat-view-combined-action-btn {\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-textarea {\n flex: 1;\n resize: none;\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n min-height: 20px;\n max-height: 56px;\n font-weight: 500 !important;\n padding: 0 !important;\n background: transparent;\n color: var(--omniscribe-text-muted, #4a5364);\n height: 20px;\n}\n\n.omniscribe_chat-view-combined-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n}\n\n.omniscribe_chat-view-combined-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n border-radius: 9999px;\n background-color: var(--secondary, #132caa);\n color: white;\n cursor: pointer;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-send-btn:hover:not(:disabled) {\n background-color: var(--secondary-hover, #2847e7);\n}\n\n.omniscribe_chat-view-combined-send-btn:disabled {\n background-color: var(--omniscribe-surface-alt, #dfe2e7);\n cursor: not-allowed;\n}\n\n/* Stop button - red variant of send button */\n.omniscribe_chat-view-combined-stop-btn {\n background-color: var(--secondary, #132caa);\n}\n\n.omniscribe_chat-view-combined-stop-btn:hover {\n background-color: var(--secondary, #132caa);\n}\n\n/* Drag-and-drop overlay */\n.omniscribe_chat-view-drag-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(37, 99, 235, 0.05);\n border: 2px dashed var(--blue-600, #2563eb);\n border-radius: var(--radius);\n z-index: 10;\n pointer-events: none;\n}\n\n.omniscribe_chat-view-drag-overlay-text {\n color: var(--blue-600, #2563eb);\n font-size: var(--text-sm);\n font-weight: var(--font-weight-medium);\n}\n\n\n/* Source: modules/chat/components/FileLimitBanner.css */\n/* File Limit Banner */\n.omniscribe_file-limit-banner {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n background-color: #dc2626;\n color: white;\n border-radius: 12px;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);\n animation:\n slideInFromTop 0.3s ease-out,\n slideOutToTop 0.3s ease-in 4.7s;\n animation-fill-mode: forwards;\n width: auto;\n max-width: 90vw;\n padding: 0;\n margin: 0 auto;\n}\n\n.omniscribe_file-limit-banner-content {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 20px;\n gap: 12px;\n white-space: nowrap;\n}\n\n.omniscribe_file-limit-banner-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: white;\n}\n\n.omniscribe_file-limit-banner-message {\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n text-align: center;\n}\n\n.omniscribe_file-limit-banner-close {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.omniscribe_file-limit-banner-close:hover {\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n.omniscribe_file-limit-banner-close svg {\n width: 16px;\n height: 16px;\n}\n\n/* Animations */\n@keyframes slideInFromTop {\n 0% {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n 100% {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n@keyframes slideOutToTop {\n 0% {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n 100% {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n}\n\n\n/* Source: modules/chat/components/PredefinedQuestions.css */\n.omniscribe_predefined-questions-container {\n margin-top: calc(var(--spacing) * 2) /* 1rem = 16px */;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n display: flex;\n flex-direction: column;\n}\n.omniscribe_predefined-questions-span {\n color: var(--omniscribe-text, #13161a);\n line-height: 21.6px;\n font-size: 18px !important;\n font-weight: 500 !important;\n}\n\n.omniscribe_predefined-title {\n margin-bottom: 8px;\n word-break: break-word;\n}\n\n.omniscribe_predefined-questions-msg-container {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n word-break: break-word;\n}\n\n.omniscribe_predefined-questions-content {\n background-color: var(--background-primary, #e7effd) !important;\n color: var(--primary, #105bdb) !important;\n border-radius: 999px !important;\n text-align: left;\n padding-top: 4px;\n padding-right: 16px;\n padding-bottom: 4px;\n padding-left: 16px;\n width: fit-content;\n height: fit-content;\n}\n\n\n/* Source: modules/chat/components/SummaryLoading.css */\n/* Auto-summary loading styles */\n.omniscribe_auto-summary-container {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n padding-top: calc(var(--spacing) * 13);\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.omniscribe_auto-summary-text {\n font-size: 18px;\n text-align: center;\n margin-bottom: 20px;\n font-weight: 500;\n color: var(--omniscribe-text, #2b303a);\n}\n\n.omniscribe_auto-summary-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Loading dots animation */\n.omniscribe_loading-dots {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_loading-dots::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n}\n\n.omniscribe_loading-dots::before {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n animation-delay: -0.16s;\n margin-right: 4px;\n}\n\n.omniscribe_loading-dots span {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n animation-delay: -0.32s;\n margin-right: 4px;\n}\n\n@keyframes omniscribe-dot-flashing {\n 0%,\n 80%,\n 100% {\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n}\n\n\n/* Source: modules/chat/components/history/ChatHistory.css */\n.omniscribe_thread-list-container {\n width: 100%;\n height: 100%;\n overflow-y: scroll;\n overflow-x: hidden;\n padding-inline: calc(var(--spacing) * 1);\n margin: 8px;\n}\n\n.omniscribe_thread-list-content {\n padding-bottom: calc(var(--spacing) * 16);\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.omniscribe_thread-list-item {\n width: 100%;\n padding-inline: 0;\n}\n\n.omniscribe_thread-list-btn {\n text-align: left;\n align-items: center !important;\n justify-content: flex-start !important;\n width: calc(100% - var(--spacing) * 4);\n border-radius: 4px !important;\n margin-bottom: 4px;\n font-weight: var(--font-weight-normal);\n padding-inline: calc(var(--spacing) * 1) !important;\n}\n\n.omniscribe_thread-list-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--omniscribe-text, #252a32);\n font-size: var(--Font-Size-font-size-100, 12px);\n font-style: normal;\n font-weight: var(--Font-Weight-Regular, 400);\n line-height: var(--Font-Line-Height-line-height-100, 14.4px);\n /* 120% */\n letter-spacing: var(--Font-Letter-Spacing-letter-spacing-100, 0.05px);\n}\n\n.omniscribe_thread-history-loading {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n align-items: flex-start;\n justify-content: flex-start;\n overflow-y: scroll;\n overflow-x: hidden;\n padding-inline: calc(var(--spacing) * 1);\n}\n\n.omniscribe_thread-history-loading-skeleton {\n width: 100%;\n height: calc(var(--spacing) * 10);\n}\n\n.omniscribe_thread-history-container {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--omniscribe-border, #e5e7ec);\n align-items: flex-start;\n justify-content: flex-start;\n /* gap: calc(var(--spacing) * 6); */\n height: 100%;\n flex-shrink: 0;\n}\n\n.omniscribe_thread-history-header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 16px;\n background: var(--omniscribe-surface, white);\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_thread-history-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n border: none;\n background: none;\n cursor: pointer;\n padding: 0;\n}\n\n.omniscribe_thread-history-header-title {\n margin: 0;\n color: var(--omniscribe-text, #252a32);\n font-size: 14px;\n font-weight: 500;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n}\n\n.omniscribe_thread-history-new-chat-btn {\n margin: 12px 0 0 12px;\n border-radius: 8px;\n gap: 4px;\n padding-block: 4px;\n}\n\n.omniscribe_thread-history-new-chat-btn:hover:not(:disabled) {\n background-color: #0f2080;\n}\n\n.omniscribe_thread-history-new-chat-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_thread-history-chat-started-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-inline: calc(var(--spacing) * 2);\n padding-block: calc(var(--spacing) * 1);\n background-color: color-mix(in oklab, var(--blue) 40%, transparent);\n width: stretch;\n width: -moz-available;\n width: -webkit-fill-available;\n width: fill-available;\n box-shadow:\n inset 0 2px 4px rgb(0 0 0 / 0.05),\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.omniscribe_thread-history-no-chat-started-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-inline: calc(var(--spacing) * 2);\n width: 100%;\n}\n\n.omniscribe_thread-history-chat-started-btn {\n border: none;\n background: transparent;\n padding: 0px;\n display: flex;\n flex-direction: row;\n gap: calc(var(--spacing) * 2);\n align-items: center;\n cursor: pointer;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n}\n\n.omniscribe_thread-history-chat-started-btn-text {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-tight);\n}\n\n.omniscribe_thread-tooltip {\n padding: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Processing thread indicator */\n.omniscribe_thread-list-btn.omniscribe_thread-processing {\n position: relative;\n}\n\n.omniscribe_thread-list-btn.omniscribe_thread-processing::before {\n content: '';\n position: absolute;\n left: 4px;\n top: 50%;\n transform: translateY(-50%);\n width: 6px;\n height: 6px;\n background: var(--secondary, #132caa);\n border-radius: 50%;\n animation: omniscribe_pulse 1.5s infinite;\n}\n\n.omniscribe_thread-list-btn.omniscribe_thread-processing\n .omniscribe_thread-list-text {\n padding-left: 12px;\n}\n\n@keyframes omniscribe_pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n\n/* Source: modules/chat/components/input/AudioBars.css */\n/* Granola-style animated audio bars: 3 rounded bars (short / tall / medium).\n Accent-colored and \"dancing\" while recording, muted and static otherwise. */\n.omniscribe_audio-bars {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n}\n\n.omniscribe_audio-bar {\n width: 3.5px;\n background-color: var(--omniscribe-primary, #1a73e8);\n border-radius: 9999px;\n transition:\n height 0.15s ease,\n background-color 0.2s ease;\n}\n\n/* Muted gray when not recording */\n.omniscribe_audio-bar--inactive {\n background-color: var(--grey-700, #9ca3af);\n}\n\n/* Live mode — heights are driven per-frame from the mic level, so use a\n short linear transition that dampens the movement without lagging it */\n.omniscribe_audio-bar--live {\n transition:\n height 0.08s linear,\n background-color 0.2s ease;\n}\n\n/* Static heights: short / tall / medium (Granola pattern) */\n.omniscribe_audio-bar--1 {\n height: 50%;\n}\n\n.omniscribe_audio-bar--2 {\n height: 100%;\n}\n\n.omniscribe_audio-bar--3 {\n height: 65%;\n}\n\n/* Dancing equalizer animation while recording */\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--1 {\n animation: omniscribe-audio-dance-1 0.9s ease-in-out infinite;\n}\n\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--2 {\n animation: omniscribe-audio-dance-2 1.1s ease-in-out infinite;\n}\n\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--3 {\n animation: omniscribe-audio-dance-3 1s ease-in-out infinite;\n}\n\n/* The dance is decorative — it runs while connecting, when there is no stream\n to visualise yet. The --live bars are deliberately left out: those track\n real microphone input, so they are information, not decoration. */\n@media (prefers-reduced-motion: reduce) {\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--1,\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--2,\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--3 {\n animation: none;\n }\n}\n\n@keyframes omniscribe-audio-dance-1 {\n 0%,\n 100% {\n height: 50%;\n }\n 25% {\n height: 85%;\n }\n 50% {\n height: 35%;\n }\n 75% {\n height: 70%;\n }\n}\n\n@keyframes omniscribe-audio-dance-2 {\n 0%,\n 100% {\n height: 100%;\n }\n 30% {\n height: 55%;\n }\n 60% {\n height: 90%;\n }\n 80% {\n height: 65%;\n }\n}\n\n@keyframes omniscribe-audio-dance-3 {\n 0%,\n 100% {\n height: 65%;\n }\n 20% {\n height: 95%;\n }\n 55% {\n height: 45%;\n }\n 85% {\n height: 80%;\n }\n}\n\n\n/* Source: modules/chat/components/input/ExtrasButtons.css */\n/*\n * Category names come from the host's templateExtras schema, so their length is\n * not ours to control. Left unbounded, one long name grew its pill until it\n * pushed the overflow trigger — and with it every remaining category — off the\n * right edge of the widget, with no way to reach them.\n *\n * The row cannot simply clip: the overflow menu is absolutely positioned and\n * opens upwards, so `overflow: hidden` on the row would cut the menu instead.\n * The pills give up the space themselves: they are the only shrinkable items in\n * the row, capped, and their label truncates.\n */\n/* Qualified: `.omniscribe_action-btn` is shared with the generate button and\n lives in another file, so an unqualified rule here would depend on which\n stylesheet the bundler concatenates last. */\n.omniscribe_action-btn.omniscribe_extras-btn {\n min-width: 0;\n max-width: 180px;\n flex-shrink: 1;\n}\n\n.omniscribe_extras-btn-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Overflow container for extras categories beyond the first two. */\n.omniscribe_extras-overflow {\n position: relative;\n display: inline-flex;\n /* Never squeezed out: it is the only route to the remaining categories. */\n flex-shrink: 0;\n}\n\n/* Three-dots trigger — mirrors the neutral pill styling of the action row. */\n.omniscribe_extras-overflow-trigger {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, #ffffff);\n color: var(--grey-700, #6f7d95);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n color 0.2s ease,\n border-color 0.2s ease;\n}\n\n.omniscribe_extras-overflow-trigger:hover,\n.omniscribe_extras-overflow-trigger--open {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #13161a);\n}\n\n/* Dropdown floats UP above the trigger (footer sits at the bottom), with a\n gap so it doesn't sit flush against the action buttons row. */\n.omniscribe_extras-overflow-menu {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n z-index: 20;\n min-width: 160px;\n padding: 4px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: var(--radius-lg, 12px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n}\n\n.omniscribe_extras-overflow-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 10px;\n border: none;\n border-radius: 8px;\n background-color: transparent;\n color: var(--omniscribe-text, #13161a);\n text-align: left;\n white-space: nowrap;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_extras-overflow-item:hover:not(:disabled) {\n background-color: var(--omniscribe-primary-soft, #e8f0fe);\n color: var(--omniscribe-primary, #1a73e8);\n}\n\n.omniscribe_extras-overflow-item:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n\n/* Source: modules/chat/components/input/FilePreview.css */\n/* File Preview Container - Figma Frame 532 */\n.omniscribe_file-preview-container {\n display: contents;\n}\n\n.omniscribe_file-preview-container-history-open {\n width: 372px;\n}\n\n/* Custom scrollbar */\n.omniscribe_file-preview-container::-webkit-scrollbar {\n height: 6px;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-thumb {\n background-color: #d1d5db;\n border-radius: 3px;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-thumb:hover {\n background-color: #9ca3af;\n}\n\n/* Individual image thumbnail */\n.omniscribe_file-preview-image {\n position: relative;\n width: 80px;\n height: 80px;\n border-radius: 12px;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.omniscribe_file-preview-image-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n}\n\n.omniscribe_file-preview-image-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n border-radius: 12px;\n}\n\n/* Document card */\n/* Document card - matches Figma design */\n.omniscribe_file-preview-document {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background-color: var(--omniscribe-surface, white);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 16px;\n position: relative;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n flex-shrink: 0;\n max-height: 38px;\n}\n\n.omniscribe_file-preview-document-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 46px;\n height: 46px;\n background-color: #dc3545;\n border-radius: var(--radius-lg, 12px);\n flex-shrink: 0;\n}\n\n.omniscribe_file-preview-document-icon svg {\n color: white;\n}\n\n.omniscribe_file-preview-document-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n padding-right: 16px;\n}\n\n.omniscribe_file-preview-document-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--grey-900);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 180px;\n}\n\n.omniscribe_file-preview-document-type {\n font-size: 12px;\n color: var(--grey-700);\n font-weight: 500;\n}\n\n/* Individual image thumbnail - larger size matching Figma */\n.omniscribe_file-preview-image {\n position: relative;\n width: 64px;\n height: 64px;\n border-radius: 16px;\n background-color: #1a1a2e;\n flex-shrink: 0;\n /* overflow: visible to allow X button to show outside bounds */\n}\n\n.omniscribe_file-preview-image-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 16px;\n /* Apply overflow hidden to the image itself */\n overflow: hidden;\n}\n\n.omniscribe_file-preview-image-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n border-radius: 16px;\n}\n\n/* Remove button - blue circle with X - positioned inside bounds */\n.omniscribe_file-preview-remove-btn {\n position: absolute;\n top: 4px;\n right: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 50%;\n background-color: var(--blue-600, #2563eb);\n color: white;\n cursor: pointer;\n padding: 0;\n transition: background-color 0.2s ease;\n z-index: 2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.omniscribe_file-preview-remove-btn:hover {\n background-color: var(--blue-700, #1d4ed8);\n}\n\n.omniscribe_file-preview-remove-btn--image {\n top: 4px;\n right: 4px;\n width: 20px;\n height: 20px;\n}\n\n\n/* Source: modules/chat/components/input/MicrophoneButton.css */\n/* Microphone Button Styles */\n.microphone-button {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 24px !important;\n height: 24px !important;\n min-width: 24px !important;\n min-height: 24px !important;\n padding: 0 !important;\n border-radius: 9999px !important;\n border: none !important;\n background-color: var(--omniscribe-surface-alt, #f3f4f6) !important;\n box-shadow: none !important;\n transition: background-color 0.2s ease !important;\n flex-shrink: 0;\n}\n\n.microphone-button:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #e5e7eb) !important;\n}\n\n.microphone-button--recording {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n background-color: #fee2e2 !important;\n}\n\n/* Pulse animation for recording state */\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n\n/* Source: modules/chat/components/input/TranscribeDropdown.css */\n/* Ensure tooltip trigger properly wraps the button in flex context */\n.omniscribe_thread-combined-footer-row > .tooltip-trigger {\n display: flex;\n flex-shrink: 0;\n}\n\n/* Granola-style transcribe pill: [bars chevron] ··· [stop square | text]\n A single flat capsule — no nested containers, no shadow, and its chrome\n stays constant across idle/recording/paused (only the bars change). */\n.omniscribe_transcribe-dropdown {\n display: flex;\n align-items: center;\n gap: 18px;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, white);\n transition:\n background-color 0.15s ease,\n border-color 0.15s ease;\n font-size: var(--font-size-100, 13px);\n font-weight: 500;\n color: var(--omniscribe-text, #1f2937);\n white-space: nowrap;\n overflow: hidden;\n flex-shrink: 0;\n padding: 10px 18px;\n}\n\n.omniscribe_transcribe-dropdown:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--omniscribe-surface-alt, #fafafa);\n border-color: var(--color-gray-300, #d1d5db);\n}\n\n/* Left group: bars + chevron sit flat inside the capsule (no inner pill) */\n.omniscribe_transcribe-controls-group {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Bars & chevron buttons — chromeless icon buttons */\n.omniscribe_transcribe-bars-button,\n.omniscribe_transcribe-chevron-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n.omniscribe_transcribe-bars-button:disabled,\n.omniscribe_transcribe-chevron-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: plain accent text control (Granola's \"Resume\") — no chrome */\n.omniscribe_transcribe-text-button {\n display: flex;\n align-items: center;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n font-size: inherit;\n font-weight: 500;\n color: var(--omniscribe-primary, #1a73e8);\n}\n\n.omniscribe_transcribe-text-button:hover:not(:disabled) {\n color: var(--blue-700, #1558d6);\n}\n\n.omniscribe_transcribe-text-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: play triangle shown when idle/paused — no chrome, accent color */\n.omniscribe_transcribe-play-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--omniscribe-primary, #1a73e8);\n transition: color 0.15s ease;\n}\n\n.omniscribe_transcribe-play-button:hover:not(:disabled) {\n color: var(--blue-700, #1558d6);\n}\n\n.omniscribe_transcribe-play-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: filled rounded stop square shown while recording — no chrome */\n.omniscribe_transcribe-stop-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--omniscribe-text-muted, #5f6368);\n transition: color 0.15s ease;\n}\n\n.omniscribe_transcribe-stop-button:hover:not(:disabled) {\n color: var(--omniscribe-text, #1f2937);\n}\n\n.omniscribe_transcribe-stop-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.omniscribe_transcribe-dropdown--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-dropdown-label {\n text-align: left;\n white-space: nowrap;\n}\n\n/* Chevron points up (panel closed) and rotates to down when expanded */\n.omniscribe_transcribe-dropdown-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition:\n transform 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcribe-dropdown-chevron--expanded {\n transform: rotate(180deg);\n}\n\n.omniscribe_transcribe-dropdown:hover .omniscribe_transcribe-dropdown-chevron {\n color: var(--omniscribe-text, #374151);\n}\n\n/* Connection status pill - inline banner replacing toasts.\n Three states: reconnecting (neutral), disconnected (red), restored (dark). */\n.omniscribe_connection-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 9999px;\n white-space: nowrap;\n flex-shrink: 0;\n font-weight: 500;\n margin-inline: 8px;\n}\n\n.omniscribe_connection-pill-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_connection-pill-icon--spin {\n animation: omniscribe-connection-spin 1s linear infinite;\n}\n\n@keyframes omniscribe-connection-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.omniscribe_connection-pill--reconnecting {\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--color-gray-200, #e5e7eb);\n color: var(--omniscribe-text-muted, #374151);\n}\n\n.omniscribe_connection-pill--disconnected {\n background-color: #fdecec;\n border: 1px solid #f8c7c7;\n color: #b42318;\n padding-right: 4px;\n}\n\n.omniscribe_connection-pill--restored {\n background-color: #1f2937;\n border: 1px solid #1f2937;\n color: #ffffff;\n}\n\n.omniscribe_connection-pill-retry {\n border-radius: 9999px !important;\n gap: 4px;\n padding-block: 3px !important;\n padding-inline: 8px !important;\n height: auto !important;\n background-color: #d92d20 !important;\n color: #ffffff !important;\n border: none !important;\n margin-left: 2px;\n}\n\n.omniscribe_connection-pill-retry:hover:not(:disabled) {\n background-color: #b42318 !important;\n}\n\n/* Action buttons - unified style for Generate, Petitions, Extras */\n.omniscribe_action-btn {\n /* Fixed-label actions keep their size; only the extras pills, whose labels\n are host-defined and can be arbitrarily long, give up space. */\n flex-shrink: 0;\n border-radius: 9999px !important;\n gap: 6px;\n padding-block: 6px !important;\n padding-inline: 12px !important;\n /* Match height of controls-group (border + padding + content) */\n min-height: 32px !important;\n font-size: var(--font-size-100, 13px) !important;\n font-weight: 500 !important;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08) !important;\n transition: all 0.15s ease !important;\n display: inline-flex !important;\n align-items: center !important;\n}\n\n.omniscribe_action-btn:hover:not(:disabled) {\n background-color: var(--blue-700, #1558d6) !important;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12) !important;\n}\n\n.omniscribe_action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Collapsed state - vertical pill with light theme */\n.omniscribe_transcribe-collapsed {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: var(--omniscribe-surface, white);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Passive activity indicator — live bars while recording */\n.omniscribe_transcribe-collapsed-bars {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n}\n\n.omniscribe_transcribe-collapsed-play {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 50%;\n background-color: transparent;\n color: var(--omniscribe-primary, #1a73e8);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-play:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n transform: scale(1.05);\n}\n\n.omniscribe_transcribe-collapsed-play:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-collapsed-play--recording {\n box-shadow: 0 0 8px rgba(26, 115, 232, 0.2);\n}\n\n.omniscribe_transcribe-collapsed-expand {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n background-color: transparent;\n color: var(--omniscribe-text-muted, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-expand:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #374151);\n}\n\n\n/* Source: modules/chat/components/input/TranscriptionPanel.css */\n/* Expand/collapse wrapper — absolutely positioned upwards so it does NOT\n push the actions row or the form. Being out of the flow, animating the\n height causes no footer reflow: the panel unfolds upwards (same\n animation as the previous version). */\n.omniscribe_transcription-panel-wrapper {\n position: absolute;\n bottom: 100%;\n left: 0;\n right: 0;\n height: 0;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition:\n height 0.5s ease,\n opacity 0.5s ease;\n}\n\n.omniscribe_transcription-panel-wrapper--expanded {\n height: calc(var(--content-height) * 0.55);\n opacity: 1;\n pointer-events: auto;\n border-bottom: 1px solid var(--border, #e5e7eb);\n}\n\n/* TranscriptionPanel - Frame 655 from Figma */\n.omniscribe_transcription-panel {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--border, #e5e7eb);\n border-top-left-radius: var(--radius-lg, 12px);\n border-top-right-radius: var(--radius-lg, 12px);\n overflow: hidden;\n margin-bottom: 8px;\n display: flex;\n flex-direction: column;\n}\n\n/* Header with action buttons */\n.omniscribe_transcription-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--border);\n}\n\n.omniscribe_transcription-panel-header-section {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_transcription-panel-actions {\n display: flex;\n align-items: center;\n gap: 1px;\n margin-right: 2px;\n}\n\n.omniscribe_transcription-panel-action-btn {\n width: 100%;\n height: auto;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcription-panel-close {\n border-radius: 9999px;\n border: none;\n padding-inline: 5px !important;\n padding-block: 2.5px !important;\n margin-block: 5.5px;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcription-panel-close:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-600, #4b5563);\n}\n\n/* Body container */\n.omniscribe_transcription-panel-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 150px;\n overflow: hidden;\n}\n\n/* Idle state - white background with blue text */\n.omniscribe_transcription-panel-idle {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n padding: 24px;\n}\n\n.omniscribe_transcription-panel-idle-text {\n font-size: 16px;\n font-weight: 500;\n color: var(--color-primary, #2563eb);\n text-align: center;\n margin: 0;\n}\n\n.omniscribe_transcription-panel-play-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 9999px;\n background-color: var(--omniscribe-primary-soft, #e7effd);\n cursor: pointer;\n transition:\n transform 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.omniscribe_transcription-panel-play-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.omniscribe_transcription-panel-play-btn svg {\n color: var(--omniscribe-primary, #2563eb);\n}\n\n/* Content state - transcription display */\n.omniscribe_transcription-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n max-height: 220px;\n}\n\n.omniscribe_transcription-panel-message {\n margin-bottom: 8px;\n text-align: left;\n width: fit-content;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n padding: 4px;\n border-radius: 8px;\n color: var(--omniscribe-text, #13161a);\n line-height: 1.7 !important;\n}\n\n/* Audio-loss divider rendered between segments where a recording cut\n occurred. Visually separates captured speech from the gap so the doctor\n can spot lost portions while reviewing the transcription. */\n.omniscribe_transcription-panel-cut {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-block: 10px;\n padding-inline: 4px;\n}\n\n.omniscribe_transcription-panel-cut-line {\n flex: 1;\n height: 1px;\n background-color: #fed7aa;\n}\n\n.omniscribe_transcription-panel-cut-label {\n flex-shrink: 0;\n padding: 2px 10px;\n border-radius: 9999px;\n background-color: #fff7ed;\n border: 1px solid #fed7aa;\n color: #c2410c;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* Scrollbar styles */\n.omniscribe_transcription-panel-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.omniscribe_transcription-panel-content::-webkit-scrollbar-thumb {\n border-radius: 10px;\n background-color: var(--color-gray-300, #d1d5db);\n}\n\n.omniscribe_transcription-panel-content::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n/* Firefox */\n.omniscribe_transcription-panel-content {\n scrollbar-width: thin;\n scrollbar-color: var(--color-gray-300, #d1d5db) transparent;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-panel-processing {\n padding-top: 5px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-processing {\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-processing-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-skeleton-line {\n height: 14px;\n width: 70%;\n}\n\n.omniscribe_transcription-skeleton-line--short {\n width: 40%;\n}\n\n.omniscribe_transcription-processing-text {\n font-size: var(--text-xs);\n color: var(--omni-secondary, #6b7280);\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupMenu.css */\n.omniscribe_link-menu-container {\n width: 18rem;\n border-radius: 0.5rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n border: 1px solid var(--grey-200);\n background-color: var(--omniscribe-surface, #ffffff);\n}\n\n.omniscribe_link-menu-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n border-bottom: 1px solid var(--color-gray-100);\n background-color: var(--grey-50);\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n}\n\n.omniscribe_nav-button {\n height: 1.5rem;\n width: 1.5rem;\n padding: 0.125rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n color: var(--omniscribe-text-muted, #6b7280);\n transition-property:\n color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.omniscribe_nav-button:hover {\n background-color: var(--color-gray-100);\n color: var(--omniscribe-text, #374151);\n}\n\n.omniscribe_nav-button:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n box-shadow: 0 0 0 2px #3b82f6;\n}\n\n.omniscribe_nav-button:active {\n background-color: var(--grey-200);\n}\n\n.omniscribe_nav-icon {\n width: 0.875rem;\n height: 0.875rem;\n}\n\n.omniscribe_page-indicator {\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #4b5563);\n}\n\n.omniscribe_link-menu-content {\n padding: 0.375rem;\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupMenuCard.css */\n.omniscribe_card-link {\n display: block;\n border-radius: 0.5rem;\n overflow: hidden;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 200ms;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--grey-200);\n text-decoration: none;\n}\n\n.omniscribe_card {\n border: 0;\n box-shadow: none;\n border-radius: 0.5rem;\n margin: 0;\n padding: 0;\n}\n\n.omniscribe_card:hover {\n background-color: var(--grey-50);\n}\n\n.omniscribe_card-header {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.5rem;\n border-bottom: 1px solid var(--color-gray-100);\n background-color: rgba(249, 250, 251, 0.5);\n}\n\n.omniscribe_favicon {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n\n.omniscribe_fallback-icon {\n width: 1rem;\n height: 1rem;\n border-radius: 0.125rem;\n background-color: #d1d5db;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.omniscribe_fallback-text {\n font-size: 8px;\n font-weight: 700;\n color: var(--grey-600);\n text-transform: uppercase;\n}\n\n.omniscribe_card-title {\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n color: var(--grey-800);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-grow: 1;\n min-width: 0;\n margin: 0;\n}\n\n.omniscribe_card-content {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.omniscribe_card-content > * + * {\n margin-top: 0.25rem;\n}\n\n.omniscribe_link-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 600;\n color: var(--color-activeblack, #000000);\n line-height: 1.375;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.omniscribe_snippet-text {\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--omniscribe-text-muted, #4b5563);\n line-height: 1.625;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupPill.css */\n.omniscribe_pill-container {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n}\n\n.omniscribe_pill-button {\n display: inline-flex;\n align-items: center;\n border-radius: 9999px;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n background-color: var(--blue-100);\n color: var(--blue-700);\n border: 1px solid var(--blue-200);\n transition-property:\n color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.omniscribe_pill-button:hover {\n background-color: var(--blue-200);\n}\n\n.omniscribe_pill-button:focus {\n background-color: var(--blue-200);\n outline: 2px solid transparent;\n outline-offset: 2px;\n box-shadow:\n 0 0 0 2px #3b82f6,\n 0 0 0 4px rgba(59, 130, 246, 0.1);\n}\n\n.omniscribe_pill-button--active {\n background-color: var(--blue-200);\n}\n\n.omniscribe_pill-domain {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n@media (min-width: 640px) {\n .omniscribe_pill-domain {\n max-width: 200px;\n }\n}\n\n.omniscribe_pill-counter {\n margin-left: 0.375rem;\n background-color: var(--blue-200);\n color: #1e40af;\n border-radius: 9999px;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n font-size: 10px;\n line-height: 1;\n font-weight: 600;\n}\n\n.omniscribe_menu-portal {\n position: absolute;\n z-index: 100;\n}\n\n\n/* Source: modules/chat/components/markdown/MarkdownText.css */\n.omniscribe_markdown-code-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: calc(var(--spacing) * 4) /* 1rem = 16px */;\n border-top-left-radius: var(--radius) /* 0.25rem = 4px */;\n border-top-right-radius: var(--radius) /* 0.25rem = 4px */;\n background-color: var(--color-zinc-900)\n /* oklch(21% 0.006 285.885) = #18181b */;\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n color: var(--white);\n}\n\n.omniscribe_markdown-code-span {\n text-transform: lowercase;\n & > span {\n font-size: var(--text-xs) /* 0.75rem = 12px */;\n line-height: var(--text-xs--line-height) /* calc(1 / 0.75) ≈ 1.3333 */;\n }\n}\n\n.omniscribe_markdown-h1 {\n margin-bottom: calc(var(--spacing) * 8) /* 2rem = 32px */;\n scroll-margin: calc(var(--spacing) * 20) /* 5rem = 80px */;\n font-size: var(--text-4xl) /* 2.25rem = 36px */;\n line-height: var(--text-4xl--line-height) /* calc(2.5 / 2.25) ≈ 1.1111 */;\n font-weight: var(--font-weight-extrabold) /* 800 */;\n letter-spacing: var(--tracking-tight) /* -0.025em */;\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-h2 {\n margin-bottom: calc(var(--spacing) * 4);\n margin-top: calc(var(--spacing) * 8) /* 2rem = 32px */;\n scroll-margin: calc(var(--spacing) * 20) /* 5rem = 80px */;\n font-size: var(--text-3xl) /* 1.875rem = 30px */;\n line-height: var(--text-3xl--line-height) /* calc(2.25 / 1.875) ≈ 1.2 */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n letter-spacing: var(--tracking-tight) /* -0.025em */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n.omniscribe_markdown-h3 {\n margin-bottom: calc(var(--spacing) * 4);\n margin-top: calc(var(--spacing) * 6);\n scroll-margin: calc(var(--spacing) * 20) /* 5rem = 80px */;\n font-size: var(--text-2xl);\n line-height: var(--text-2xl--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n letter-spacing: var(--tracking-tight) /* -0.025em */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-h4 {\n margin-bottom: calc(var(--spacing) * 4);\n margin-top: calc(var(--spacing) * 6);\n scroll-margin: calc(var(--spacing) * 20) /* 5rem = 80px */;\n font-size: var(--text-xl);\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n letter-spacing: var(--tracking-tight) /* -0.025em */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n.omniscribe_markdown-h5 {\n margin-block: calc(var(--spacing) * 4) /* 1rem = 16px */;\n font-size: var(--text-lg);\n line-height: var(--text-lg--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-h6 {\n margin-block: calc(var(--spacing) * 4) /* 1rem = 16px */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-p {\n margin-block: calc(var(--spacing) * 2.5);\n line-height: calc(var(--spacing) * 5);\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-a {\n color: var(--primary);\n font-weight: var(--font-weight-medium) /* 500 */;\n text-decoration-line: underline;\n text-underline-offset: 4px;\n overflow-wrap: break-word;\n}\n\n.omniscribe_markdown-blockquote {\n border-left-width: 2px;\n padding-left: calc(var(--spacing) * 6) /* 1.5rem = 24px */;\n font-style: italic;\n}\n\n.omniscribe_markdown-ul {\n list-style-type: disc;\n padding-inline-start: 20px;\n word-break: break-word;\n & > li {\n margin-top: calc(var(--spacing) * 1) /* 0.5rem = 8px */;\n }\n}\n\n.omniscribe_markdown-ol {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n margin-left: calc(var(--spacing) * 6) /* 1.5rem = 24px */;\n list-style-type: decimal;\n & > li {\n margin-top: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n }\n}\n\n.omniscribe_markdown-hr {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n border-bottom-width: 1px;\n}\n.omniscribe_markdown-table {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n width: 100%;\n border-collapse: separate;\n border-spacing: calc(var(--spacing) * 0) /* 0rem = 0px */;\n overflow-y: auto;\n}\n.omniscribe_markdown-th {\n background-color: var(--muted);\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n text-align: left;\n font-weight: var(--font-weight-bold) /* 700 */;\n &:first-child {\n border-top-left-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &:last-child {\n border-top-right-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &[align='center'] {\n text-align: center;\n }\n &[align='right'] {\n text-align: right;\n }\n}\n\n.omniscribe_markdown-td {\n border-bottom-width: 1px;\n border-left-width: 1px;\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n text-align: left;\n &:last-child {\n border-right-width: 1px;\n }\n &[align='center'] {\n text-align: center;\n }\n &[align='right'] {\n text-align: right;\n }\n}\n\n.omniscribe_markdown-tr {\n margin: calc(var(--spacing) * 0) /* 0rem = 0px */;\n &:first-child {\n border-top-width: 1px;\n }\n &:last-child > td:first-child {\n border-bottom-left-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &:last-child > td:last-child {\n border-bottom-right-radius: var(--radius) /* 0.25rem = 4px */;\n }\n}\n\n.omniscribe_markdown-sup {\n font-size: var(--text-xs) /* 0.75rem = 12px */;\n line-height: var(--text-xs--line-height) /* calc(1 / 0.75) ≈ 1.3333 */;\n & > a {\n text-decoration-line: none;\n }\n}\n\n.omniscribe_markdown-pre {\n overflow-x: auto;\n border-bottom-right-radius: var(--radius) /* 0.25rem = 4px */;\n border-bottom-left-radius: var(--radius) /* 0.25rem = 4px */;\n background-color: var(--black);\n padding: calc(var(--spacing) * 4) /* 1rem = 16px */;\n color: var(--white);\n max-width: var(--container-4xl) /* 56rem = 896px */;\n}\n\n.omniscribe_markdown-code {\n border-radius: 0.25rem /* 4px */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n}\n\n.omniscribe_markdown-link {\n color: var(--color-primary); /* text-primary */\n font-weight: 500; /* font-medium */\n text-decoration: underline; /* underline */\n text-underline-offset: 4px; /* underline-offset-4 */\n word-wrap: break-word; /* break-words */\n}\n\n.omniscribe_markdown-link:hover {\n color: var(--color-primary-dark); /* hover:text-primary-dark */\n}\n\n.omniscribe_assistant-markdown-container strong,\n.omniscribe_assistant-markdown-container b {\n font-weight: bold !important;\n}\n\n\n/* Source: modules/chat/components/markdown/tooltip-icon-button.css */\n/* Tooltip icon button styles */\n.omniscribe_tooltip-icon-button-btn {\n padding: 4px;\n min-width: auto;\n min-height: auto;\n}\n\n.omniscribe_tooltip-icon-button-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n\n/* Source: modules/chat/components/messages/AssistantMessage.css */\n.omniscribe_assistant-message-container {\n display: flex;\n align-items: flex-start;\n margin-right: auto;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n width: 100%;\n}\n\n.omniscribe_assistant-message-calls-container {\n display: flex;\n flex-direction: column;\n max-width: 100%;\n}\n\n.omniscribe_assistant-markdown-container {\n padding-block: calc(var(--spacing) * 0.5) /* 0.25rem = 4px */;\n}\n\n.omniscribe_assistant-commands-container {\n display: flex;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n align-items: center;\n margin-right: auto;\n}\n.omniscribe_assistant-message-container:hover,\n.omniscribe_assistant-message-container:focus {\n .omniscribe_assistant-commands-container {\n opacity: 100%;\n }\n}\n\n\n/* Source: modules/chat/components/messages/AssistantMessageLoading.css */\n/* Assistant message loading animation */\n.omniscribe_assistant-message-loading-container {\n display: flex;\n align-items: center;\n padding: 8px 0;\n}\n\n.omniscribe_assistant-message-loading {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_assistant-message-loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-assistant-dot-flashing 1.4s infinite linear;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(1) {\n animation-delay: -0.32s;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(2) {\n animation-delay: -0.16s;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(3) {\n animation-delay: 0s;\n}\n\n@keyframes omniscribe-assistant-dot-flashing {\n 0%,\n 80%,\n 100% {\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n}\n\n\n/* Source: modules/chat/components/messages/BranchSwitcher.css */\n.omniscribe_brand-switcher-container {\n display: flex;\n align-items: center;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n}\n\n.omniscribe_brand-switcher-text {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n}\n\n.omniscribe_brand-switcher-btn {\n width: calc(0.25rem /* 4px */ * 6) /* 1.5rem = 24px */;\n height: calc(0.25rem /* 4px */ * 6) /* 1.5rem = 24px */;\n padding: calc(0.25rem /* 4px */ * 1) /* 0.25rem = 4px */;\n}\n\n\n/* Source: modules/chat/components/messages/CommandBar.css */\n.omniscribe_command-bar-container {\n display: flex;\n align-items: center;\n padding-right: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n transition: opacity 0.2s ease-in-out;\n}\n\n.omniscribe_command-bar-container.omniscribe_command-bar-hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n.thumbs.active {\n color: var(--blue-500);\n}\n\n.omniscribe_feedback-button-container {\n position: relative;\n display: inline-block;\n}\n\n.omniscribe_command-bar-container-icon-color,\n.thumbs {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_command-bar-container svg {\n width: 12px !important;\n height: 12px !important;\n}\n\n.omniscribe_command-bar-container .omniscribe_tooltip-icon-button-btn {\n padding: calc(var(--spacing) * 0.5) !important;\n}\n\n.omniscribe_command-bar-container .tooltip-base {\n padding: 0.25rem 0.5rem;\n}\n\n.omniscribe_command-bar-container .tooltip-trigger {\n padding: 1px;\n margin: 1px;\n}\n\n.omniscribe_command-bar-container .omniscribe_button-size-icon {\n height: calc(var(--spacing) * 3);\n width: calc(var(--spacing) * 3);\n}\n\n\n/* Source: modules/chat/components/messages/HumanMessage.css */\n.omniscribe_human-message-container {\n display: flex;\n align-items: center;\n margin-left: auto;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n}\n.omniscribe_human-message-container-editing {\n width: 100%;\n max-width: var(--container-xl) /* 36rem = 576px */;\n}\n.omniscribe_human-message-container-no-editing {\n max-width: 100%;\n}\n\n.omniscribe_human-message-command-container {\n display: flex;\n gap: calc(var(--spacing) * 1) /* 0.5rem = 8px */;\n align-items: center;\n margin-left: auto;\n}\n.omniscribe_human-message-command-container-editing {\n opacity: 100%;\n}\n\n.omniscribe_human-message-container:focus,\n.omniscribe_human-message-container:hover {\n .omniscribe_human-message-command-container {\n opacity: 100%;\n }\n}\n\n.omniscribe_human-message-subcontainer {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n.omniscribe_human-message-subcontainer-editing {\n width: 100%;\n}\n\n.omniscribe_human-message-content {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n}\n\n.omniscribe_human-message-content-text {\n text-align: right;\n padding-top: 4px;\n padding-bottom: 4px;\n padding-inline: calc(var(--spacing) * 2);\n border-radius: var(--radius-3xl);\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n font-weight: 500;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n margin: 0;\n}\n.omniscribe_human-message-textarea {\n min-height: 2.5rem !important; /* 40px */\n max-height: 12rem !important; /* 192px - Allow more vertical space */\n min-width: 200px !important; /* Minimum width for usability */\n resize: both; /* Allow controlled resizing in both directions */\n width: 100%;\n overflow: auto; /* Enable scroll when content exceeds max dimensions */\n\n &:focus-visible {\n box-shadow: var(--tw-ring-inset,) 0 0 0\n calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n }\n}\n\n.omniscribe_human-message-textarea-chat-history-close {\n max-width: 100% !important;\n}\n\n.omniscribe_human-message-textarea-chat-history-open {\n max-width: 385px !important;\n}\n\n\n/* Source: modules/chat/components/messages/MessageImages.css */\n/* Message Files Container (for both images and documents) */\n.omniscribe_message-files {\n margin-top: 8px;\n margin-bottom: 4px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Message Images Container */\n.omniscribe_message-images {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_message-images-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n max-width: 100%;\n}\n\n/* Individual Image Container */\n.omniscribe_message-image-container {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: var(--omniscribe-surface-alt, #f5f5f5);\n border: 1px solid var(--omniscribe-border, #e0e0e0);\n cursor: pointer;\n transition:\n transform 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.omniscribe_message-image-container:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.omniscribe_message-image-container-single {\n max-width: 200px;\n max-height: 200px;\n}\n\n.omniscribe_message-image-container-multiple {\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n/* Image Element */\n.omniscribe_message-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.omniscribe_message-image-container-single .omniscribe_message-image {\n max-width: 200px;\n max-height: 200px;\n width: auto;\n height: auto;\n}\n\n/* Loading State */\n.omniscribe_message-image-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 60px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n color: var(--omniscribe-text-muted, #6c757d);\n font-size: 12px;\n border-radius: 8px;\n}\n\n/* Error State */\n.omniscribe_message-image-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 60px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n color: var(--omniscribe-text-muted, #6c757d);\n font-size: 12px;\n border-radius: 8px;\n text-align: center;\n cursor: default;\n}\n\n.omniscribe_message-image-error span {\n font-size: 20px;\n margin-bottom: 4px;\n}\n\n.omniscribe_message-image-error small {\n font-size: 10px;\n}\n\n/* Image Counter for Multiple Images */\n.omniscribe_message-image-counter {\n position: absolute;\n top: 4px;\n right: 4px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 2px 6px;\n border-radius: 12px;\n min-width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Images Count */\n.omniscribe_message-images-count {\n margin-top: 4px;\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n font-style: italic;\n}\n\n/* Modal for Full-Size Images */\n.omniscribe_message-image-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_message-image-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.omniscribe_message-image-modal-content {\n position: relative;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_message-image-modal-img {\n max-width: 100%;\n max-height: 100%;\n border-radius: 8px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.omniscribe_message-image-modal-close {\n position: absolute;\n top: -10px;\n right: -10px;\n background-color: var(--omniscribe-surface, #fff);\n border: none;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n font-weight: bold;\n color: var(--omniscribe-text, #333);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n transition: background-color 0.2s ease;\n}\n\n.omniscribe_message-image-modal-close:hover {\n background-color: var(--omniscribe-surface-alt, #f5f5f5);\n}\n\n/* Message Documents Container */\n.omniscribe_message-documents {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_message-document {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border-radius: 8px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n border: 1px solid var(--omniscribe-border, #e0e0e0);\n transition: background-color 0.2s ease;\n max-width: 280px;\n}\n\n.omniscribe_message-document:hover {\n background-color: var(--omniscribe-surface-alt, #f0f0f0);\n}\n\n.omniscribe_message-document-icon {\n font-size: 24px;\n flex-shrink: 0;\n}\n\n.omniscribe_message-document-info {\n flex: 1;\n min-width: 0;\n}\n\n.omniscribe_message-document-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--omniscribe-text, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.omniscribe_message-document-size {\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n}\n\n.omniscribe_message-documents-count {\n margin-top: 4px;\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n font-style: italic;\n}\n\n\n/* Source: modules/chat/components/messages/ToolCalls.css */\n.omniscribe_tool-calls-container {\n margin-block-start: calc(calc(var(--spacing) * 4) * var(0));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(0)));\n width: 100%;\n max-width: var(--container-4xl) /* 56rem = 896px */;\n}\n\n.omniscribe_tool-calls-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n max-width: 100%;\n flex-wrap: wrap;\n gap: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n}\n.omniscribe_tool-calls-h3 {\n font-weight: var(--font-weight-bold);\n color: var(--color-gray-900) /* oklch(21% 0.034 264.665) = #101828 */;\n word-break: break-all;\n font-size: 14px;\n margin: 0;\n}\n\n.omniscribe_tool-calls-item-args {\n align-items: flex-start;\n flex-wrap: wrap;\n}\n.omniscribe_tool-calls-item-args-text {\n word-break: break-all;\n margin-right: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n padding-block: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n}\n\n.omniscribe_tool-calls-item-args-code {\n background-color: var(--color-gray-50);\n border-radius: 0.25rem /* 4px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n word-break: break-all;\n}\n\n.omniscribe_tool-calls-pre {\n font-size: 12px;\n}\n\n\n/* Source: modules/chat/components/messages/ToolResults.css */\n/* ToolResult Component Styles */\n\n.omniscribe_tool-result {\n margin-top: 2px;\n border: 1px solid var(--grey-200);\n border-radius: 0.5rem !important; /* !rounded-lg */\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */\n overflow: hidden; /* overflow-hidden */\n width: 100%;\n}\n\n.omniscribe_tool-result-header {\n background-color: var(--grey-50); /* bg-gray-50 */\n padding-left: 1rem; /* px-4 */\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n display: flex; /* flex */\n align-items: center; /* items-center */\n justify-content: space-between; /* justify-between */\n}\n\n.omniscribe_tool-result-header--expanded {\n border-bottom: 1px solid var(--grey-200);\n}\n\n.omniscribe_tool-result-header-content {\n display: flex; /* flex */\n align-items: center; /* items-center */\n gap: 0.5rem; /* gap-2 */\n min-width: 0; /* min-w-0 */\n}\n\n.omniscribe_tool-result-title {\n font-weight: 500; /* font-medium */\n color: var(--grey-900);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; /* truncate */\n margin: 0;\n font-size: 14px;\n}\n\n.omniscribe_expand-button {\n padding: 0.25rem; /* p-1 */\n flex-shrink: 0; /* flex-shrink-0 */\n}\n\n.omniscribe_expand-icon {\n width: 1.25rem; /* w-5 */\n height: 1.25rem; /* h-5 */\n}\n\n.omniscribe_tool-result-content {\n padding: 1rem; /* p-4 */\n background-color: var(--omniscribe-surface, #ffffff); /* bg-white */\n max-height: 24rem; /* max-h-96 */\n overflow-y: auto; /* overflow-y-auto */\n}\n\n.omniscribe_tool-result-content > * + * {\n margin-top: 0.5rem; /* space-y-2 */\n}\n\n/* Scrollbar styles for webkit browsers */\n.omniscribe_tool-result-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-track {\n background: #f1f5f9;\n border-radius: 4px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 4px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n.omniscribe_result-card {\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */\n border: 1px solid var(--color-gray-100);\n padding-top: 0.5rem !important; /* !py-2 */\n padding-bottom: 0.5rem !important;\n gap: 0 !important; /* !gap-0 */\n}\n\n.omniscribe_result-card-header {\n padding-top: 0.5rem !important; /* !pt-2 */\n padding-left: 0.5rem !important; /* !px-2 */\n padding-right: 0.5rem !important;\n padding-bottom: 0 !important; /* !pb-0 */\n}\n\n.omniscribe_result-card-title {\n font-size: 0.875rem; /* text-sm */\n line-height: 1.25rem;\n font-weight: 600; /* font-semibold */\n}\n\n.omniscribe_result-link {\n color: var(--blue-600);\n text-decoration: none;\n transition-property: color, text-decoration;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.omniscribe_result-link:hover {\n text-decoration: underline; /* hover:underline */\n color: #1e40af; /* hover:text-blue-800 */\n}\n\n.omniscribe_result-card-content {\n padding: 0.5rem !important; /* !p-2 */\n padding-top: 0 !important; /* !pt-0 */\n}\n\n.omniscribe_result-description {\n font-size: 0.75rem; /* text-xs */\n line-height: 1rem;\n color: var(--omniscribe-text, #374151); /* text-gray-700 */\n line-height: 1.625; /* leading-relaxed */\n word-break: break-all; /* break-all */\n display: -webkit-box;\n -webkit-line-clamp: 2; /* line-clamp-2 */\n -webkit-box-orient: vertical;\n overflow: hidden;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms; /* transition-all duration-150 ease-in-out */\n transition-timing-function: cubic-bezier(0.4, 0, 0.6, 1); /* ease-in-out */\n}\n\n.omniscribe_result-description:hover {\n -webkit-line-clamp: unset; /* hover:line-clamp-none */\n display: block;\n}\n\n.omniscribe_result-source {\n font-size: 0.75rem; /* text-xs */\n line-height: 1rem;\n color: var(--omniscribe-text-muted, #6b7280); /* text-gray-500 */\n margin-top: 0.25rem; /* mt-1 */\n padding-top: 0.25rem; /* pt-1 */\n border-top: 1px solid var(--color-gray-100);\n}\n\n.omniscribe_string-result {\n font-size: 0.875rem; /* text-sm */\n line-height: 1.25rem;\n white-space: pre-wrap; /* whitespace-pre-wrap */\n background-color: var(--grey-50);\n padding: 0.75rem; /* p-3 */\n border-radius: 0.375rem; /* rounded-md */\n border: 1px solid var(--grey-200);\n font-family:\n ui-monospace, SFMono-Regular, 'SF Mono', Consolas, 'Liberation Mono', Menlo,\n monospace; /* pre tag font */\n}\n\n\n/* Source: modules/header/components/ConfigHeader.css */\n/* Config Header Styles */\n.omniscribe_config-view {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-height: 17px;\n padding: 16px;\n}\n\n.omniscribe_config-back-group {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.omniscribe_config-back-label {\n margin: 0;\n color: var(--omniscribe-text, #000000);\n font-size: 14px;\n font-weight: 700;\n line-height: 17px;\n}\n\n.omniscribe_config-close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background-color: var(--omniscribe-surface-alt, #edeff2);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: var(--Radius-radius-round, 99999px);\n cursor: pointer;\n color: var(--omniscribe-text, #000000);\n font-size: 14px;\n line-height: 1;\n padding: 0;\n}\n\n\n/* Source: modules/header/components/ConnectedButtons.css */\n/* Connected Buttons Styles */\n.omniscribe_connected-buttons {\n display: flex;\n border-radius: var(--Radius-radius-medium, 8px);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n overflow: hidden;\n}\n\n.omniscribe_connected-btn-left {\n border: none !important;\n border-radius: 0 !important;\n border-right: 1px solid var(--omniscribe-border, #e5e7ec) !important;\n}\n\n.omniscribe_connected-btn-right {\n border: none !important;\n border-radius: 0 !important;\n}\n\n/* Ensure connected buttons have consistent styling */\n.omniscribe_connected-buttons .omniscribe_utility-btns {\n min-height: 40px;\n}\n\n\n/* Source: modules/header/components/ConsentIndicator.css */\n.omniscribe_consent-indicator {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: var(--Font-Weight-Regular, 400);\n line-height: var(--text-xs--line-height, 14.4px);\n letter-spacing: var(--text-xs--letter-spacing, 0.05px);\n white-space: nowrap;\n margin-right: 8px;\n gap: 4px;\n border: 1px solid var(--border, #e5e7ec);\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_consent-indicator-tooltip {\n border-radius: var(--radius-lg, 12px) !important;\n border: 1px solid var(--border, #e5e7ec) !important;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25) !important;\n display: flex !important;\n padding: 10px 8px !important;\n font-size: 10px !important;\n font-weight: 400 !important;\n line-height: var(--text-xs--line-height, 14.4px) !important;\n letter-spacing: var(--text-xs--letter-spacing, 0.05px) !important;\n}\n\n/* SOF-844: express refusal of AI use. Distinct from \"not signed yet\" — the\n whole point of the third state is that they must not look alike. */\n.omniscribe_consent-indicator--refused {\n background-color: var(--omniscribe-danger-soft, #fee2e2);\n color: var(--omniscribe-danger, #b91c1c);\n border-color: var(--omniscribe-danger, #b91c1c);\n}\n\n/* SOF-845: the consent may be signed and the assistant still blocked by another\n rule. The badge stays truthful about the consent, but must not read as \"all\n clear\" at a glance while recording is disabled. */\n.omniscribe_consent-indicator--blocked {\n background-color: var(--omniscribe-warning-soft, #fef3c7);\n color: var(--omniscribe-warning, #92400e);\n border-color: var(--omniscribe-warning, #92400e);\n}\n\n\n/* Source: modules/header/components/MainHeader.css */\n/* Main Header Styles */\n.omniscribe_main-header {\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.omniscribe_main-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n.omniscribe_main-header-title {\n margin: 0;\n color: var(--omniscribe-text, #252a32);\n font-size: 14px;\n font-weight: 500;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n}\n\n.omniscribe_main-header-separator {\n width: 1px;\n align-self: stretch;\n margin: -16px 0;\n background-color: var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_main-header-spacer {\n flex: 1;\n}\n\n.omniscribe_main-header-settings {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n.omniscribe_main-header-close {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n\n/* Source: modules/header/components/UtilityButton.css */\n/* Utility Button Styles */\n.omniscribe_utility-btn-audio {\n min-height: 40px; /* Match connected buttons height */\n}\n\n.omniscribe_utility-btn-right {\n /* Settings button specific styles can be added here */\n}\n\n/* Base utility button styles are inherited from parent UtilityButtons.css */\n\n\n/* Source: modules/header/components/WarningBanner.css */\n/* Warning Banner Styles */\n.omniscribe_warning-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_warning-banner-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background-color: var(--omniscribe-border, #e5e7ec);\n border-radius: 50%;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.omniscribe_warning-banner-close:hover {\n background-color: #d1d5db;\n}\n\n.omniscribe_warning-banner-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.25;\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n\n/* Source: modules/header/section/UtilityButtons.css */\n.omniscribe_header-wrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n background-color: var(--omniscribe-surface, #ffffff);\n border-top-right-radius: 12px;\n border-top-left-radius: 12px;\n}\n\n.omniscribe_utility-btns-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n background-color: var(--omniscribe-surface, #ffffff);\n overflow: hidden;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n align-self: stretch;\n border-top-right-radius: inherit;\n border-top-left-radius: inherit;\n}\n\n.omniscribe_utility-btns-left,\n.omniscribe_utility-btns-right {\n display: flex;\n flex-direction: row;\n gap: 4px;\n align-items: center;\n}\n\n.omniscribe_utility-btn-right {\n border-radius: var(--Radius-radius-round, 99999px) !important;\n background-color: var(--omniscribe-surface-alt, #f6f7f9) !important;\n border: none !important;\n}\n\n.omniscribe_utility-btns {\n cursor: pointer;\n transition-duration: 300ms;\n background-color: color-mix(in oklab, var(--white) 30%, transparent);\n border-radius: var(--Radius-radius-medium, 8px);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n position: relative;\n padding: 8px;\n display: flex;\n align-items: center;\n\n &:hover {\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n }\n}\n\n.omniscribe_utility-btns-pointer {\n pointer-events: auto;\n}\n\n.omniscribe_utility-btns-no-pointer {\n pointer-events: none;\n background-color: var(--white);\n}\n\n.omniscribe_utility-btns-no-pointer-opacity {\n pointer-events: none;\n opacity: 50%;\n}\n\n.omniscribe_utility-btns-opacity {\n background-color: var(--white);\n opacity: 100%;\n}\n\n.omniscribe_utility-btns-active {\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border: 1px solid var(--omniscribe-primary, #105bdb);\n}\n\n.omniscribe_btn-label {\n margin-left: 6px;\n font-size: 14px;\n color: var(--omniscribe-text, #212529);\n font-weight: 500;\n}\n\n.omniscribe_btn-label-active {\n color: var(--omniscribe-primary, #105bdb);\n}\n\n.omniscribe_btn-label-inactive {\n color: var(--omniscribe-text, #212529);\n}\n\n.omniscribe_icon {\n color: var(--active-black);\n}\n\n.omniscribe_icon-active {\n color: var(--omniscribe-primary, #105bdb);\n}\n\n\n/* Source: modules/insertionPreview/InsertionPreviewModal.css */\n/* Insertion Preview Modal — ported from the demo's .sugg-* styles\n (dev-tools/demo/src/style.css:715-891). Uses BEM-style naming under\n omniscribe_insertion-preview to stay scoped inside the SDK shadow DOM.\n\n Theming hooks (set on the `<sofia-sdk>` element, they cross the shadow\n boundary; classes don't):\n\n --omniscribe-insertion-preview-reserve px reserved for chat widget on the right\n --omniscribe-insertion-preview-primary brand color (selection / apply button)\n --omniscribe-insertion-preview-primary-soft soft pill background using primary\n --omniscribe-insertion-preview-primary-text text color sitting on primary-soft\n --omniscribe-insertion-preview-accent attention color (gaps)\n --omniscribe-insertion-preview-accent-soft soft pill background using accent\n --omniscribe-insertion-preview-accent-bg gap-section background\n --omniscribe-insertion-preview-text primary text\n --omniscribe-insertion-preview-text-muted secondary text / chrome\n --omniscribe-insertion-preview-border panel + group border\n --omniscribe-insertion-preview-border-soft in-panel separators\n --omniscribe-insertion-preview-input-border form-control border\n --omniscribe-insertion-preview-checkbox-border unchecked checkbox stroke\n --omniscribe-insertion-preview-surface panel background\n --omniscribe-insertion-preview-surface-alt header / footer / hover background\n\n Defaults cascade THROUGH the main SDK tokens (`--omniscribe-*`) before\n falling back to a hard-coded literal. So:\n\n 1. If the host sets `--omniscribe-insertion-preview-primary` →\n only the modal picks it up (per-surface theming).\n 2. Else if the host sets `--omniscribe-primary` (the chat-widget\n token) → BOTH chat and modal share it (unified theme — the\n out-of-the-box experience).\n 3. Else → falls back to the hard-coded SDK default (Sofia blue),\n matching the chat widget's stock look.\n\n Tokens without a chat-widget counterpart (accent / text-muted /\n border-soft / surface-alt etc.) keep their own defaults. */\n\n.omniscribe_insertion-preview__backdrop,\n.omniscribe_insertion-preview__panel {\n --_primary: var(\n --omniscribe-insertion-preview-primary,\n var(--omniscribe-primary, #105bdb)\n );\n --_primary-soft: var(\n --omniscribe-insertion-preview-primary-soft,\n var(--omniscribe-primary-soft, #e7effd)\n );\n --_primary-text: var(\n --omniscribe-insertion-preview-primary-text,\n var(--omniscribe-primary, #105bdb)\n );\n --_accent: var(--omniscribe-insertion-preview-accent, #c77700);\n --_accent-soft: var(--omniscribe-insertion-preview-accent-soft, #fdebc6);\n --_accent-bg: var(--omniscribe-insertion-preview-accent-bg, #fffbf1);\n --_text: var(\n --omniscribe-insertion-preview-text,\n var(--omniscribe-text, #1f2733)\n );\n --_text-muted: var(\n --omniscribe-insertion-preview-text-muted,\n var(--omniscribe-text-muted, #6a7385)\n );\n --_border: var(\n --omniscribe-insertion-preview-border,\n var(--omniscribe-border, #e5e7ec)\n );\n --_border-soft: var(\n --omniscribe-insertion-preview-border-soft,\n var(--omniscribe-border, #eef1f6)\n );\n --_input-border: var(\n --omniscribe-insertion-preview-input-border,\n var(--omniscribe-border, #d6dbe5)\n );\n --_checkbox-border: var(\n --omniscribe-insertion-preview-checkbox-border,\n #b7bfcc\n );\n --_surface: var(\n --omniscribe-insertion-preview-surface,\n var(--omniscribe-surface, #fff)\n );\n --_surface-alt: var(\n --omniscribe-insertion-preview-surface-alt,\n var(--omniscribe-surface-alt, #f6f8fb)\n );\n}\n\n/* The modal must sit above every other surface in the SDK shadow DOM\n (chat panel, toasts, tooltips). 2147483640+ ensures that even with a\n max-int z-index race, the modal wins. */\n.omniscribe_insertion-preview__backdrop {\n position: fixed;\n inset: 0;\n background: rgba(15, 27, 45, 0.42);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n z-index: 2147483640;\n animation: omniscribe_insertion-preview__fade 0.18s ease-out;\n}\n@keyframes omniscribe_insertion-preview__fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* `--omniscribe-insertion-preview-reserve` lets the host budget space\n for a floating chat widget so the panel centers in the area NOT\n covered by it. Default: 0px → centered in the full viewport. */\n.omniscribe_insertion-preview__panel {\n position: fixed;\n top: 50%;\n left: calc((100vw - var(--omniscribe-insertion-preview-reserve, 0px)) / 2);\n transform: translate(-50%, -50%);\n z-index: 2147483641;\n width: 680px;\n max-width: calc(\n 100vw - var(--omniscribe-insertion-preview-reserve, 0px) - 32px\n );\n max-height: 84vh;\n background: var(--_surface);\n border: 1px solid var(--_border);\n border-radius: 14px;\n box-shadow: 0 24px 64px rgba(15, 27, 45, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: omniscribe_insertion-preview__in 0.22s ease-out;\n font-family: 'Lato', sans-serif;\n color: var(--_text);\n}\n\n/* Below 1100px there isn't room to sit beside the widget; centered\n fallback (will overlap the widget — same trade-off as the demo). */\n@media (max-width: 1100px) {\n .omniscribe_insertion-preview__panel {\n left: 50%;\n width: 92vw;\n max-width: 720px;\n }\n}\n@keyframes omniscribe_insertion-preview__in {\n from {\n opacity: 0;\n transform: translate(-50%, calc(-50% + 8px)) scale(0.985);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n}\n\n.omniscribe_insertion-preview__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n border-bottom: 1px solid var(--_border);\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n}\n.omniscribe_insertion-preview__close {\n background: transparent;\n border: 0;\n color: var(--_text-muted);\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 4px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__close:hover {\n background: var(--_border-soft);\n color: var(--_text);\n}\n\n.omniscribe_insertion-preview__sub {\n margin: 0;\n padding: 8px 14px;\n font-size: 11.5px;\n color: var(--_text-muted);\n border-bottom: 1px solid var(--_border-soft);\n}\n\n.omniscribe_insertion-preview__body {\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n}\n\n.omniscribe_insertion-preview__group {\n border-bottom: 1px solid var(--_border-soft);\n}\n.omniscribe_insertion-preview__group:last-child {\n border-bottom: 0;\n}\n.omniscribe_insertion-preview__group-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px 4px;\n}\n/* The parent label of an array-of-objects group lives inside .group-head\n which already supplies 14px left padding. Without zeroing the inner\n .row padding here, the parent ends up doubly indented (28px) while\n children directly under the section have a single 14px — making the\n parent appear LEFT-shifted relative to its own children. */\n.omniscribe_insertion-preview__group-head .omniscribe_insertion-preview__row {\n padding: 0;\n}\n.omniscribe_insertion-preview__group-name {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--_text-muted);\n}\n.omniscribe_insertion-preview__group-count {\n background: var(--_primary-soft);\n color: var(--_primary-text);\n font-size: 10.5px;\n font-weight: 600;\n border-radius: 999px;\n padding: 1px 7px;\n}\n\n.omniscribe_insertion-preview__row {\n display: grid;\n grid-template-columns: 16px 1fr;\n gap: 10px;\n padding: 8px 14px;\n align-items: flex-start;\n cursor: pointer;\n border-radius: 6px;\n}\n.omniscribe_insertion-preview__row:hover {\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__row-checkbox {\n appearance: none;\n width: 14px;\n height: 14px;\n border: 1px solid var(--_checkbox-border);\n border-radius: 3px;\n background: var(--_surface);\n margin-top: 2px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__row-checkbox:checked {\n background: var(--_primary);\n border-color: var(--_primary);\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>\");\n background-repeat: no-repeat;\n background-position: center;\n}\n.omniscribe_insertion-preview__row-body {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.omniscribe_insertion-preview__row-label {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--_text);\n margin-bottom: 8px;\n}\n.omniscribe_insertion-preview__row-preview {\n font-size: 11.5px;\n color: var(--_text-muted);\n word-break: break-word;\n}\n.omniscribe_insertion-preview__row-line {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 2px 0;\n}\n.omniscribe_insertion-preview__row-line-text {\n flex: 1;\n}\n\n.omniscribe_insertion-preview__row-edit {\n margin-top: 4px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.omniscribe_insertion-preview__row-edit-grid {\n display: grid;\n grid-template-columns: 140px 1fr;\n gap: 6px 12px;\n align-items: center;\n}\n.omniscribe_insertion-preview__row-edit-label {\n font-size: 11px;\n color: var(--_text-muted);\n}\n\n.omniscribe_insertion-preview__edit {\n font: inherit;\n font-size: 12px;\n color: var(--_text);\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n padding: 4px 8px;\n background: var(--_surface);\n width: 100%;\n box-sizing: border-box;\n}\n.omniscribe_insertion-preview__edit--prose {\n min-height: 60px;\n resize: vertical;\n}\n.omniscribe_insertion-preview__edit--toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 0;\n padding: 0;\n background: transparent;\n}\n.omniscribe_insertion-preview__edit--multi-enum {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n border: 0;\n padding: 0;\n background: transparent;\n}\n.omniscribe_insertion-preview__edit__chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n border: 1px solid var(--_input-border);\n border-radius: 999px;\n padding: 2px 8px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__edit__chip--on {\n background: var(--_primary);\n color: #fff;\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__edit__chip input {\n display: none;\n}\n\n/* Searchable enum select */\n.omniscribe_insertion-preview__searchable-select {\n position: relative;\n width: 100%;\n}\n.omniscribe_insertion-preview__searchable-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n font: inherit;\n font-size: 12px;\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n padding: 4px 8px;\n background: var(--_surface);\n cursor: pointer;\n text-align: left;\n}\n.omniscribe_insertion-preview__searchable-select__chevron {\n color: var(--_text-muted);\n}\n.omniscribe_insertion-preview__searchable-select__dropdown {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 5;\n background: var(--_surface);\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n box-shadow: 0 8px 24px rgba(15, 27, 45, 0.12);\n max-height: 200px;\n display: flex;\n flex-direction: column;\n}\n.omniscribe_insertion-preview__searchable-select__search {\n font: inherit;\n font-size: 12px;\n border: 0;\n border-bottom: 1px solid var(--_border-soft);\n padding: 6px 8px;\n outline: none;\n}\n.omniscribe_insertion-preview__searchable-select__list {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n overflow-y: auto;\n}\n.omniscribe_insertion-preview__searchable-select__option {\n padding: 4px 10px;\n font-size: 12px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__searchable-select__option:hover,\n.omniscribe_insertion-preview__searchable-select__option--selected {\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__searchable-select__option--custom {\n color: var(--_text-muted);\n font-style: italic;\n}\n\n.omniscribe_insertion-preview__row--will-replace {\n background: rgba(199, 119, 0, 0.06);\n}\n.omniscribe_insertion-preview__row-tag {\n font-size: 10px;\n font-weight: 600;\n background: var(--_accent-soft);\n color: var(--_accent);\n padding: 2px 6px;\n border-radius: 999px;\n align-self: flex-start;\n margin-top: 1px;\n}\n\n/* Gaps group */\n.omniscribe_insertion-preview__group--gaps {\n background: var(--_accent-bg);\n border-top: 1px solid var(--_border);\n}\n.omniscribe_insertion-preview__group-name--gap {\n color: var(--_accent);\n}\n.omniscribe_insertion-preview__group-count--gap {\n background: var(--_accent-soft);\n color: var(--_accent);\n}\n.omniscribe_insertion-preview__row--gap {\n grid-template-columns: 18px 1fr;\n cursor: default;\n}\n.omniscribe_insertion-preview__row--gap:hover {\n background: rgba(199, 119, 0, 0.06);\n}\n.omniscribe_insertion-preview__gap-icon {\n color: var(--_accent);\n margin-top: 1px;\n}\n.omniscribe_insertion-preview__row-preview--gap {\n color: var(--_accent);\n}\n\n.omniscribe_insertion-preview__footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 10px 14px;\n border-top: 1px solid var(--_border);\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__btn {\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n border: 1px solid var(--_input-border);\n background: var(--_surface);\n border-radius: 6px;\n padding: 6px 14px;\n cursor: pointer;\n color: var(--_text);\n}\n.omniscribe_insertion-preview__btn--primary {\n background: var(--_primary);\n color: #fff;\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__btn--primary:disabled {\n background: #a3b1ad;\n border-color: #a3b1ad;\n cursor: not-allowed;\n}\n\n/* \"Edit with voice\" — secondary action style. Picks up the host's\n --omniscribe-secondary token (falls back to a neutral teal). */\n.omniscribe_insertion-preview__btn--voice {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--_surface);\n color: var(--_primary);\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__btn--voice:hover {\n background: var(--_primary-soft);\n}\n.omniscribe_insertion-preview__btn-icon {\n display: inline-block;\n vertical-align: middle;\n flex-shrink: 0;\n}\n.omniscribe_insertion-preview__btn-icon--stop {\n width: 10px;\n height: 10px;\n background: currentColor;\n border-radius: 1px;\n}\n\n/* While recording the voice button morphs into a destructive-styled\n \"Stop\" button so the action reads as final. */\n.omniscribe_insertion-preview__btn--voice-stop {\n background: #dc3545;\n color: #fff;\n border-color: #dc3545;\n}\n.omniscribe_insertion-preview__btn--voice-stop:hover {\n background: #c82333;\n border-color: #c82333;\n}\n\n/* Voice status banner — rendered just under the modal header while the\n chat surface is recording / starting / generating. */\n.omniscribe_insertion-preview__voice-banner {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 14px;\n font-size: 12px;\n border-bottom: 1px solid var(--_border-soft);\n background: var(--_surface-alt);\n color: var(--_text);\n}\n.omniscribe_insertion-preview__voice-banner--recording {\n background: rgba(220, 53, 69, 0.08);\n color: #b21f2c;\n}\n.omniscribe_insertion-preview__voice-banner--generating {\n background: var(--_primary-soft);\n color: var(--_primary-text);\n}\n.omniscribe_insertion-preview__voice-pulse {\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: #dc3545;\n animation: omniscribe_insertion-preview__pulse 1s ease-in-out infinite;\n flex-shrink: 0;\n}\n@keyframes omniscribe_insertion-preview__pulse {\n 0%,\n 100% {\n opacity: 0.4;\n transform: scale(0.85);\n }\n 50% {\n opacity: 1;\n transform: scale(1.15);\n }\n}\n.omniscribe_insertion-preview__voice-spinner {\n width: 12px;\n height: 12px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: 999px;\n animation: omniscribe_insertion-preview__spin 0.8s linear infinite;\n flex-shrink: 0;\n display: inline-block;\n}\n@keyframes omniscribe_insertion-preview__spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Tiny visual cue on the panel itself while recording. */\n.omniscribe_insertion-preview__panel--voice {\n border-color: rgba(220, 53, 69, 0.4);\n}\n.omniscribe_insertion-preview__close:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.omniscribe_insertion-preview__footer-spacer {\n flex: 1;\n}\n\n/* Mandatory styling — distinct from the soft amber gap treatment so the\n doctor immediately sees what's blocking. Red border + red pill. */\n.omniscribe_insertion-preview__row--mandatory {\n background: rgba(220, 53, 69, 0.06);\n border-left: 3px solid #dc3545;\n}\n.omniscribe_insertion-preview__row--mandatory\n .omniscribe_insertion-preview__row-preview--gap,\n.omniscribe_insertion-preview__row--mandatory\n .omniscribe_insertion-preview__row-label {\n color: var(--omniscribe-text, #1f2733);\n}\n.omniscribe_insertion-preview__gap-icon--mandatory {\n color: #dc3545;\n}\n.omniscribe_insertion-preview__row-edit-grid--mandatory {\n background: rgba(220, 53, 69, 0.04);\n border-radius: 4px;\n padding: 4px 6px;\n}\n.omniscribe_insertion-preview__mandatory-pill {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 6px;\n font-size: 9.5px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n background: #dc3545;\n color: #fff;\n border-radius: 999px;\n}\n.omniscribe_insertion-preview__sub--blocking {\n color: #dc3545;\n font-weight: 600;\n}\n\n/* AI-suggested field: the agent inferred this from context rather\n than from an explicit doctor statement. We tint the editor\n background so the doctor visually distinguishes it from\n confirmed-from-dictation fields, and a small ✨ pill on the\n label tells them what it means. Less alarming than the\n mandatory-red treatment because the field IS filled — we just\n want the doctor to double-check it. */\n.omniscribe_insertion-preview__row-edit-grid--suggested {\n background: rgba(176, 122, 255, 0.06);\n border-left: 2px solid #b07aff;\n border-radius: 4px;\n padding: 4px 6px;\n}\n.omniscribe_insertion-preview__suggested-pill {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 7px;\n font-size: 9.5px;\n font-weight: 600;\n letter-spacing: 0.03em;\n background: rgba(176, 122, 255, 0.12);\n color: #6f48b8;\n border: 1px solid rgba(176, 122, 255, 0.5);\n border-radius: 999px;\n}\n\n/* SOF-659 — read-only \"Attachments\" section (file previews by type). */\n.omniscribe_insertion-preview__attachments {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.omniscribe_insertion-preview__attachments__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.omniscribe_insertion-preview__attachment {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n overflow: hidden;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.omniscribe_insertion-preview__attachment--image {\n display: block;\n max-width: 100%;\n max-height: 240px;\n object-fit: contain;\n}\n\n.omniscribe_insertion-preview__attachment--audio {\n width: 100%;\n padding: 8px;\n}\n\n.omniscribe_insertion-preview__attachment--pdf {\n width: 100%;\n height: 360px;\n border: none;\n}\n\n.omniscribe_insertion-preview__attachment--text {\n margin: 0;\n padding: 10px 12px;\n max-height: 200px;\n overflow: auto;\n font-size: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.omniscribe_insertion-preview__attachment--file {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n}\n\n.omniscribe_insertion-preview__attachment__name {\n font-size: 13px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n/* Source: modules/layout/components/OmniscribeContainer/OmniscribeContainer.css */\n.omniscribe_container {\n isolation: isolate;\n position: fixed;\n bottom: calc(var(--spacing) * 5);\n right: 0;\n border-top-left-radius: 30px;\n border-bottom-left-radius: 30px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n z-index: 80;\n}\n\n[dir='ltr'] .omniscribe_container {\n right: 0;\n border-top-left-radius: 30px;\n border-bottom-left-radius: 30px;\n}\n\n[dir='rtl'] .omniscribe_container {\n left: 0;\n right: auto;\n border-top-right-radius: 30px;\n border-bottom-right-radius: 30px;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n\n\n/* Source: modules/layout/components/OmniscribeLayout/DraggableCollapsed.css */\n/* Draggable Collapsed Container */\n.omniscribe_draggable-collapsed {\n position: fixed;\n bottom: 20px;\n right: 20px;\n cursor: grab;\n z-index: 9999;\n transition: transform 0.1s ease-out;\n user-select: none;\n touch-action: none;\n}\n\n.omniscribe_draggable-collapsed--dragging {\n cursor: grabbing;\n transition: none;\n}\n\n/* Horizontal mode - rotated 90 degrees */\n.omniscribe_draggable-collapsed--horizontal {\n bottom: 20px;\n}\n\n.omniscribe_draggable-collapsed--horizontal .omniscribe_transcribe-collapsed {\n flex-direction: row;\n transform: none;\n}\n\n/* RTL support */\n[dir='rtl'] .omniscribe_draggable-collapsed {\n right: auto;\n left: 20px;\n}\n\n\n/* Source: modules/layout/components/OmniscribeLayout/OmniscribeLayout.css */\n.omniscribe_layout {\n position: fixed;\n width: var(--layout-w);\n background: var(--white);\n bottom: calc(var(--spacing) * 5);\n border-bottom-left-radius: 12px;\n border: solid 1px var(--omniscribe-border, var(--light-border));\n box-shadow: 0px 4px 4px 0px #00000040;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 500ms;\n transition-property: transform, translate, scale, rotate;\n display: flex;\n flex-direction: column;\n height: var(--layout-h);\n min-width: 500px;\n min-height: 500px;\n right: 0;\n border-radius: 12px;\n}\n\n[dir='rtl'] .omniscribe_layout {\n left: 0;\n right: auto;\n border-bottom-right-radius: 12px;\n}\n\n[dir='ltr'] .omniscribe_layout {\n right: 0;\n border-bottom-left-radius: 12px;\n}\n\n.omniscribe_layout-open {\n background: var(--white);\n translate: 0;\n}\n\n.omniscribe_layout-close {\n translate: var(--layout-w);\n}\n\n[dir='rtl'] .omniscribe_layout-close {\n translate: calc(var(--layout-w) * -1);\n}\n\n[dir='ltr'] .omniscribe_layout-close {\n translate: var(--layout-w);\n}\n\n\n/* Source: modules/settings/components/chat/Chat.css */\n.omniscribe_chat-config {\n display: flex;\n flex-direction: column;\n gap: 24px;\n min-height: 0; /* Permite que los hijos controlen su altura */\n flex: 1; /* Toma el espacio disponible */\n}\n\n/* Espaciado específico para el separador en el contexto de chat */\n.omniscribe_chat-config .omniscribe_separator {\n margin: 8px 0; /* Margen vertical consistente */\n}\n\n.omniscribe_chat-prompt-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-right: 16px;\n}\n\n.omniscribe_chat-prompt-textarea {\n width: 100%;\n height: 74px;\n padding: 8px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: var(--omniscribe-text, #374151);\n background-color: var(--omniscribe-surface, white);\n resize: none;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_chat-prompt-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-style: italic;\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: var(--omniscribe-text-muted, #6b7280);\n align-self: flex-start;\n}\n\n\n/* Source: modules/settings/components/chat/PromptCustomization.css */\n.omniscribe_chat-prompt-title {\n font-size: 14px;\n font-weight: 400;\n color: var(--omniscribe-text, #252a32);\n line-height: 14.4px;\n margin: 0 0 12px 0;\n}\n\n.omniscribe_chat-prompt-container {\n position: relative;\n}\n\n.omniscribe_chat-prompt-textarea {\n width: 100%;\n min-height: 80px;\n padding: 12px;\n border: 1px solid var(--border-color, #ddd);\n border-radius: 8px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.4;\n resize: none;\n transition: border-color 0.2s ease;\n}\n\n.omniscribe_chat-prompt-textarea:focus {\n outline: none;\n border-color: var(--omniscribe-primary, #007bff);\n box-shadow: 0 0 0 2px var(--primary-color-alpha, rgba(0, 123, 255, 0.1));\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: var(--text-secondary, #666);\n margin-top: 6px;\n text-align: right;\n}\n\n\n/* Source: modules/settings/components/chat/SourceItem.css */\n.omniscribe_source-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n}\n\n.omniscribe_source-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n /* Let the label shrink inside the row so a long name can wrap instead of\n pushing the row wider. */\n flex: 1;\n min-width: 0;\n}\n\n.omniscribe_source-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--primary, #105bdb);\n cursor: pointer;\n}\n\n.omniscribe_source-name {\n flex: 1;\n min-width: 0;\n /* A source name with no spaces (e.g. a bare domain) has no wrap points, so\n without this it overflows the row. `anywhere` breaks it only when needed. */\n overflow-wrap: anywhere;\n font-size: 12px;\n color: var(--omniscribe-text, #374151);\n}\n/* Removed link styles for source name - now handled by icon button only */\n.omniscribe_source-external-icon {\n width: 12px;\n height: 12px;\n stroke: var(--primary, #105bdb);\n cursor: pointer;\n transition: stroke 0.2s;\n flex-shrink: 0;\n}\n\n.omniscribe_source-external-icon:hover {\n stroke: #0d47a1;\n}\n\n.omniscribe_source-checkbox:checked + .omniscribe_source-name {\n font-weight: 500;\n color: var(--omniscribe-text, #1f2937);\n}\n\n\n/* Source: modules/settings/components/chat/SourceSelector.css */\n.omniscribe_source-selector {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 24px;\n min-height: 0;\n flex: 1;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n.omniscribe_source-selector-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--omniscribe-text, #252a32);\n margin: 0;\n}\n\n.omniscribe_source-selector-description {\n font-size: 14px;\n color: var(--omniscribe-text-muted, #6b7280);\n line-height: 1.5;\n margin: 0;\n}\n\n.omniscribe_source-list {\n width: 100%;\n max-width: 100%;\n min-height: 105px;\n max-height: 285px;\n border-radius: 12px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n background: var(--omniscribe-surface, #ffffff);\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n overflow-y: auto;\n flex: 1;\n box-sizing: border-box;\n}\n\n.omniscribe_source-list--compact {\n max-height: 105px;\n}\n\n\n/* Source: modules/settings/section/Configuration.css */\n.omniscribe_config-content {\n width: 650px;\n max-height: 590px;\n opacity: 1;\n background-color: var(--omniscribe-surface, #ffffff);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.omniscribe_config-list {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n flex: 1;\n}\n\n.omniscribe_config-item {\n width: 100%;\n height: 75px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n opacity: 1;\n padding: 10px 22px 10px 16px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n box-sizing: border-box;\n flex-shrink: 0;\n}\n\n.omniscribe_config-item:hover {\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n}\n\n.omniscribe_config-item:focus {\n outline: none;\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_config-item:last-child {\n border-bottom: none;\n}\n\n.omniscribe_config-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n}\n\n.omniscribe_config-icon {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_config-item-content {\n flex: 1;\n margin-left: 16px;\n margin-right: 16px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 4px;\n}\n\n.omniscribe_config-item-title {\n margin: 0;\n font-weight: 700;\n font-size: 14px;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n color: var(--omniscribe-text, #252a32);\n}\n\n.omniscribe_config-item-description {\n margin: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_config-item-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #9ca3af);\n flex-shrink: 0;\n}\n\n/* Sub-screen styles */\n.omniscribe_config-subscreen-header {\n display: flex;\n align-items: center;\n padding: 16px 16px 8px 16px;\n}\n\n.omniscribe_config-back-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n}\n\n.omniscribe_config-subscreen-title {\n margin: 0;\n font-size: 18px;\n font-weight: 500;\n color: var(--omniscribe-text, #252a32);\n line-height: 21.6px;\n}\n\n.omniscribe_config-subscreen-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 16px;\n min-height: 0; /* Permite que los hijos se compriman */\n box-sizing: border-box; /* Incluye padding en el cálculo */\n}\n\n.omniscribe_config-subscreen-content.no-border {\n /* no-border variant */\n}\n\n.omniscribe_config-subscreen-content-template {\n flex: 1;\n overflow-y: auto;\n padding-bottom: 50px;\n}\n\n.omniscribe_config-section-label {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n line-height: 1.4;\n}\n\n.omniscribe_config-language-section {\n display: flex;\n flex-direction: column;\n}\n\n/* Audio-environment (VAD) section: titled control with helper text below. */\n.omniscribe_config-audio-env {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n\n.omniscribe_config-language-section-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n margin-bottom: 8px;\n}\n\n.omniscribe_config-subscreen-description,\n.omniscribe_config-subscreen-subdescription {\n margin: 0 0 0 0;\n font-size: 14px;\n line-height: 18px;\n color: var(--omniscribe-text, #13161a);\n font-weight: 400;\n}\n\n.omniscribe_config-subscreen-subdescription {\n font-style: italic;\n}\n/* Dictionary Options View Styles */\n.omniscribe_config-dictionary-section {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.omniscribe_config-dictionary-add-section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.omniscribe_config-dictionary-input-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.omniscribe_config-dictionary-input {\n height: 32px;\n border: 1px solid var(--omniscribe-border, #e5e8eb) !important;\n border-radius: 8px !important;\n padding: 0 12px !important;\n font-size: 14px !important;\n line-height: 1.4 !important;\n background-color: var(--omniscribe-surface, #ffffff) !important;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease !important;\n}\n\n.omniscribe_config-dictionary-input:focus {\n outline: none !important;\n border-color: #4f46e5 !important;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important;\n}\n\n.omniscribe_config-dictionary-input::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af) !important;\n font-size: 14px !important;\n}\n\n.omniscribe_config-dictionary-input.error {\n border-color: #dc3545 !important;\n background-color: #fff5f5 !important;\n}\n\n.omniscribe_config-dictionary-input.error:focus {\n border-color: #dc3545 !important;\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1) !important;\n}\n\n.omniscribe_config-dictionary-add-btn {\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--primary);\n border: 1px solid var(--primary);\n border-radius: 8px;\n color: var(--primary-foreground);\n cursor: pointer;\n transition: all 0.2s ease;\n margin-top: 0;\n font-size: 0;\n}\n\n.omniscribe_config-dictionary-add-btn:hover:not(:disabled) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n border-color: color-mix(in oklab, var(--primary) 90%, transparent);\n}\n\n.omniscribe_config-dictionary-add-btn:disabled {\n background-color: #e5e8eb;\n border-color: var(--omniscribe-border, #e5e8eb);\n color: var(--omniscribe-text-muted, #9ca3af);\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.omniscribe_config-dictionary-list {\n display: flex;\n padding-top: 16px;\n flex-direction: column;\n gap: 8px;\n max-height: 410px;\n overflow-y: auto;\n margin-top: 4px;\n}\n\n.omniscribe_config-dictionary-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--omniscribe-border, #e5e8eb);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.omniscribe_config-dictionary-row:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n border-color: var(--omniscribe-border, #d1d5db);\n}\n\n.omniscribe_config-dictionary-cell {\n flex: 1;\n font-size: 14px;\n line-height: 20px;\n color: var(--omniscribe-text, #374151);\n word-break: break-word;\n font-weight: 500;\n}\n\n.omniscribe_config-dictionary-arrow {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-size: 16px;\n font-weight: 600;\n flex-shrink: 0;\n margin: 0 4px;\n}\n\n.omniscribe_config-dictionary-delete-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_config-dictionary-delete-btn:hover {\n background-color: #fee2e2;\n color: #dc2626;\n transform: scale(1.05);\n}\n\n.omniscribe_config-dictionary-empty {\n padding: 40px 16px;\n margin-top: 16px;\n text-align: center;\n color: var(--omniscribe-text-muted, #6b7280);\n font-size: 14px;\n line-height: 20px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 2px dashed var(--omniscribe-border, #e5e8eb);\n border-radius: 12px;\n font-style: italic;\n}\n\n/* Template specific styles */\n\n/* General prompt section */\n.omniscribe_template-general-prompt-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-bottom: 8px;\n}\n\n.omniscribe_template-section-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n line-height: 1.4;\n}\n\n.omniscribe_template-section-subtitle {\n margin: 0;\n font-size: 13px;\n font-weight: 400;\n color: var(--omniscribe-text-muted, #6b7280);\n line-height: 1.4;\n}\n\n.omniscribe_template-general-prompt-textarea {\n width: 100%;\n min-height: 80px;\n max-height: 200px;\n padding: 12px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: var(--omniscribe-text, #374151);\n background-color: var(--omniscribe-surface, white);\n resize: vertical;\n box-sizing: border-box;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_template-general-prompt-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-style: italic;\n}\n\n.omniscribe_template-general-prompt-textarea:focus {\n border-color: #3b5edb;\n box-shadow: 0 0 0 3px rgba(59, 94, 219, 0.1);\n}\n\n/* Fields section */\n.omniscribe_template-fields-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-top: 8px;\n}\n\n.omniscribe_template-field {\n background: var(--omniscribe-surface, white);\n border-bottom: 1px solid var(--omniscribe-border, #e1e8ed);\n margin-bottom: 0;\n}\n\n.omniscribe_template-field:last-child {\n border-bottom: none;\n}\n\n.omniscribe_template-field-header {\n display: flex;\n align-items: center;\n padding: 12px 0;\n background: var(--omniscribe-surface, #ffffff);\n}\n\n.omniscribe_template-field-checkbox {\n background: none;\n border: none;\n padding: 0;\n margin-right: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.omniscribe_template-field-label {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text, #2c3e50);\n}\n\n.omniscribe_template-field-prompt-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_template-field-prompt-btn:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_template-field-content {\n padding: 0 0 12px 34px;\n background: var(--omniscribe-surface, white);\n}\n\n.omniscribe_template-textarea {\n width: 100%;\n min-height: 80px;\n max-height: 300px;\n padding: 12px;\n border: 1px solid var(--omniscribe-border, #e1e8ed);\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n background: var(--omniscribe-surface, white);\n box-sizing: border-box;\n overflow-y: auto;\n}\n\n.omniscribe_template-textarea:focus {\n outline: none;\n border-color: #3b5edb;\n box-shadow: 0 0 0 3px rgba(59, 94, 219, 0.1);\n}\n\n.omniscribe_template-character-count {\n margin-top: 8px;\n font-size: 12px;\n color: var(--omniscribe-text-muted, #95a5a6);\n display: flex;\n}\n\n/* Template fields container */\n.omniscribe_template-fields {\n display: flex;\n flex-direction: column;\n background: var(--omniscribe-surface, white);\n}\n\n/* Improved scrollbar for template fields */\n.omniscribe_template-fields::-webkit-scrollbar {\n width: 6px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 3px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 3px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-thumb:hover {\n background: #a8a8a8;\n}\n\n.omniscribe_config-version-section {\n background: var(--omniscribe-surface-alt, #f6f7f9);\n color: var(--omniscribe-text-muted, #4a5364);\n padding: 8px 24px;\n font-weight: 700;\n line-height: 16.8px;\n font-size: 14px;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n\n/* Source: modules/transcription/components/audio-visualizer/AudioVisualizer.css */\n.omniscribe_audio-visualizer-container {\n display: flex;\n border-radius: var(--radius-md);\n width: calc(var(--spacing) * 60);\n align-items: center;\n justify-content: center;\n height: 60px;\n background: transparent;\n overflow: hidden;\n}\n\n.omniscribe_audio-visualizer-subcontainer {\n display: flex;\n align-items: center;\n justify-content: space-evenly;\n width: 100%;\n height: 100%;\n}\n\n.omniscribe_audio-visualizer-item-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding-inline: 1px;\n margin-top: 0.25rem;\n}\n\n.omniscribe_audio-visualizer-item {\n width: 2px;\n height: 2px;\n background-color: rgba(48, 54, 68, 0.85);\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 50ms;\n}\n\n.lk-audio-bar-visualizer {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: var(--lk-bg);\n gap: var(--lk-va-bar-gap, 24px);\n}\n.lk-audio-bar-visualizer > .lk-audio-bar {\n transform-origin: 'center';\n height: 100%;\n width: var(--lk-va-bar-width, 12px);\n border-radius: var(--lk-va-bar-border-radius, 32px);\n background-color: var(--lk-va-bar-bg, rgba(136, 136, 136, 0.2));\n transition: background-color 0.25s ease-out;\n}\n.lk-audio-bar-visualizer[data-lk-va-state='speaking'] > .lk-audio-bar,\n.lk-audio-bar-visualizer > .lk-audio-bar.lk-highlighted,\n.lk-audio-bar-visualizer > [data-lk-highlighted='true'] {\n background-color: var(--lk-fg, rgb(136, 136, 136));\n transition: none;\n}\n.lk-audio-bar-visualizer[data-lk-va-state='thinking'] {\n transition: background-color 0.15s ease-out;\n}\n\n\n/* Source: modules/transcription/components/content-container/content-containter.css */\n.omniscribe_audio-content-container {\n background-color: var(--white);\n width: -webkit-fill-available;\n flex: 1 1 0 !important;\n min-height: 0 !important;\n display: flex !important;\n flex-direction: column !important;\n overflow: hidden !important;\n}\n\n.omniscribe_audio-content-messages {\n color: var(--black);\n}\n\n.omniscribe_transcription-footer-container {\n position: sticky;\n display: flex;\n flex-direction: column;\n align-items: center;\n bottom: 0;\n padding-bottom: calc(var(--spacing) * 3);\n}\n\n.omniscribe_audio-content-render {\n color: var(--black);\n font-weight: var(--font-weight-medium);\n padding-block: 0.5rem;\n padding-inline: 0.75rem;\n margin-bottom: 0.25rem;\n}\n\n.omniscribe_patient {\n color: #db10c1;\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_doctor {\n color: var(--blue-500);\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_speaker {\n color: #28a745;\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_transcription {\n color: var(--black);\n}\n\n.omniscribe_transcription-down-btn-container {\n background-color: var(--omniscribe-surface, white);\n}\n\n.omniscribe_transcription-down-btn {\n width: calc(0.25rem /* 4px */ * 4);\n height: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Chrome, Safari, Edge (Webkit) */\n.omniscribe_audio-content-container > div::-webkit-scrollbar {\n width: 6px !important;\n}\n\n.omniscribe_audio-content-container > div::-webkit-scrollbar-thumb {\n border-radius: 10px !important;\n background-color: var(--omni-secondary) !important;\n}\n\n.omniscribe_audio-content-container > div::-webkit-scrollbar-track {\n background-color: transparent !important;\n}\n\n/* Firefox */\n.omniscribe_audio-content-container > div {\n scrollbar-width: thin !important;\n scrollbar-color: var(--omni-secondary) transparent !important;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-processing {\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-processing-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-skeleton-line {\n height: 14px;\n width: 70%;\n}\n\n.omniscribe_transcription-skeleton-line--short {\n width: 40%;\n}\n\n.omniscribe_transcription-processing-text {\n font-size: var(--text-xs);\n color: var(--omni-secondary, #6b7280);\n}\n\n\n/* Source: modules/transcription/components/recorder-counter/RecorderCounter.css */\n.omniscribe_audio-recorder-timer {\n color: var(--blue-500);\n font-weight: 600; /* SemiBold */\n font-style: normal; /* SemiBold is a weight, not a style */\n font-size: var(--font-size-400); /* design token */\n line-height: var(--line-height-400); /* design token */\n letter-spacing: 0;\n text-align: center;\n}\n\n\n/* Source: modules/transcription/components/toggle-record/ToggleRecord.css */\n.omniscribe_record-button-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n.omniscribe_record-button-classname {\n background-color: transparent;\n border: none;\n padding: 4px;\n}\n\n.omniscribe_record-button {\n background-color: var(--primary-button);\n border-radius: 50%;\n cursor: pointer;\n width: 56px;\n height: 56px;\n align-items: center;\n justify-content: center;\n display: flex;\n transition-duration: 300ms;\n box-shadow:\n inset 0 2px 4px rgb(0 0 0 / 0.05),\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.omniscribe_record-button-enabled {\n opacity: 100%;\n pointer-events: auto;\n scale: 110%;\n &:hover {\n scale: 150%;\n }\n}\n.omniscribe_record-button-not-enabled {\n opacity: 50%;\n &:hover {\n scale: 150%;\n }\n}\n.omniscribe_record-button-disabled {\n opacity: 50%;\n background-color: dimgray;\n pointer-events: none;\n}\n\n.omniscribe_record-enabled {\n width: 50px;\n height: 50px;\n background-color: var(--primary-button);\n animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n position: absolute;\n z-index: -1;\n border-radius: calc(infinity * 1px);\n opacity: 100%;\n}\n\n@keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n\n/* Source: modules/transcription/section/AudioRecorder.css */\n.omniscribe_audio-recorder {\n align-items: center;\n padding-block: calc(var(--spacing) * 5);\n border-bottom-left-radius: 12px;\n background-color: var(--white);\n display: flex;\n flex: 1;\n flex-direction: column;\n}\n\n[dir='ltr'] .omniscribe_audio-recorder {\n border-bottom-left-radius: 12px;\n}\n\n[dir='rtl'] .omniscribe_audio-recorder {\n border-bottom-right-radius: 12px;\n border-bottom-left-radius: 0px;\n}\n\n.omniscribe_audio-recorder-container {\n display: flex;\n align-items: center;\n border: solid 1px var(--light-border);\n background-color: var(--white);\n max-height: 42px;\n border-radius: 9999px;\n border-width: 1px;\n justify-content: space-between;\n margin-bottom: 5px;\n flex: 1;\n align-self: stretch;\n margin-inline: calc(var(--spacing) * 4);\n padding-inline: calc(var(--spacing) * 2);\n}\n\n.omniscribe_audio-recorder-audio-container {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: center;\n}\n\n.omniscribe_audio-recorder-refresh-btn {\n cursor: pointer;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border-radius: 100px;\n transition:\n transform 0.3s ease,\n opacity 0.3s ease,\n background-color 0.3s ease;\n transform: scale(1);\n}\n.omniscribe_audio-recorder-refresh-btn-enabled {\n pointer-events: auto;\n opacity: 1;\n\n &:hover {\n transform: scale(1.15);\n }\n}\n.omniscribe_audio-recorder-refresh-btn-disabled {\n pointer-events: none;\n opacity: 0.5;\n}\n.omniscribe_audio-recorder-audio-content-container {\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n border-radius: 8px;\n margin-top: 18px;\n padding-top: 8px;\n padding-inline: calc(var(--spacing) * 4);\n padding-bottom: 8px;\n align-self: stretch;\n margin-inline: calc(var(--spacing) * 4);\n}\n.omniscribe_audio-recorder-footer {\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n padding-top: 16px;\n margin-top: 12px;\n display: flex;\n width: 100%;\n}\n.omniscribe_audio-recorder-footer-content {\n padding-inline: calc(var(--spacing) * 4);\n width: 100%;\n justify-content: space-between;\n align-items: center;\n display: flex;\n}\n.omniscribe_audio-recorder-audio-info {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n color: var(--omniscribe-text-muted, #6f7d95);\n padding-block: 8px;\n}\n\n.omniscribe_audio-recorder-audio-star-icons {\n display: flex;\n justify-content: center;\n gap: 4px;\n}\n\n.omniscribe_audio-recorder-audio-feedback {\n color: var(--omniscribe-text-muted, #a4adbc);\n}\n\n.omniscribe_audio-recorder-refresh-icon {\n color: var(--omniscribe-text, #252a32);\n}\n\n.omniscribe_audio-recorder-star-icon {\n cursor: pointer;\n display: inline-block;\n}\n\n\n/* Source: shared/components/ActivationGuardDialog.css */\n/* The shared Modal overlay is absolutely positioned against its nearest\n positioned ancestor, which for this dialog is wherever the provider happens\n to sit in the tree. Force fixed so it centers over the viewport. */\n.omniscribe_modal-overlay:has(.omniscribe_activation-guard-modal) {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.omniscribe_activation-guard-modal {\n width: 480px;\n max-width: 90vw;\n padding: 24px !important;\n}\n\n/* Override Modal's default h2 size for this dialog. */\n.omniscribe_activation-guard-modal .omniscribe_modal-title-container {\n margin-bottom: 16px;\n align-items: flex-start;\n}\n\n.omniscribe_activation-guard-modal .omniscribe_modal-title {\n font-size: 18px;\n line-height: 1.3;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_activation-guard-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.omniscribe_activation-guard-summary {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.omniscribe_activation-guard-summary-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 9999px;\n background-color: #fef3c7;\n color: #b45309;\n}\n\n.omniscribe_activation-guard-summary-text {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--color-gray-800, #1f2937);\n flex: 1;\n}\n\n.omniscribe_activation-guard-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 16px;\n margin-top: 4px;\n}\n\n.omniscribe_activation-guard-secondary {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #374151);\n border-radius: 9999px;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_activation-guard-secondary:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_activation-guard-primary {\n border-radius: 9999px !important;\n gap: 8px;\n padding-block: 10px !important;\n padding-inline: 18px !important;\n height: auto !important;\n font-weight: 600;\n}\n\n\n/* Source: shared/components/Card.css */\n.omniscribe_card {\n background-color: var(--color-card, #ffffff);\n color: var(--color-card-foreground, #000000);\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n border-radius: 0.75rem;\n border: 1px solid var(--color-border, var(--grey-200));\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n.omniscribe_card-header {\n container-type: inline-size;\n container-name: card-header;\n display: grid;\n grid-auto-rows: min-content;\n grid-template-rows: auto auto;\n align-items: start;\n gap: 0.375rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n/* When card-header has card-action, adjust grid layout */\n.omniscribe_card-header:has([data-slot='card-action']) {\n grid-template-columns: 1fr auto;\n}\n\n/* When card-header has border-b class, add padding bottom */\n.omniscribe_card-header.border-b {\n padding-bottom: 1.5rem;\n}\n\n.omniscribe_card-title {\n line-height: 1;\n font-weight: 600;\n}\n\n.omniscribe_card-description {\n color: var(--color-muted-foreground, #6b7280);\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.omniscribe_card-action {\n grid-column-start: 2;\n grid-row: span 2 / span 2;\n grid-row-start: 1;\n align-self: start;\n justify-self: end;\n}\n\n.omniscribe_card-content {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n.omniscribe_card-footer {\n display: flex;\n align-items: center;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n.omniscribe_card-footer.border-t {\n padding-top: 1.5rem;\n}\n\n\n/* Source: shared/components/app-skeleton.css */\n.omniscribe_app-skeleton {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--white);\n border-radius: 12px;\n}\n\n/* Header */\n.omniscribe_app-skeleton-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-header-left,\n.omniscribe_app-skeleton-header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.omniscribe_app-skeleton-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n}\n\n.omniscribe_app-skeleton-title {\n width: 48px;\n height: 20px;\n border-radius: 4px;\n}\n\n.omniscribe_app-skeleton-badge {\n width: 150px;\n height: 32px;\n border-radius: 99999px;\n}\n\n/* Disclaimer banner */\n.omniscribe_app-skeleton-banner {\n padding: 6px 16px;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-banner-text {\n width: 100%;\n height: 16px;\n border-radius: 4px;\n}\n\n/* Content */\n.omniscribe_app-skeleton-content {\n flex: 1;\n padding: 20px;\n}\n\n.omniscribe_app-skeleton-welcome {\n width: 240px;\n height: 28px;\n border-radius: 4px;\n margin-bottom: 10px;\n}\n\n.omniscribe_app-skeleton-suggestions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.omniscribe_app-skeleton-suggestion {\n height: 25px;\n border-radius: 99999px;\n}\n\n.omniscribe_app-skeleton-suggestion--long {\n width: 320px;\n}\n\n.omniscribe_app-skeleton-suggestion--longer {\n width: 380px;\n}\n\n.omniscribe_app-skeleton-suggestion--medium {\n width: 280px;\n}\n\n/* Bottom bar */\n.omniscribe_app-skeleton-bottom {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-transcribe-btn {\n width: 140px;\n height: 40px;\n border-radius: 99999px;\n flex-shrink: 0;\n}\n\n.omniscribe_app-skeleton-input {\n flex: 1;\n height: 40px;\n border-radius: 99999px;\n}\n\n\n/* Source: shared/components/button.css */\n.omniscribe_button {\n border: none;\n background: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: calc(var(--spacing) * 2);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n outline-style: none;\n /* Enabled buttons must show the pointer affordance; the base rule never set\n it, so variants without their own cursor (e.g. outline, used by the chat\n mic button) rendered the default arrow. `:disabled` below overrides it. */\n cursor: pointer;\n &:disabled {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 50%;\n }\n & svg {\n pointer-events: none;\n flex-shrink: 0;\n }\n & svg:not([class*='size-svg']) {\n width: calc(var(--spacing) * 4) /* 1rem = 16px */;\n height: calc(var(--spacing) * 4) /* 1rem = 16px */;\n }\n &:focus-visible {\n border-color: var(--ring);\n box-shadow: 0 0 0 calc(3px + var(--tw-ring-offset-width))\n color-mix(in oklab, var(--ring) 50%, transparent);\n }\n &[aria-invalid='true'] {\n border-color: var(--destructive);\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n}\n\n.omniscribe_button-variant-default {\n background-color: var(--primary);\n color: var(--primary-foreground);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n}\n.omniscribe_button-variant-destructive {\n background-color: var(--destructive);\n color: var(--white);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n &:focus-visible {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n}\n.omniscribe_button-variant-outline {\n border: solid 1px var(--input);\n background-color: var(--background);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n }\n}\n.omniscribe_button-variant-icon {\n align-items: center;\n border-radius: 100%;\n padding: 10px;\n & svg {\n pointer-events: auto;\n flex-shrink: 0;\n }\n & svg:not([class*='size-svg']) {\n width: auto;\n height: auto;\n }\n}\n.omniscribe_button-variant-secondadry {\n background-color: var(--secondary);\n pointer-events: cursor;\n cursor: pointer;\n color: var(--secondary-foreground);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: var(--secondary-hover) !important;\n }\n &:disabled {\n background-color: var(--omniscribe-surface-alt, #edeff2);\n cursor: not-allowed;\n color: var(--omniscribe-text-muted, #d5d9e0);\n }\n}\n.omniscribe_button-variant-ghost:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n}\n.omniscribe_button-variant-empty {\n cursor: pointer;\n}\n.omniscribe_button-variant-primary {\n cursor: pointer;\n background-color: var(--primary-button);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n font-size: 16px !important;\n color: var(--white);\n &:hover {\n background-color: color-mix(\n in oklab,\n var(--primary-button) 60%,\n transparent\n );\n }\n}\n.omniscribe_button-size-default {\n height: calc(var(--spacing) * 9);\n padding-inline: calc(var(--spacing) * 4);\n padding-block: calc(var(--spacing) * 2);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 3) /* 0.75rem = 12px */;\n }\n}\n.omniscribe_button-size-sm {\n height: calc(var(--spacing) * 8);\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n gap: calc(var(--spacing) * 1.5) /* 0.375rem = 6px */;\n padding-inline: calc(var(--spacing) * 3);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n}\n\n.omniscribe_button-size-lg {\n height: calc(var(--spacing) * 10);\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n padding-inline: calc(var(--spacing) * 6);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n}\n\n.omniscribe_button-size-icon {\n height: calc(var(--spacing) * 5);\n width: calc(var(--spacing) * 5);\n}\n.omniscribe_button-size-padding {\n padding: calc(var(--spacing) * 2);\n min-width: calc(var(--spacing) * 40);\n}\n\n.omniscribe_button-text {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n}\n.omniscribe_button-whitespace {\n white-space: nowrap;\n}\n.omniscribe_button-rounded {\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n}\n.omniscribe_button-disabled {\n pointer-events: none;\n}\n.omniscribe_button-loading {\n opacity: 50%;\n}\n.omniscribe_button-animate-spin {\n animation: spin 1s linear infinite;\n}\n.omniscribe_button-variant-report {\n cursor: pointer;\n background-color: var(--report);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n font-size: 16px;\n color: var(--white);\n &:hover {\n background-color: color-mix(in oklab, var(--report) 60%, transparent);\n }\n}\n\n\n/* Source: shared/components/feedback-modal.css */\n.omniscribe_feedback-modal {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n background: var(--omniscribe-surface, white);\n border: 1px solid var(--omniscribe-border, #e2e8f0);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n margin-top: 8px;\n min-width: 200px;\n width: 200px;\n transform-origin: top left;\n}\n\n.omniscribe_feedback-input-container {\n position: relative;\n display: flex;\n align-items: flex-end;\n border: 1px solid var(--omniscribe-border, #d1d5db);\n border-radius: 8px;\n}\n\n.omniscribe_feedback-textarea {\n flex: 1;\n border: transparent;\n border-radius: 8px;\n padding: 12px 12px 12px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n resize: none;\n min-height: 20px;\n max-height: 200px;\n overflow-y: auto;\n font-family: inherit;\n line-height: 1.4;\n width: 100%;\n box-sizing: border-box;\n}\n.omniscribe_feedback-textarea-padding {\n margin-bottom: 34px;\n padding-bottom: 0px !important;\n}\n\n.omniscribe_feedback-icons {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_feedback-icons:has(.omniscribe_feedback-send) {\n bottom: 8px;\n top: auto;\n transform: none;\n}\n\n.omniscribe_feedback-close {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-close:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #374151);\n}\n\n.omniscribe_feedback-close svg {\n width: 12px;\n height: 12px;\n}\n\n.omniscribe_feedback-send {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--blue-500);\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-send:hover {\n background-color: #f0f7ff;\n color: #0d47a1;\n}\n\n.omniscribe_feedback-send svg {\n width: 12px;\n height: 12px;\n}\n\n.omniscribe_feedback-confirmation {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-top: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n animation: fadeInOut 3s ease-in-out;\n}\n\n.omniscribe_feedback-confirmation-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n}\n\n/* Right-positioned modal styles */\n.omniscribe_feedback-modal-right {\n position: absolute;\n top: 7px;\n left: 17%;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n border: 1px solid var(--omniscribe-border, #e2e8f0);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n margin-left: 8px;\n width: 200px;\n transform-origin: bottom left;\n}\n\n.omniscribe_feedback-sending-center {\n top: 100%;\n left: 0;\n}\n\n.omniscribe_feedback-sending-right {\n top: 20px;\n left: 17%;\n}\n\n.omniscribe_feedback-sending {\n position: absolute;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-left: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n}\n.omniscribe_feedback-confirmation-right {\n position: absolute;\n top: 20px;\n left: 17%;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-left: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n animation: fadeInOut 3s ease-in-out;\n}\n\n@keyframes fadeInOut {\n 0% {\n opacity: 0;\n transform: translateY(-10px);\n }\n 10% {\n opacity: 1;\n transform: translateY(0);\n }\n 90% {\n opacity: 1;\n transform: translateY(0);\n }\n 100% {\n opacity: 0;\n transform: translateY(-10px);\n }\n}\n\n\n/* Source: shared/components/input.css */\n.omniscribe_input {\n height: calc(var(--spacing) * 9);\n width: 100%;\n display: flex;\n border-radius: calc(var(--radius));\n border: solid 1px var(--input);\n background-color: transparent;\n padding-inline: calc(var(--spacing) * 3);\n padding-block: calc(var(--spacing) * 1);\n font-size: var(--text-base) /* 1rem = 16px */;\n line-height: var(--text-base--line-height);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n outline-style: none;\n &::file-selector-button {\n color: var(--foreground);\n display: inline-flex;\n height: calc(var(--spacing) * 7);\n border: none;\n background-color: transparent;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n font-weight: var(--font-weight-medium);\n }\n &::placeholder {\n color: var(--muted-foreground);\n }\n &::selection {\n background-color: var(--primary);\n color: var(--primary-foreground);\n }\n &:disabled {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 50%;\n }\n &[aria-invalid='true'] {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n border-color: var(--destructive);\n }\n @media (width >= 48rem /* 768px */) {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */;\n }\n}\n\n.omniscribe_input-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.omniscribe_input.invalid {\n border-color: #dc3545;\n background-color: #fff5f5;\n box-shadow: 0 0 0 0.125rem rgba(220, 53, 69, 0.25);\n}\n\n.omniscribe_input-error {\n color: #dc3545;\n font-size: 10px;\n margin-block: 0.25rem;\n display: block;\n line-height: 1;\n}\n\n\n/* Source: shared/components/loading-modal.css */\n.omniscribe_loading-modal-container {\n position: absolute;\n background-color: color-mix(in oklab, var(--black) 50%, transparent);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 50;\n height: 100vh;\n width: 100vw;\n right: 0;\n bottom: calc(var(--spacing) * -5.2);\n}\n.omniscribe_loading-modal-subcontainer {\n background-color: var(--white);\n padding: calc(var(--spacing) * 8);\n border-radius: var(--radius);\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n text-align: center;\n max-width: var(--container-md);\n}\n.omniscribe_loading-modal-msg {\n font-size: var(--text-xl) /* 1.25rem = 20px */;\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-bold);\n margin-bottom: calc(var(--spacing) * 4);\n}\n.omniscribe_loading-modal-spin {\n display: inline-block;\n width: calc(var(--spacing) * 12);\n height: calc(var(--spacing) * 12);\n border: solid 4px var(--color-gray-200);\n border-top-color: var(--blue-500);\n border-radius: calc(infinity * 1px);\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.omniscribe_app-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1;\n}\n\n\n/* Source: shared/components/modal.css */\n.omniscribe_modal-overlay {\n position: absolute;\n background-color: color-mix(in oklab, var(--black) 50%, transparent);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 50;\n height: 100vh;\n width: 100vw;\n right: 0;\n bottom: calc(var(--spacing) * -5.2);\n}\n\n.omniscribe_modal-container {\n position: relative;\n background-color: var(--white);\n z-index: 100;\n border-radius: 12px;\n border: solid 1px var(--light-border);\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n padding: calc(var(--spacing) * 5);\n transition-duration: 300ms;\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 90vw;\n max-height: 90vh;\n}\n.omniscribe_modal-container-scroll {\n overflow: auto;\n}\n\n.omniscribe_modal-container-show {\n opacity: 100%;\n}\n\n.omniscribe_modal-container-hide {\n opacity: 0%;\n}\n\n.omniscribe_modal-subcontainer {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_modal-title-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: calc(var(--spacing) * 2);\n}\n\n.omniscribe_modal-title {\n font-size: var(--text-3xl); /* 1.875rem = 30px */\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-bold);\n margin: 0;\n}\n\n.omniscribe_modal-button {\n border: none;\n background: transparent;\n line-height: var(--text-2xl--line-height);\n cursor: pointer;\n color: var(--black);\n}\n\n@media (min-width: 768px) {\n .omniscribe_modal-container {\n max-width: 60vw;\n }\n}\n\n/* Large screens: desktop */\n@media (min-width: 1024px) {\n .omniscribe_modal-container {\n max-width: 50vw;\n }\n}\n\n/* Very large screens: large desktop and ultra-wide */\n@media (min-width: 1440px) {\n .omniscribe_modal-container {\n max-width: 40vw;\n }\n}\n\n/* Intermediate breakpoint: large tablets */\n@media (min-width: 640px) and (max-width: 767px) {\n .omniscribe_modal-container {\n max-width: 70vw;\n }\n}\n\n\n/* Source: shared/components/select.css */\n.omniscribe_select-container {\n position: relative;\n width: 100%;\n padding-block: calc(var(--spacing) * 3);\n}\n.omniscribe_select-button {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: calc(var(--spacing) * 3);\n background-color: var(--white);\n border-radius: var(--Radius-radius-medium, 8px);\n border: solid 1px var(--omniscribe-border, var(--light-border));\n cursor: pointer;\n}\n.omniscribe_select-button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.omniscribe_select-text {\n display: flex;\n align-items: center;\n gap: calc(var(--spacing) * 2);\n}\n.omniscribe_select-content-container {\n position: absolute;\n width: 100%;\n margin-top: calc(var(--spacing) * 2);\n border: solid 1px var(--omniscribe-border, var(--light-border));\n background-color: var(--white);\n border-radius: var(--radius);\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n bottom: calc(var(--spacing) * 15);\n padding-inline: calc(var(--spacing) * 1);\n padding-block: calc(var(--spacing) * 0.5);\n z-index: 9999;\n}\n.omniscribe_select-content-ul {\n overflow-y: scroll;\n max-height: calc(var(--spacing) * 44);\n padding-inline: 5px;\n}\n.omniscribe_select-content-li {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: calc(var(--spacing) * 3);\n cursor: pointer;\n &:hover {\n @media (hover: hover) {\n background-color: var(--omniscribe-surface-alt, var(--color-gray-100));\n }\n }\n}\n.omniscribe_select-check-icon {\n width: calc(var(--spacing) * 5);\n height: calc(var(--spacing) * 5);\n color: var(--color-slate-500) /* oklch(55.4% 0.046 257.417) = #62748e */;\n}\n.omniscribe_select-content-li-span {\n display: flex;\n align-items: center;\n gap: calc(0.25rem /* 4px */ * 2);\n}\n\n\n/* Source: shared/components/separator.css */\n/* Separator Component Styles */\n.omniscribe_separator {\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n flex-shrink: 0;\n}\n\n.omniscribe_separator--horizontal {\n height: 0;\n width: 100%;\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n border-right: none;\n border-bottom: none;\n border-left: none;\n}\n\n.omniscribe_separator--vertical {\n width: 0;\n height: 100%;\n border-left: 1px solid var(--omniscribe-border, #e5e7ec);\n border-top: none;\n border-right: none;\n border-bottom: none;\n}\n\n\n/* Source: shared/components/skeleton.css */\n.omniscribe_skeleton {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n}\n\n\n/* Source: shared/components/textarea.css */\n.omniscribe_textarea-default {\n display: flex;\n min-height: calc(var(--spacing) * 16);\n width: -webkit-fill-available;\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n border: solid 1px var(--input);\n background-color: transparent;\n padding-inline: calc(var(--spacing) * 3);\n padding-block: calc(var(--spacing) * 2);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n &::placeholder {\n color: var(--muted-foreground);\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n }\n &:focus-visible {\n border-color: var(--ring);\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n box-shadow: var(--tw-ring-inset,) 0 0 0\n calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n }\n &[aria-invalid='true'] {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n border-color: var(--destructive);\n }\n &:disabled {\n cursor: not-allowed;\n opacity: 50%;\n }\n}\n\n.omniscribe_textarea-secondary {\n padding: calc(var(--spacing) * 3.5);\n padding-bottom: calc(var(--spacing) * 0);\n border-style: none;\n background-color: transparent;\n resize: none;\n &:focus {\n outline-style: none;\n }\n}\n.omniscribe_textarea-general {\n font-family: 'Lato', sans-serif;\n font-size: var(--font-size-100);\n outline: none;\n}\n\n\n/* Source: shared/components/toast.css */\n.omniscribe_toast-stack {\n position: fixed;\n top: calc(var(--spacing) * 4);\n right: calc(var(--spacing) * 4);\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n z-index: 9999;\n pointer-events: none;\n}\n\n.omniscribe_toast-item {\n border-radius: var(--radius);\n padding: calc(var(--spacing) * 4);\n width: calc(var(--spacing) * 120);\n display: flex;\n align-items: flex-start;\n transition:\n transform 300ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 300ms cubic-bezier(0.4, 0, 0.2, 1);\n pointer-events: auto;\n}\n\n.omniscribe_toast-item-danger {\n background-color: var(--color-red-500);\n}\n.omniscribe_toast-item-black {\n background-color: var(--black);\n}\n.omniscribe_toast-item-show {\n transform: translateX(0);\n opacity: 1;\n}\n.omniscribe_toast-item-hide {\n transform: translateX(120%);\n opacity: 0;\n}\n.omniscribe_toast-subcontainer {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 100ms;\n display: flex;\n flex-direction: column;\n color: var(--white);\n flex: 1;\n}\n.omniscribe_toast-title {\n font-size: 18px;\n font-weight: var(--font-weight-bold);\n}\n.omniscribe_toast-msg {\n font-size: 16px;\n}\n.omniscribe_toast-close {\n background: none;\n border: none;\n color: var(--white);\n font-size: 18px;\n cursor: pointer;\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2);\n align-self: flex-start;\n opacity: 0.8;\n}\n.omniscribe_toast-close:hover {\n opacity: 1;\n}\n\n\n/* Source: shared/components/toggle.css */\n.omniscribe_toggle-container {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n flex-direction: column;\n}\n\n.omniscribe_toggle-label {\n font-size: 14px;\n font-weight: 400;\n color: var(--omniscribe-text, #374151);\n flex: 1;\n}\n\n.omniscribe_toggle-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.omniscribe_toggle-switch {\n position: relative;\n width: 29px;\n height: 16px;\n background-color: #d1d5db;\n border-radius: 8px;\n border: none;\n cursor: pointer;\n transition: background-color 0.2s ease;\n outline: none;\n}\n\n.omniscribe_toggle-switch:focus-visible {\n box-shadow: 0 0 0 2px var(--secondary, #132caa);\n}\n\n.omniscribe_toggle-switch-checked {\n background-color: var(--secondary, #132caa);\n}\n\n.omniscribe_toggle-switch-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n /* High-contrast fill that sits on top of the track — must contrast the */\n /* track color, not inherit the panel surface (which would vanish in a */\n /* dark theme). Hosts theming dark set --omniscribe-on-accent to a dark */\n /* ink; light hosts fall back to white (unchanged). */\n background-color: var(--omniscribe-on-accent, white);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.omniscribe_toggle-switch-checked .omniscribe_toggle-thumb {\n transform: translateX(13px);\n}\n\n.omniscribe_toggle-status {\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #6b7280);\n min-width: 70px;\n}\n\n.omniscribe_toggle-switch-checked + .omniscribe_toggle-status {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n\n/* Source: shared/components/tooltip.css */\n.tooltip-base {\n position: fixed;\n z-index: 9999;\n border-radius: 0.375rem; /* rounded-md */\n background-color: #111827;\n padding: 0.5rem 0.75rem; /* px-3 py-2 */\n font-size: 0.875rem; /* text-sm */\n font-family: 'Lato', sans-serif;\n color: #ffffff; /* text-white */\n box-shadow:\n 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg */\n transition: opacity 0.2s ease-in-out; /* transition-opacity duration-200 */\n pointer-events: none;\n user-select: none;\n word-wrap: break-word;\n line-height: 1.4;\n}\n\n/* Tooltip Arrow Styles */\n.tooltip-arrow {\n position: absolute;\n width: 0.5rem; /* w-2 */\n height: 0.5rem; /* h-2 */\n background-color: #111827;\n transform: rotate(45deg);\n}\n\n/* Arrow positioning for each side */\n.tooltip-arrow-top {\n bottom: -0.25rem; /* bottom-[-4px] */\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-bottom {\n top: -0.25rem; /* top-[-4px] */\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-left {\n right: -0.25rem; /* right-[-4px] */\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-right {\n left: -0.25rem; /* left-[-4px] */\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n}\n\n/* Width classes based on message length */\n.tooltip-width-auto {\n width: auto;\n white-space: nowrap;\n}\n\n.tooltip-width-200 {\n width: auto;\n max-width: 200px;\n}\n\n.tooltip-width-xs {\n width: auto;\n max-width: 20rem; /* max-w-xs */\n}\n\n.tooltip-width-sm {\n width: auto;\n max-width: 24rem; /* max-w-sm */\n}\n\n.tooltip-width-400 {\n width: auto;\n max-width: 400px;\n}\n\n/* Trigger container styles */\n.tooltip-trigger {\n display: inline-flex;\n}\n\n/* Animation classes */\n.tooltip-enter {\n opacity: 0;\n transform: scale(0.95);\n}\n\n.tooltip-enter-active {\n opacity: 1;\n transform: scale(1);\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n\n.tooltip-exit {\n opacity: 1;\n transform: scale(1);\n}\n\n.tooltip-exit-active {\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity 0.15s ease-in-out,\n transform 0.15s ease-in-out;\n}\n\n/* Dark theme variant */\n.tooltip-dark {\n background-color: #1f2937; /* bg-gray-800 */\n color: var(--grey-50);\n}\n\n.tooltip-dark .tooltip-arrow {\n background-color: #1f2937;\n}\n\n/* Light theme variant */\n.tooltip-light {\n background-color: var(--omniscribe-surface, #ffffff);\n color: var(--omniscribe-text, #374151); /* text-gray-700 */\n box-shadow:\n 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05),\n 0 0 0 1px rgba(0, 0, 0, 0.05);\n}\n\n.tooltip-light .tooltip-arrow {\n background-color: var(--omniscribe-surface, #ffffff);\n}\n\n/* Responsive breakpoints */\n@media (max-width: 640px) {\n .tooltip-base {\n max-width: calc(100vw - 2rem);\n font-size: 0.8125rem; /* Slightly smaller on mobile */\n }\n\n .tooltip-width-400,\n .tooltip-width-sm,\n .tooltip-width-xs {\n max-width: calc(100vw - 2rem);\n }\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .tooltip-base {\n border: 2px solid #ffffff;\n }\n\n .tooltip-light {\n border: 2px solid #000000;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .tooltip-base,\n .tooltip-enter-active,\n .tooltip-exit-active {\n transition: none;\n }\n}\n\n\n/* Source: test/mocks/empty.css */\n/* Empty CSS file for mocking styles */\n";
|
|
169784
|
+
const injectedCss = "/* Source: index.css */\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@700&family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap');\n\n/* ------------------------------------------------------------------ */\n/* Theming hooks (host-overridable). */\n/* */\n/* CSS custom properties defined on the `<sofia-sdk>` element inherit */\n/* across the shadow DOM boundary. Hosts override any of these on the */\n/* element to retheme the SDK without touching internals: */\n/* */\n/* <sofia-sdk style=\"--omniscribe-primary: #1f6f5f\"></sofia-sdk> */\n/* */\n/* Internal tokens that map to a host override use */\n/* `var(--omniscribe-*, <default>)`. */\n/* */\n/* Available hooks: */\n/* --omniscribe-font-family */\n/* --omniscribe-primary main brand / primary action */\n/* --omniscribe-primary-soft light tint of primary */\n/* --omniscribe-secondary secondary action */\n/* --omniscribe-secondary-hover secondary hover state */\n/* --omniscribe-accent highlight / report color */\n/* --omniscribe-warning gap / warning chrome */\n/* --omniscribe-text primary text */\n/* --omniscribe-text-muted secondary text */\n/* --omniscribe-surface card / panel background */\n/* --omniscribe-surface-alt header / footer / hover bg */\n/* --omniscribe-border primary border */\n/* --omniscribe-border-soft in-card separators */\n/* */\n/* The insertion-preview modal has its own (more granular) variables */\n/* documented in InsertionPreviewModal.css. */\n/* ------------------------------------------------------------------ */\n\n/* Color scheme of the shadow subtree. Defaults to light so native */\n/* form controls (<select>, <input>) and assistant-ui surfaces don't */\n/* follow the host OS dark mode. A host that themes the SDK dark */\n/* (e.g. the radiology reading room) sets --omniscribe-color-scheme: */\n/* dark so native controls render light-on-dark and stay legible. */\n:host {\n color-scheme: var(--omniscribe-color-scheme, light);\n}\n\n#Omniscribe {\n font-family: var(--omniscribe-font-family, 'Lato', sans-serif);\n color-scheme: var(--omniscribe-color-scheme, light);\n /* define colors */\n --active: #0a3785;\n --background-primary: var(--omniscribe-primary-soft, #e7effd);\n --warning: var(--omniscribe-warning, #ffc107);\n --grey-50: #f9fafb;\n --grey-100: #f6f7f9;\n --grey-200: #e5e7eb;\n --grey-700: #6f7d95;\n --grey-800: #4a5364;\n --grey-900: #252a32;\n --active-black: #252a32;\n --placeholder: #a4adbc;\n --line: var(--omniscribe-border, #e5e7ec);\n --custom-black: #13161a;\n --primary: var(--omniscribe-primary, #105bdb);\n --border: var(--omniscribe-border, #e5e7ec);\n --white: var(--omniscribe-surface, #fdfdfd);\n --omni: #daf2ff;\n --omni-secondary: rgba(219, 219, 219, 0.75);\n --primary-button: var(--omniscribe-primary, #105bdb);\n --primary-text: #36a3cf;\n --primary-900: var(--omniscribe-primary, #061044);\n --blue-100: var(--omniscribe-primary-soft, #dbeafe);\n --blue-200: var(--omniscribe-primary-soft, #bfdbfe);\n --blue-500: var(--omniscribe-primary, #105bdb);\n --blue-600: var(--omniscribe-primary, #2563eb);\n --blue-700: var(--omniscribe-primary, #1d4ed8);\n --report: var(--primary-button);\n --gray: #616161;\n --black: #1b2125;\n --sky-blue: var(--omniscribe-primary-soft, #dbecff);\n --blue: var(--omniscribe-primary, #5886ba);\n --blue-600: var(--omniscribe-primary, #0b1962);\n --background: var(--omniscribe-surface-alt, #f3f3f3bb);\n --foreground: var(--omniscribe-text, oklch(0.145 0 0));\n --primary: var(--omniscribe-primary, #061044);\n --primary-foreground: var(--omniscribe-on-accent, oklch(0.985 0 0));\n --secondary: var(--omniscribe-secondary, #132caa);\n --secondary-foreground: var(--omniscribe-on-accent, #fff);\n --secondary-hover: var(--omniscribe-secondary-hover, #2847e7);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: var(--omniscribe-surface-alt, oklch(0.97 0 0));\n --accent-foreground: var(--omniscribe-text, oklch(0.205 0 0));\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --light-border: oklch(0.922 0 0);\n --input: var(--omniscribe-border, oklch(0.922 0 0));\n --ring: oklch(0.87 0 0);\n --radius: 0.625rem;\n /* TEXT */\n --text-3xs: 8px;\n --text-3xs--line-height: calc(0.5 / 0.25);\n --text-2xs: 10px;\n --text-2xs--line-height: calc(0.75 / 0.5);\n --text-xs: 12px;\n --text-xs--line-height: 14.4px;\n --text-xs--letter-spacing: 0.05px;\n --text-sm: 14px;\n --text-sm--line-height: 16.8px;\n --text-xs--letter-spacing: 0.05px;\n --text-base: 16px;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 18px;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 20px;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 22px;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 24px;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 26px;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 28px;\n --text-5xl--line-height: 1;\n --text-6xl: 30px;\n --text-6xl--line-height: 1;\n --text-7xl: 32px;\n --text-7xl--line-height: 1;\n --text-8xl: 34px;\n --text-8xl--line-height: 1;\n --text-9xl: 46px;\n --text-9xl--line-height: 1;\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n /* custom colors */\n --color-white: var(--white);\n --color-light-border: var(--light-border);\n --color-omni: var(--omni);\n --color-report: var(--report);\n --color-omni-secondary: var(--omni-secondary);\n --color-primary-text: var(--primary-text);\n --color-primary-900: var(--primary-900);\n --color-blue-500: var(--blue-500);\n --color-gray: var(--gray);\n --color-black: var(--black);\n --color-sky-blue: var(--sky-blue);\n --color-cream: var(--cream);\n --color-pink: var(--pink);\n --color-blue: var(--blue);\n --color-blue-600: var(--blue-600);\n --color-sky-blue-100: var(--sky-blue-100);\n --color-white-2: var(--white-2);\n --color-primary-700: var(--primary-700);\n --color-primary-500: var(--primary-500);\n --color-neutral-800: var(--neutral-800);\n --color-blue-2: var(--blue-2);\n --color-light-blue: var(--light-blue);\n --color-primary-100: var(--primary-100);\n --color-primary-300: var(--primary-300);\n --color-black-2: var(--black-2);\n --color-primary-button: var(--primary-button);\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: #f3f4f6;\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-zinc-500: oklch(55.2% 0.016 285.938);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n /* rounded */\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: 12px;\n --radius-xl: calc(var(--radius) + 4px);\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n /* spacing */\n --spacing-layout-w: var(--layout-w);\n --spacing-layout-h: var(--layout-h);\n --spacing: 0.25rem;\n /* size */\n --container-md: 28rem;\n --container-xl: 36rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n\n --tracking-tight: -0.025em;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n\n .no-scrollbar::-webkit-scrollbar {\n display: none;\n }\n a,\n p,\n textarea,\n button,\n span,\n h1,\n h2,\n h3,\n h4,\n h5,\n div {\n font-family: 'Lato', sans-serif;\n }\n /* Hide scrollbar for IE, Edge and Firefox */\n .no-scrollbar {\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n }\n .shadow-inner-right {\n box-shadow: inset -9px 0 6px -1px rgb(0 0 0 / 0.02);\n }\n .shadow-inner-left {\n box-shadow: inset 9px 0 6px -1px rgb(0 0 0 / 0.02);\n }\n .annotation {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-normal);\n }\n .annotation-semi {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-semibold);\n }\n .annotation-bold {\n font-size: var(--text-3xs);\n font-weight: var(--font-weight-semibold);\n }\n .info {\n font-size: var(--text-2xs);\n font-weight: var(--font-weight-normal);\n }\n .info-semi {\n font-size: var(--text-2s);\n font-weight: var(--font-weight-semibold);\n }\n .info-bold {\n font-size: var(--text-2s);\n font-weight: var(--font-weight-semibold);\n }\n .text-p-xs {\n font-size: var(--text-xs) !important;\n font-weight: var(--font-weight-normal);\n line-height: var(--text-xs--line-height);\n letter-spacing: var(--text-xs--letter-spacing);\n }\n .text-p {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-normal);\n letter-spacing: var(--text-sm--letter-spacing);\n }\n .text-p-semi {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-semibold);\n }\n .text-p-bold {\n font-size: var(--text-sm);\n font-weight: var(--font-weight-semibold);\n }\n .omniscribe_shadow-xl {\n box-shadow:\n 0 20px 25px -5px rgb(0 0 0 / 0.1),\n 0 8px 10px -6px rgb(0 0 0 / 0.1);\n }\n .scrollbar-pretty {\n &::-webkit-scrollbar {\n width: 6px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 10px;\n background-color: var(--omni-secondary);\n }\n &::-webkit-scrollbar-track {\n background-color: transparent;\n }\n }\n\n .omniscribe_visible {\n visibility: visible;\n display: flex;\n flex: 1;\n }\n .omniscribe_hidden {\n display: none;\n height: 0;\n }\n\n .omniscribe_animate-spin {\n animation: spin 1s linear infinite;\n }\n}\n\n\n/* Source: modules/chat/components/AudioCutsWarningDialog.css */\n/* The shared Modal overlay uses position: absolute anchored to its\n nearest positioned ancestor — which in our case is the chat footer,\n not the widget root. That puts the modal at the bottom of the widget.\n Override to position: fixed so the overlay covers the full viewport\n and the modal truly centers regardless of where in the React tree it\n was rendered. */\n.omniscribe_modal-overlay:has(.omniscribe_audio-cuts-modal) {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.omniscribe_audio-cuts-modal {\n width: 480px;\n max-width: 90vw;\n padding: 24px !important;\n}\n\n/* Override Modal's giant default h2 size for this dialog. */\n.omniscribe_audio-cuts-modal .omniscribe_modal-title-container {\n margin-bottom: 16px;\n align-items: flex-start;\n}\n\n.omniscribe_audio-cuts-modal .omniscribe_modal-title {\n font-size: 18px;\n line-height: 1.3;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_audio-cuts-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Summary card: warning icon + paragraph in a soft container. */\n.omniscribe_audio-cuts-summary {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.omniscribe_audio-cuts-summary-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 9999px;\n background-color: #fef3c7;\n color: #b45309;\n}\n\n.omniscribe_audio-cuts-summary-text {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--color-gray-800, #1f2937);\n flex: 1;\n}\n\n/* Cut list: rounded gray container, clock icon per row, no bullets. */\n.omniscribe_audio-cuts-list {\n margin: 0;\n padding: 12px 14px;\n border-radius: 12px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--color-gray-200, #e5e7eb);\n list-style: none;\n max-height: 240px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_audio-cuts-item {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--omniscribe-text-muted, #374151);\n font-variant-numeric: tabular-nums;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.omniscribe_audio-cuts-item-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--omniscribe-text-muted, #6b7280);\n}\n\n/* Action row: right-aligned, secondary as text-link, primary as blue pill. */\n.omniscribe_audio-cuts-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 16px;\n margin-top: 4px;\n}\n\n.omniscribe_audio-cuts-secondary {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #374151);\n border-radius: 9999px;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_audio-cuts-secondary:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_audio-cuts-primary {\n border-radius: 9999px !important;\n gap: 8px;\n padding-block: 10px !important;\n padding-inline: 18px !important;\n height: auto !important;\n font-weight: 600;\n}\n\n\n/* Source: modules/chat/components/ChatView.css */\n.omniscribe_chat-view-container {\n flex: 1;\n border-style: none;\n display: flex;\n overflow: hidden;\n background: transparent;\n bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n margin-block: calc(var(--spacing) * 0) /* 0rem = 0px */;\n right: 20px;\n border-bottom-left-radius: 12px;\n width: 100%;\n}\n\n.omniscribe_chat-view-container-history-cont {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 0;\n z-index: 30;\n height: 100%;\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n display: block;\n border-top-left-radius: 12px;\n border-bottom-left-radius: 12px;\n overflow: hidden;\n background-color: var(--omniscribe-surface, white);\n transition:\n width 300ms cubic-bezier(0.4, 0, 0.2, 1),\n min-width 300ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.omniscribe_chat-view-container-history-cont-open {\n width: 33%;\n}\n\n/* Overlay that covers the chat when history is open */\n.omniscribe_chat-view-overlay {\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n z-index: 25;\n opacity: 0;\n pointer-events: none;\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n border-radius: 12px;\n}\n\n.omniscribe_chat-view-overlay-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.omniscribe_chat-view-content-container {\n display: flex;\n flex: 1;\n width: 100%;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n border-bottom-right-radius: 12px;\n}\n\n.omniscribe_chat-view-stick-to-bottom {\n font-size: 14px;\n}\n.omniscribe_chat-view-stick-to-bottom-content {\n position: absolute;\n inset: 0;\n overflow-y: scroll;\n overflow-x: hidden;\n display: grid;\n grid-template-rows: 1fr auto;\n}\n\n/* Disable scroll when SummaryLoading is shown */\n.omniscribe_chat-view-stick-to-bottom-content--no-scroll {\n overflow-y: hidden;\n}\n\n.omniscribe_chat-view-stick-to-bottom-content-class {\n padding-bottom: calc(var(--spacing) * 13);\n display: flex;\n flex-direction: column;\n padding-left: calc(var(--spacing) * 4);\n padding-right: calc(var(--spacing) * 4);\n min-width: 0;\n padding-top: 12px;\n}\n\n.omniscribe_chat-view-footer-container {\n position: sticky;\n display: flex;\n background-color: var(--omniscribe-surface, white);\n flex-direction: column;\n align-items: center;\n bottom: 0;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n/*\n * The footer is sticky inside the scroll container, so mid-scroll the\n * conversation passes behind it and was cut off mid-line — text simply ended\n * where the buttons began. This is not a spacing problem: at rest the content\n * clears the footer. What was missing is a boundary, so the last visible line\n * dissolves into the footer's surface instead of being guillotined by it.\n */\n.omniscribe_chat-view-footer-container::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 100%;\n /*\n * Tall enough to dissolve two or three lines. A short band is worse than no\n * band at all: at one line-height it ghosts a single row of text and reads as\n * a rendering fault rather than a transition.\n */\n height: 64px;\n pointer-events: none;\n /* Fallback first: browsers without color-mix keep this. */\n background: linear-gradient(\n to bottom,\n transparent,\n var(--omniscribe-surface, #fff)\n );\n /*\n * Fading to `transparent` interpolates through transparent BLACK, which\n * greys the middle of the band. Fading from the surface colour at zero alpha\n * keeps it clean and still themable.\n */\n background: linear-gradient(\n to bottom,\n color-mix(in srgb, var(--omniscribe-surface, #fff) 0%, transparent) 0%,\n var(--omniscribe-surface, #fff) 100%\n );\n}\n\n/*\n * Floats over the conversation, so it needs to be opaque. It inherited the\n * outline button's translucent fill, which let the text underneath read\n * straight through it — the label and the message competing in the same\n * pixels. A solid fill plus a shadow is what makes it read as a control\n * sitting above the content rather than printed onto it.\n */\n/*\n * Pinned to the footer's top edge, not to the viewport.\n *\n * It used to be `position: fixed; bottom: 17%`, i.e. anchored to the browser\n * window: its distance from the composer depended on the window height, and at\n * common sizes it landed ON the action buttons — measured 3px below the\n * footer's top edge. Anchoring to the footer instead means it tracks whatever\n * the footer currently is: with or without the action row, with the\n * transcription panel expanded, with files attached.\n */\n.omniscribe_chat-view-footer-scroll-to-bottom {\n position: absolute;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n z-index: 2;\n}\n\n/*\n * Qualified with `.omniscribe_button` on purpose. The outline variant sets the\n * same properties at equal specificity and `button.css` is concatenated after\n * this file, so a single-class selector here loses on source order alone.\n */\n.omniscribe_button.omniscribe_chat-view-footer-scroll-to-bottom {\n background-color: var(--omniscribe-surface, #fff);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n box-shadow: 0 2px 10px rgba(16, 23, 37, 0.16);\n}\n\n.omniscribe_button.omniscribe_chat-view-footer-scroll-to-bottom:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_chat-view-down-btn {\n width: calc(0.25rem /* 4px */ * 4);\n height: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Combined Footer - Frame 532 Design */\n.omniscribe_chat-view-combined-footer {\n width: 100%;\n padding-bottom: 12px;\n background-color: var(--omniscribe-surface, white);\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n position: relative;\n}\n\n/* Action row — no background of its own; only the pills carry a border */\n.omniscribe_chat-footer-actions-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding-inline: calc(var(--spacing) * 4);\n padding-bottom: 8px;\n flex-shrink: 0;\n min-width: 0;\n width: 100%;\n box-sizing: border-box;\n transition: padding-top 0.5s ease;\n}\n\n/* With the transcription expanded, keeps the buttons off the panel's bottom\n line (the expanded wrapper's border-bottom). */\n.omniscribe_transcription-panel-wrapper--expanded\n + .omniscribe_chat-footer-actions-row {\n padding-top: 10px;\n}\n\n.omniscribe_chat-view-combined-footer-row {\n display: flex;\n flex-direction: row;\n align-items: end;\n box-sizing: border-box;\n width: 100%;\n gap: 8px;\n flex-shrink: 0;\n background-color: var(--omniscribe-surface, white);\n overflow: hidden;\n padding-inline: calc(var(--spacing) * 4);\n padding-top: 7px;\n}\n\n/* Frame 34 - Input container */\n.omniscribe_chat-view-combined-input-container {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n padding: 8px;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 20px;\n background-color: var(--omniscribe-surface, white);\n gap: 0;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n box-sizing: border-box;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25);\n margin-bottom: 7px;\n margin-right: 1px;\n}\n\n/* When files are attached, change border-radius to rounded rectangle */\n/*\n * Attaching a file must not resize the composer. There is deliberately no\n * max-width here: the base rule is `flex: 1`, and capping it made the composer\n * jump from the full footer width down to a fixed size the moment a file was\n * added — a leftover from a narrower Figma frame, and the only place that\n * number appeared. Several files scroll horizontally inside\n * `.omniscribe_chat-view-combined-files-row`, which owns `overflow-x: auto`.\n */\n.omniscribe_chat-view-combined-input-container--with-files {\n gap: 12px;\n align-items: flex-start;\n min-width: 0;\n overflow: hidden;\n}\n\n/* Files row inside input container - horizontal scroll, no wrapping */\n.omniscribe_chat-view-combined-files-row {\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n gap: 8px;\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n padding-bottom: 4px;\n scrollbar-width: thin;\n min-width: 0;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar {\n height: 4px;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.omniscribe_chat-view-combined-files-row::-webkit-scrollbar-thumb {\n background-color: var(--color-gray-300, #d1d5db);\n border-radius: 4px;\n}\n\n/* Input row with clip icon, textarea, and action button */\n.omniscribe_chat-view-combined-input-row {\n display: flex;\n align-items: center;\n width: 100%;\n gap: 4px;\n}\n\n/* Clip icon */\n.omniscribe_chat-view-combined-clip-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n height: 24px;\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, white);\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: solid 1px var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_chat-view-combined-clip-icon:hover {\n background-color: var(--omniscribe-surface-alt, #e5e7eb);\n color: var(--color-gray-600);\n}\n\n/* Action button inside input */\n.omniscribe_chat-view-combined-action-btn {\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-textarea {\n flex: 1;\n resize: none;\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n min-height: 20px;\n max-height: 56px;\n font-weight: 500 !important;\n padding: 0 !important;\n background: transparent;\n color: var(--omniscribe-text-muted, #4a5364);\n height: 20px;\n}\n\n.omniscribe_chat-view-combined-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n}\n\n.omniscribe_chat-view-combined-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n border-radius: 9999px;\n background-color: var(--secondary, #132caa);\n color: white;\n cursor: pointer;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_chat-view-combined-send-btn:hover:not(:disabled) {\n background-color: var(--secondary-hover, #2847e7);\n}\n\n.omniscribe_chat-view-combined-send-btn:disabled {\n background-color: var(--omniscribe-surface-alt, #dfe2e7);\n cursor: not-allowed;\n}\n\n/* Stop button - red variant of send button */\n.omniscribe_chat-view-combined-stop-btn {\n background-color: var(--secondary, #132caa);\n}\n\n.omniscribe_chat-view-combined-stop-btn:hover {\n background-color: var(--secondary, #132caa);\n}\n\n/* Drag-and-drop overlay */\n.omniscribe_chat-view-drag-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(37, 99, 235, 0.05);\n border: 2px dashed var(--blue-600, #2563eb);\n border-radius: var(--radius);\n z-index: 10;\n pointer-events: none;\n}\n\n.omniscribe_chat-view-drag-overlay-text {\n color: var(--blue-600, #2563eb);\n font-size: var(--text-sm);\n font-weight: var(--font-weight-medium);\n}\n\n\n/* Source: modules/chat/components/FileLimitBanner.css */\n/* File Limit Banner */\n.omniscribe_file-limit-banner {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n background-color: #dc2626;\n color: white;\n border-radius: 12px;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);\n animation:\n slideInFromTop 0.3s ease-out,\n slideOutToTop 0.3s ease-in 4.7s;\n animation-fill-mode: forwards;\n width: auto;\n max-width: 90vw;\n padding: 0;\n margin: 0 auto;\n}\n\n.omniscribe_file-limit-banner-content {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 20px;\n gap: 12px;\n white-space: nowrap;\n}\n\n.omniscribe_file-limit-banner-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: white;\n}\n\n.omniscribe_file-limit-banner-message {\n font-size: 14px;\n font-weight: 500;\n line-height: 1.4;\n text-align: center;\n}\n\n.omniscribe_file-limit-banner-close {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.omniscribe_file-limit-banner-close:hover {\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n.omniscribe_file-limit-banner-close svg {\n width: 16px;\n height: 16px;\n}\n\n/* Animations */\n@keyframes slideInFromTop {\n 0% {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n 100% {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n@keyframes slideOutToTop {\n 0% {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n 100% {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n}\n\n\n/* Source: modules/chat/components/PredefinedQuestions.css */\n.omniscribe_predefined-questions-container {\n margin-top: calc(var(--spacing) * 2) /* 1rem = 16px */;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n display: flex;\n flex-direction: column;\n}\n.omniscribe_predefined-questions-span {\n color: var(--omniscribe-text, #13161a);\n line-height: 21.6px;\n font-size: 18px !important;\n font-weight: 500 !important;\n}\n\n.omniscribe_predefined-title {\n margin-bottom: 8px;\n word-break: break-word;\n}\n\n.omniscribe_predefined-questions-msg-container {\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n word-break: break-word;\n}\n\n.omniscribe_predefined-questions-content {\n background-color: var(--background-primary, #e7effd) !important;\n color: var(--primary, #105bdb) !important;\n border-radius: 999px !important;\n text-align: left;\n padding-top: 4px;\n padding-right: 16px;\n padding-bottom: 4px;\n padding-left: 16px;\n width: fit-content;\n height: fit-content;\n}\n\n\n/* Source: modules/chat/components/SummaryLoading.css */\n/* Auto-summary loading styles */\n.omniscribe_auto-summary-container {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n padding-top: calc(var(--spacing) * 13);\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.omniscribe_auto-summary-text {\n font-size: 18px;\n text-align: center;\n margin-bottom: 20px;\n font-weight: 500;\n color: var(--omniscribe-text, #2b303a);\n}\n\n.omniscribe_auto-summary-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Loading dots animation */\n.omniscribe_loading-dots {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_loading-dots::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n}\n\n.omniscribe_loading-dots::before {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n animation-delay: -0.16s;\n margin-right: 4px;\n}\n\n.omniscribe_loading-dots span {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-dot-flashing 1.4s infinite linear;\n animation-delay: -0.32s;\n margin-right: 4px;\n}\n\n@keyframes omniscribe-dot-flashing {\n 0%,\n 80%,\n 100% {\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n}\n\n\n/* Source: modules/chat/components/history/ChatHistory.css */\n.omniscribe_thread-list-container {\n width: 100%;\n height: 100%;\n overflow-y: scroll;\n overflow-x: hidden;\n padding-inline: calc(var(--spacing) * 1);\n margin: 8px;\n}\n\n.omniscribe_thread-list-content {\n padding-bottom: calc(var(--spacing) * 16);\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.omniscribe_thread-list-item {\n width: 100%;\n padding-inline: 0;\n}\n\n.omniscribe_thread-list-btn {\n text-align: left;\n align-items: center !important;\n justify-content: flex-start !important;\n width: calc(100% - var(--spacing) * 4);\n border-radius: 4px !important;\n margin-bottom: 4px;\n font-weight: var(--font-weight-normal);\n padding-inline: calc(var(--spacing) * 1) !important;\n}\n\n.omniscribe_thread-list-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--omniscribe-text, #252a32);\n font-size: var(--Font-Size-font-size-100, 12px);\n font-style: normal;\n font-weight: var(--Font-Weight-Regular, 400);\n line-height: var(--Font-Line-Height-line-height-100, 14.4px);\n /* 120% */\n letter-spacing: var(--Font-Letter-Spacing-letter-spacing-100, 0.05px);\n}\n\n.omniscribe_thread-history-loading {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n align-items: flex-start;\n justify-content: flex-start;\n overflow-y: scroll;\n overflow-x: hidden;\n padding-inline: calc(var(--spacing) * 1);\n}\n\n.omniscribe_thread-history-loading-skeleton {\n width: 100%;\n height: calc(var(--spacing) * 10);\n}\n\n.omniscribe_thread-history-container {\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--omniscribe-border, #e5e7ec);\n align-items: flex-start;\n justify-content: flex-start;\n /* gap: calc(var(--spacing) * 6); */\n height: 100%;\n flex-shrink: 0;\n}\n\n.omniscribe_thread-history-header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 16px;\n background: var(--omniscribe-surface, white);\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_thread-history-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n border: none;\n background: none;\n cursor: pointer;\n padding: 0;\n}\n\n.omniscribe_thread-history-header-title {\n margin: 0;\n color: var(--omniscribe-text, #252a32);\n font-size: 14px;\n font-weight: 500;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n}\n\n.omniscribe_thread-history-new-chat-btn {\n margin: 12px 0 0 12px;\n border-radius: 8px;\n gap: 4px;\n padding-block: 4px;\n}\n\n.omniscribe_thread-history-new-chat-btn:hover:not(:disabled) {\n background-color: #0f2080;\n}\n\n.omniscribe_thread-history-new-chat-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_thread-history-chat-started-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-inline: calc(var(--spacing) * 2);\n padding-block: calc(var(--spacing) * 1);\n background-color: color-mix(in oklab, var(--blue) 40%, transparent);\n width: stretch;\n width: -moz-available;\n width: -webkit-fill-available;\n width: fill-available;\n box-shadow:\n inset 0 2px 4px rgb(0 0 0 / 0.05),\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.omniscribe_thread-history-no-chat-started-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-inline: calc(var(--spacing) * 2);\n width: 100%;\n}\n\n.omniscribe_thread-history-chat-started-btn {\n border: none;\n background: transparent;\n padding: 0px;\n display: flex;\n flex-direction: row;\n gap: calc(var(--spacing) * 2);\n align-items: center;\n cursor: pointer;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 300ms;\n}\n\n.omniscribe_thread-history-chat-started-btn-text {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-tight);\n}\n\n.omniscribe_thread-tooltip {\n padding: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Processing thread indicator */\n.omniscribe_thread-list-btn.omniscribe_thread-processing {\n position: relative;\n}\n\n.omniscribe_thread-list-btn.omniscribe_thread-processing::before {\n content: '';\n position: absolute;\n left: 4px;\n top: 50%;\n transform: translateY(-50%);\n width: 6px;\n height: 6px;\n background: var(--secondary, #132caa);\n border-radius: 50%;\n animation: omniscribe_pulse 1.5s infinite;\n}\n\n.omniscribe_thread-list-btn.omniscribe_thread-processing\n .omniscribe_thread-list-text {\n padding-left: 12px;\n}\n\n@keyframes omniscribe_pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n}\n\n\n/* Source: modules/chat/components/input/AudioBars.css */\n/* Granola-style animated audio bars: 3 rounded bars (short / tall / medium).\n Accent-colored and \"dancing\" while recording, muted and static otherwise. */\n.omniscribe_audio-bars {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 3px;\n}\n\n.omniscribe_audio-bar {\n width: 3.5px;\n background-color: var(--omniscribe-primary, #1a73e8);\n border-radius: 9999px;\n transition:\n height 0.15s ease,\n background-color 0.2s ease;\n}\n\n/* Muted gray when not recording */\n.omniscribe_audio-bar--inactive {\n background-color: var(--grey-700, #9ca3af);\n}\n\n/* Live mode — heights are driven per-frame from the mic level, so use a\n short linear transition that dampens the movement without lagging it */\n.omniscribe_audio-bar--live {\n transition:\n height 0.08s linear,\n background-color 0.2s ease;\n}\n\n/* Static heights: short / tall / medium (Granola pattern) */\n.omniscribe_audio-bar--1 {\n height: 50%;\n}\n\n.omniscribe_audio-bar--2 {\n height: 100%;\n}\n\n.omniscribe_audio-bar--3 {\n height: 65%;\n}\n\n/* Dancing equalizer animation while recording */\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--1 {\n animation: omniscribe-audio-dance-1 0.9s ease-in-out infinite;\n}\n\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--2 {\n animation: omniscribe-audio-dance-2 1.1s ease-in-out infinite;\n}\n\n.omniscribe_audio-bar--animating.omniscribe_audio-bar--3 {\n animation: omniscribe-audio-dance-3 1s ease-in-out infinite;\n}\n\n/* The dance is decorative — it runs while connecting, when there is no stream\n to visualise yet. The --live bars are deliberately left out: those track\n real microphone input, so they are information, not decoration. */\n@media (prefers-reduced-motion: reduce) {\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--1,\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--2,\n .omniscribe_audio-bar--animating.omniscribe_audio-bar--3 {\n animation: none;\n }\n}\n\n@keyframes omniscribe-audio-dance-1 {\n 0%,\n 100% {\n height: 50%;\n }\n 25% {\n height: 85%;\n }\n 50% {\n height: 35%;\n }\n 75% {\n height: 70%;\n }\n}\n\n@keyframes omniscribe-audio-dance-2 {\n 0%,\n 100% {\n height: 100%;\n }\n 30% {\n height: 55%;\n }\n 60% {\n height: 90%;\n }\n 80% {\n height: 65%;\n }\n}\n\n@keyframes omniscribe-audio-dance-3 {\n 0%,\n 100% {\n height: 65%;\n }\n 20% {\n height: 95%;\n }\n 55% {\n height: 45%;\n }\n 85% {\n height: 80%;\n }\n}\n\n\n/* Source: modules/chat/components/input/ExtrasButtons.css */\n/*\n * Category names come from the host's templateExtras schema, so their length is\n * not ours to control. Left unbounded, one long name grew its pill until it\n * pushed the overflow trigger — and with it every remaining category — off the\n * right edge of the widget, with no way to reach them.\n *\n * The row cannot simply clip: the overflow menu is absolutely positioned and\n * opens upwards, so `overflow: hidden` on the row would cut the menu instead.\n * The pills give up the space themselves: they are the only shrinkable items in\n * the row, capped, and their label truncates.\n */\n/* Qualified: `.omniscribe_action-btn` is shared with the generate button and\n lives in another file, so an unqualified rule here would depend on which\n stylesheet the bundler concatenates last. */\n.omniscribe_action-btn.omniscribe_extras-btn {\n min-width: 0;\n max-width: 180px;\n flex-shrink: 1;\n}\n\n.omniscribe_extras-btn-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Overflow container for extras categories beyond the first two. */\n.omniscribe_extras-overflow {\n position: relative;\n display: inline-flex;\n /* Never squeezed out: it is the only route to the remaining categories. */\n flex-shrink: 0;\n}\n\n/* Three-dots trigger — mirrors the neutral pill styling of the action row. */\n.omniscribe_extras-overflow-trigger {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, #ffffff);\n color: var(--grey-700, #6f7d95);\n cursor: pointer;\n transition:\n background-color 0.2s ease,\n color 0.2s ease,\n border-color 0.2s ease;\n}\n\n.omniscribe_extras-overflow-trigger:hover,\n.omniscribe_extras-overflow-trigger--open {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #13161a);\n}\n\n/* Dropdown floats UP above the trigger (footer sits at the bottom), with a\n gap so it doesn't sit flush against the action buttons row. */\n.omniscribe_extras-overflow-menu {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n z-index: 20;\n min-width: 160px;\n padding: 4px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: var(--radius-lg, 12px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n}\n\n.omniscribe_extras-overflow-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 10px;\n border: none;\n border-radius: 8px;\n background-color: transparent;\n color: var(--omniscribe-text, #13161a);\n text-align: left;\n white-space: nowrap;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_extras-overflow-item:hover:not(:disabled) {\n background-color: var(--omniscribe-primary-soft, #e8f0fe);\n color: var(--omniscribe-primary, #1a73e8);\n}\n\n.omniscribe_extras-overflow-item:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n\n/* Source: modules/chat/components/input/FilePreview.css */\n/* File Preview Container - Figma Frame 532 */\n.omniscribe_file-preview-container {\n display: contents;\n}\n\n.omniscribe_file-preview-container-history-open {\n width: 372px;\n}\n\n/* Custom scrollbar */\n.omniscribe_file-preview-container::-webkit-scrollbar {\n height: 6px;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-thumb {\n background-color: #d1d5db;\n border-radius: 3px;\n}\n\n.omniscribe_file-preview-container::-webkit-scrollbar-thumb:hover {\n background-color: #9ca3af;\n}\n\n/* Individual image thumbnail */\n.omniscribe_file-preview-image {\n position: relative;\n width: 80px;\n height: 80px;\n border-radius: 12px;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.omniscribe_file-preview-image-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n}\n\n.omniscribe_file-preview-image-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n border-radius: 12px;\n}\n\n/* Document card */\n/* Document card - matches Figma design */\n.omniscribe_file-preview-document {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background-color: var(--omniscribe-surface, white);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 16px;\n position: relative;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n flex-shrink: 0;\n max-height: 38px;\n}\n\n.omniscribe_file-preview-document-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 46px;\n height: 46px;\n background-color: #dc3545;\n border-radius: var(--radius-lg, 12px);\n flex-shrink: 0;\n}\n\n.omniscribe_file-preview-document-icon svg {\n color: white;\n}\n\n.omniscribe_file-preview-document-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n padding-right: 16px;\n}\n\n.omniscribe_file-preview-document-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--grey-900);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 180px;\n}\n\n.omniscribe_file-preview-document-type {\n font-size: 12px;\n color: var(--grey-700);\n font-weight: 500;\n}\n\n/* Individual image thumbnail - larger size matching Figma */\n.omniscribe_file-preview-image {\n position: relative;\n width: 64px;\n height: 64px;\n border-radius: 16px;\n background-color: #1a1a2e;\n flex-shrink: 0;\n /* overflow: visible to allow X button to show outside bounds */\n}\n\n.omniscribe_file-preview-image-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 16px;\n /* Apply overflow hidden to the image itself */\n overflow: hidden;\n}\n\n.omniscribe_file-preview-image-placeholder {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface-alt, #e8edf5);\n border-radius: 16px;\n}\n\n/* Remove button - blue circle with X - positioned inside bounds */\n.omniscribe_file-preview-remove-btn {\n position: absolute;\n top: 4px;\n right: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 50%;\n background-color: var(--blue-600, #2563eb);\n color: white;\n cursor: pointer;\n padding: 0;\n transition: background-color 0.2s ease;\n z-index: 2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.omniscribe_file-preview-remove-btn:hover {\n background-color: var(--blue-700, #1d4ed8);\n}\n\n.omniscribe_file-preview-remove-btn--image {\n top: 4px;\n right: 4px;\n width: 20px;\n height: 20px;\n}\n\n\n/* Source: modules/chat/components/input/MicrophoneButton.css */\n/* Microphone Button Styles */\n.microphone-button {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 24px !important;\n height: 24px !important;\n min-width: 24px !important;\n min-height: 24px !important;\n padding: 0 !important;\n border-radius: 9999px !important;\n border: none !important;\n background-color: var(--omniscribe-surface-alt, #f3f4f6) !important;\n box-shadow: none !important;\n transition: background-color 0.2s ease !important;\n flex-shrink: 0;\n}\n\n.microphone-button:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #e5e7eb) !important;\n}\n\n.microphone-button--recording {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n background-color: #fee2e2 !important;\n}\n\n/* Pulse animation for recording state */\n@keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n\n/* Source: modules/chat/components/input/TranscribeDropdown.css */\n/* Ensure tooltip trigger properly wraps the button in flex context */\n.omniscribe_thread-combined-footer-row > .tooltip-trigger {\n display: flex;\n flex-shrink: 0;\n}\n\n/* Granola-style transcribe pill: [bars chevron] ··· [stop square | text]\n A single flat capsule — no nested containers, no shadow, and its chrome\n stays constant across idle/recording/paused (only the bars change). */\n.omniscribe_transcribe-dropdown {\n display: flex;\n align-items: center;\n gap: 18px;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: var(--omniscribe-surface, white);\n transition:\n background-color 0.15s ease,\n border-color 0.15s ease;\n font-size: var(--font-size-100, 13px);\n font-weight: 500;\n color: var(--omniscribe-text, #1f2937);\n white-space: nowrap;\n overflow: hidden;\n flex-shrink: 0;\n padding: 10px 18px;\n}\n\n.omniscribe_transcribe-dropdown:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--omniscribe-surface-alt, #fafafa);\n border-color: var(--color-gray-300, #d1d5db);\n}\n\n/* Left group: bars + chevron sit flat inside the capsule (no inner pill) */\n.omniscribe_transcribe-controls-group {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Bars & chevron buttons — chromeless icon buttons */\n.omniscribe_transcribe-bars-button,\n.omniscribe_transcribe-chevron-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n.omniscribe_transcribe-bars-button:disabled,\n.omniscribe_transcribe-chevron-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: plain accent text control (Granola's \"Resume\") — no chrome */\n.omniscribe_transcribe-text-button {\n display: flex;\n align-items: center;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n font-size: inherit;\n font-weight: 500;\n color: var(--omniscribe-primary, #1a73e8);\n}\n\n.omniscribe_transcribe-text-button:hover:not(:disabled) {\n color: var(--blue-700, #1558d6);\n}\n\n.omniscribe_transcribe-text-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: play triangle shown when idle/paused — no chrome, accent color */\n.omniscribe_transcribe-play-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--omniscribe-primary, #1a73e8);\n transition: color 0.15s ease;\n}\n\n.omniscribe_transcribe-play-button:hover:not(:disabled) {\n color: var(--blue-700, #1558d6);\n}\n\n.omniscribe_transcribe-play-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Right: filled rounded stop square shown while recording — no chrome */\n.omniscribe_transcribe-stop-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--omniscribe-text-muted, #5f6368);\n transition: color 0.15s ease;\n}\n\n.omniscribe_transcribe-stop-button:hover:not(:disabled) {\n color: var(--omniscribe-text, #1f2937);\n}\n\n.omniscribe_transcribe-stop-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.omniscribe_transcribe-dropdown--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-dropdown-label {\n text-align: left;\n white-space: nowrap;\n}\n\n/* Chevron points up (panel closed) and rotates to down when expanded */\n.omniscribe_transcribe-dropdown-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition:\n transform 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcribe-dropdown-chevron--expanded {\n transform: rotate(180deg);\n}\n\n.omniscribe_transcribe-dropdown:hover .omniscribe_transcribe-dropdown-chevron {\n color: var(--omniscribe-text, #374151);\n}\n\n/* Connection status pill - inline banner replacing toasts.\n Three states: reconnecting (neutral), disconnected (red), restored (dark). */\n.omniscribe_connection-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 9999px;\n white-space: nowrap;\n flex-shrink: 0;\n font-weight: 500;\n margin-inline: 8px;\n}\n\n.omniscribe_connection-pill-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_connection-pill-icon--spin {\n animation: omniscribe-connection-spin 1s linear infinite;\n}\n\n@keyframes omniscribe-connection-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.omniscribe_connection-pill--reconnecting {\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--color-gray-200, #e5e7eb);\n color: var(--omniscribe-text-muted, #374151);\n}\n\n.omniscribe_connection-pill--disconnected {\n background-color: #fdecec;\n border: 1px solid #f8c7c7;\n color: #b42318;\n padding-right: 4px;\n}\n\n.omniscribe_connection-pill--restored {\n background-color: #1f2937;\n border: 1px solid #1f2937;\n color: #ffffff;\n}\n\n.omniscribe_connection-pill-retry {\n border-radius: 9999px !important;\n gap: 4px;\n padding-block: 3px !important;\n padding-inline: 8px !important;\n height: auto !important;\n background-color: #d92d20 !important;\n color: #ffffff !important;\n border: none !important;\n margin-left: 2px;\n}\n\n.omniscribe_connection-pill-retry:hover:not(:disabled) {\n background-color: #b42318 !important;\n}\n\n/* Action buttons - unified style for Generate, Petitions, Extras */\n.omniscribe_action-btn {\n /* Fixed-label actions keep their size; only the extras pills, whose labels\n are host-defined and can be arbitrarily long, give up space. */\n flex-shrink: 0;\n border-radius: 9999px !important;\n gap: 6px;\n padding-block: 6px !important;\n padding-inline: 12px !important;\n /* Match height of controls-group (border + padding + content) */\n min-height: 32px !important;\n font-size: var(--font-size-100, 13px) !important;\n font-weight: 500 !important;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08) !important;\n transition: all 0.15s ease !important;\n display: inline-flex !important;\n align-items: center !important;\n}\n\n.omniscribe_action-btn:hover:not(:disabled) {\n background-color: var(--blue-700, #1558d6) !important;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12) !important;\n}\n\n.omniscribe_action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Collapsed state - vertical pill with light theme */\n.omniscribe_transcribe-collapsed {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: var(--omniscribe-surface, white);\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Passive activity indicator — live bars while recording */\n.omniscribe_transcribe-collapsed-bars {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n}\n\n.omniscribe_transcribe-collapsed-play {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 50%;\n background-color: transparent;\n color: var(--omniscribe-primary, #1a73e8);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-play:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n transform: scale(1.05);\n}\n\n.omniscribe_transcribe-collapsed-play:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-collapsed-play--recording {\n box-shadow: 0 0 8px rgba(26, 115, 232, 0.2);\n}\n\n.omniscribe_transcribe-collapsed-expand {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n background-color: transparent;\n color: var(--omniscribe-text-muted, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-expand:hover:not(:disabled) {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #374151);\n}\n\n\n/* Source: modules/chat/components/input/TranscriptionPanel.css */\n/* Expand/collapse wrapper — absolutely positioned upwards so it does NOT\n push the actions row or the form. Being out of the flow, animating the\n height causes no footer reflow: the panel unfolds upwards (same\n animation as the previous version). */\n.omniscribe_transcription-panel-wrapper {\n position: absolute;\n bottom: 100%;\n left: 0;\n right: 0;\n height: 0;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n transition:\n height 0.5s ease,\n opacity 0.5s ease;\n}\n\n.omniscribe_transcription-panel-wrapper--expanded {\n height: calc(var(--content-height) * 0.55);\n opacity: 1;\n pointer-events: auto;\n border-bottom: 1px solid var(--border, #e5e7eb);\n}\n\n/* TranscriptionPanel - Frame 655 from Figma */\n.omniscribe_transcription-panel {\n width: 100%;\n height: 100%;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--border, #e5e7eb);\n border-top-left-radius: var(--radius-lg, 12px);\n border-top-right-radius: var(--radius-lg, 12px);\n overflow: hidden;\n margin-bottom: 8px;\n display: flex;\n flex-direction: column;\n}\n\n/* Header with action buttons */\n.omniscribe_transcription-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--border);\n}\n\n.omniscribe_transcription-panel-header-section {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_transcription-panel-actions {\n display: flex;\n align-items: center;\n gap: 1px;\n margin-right: 2px;\n}\n\n.omniscribe_transcription-panel-action-btn {\n width: 100%;\n height: auto;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcription-panel-close {\n border-radius: 9999px;\n border: none;\n padding-inline: 5px !important;\n padding-block: 2.5px !important;\n margin-block: 5.5px;\n transition:\n background-color 0.2s ease,\n color 0.2s ease;\n}\n\n.omniscribe_transcription-panel-close:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-600, #4b5563);\n}\n\n/* Body container */\n.omniscribe_transcription-panel-body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 150px;\n overflow: hidden;\n}\n\n/* Idle state - white background with blue text */\n.omniscribe_transcription-panel-idle {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n gap: 16px;\n padding: 24px;\n}\n\n.omniscribe_transcription-panel-idle-text {\n font-size: 16px;\n font-weight: 500;\n color: var(--color-primary, #2563eb);\n text-align: center;\n margin: 0;\n}\n\n.omniscribe_transcription-panel-play-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 9999px;\n background-color: var(--omniscribe-primary-soft, #e7effd);\n cursor: pointer;\n transition:\n transform 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.omniscribe_transcription-panel-play-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.omniscribe_transcription-panel-play-btn svg {\n color: var(--omniscribe-primary, #2563eb);\n}\n\n/* Content state - transcription display */\n.omniscribe_transcription-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n max-height: 220px;\n}\n\n.omniscribe_transcription-panel-message {\n margin-bottom: 8px;\n text-align: left;\n width: fit-content;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n padding: 4px;\n border-radius: 8px;\n color: var(--omniscribe-text, #13161a);\n line-height: 1.7 !important;\n}\n\n/* Audio-loss divider rendered between segments where a recording cut\n occurred. Visually separates captured speech from the gap so the doctor\n can spot lost portions while reviewing the transcription. */\n.omniscribe_transcription-panel-cut {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-block: 10px;\n padding-inline: 4px;\n}\n\n.omniscribe_transcription-panel-cut-line {\n flex: 1;\n height: 1px;\n background-color: #fed7aa;\n}\n\n.omniscribe_transcription-panel-cut-label {\n flex-shrink: 0;\n padding: 2px 10px;\n border-radius: 9999px;\n background-color: #fff7ed;\n border: 1px solid #fed7aa;\n color: #c2410c;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* Scrollbar styles */\n.omniscribe_transcription-panel-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.omniscribe_transcription-panel-content::-webkit-scrollbar-thumb {\n border-radius: 10px;\n background-color: var(--color-gray-300, #d1d5db);\n}\n\n.omniscribe_transcription-panel-content::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n/* Firefox */\n.omniscribe_transcription-panel-content {\n scrollbar-width: thin;\n scrollbar-color: var(--color-gray-300, #d1d5db) transparent;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-panel-processing {\n padding-top: 5px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-processing {\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-processing-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-skeleton-line {\n height: 14px;\n width: 70%;\n}\n\n.omniscribe_transcription-skeleton-line--short {\n width: 40%;\n}\n\n.omniscribe_transcription-processing-text {\n font-size: var(--text-xs);\n color: var(--omni-secondary, #6b7280);\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupMenu.css */\n.omniscribe_link-menu-container {\n width: 18rem;\n border-radius: 0.5rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n border: 1px solid var(--grey-200);\n background-color: var(--omniscribe-surface, #ffffff);\n}\n\n.omniscribe_link-menu-navigation {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n border-bottom: 1px solid var(--color-gray-100);\n background-color: var(--grey-50);\n border-top-left-radius: 0.5rem;\n border-top-right-radius: 0.5rem;\n}\n\n.omniscribe_nav-button {\n height: 1.5rem;\n width: 1.5rem;\n padding: 0.125rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n color: var(--omniscribe-text-muted, #6b7280);\n transition-property:\n color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.omniscribe_nav-button:hover {\n background-color: var(--color-gray-100);\n color: var(--omniscribe-text, #374151);\n}\n\n.omniscribe_nav-button:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n box-shadow: 0 0 0 2px #3b82f6;\n}\n\n.omniscribe_nav-button:active {\n background-color: var(--grey-200);\n}\n\n.omniscribe_nav-icon {\n width: 0.875rem;\n height: 0.875rem;\n}\n\n.omniscribe_page-indicator {\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #4b5563);\n}\n\n.omniscribe_link-menu-content {\n padding: 0.375rem;\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupMenuCard.css */\n.omniscribe_card-link {\n display: block;\n border-radius: 0.5rem;\n overflow: hidden;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 200ms;\n background-color: var(--omniscribe-surface, #ffffff);\n border: 1px solid var(--grey-200);\n text-decoration: none;\n}\n\n.omniscribe_card {\n border: 0;\n box-shadow: none;\n border-radius: 0.5rem;\n margin: 0;\n padding: 0;\n}\n\n.omniscribe_card:hover {\n background-color: var(--grey-50);\n}\n\n.omniscribe_card-header {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.5rem;\n border-bottom: 1px solid var(--color-gray-100);\n background-color: rgba(249, 250, 251, 0.5);\n}\n\n.omniscribe_favicon {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n\n.omniscribe_fallback-icon {\n width: 1rem;\n height: 1rem;\n border-radius: 0.125rem;\n background-color: #d1d5db;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.omniscribe_fallback-text {\n font-size: 8px;\n font-weight: 700;\n color: var(--grey-600);\n text-transform: uppercase;\n}\n\n.omniscribe_card-title {\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n color: var(--grey-800);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-grow: 1;\n min-width: 0;\n margin: 0;\n}\n\n.omniscribe_card-content {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.omniscribe_card-content > * + * {\n margin-top: 0.25rem;\n}\n\n.omniscribe_link-text {\n font-size: 0.875rem;\n line-height: 1.25rem;\n font-weight: 600;\n color: var(--color-activeblack, #000000);\n line-height: 1.375;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.omniscribe_snippet-text {\n font-size: 0.75rem;\n line-height: 1rem;\n color: var(--omniscribe-text-muted, #4b5563);\n line-height: 1.625;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n\n/* Source: modules/chat/components/markdown/LinkGroupPill.css */\n.omniscribe_pill-container {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n}\n\n.omniscribe_pill-button {\n display: inline-flex;\n align-items: center;\n border-radius: 9999px;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n font-size: 0.75rem;\n line-height: 1rem;\n font-weight: 500;\n background-color: var(--blue-100);\n color: var(--blue-700);\n border: 1px solid var(--blue-200);\n transition-property:\n color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n cursor: pointer;\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.omniscribe_pill-button:hover {\n background-color: var(--blue-200);\n}\n\n.omniscribe_pill-button:focus {\n background-color: var(--blue-200);\n outline: 2px solid transparent;\n outline-offset: 2px;\n box-shadow:\n 0 0 0 2px #3b82f6,\n 0 0 0 4px rgba(59, 130, 246, 0.1);\n}\n\n.omniscribe_pill-button--active {\n background-color: var(--blue-200);\n}\n\n.omniscribe_pill-domain {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n@media (min-width: 640px) {\n .omniscribe_pill-domain {\n max-width: 200px;\n }\n}\n\n.omniscribe_pill-counter {\n margin-left: 0.375rem;\n background-color: var(--blue-200);\n color: #1e40af;\n border-radius: 9999px;\n padding-left: 0.375rem;\n padding-right: 0.375rem;\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n font-size: 10px;\n line-height: 1;\n font-weight: 600;\n}\n\n.omniscribe_menu-portal {\n position: absolute;\n z-index: 100;\n}\n\n\n/* Source: modules/chat/components/markdown/MarkdownText.css */\n.omniscribe_markdown-code-container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: calc(var(--spacing) * 4) /* 1rem = 16px */;\n border-top-left-radius: var(--radius) /* 0.25rem = 4px */;\n border-top-right-radius: var(--radius) /* 0.25rem = 4px */;\n background-color: var(--color-zinc-900)\n /* oklch(21% 0.006 285.885) = #18181b */;\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n color: var(--white);\n}\n\n.omniscribe_markdown-code-span {\n text-transform: lowercase;\n & > span {\n font-size: var(--text-xs) /* 0.75rem = 12px */;\n line-height: var(--text-xs--line-height) /* calc(1 / 0.75) ≈ 1.3333 */;\n }\n}\n\n/* Escala de encabezados calibrada al ancho del panel del chat (~380px) con\n cuerpo de 14px. La escala anterior (26/24/22/20/18px) venía de la tipografía\n por defecto de un documento a ancho completo: en el panel el encabezado\n dominaba el mensaje y los seis niveles quedaban a 2px unos de otros, sin\n jerarquía legible. Aquí h1-h3 bajan de tamaño y h4-h6 se diferencian por\n peso, no por tamaño. Los márgenes usan --spacing (rem): un host que altere\n el font-size de :root los escala, aunque los tamaños en px no se muevan. */\n\n.omniscribe_markdown-h1 {\n margin-top: calc(var(--spacing) * 5) /* 20px */;\n margin-bottom: calc(var(--spacing) * 2) /* 8px */;\n scroll-margin: calc(var(--spacing) * 20) /* 80px */;\n font-size: var(--text-xl) /* 20px */;\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-bold) /* 700 */;\n letter-spacing: var(--tracking-tight) /* -0.025em */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n.omniscribe_markdown-h2 {\n margin-top: calc(var(--spacing) * 4) /* 16px */;\n margin-bottom: calc(var(--spacing) * 2) /* 8px */;\n scroll-margin: calc(var(--spacing) * 20);\n font-size: var(--text-lg) /* 18px */;\n line-height: var(--text-lg--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n letter-spacing: var(--tracking-tight);\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n.omniscribe_markdown-h3 {\n margin-top: calc(var(--spacing) * 4) /* 16px */;\n margin-bottom: calc(var(--spacing) * 2) /* 8px */;\n scroll-margin: calc(var(--spacing) * 20);\n font-size: var(--text-base) /* 16px */;\n line-height: var(--text-base--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n/* h4-h6 comparten el tamaño del cuerpo (14px) y se distinguen por peso.\n Bajar de 14px haría el encabezado menos legible que el texto que titula. */\n.omniscribe_markdown-h4 {\n margin-top: calc(var(--spacing) * 3) /* 12px */;\n margin-bottom: calc(var(--spacing) * 1) /* 4px */;\n scroll-margin: calc(var(--spacing) * 20);\n font-size: var(--text-sm) /* 14px */;\n line-height: var(--text-sm--line-height);\n font-weight: var(--font-weight-bold) /* 700 */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n.omniscribe_markdown-h5 {\n margin-top: calc(var(--spacing) * 3) /* 12px */;\n margin-bottom: calc(var(--spacing) * 1) /* 4px */;\n font-size: var(--text-sm) /* 14px */;\n line-height: var(--text-sm--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n.omniscribe_markdown-h6 {\n margin-top: calc(var(--spacing) * 3) /* 12px */;\n margin-bottom: calc(var(--spacing) * 1) /* 4px */;\n font-size: var(--text-sm) /* 14px */;\n line-height: var(--text-sm--line-height);\n font-weight: var(--font-weight-semibold) /* 600 */;\n color: var(--color-zinc-500);\n &:first-child {\n margin-top: calc(var(--spacing) * 0);\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0);\n }\n}\n\n.omniscribe_markdown-p {\n margin-block: calc(var(--spacing) * 2.5);\n line-height: calc(var(--spacing) * 5);\n &:first-child {\n margin-top: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n &:last-child {\n margin-bottom: calc(var(--spacing) * 0) /* 0rem = 0px */;\n }\n}\n\n.omniscribe_markdown-a {\n color: var(--primary);\n font-weight: var(--font-weight-medium) /* 500 */;\n text-decoration-line: underline;\n text-underline-offset: 4px;\n overflow-wrap: break-word;\n}\n\n.omniscribe_markdown-blockquote {\n border-left-width: 2px;\n padding-left: calc(var(--spacing) * 6) /* 1.5rem = 24px */;\n font-style: italic;\n}\n\n.omniscribe_markdown-ul {\n list-style-type: disc;\n padding-inline-start: 20px;\n word-break: break-word;\n & > li {\n margin-top: calc(var(--spacing) * 1) /* 0.5rem = 8px */;\n }\n}\n\n.omniscribe_markdown-ol {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n margin-left: calc(var(--spacing) * 6) /* 1.5rem = 24px */;\n list-style-type: decimal;\n & > li {\n margin-top: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n }\n}\n\n.omniscribe_markdown-hr {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n border-bottom-width: 1px;\n}\n.omniscribe_markdown-table {\n margin-block: calc(var(--spacing) * 5) /* 1.25rem = 20px */;\n width: 100%;\n border-collapse: separate;\n border-spacing: calc(var(--spacing) * 0) /* 0rem = 0px */;\n overflow-y: auto;\n}\n.omniscribe_markdown-th {\n background-color: var(--muted);\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n text-align: left;\n font-weight: var(--font-weight-bold) /* 700 */;\n &:first-child {\n border-top-left-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &:last-child {\n border-top-right-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &[align='center'] {\n text-align: center;\n }\n &[align='right'] {\n text-align: right;\n }\n}\n\n.omniscribe_markdown-td {\n border-bottom-width: 1px;\n border-left-width: 1px;\n padding-inline: calc(var(--spacing) * 4) /* 1rem = 16px */;\n padding-block: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n text-align: left;\n &:last-child {\n border-right-width: 1px;\n }\n &[align='center'] {\n text-align: center;\n }\n &[align='right'] {\n text-align: right;\n }\n}\n\n.omniscribe_markdown-tr {\n margin: calc(var(--spacing) * 0) /* 0rem = 0px */;\n &:first-child {\n border-top-width: 1px;\n }\n &:last-child > td:first-child {\n border-bottom-left-radius: var(--radius) /* 0.25rem = 4px */;\n }\n &:last-child > td:last-child {\n border-bottom-right-radius: var(--radius) /* 0.25rem = 4px */;\n }\n}\n\n.omniscribe_markdown-sup {\n font-size: var(--text-xs) /* 0.75rem = 12px */;\n line-height: var(--text-xs--line-height) /* calc(1 / 0.75) ≈ 1.3333 */;\n & > a {\n text-decoration-line: none;\n }\n}\n\n.omniscribe_markdown-pre {\n overflow-x: auto;\n border-bottom-right-radius: var(--radius) /* 0.25rem = 4px */;\n border-bottom-left-radius: var(--radius) /* 0.25rem = 4px */;\n background-color: var(--black);\n padding: calc(var(--spacing) * 4) /* 1rem = 16px */;\n color: var(--white);\n max-width: var(--container-4xl) /* 56rem = 896px */;\n}\n\n.omniscribe_markdown-code {\n border-radius: 0.25rem /* 4px */;\n font-weight: var(--font-weight-semibold) /* 600 */;\n}\n\n.omniscribe_markdown-link {\n color: var(--color-primary); /* text-primary */\n font-weight: 500; /* font-medium */\n text-decoration: underline; /* underline */\n text-underline-offset: 4px; /* underline-offset-4 */\n word-wrap: break-word; /* break-words */\n}\n\n.omniscribe_markdown-link:hover {\n color: var(--color-primary-dark); /* hover:text-primary-dark */\n}\n\n.omniscribe_assistant-markdown-container strong,\n.omniscribe_assistant-markdown-container b {\n font-weight: bold !important;\n}\n\n\n/* Source: modules/chat/components/markdown/tooltip-icon-button.css */\n/* Tooltip icon button styles */\n.omniscribe_tooltip-icon-button-btn {\n padding: 4px;\n min-width: auto;\n min-height: auto;\n}\n\n.omniscribe_tooltip-icon-button-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n\n/* Source: modules/chat/components/messages/AssistantMessage.css */\n.omniscribe_assistant-message-container {\n display: flex;\n align-items: flex-start;\n margin-right: auto;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n width: 100%;\n}\n\n.omniscribe_assistant-message-calls-container {\n display: flex;\n flex-direction: column;\n max-width: 100%;\n}\n\n.omniscribe_assistant-markdown-container {\n padding-block: calc(var(--spacing) * 0.5) /* 0.25rem = 4px */;\n}\n\n.omniscribe_assistant-commands-container {\n display: flex;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n align-items: center;\n margin-right: auto;\n}\n.omniscribe_assistant-message-container:hover,\n.omniscribe_assistant-message-container:focus {\n .omniscribe_assistant-commands-container {\n opacity: 100%;\n }\n}\n\n\n/* Source: modules/chat/components/messages/AssistantMessageLoading.css */\n/* Assistant message loading animation */\n.omniscribe_assistant-message-loading-container {\n display: flex;\n align-items: center;\n padding: 8px 0;\n}\n\n.omniscribe_assistant-message-loading {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_assistant-message-loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #666;\n animation: omniscribe-assistant-dot-flashing 1.4s infinite linear;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(1) {\n animation-delay: -0.32s;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(2) {\n animation-delay: -0.16s;\n}\n\n.omniscribe_assistant-message-loading-dot:nth-child(3) {\n animation-delay: 0s;\n}\n\n@keyframes omniscribe-assistant-dot-flashing {\n 0%,\n 80%,\n 100% {\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n}\n\n\n/* Source: modules/chat/components/messages/BranchSwitcher.css */\n.omniscribe_brand-switcher-container {\n display: flex;\n align-items: center;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n}\n\n.omniscribe_brand-switcher-text {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n}\n\n.omniscribe_brand-switcher-btn {\n width: calc(0.25rem /* 4px */ * 6) /* 1.5rem = 24px */;\n height: calc(0.25rem /* 4px */ * 6) /* 1.5rem = 24px */;\n padding: calc(0.25rem /* 4px */ * 1) /* 0.25rem = 4px */;\n}\n\n\n/* Source: modules/chat/components/messages/CommandBar.css */\n.omniscribe_command-bar-container {\n display: flex;\n align-items: center;\n padding-right: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n transition: opacity 0.2s ease-in-out;\n}\n\n.omniscribe_command-bar-container.omniscribe_command-bar-hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n.thumbs.active {\n color: var(--blue-500);\n}\n\n.omniscribe_feedback-button-container {\n position: relative;\n display: inline-block;\n}\n\n.omniscribe_command-bar-container-icon-color,\n.thumbs {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_command-bar-container svg {\n width: 12px !important;\n height: 12px !important;\n}\n\n.omniscribe_command-bar-container .omniscribe_tooltip-icon-button-btn {\n padding: calc(var(--spacing) * 0.5) !important;\n}\n\n.omniscribe_command-bar-container .tooltip-base {\n padding: 0.25rem 0.5rem;\n}\n\n.omniscribe_command-bar-container .tooltip-trigger {\n padding: 1px;\n margin: 1px;\n}\n\n.omniscribe_command-bar-container .omniscribe_button-size-icon {\n height: calc(var(--spacing) * 3);\n width: calc(var(--spacing) * 3);\n}\n\n\n/* Source: modules/chat/components/messages/HumanMessage.css */\n.omniscribe_human-message-container {\n display: flex;\n align-items: center;\n margin-left: auto;\n gap: calc(var(--spacing) * 2) /* 0.5rem = 8px */;\n}\n.omniscribe_human-message-container-editing {\n width: 100%;\n max-width: var(--container-xl) /* 36rem = 576px */;\n}\n.omniscribe_human-message-container-no-editing {\n max-width: 100%;\n}\n\n.omniscribe_human-message-command-container {\n display: flex;\n gap: calc(var(--spacing) * 1) /* 0.5rem = 8px */;\n align-items: center;\n margin-left: auto;\n}\n.omniscribe_human-message-command-container-editing {\n opacity: 100%;\n}\n\n.omniscribe_human-message-container:focus,\n.omniscribe_human-message-container:hover {\n .omniscribe_human-message-command-container {\n opacity: 100%;\n }\n}\n\n.omniscribe_human-message-subcontainer {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n.omniscribe_human-message-subcontainer-editing {\n width: 100%;\n}\n\n.omniscribe_human-message-content {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n}\n\n.omniscribe_human-message-content-text {\n text-align: right;\n padding-top: 4px;\n padding-bottom: 4px;\n padding-inline: calc(var(--spacing) * 2);\n border-radius: var(--radius-3xl);\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n font-weight: 500;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n margin: 0;\n}\n.omniscribe_human-message-textarea {\n min-height: 2.5rem !important; /* 40px */\n max-height: 12rem !important; /* 192px - Allow more vertical space */\n min-width: 200px !important; /* Minimum width for usability */\n resize: both; /* Allow controlled resizing in both directions */\n width: 100%;\n overflow: auto; /* Enable scroll when content exceeds max dimensions */\n\n &:focus-visible {\n box-shadow: var(--tw-ring-inset,) 0 0 0\n calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n }\n}\n\n.omniscribe_human-message-textarea-chat-history-close {\n max-width: 100% !important;\n}\n\n.omniscribe_human-message-textarea-chat-history-open {\n max-width: 385px !important;\n}\n\n\n/* Source: modules/chat/components/messages/MessageImages.css */\n/* Message Files Container (for both images and documents) */\n.omniscribe_message-files {\n margin-top: 8px;\n margin-bottom: 4px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Message Images Container */\n.omniscribe_message-images {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_message-images-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n max-width: 100%;\n}\n\n/* Individual Image Container */\n.omniscribe_message-image-container {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: var(--omniscribe-surface-alt, #f5f5f5);\n border: 1px solid var(--omniscribe-border, #e0e0e0);\n cursor: pointer;\n transition:\n transform 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.omniscribe_message-image-container:hover {\n transform: scale(1.02);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.omniscribe_message-image-container-single {\n max-width: 200px;\n max-height: 200px;\n}\n\n.omniscribe_message-image-container-multiple {\n width: 80px;\n height: 80px;\n flex-shrink: 0;\n}\n\n/* Image Element */\n.omniscribe_message-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.omniscribe_message-image-container-single .omniscribe_message-image {\n max-width: 200px;\n max-height: 200px;\n width: auto;\n height: auto;\n}\n\n/* Loading State */\n.omniscribe_message-image-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 60px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n color: var(--omniscribe-text-muted, #6c757d);\n font-size: 12px;\n border-radius: 8px;\n}\n\n/* Error State */\n.omniscribe_message-image-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n min-height: 60px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n color: var(--omniscribe-text-muted, #6c757d);\n font-size: 12px;\n border-radius: 8px;\n text-align: center;\n cursor: default;\n}\n\n.omniscribe_message-image-error span {\n font-size: 20px;\n margin-bottom: 4px;\n}\n\n.omniscribe_message-image-error small {\n font-size: 10px;\n}\n\n/* Image Counter for Multiple Images */\n.omniscribe_message-image-counter {\n position: absolute;\n top: 4px;\n right: 4px;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n font-size: 10px;\n font-weight: bold;\n padding: 2px 6px;\n border-radius: 12px;\n min-width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Images Count */\n.omniscribe_message-images-count {\n margin-top: 4px;\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n font-style: italic;\n}\n\n/* Modal for Full-Size Images */\n.omniscribe_message-image-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 9999;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_message-image-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.omniscribe_message-image-modal-content {\n position: relative;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.omniscribe_message-image-modal-img {\n max-width: 100%;\n max-height: 100%;\n border-radius: 8px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n}\n\n.omniscribe_message-image-modal-close {\n position: absolute;\n top: -10px;\n right: -10px;\n background-color: var(--omniscribe-surface, #fff);\n border: none;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n font-weight: bold;\n color: var(--omniscribe-text, #333);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n transition: background-color 0.2s ease;\n}\n\n.omniscribe_message-image-modal-close:hover {\n background-color: var(--omniscribe-surface-alt, #f5f5f5);\n}\n\n/* Message Documents Container */\n.omniscribe_message-documents {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_message-document {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border-radius: 8px;\n background-color: var(--omniscribe-surface-alt, #f8f9fa);\n border: 1px solid var(--omniscribe-border, #e0e0e0);\n transition: background-color 0.2s ease;\n max-width: 280px;\n}\n\n.omniscribe_message-document:hover {\n background-color: var(--omniscribe-surface-alt, #f0f0f0);\n}\n\n.omniscribe_message-document-icon {\n font-size: 24px;\n flex-shrink: 0;\n}\n\n.omniscribe_message-document-info {\n flex: 1;\n min-width: 0;\n}\n\n.omniscribe_message-document-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--omniscribe-text, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.omniscribe_message-document-size {\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n}\n\n.omniscribe_message-documents-count {\n margin-top: 4px;\n font-size: 11px;\n color: var(--omniscribe-text-muted, #6c757d);\n font-style: italic;\n}\n\n\n/* Source: modules/chat/components/messages/ToolCalls.css */\n.omniscribe_tool-calls-container {\n margin-block-start: calc(calc(var(--spacing) * 4) * var(0));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(0)));\n width: 100%;\n max-width: var(--container-4xl) /* 56rem = 896px */;\n}\n\n.omniscribe_tool-calls-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n max-width: 100%;\n flex-wrap: wrap;\n gap: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n}\n.omniscribe_tool-calls-h3 {\n font-weight: var(--font-weight-bold);\n color: var(--color-gray-900) /* oklch(21% 0.034 264.665) = #101828 */;\n word-break: break-all;\n font-size: 14px;\n margin: 0;\n}\n\n.omniscribe_tool-calls-item-args {\n align-items: flex-start;\n flex-wrap: wrap;\n}\n.omniscribe_tool-calls-item-args-text {\n word-break: break-all;\n margin-right: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n padding-block: calc(var(--spacing) * 1) /* 0.25rem = 4px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n}\n\n.omniscribe_tool-calls-item-args-code {\n background-color: var(--color-gray-50);\n border-radius: 0.25rem /* 4px */;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(\n --tw-leading,\n var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */\n );\n word-break: break-all;\n}\n\n.omniscribe_tool-calls-pre {\n font-size: 12px;\n}\n\n\n/* Source: modules/chat/components/messages/ToolResults.css */\n/* ToolResult Component Styles */\n\n.omniscribe_tool-result {\n margin-top: 2px;\n border: 1px solid var(--grey-200);\n border-radius: 0.5rem !important; /* !rounded-lg */\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */\n overflow: hidden; /* overflow-hidden */\n width: 100%;\n}\n\n.omniscribe_tool-result-header {\n background-color: var(--grey-50); /* bg-gray-50 */\n padding-left: 1rem; /* px-4 */\n padding-right: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n display: flex; /* flex */\n align-items: center; /* items-center */\n justify-content: space-between; /* justify-between */\n}\n\n.omniscribe_tool-result-header--expanded {\n border-bottom: 1px solid var(--grey-200);\n}\n\n.omniscribe_tool-result-header-content {\n display: flex; /* flex */\n align-items: center; /* items-center */\n gap: 0.5rem; /* gap-2 */\n min-width: 0; /* min-w-0 */\n}\n\n.omniscribe_tool-result-title {\n font-weight: 500; /* font-medium */\n color: var(--grey-900);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; /* truncate */\n margin: 0;\n font-size: 14px;\n}\n\n.omniscribe_expand-button {\n padding: 0.25rem; /* p-1 */\n flex-shrink: 0; /* flex-shrink-0 */\n}\n\n.omniscribe_expand-icon {\n width: 1.25rem; /* w-5 */\n height: 1.25rem; /* h-5 */\n}\n\n.omniscribe_tool-result-content {\n padding: 1rem; /* p-4 */\n background-color: var(--omniscribe-surface, #ffffff); /* bg-white */\n max-height: 24rem; /* max-h-96 */\n overflow-y: auto; /* overflow-y-auto */\n}\n\n.omniscribe_tool-result-content > * + * {\n margin-top: 0.5rem; /* space-y-2 */\n}\n\n/* Scrollbar styles for webkit browsers */\n.omniscribe_tool-result-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-track {\n background: #f1f5f9;\n border-radius: 4px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 4px;\n}\n\n.omniscribe_tool-result-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n.omniscribe_result-card {\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */\n border: 1px solid var(--color-gray-100);\n padding-top: 0.5rem !important; /* !py-2 */\n padding-bottom: 0.5rem !important;\n gap: 0 !important; /* !gap-0 */\n}\n\n.omniscribe_result-card-header {\n padding-top: 0.5rem !important; /* !pt-2 */\n padding-left: 0.5rem !important; /* !px-2 */\n padding-right: 0.5rem !important;\n padding-bottom: 0 !important; /* !pb-0 */\n}\n\n.omniscribe_result-card-title {\n font-size: 0.875rem; /* text-sm */\n line-height: 1.25rem;\n font-weight: 600; /* font-semibold */\n}\n\n.omniscribe_result-link {\n color: var(--blue-600);\n text-decoration: none;\n transition-property: color, text-decoration;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n.omniscribe_result-link:hover {\n text-decoration: underline; /* hover:underline */\n color: #1e40af; /* hover:text-blue-800 */\n}\n\n.omniscribe_result-card-content {\n padding: 0.5rem !important; /* !p-2 */\n padding-top: 0 !important; /* !pt-0 */\n}\n\n.omniscribe_result-description {\n font-size: 0.75rem; /* text-xs */\n line-height: 1rem;\n color: var(--omniscribe-text, #374151); /* text-gray-700 */\n line-height: 1.625; /* leading-relaxed */\n word-break: break-all; /* break-all */\n display: -webkit-box;\n -webkit-line-clamp: 2; /* line-clamp-2 */\n -webkit-box-orient: vertical;\n overflow: hidden;\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms; /* transition-all duration-150 ease-in-out */\n transition-timing-function: cubic-bezier(0.4, 0, 0.6, 1); /* ease-in-out */\n}\n\n.omniscribe_result-description:hover {\n -webkit-line-clamp: unset; /* hover:line-clamp-none */\n display: block;\n}\n\n.omniscribe_result-source {\n font-size: 0.75rem; /* text-xs */\n line-height: 1rem;\n color: var(--omniscribe-text-muted, #6b7280); /* text-gray-500 */\n margin-top: 0.25rem; /* mt-1 */\n padding-top: 0.25rem; /* pt-1 */\n border-top: 1px solid var(--color-gray-100);\n}\n\n.omniscribe_string-result {\n font-size: 0.875rem; /* text-sm */\n line-height: 1.25rem;\n white-space: pre-wrap; /* whitespace-pre-wrap */\n background-color: var(--grey-50);\n padding: 0.75rem; /* p-3 */\n border-radius: 0.375rem; /* rounded-md */\n border: 1px solid var(--grey-200);\n font-family:\n ui-monospace, SFMono-Regular, 'SF Mono', Consolas, 'Liberation Mono', Menlo,\n monospace; /* pre tag font */\n}\n\n\n/* Source: modules/header/components/ConfigHeader.css */\n/* Config Header Styles */\n.omniscribe_config-view {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n max-height: 17px;\n padding: 16px;\n}\n\n.omniscribe_config-back-group {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.omniscribe_config-back-label {\n margin: 0;\n color: var(--omniscribe-text, #000000);\n font-size: 14px;\n font-weight: 700;\n line-height: 17px;\n}\n\n.omniscribe_config-close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background-color: var(--omniscribe-surface-alt, #edeff2);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: var(--Radius-radius-round, 99999px);\n cursor: pointer;\n color: var(--omniscribe-text, #000000);\n font-size: 14px;\n line-height: 1;\n padding: 0;\n}\n\n\n/* Source: modules/header/components/ConnectedButtons.css */\n/* Connected Buttons Styles */\n.omniscribe_connected-buttons {\n display: flex;\n border-radius: var(--Radius-radius-medium, 8px);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n overflow: hidden;\n}\n\n.omniscribe_connected-btn-left {\n border: none !important;\n border-radius: 0 !important;\n border-right: 1px solid var(--omniscribe-border, #e5e7ec) !important;\n}\n\n.omniscribe_connected-btn-right {\n border: none !important;\n border-radius: 0 !important;\n}\n\n/* Ensure connected buttons have consistent styling */\n.omniscribe_connected-buttons .omniscribe_utility-btns {\n min-height: 40px;\n}\n\n\n/* Source: modules/header/components/ConsentIndicator.css */\n.omniscribe_consent-indicator {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: var(--Font-Weight-Regular, 400);\n line-height: var(--text-xs--line-height, 14.4px);\n letter-spacing: var(--text-xs--letter-spacing, 0.05px);\n white-space: nowrap;\n margin-right: 8px;\n gap: 4px;\n border: 1px solid var(--border, #e5e7ec);\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_consent-indicator-tooltip {\n border-radius: var(--radius-lg, 12px) !important;\n border: 1px solid var(--border, #e5e7ec) !important;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25) !important;\n display: flex !important;\n padding: 10px 8px !important;\n font-size: 10px !important;\n font-weight: 400 !important;\n line-height: var(--text-xs--line-height, 14.4px) !important;\n letter-spacing: var(--text-xs--letter-spacing, 0.05px) !important;\n}\n\n/* SOF-844: express refusal of AI use. Distinct from \"not signed yet\" — the\n whole point of the third state is that they must not look alike. */\n.omniscribe_consent-indicator--refused {\n background-color: var(--omniscribe-danger-soft, #fee2e2);\n color: var(--omniscribe-danger, #b91c1c);\n border-color: var(--omniscribe-danger, #b91c1c);\n}\n\n/* SOF-845: the consent may be signed and the assistant still blocked by another\n rule. The badge stays truthful about the consent, but must not read as \"all\n clear\" at a glance while recording is disabled. */\n.omniscribe_consent-indicator--blocked {\n background-color: var(--omniscribe-warning-soft, #fef3c7);\n color: var(--omniscribe-warning, #92400e);\n border-color: var(--omniscribe-warning, #92400e);\n}\n\n\n/* Source: modules/header/components/MainHeader.css */\n/* Main Header Styles */\n.omniscribe_main-header {\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.omniscribe_main-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n.omniscribe_main-header-title {\n margin: 0;\n color: var(--omniscribe-text, #252a32);\n font-size: 14px;\n font-weight: 500;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n}\n\n.omniscribe_main-header-separator {\n width: 1px;\n align-self: stretch;\n margin: -16px 0;\n background-color: var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_main-header-spacer {\n flex: 1;\n}\n\n.omniscribe_main-header-settings {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n.omniscribe_main-header-close {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n border: none;\n background: none;\n cursor: pointer;\n}\n\n\n/* Source: modules/header/components/UtilityButton.css */\n/* Utility Button Styles */\n.omniscribe_utility-btn-audio {\n min-height: 40px; /* Match connected buttons height */\n}\n\n.omniscribe_utility-btn-right {\n /* Settings button specific styles can be added here */\n}\n\n/* Base utility button styles are inherited from parent UtilityButtons.css */\n\n\n/* Source: modules/header/components/WarningBanner.css */\n/* Warning Banner Styles */\n.omniscribe_warning-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_warning-banner-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background-color: var(--omniscribe-border, #e5e7ec);\n border-radius: 50%;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.omniscribe_warning-banner-close:hover {\n background-color: #d1d5db;\n}\n\n.omniscribe_warning-banner-text {\n font-size: 12px;\n font-weight: 400;\n line-height: 1.25;\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n\n/* Source: modules/header/section/UtilityButtons.css */\n.omniscribe_header-wrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n background-color: var(--omniscribe-surface, #ffffff);\n border-top-right-radius: 12px;\n border-top-left-radius: 12px;\n}\n\n.omniscribe_utility-btns-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n background-color: var(--omniscribe-surface, #ffffff);\n overflow: hidden;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n align-self: stretch;\n border-top-right-radius: inherit;\n border-top-left-radius: inherit;\n}\n\n.omniscribe_utility-btns-left,\n.omniscribe_utility-btns-right {\n display: flex;\n flex-direction: row;\n gap: 4px;\n align-items: center;\n}\n\n.omniscribe_utility-btn-right {\n border-radius: var(--Radius-radius-round, 99999px) !important;\n background-color: var(--omniscribe-surface-alt, #f6f7f9) !important;\n border: none !important;\n}\n\n.omniscribe_utility-btns {\n cursor: pointer;\n transition-duration: 300ms;\n background-color: color-mix(in oklab, var(--white) 30%, transparent);\n border-radius: var(--Radius-radius-medium, 8px);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n position: relative;\n padding: 8px;\n display: flex;\n align-items: center;\n\n &:hover {\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n }\n}\n\n.omniscribe_utility-btns-pointer {\n pointer-events: auto;\n}\n\n.omniscribe_utility-btns-no-pointer {\n pointer-events: none;\n background-color: var(--white);\n}\n\n.omniscribe_utility-btns-no-pointer-opacity {\n pointer-events: none;\n opacity: 50%;\n}\n\n.omniscribe_utility-btns-opacity {\n background-color: var(--white);\n opacity: 100%;\n}\n\n.omniscribe_utility-btns-active {\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border: 1px solid var(--omniscribe-primary, #105bdb);\n}\n\n.omniscribe_btn-label {\n margin-left: 6px;\n font-size: 14px;\n color: var(--omniscribe-text, #212529);\n font-weight: 500;\n}\n\n.omniscribe_btn-label-active {\n color: var(--omniscribe-primary, #105bdb);\n}\n\n.omniscribe_btn-label-inactive {\n color: var(--omniscribe-text, #212529);\n}\n\n.omniscribe_icon {\n color: var(--active-black);\n}\n\n.omniscribe_icon-active {\n color: var(--omniscribe-primary, #105bdb);\n}\n\n\n/* Source: modules/insertionPreview/InsertionPreviewModal.css */\n/* Insertion Preview Modal — ported from the demo's .sugg-* styles\n (dev-tools/demo/src/style.css:715-891). Uses BEM-style naming under\n omniscribe_insertion-preview to stay scoped inside the SDK shadow DOM.\n\n Theming hooks (set on the `<sofia-sdk>` element, they cross the shadow\n boundary; classes don't):\n\n --omniscribe-insertion-preview-reserve px reserved for chat widget on the right\n --omniscribe-insertion-preview-primary brand color (selection / apply button)\n --omniscribe-insertion-preview-primary-soft soft pill background using primary\n --omniscribe-insertion-preview-primary-text text color sitting on primary-soft\n --omniscribe-insertion-preview-accent attention color (gaps)\n --omniscribe-insertion-preview-accent-soft soft pill background using accent\n --omniscribe-insertion-preview-accent-bg gap-section background\n --omniscribe-insertion-preview-text primary text\n --omniscribe-insertion-preview-text-muted secondary text / chrome\n --omniscribe-insertion-preview-border panel + group border\n --omniscribe-insertion-preview-border-soft in-panel separators\n --omniscribe-insertion-preview-input-border form-control border\n --omniscribe-insertion-preview-checkbox-border unchecked checkbox stroke\n --omniscribe-insertion-preview-surface panel background\n --omniscribe-insertion-preview-surface-alt header / footer / hover background\n\n Defaults cascade THROUGH the main SDK tokens (`--omniscribe-*`) before\n falling back to a hard-coded literal. So:\n\n 1. If the host sets `--omniscribe-insertion-preview-primary` →\n only the modal picks it up (per-surface theming).\n 2. Else if the host sets `--omniscribe-primary` (the chat-widget\n token) → BOTH chat and modal share it (unified theme — the\n out-of-the-box experience).\n 3. Else → falls back to the hard-coded SDK default (Sofia blue),\n matching the chat widget's stock look.\n\n Tokens without a chat-widget counterpart (accent / text-muted /\n border-soft / surface-alt etc.) keep their own defaults. */\n\n.omniscribe_insertion-preview__backdrop,\n.omniscribe_insertion-preview__panel {\n --_primary: var(\n --omniscribe-insertion-preview-primary,\n var(--omniscribe-primary, #105bdb)\n );\n --_primary-soft: var(\n --omniscribe-insertion-preview-primary-soft,\n var(--omniscribe-primary-soft, #e7effd)\n );\n --_primary-text: var(\n --omniscribe-insertion-preview-primary-text,\n var(--omniscribe-primary, #105bdb)\n );\n --_accent: var(--omniscribe-insertion-preview-accent, #c77700);\n --_accent-soft: var(--omniscribe-insertion-preview-accent-soft, #fdebc6);\n --_accent-bg: var(--omniscribe-insertion-preview-accent-bg, #fffbf1);\n --_text: var(\n --omniscribe-insertion-preview-text,\n var(--omniscribe-text, #1f2733)\n );\n --_text-muted: var(\n --omniscribe-insertion-preview-text-muted,\n var(--omniscribe-text-muted, #6a7385)\n );\n --_border: var(\n --omniscribe-insertion-preview-border,\n var(--omniscribe-border, #e5e7ec)\n );\n --_border-soft: var(\n --omniscribe-insertion-preview-border-soft,\n var(--omniscribe-border, #eef1f6)\n );\n --_input-border: var(\n --omniscribe-insertion-preview-input-border,\n var(--omniscribe-border, #d6dbe5)\n );\n --_checkbox-border: var(\n --omniscribe-insertion-preview-checkbox-border,\n #b7bfcc\n );\n --_surface: var(\n --omniscribe-insertion-preview-surface,\n var(--omniscribe-surface, #fff)\n );\n --_surface-alt: var(\n --omniscribe-insertion-preview-surface-alt,\n var(--omniscribe-surface-alt, #f6f8fb)\n );\n}\n\n/* The modal must sit above every other surface in the SDK shadow DOM\n (chat panel, toasts, tooltips). 2147483640+ ensures that even with a\n max-int z-index race, the modal wins. */\n.omniscribe_insertion-preview__backdrop {\n position: fixed;\n inset: 0;\n background: rgba(15, 27, 45, 0.42);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n z-index: 2147483640;\n animation: omniscribe_insertion-preview__fade 0.18s ease-out;\n}\n@keyframes omniscribe_insertion-preview__fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* `--omniscribe-insertion-preview-reserve` lets the host budget space\n for a floating chat widget so the panel centers in the area NOT\n covered by it. Default: 0px → centered in the full viewport. */\n.omniscribe_insertion-preview__panel {\n position: fixed;\n top: 50%;\n left: calc((100vw - var(--omniscribe-insertion-preview-reserve, 0px)) / 2);\n transform: translate(-50%, -50%);\n z-index: 2147483641;\n width: 680px;\n max-width: calc(\n 100vw - var(--omniscribe-insertion-preview-reserve, 0px) - 32px\n );\n max-height: 84vh;\n background: var(--_surface);\n border: 1px solid var(--_border);\n border-radius: 14px;\n box-shadow: 0 24px 64px rgba(15, 27, 45, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: omniscribe_insertion-preview__in 0.22s ease-out;\n font-family: 'Lato', sans-serif;\n color: var(--_text);\n}\n\n/* Below 1100px there isn't room to sit beside the widget; centered\n fallback (will overlap the widget — same trade-off as the demo). */\n@media (max-width: 1100px) {\n .omniscribe_insertion-preview__panel {\n left: 50%;\n width: 92vw;\n max-width: 720px;\n }\n}\n@keyframes omniscribe_insertion-preview__in {\n from {\n opacity: 0;\n transform: translate(-50%, calc(-50% + 8px)) scale(0.985);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n}\n\n.omniscribe_insertion-preview__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n border-bottom: 1px solid var(--_border);\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n}\n.omniscribe_insertion-preview__close {\n background: transparent;\n border: 0;\n color: var(--_text-muted);\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 4px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__close:hover {\n background: var(--_border-soft);\n color: var(--_text);\n}\n\n.omniscribe_insertion-preview__sub {\n margin: 0;\n padding: 8px 14px;\n font-size: 11.5px;\n color: var(--_text-muted);\n border-bottom: 1px solid var(--_border-soft);\n}\n\n.omniscribe_insertion-preview__body {\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n}\n\n.omniscribe_insertion-preview__group {\n border-bottom: 1px solid var(--_border-soft);\n}\n.omniscribe_insertion-preview__group:last-child {\n border-bottom: 0;\n}\n.omniscribe_insertion-preview__group-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px 4px;\n}\n/* The parent label of an array-of-objects group lives inside .group-head\n which already supplies 14px left padding. Without zeroing the inner\n .row padding here, the parent ends up doubly indented (28px) while\n children directly under the section have a single 14px — making the\n parent appear LEFT-shifted relative to its own children. */\n.omniscribe_insertion-preview__group-head .omniscribe_insertion-preview__row {\n padding: 0;\n}\n.omniscribe_insertion-preview__group-name {\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--_text-muted);\n}\n.omniscribe_insertion-preview__group-count {\n background: var(--_primary-soft);\n color: var(--_primary-text);\n font-size: 10.5px;\n font-weight: 600;\n border-radius: 999px;\n padding: 1px 7px;\n}\n\n.omniscribe_insertion-preview__row {\n display: grid;\n grid-template-columns: 16px 1fr;\n gap: 10px;\n padding: 8px 14px;\n align-items: flex-start;\n cursor: pointer;\n border-radius: 6px;\n}\n.omniscribe_insertion-preview__row:hover {\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__row-checkbox {\n appearance: none;\n width: 14px;\n height: 14px;\n border: 1px solid var(--_checkbox-border);\n border-radius: 3px;\n background: var(--_surface);\n margin-top: 2px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__row-checkbox:checked {\n background: var(--_primary);\n border-color: var(--_primary);\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>\");\n background-repeat: no-repeat;\n background-position: center;\n}\n.omniscribe_insertion-preview__row-body {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.omniscribe_insertion-preview__row-label {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--_text);\n margin-bottom: 8px;\n}\n.omniscribe_insertion-preview__row-preview {\n font-size: 11.5px;\n color: var(--_text-muted);\n word-break: break-word;\n}\n.omniscribe_insertion-preview__row-line {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 2px 0;\n}\n.omniscribe_insertion-preview__row-line-text {\n flex: 1;\n}\n\n.omniscribe_insertion-preview__row-edit {\n margin-top: 4px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.omniscribe_insertion-preview__row-edit-grid {\n display: grid;\n grid-template-columns: 140px 1fr;\n gap: 6px 12px;\n align-items: center;\n}\n.omniscribe_insertion-preview__row-edit-label {\n font-size: 11px;\n color: var(--_text-muted);\n}\n\n.omniscribe_insertion-preview__edit {\n font: inherit;\n font-size: 12px;\n color: var(--_text);\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n padding: 4px 8px;\n background: var(--_surface);\n width: 100%;\n box-sizing: border-box;\n}\n.omniscribe_insertion-preview__edit--prose {\n min-height: 60px;\n resize: vertical;\n}\n.omniscribe_insertion-preview__edit--toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 0;\n padding: 0;\n background: transparent;\n}\n.omniscribe_insertion-preview__edit--multi-enum {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n border: 0;\n padding: 0;\n background: transparent;\n}\n.omniscribe_insertion-preview__edit__chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n border: 1px solid var(--_input-border);\n border-radius: 999px;\n padding: 2px 8px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__edit__chip--on {\n background: var(--_primary);\n color: #fff;\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__edit__chip input {\n display: none;\n}\n\n/* Searchable enum select */\n.omniscribe_insertion-preview__searchable-select {\n position: relative;\n width: 100%;\n}\n.omniscribe_insertion-preview__searchable-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n font: inherit;\n font-size: 12px;\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n padding: 4px 8px;\n background: var(--_surface);\n cursor: pointer;\n text-align: left;\n}\n.omniscribe_insertion-preview__searchable-select__chevron {\n color: var(--_text-muted);\n}\n.omniscribe_insertion-preview__searchable-select__dropdown {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 5;\n background: var(--_surface);\n border: 1px solid var(--_input-border);\n border-radius: 4px;\n box-shadow: 0 8px 24px rgba(15, 27, 45, 0.12);\n max-height: 200px;\n display: flex;\n flex-direction: column;\n}\n.omniscribe_insertion-preview__searchable-select__search {\n font: inherit;\n font-size: 12px;\n border: 0;\n border-bottom: 1px solid var(--_border-soft);\n padding: 6px 8px;\n outline: none;\n}\n.omniscribe_insertion-preview__searchable-select__list {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n overflow-y: auto;\n}\n.omniscribe_insertion-preview__searchable-select__option {\n padding: 4px 10px;\n font-size: 12px;\n cursor: pointer;\n}\n.omniscribe_insertion-preview__searchable-select__option:hover,\n.omniscribe_insertion-preview__searchable-select__option--selected {\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__searchable-select__option--custom {\n color: var(--_text-muted);\n font-style: italic;\n}\n\n.omniscribe_insertion-preview__row--will-replace {\n background: rgba(199, 119, 0, 0.06);\n}\n.omniscribe_insertion-preview__row-tag {\n font-size: 10px;\n font-weight: 600;\n background: var(--_accent-soft);\n color: var(--_accent);\n padding: 2px 6px;\n border-radius: 999px;\n align-self: flex-start;\n margin-top: 1px;\n}\n\n/* Gaps group */\n.omniscribe_insertion-preview__group--gaps {\n background: var(--_accent-bg);\n border-top: 1px solid var(--_border);\n}\n.omniscribe_insertion-preview__group-name--gap {\n color: var(--_accent);\n}\n.omniscribe_insertion-preview__group-count--gap {\n background: var(--_accent-soft);\n color: var(--_accent);\n}\n.omniscribe_insertion-preview__row--gap {\n grid-template-columns: 18px 1fr;\n cursor: default;\n}\n.omniscribe_insertion-preview__row--gap:hover {\n background: rgba(199, 119, 0, 0.06);\n}\n.omniscribe_insertion-preview__gap-icon {\n color: var(--_accent);\n margin-top: 1px;\n}\n.omniscribe_insertion-preview__row-preview--gap {\n color: var(--_accent);\n}\n\n.omniscribe_insertion-preview__footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 10px 14px;\n border-top: 1px solid var(--_border);\n background: var(--_surface-alt);\n}\n.omniscribe_insertion-preview__btn {\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n border: 1px solid var(--_input-border);\n background: var(--_surface);\n border-radius: 6px;\n padding: 6px 14px;\n cursor: pointer;\n color: var(--_text);\n}\n.omniscribe_insertion-preview__btn--primary {\n background: var(--_primary);\n color: #fff;\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__btn--primary:disabled {\n background: #a3b1ad;\n border-color: #a3b1ad;\n cursor: not-allowed;\n}\n\n/* \"Edit with voice\" — secondary action style. Picks up the host's\n --omniscribe-secondary token (falls back to a neutral teal). */\n.omniscribe_insertion-preview__btn--voice {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--_surface);\n color: var(--_primary);\n border-color: var(--_primary);\n}\n.omniscribe_insertion-preview__btn--voice:hover {\n background: var(--_primary-soft);\n}\n.omniscribe_insertion-preview__btn-icon {\n display: inline-block;\n vertical-align: middle;\n flex-shrink: 0;\n}\n.omniscribe_insertion-preview__btn-icon--stop {\n width: 10px;\n height: 10px;\n background: currentColor;\n border-radius: 1px;\n}\n\n/* While recording the voice button morphs into a destructive-styled\n \"Stop\" button so the action reads as final. */\n.omniscribe_insertion-preview__btn--voice-stop {\n background: #dc3545;\n color: #fff;\n border-color: #dc3545;\n}\n.omniscribe_insertion-preview__btn--voice-stop:hover {\n background: #c82333;\n border-color: #c82333;\n}\n\n/* Voice status banner — rendered just under the modal header while the\n chat surface is recording / starting / generating. */\n.omniscribe_insertion-preview__voice-banner {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 14px;\n font-size: 12px;\n border-bottom: 1px solid var(--_border-soft);\n background: var(--_surface-alt);\n color: var(--_text);\n}\n.omniscribe_insertion-preview__voice-banner--recording {\n background: rgba(220, 53, 69, 0.08);\n color: #b21f2c;\n}\n.omniscribe_insertion-preview__voice-banner--generating {\n background: var(--_primary-soft);\n color: var(--_primary-text);\n}\n.omniscribe_insertion-preview__voice-pulse {\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: #dc3545;\n animation: omniscribe_insertion-preview__pulse 1s ease-in-out infinite;\n flex-shrink: 0;\n}\n@keyframes omniscribe_insertion-preview__pulse {\n 0%,\n 100% {\n opacity: 0.4;\n transform: scale(0.85);\n }\n 50% {\n opacity: 1;\n transform: scale(1.15);\n }\n}\n.omniscribe_insertion-preview__voice-spinner {\n width: 12px;\n height: 12px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: 999px;\n animation: omniscribe_insertion-preview__spin 0.8s linear infinite;\n flex-shrink: 0;\n display: inline-block;\n}\n@keyframes omniscribe_insertion-preview__spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Tiny visual cue on the panel itself while recording. */\n.omniscribe_insertion-preview__panel--voice {\n border-color: rgba(220, 53, 69, 0.4);\n}\n.omniscribe_insertion-preview__close:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.omniscribe_insertion-preview__footer-spacer {\n flex: 1;\n}\n\n/* Mandatory styling — distinct from the soft amber gap treatment so the\n doctor immediately sees what's blocking. Red border + red pill. */\n.omniscribe_insertion-preview__row--mandatory {\n background: rgba(220, 53, 69, 0.06);\n border-left: 3px solid #dc3545;\n}\n.omniscribe_insertion-preview__row--mandatory\n .omniscribe_insertion-preview__row-preview--gap,\n.omniscribe_insertion-preview__row--mandatory\n .omniscribe_insertion-preview__row-label {\n color: var(--omniscribe-text, #1f2733);\n}\n.omniscribe_insertion-preview__gap-icon--mandatory {\n color: #dc3545;\n}\n.omniscribe_insertion-preview__row-edit-grid--mandatory {\n background: rgba(220, 53, 69, 0.04);\n border-radius: 4px;\n padding: 4px 6px;\n}\n.omniscribe_insertion-preview__mandatory-pill {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 6px;\n font-size: 9.5px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n background: #dc3545;\n color: #fff;\n border-radius: 999px;\n}\n.omniscribe_insertion-preview__sub--blocking {\n color: #dc3545;\n font-weight: 600;\n}\n\n/* AI-suggested field: the agent inferred this from context rather\n than from an explicit doctor statement. We tint the editor\n background so the doctor visually distinguishes it from\n confirmed-from-dictation fields, and a small ✨ pill on the\n label tells them what it means. Less alarming than the\n mandatory-red treatment because the field IS filled — we just\n want the doctor to double-check it. */\n.omniscribe_insertion-preview__row-edit-grid--suggested {\n background: rgba(176, 122, 255, 0.06);\n border-left: 2px solid #b07aff;\n border-radius: 4px;\n padding: 4px 6px;\n}\n.omniscribe_insertion-preview__suggested-pill {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 7px;\n font-size: 9.5px;\n font-weight: 600;\n letter-spacing: 0.03em;\n background: rgba(176, 122, 255, 0.12);\n color: #6f48b8;\n border: 1px solid rgba(176, 122, 255, 0.5);\n border-radius: 999px;\n}\n\n/* SOF-659 — read-only \"Attachments\" section (file previews by type). */\n.omniscribe_insertion-preview__attachments {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.omniscribe_insertion-preview__attachments__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.omniscribe_insertion-preview__attachment {\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n overflow: hidden;\n background: rgba(0, 0, 0, 0.02);\n}\n\n.omniscribe_insertion-preview__attachment--image {\n display: block;\n max-width: 100%;\n max-height: 240px;\n object-fit: contain;\n}\n\n.omniscribe_insertion-preview__attachment--audio {\n width: 100%;\n padding: 8px;\n}\n\n.omniscribe_insertion-preview__attachment--pdf {\n width: 100%;\n height: 360px;\n border: none;\n}\n\n.omniscribe_insertion-preview__attachment--text {\n margin: 0;\n padding: 10px 12px;\n max-height: 200px;\n overflow: auto;\n font-size: 12px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.omniscribe_insertion-preview__attachment--file {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n}\n\n.omniscribe_insertion-preview__attachment__name {\n font-size: 13px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n/* Source: modules/layout/components/OmniscribeContainer/OmniscribeContainer.css */\n.omniscribe_container {\n isolation: isolate;\n position: fixed;\n bottom: calc(var(--spacing) * 5);\n right: 0;\n border-top-left-radius: 30px;\n border-bottom-left-radius: 30px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n z-index: 80;\n}\n\n[dir='ltr'] .omniscribe_container {\n right: 0;\n border-top-left-radius: 30px;\n border-bottom-left-radius: 30px;\n}\n\n[dir='rtl'] .omniscribe_container {\n left: 0;\n right: auto;\n border-top-right-radius: 30px;\n border-bottom-right-radius: 30px;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n}\n\n\n/* Source: modules/layout/components/OmniscribeLayout/DraggableCollapsed.css */\n/* Draggable Collapsed Container */\n.omniscribe_draggable-collapsed {\n position: fixed;\n bottom: 20px;\n right: 20px;\n cursor: grab;\n z-index: 9999;\n transition: transform 0.1s ease-out;\n user-select: none;\n touch-action: none;\n}\n\n.omniscribe_draggable-collapsed--dragging {\n cursor: grabbing;\n transition: none;\n}\n\n/* Horizontal mode - rotated 90 degrees */\n.omniscribe_draggable-collapsed--horizontal {\n bottom: 20px;\n}\n\n.omniscribe_draggable-collapsed--horizontal .omniscribe_transcribe-collapsed {\n flex-direction: row;\n transform: none;\n}\n\n/* RTL support */\n[dir='rtl'] .omniscribe_draggable-collapsed {\n right: auto;\n left: 20px;\n}\n\n\n/* Source: modules/layout/components/OmniscribeLayout/OmniscribeLayout.css */\n.omniscribe_layout {\n position: fixed;\n width: var(--layout-w);\n background: var(--white);\n bottom: calc(var(--spacing) * 5);\n border-bottom-left-radius: 12px;\n border: solid 1px var(--omniscribe-border, var(--light-border));\n box-shadow: 0px 4px 4px 0px #00000040;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 500ms;\n transition-property: transform, translate, scale, rotate;\n display: flex;\n flex-direction: column;\n height: var(--layout-h);\n min-width: 500px;\n min-height: 500px;\n right: 0;\n border-radius: 12px;\n}\n\n[dir='rtl'] .omniscribe_layout {\n left: 0;\n right: auto;\n border-bottom-right-radius: 12px;\n}\n\n[dir='ltr'] .omniscribe_layout {\n right: 0;\n border-bottom-left-radius: 12px;\n}\n\n.omniscribe_layout-open {\n background: var(--white);\n translate: 0;\n}\n\n.omniscribe_layout-close {\n translate: var(--layout-w);\n}\n\n[dir='rtl'] .omniscribe_layout-close {\n translate: calc(var(--layout-w) * -1);\n}\n\n[dir='ltr'] .omniscribe_layout-close {\n translate: var(--layout-w);\n}\n\n\n/* Source: modules/settings/components/chat/Chat.css */\n.omniscribe_chat-config {\n display: flex;\n flex-direction: column;\n gap: 24px;\n min-height: 0; /* Permite que los hijos controlen su altura */\n flex: 1; /* Toma el espacio disponible */\n}\n\n/* Espaciado específico para el separador en el contexto de chat */\n.omniscribe_chat-config .omniscribe_separator {\n margin: 8px 0; /* Margen vertical consistente */\n}\n\n.omniscribe_chat-prompt-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-right: 16px;\n}\n\n.omniscribe_chat-prompt-textarea {\n width: 100%;\n height: 74px;\n padding: 8px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: var(--omniscribe-text, #374151);\n background-color: var(--omniscribe-surface, white);\n resize: none;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_chat-prompt-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-style: italic;\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: var(--omniscribe-text-muted, #6b7280);\n align-self: flex-start;\n}\n\n\n/* Source: modules/settings/components/chat/PromptCustomization.css */\n.omniscribe_chat-prompt-title {\n font-size: 14px;\n font-weight: 400;\n color: var(--omniscribe-text, #252a32);\n line-height: 14.4px;\n margin: 0 0 12px 0;\n}\n\n.omniscribe_chat-prompt-container {\n position: relative;\n}\n\n.omniscribe_chat-prompt-textarea {\n width: 100%;\n min-height: 80px;\n padding: 12px;\n border: 1px solid var(--border-color, #ddd);\n border-radius: 8px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.4;\n resize: none;\n transition: border-color 0.2s ease;\n}\n\n.omniscribe_chat-prompt-textarea:focus {\n outline: none;\n border-color: var(--omniscribe-primary, #007bff);\n box-shadow: 0 0 0 2px var(--primary-color-alpha, rgba(0, 123, 255, 0.1));\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: var(--text-secondary, #666);\n margin-top: 6px;\n text-align: right;\n}\n\n\n/* Source: modules/settings/components/chat/SourceItem.css */\n.omniscribe_source-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n}\n\n.omniscribe_source-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n /* Let the label shrink inside the row so a long name can wrap instead of\n pushing the row wider. */\n flex: 1;\n min-width: 0;\n}\n\n.omniscribe_source-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--primary, #105bdb);\n cursor: pointer;\n}\n\n.omniscribe_source-name {\n flex: 1;\n min-width: 0;\n /* A source name with no spaces (e.g. a bare domain) has no wrap points, so\n without this it overflows the row. `anywhere` breaks it only when needed. */\n overflow-wrap: anywhere;\n font-size: 12px;\n color: var(--omniscribe-text, #374151);\n}\n/* Removed link styles for source name - now handled by icon button only */\n.omniscribe_source-external-icon {\n width: 12px;\n height: 12px;\n stroke: var(--primary, #105bdb);\n cursor: pointer;\n transition: stroke 0.2s;\n flex-shrink: 0;\n}\n\n.omniscribe_source-external-icon:hover {\n stroke: #0d47a1;\n}\n\n.omniscribe_source-checkbox:checked + .omniscribe_source-name {\n font-weight: 500;\n color: var(--omniscribe-text, #1f2937);\n}\n\n\n/* Source: modules/settings/components/chat/SourceSelector.css */\n.omniscribe_source-selector {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 24px;\n min-height: 0;\n flex: 1;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n.omniscribe_source-selector-title {\n font-size: 16px;\n font-weight: 500;\n color: var(--omniscribe-text, #252a32);\n margin: 0;\n}\n\n.omniscribe_source-selector-description {\n font-size: 14px;\n color: var(--omniscribe-text-muted, #6b7280);\n line-height: 1.5;\n margin: 0;\n}\n\n.omniscribe_source-list {\n width: 100%;\n max-width: 100%;\n min-height: 105px;\n max-height: 285px;\n border-radius: 12px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n background: var(--omniscribe-surface, #ffffff);\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n overflow-y: auto;\n flex: 1;\n box-sizing: border-box;\n}\n\n.omniscribe_source-list--compact {\n max-height: 105px;\n}\n\n\n/* Source: modules/settings/section/Configuration.css */\n.omniscribe_config-content {\n width: 650px;\n max-height: 590px;\n opacity: 1;\n background-color: var(--omniscribe-surface, #ffffff);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.omniscribe_config-list {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n flex: 1;\n}\n\n.omniscribe_config-item {\n width: 100%;\n height: 75px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n opacity: 1;\n padding: 10px 22px 10px 16px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n box-sizing: border-box;\n flex-shrink: 0;\n}\n\n.omniscribe_config-item:hover {\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n}\n\n.omniscribe_config-item:focus {\n outline: none;\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_config-item:last-child {\n border-bottom: none;\n}\n\n.omniscribe_config-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n}\n\n.omniscribe_config-icon {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_config-item-content {\n flex: 1;\n margin-left: 16px;\n margin-right: 16px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 4px;\n}\n\n.omniscribe_config-item-title {\n margin: 0;\n font-weight: 700;\n font-size: 14px;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n color: var(--omniscribe-text, #252a32);\n}\n\n.omniscribe_config-item-description {\n margin: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 16.8px;\n letter-spacing: 0.05px;\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n.omniscribe_config-item-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #9ca3af);\n flex-shrink: 0;\n}\n\n/* Sub-screen styles */\n.omniscribe_config-subscreen-header {\n display: flex;\n align-items: center;\n padding: 16px 16px 8px 16px;\n}\n\n.omniscribe_config-back-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n}\n\n.omniscribe_config-subscreen-title {\n margin: 0;\n font-size: 18px;\n font-weight: 500;\n color: var(--omniscribe-text, #252a32);\n line-height: 21.6px;\n}\n\n.omniscribe_config-subscreen-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 16px;\n min-height: 0; /* Permite que los hijos se compriman */\n box-sizing: border-box; /* Incluye padding en el cálculo */\n}\n\n.omniscribe_config-subscreen-content.no-border {\n /* no-border variant */\n}\n\n.omniscribe_config-subscreen-content-template {\n flex: 1;\n overflow-y: auto;\n padding-bottom: 50px;\n}\n\n.omniscribe_config-section-label {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n line-height: 1.4;\n}\n\n.omniscribe_config-language-section {\n display: flex;\n flex-direction: column;\n}\n\n/* Audio-environment (VAD) section: titled control with helper text below. */\n.omniscribe_config-audio-env {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n\n.omniscribe_config-language-section-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n margin-bottom: 8px;\n}\n\n.omniscribe_config-subscreen-description,\n.omniscribe_config-subscreen-subdescription {\n margin: 0 0 0 0;\n font-size: 14px;\n line-height: 18px;\n color: var(--omniscribe-text, #13161a);\n font-weight: 400;\n}\n\n.omniscribe_config-subscreen-subdescription {\n font-style: italic;\n}\n/* Dictionary Options View Styles */\n.omniscribe_config-dictionary-section {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.omniscribe_config-dictionary-add-section {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.omniscribe_config-dictionary-input-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.omniscribe_config-dictionary-input {\n height: 32px;\n border: 1px solid var(--omniscribe-border, #e5e8eb) !important;\n border-radius: 8px !important;\n padding: 0 12px !important;\n font-size: 14px !important;\n line-height: 1.4 !important;\n background-color: var(--omniscribe-surface, #ffffff) !important;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease !important;\n}\n\n.omniscribe_config-dictionary-input:focus {\n outline: none !important;\n border-color: #4f46e5 !important;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important;\n}\n\n.omniscribe_config-dictionary-input::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af) !important;\n font-size: 14px !important;\n}\n\n.omniscribe_config-dictionary-input.error {\n border-color: #dc3545 !important;\n background-color: #fff5f5 !important;\n}\n\n.omniscribe_config-dictionary-input.error:focus {\n border-color: #dc3545 !important;\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1) !important;\n}\n\n.omniscribe_config-dictionary-add-btn {\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--primary);\n border: 1px solid var(--primary);\n border-radius: 8px;\n color: var(--primary-foreground);\n cursor: pointer;\n transition: all 0.2s ease;\n margin-top: 0;\n font-size: 0;\n}\n\n.omniscribe_config-dictionary-add-btn:hover:not(:disabled) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n border-color: color-mix(in oklab, var(--primary) 90%, transparent);\n}\n\n.omniscribe_config-dictionary-add-btn:disabled {\n background-color: #e5e8eb;\n border-color: var(--omniscribe-border, #e5e8eb);\n color: var(--omniscribe-text-muted, #9ca3af);\n cursor: not-allowed;\n transform: none;\n box-shadow: none;\n}\n\n.omniscribe_config-dictionary-list {\n display: flex;\n padding-top: 16px;\n flex-direction: column;\n gap: 8px;\n max-height: 410px;\n overflow-y: auto;\n margin-top: 4px;\n}\n\n.omniscribe_config-dictionary-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 1px solid var(--omniscribe-border, #e5e8eb);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.omniscribe_config-dictionary-row:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n border-color: var(--omniscribe-border, #d1d5db);\n}\n\n.omniscribe_config-dictionary-cell {\n flex: 1;\n font-size: 14px;\n line-height: 20px;\n color: var(--omniscribe-text, #374151);\n word-break: break-word;\n font-weight: 500;\n}\n\n.omniscribe_config-dictionary-arrow {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-size: 16px;\n font-weight: 600;\n flex-shrink: 0;\n margin: 0 4px;\n}\n\n.omniscribe_config-dictionary-delete-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 6px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_config-dictionary-delete-btn:hover {\n background-color: #fee2e2;\n color: #dc2626;\n transform: scale(1.05);\n}\n\n.omniscribe_config-dictionary-empty {\n padding: 40px 16px;\n margin-top: 16px;\n text-align: center;\n color: var(--omniscribe-text-muted, #6b7280);\n font-size: 14px;\n line-height: 20px;\n background-color: var(--omniscribe-surface-alt, #f9fafb);\n border: 2px dashed var(--omniscribe-border, #e5e8eb);\n border-radius: 12px;\n font-style: italic;\n}\n\n/* Template specific styles */\n\n/* General prompt section */\n.omniscribe_template-general-prompt-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-bottom: 8px;\n}\n\n.omniscribe_template-section-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--omniscribe-text, #374151);\n line-height: 1.4;\n}\n\n.omniscribe_template-section-subtitle {\n margin: 0;\n font-size: 13px;\n font-weight: 400;\n color: var(--omniscribe-text-muted, #6b7280);\n line-height: 1.4;\n}\n\n.omniscribe_template-general-prompt-textarea {\n width: 100%;\n min-height: 80px;\n max-height: 200px;\n padding: 12px;\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: var(--omniscribe-text, #374151);\n background-color: var(--omniscribe-surface, white);\n resize: vertical;\n box-sizing: border-box;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_template-general-prompt-textarea::placeholder {\n color: var(--omniscribe-text-muted, #9ca3af);\n font-style: italic;\n}\n\n.omniscribe_template-general-prompt-textarea:focus {\n border-color: #3b5edb;\n box-shadow: 0 0 0 3px rgba(59, 94, 219, 0.1);\n}\n\n/* Fields section */\n.omniscribe_template-fields-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-top: 8px;\n}\n\n.omniscribe_template-field {\n background: var(--omniscribe-surface, white);\n border-bottom: 1px solid var(--omniscribe-border, #e1e8ed);\n margin-bottom: 0;\n}\n\n.omniscribe_template-field:last-child {\n border-bottom: none;\n}\n\n.omniscribe_template-field-header {\n display: flex;\n align-items: center;\n padding: 12px 0;\n background: var(--omniscribe-surface, #ffffff);\n}\n\n.omniscribe_template-field-checkbox {\n background: none;\n border: none;\n padding: 0;\n margin-right: 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.omniscribe_template-field-label {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text, #2c3e50);\n}\n\n.omniscribe_template-field-prompt-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n flex-shrink: 0;\n}\n\n.omniscribe_template-field-prompt-btn:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n}\n\n.omniscribe_template-field-content {\n padding: 0 0 12px 34px;\n background: var(--omniscribe-surface, white);\n}\n\n.omniscribe_template-textarea {\n width: 100%;\n min-height: 80px;\n max-height: 300px;\n padding: 12px;\n border: 1px solid var(--omniscribe-border, #e1e8ed);\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n background: var(--omniscribe-surface, white);\n box-sizing: border-box;\n overflow-y: auto;\n}\n\n.omniscribe_template-textarea:focus {\n outline: none;\n border-color: #3b5edb;\n box-shadow: 0 0 0 3px rgba(59, 94, 219, 0.1);\n}\n\n.omniscribe_template-character-count {\n margin-top: 8px;\n font-size: 12px;\n color: var(--omniscribe-text-muted, #95a5a6);\n display: flex;\n}\n\n/* Template fields container */\n.omniscribe_template-fields {\n display: flex;\n flex-direction: column;\n background: var(--omniscribe-surface, white);\n}\n\n/* Improved scrollbar for template fields */\n.omniscribe_template-fields::-webkit-scrollbar {\n width: 6px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 3px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 3px;\n}\n\n.omniscribe_template-fields::-webkit-scrollbar-thumb:hover {\n background: #a8a8a8;\n}\n\n.omniscribe_config-version-section {\n background: var(--omniscribe-surface-alt, #f6f7f9);\n color: var(--omniscribe-text-muted, #4a5364);\n padding: 8px 24px;\n font-weight: 700;\n line-height: 16.8px;\n font-size: 14px;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n\n/* Source: modules/transcription/components/content-container/content-containter.css */\n.omniscribe_audio-content-container {\n background-color: var(--white);\n width: -webkit-fill-available;\n flex: 1 1 0 !important;\n min-height: 0 !important;\n display: flex !important;\n flex-direction: column !important;\n overflow: hidden !important;\n}\n\n.omniscribe_audio-content-messages {\n color: var(--black);\n}\n\n.omniscribe_transcription-footer-container {\n position: sticky;\n display: flex;\n flex-direction: column;\n align-items: center;\n bottom: 0;\n padding-bottom: calc(var(--spacing) * 3);\n}\n\n.omniscribe_audio-content-render {\n color: var(--black);\n font-weight: var(--font-weight-medium);\n padding-block: 0.5rem;\n padding-inline: 0.75rem;\n margin-bottom: 0.25rem;\n}\n\n.omniscribe_patient {\n color: #db10c1;\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_doctor {\n color: var(--blue-500);\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_speaker {\n color: #28a745;\n padding-right: 0.5rem;\n font-size: var(--text-sm);\n line-height: 1.25rem;\n letter-spacing: 0;\n}\n\n.omniscribe_transcription {\n color: var(--black);\n}\n\n.omniscribe_transcription-down-btn-container {\n background-color: var(--omniscribe-surface, white);\n}\n\n.omniscribe_transcription-down-btn {\n width: calc(0.25rem /* 4px */ * 4);\n height: calc(0.25rem /* 4px */ * 4);\n}\n\n/* Chrome, Safari, Edge (Webkit) */\n.omniscribe_audio-content-container > div::-webkit-scrollbar {\n width: 6px !important;\n}\n\n.omniscribe_audio-content-container > div::-webkit-scrollbar-thumb {\n border-radius: 10px !important;\n background-color: var(--omni-secondary) !important;\n}\n\n.omniscribe_audio-content-container > div::-webkit-scrollbar-track {\n background-color: transparent !important;\n}\n\n/* Firefox */\n.omniscribe_audio-content-container > div {\n scrollbar-width: thin !important;\n scrollbar-color: var(--omni-secondary) transparent !important;\n}\n\n/* Processing skeleton indicator */\n.omniscribe_transcription-processing {\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-processing-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.omniscribe_transcription-skeleton-line {\n height: 14px;\n width: 70%;\n}\n\n.omniscribe_transcription-skeleton-line--short {\n width: 40%;\n}\n\n.omniscribe_transcription-processing-text {\n font-size: var(--text-xs);\n color: var(--omni-secondary, #6b7280);\n}\n\n\n/* Source: modules/transcription/components/recorder-counter/RecorderCounter.css */\n.omniscribe_audio-recorder-timer {\n color: var(--blue-500);\n font-weight: 600; /* SemiBold */\n font-style: normal; /* SemiBold is a weight, not a style */\n font-size: var(--font-size-400); /* design token */\n line-height: var(--line-height-400); /* design token */\n letter-spacing: 0;\n text-align: center;\n}\n\n\n/* Source: modules/transcription/components/toggle-record/ToggleRecord.css */\n.omniscribe_record-button-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n.omniscribe_record-button-classname {\n background-color: transparent;\n border: none;\n padding: 4px;\n}\n\n.omniscribe_record-button {\n background-color: var(--primary-button);\n border-radius: 50%;\n cursor: pointer;\n width: 56px;\n height: 56px;\n align-items: center;\n justify-content: center;\n display: flex;\n transition-duration: 300ms;\n box-shadow:\n inset 0 2px 4px rgb(0 0 0 / 0.05),\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.omniscribe_record-button-enabled {\n opacity: 100%;\n pointer-events: auto;\n scale: 110%;\n &:hover {\n scale: 150%;\n }\n}\n.omniscribe_record-button-not-enabled {\n opacity: 50%;\n &:hover {\n scale: 150%;\n }\n}\n.omniscribe_record-button-disabled {\n opacity: 50%;\n background-color: dimgray;\n pointer-events: none;\n}\n\n.omniscribe_record-enabled {\n width: 50px;\n height: 50px;\n background-color: var(--primary-button);\n animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n position: absolute;\n z-index: -1;\n border-radius: calc(infinity * 1px);\n opacity: 100%;\n}\n\n@keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n\n/* Source: modules/transcription/section/AudioRecorder.css */\n.omniscribe_audio-recorder {\n align-items: center;\n padding-block: calc(var(--spacing) * 5);\n border-bottom-left-radius: 12px;\n background-color: var(--white);\n display: flex;\n flex: 1;\n flex-direction: column;\n}\n\n[dir='ltr'] .omniscribe_audio-recorder {\n border-bottom-left-radius: 12px;\n}\n\n[dir='rtl'] .omniscribe_audio-recorder {\n border-bottom-right-radius: 12px;\n border-bottom-left-radius: 0px;\n}\n\n.omniscribe_audio-recorder-container {\n display: flex;\n align-items: center;\n border: solid 1px var(--light-border);\n background-color: var(--white);\n max-height: 42px;\n border-radius: 9999px;\n border-width: 1px;\n justify-content: space-between;\n margin-bottom: 5px;\n flex: 1;\n align-self: stretch;\n margin-inline: calc(var(--spacing) * 4);\n padding-inline: calc(var(--spacing) * 2);\n}\n\n.omniscribe_audio-recorder-audio-container {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: center;\n}\n\n.omniscribe_audio-recorder-refresh-btn {\n cursor: pointer;\n background-color: var(--omniscribe-surface-alt, #f6f7f9);\n border-radius: 100px;\n transition:\n transform 0.3s ease,\n opacity 0.3s ease,\n background-color 0.3s ease;\n transform: scale(1);\n}\n.omniscribe_audio-recorder-refresh-btn-enabled {\n pointer-events: auto;\n opacity: 1;\n\n &:hover {\n transform: scale(1.15);\n }\n}\n.omniscribe_audio-recorder-refresh-btn-disabled {\n pointer-events: none;\n opacity: 0.5;\n}\n.omniscribe_audio-recorder-audio-content-container {\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n border-radius: 8px;\n margin-top: 18px;\n padding-top: 8px;\n padding-inline: calc(var(--spacing) * 4);\n padding-bottom: 8px;\n align-self: stretch;\n margin-inline: calc(var(--spacing) * 4);\n}\n.omniscribe_audio-recorder-footer {\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n padding-top: 16px;\n margin-top: 12px;\n display: flex;\n width: 100%;\n}\n.omniscribe_audio-recorder-footer-content {\n padding-inline: calc(var(--spacing) * 4);\n width: 100%;\n justify-content: space-between;\n align-items: center;\n display: flex;\n}\n.omniscribe_audio-recorder-audio-info {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n color: var(--omniscribe-text-muted, #6f7d95);\n padding-block: 8px;\n}\n\n.omniscribe_audio-recorder-audio-star-icons {\n display: flex;\n justify-content: center;\n gap: 4px;\n}\n\n.omniscribe_audio-recorder-audio-feedback {\n color: var(--omniscribe-text-muted, #a4adbc);\n}\n\n.omniscribe_audio-recorder-refresh-icon {\n color: var(--omniscribe-text, #252a32);\n}\n\n.omniscribe_audio-recorder-star-icon {\n cursor: pointer;\n display: inline-block;\n}\n\n\n/* Source: shared/components/ActivationGuardDialog.css */\n/* The shared Modal overlay is absolutely positioned against its nearest\n positioned ancestor, which for this dialog is wherever the provider happens\n to sit in the tree. Force fixed so it centers over the viewport. */\n.omniscribe_modal-overlay:has(.omniscribe_activation-guard-modal) {\n position: fixed;\n inset: 0;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.omniscribe_activation-guard-modal {\n width: 480px;\n max-width: 90vw;\n padding: 24px !important;\n}\n\n/* Override Modal's default h2 size for this dialog. */\n.omniscribe_activation-guard-modal .omniscribe_modal-title-container {\n margin-bottom: 16px;\n align-items: flex-start;\n}\n\n.omniscribe_activation-guard-modal .omniscribe_modal-title {\n font-size: 18px;\n line-height: 1.3;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_activation-guard-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.omniscribe_activation-guard-summary {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.omniscribe_activation-guard-summary-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 9999px;\n background-color: #fef3c7;\n color: #b45309;\n}\n\n.omniscribe_activation-guard-summary-text {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--color-gray-800, #1f2937);\n flex: 1;\n}\n\n.omniscribe_activation-guard-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 16px;\n margin-top: 4px;\n}\n\n.omniscribe_activation-guard-secondary {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #374151);\n border-radius: 9999px;\n transition: background-color 0.15s ease;\n}\n\n.omniscribe_activation-guard-secondary:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--color-gray-900, #0f172a);\n}\n\n.omniscribe_activation-guard-primary {\n border-radius: 9999px !important;\n gap: 8px;\n padding-block: 10px !important;\n padding-inline: 18px !important;\n height: auto !important;\n font-weight: 600;\n}\n\n\n/* Source: shared/components/Card.css */\n.omniscribe_card {\n background-color: var(--color-card, #ffffff);\n color: var(--color-card-foreground, #000000);\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n border-radius: 0.75rem;\n border: 1px solid var(--color-border, var(--grey-200));\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n.omniscribe_card-header {\n container-type: inline-size;\n container-name: card-header;\n display: grid;\n grid-auto-rows: min-content;\n grid-template-rows: auto auto;\n align-items: start;\n gap: 0.375rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n/* When card-header has card-action, adjust grid layout */\n.omniscribe_card-header:has([data-slot='card-action']) {\n grid-template-columns: 1fr auto;\n}\n\n/* When card-header has border-b class, add padding bottom */\n.omniscribe_card-header.border-b {\n padding-bottom: 1.5rem;\n}\n\n.omniscribe_card-title {\n line-height: 1;\n font-weight: 600;\n}\n\n.omniscribe_card-description {\n color: var(--color-muted-foreground, #6b7280);\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.omniscribe_card-action {\n grid-column-start: 2;\n grid-row: span 2 / span 2;\n grid-row-start: 1;\n align-self: start;\n justify-self: end;\n}\n\n.omniscribe_card-content {\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n.omniscribe_card-footer {\n display: flex;\n align-items: center;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n}\n\n.omniscribe_card-footer.border-t {\n padding-top: 1.5rem;\n}\n\n\n/* Source: shared/components/app-skeleton.css */\n.omniscribe_app-skeleton {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--white);\n border-radius: 12px;\n}\n\n/* Header */\n.omniscribe_app-skeleton-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-header-left,\n.omniscribe_app-skeleton-header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.omniscribe_app-skeleton-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n}\n\n.omniscribe_app-skeleton-title {\n width: 48px;\n height: 20px;\n border-radius: 4px;\n}\n\n.omniscribe_app-skeleton-badge {\n width: 150px;\n height: 32px;\n border-radius: 99999px;\n}\n\n/* Disclaimer banner */\n.omniscribe_app-skeleton-banner {\n padding: 6px 16px;\n border-bottom: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-banner-text {\n width: 100%;\n height: 16px;\n border-radius: 4px;\n}\n\n/* Content */\n.omniscribe_app-skeleton-content {\n flex: 1;\n padding: 20px;\n}\n\n.omniscribe_app-skeleton-welcome {\n width: 240px;\n height: 28px;\n border-radius: 4px;\n margin-bottom: 10px;\n}\n\n.omniscribe_app-skeleton-suggestions {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.omniscribe_app-skeleton-suggestion {\n height: 25px;\n border-radius: 99999px;\n}\n\n.omniscribe_app-skeleton-suggestion--long {\n width: 320px;\n}\n\n.omniscribe_app-skeleton-suggestion--longer {\n width: 380px;\n}\n\n.omniscribe_app-skeleton-suggestion--medium {\n width: 280px;\n}\n\n/* Bottom bar */\n.omniscribe_app-skeleton-bottom {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n}\n\n.omniscribe_app-skeleton-transcribe-btn {\n width: 140px;\n height: 40px;\n border-radius: 99999px;\n flex-shrink: 0;\n}\n\n.omniscribe_app-skeleton-input {\n flex: 1;\n height: 40px;\n border-radius: 99999px;\n}\n\n\n/* Source: shared/components/button.css */\n.omniscribe_button {\n border: none;\n background: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: calc(var(--spacing) * 2);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n outline-style: none;\n /* Enabled buttons must show the pointer affordance; the base rule never set\n it, so variants without their own cursor (e.g. outline, used by the chat\n mic button) rendered the default arrow. `:disabled` below overrides it. */\n cursor: pointer;\n &:disabled {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 50%;\n }\n & svg {\n pointer-events: none;\n flex-shrink: 0;\n }\n & svg:not([class*='size-svg']) {\n width: calc(var(--spacing) * 4) /* 1rem = 16px */;\n height: calc(var(--spacing) * 4) /* 1rem = 16px */;\n }\n &:focus-visible {\n border-color: var(--ring);\n box-shadow: 0 0 0 calc(3px + var(--tw-ring-offset-width))\n color-mix(in oklab, var(--ring) 50%, transparent);\n }\n &[aria-invalid='true'] {\n border-color: var(--destructive);\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n}\n\n.omniscribe_button-variant-default {\n background-color: var(--primary);\n color: var(--primary-foreground);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n}\n.omniscribe_button-variant-destructive {\n background-color: var(--destructive);\n color: var(--white);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n &:focus-visible {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n}\n.omniscribe_button-variant-outline {\n border: solid 1px var(--input);\n background-color: var(--background);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n }\n}\n.omniscribe_button-variant-icon {\n align-items: center;\n border-radius: 100%;\n padding: 10px;\n & svg {\n pointer-events: auto;\n flex-shrink: 0;\n }\n & svg:not([class*='size-svg']) {\n width: auto;\n height: auto;\n }\n}\n.omniscribe_button-variant-secondadry {\n background-color: var(--secondary);\n pointer-events: cursor;\n cursor: pointer;\n color: var(--secondary-foreground);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n &:hover {\n background-color: var(--secondary-hover) !important;\n }\n &:disabled {\n background-color: var(--omniscribe-surface-alt, #edeff2);\n cursor: not-allowed;\n color: var(--omniscribe-text-muted, #d5d9e0);\n }\n}\n.omniscribe_button-variant-ghost:hover {\n background-color: var(--accent);\n color: var(--accent-foreground);\n}\n.omniscribe_button-variant-empty {\n cursor: pointer;\n}\n.omniscribe_button-variant-primary {\n cursor: pointer;\n background-color: var(--primary-button);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n font-size: 16px !important;\n color: var(--white);\n &:hover {\n background-color: color-mix(\n in oklab,\n var(--primary-button) 60%,\n transparent\n );\n }\n}\n.omniscribe_button-size-default {\n height: calc(var(--spacing) * 9);\n padding-inline: calc(var(--spacing) * 4);\n padding-block: calc(var(--spacing) * 2);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 3) /* 0.75rem = 12px */;\n }\n}\n.omniscribe_button-size-sm {\n height: calc(var(--spacing) * 8);\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n gap: calc(var(--spacing) * 1.5) /* 0.375rem = 6px */;\n padding-inline: calc(var(--spacing) * 3);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n}\n\n.omniscribe_button-size-lg {\n height: calc(var(--spacing) * 10);\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n padding-inline: calc(var(--spacing) * 6);\n &:has(> svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n}\n\n.omniscribe_button-size-icon {\n height: calc(var(--spacing) * 5);\n width: calc(var(--spacing) * 5);\n}\n.omniscribe_button-size-padding {\n padding: calc(var(--spacing) * 2);\n min-width: calc(var(--spacing) * 40);\n}\n\n.omniscribe_button-text {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n}\n.omniscribe_button-whitespace {\n white-space: nowrap;\n}\n.omniscribe_button-rounded {\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n}\n.omniscribe_button-disabled {\n pointer-events: none;\n}\n.omniscribe_button-loading {\n opacity: 50%;\n}\n.omniscribe_button-animate-spin {\n animation: spin 1s linear infinite;\n}\n.omniscribe_button-variant-report {\n cursor: pointer;\n background-color: var(--report);\n box-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n font-size: 16px;\n color: var(--white);\n &:hover {\n background-color: color-mix(in oklab, var(--report) 60%, transparent);\n }\n}\n\n\n/* Source: shared/components/feedback-modal.css */\n.omniscribe_feedback-modal {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n background: var(--omniscribe-surface, white);\n border: 1px solid var(--omniscribe-border, #e2e8f0);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n margin-top: 8px;\n min-width: 200px;\n width: 200px;\n transform-origin: top left;\n}\n\n.omniscribe_feedback-input-container {\n position: relative;\n display: flex;\n align-items: flex-end;\n border: 1px solid var(--omniscribe-border, #d1d5db);\n border-radius: 8px;\n}\n\n.omniscribe_feedback-textarea {\n flex: 1;\n border: transparent;\n border-radius: 8px;\n padding: 12px 12px 12px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n resize: none;\n min-height: 20px;\n max-height: 200px;\n overflow-y: auto;\n font-family: inherit;\n line-height: 1.4;\n width: 100%;\n box-sizing: border-box;\n}\n.omniscribe_feedback-textarea-padding {\n margin-bottom: 34px;\n padding-bottom: 0px !important;\n}\n\n.omniscribe_feedback-icons {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.omniscribe_feedback-icons:has(.omniscribe_feedback-send) {\n bottom: 8px;\n top: auto;\n transform: none;\n}\n\n.omniscribe_feedback-close {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--omniscribe-text-muted, #6b7280);\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-close:hover {\n background-color: var(--omniscribe-surface-alt, #f3f4f6);\n color: var(--omniscribe-text, #374151);\n}\n\n.omniscribe_feedback-close svg {\n width: 12px;\n height: 12px;\n}\n\n.omniscribe_feedback-send {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--blue-500);\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-send:hover {\n background-color: #f0f7ff;\n color: #0d47a1;\n}\n\n.omniscribe_feedback-send svg {\n width: 12px;\n height: 12px;\n}\n\n.omniscribe_feedback-confirmation {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-top: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n animation: fadeInOut 3s ease-in-out;\n}\n\n.omniscribe_feedback-confirmation-icon {\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n}\n\n/* Right-positioned modal styles */\n.omniscribe_feedback-modal-right {\n position: absolute;\n top: 7px;\n left: 17%;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n border: 1px solid var(--omniscribe-border, #e2e8f0);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n margin-left: 8px;\n width: 200px;\n transform-origin: bottom left;\n}\n\n.omniscribe_feedback-sending-center {\n top: 100%;\n left: 0;\n}\n\n.omniscribe_feedback-sending-right {\n top: 20px;\n left: 17%;\n}\n\n.omniscribe_feedback-sending {\n position: absolute;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-left: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n}\n.omniscribe_feedback-confirmation-right {\n position: absolute;\n top: 20px;\n left: 17%;\n z-index: 10000;\n background: var(--omniscribe-surface, white);\n color: var(--omniscribe-text, black);\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px 0px;\n margin-left: 8px;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n font-weight: 500;\n animation: fadeInOut 3s ease-in-out;\n}\n\n@keyframes fadeInOut {\n 0% {\n opacity: 0;\n transform: translateY(-10px);\n }\n 10% {\n opacity: 1;\n transform: translateY(0);\n }\n 90% {\n opacity: 1;\n transform: translateY(0);\n }\n 100% {\n opacity: 0;\n transform: translateY(-10px);\n }\n}\n\n\n/* Source: shared/components/input.css */\n.omniscribe_input {\n height: calc(var(--spacing) * 9);\n width: 100%;\n display: flex;\n border-radius: calc(var(--radius));\n border: solid 1px var(--input);\n background-color: transparent;\n padding-inline: calc(var(--spacing) * 3);\n padding-block: calc(var(--spacing) * 1);\n font-size: var(--text-base) /* 1rem = 16px */;\n line-height: var(--text-base--line-height);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n outline-style: none;\n &::file-selector-button {\n color: var(--foreground);\n display: inline-flex;\n height: calc(var(--spacing) * 7);\n border: none;\n background-color: transparent;\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n font-weight: var(--font-weight-medium);\n }\n &::placeholder {\n color: var(--muted-foreground);\n }\n &::selection {\n background-color: var(--primary);\n color: var(--primary-foreground);\n }\n &:disabled {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 50%;\n }\n &[aria-invalid='true'] {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n border-color: var(--destructive);\n }\n @media (width >= 48rem /* 768px */) {\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height) /* calc(1.25 / 0.875) ≈ 1.4286 */;\n }\n}\n\n.omniscribe_input-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n}\n\n.omniscribe_input.invalid {\n border-color: #dc3545;\n background-color: #fff5f5;\n box-shadow: 0 0 0 0.125rem rgba(220, 53, 69, 0.25);\n}\n\n.omniscribe_input-error {\n color: #dc3545;\n font-size: 10px;\n margin-block: 0.25rem;\n display: block;\n line-height: 1;\n}\n\n\n/* Source: shared/components/loading-modal.css */\n.omniscribe_loading-modal-container {\n position: absolute;\n background-color: color-mix(in oklab, var(--black) 50%, transparent);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 50;\n height: 100vh;\n width: 100vw;\n right: 0;\n bottom: calc(var(--spacing) * -5.2);\n}\n.omniscribe_loading-modal-subcontainer {\n background-color: var(--white);\n padding: calc(var(--spacing) * 8);\n border-radius: var(--radius);\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n text-align: center;\n max-width: var(--container-md);\n}\n.omniscribe_loading-modal-msg {\n font-size: var(--text-xl) /* 1.25rem = 20px */;\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-bold);\n margin-bottom: calc(var(--spacing) * 4);\n}\n.omniscribe_loading-modal-spin {\n display: inline-block;\n width: calc(var(--spacing) * 12);\n height: calc(var(--spacing) * 12);\n border: solid 4px var(--color-gray-200);\n border-top-color: var(--blue-500);\n border-radius: calc(infinity * 1px);\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.omniscribe_app-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1;\n}\n\n\n/* Source: shared/components/modal.css */\n.omniscribe_modal-overlay {\n position: absolute;\n background-color: color-mix(in oklab, var(--black) 50%, transparent);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 50;\n height: 100vh;\n width: 100vw;\n right: 0;\n bottom: calc(var(--spacing) * -5.2);\n}\n\n.omniscribe_modal-container {\n position: relative;\n background-color: var(--white);\n z-index: 100;\n border-radius: 12px;\n border: solid 1px var(--light-border);\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n padding: calc(var(--spacing) * 5);\n transition-duration: 300ms;\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 90vw;\n max-height: 90vh;\n}\n.omniscribe_modal-container-scroll {\n overflow: auto;\n}\n\n.omniscribe_modal-container-show {\n opacity: 100%;\n}\n\n.omniscribe_modal-container-hide {\n opacity: 0%;\n}\n\n.omniscribe_modal-subcontainer {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_modal-title-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: calc(var(--spacing) * 2);\n}\n\n.omniscribe_modal-title {\n font-size: var(--text-3xl); /* 1.875rem = 30px */\n line-height: var(--text-xl--line-height);\n font-weight: var(--font-weight-bold);\n margin: 0;\n}\n\n.omniscribe_modal-button {\n border: none;\n background: transparent;\n line-height: var(--text-2xl--line-height);\n cursor: pointer;\n color: var(--black);\n}\n\n@media (min-width: 768px) {\n .omniscribe_modal-container {\n max-width: 60vw;\n }\n}\n\n/* Large screens: desktop */\n@media (min-width: 1024px) {\n .omniscribe_modal-container {\n max-width: 50vw;\n }\n}\n\n/* Very large screens: large desktop and ultra-wide */\n@media (min-width: 1440px) {\n .omniscribe_modal-container {\n max-width: 40vw;\n }\n}\n\n/* Intermediate breakpoint: large tablets */\n@media (min-width: 640px) and (max-width: 767px) {\n .omniscribe_modal-container {\n max-width: 70vw;\n }\n}\n\n\n/* Source: shared/components/select.css */\n.omniscribe_select-container {\n position: relative;\n width: 100%;\n padding-block: calc(var(--spacing) * 3);\n}\n.omniscribe_select-button {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: calc(var(--spacing) * 3);\n background-color: var(--white);\n border-radius: var(--Radius-radius-medium, 8px);\n border: solid 1px var(--omniscribe-border, var(--light-border));\n cursor: pointer;\n}\n.omniscribe_select-button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n.omniscribe_select-text {\n display: flex;\n align-items: center;\n gap: calc(var(--spacing) * 2);\n}\n.omniscribe_select-content-container {\n position: absolute;\n width: 100%;\n margin-top: calc(var(--spacing) * 2);\n border: solid 1px var(--omniscribe-border, var(--light-border));\n background-color: var(--white);\n border-radius: var(--radius);\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n bottom: calc(var(--spacing) * 15);\n padding-inline: calc(var(--spacing) * 1);\n padding-block: calc(var(--spacing) * 0.5);\n z-index: 9999;\n}\n.omniscribe_select-content-ul {\n overflow-y: scroll;\n max-height: calc(var(--spacing) * 44);\n padding-inline: 5px;\n}\n.omniscribe_select-content-li {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: calc(var(--spacing) * 3);\n cursor: pointer;\n &:hover {\n @media (hover: hover) {\n background-color: var(--omniscribe-surface-alt, var(--color-gray-100));\n }\n }\n}\n.omniscribe_select-check-icon {\n width: calc(var(--spacing) * 5);\n height: calc(var(--spacing) * 5);\n color: var(--color-slate-500) /* oklch(55.4% 0.046 257.417) = #62748e */;\n}\n.omniscribe_select-content-li-span {\n display: flex;\n align-items: center;\n gap: calc(0.25rem /* 4px */ * 2);\n}\n\n\n/* Source: shared/components/separator.css */\n/* Separator Component Styles */\n.omniscribe_separator {\n border: 1px solid var(--omniscribe-border, #e5e7ec);\n flex-shrink: 0;\n}\n\n.omniscribe_separator--horizontal {\n height: 0;\n width: 100%;\n border-top: 1px solid var(--omniscribe-border, #e5e7ec);\n border-right: none;\n border-bottom: none;\n border-left: none;\n}\n\n.omniscribe_separator--vertical {\n width: 0;\n height: 100%;\n border-left: 1px solid var(--omniscribe-border, #e5e7ec);\n border-top: none;\n border-right: none;\n border-bottom: none;\n}\n\n\n/* Source: shared/components/skeleton.css */\n.omniscribe_skeleton {\n background-color: color-mix(in oklab, var(--primary) 10%, transparent);\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n}\n\n\n/* Source: shared/components/textarea.css */\n.omniscribe_textarea-default {\n display: flex;\n min-height: calc(var(--spacing) * 16);\n width: -webkit-fill-available;\n border-radius: calc(var(--radius) /* 0.25rem = 4px */ - 2px);\n border: solid 1px var(--input);\n background-color: transparent;\n padding-inline: calc(var(--spacing) * 3);\n padding-block: calc(var(--spacing) * 2);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition-property: color, box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n &::placeholder {\n color: var(--muted-foreground);\n font-size: var(--text-sm) /* 0.875rem = 14px */;\n line-height: var(--text-sm--line-height);\n }\n &:focus-visible {\n border-color: var(--ring);\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n box-shadow: var(--tw-ring-inset,) 0 0 0\n calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentColor);\n }\n &[aria-invalid='true'] {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n border-color: var(--destructive);\n }\n &:disabled {\n cursor: not-allowed;\n opacity: 50%;\n }\n}\n\n.omniscribe_textarea-secondary {\n padding: calc(var(--spacing) * 3.5);\n padding-bottom: calc(var(--spacing) * 0);\n border-style: none;\n background-color: transparent;\n resize: none;\n &:focus {\n outline-style: none;\n }\n}\n.omniscribe_textarea-general {\n font-family: 'Lato', sans-serif;\n font-size: var(--font-size-100);\n outline: none;\n}\n\n\n/* Source: shared/components/toast.css */\n.omniscribe_toast-stack {\n position: fixed;\n top: calc(var(--spacing) * 4);\n right: calc(var(--spacing) * 4);\n display: flex;\n flex-direction: column;\n gap: calc(var(--spacing) * 2);\n z-index: 9999;\n pointer-events: none;\n}\n\n.omniscribe_toast-item {\n border-radius: var(--radius);\n padding: calc(var(--spacing) * 4);\n width: calc(var(--spacing) * 120);\n display: flex;\n align-items: flex-start;\n transition:\n transform 300ms cubic-bezier(0.4, 0, 0.2, 1),\n opacity 300ms cubic-bezier(0.4, 0, 0.2, 1);\n pointer-events: auto;\n}\n\n.omniscribe_toast-item-danger {\n background-color: var(--color-red-500);\n}\n.omniscribe_toast-item-black {\n background-color: var(--black);\n}\n.omniscribe_toast-item-show {\n transform: translateX(0);\n opacity: 1;\n}\n.omniscribe_toast-item-hide {\n transform: translateX(120%);\n opacity: 0;\n}\n.omniscribe_toast-subcontainer {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 100ms;\n display: flex;\n flex-direction: column;\n color: var(--white);\n flex: 1;\n}\n.omniscribe_toast-title {\n font-size: 18px;\n font-weight: var(--font-weight-bold);\n}\n.omniscribe_toast-msg {\n font-size: 16px;\n}\n.omniscribe_toast-close {\n background: none;\n border: none;\n color: var(--white);\n font-size: 18px;\n cursor: pointer;\n padding: calc(var(--spacing) * 1) calc(var(--spacing) * 2);\n align-self: flex-start;\n opacity: 0.8;\n}\n.omniscribe_toast-close:hover {\n opacity: 1;\n}\n\n\n/* Source: shared/components/toggle.css */\n.omniscribe_toggle-container {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n flex-direction: column;\n}\n\n.omniscribe_toggle-label {\n font-size: 14px;\n font-weight: 400;\n color: var(--omniscribe-text, #374151);\n flex: 1;\n}\n\n.omniscribe_toggle-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.omniscribe_toggle-switch {\n position: relative;\n width: 29px;\n height: 16px;\n background-color: #d1d5db;\n border-radius: 8px;\n border: none;\n cursor: pointer;\n transition: background-color 0.2s ease;\n outline: none;\n}\n\n.omniscribe_toggle-switch:focus-visible {\n box-shadow: 0 0 0 2px var(--secondary, #132caa);\n}\n\n.omniscribe_toggle-switch-checked {\n background-color: var(--secondary, #132caa);\n}\n\n.omniscribe_toggle-switch-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.omniscribe_toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n /* High-contrast fill that sits on top of the track — must contrast the */\n /* track color, not inherit the panel surface (which would vanish in a */\n /* dark theme). Hosts theming dark set --omniscribe-on-accent to a dark */\n /* ink; light hosts fall back to white (unchanged). */\n background-color: var(--omniscribe-on-accent, white);\n border-radius: 50%;\n transition: transform 0.2s ease;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.omniscribe_toggle-switch-checked .omniscribe_toggle-thumb {\n transform: translateX(13px);\n}\n\n.omniscribe_toggle-status {\n font-size: 14px;\n font-weight: 500;\n color: var(--omniscribe-text-muted, #6b7280);\n min-width: 70px;\n}\n\n.omniscribe_toggle-switch-checked + .omniscribe_toggle-status {\n color: var(--omniscribe-text-muted, #4a5364);\n}\n\n\n/* Source: shared/components/tooltip.css */\n.tooltip-base {\n position: fixed;\n z-index: 9999;\n border-radius: 0.375rem; /* rounded-md */\n background-color: #111827;\n padding: 0.5rem 0.75rem; /* px-3 py-2 */\n font-size: 0.875rem; /* text-sm */\n font-family: 'Lato', sans-serif;\n color: #ffffff; /* text-white */\n box-shadow:\n 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* shadow-lg */\n transition: opacity 0.2s ease-in-out; /* transition-opacity duration-200 */\n pointer-events: none;\n user-select: none;\n word-wrap: break-word;\n line-height: 1.4;\n}\n\n/* Tooltip Arrow Styles */\n.tooltip-arrow {\n position: absolute;\n width: 0.5rem; /* w-2 */\n height: 0.5rem; /* h-2 */\n background-color: #111827;\n transform: rotate(45deg);\n}\n\n/* Arrow positioning for each side */\n.tooltip-arrow-top {\n bottom: -0.25rem; /* bottom-[-4px] */\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-bottom {\n top: -0.25rem; /* top-[-4px] */\n left: 50%;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-left {\n right: -0.25rem; /* right-[-4px] */\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tooltip-arrow-right {\n left: -0.25rem; /* left-[-4px] */\n top: 50%;\n transform: translateY(-50%) rotate(45deg);\n}\n\n/* Width classes based on message length */\n.tooltip-width-auto {\n width: auto;\n white-space: nowrap;\n}\n\n.tooltip-width-200 {\n width: auto;\n max-width: 200px;\n}\n\n.tooltip-width-xs {\n width: auto;\n max-width: 20rem; /* max-w-xs */\n}\n\n.tooltip-width-sm {\n width: auto;\n max-width: 24rem; /* max-w-sm */\n}\n\n.tooltip-width-400 {\n width: auto;\n max-width: 400px;\n}\n\n/* Trigger container styles */\n.tooltip-trigger {\n display: inline-flex;\n}\n\n/* Animation classes */\n.tooltip-enter {\n opacity: 0;\n transform: scale(0.95);\n}\n\n.tooltip-enter-active {\n opacity: 1;\n transform: scale(1);\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n\n.tooltip-exit {\n opacity: 1;\n transform: scale(1);\n}\n\n.tooltip-exit-active {\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity 0.15s ease-in-out,\n transform 0.15s ease-in-out;\n}\n\n/* Dark theme variant */\n.tooltip-dark {\n background-color: #1f2937; /* bg-gray-800 */\n color: var(--grey-50);\n}\n\n.tooltip-dark .tooltip-arrow {\n background-color: #1f2937;\n}\n\n/* Light theme variant */\n.tooltip-light {\n background-color: var(--omniscribe-surface, #ffffff);\n color: var(--omniscribe-text, #374151); /* text-gray-700 */\n box-shadow:\n 0 10px 15px -3px rgba(0, 0, 0, 0.1),\n 0 4px 6px -2px rgba(0, 0, 0, 0.05),\n 0 0 0 1px rgba(0, 0, 0, 0.05);\n}\n\n.tooltip-light .tooltip-arrow {\n background-color: var(--omniscribe-surface, #ffffff);\n}\n\n/* Responsive breakpoints */\n@media (max-width: 640px) {\n .tooltip-base {\n max-width: calc(100vw - 2rem);\n font-size: 0.8125rem; /* Slightly smaller on mobile */\n }\n\n .tooltip-width-400,\n .tooltip-width-sm,\n .tooltip-width-xs {\n max-width: calc(100vw - 2rem);\n }\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .tooltip-base {\n border: 2px solid #ffffff;\n }\n\n .tooltip-light {\n border: 2px solid #000000;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .tooltip-base,\n .tooltip-enter-active,\n .tooltip-exit-active {\n transition: none;\n }\n}\n\n\n/* Source: test/mocks/empty.css */\n/* Empty CSS file for mocking styles */\n";
|
|
169190
169785
|
|
|
169191
169786
|
const injectedCss$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
|
|
169192
169787
|
__proto__: null,
|