@omniloy/sofia-sdk 1.0.3 → 1.0.4
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.es.js +915 -125
- package/dist/legacy/webcomponents.umd.js +915 -125
- package/dist/react/index.css +39 -12
- package/dist/react/index.es.js +948 -123
- package/dist/webcomponents.es.js +893 -111
- package/dist/webcomponents.umd.js +893 -111
- package/package.json +1 -1
|
@@ -14986,7 +14986,7 @@ const {
|
|
|
14986
14986
|
getAdapter,
|
|
14987
14987
|
mergeConfig: mergeConfig$1
|
|
14988
14988
|
} = axios;
|
|
14989
|
-
const version$2 = "1.0.
|
|
14989
|
+
const version$2 = "1.0.4";
|
|
14990
14990
|
const handleApiError$1 = async (error) => {
|
|
14991
14991
|
return Promise.reject(error);
|
|
14992
14992
|
};
|
|
@@ -15580,7 +15580,24 @@ const ar = {
|
|
|
15580
15580
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "الحقول المنسدلة مثل الحساسية والتاريخ والتشخيصات يتم ملؤها دائماً.",
|
|
15581
15581
|
"Disable field": "تعطيل الحقل",
|
|
15582
15582
|
"Enable field": "تمكين الحقل",
|
|
15583
|
-
"Customize field prompt": "تخصيص أمر الحقل"
|
|
15583
|
+
"Customize field prompt": "تخصيص أمر الحقل",
|
|
15584
|
+
"Microphone disconnected": "تم فصل الميكروفون",
|
|
15585
|
+
"The microphone was disconnected during recording": "تم فصل الميكروفون أثناء التسجيل",
|
|
15586
|
+
"Microphone reconnected": "تم إعادة توصيل الميكروفون",
|
|
15587
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'تم فصل الميكروفون لفترة وجيزة. قد يكون جزء من التسجيل بعد "{lastPhrase}" قد فُقد.',
|
|
15588
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "تم فصل الميكروفون لفترة وجيزة. قد يكون جزء من التسجيل قد فُقد.",
|
|
15589
|
+
"Recording interrupted": "تم إيقاف التسجيل",
|
|
15590
|
+
"The server closed the session unexpectedly. Please start recording again.": "أغلق الخادم الجلسة بشكل غير متوقع. يرجى بدء التسجيل مرة أخرى.",
|
|
15591
|
+
"Microphone changed": "تم تغيير الميكروفون",
|
|
15592
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "الميكروفون الذي اخترته غير متاح. يستمر التسجيل باستخدام الميكروفون الافتراضي.",
|
|
15593
|
+
"No microphone available": "لا يوجد ميكروفون متاح",
|
|
15594
|
+
"Connect a microphone and try again.": "قم بتوصيل ميكروفون وحاول مرة أخرى.",
|
|
15595
|
+
"Connection lost": "انقطع الاتصال",
|
|
15596
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "انقطع اتصال الإنترنت أثناء التسجيل. قد لا يصل الصوت إلى الخادم حتى يتم استعادة الاتصال.",
|
|
15597
|
+
"Connection restored": "تم استعادة الاتصال",
|
|
15598
|
+
"Internet connection has been restored. Recording continues normally.": "تم استعادة اتصال الإنترنت. يستمر التسجيل بشكل طبيعي.",
|
|
15599
|
+
"Slow connection": "اتصال بطيء",
|
|
15600
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "يبدو أن اتصالك بالإنترنت بطيء. قد يتأخر بعض الصوت."
|
|
15584
15601
|
};
|
|
15585
15602
|
const Add$b = "Afegir";
|
|
15586
15603
|
const Configuration$c = "Configuració";
|
|
@@ -15855,7 +15872,24 @@ const ca = {
|
|
|
15855
15872
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Els camps desplegables com al·lèrgies, antecedents i diagnòstics s'omplen sempre.",
|
|
15856
15873
|
"Disable field": "Desactivar camp",
|
|
15857
15874
|
"Enable field": "Activar camp",
|
|
15858
|
-
"Customize field prompt": "Personalitzar prompt del camp"
|
|
15875
|
+
"Customize field prompt": "Personalitzar prompt del camp",
|
|
15876
|
+
"Microphone disconnected": "Micròfon desconnectat",
|
|
15877
|
+
"The microphone was disconnected during recording": "El micròfon s'ha desconnectat durant la gravació",
|
|
15878
|
+
"Microphone reconnected": "Micròfon reconnectat",
|
|
15879
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': `El micròfon s'ha desconnectat breument. Part de la gravació després de "{lastPhrase}" pot haver-se perdut.`,
|
|
15880
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "El micròfon s'ha desconnectat breument. Part de la gravació pot haver-se perdut.",
|
|
15881
|
+
"Recording interrupted": "Gravació interrompuda",
|
|
15882
|
+
"The server closed the session unexpectedly. Please start recording again.": "El servidor ha tancat la sessió inesperadament. Si us plau, inicia la gravació de nou.",
|
|
15883
|
+
"Microphone changed": "Micròfon canviat",
|
|
15884
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "El micròfon seleccionat no estava disponible. La gravació continua amb el micròfon per defecte.",
|
|
15885
|
+
"No microphone available": "No hi ha cap micròfon disponible",
|
|
15886
|
+
"Connect a microphone and try again.": "Connecta un micròfon i torna-ho a provar.",
|
|
15887
|
+
"Connection lost": "Connexió perduda",
|
|
15888
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "S'ha perdut la connexió a Internet durant la gravació. L'àudio podria no arribar al servidor fins que es restableixi la connexió.",
|
|
15889
|
+
"Connection restored": "Connexió restablerta",
|
|
15890
|
+
"Internet connection has been restored. Recording continues normally.": "La connexió a Internet s'ha restablert. La gravació continua normalment.",
|
|
15891
|
+
"Slow connection": "Connexió lenta",
|
|
15892
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "La teva connexió a Internet sembla lenta. Part de l'àudio podria retardar-se."
|
|
15859
15893
|
};
|
|
15860
15894
|
const Add$a = "Afegir";
|
|
15861
15895
|
const Configuration$b = "Configuració";
|
|
@@ -16130,7 +16164,24 @@ const ca_valencia = {
|
|
|
16130
16164
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Els camps desplegables com al·lèrgies, antecedents i diagnòstics s'omplin sempre.",
|
|
16131
16165
|
"Disable field": "Desactivar camp",
|
|
16132
16166
|
"Enable field": "Activar camp",
|
|
16133
|
-
"Customize field prompt": "Personalitzar prompt del camp"
|
|
16167
|
+
"Customize field prompt": "Personalitzar prompt del camp",
|
|
16168
|
+
"Microphone disconnected": "Micròfon desconnectat",
|
|
16169
|
+
"The microphone was disconnected during recording": "El micròfon s'ha desconnectat durant la gravació",
|
|
16170
|
+
"Microphone reconnected": "Micròfon reconnectat",
|
|
16171
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': `El micròfon s'ha desconnectat breument. Part de la gravació després de "{lastPhrase}" pot haver-se perdut.`,
|
|
16172
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "El micròfon s'ha desconnectat breument. Part de la gravació pot haver-se perdut.",
|
|
16173
|
+
"Recording interrupted": "Gravació interrompuda",
|
|
16174
|
+
"The server closed the session unexpectedly. Please start recording again.": "El servidor ha tancat la sessió inesperadament. Per favor, inicia la gravació de nou.",
|
|
16175
|
+
"Microphone changed": "Micròfon canviat",
|
|
16176
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "El micròfon seleccionat no estava disponible. La gravació continua amb el micròfon per defecte.",
|
|
16177
|
+
"No microphone available": "No hi ha cap micròfon disponible",
|
|
16178
|
+
"Connect a microphone and try again.": "Connecta un micròfon i torna-ho a provar.",
|
|
16179
|
+
"Connection lost": "Connexió perduda",
|
|
16180
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "S'ha perdut la connexió a Internet durant la gravació. L'àudio podria no arribar al servidor fins que es restableixi la connexió.",
|
|
16181
|
+
"Connection restored": "Connexió restablerta",
|
|
16182
|
+
"Internet connection has been restored. Recording continues normally.": "La connexió a Internet s'ha restablert. La gravació continua normalment.",
|
|
16183
|
+
"Slow connection": "Connexió lenta",
|
|
16184
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "La teva connexió a Internet sembla lenta. Part de l'àudio podria retardar-se."
|
|
16134
16185
|
};
|
|
16135
16186
|
const Add$9 = "Přidat";
|
|
16136
16187
|
const Configuration$a = "Konfigurace";
|
|
@@ -16405,7 +16456,24 @@ const cs = {
|
|
|
16405
16456
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Rozbalovací pole jako alergie, historie a diagnózy jsou vždy vyplněna.",
|
|
16406
16457
|
"Disable field": "Zakázat pole",
|
|
16407
16458
|
"Enable field": "Povolit pole",
|
|
16408
|
-
"Customize field prompt": "Přizpůsobit prompt pole"
|
|
16459
|
+
"Customize field prompt": "Přizpůsobit prompt pole",
|
|
16460
|
+
"Microphone disconnected": "Mikrofon odpojen",
|
|
16461
|
+
"The microphone was disconnected during recording": "Mikrofon byl odpojen během nahrávání",
|
|
16462
|
+
"Microphone reconnected": "Mikrofon znovu připojen",
|
|
16463
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'Mikrofon byl krátce odpojen. Část nahrávky po "{lastPhrase}" mohla být ztracena.',
|
|
16464
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "Mikrofon byl krátce odpojen. Část nahrávky mohla být ztracena.",
|
|
16465
|
+
"Recording interrupted": "Nahrávání přerušeno",
|
|
16466
|
+
"The server closed the session unexpectedly. Please start recording again.": "Server neočekávaně ukončil relaci. Zahajte nahrávání znovu.",
|
|
16467
|
+
"Microphone changed": "Mikrofon změněn",
|
|
16468
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Vybraný mikrofon nebyl dostupný. Nahrávání pokračuje s výchozím mikrofonem.",
|
|
16469
|
+
"No microphone available": "Žádný mikrofon není k dispozici",
|
|
16470
|
+
"Connect a microphone and try again.": "Připojte mikrofon a zkuste to znovu.",
|
|
16471
|
+
"Connection lost": "Spojení ztraceno",
|
|
16472
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Během nahrávání bylo ztraceno internetové připojení. Zvuk nemusí dorazit na server, dokud nebude připojení obnoveno.",
|
|
16473
|
+
"Connection restored": "Spojení obnoveno",
|
|
16474
|
+
"Internet connection has been restored. Recording continues normally.": "Internetové připojení bylo obnoveno. Nahrávání pokračuje normálně.",
|
|
16475
|
+
"Slow connection": "Pomalé připojení",
|
|
16476
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Vaše internetové připojení se zdá být pomalé. Část zvuku může být zpožděna."
|
|
16409
16477
|
};
|
|
16410
16478
|
const Add$8 = "Add";
|
|
16411
16479
|
const Configuration$9 = "Configuration";
|
|
@@ -16680,7 +16748,24 @@ const en_GB = {
|
|
|
16680
16748
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Dropdown fields like allergies, history and diagnoses are always filled.",
|
|
16681
16749
|
"Disable field": "Disable field",
|
|
16682
16750
|
"Enable field": "Enable field",
|
|
16683
|
-
"Customize field prompt": "Customise field prompt"
|
|
16751
|
+
"Customize field prompt": "Customise field prompt",
|
|
16752
|
+
"Microphone disconnected": "Microphone disconnected",
|
|
16753
|
+
"The microphone was disconnected during recording": "The microphone was disconnected during recording",
|
|
16754
|
+
"Microphone reconnected": "Microphone reconnected",
|
|
16755
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.',
|
|
16756
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "The microphone was briefly disconnected. Part of the recording may have been lost.",
|
|
16757
|
+
"Recording interrupted": "Recording interrupted",
|
|
16758
|
+
"The server closed the session unexpectedly. Please start recording again.": "The server closed the session unexpectedly. Please start recording again.",
|
|
16759
|
+
"Microphone changed": "Microphone changed",
|
|
16760
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Your selected microphone was unavailable. Recording continues with the default microphone.",
|
|
16761
|
+
"No microphone available": "No microphone available",
|
|
16762
|
+
"Connect a microphone and try again.": "Connect a microphone and try again.",
|
|
16763
|
+
"Connection lost": "Connection lost",
|
|
16764
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Internet connection was lost during recording. Audio may not reach the server until the connection is restored.",
|
|
16765
|
+
"Connection restored": "Connection restored",
|
|
16766
|
+
"Internet connection has been restored. Recording continues normally.": "Internet connection has been restored. Recording continues normally.",
|
|
16767
|
+
"Slow connection": "Slow connection",
|
|
16768
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Your internet connection appears to be slow. Some audio may be delayed."
|
|
16684
16769
|
};
|
|
16685
16770
|
const Add$7 = "Add";
|
|
16686
16771
|
const Configuration$8 = "Configuration";
|
|
@@ -16955,7 +17040,24 @@ const en_US = {
|
|
|
16955
17040
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Dropdown fields like allergies, history and diagnoses are always filled.",
|
|
16956
17041
|
"Disable field": "Disable field",
|
|
16957
17042
|
"Enable field": "Enable field",
|
|
16958
|
-
"Customize field prompt": "Customize field prompt"
|
|
17043
|
+
"Customize field prompt": "Customize field prompt",
|
|
17044
|
+
"Microphone disconnected": "Microphone disconnected",
|
|
17045
|
+
"The microphone was disconnected during recording": "The microphone was disconnected during recording",
|
|
17046
|
+
"Microphone reconnected": "Microphone reconnected",
|
|
17047
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.',
|
|
17048
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "The microphone was briefly disconnected. Part of the recording may have been lost.",
|
|
17049
|
+
"Recording interrupted": "Recording interrupted",
|
|
17050
|
+
"The server closed the session unexpectedly. Please start recording again.": "The server closed the session unexpectedly. Please start recording again.",
|
|
17051
|
+
"Microphone changed": "Microphone changed",
|
|
17052
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Your selected microphone was unavailable. Recording continues with the default microphone.",
|
|
17053
|
+
"No microphone available": "No microphone available",
|
|
17054
|
+
"Connect a microphone and try again.": "Connect a microphone and try again.",
|
|
17055
|
+
"Connection lost": "Connection lost",
|
|
17056
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Internet connection was lost during recording. Audio may not reach the server until the connection is restored.",
|
|
17057
|
+
"Connection restored": "Connection restored",
|
|
17058
|
+
"Internet connection has been restored. Recording continues normally.": "Internet connection has been restored. Recording continues normally.",
|
|
17059
|
+
"Slow connection": "Slow connection",
|
|
17060
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Your internet connection appears to be slow. Some audio may be delayed."
|
|
16959
17061
|
};
|
|
16960
17062
|
const Add$6 = "Añadir";
|
|
16961
17063
|
const Configuration$7 = "Configuración";
|
|
@@ -17230,7 +17332,24 @@ const es = {
|
|
|
17230
17332
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Los campos desplegables como alergias, antecedentes y diagnósticos se rellenan siempre.",
|
|
17231
17333
|
"Disable field": "Desactivar campo",
|
|
17232
17334
|
"Enable field": "Activar campo",
|
|
17233
|
-
"Customize field prompt": "Personalizar prompt del campo"
|
|
17335
|
+
"Customize field prompt": "Personalizar prompt del campo",
|
|
17336
|
+
"Microphone disconnected": "Micrófono desconectado",
|
|
17337
|
+
"The microphone was disconnected during recording": "El micrófono se desconectó durante la grabación",
|
|
17338
|
+
"Microphone reconnected": "Micrófono reconectado",
|
|
17339
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'El micrófono se desconectó brevemente. Parte de la grabación después de "{lastPhrase}" puede haberse perdido.',
|
|
17340
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "El micrófono se desconectó brevemente. Parte de la grabación puede haberse perdido.",
|
|
17341
|
+
"Recording interrupted": "Grabación interrumpida",
|
|
17342
|
+
"The server closed the session unexpectedly. Please start recording again.": "El servidor cerró la sesión inesperadamente. Vuelve a iniciar la grabación.",
|
|
17343
|
+
"Microphone changed": "Micrófono cambiado",
|
|
17344
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "El micrófono seleccionado no estaba disponible. La grabación continúa con el micrófono predeterminado.",
|
|
17345
|
+
"No microphone available": "No hay ningún micrófono disponible",
|
|
17346
|
+
"Connect a microphone and try again.": "Conecta un micrófono e inténtalo de nuevo.",
|
|
17347
|
+
"Connection lost": "Conexión perdida",
|
|
17348
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Se perdió la conexión a internet durante la grabación. El audio podría no llegar al servidor hasta que se restablezca la conexión.",
|
|
17349
|
+
"Connection restored": "Conexión restablecida",
|
|
17350
|
+
"Internet connection has been restored. Recording continues normally.": "La conexión a internet se ha restablecido. La grabación continúa normalmente.",
|
|
17351
|
+
"Slow connection": "Conexión lenta",
|
|
17352
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Tu conexión a internet parece ser lenta. Parte del audio podría retrasarse."
|
|
17234
17353
|
};
|
|
17235
17354
|
const Add$5 = "Ajouter";
|
|
17236
17355
|
const Configuration$6 = "Configuration";
|
|
@@ -17505,7 +17624,24 @@ const fr = {
|
|
|
17505
17624
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Les champs déroulants comme les allergies, les antécédents et les diagnostics sont toujours remplis.",
|
|
17506
17625
|
"Disable field": "Désactiver le champ",
|
|
17507
17626
|
"Enable field": "Activer le champ",
|
|
17508
|
-
"Customize field prompt": "Personnaliser le prompt du champ"
|
|
17627
|
+
"Customize field prompt": "Personnaliser le prompt du champ",
|
|
17628
|
+
"Microphone disconnected": "Microphone déconnecté",
|
|
17629
|
+
"The microphone was disconnected during recording": "Le microphone a été déconnecté pendant l'enregistrement",
|
|
17630
|
+
"Microphone reconnected": "Microphone reconnecté",
|
|
17631
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': `Le microphone a été brièvement déconnecté. Une partie de l'enregistrement après "{lastPhrase}" a pu être perdue.`,
|
|
17632
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "Le microphone a été brièvement déconnecté. Une partie de l'enregistrement a pu être perdue.",
|
|
17633
|
+
"Recording interrupted": "Enregistrement interrompu",
|
|
17634
|
+
"The server closed the session unexpectedly. Please start recording again.": "Le serveur a fermé la session de manière inattendue. Veuillez relancer l'enregistrement.",
|
|
17635
|
+
"Microphone changed": "Microphone modifié",
|
|
17636
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Le microphone sélectionné n'était pas disponible. L'enregistrement continue avec le microphone par défaut.",
|
|
17637
|
+
"No microphone available": "Aucun microphone disponible",
|
|
17638
|
+
"Connect a microphone and try again.": "Connectez un microphone et réessayez.",
|
|
17639
|
+
"Connection lost": "Connexion perdue",
|
|
17640
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "La connexion Internet a été perdue pendant l'enregistrement. L'audio pourrait ne pas atteindre le serveur tant que la connexion n'est pas rétablie.",
|
|
17641
|
+
"Connection restored": "Connexion rétablie",
|
|
17642
|
+
"Internet connection has been restored. Recording continues normally.": "La connexion Internet a été rétablie. L'enregistrement continue normalement.",
|
|
17643
|
+
"Slow connection": "Connexion lente",
|
|
17644
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Votre connexion Internet semble lente. Une partie de l'audio pourrait être retardée."
|
|
17509
17645
|
};
|
|
17510
17646
|
const Add$4 = "जोड़ें";
|
|
17511
17647
|
const Configuration$5 = "कॉन्फ़िगरेशन";
|
|
@@ -17762,7 +17898,24 @@ const hi = {
|
|
|
17762
17898
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "एलर्जी, इतिहास और निदान जैसी ड्रॉपडाउन फ़ील्ड हमेशा भरी जाती हैं।",
|
|
17763
17899
|
"Disable field": "फ़ील्ड अक्षम करें",
|
|
17764
17900
|
"Enable field": "फ़ील्ड सक्षम करें",
|
|
17765
|
-
"Customize field prompt": "फ़ील्ड प्रॉम्प्ट अनुकूलित करें"
|
|
17901
|
+
"Customize field prompt": "फ़ील्ड प्रॉम्प्ट अनुकूलित करें",
|
|
17902
|
+
"Microphone disconnected": "माइक्रोफ़ोन डिस्कनेक्ट हो गया",
|
|
17903
|
+
"The microphone was disconnected during recording": "रिकॉर्डिंग के दौरान माइक्रोफ़ोन डिस्कनेक्ट हो गया",
|
|
17904
|
+
"Microphone reconnected": "माइक्रोफ़ोन फिर से कनेक्ट हो गया",
|
|
17905
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'माइक्रोफ़ोन कुछ समय के लिए डिस्कनेक्ट हो गया था। "{lastPhrase}" के बाद की रिकॉर्डिंग का कुछ हिस्सा खो गया हो सकता है।',
|
|
17906
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "माइक्रोफ़ोन कुछ समय के लिए डिस्कनेक्ट हो गया था। रिकॉर्डिंग का कुछ हिस्सा खो गया हो सकता है।",
|
|
17907
|
+
"Recording interrupted": "रिकॉर्डिंग बाधित हुई",
|
|
17908
|
+
"The server closed the session unexpectedly. Please start recording again.": "सर्वर ने सत्र अप्रत्याशित रूप से बंद कर दिया। कृपया रिकॉर्डिंग फिर से शुरू करें।",
|
|
17909
|
+
"Microphone changed": "माइक्रोफ़ोन बदल गया",
|
|
17910
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "आपका चुना गया माइक्रोफ़ोन उपलब्ध नहीं था। रिकॉर्डिंग डिफ़ॉल्ट माइक्रोफ़ोन के साथ जारी है।",
|
|
17911
|
+
"No microphone available": "कोई माइक्रोफ़ोन उपलब्ध नहीं है",
|
|
17912
|
+
"Connect a microphone and try again.": "माइक्रोफ़ोन कनेक्ट करें और पुनः प्रयास करें।",
|
|
17913
|
+
"Connection lost": "कनेक्शन टूट गया",
|
|
17914
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "रिकॉर्डिंग के दौरान इंटरनेट कनेक्शन टूट गया। कनेक्शन बहाल होने तक ऑडियो सर्वर तक नहीं पहुँच सकता।",
|
|
17915
|
+
"Connection restored": "कनेक्शन बहाल हो गया",
|
|
17916
|
+
"Internet connection has been restored. Recording continues normally.": "इंटरनेट कनेक्शन बहाल हो गया है। रिकॉर्डिंग सामान्य रूप से जारी है।",
|
|
17917
|
+
"Slow connection": "धीमा कनेक्शन",
|
|
17918
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "आपका इंटरनेट कनेक्शन धीमा लग रहा है। कुछ ऑडियो में देरी हो सकती है।"
|
|
17766
17919
|
};
|
|
17767
17920
|
const Add$3 = "Tambahkan";
|
|
17768
17921
|
const Configuration$4 = "Konfigurasi";
|
|
@@ -18018,7 +18171,24 @@ const id = {
|
|
|
18018
18171
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Bidang dropdown seperti alergi, riwayat, dan diagnosis selalu diisi.",
|
|
18019
18172
|
"Disable field": "Nonaktifkan bidang",
|
|
18020
18173
|
"Enable field": "Aktifkan bidang",
|
|
18021
|
-
"Customize field prompt": "Sesuaikan prompt bidang"
|
|
18174
|
+
"Customize field prompt": "Sesuaikan prompt bidang",
|
|
18175
|
+
"Microphone disconnected": "Mikrofon terputus",
|
|
18176
|
+
"The microphone was disconnected during recording": "Mikrofon terputus saat merekam",
|
|
18177
|
+
"Microphone reconnected": "Mikrofon tersambung kembali",
|
|
18178
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'Mikrofon sempat terputus. Sebagian rekaman setelah "{lastPhrase}" mungkin hilang.',
|
|
18179
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "Mikrofon sempat terputus. Sebagian rekaman mungkin hilang.",
|
|
18180
|
+
"Recording interrupted": "Rekaman terganggu",
|
|
18181
|
+
"The server closed the session unexpectedly. Please start recording again.": "Server menutup sesi secara tak terduga. Silakan mulai merekam lagi.",
|
|
18182
|
+
"Microphone changed": "Mikrofon berubah",
|
|
18183
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Mikrofon yang Anda pilih tidak tersedia. Rekaman berlanjut dengan mikrofon default.",
|
|
18184
|
+
"No microphone available": "Tidak ada mikrofon yang tersedia",
|
|
18185
|
+
"Connect a microphone and try again.": "Sambungkan mikrofon dan coba lagi.",
|
|
18186
|
+
"Connection lost": "Koneksi terputus",
|
|
18187
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Koneksi internet terputus saat merekam. Audio mungkin tidak sampai ke server hingga koneksi dipulihkan.",
|
|
18188
|
+
"Connection restored": "Koneksi dipulihkan",
|
|
18189
|
+
"Internet connection has been restored. Recording continues normally.": "Koneksi internet telah dipulihkan. Perekaman berlanjut secara normal.",
|
|
18190
|
+
"Slow connection": "Koneksi lambat",
|
|
18191
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Koneksi internet Anda tampak lambat. Sebagian audio mungkin tertunda."
|
|
18022
18192
|
};
|
|
18023
18193
|
const Add$2 = "ਸ਼ਾਮਲ ਕਰੋ";
|
|
18024
18194
|
const Configuration$3 = "ਸੈਟਿੰਗਾਂ";
|
|
@@ -18293,7 +18463,24 @@ const pa = {
|
|
|
18293
18463
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "ਐਲਰਜੀ, ਇਤਿਹਾਸ ਅਤੇ ਤਸ਼ਖੀਸ ਵਰਗੇ ਡ੍ਰਾਪਡਾਊਨ ਫੀਲਡ ਹਮੇਸ਼ਾ ਭਰੇ ਜਾਂਦੇ ਹਨ।",
|
|
18294
18464
|
"Disable field": "ਫੀਲਡ ਬੰਦ ਕਰੋ",
|
|
18295
18465
|
"Enable field": "ਫੀਲਡ ਚਾਲੂ ਕਰੋ",
|
|
18296
|
-
"Customize field prompt": "ਫੀਲਡ ਪ੍ਰੋਂਪਟ ਕਸਟਮਾਈਜ਼ ਕਰੋ"
|
|
18466
|
+
"Customize field prompt": "ਫੀਲਡ ਪ੍ਰੋਂਪਟ ਕਸਟਮਾਈਜ਼ ਕਰੋ",
|
|
18467
|
+
"Microphone disconnected": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ",
|
|
18468
|
+
"The microphone was disconnected during recording": "ਰਿਕਾਰਡਿੰਗ ਦੌਰਾਨ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ",
|
|
18469
|
+
"Microphone reconnected": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੁਬਾਰਾ ਕਨੈਕਟ ਹੋ ਗਿਆ",
|
|
18470
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਥੋੜ੍ਹੇ ਸਮੇਂ ਲਈ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ ਸੀ। "{lastPhrase}" ਤੋਂ ਬਾਅਦ ਦੀ ਰਿਕਾਰਡਿੰਗ ਦਾ ਕੁਝ ਹਿੱਸਾ ਗੁਆਚ ਗਿਆ ਹੋ ਸਕਦਾ ਹੈ।',
|
|
18471
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਥੋੜ੍ਹੇ ਸਮੇਂ ਲਈ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ ਸੀ। ਰਿਕਾਰਡਿੰਗ ਦਾ ਕੁਝ ਹਿੱਸਾ ਗੁਆਚ ਗਿਆ ਹੋ ਸਕਦਾ ਹੈ।",
|
|
18472
|
+
"Recording interrupted": "ਰਿਕਾਰਡਿੰਗ ਵਿੱਚ ਰੁਕਾਵਟ",
|
|
18473
|
+
"The server closed the session unexpectedly. Please start recording again.": "ਸਰਵਰ ਨੇ ਸੈਸ਼ਨ ਅਚਾਨਕ ਬੰਦ ਕਰ ਦਿੱਤਾ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਰਿਕਾਰਡਿੰਗ ਸ਼ੁਰੂ ਕਰੋ।",
|
|
18474
|
+
"Microphone changed": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਦਲ ਗਿਆ",
|
|
18475
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "ਤੁਹਾਡਾ ਚੁਣਿਆ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਉਪਲਬਧ ਨਹੀਂ ਸੀ। ਰਿਕਾਰਡਿੰਗ ਡਿਫ਼ਾਲਟ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨਾਲ ਜਾਰੀ ਹੈ।",
|
|
18476
|
+
"No microphone available": "ਕੋਈ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ",
|
|
18477
|
+
"Connect a microphone and try again.": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਜੋੜੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
|
|
18478
|
+
"Connection lost": "ਕਨੈਕਸ਼ਨ ਟੁੱਟ ਗਿਆ",
|
|
18479
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "ਰਿਕਾਰਡਿੰਗ ਦੌਰਾਨ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਟੁੱਟ ਗਿਆ। ਕਨੈਕਸ਼ਨ ਬਹਾਲ ਹੋਣ ਤੱਕ ਆਡੀਓ ਸਰਵਰ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦਾ।",
|
|
18480
|
+
"Connection restored": "ਕਨੈਕਸ਼ਨ ਬਹਾਲ ਹੋ ਗਿਆ",
|
|
18481
|
+
"Internet connection has been restored. Recording continues normally.": "ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਬਹਾਲ ਹੋ ਗਿਆ ਹੈ। ਰਿਕਾਰਡਿੰਗ ਆਮ ਤੌਰ 'ਤੇ ਜਾਰੀ ਹੈ।",
|
|
18482
|
+
"Slow connection": "ਹੌਲੀ ਕਨੈਕਸ਼ਨ",
|
|
18483
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "ਤੁਹਾਡਾ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਹੌਲੀ ਲੱਗ ਰਿਹਾ ਹੈ। ਕੁਝ ਆਡੀਓ ਵਿੱਚ ਦੇਰੀ ਹੋ ਸਕਦੀ ਹੈ।"
|
|
18297
18484
|
};
|
|
18298
18485
|
const Add$1 = "Lägg till";
|
|
18299
18486
|
const Configuration$2 = "Konfiguration";
|
|
@@ -18568,7 +18755,24 @@ const sv = {
|
|
|
18568
18755
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "Rullgardinsfält som allergier, historik och diagnoser fylls alltid i.",
|
|
18569
18756
|
"Disable field": "Inaktivera fält",
|
|
18570
18757
|
"Enable field": "Aktivera fält",
|
|
18571
|
-
"Customize field prompt": "Anpassa fältprompt"
|
|
18758
|
+
"Customize field prompt": "Anpassa fältprompt",
|
|
18759
|
+
"Microphone disconnected": "Mikrofon frånkopplad",
|
|
18760
|
+
"The microphone was disconnected during recording": "Mikrofonen kopplades från under inspelningen",
|
|
18761
|
+
"Microphone reconnected": "Mikrofon återansluten",
|
|
18762
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'Mikrofonen kopplades kortvarigt från. Delar av inspelningen efter "{lastPhrase}" kan ha gått förlorade.',
|
|
18763
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "Mikrofonen kopplades kortvarigt från. Delar av inspelningen kan ha gått förlorade.",
|
|
18764
|
+
"Recording interrupted": "Inspelning avbruten",
|
|
18765
|
+
"The server closed the session unexpectedly. Please start recording again.": "Servern stängde sessionen oväntat. Starta inspelningen igen.",
|
|
18766
|
+
"Microphone changed": "Mikrofon ändrad",
|
|
18767
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "Den valda mikrofonen var inte tillgänglig. Inspelningen fortsätter med standardmikrofonen.",
|
|
18768
|
+
"No microphone available": "Ingen mikrofon tillgänglig",
|
|
18769
|
+
"Connect a microphone and try again.": "Anslut en mikrofon och försök igen.",
|
|
18770
|
+
"Connection lost": "Anslutning förlorad",
|
|
18771
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "Internetanslutningen förlorades under inspelningen. Ljud kanske inte når servern förrän anslutningen har återställts.",
|
|
18772
|
+
"Connection restored": "Anslutning återställd",
|
|
18773
|
+
"Internet connection has been restored. Recording continues normally.": "Internetanslutningen har återställts. Inspelningen fortsätter normalt.",
|
|
18774
|
+
"Slow connection": "Långsam anslutning",
|
|
18775
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "Din internetanslutning verkar vara långsam. Visst ljud kan fördröjas."
|
|
18572
18776
|
};
|
|
18573
18777
|
const Add = "شامل کریں";
|
|
18574
18778
|
const Configuration$1 = "ترتیبات";
|
|
@@ -18843,7 +19047,24 @@ const ur = {
|
|
|
18843
19047
|
"Dropdown fields like allergies, history and diagnoses are always filled.": "الرجی، تاریخ اور تشخیص جیسے ڈراپ ڈاؤن فیلڈز ہمیشہ بھرے جاتے ہیں۔",
|
|
18844
19048
|
"Disable field": "فیلڈ غیر فعال کریں",
|
|
18845
19049
|
"Enable field": "فیلڈ فعال کریں",
|
|
18846
|
-
"Customize field prompt": "فیلڈ پرامپٹ حسب ضرورت بنائیں"
|
|
19050
|
+
"Customize field prompt": "فیلڈ پرامپٹ حسب ضرورت بنائیں",
|
|
19051
|
+
"Microphone disconnected": "مائیکروفون منقطع ہو گیا",
|
|
19052
|
+
"The microphone was disconnected during recording": "ریکارڈنگ کے دوران مائیکروفون منقطع ہو گیا",
|
|
19053
|
+
"Microphone reconnected": "مائیکروفون دوبارہ جوڑ دیا گیا",
|
|
19054
|
+
'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.': 'مائیکروفون مختصر وقت کے لیے منقطع ہو گیا تھا۔ "{lastPhrase}" کے بعد ریکارڈنگ کا کچھ حصہ ضائع ہو سکتا ہے۔',
|
|
19055
|
+
"The microphone was briefly disconnected. Part of the recording may have been lost.": "مائیکروفون مختصر وقت کے لیے منقطع ہو گیا تھا۔ ریکارڈنگ کا کچھ حصہ ضائع ہو سکتا ہے۔",
|
|
19056
|
+
"Recording interrupted": "ریکارڈنگ میں رکاوٹ",
|
|
19057
|
+
"The server closed the session unexpectedly. Please start recording again.": "سرور نے سیشن غیر متوقع طور پر بند کر دیا۔ براہ کرم دوبارہ ریکارڈنگ شروع کریں۔",
|
|
19058
|
+
"Microphone changed": "مائیکروفون تبدیل ہو گیا",
|
|
19059
|
+
"Your selected microphone was unavailable. Recording continues with the default microphone.": "آپ کا منتخب کردہ مائیکروفون دستیاب نہیں تھا۔ ریکارڈنگ پہلے سے طے شدہ مائیکروفون کے ساتھ جاری ہے۔",
|
|
19060
|
+
"No microphone available": "کوئی مائیکروفون دستیاب نہیں",
|
|
19061
|
+
"Connect a microphone and try again.": "مائیکروفون جوڑیں اور دوبارہ کوشش کریں۔",
|
|
19062
|
+
"Connection lost": "کنکشن ٹوٹ گیا",
|
|
19063
|
+
"Internet connection was lost during recording. Audio may not reach the server until the connection is restored.": "ریکارڈنگ کے دوران انٹرنیٹ کنکشن ٹوٹ گیا۔ کنکشن بحال ہونے تک آڈیو سرور تک نہیں پہنچ سکتا۔",
|
|
19064
|
+
"Connection restored": "کنکشن بحال ہو گیا",
|
|
19065
|
+
"Internet connection has been restored. Recording continues normally.": "انٹرنیٹ کنکشن بحال ہو گیا ہے۔ ریکارڈنگ معمول کے مطابق جاری ہے۔",
|
|
19066
|
+
"Slow connection": "سست کنکشن",
|
|
19067
|
+
"Your internet connection appears to be slow. Some audio may be delayed.": "آپ کا انٹرنیٹ کنکشن سست لگ رہا ہے۔ کچھ آڈیو میں تاخیر ہو سکتی ہے۔"
|
|
18847
19068
|
};
|
|
18848
19069
|
var LanguageCode;
|
|
18849
19070
|
(function(LanguageCode2) {
|
|
@@ -24873,6 +25094,8 @@ const initialState$1 = {
|
|
|
24873
25094
|
audioContext: null,
|
|
24874
25095
|
processor: null,
|
|
24875
25096
|
source: null,
|
|
25097
|
+
processorStream: null,
|
|
25098
|
+
processorSocket: null,
|
|
24876
25099
|
isServerReady: false,
|
|
24877
25100
|
uuid: "",
|
|
24878
25101
|
isActive: false,
|
|
@@ -25202,16 +25425,19 @@ const AudioRecorderApi = {
|
|
|
25202
25425
|
}
|
|
25203
25426
|
},
|
|
25204
25427
|
record: (socket, uuid, language) => {
|
|
25205
|
-
|
|
25206
|
-
|
|
25207
|
-
|
|
25208
|
-
|
|
25209
|
-
|
|
25210
|
-
|
|
25211
|
-
|
|
25212
|
-
|
|
25213
|
-
|
|
25214
|
-
|
|
25428
|
+
const config2 = JSON.stringify({
|
|
25429
|
+
uid: uuid,
|
|
25430
|
+
language,
|
|
25431
|
+
task: "transcribe",
|
|
25432
|
+
model: "medium",
|
|
25433
|
+
medical_practice: "medical",
|
|
25434
|
+
use_vad: true
|
|
25435
|
+
});
|
|
25436
|
+
if (socket.readyState === WebSocket.OPEN) {
|
|
25437
|
+
socket.send(config2);
|
|
25438
|
+
return;
|
|
25439
|
+
}
|
|
25440
|
+
socket.addEventListener("open", () => socket.send(config2), { once: true });
|
|
25215
25441
|
},
|
|
25216
25442
|
recordFinal: (socket) => {
|
|
25217
25443
|
socket.send(JSON.stringify({
|
|
@@ -25281,7 +25507,11 @@ function generateUUID() {
|
|
|
25281
25507
|
});
|
|
25282
25508
|
return uuid;
|
|
25283
25509
|
}
|
|
25284
|
-
const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStream, setIsServerReady, setUuid, isStoppingRef, currentSocketRef, preconnectedSocketRef, onConsumePreconnectedSocket, addSegments }) => {
|
|
25510
|
+
const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStream, setIsServerReady, setUuid, isStoppingRef, currentSocketRef, preconnectedSocketRef, onConsumePreconnectedSocket, addSegments, onUnexpectedClose }) => {
|
|
25511
|
+
const onUnexpectedCloseRef = reactExports.useRef(onUnexpectedClose);
|
|
25512
|
+
reactExports.useEffect(() => {
|
|
25513
|
+
onUnexpectedCloseRef.current = onUnexpectedClose;
|
|
25514
|
+
}, [onUnexpectedClose]);
|
|
25285
25515
|
const addSegmentsRef = reactExports.useRef(addSegments);
|
|
25286
25516
|
reactExports.useEffect(() => {
|
|
25287
25517
|
addSegmentsRef.current = addSegments;
|
|
@@ -25382,6 +25612,7 @@ const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStre
|
|
|
25382
25612
|
}
|
|
25383
25613
|
};
|
|
25384
25614
|
newSocket.onclose = (event) => {
|
|
25615
|
+
var _a3;
|
|
25385
25616
|
if (currentSocketRef.current !== thisSocket) {
|
|
25386
25617
|
logger.debug("Socket close ignored - no longer current socket");
|
|
25387
25618
|
return;
|
|
@@ -25390,10 +25621,12 @@ const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStre
|
|
|
25390
25621
|
logger.debug("Socket close during stop - stopCapture will handle state");
|
|
25391
25622
|
return;
|
|
25392
25623
|
}
|
|
25393
|
-
|
|
25624
|
+
const isUnexpected = event.code !== 1e3 && event.code !== 1005;
|
|
25625
|
+
if (isUnexpected) {
|
|
25394
25626
|
if (event.code === 1006) {
|
|
25395
25627
|
logger.webSocketError("WSS URL is unreachable. Please verify your wssurl property points to a valid WebSocket endpoint.");
|
|
25396
25628
|
}
|
|
25629
|
+
(_a3 = onUnexpectedCloseRef.current) == null ? void 0 : _a3.call(onUnexpectedCloseRef, event);
|
|
25397
25630
|
}
|
|
25398
25631
|
setState((prev) => __spreadProps(__spreadValues({}, prev), {
|
|
25399
25632
|
enabled: false,
|
|
@@ -25453,6 +25686,7 @@ const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStre
|
|
|
25453
25686
|
}
|
|
25454
25687
|
};
|
|
25455
25688
|
preconnectedSocket.onclose = (event) => {
|
|
25689
|
+
var _a3;
|
|
25456
25690
|
if (currentSocketRef.current !== thisSocket) {
|
|
25457
25691
|
logger.debug("Socket close ignored - no longer current socket");
|
|
25458
25692
|
return;
|
|
@@ -25469,6 +25703,7 @@ const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStre
|
|
|
25469
25703
|
}
|
|
25470
25704
|
if (event.code !== 1e3 && event.code !== 1005) {
|
|
25471
25705
|
logger.webSocketError(`WebSocket closed unexpectedly (code: ${event.code})`);
|
|
25706
|
+
(_a3 = onUnexpectedCloseRef.current) == null ? void 0 : _a3.call(onUnexpectedCloseRef, event);
|
|
25472
25707
|
}
|
|
25473
25708
|
setState((prev) => __spreadProps(__spreadValues({}, prev), {
|
|
25474
25709
|
enabled: false,
|
|
@@ -25519,32 +25754,67 @@ const useWebSocketConnection = ({ wssUrl, language, setState, setSocket, setStre
|
|
|
25519
25754
|
]);
|
|
25520
25755
|
return { startRecording };
|
|
25521
25756
|
};
|
|
25522
|
-
const
|
|
25523
|
-
const
|
|
25757
|
+
const INITIAL_RECONNECT_DELAY = 3e3;
|
|
25758
|
+
const MAX_RECONNECT_DELAY = 6e4;
|
|
25759
|
+
const MAX_RECONNECT_ATTEMPTS = 5;
|
|
25760
|
+
const NON_RETRYABLE_CLOSE_CODES = /* @__PURE__ */ new Set([1e3, 1008, 1011]);
|
|
25761
|
+
const useWebSocketPreconnect = ({ wssUrl, enabled = true, isRecordingActive = false }) => {
|
|
25524
25762
|
const [socket, setSocket] = reactExports.useState(null);
|
|
25525
25763
|
const [status, setStatus] = reactExports.useState("disconnected");
|
|
25526
25764
|
const reconnectTimeoutRef = reactExports.useRef(null);
|
|
25527
25765
|
const mountedRef = reactExports.useRef(true);
|
|
25766
|
+
const reconnectAttemptsRef = reactExports.useRef(0);
|
|
25767
|
+
const socketRef = reactExports.useRef(null);
|
|
25768
|
+
const isRecordingActiveRef = reactExports.useRef(isRecordingActive);
|
|
25769
|
+
reactExports.useEffect(() => {
|
|
25770
|
+
isRecordingActiveRef.current = isRecordingActive;
|
|
25771
|
+
}, [isRecordingActive]);
|
|
25528
25772
|
const clearTimers = reactExports.useCallback(() => {
|
|
25529
25773
|
if (reconnectTimeoutRef.current) {
|
|
25530
25774
|
clearTimeout(reconnectTimeoutRef.current);
|
|
25531
25775
|
reconnectTimeoutRef.current = null;
|
|
25532
25776
|
}
|
|
25533
25777
|
}, []);
|
|
25778
|
+
const getBackoffDelay = reactExports.useCallback((attempt) => {
|
|
25779
|
+
const exponential = INITIAL_RECONNECT_DELAY * Math.pow(2, attempt);
|
|
25780
|
+
return Math.min(exponential, MAX_RECONNECT_DELAY);
|
|
25781
|
+
}, []);
|
|
25534
25782
|
const connect = reactExports.useCallback(() => {
|
|
25535
25783
|
if (!wssUrl || !enabled || !mountedRef.current)
|
|
25536
25784
|
return;
|
|
25537
25785
|
clearTimers();
|
|
25538
25786
|
setStatus("connecting");
|
|
25787
|
+
const scheduleRetry = (reason2) => {
|
|
25788
|
+
if (!mountedRef.current || !enabled)
|
|
25789
|
+
return;
|
|
25790
|
+
if (isRecordingActiveRef.current)
|
|
25791
|
+
return;
|
|
25792
|
+
const attempt = reconnectAttemptsRef.current;
|
|
25793
|
+
if (attempt >= MAX_RECONNECT_ATTEMPTS) {
|
|
25794
|
+
logger.webSocketError(`WebSocket preconnect gave up after ${attempt} attempts (${reason2})`);
|
|
25795
|
+
setStatus("paused");
|
|
25796
|
+
return;
|
|
25797
|
+
}
|
|
25798
|
+
const delay = getBackoffDelay(attempt);
|
|
25799
|
+
reconnectAttemptsRef.current = attempt + 1;
|
|
25800
|
+
logger.info(`WebSocket ${reason2}, retry ${attempt + 1}/${MAX_RECONNECT_ATTEMPTS} in ${delay}ms`);
|
|
25801
|
+
reconnectTimeoutRef.current = setTimeout(() => {
|
|
25802
|
+
if (mountedRef.current && enabled && !isRecordingActiveRef.current) {
|
|
25803
|
+
connect();
|
|
25804
|
+
}
|
|
25805
|
+
}, delay);
|
|
25806
|
+
};
|
|
25539
25807
|
try {
|
|
25540
25808
|
const newSocket = new WebSocket(wssUrl);
|
|
25541
25809
|
newSocket.binaryType = "arraybuffer";
|
|
25810
|
+
socketRef.current = newSocket;
|
|
25542
25811
|
newSocket.onopen = () => {
|
|
25543
|
-
if (!mountedRef.current) {
|
|
25812
|
+
if (!mountedRef.current || socketRef.current !== newSocket) {
|
|
25544
25813
|
newSocket.close();
|
|
25545
25814
|
return;
|
|
25546
25815
|
}
|
|
25547
25816
|
logger.info("WebSocket pre-connected successfully");
|
|
25817
|
+
reconnectAttemptsRef.current = 0;
|
|
25548
25818
|
setSocket(newSocket);
|
|
25549
25819
|
setStatus("connected");
|
|
25550
25820
|
};
|
|
@@ -25554,59 +25824,55 @@ const useWebSocketPreconnect = ({ wssUrl, enabled = true }) => {
|
|
|
25554
25824
|
newSocket.onclose = (event) => {
|
|
25555
25825
|
if (!mountedRef.current)
|
|
25556
25826
|
return;
|
|
25827
|
+
if (socketRef.current !== newSocket && socketRef.current !== null)
|
|
25828
|
+
return;
|
|
25557
25829
|
clearTimers();
|
|
25830
|
+
socketRef.current = null;
|
|
25558
25831
|
setSocket(null);
|
|
25559
25832
|
setStatus("disconnected");
|
|
25560
|
-
if (enabled)
|
|
25561
|
-
|
|
25562
|
-
|
|
25563
|
-
|
|
25564
|
-
|
|
25565
|
-
}
|
|
25566
|
-
}, RECONNECT_DELAY);
|
|
25833
|
+
if (!enabled)
|
|
25834
|
+
return;
|
|
25835
|
+
if (NON_RETRYABLE_CLOSE_CODES.has(event.code)) {
|
|
25836
|
+
logger.info(`WebSocket closed cleanly (code: ${event.code}); pausing preconnect until next user action`);
|
|
25837
|
+
return;
|
|
25567
25838
|
}
|
|
25839
|
+
scheduleRetry(`closed (code: ${event.code})`);
|
|
25568
25840
|
};
|
|
25569
25841
|
} catch (error) {
|
|
25570
25842
|
logger.webSocketError("Failed to create pre-connection:", error);
|
|
25571
25843
|
setStatus("disconnected");
|
|
25572
|
-
|
|
25573
|
-
reconnectTimeoutRef.current = setTimeout(() => {
|
|
25574
|
-
if (mountedRef.current && enabled) {
|
|
25575
|
-
connect();
|
|
25576
|
-
}
|
|
25577
|
-
}, RECONNECT_DELAY);
|
|
25578
|
-
}
|
|
25844
|
+
scheduleRetry("creation error");
|
|
25579
25845
|
}
|
|
25580
|
-
}, [wssUrl, enabled, clearTimers]);
|
|
25846
|
+
}, [wssUrl, enabled, clearTimers, getBackoffDelay]);
|
|
25581
25847
|
const reconnect = reactExports.useCallback(() => {
|
|
25582
|
-
|
|
25583
|
-
|
|
25848
|
+
reconnectAttemptsRef.current = 0;
|
|
25849
|
+
if (socketRef.current) {
|
|
25850
|
+
socketRef.current.close(1e3, "Manual reconnect");
|
|
25851
|
+
socketRef.current = null;
|
|
25584
25852
|
}
|
|
25585
25853
|
connect();
|
|
25586
|
-
}, [
|
|
25854
|
+
}, [connect]);
|
|
25587
25855
|
const consumeSocket = reactExports.useCallback(() => {
|
|
25588
25856
|
setSocket(null);
|
|
25589
25857
|
setStatus("disconnected");
|
|
25858
|
+
reconnectAttemptsRef.current = 0;
|
|
25590
25859
|
clearTimers();
|
|
25591
|
-
|
|
25592
|
-
|
|
25593
|
-
connect();
|
|
25594
|
-
}
|
|
25595
|
-
}, RECONNECT_DELAY);
|
|
25596
|
-
}, [enabled, connect, clearTimers]);
|
|
25860
|
+
socketRef.current = null;
|
|
25861
|
+
}, [clearTimers]);
|
|
25597
25862
|
reactExports.useEffect(() => {
|
|
25598
25863
|
mountedRef.current = true;
|
|
25599
|
-
if (enabled && wssUrl) {
|
|
25864
|
+
if (enabled && wssUrl && !isRecordingActive) {
|
|
25600
25865
|
connect();
|
|
25601
25866
|
}
|
|
25602
25867
|
return () => {
|
|
25603
25868
|
mountedRef.current = false;
|
|
25604
25869
|
clearTimers();
|
|
25605
|
-
if (
|
|
25606
|
-
|
|
25870
|
+
if (socketRef.current) {
|
|
25871
|
+
socketRef.current.close(1e3, "Preconnect cleanup");
|
|
25872
|
+
socketRef.current = null;
|
|
25607
25873
|
}
|
|
25608
25874
|
};
|
|
25609
|
-
}, [enabled, wssUrl]);
|
|
25875
|
+
}, [enabled, wssUrl, isRecordingActive]);
|
|
25610
25876
|
return {
|
|
25611
25877
|
socket,
|
|
25612
25878
|
status,
|
|
@@ -25769,13 +26035,7 @@ var ToastVariation;
|
|
|
25769
26035
|
ToastVariation2["default"] = "default";
|
|
25770
26036
|
ToastVariation2["danger"] = "danger";
|
|
25771
26037
|
})(ToastVariation || (ToastVariation = {}));
|
|
25772
|
-
const
|
|
25773
|
-
title: "",
|
|
25774
|
-
message: "",
|
|
25775
|
-
visible: false,
|
|
25776
|
-
variation: ToastVariation.default,
|
|
25777
|
-
duration: 3e3
|
|
25778
|
-
};
|
|
26038
|
+
const MAX_TOASTS = 3;
|
|
25779
26039
|
const showErrorToast = (setToastState, formatMessage2) => {
|
|
25780
26040
|
setToastState({
|
|
25781
26041
|
variation: ToastVariation.danger,
|
|
@@ -25806,10 +26066,16 @@ const handleMicros = async (setState) => {
|
|
|
25806
26066
|
setState((prevState) => __spreadProps(__spreadValues({}, prevState), {
|
|
25807
26067
|
devices: mics.map(({ deviceId, label }) => ({ deviceId, label }))
|
|
25808
26068
|
}));
|
|
25809
|
-
if (mics.length
|
|
25810
|
-
|
|
26069
|
+
if (mics.length === 0)
|
|
26070
|
+
return;
|
|
26071
|
+
setState((prevState) => {
|
|
26072
|
+
const currentIsValid = !!prevState.selectedDevice && prevState.selectedDevice !== "no-permission" && prevState.selectedDevice !== "no-devices" && prevState.selectedDevice !== "error" && mics.some((m2) => m2.deviceId === prevState.selectedDevice);
|
|
26073
|
+
if (currentIsValid)
|
|
26074
|
+
return prevState;
|
|
26075
|
+
return __spreadProps(__spreadValues({}, prevState), {
|
|
25811
26076
|
selectedDevice: mics[0].deviceId
|
|
25812
|
-
})
|
|
26077
|
+
});
|
|
26078
|
+
});
|
|
25813
26079
|
};
|
|
25814
26080
|
const getMicros = async (setHasPermission, setOptions, setDevices, icon2, setToastState, microText, notFoundText, errorText, toastText) => {
|
|
25815
26081
|
try {
|
|
@@ -25867,6 +26133,19 @@ const requestMicrophonePermission = async (permission, setState, action, setToas
|
|
|
25867
26133
|
} else
|
|
25868
26134
|
action();
|
|
25869
26135
|
};
|
|
26136
|
+
const isNoMicrophoneError = (error) => {
|
|
26137
|
+
if (!(error instanceof DOMException))
|
|
26138
|
+
return false;
|
|
26139
|
+
return error.name === "NotFoundError" || error.name === "OverconstrainedError" || error.name === "NotReadableError" || error.name === "AbortError";
|
|
26140
|
+
};
|
|
26141
|
+
const setNoMicrophoneToast = (setToastState, title, message) => {
|
|
26142
|
+
setToastState({
|
|
26143
|
+
variation: ToastVariation.danger,
|
|
26144
|
+
title,
|
|
26145
|
+
message,
|
|
26146
|
+
visible: true
|
|
26147
|
+
});
|
|
26148
|
+
};
|
|
25870
26149
|
const setDeniedPermissionToast = (setToastState, text2) => {
|
|
25871
26150
|
setToastState({
|
|
25872
26151
|
variation: ToastVariation.danger,
|
|
@@ -25900,7 +26179,7 @@ const getMediaStream = async (selectedDevice) => {
|
|
|
25900
26179
|
throw error;
|
|
25901
26180
|
}
|
|
25902
26181
|
};
|
|
25903
|
-
const useRecordingActions = ({ recordingState, transcriptorData, appointmentData, actions, refs, toastText }) => {
|
|
26182
|
+
const useRecordingActions = ({ recordingState, transcriptorData, appointmentData, actions, refs, toastText, noMicToast }) => {
|
|
25904
26183
|
const { stream, audioContext, animationFrameId, uuid, seconds } = recordingState;
|
|
25905
26184
|
const { segments, enabled, connectionLoading, permission, selectedDevice, generating } = transcriptorData;
|
|
25906
26185
|
const { setState, setStream, setAudioContext, setSocket, setIsServerReady, setToastState, startRecording, cleanupPromise, finalizeRecording, prepareForNewRecording, audioProcessorCleanup } = actions;
|
|
@@ -26041,9 +26320,14 @@ const useRecordingActions = ({ recordingState, transcriptorData, appointmentData
|
|
|
26041
26320
|
const newStream = await getMediaStream(selectedDevice);
|
|
26042
26321
|
setStream(newStream);
|
|
26043
26322
|
getMicrophones(newStream);
|
|
26044
|
-
} catch (
|
|
26045
|
-
|
|
26046
|
-
|
|
26323
|
+
} catch (error) {
|
|
26324
|
+
if (isNoMicrophoneError(error)) {
|
|
26325
|
+
setNoMicrophoneToast(setToastState, noMicToast.title, noMicToast.message);
|
|
26326
|
+
logger.audioError("No microphone available:", error);
|
|
26327
|
+
} else {
|
|
26328
|
+
setDeniedPermissionToast(setToastState, toastText);
|
|
26329
|
+
logger.audioError("Microphone access denied.", error);
|
|
26330
|
+
}
|
|
26047
26331
|
}
|
|
26048
26332
|
}
|
|
26049
26333
|
}, [
|
|
@@ -26054,6 +26338,7 @@ const useRecordingActions = ({ recordingState, transcriptorData, appointmentData
|
|
|
26054
26338
|
getMicrophones,
|
|
26055
26339
|
setToastState,
|
|
26056
26340
|
toastText,
|
|
26341
|
+
noMicToast,
|
|
26057
26342
|
setStream,
|
|
26058
26343
|
isStoppingRef,
|
|
26059
26344
|
prepareForNewRecording
|
|
@@ -26063,7 +26348,11 @@ const useRecordingActions = ({ recordingState, transcriptorData, appointmentData
|
|
|
26063
26348
|
handleToggleRecording
|
|
26064
26349
|
};
|
|
26065
26350
|
};
|
|
26066
|
-
const
|
|
26351
|
+
const SILENCE_THRESHOLD = 1e-4;
|
|
26352
|
+
const SILENCE_FRAMES_LIMIT = 30;
|
|
26353
|
+
const NO_SEND_WATCHDOG_MS = 8e3;
|
|
26354
|
+
const NO_SEND_WATCHDOG_CHECK_MS = 1e3;
|
|
26355
|
+
const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionLoading, setAudioContext, onDeviceLost }) => {
|
|
26067
26356
|
const processorRef = reactExports.useRef(null);
|
|
26068
26357
|
const sourceRef = reactExports.useRef(null);
|
|
26069
26358
|
const audioContextRef = reactExports.useRef(null);
|
|
@@ -26071,9 +26360,16 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
26071
26360
|
reactExports.useEffect(() => {
|
|
26072
26361
|
isServerReadyRef.current = isServerReady;
|
|
26073
26362
|
}, [isServerReady]);
|
|
26363
|
+
const onDeviceLostRef = reactExports.useRef(onDeviceLost);
|
|
26364
|
+
reactExports.useEffect(() => {
|
|
26365
|
+
onDeviceLostRef.current = onDeviceLost;
|
|
26366
|
+
}, [onDeviceLost]);
|
|
26367
|
+
const consecutiveSilentFramesRef = reactExports.useRef(0);
|
|
26368
|
+
const deviceLostFiredRef = reactExports.useRef(false);
|
|
26369
|
+
const lastSendAtRef = reactExports.useRef(0);
|
|
26074
26370
|
reactExports.useEffect(() => {
|
|
26075
26371
|
const session = getSessionState();
|
|
26076
|
-
if (session.processor && session.source && session.audioContext && session.
|
|
26372
|
+
if (session.processor && session.source && session.audioContext && session.processorStream === stream && session.processorSocket === socket) {
|
|
26077
26373
|
processorRef.current = session.processor;
|
|
26078
26374
|
sourceRef.current = session.source;
|
|
26079
26375
|
audioContextRef.current = session.audioContext;
|
|
@@ -26097,13 +26393,39 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
26097
26393
|
}
|
|
26098
26394
|
audioContextRef.current = null;
|
|
26099
26395
|
}
|
|
26100
|
-
updateSessionState({
|
|
26396
|
+
updateSessionState({
|
|
26397
|
+
processor: null,
|
|
26398
|
+
source: null,
|
|
26399
|
+
processorStream: null,
|
|
26400
|
+
processorSocket: null
|
|
26401
|
+
});
|
|
26101
26402
|
if (!stream || !enabled || connectionLoading)
|
|
26102
26403
|
return;
|
|
26404
|
+
const audioTracks = stream.getAudioTracks();
|
|
26405
|
+
const handleTrackEnded = () => {
|
|
26406
|
+
var _a3;
|
|
26407
|
+
if (deviceLostFiredRef.current)
|
|
26408
|
+
return;
|
|
26409
|
+
deviceLostFiredRef.current = true;
|
|
26410
|
+
logger.warn("Audio track ended — microphone disconnected");
|
|
26411
|
+
(_a3 = onDeviceLostRef.current) == null ? void 0 : _a3.call(onDeviceLostRef);
|
|
26412
|
+
};
|
|
26413
|
+
const handleTrackMute = () => {
|
|
26414
|
+
logger.warn("Audio track muted — possible transient device glitch");
|
|
26415
|
+
};
|
|
26416
|
+
const handleTrackUnmute = () => {
|
|
26417
|
+
logger.info("Audio track unmuted — device recovered");
|
|
26418
|
+
consecutiveSilentFramesRef.current = 0;
|
|
26419
|
+
deviceLostFiredRef.current = false;
|
|
26420
|
+
};
|
|
26103
26421
|
try {
|
|
26104
26422
|
const audioContext = new AudioContext();
|
|
26105
26423
|
audioContextRef.current = audioContext;
|
|
26106
26424
|
setAudioContext(audioContext);
|
|
26425
|
+
if (audioContext.state === "suspended") {
|
|
26426
|
+
logger.warn("AudioContext started suspended — calling resume(). This usually means the browser did not consider the current execution context a user gesture.");
|
|
26427
|
+
audioContext.resume().catch((err) => logger.audioError("Failed to resume AudioContext:", err));
|
|
26428
|
+
}
|
|
26107
26429
|
const source = audioContext.createMediaStreamSource(stream);
|
|
26108
26430
|
sourceRef.current = source;
|
|
26109
26431
|
const analyser = audioContext.createAnalyser();
|
|
@@ -26114,26 +26436,66 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
26114
26436
|
source.connect(analyser);
|
|
26115
26437
|
const processor = audioContext.createScriptProcessor(4096, 1, 1);
|
|
26116
26438
|
processorRef.current = processor;
|
|
26439
|
+
consecutiveSilentFramesRef.current = 0;
|
|
26440
|
+
deviceLostFiredRef.current = false;
|
|
26441
|
+
lastSendAtRef.current = Date.now();
|
|
26117
26442
|
processor.onaudioprocess = (event) => {
|
|
26443
|
+
var _a3;
|
|
26118
26444
|
if (!isServerReadyRef.current || !socket)
|
|
26119
26445
|
return;
|
|
26446
|
+
if (deviceLostFiredRef.current)
|
|
26447
|
+
return;
|
|
26120
26448
|
const input = event.inputBuffer.getChannelData(0);
|
|
26449
|
+
let isSilent = true;
|
|
26450
|
+
for (let i = 0; i < input.length; i++) {
|
|
26451
|
+
if (Math.abs(input[i]) > SILENCE_THRESHOLD) {
|
|
26452
|
+
isSilent = false;
|
|
26453
|
+
break;
|
|
26454
|
+
}
|
|
26455
|
+
}
|
|
26456
|
+
if (isSilent) {
|
|
26457
|
+
consecutiveSilentFramesRef.current++;
|
|
26458
|
+
if (consecutiveSilentFramesRef.current >= SILENCE_FRAMES_LIMIT && !deviceLostFiredRef.current) {
|
|
26459
|
+
deviceLostFiredRef.current = true;
|
|
26460
|
+
logger.warn(`Detected ${SILENCE_FRAMES_LIMIT} consecutive silent frames — microphone may be disconnected`);
|
|
26461
|
+
(_a3 = onDeviceLostRef.current) == null ? void 0 : _a3.call(onDeviceLostRef);
|
|
26462
|
+
return;
|
|
26463
|
+
}
|
|
26464
|
+
} else {
|
|
26465
|
+
consecutiveSilentFramesRef.current = 0;
|
|
26466
|
+
}
|
|
26121
26467
|
if (socket.readyState === WebSocket.OPEN) {
|
|
26122
26468
|
const audioData16kHz = resampleTo16kHZ(input, audioContext.sampleRate);
|
|
26123
26469
|
socket.send(audioData16kHz);
|
|
26470
|
+
lastSendAtRef.current = Date.now();
|
|
26124
26471
|
}
|
|
26125
26472
|
};
|
|
26473
|
+
audioTracks.forEach((t) => {
|
|
26474
|
+
t.addEventListener("ended", handleTrackEnded);
|
|
26475
|
+
t.addEventListener("mute", handleTrackMute);
|
|
26476
|
+
t.addEventListener("unmute", handleTrackUnmute);
|
|
26477
|
+
});
|
|
26126
26478
|
source.connect(processor);
|
|
26127
26479
|
processor.connect(audioContext.destination);
|
|
26128
26480
|
const gain = audioContext.createGain();
|
|
26129
26481
|
gain.gain.value = 1e-3;
|
|
26130
26482
|
analyser.connect(gain);
|
|
26131
26483
|
gain.connect(audioContext.destination);
|
|
26132
|
-
updateSessionState({
|
|
26484
|
+
updateSessionState({
|
|
26485
|
+
processor,
|
|
26486
|
+
source,
|
|
26487
|
+
processorStream: stream,
|
|
26488
|
+
processorSocket: socket
|
|
26489
|
+
});
|
|
26133
26490
|
} catch (error) {
|
|
26134
26491
|
logger.audioError("Error setting up audio context:", error);
|
|
26135
26492
|
}
|
|
26136
26493
|
return () => {
|
|
26494
|
+
audioTracks.forEach((t) => {
|
|
26495
|
+
t.removeEventListener("ended", handleTrackEnded);
|
|
26496
|
+
t.removeEventListener("mute", handleTrackMute);
|
|
26497
|
+
t.removeEventListener("unmute", handleTrackUnmute);
|
|
26498
|
+
});
|
|
26137
26499
|
const current = getSessionState();
|
|
26138
26500
|
if (current.processor === processorRef.current && current.source === sourceRef.current && current.isActive) {
|
|
26139
26501
|
return;
|
|
@@ -26146,9 +26508,33 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
26146
26508
|
sourceRef.current.disconnect();
|
|
26147
26509
|
sourceRef.current = null;
|
|
26148
26510
|
}
|
|
26149
|
-
updateSessionState({
|
|
26511
|
+
updateSessionState({
|
|
26512
|
+
processor: null,
|
|
26513
|
+
source: null,
|
|
26514
|
+
processorStream: null,
|
|
26515
|
+
processorSocket: null
|
|
26516
|
+
});
|
|
26150
26517
|
};
|
|
26151
26518
|
}, [stream, socket, enabled, connectionLoading, setAudioContext]);
|
|
26519
|
+
reactExports.useEffect(() => {
|
|
26520
|
+
if (!enabled || connectionLoading || !socket || !isServerReady)
|
|
26521
|
+
return;
|
|
26522
|
+
lastSendAtRef.current = Date.now();
|
|
26523
|
+
const interval = setInterval(() => {
|
|
26524
|
+
var _a3;
|
|
26525
|
+
if (deviceLostFiredRef.current)
|
|
26526
|
+
return;
|
|
26527
|
+
if (socket.readyState !== WebSocket.OPEN)
|
|
26528
|
+
return;
|
|
26529
|
+
const sinceLastSend = Date.now() - lastSendAtRef.current;
|
|
26530
|
+
if (sinceLastSend > NO_SEND_WATCHDOG_MS) {
|
|
26531
|
+
deviceLostFiredRef.current = true;
|
|
26532
|
+
logger.warn(`No audio sent to server for ${sinceLastSend}ms — microphone input appears stuck`);
|
|
26533
|
+
(_a3 = onDeviceLostRef.current) == null ? void 0 : _a3.call(onDeviceLostRef);
|
|
26534
|
+
}
|
|
26535
|
+
}, NO_SEND_WATCHDOG_CHECK_MS);
|
|
26536
|
+
return () => clearInterval(interval);
|
|
26537
|
+
}, [enabled, connectionLoading, socket, isServerReady]);
|
|
26152
26538
|
const cleanup = reactExports.useCallback(() => {
|
|
26153
26539
|
if (processorRef.current) {
|
|
26154
26540
|
processorRef.current.disconnect();
|
|
@@ -26158,7 +26544,12 @@ const useAudioProcessor = ({ stream, socket, isServerReady, enabled, connectionL
|
|
|
26158
26544
|
sourceRef.current.disconnect();
|
|
26159
26545
|
sourceRef.current = null;
|
|
26160
26546
|
}
|
|
26161
|
-
updateSessionState({
|
|
26547
|
+
updateSessionState({
|
|
26548
|
+
processor: null,
|
|
26549
|
+
source: null,
|
|
26550
|
+
processorStream: null,
|
|
26551
|
+
processorSocket: null
|
|
26552
|
+
});
|
|
26162
26553
|
if (audioContextRef.current) {
|
|
26163
26554
|
try {
|
|
26164
26555
|
if (audioContextRef.current.state !== "closed") {
|
|
@@ -26183,6 +26574,16 @@ const useAudioRecording = (options = {}) => {
|
|
|
26183
26574
|
const toastText = formatMessage2({
|
|
26184
26575
|
id: "Please enable the microphone or reset the permissions"
|
|
26185
26576
|
});
|
|
26577
|
+
const noMicToast = reactExports.useMemo(() => ({
|
|
26578
|
+
title: formatMessage2({
|
|
26579
|
+
id: "No microphone available",
|
|
26580
|
+
defaultMessage: "No microphone available"
|
|
26581
|
+
}),
|
|
26582
|
+
message: formatMessage2({
|
|
26583
|
+
id: "Connect a microphone and try again.",
|
|
26584
|
+
defaultMessage: "Connect a microphone and try again."
|
|
26585
|
+
})
|
|
26586
|
+
}), [formatMessage2]);
|
|
26186
26587
|
const isCurrentlyRecording = enabled && !connectionLoading;
|
|
26187
26588
|
const state = useAudioRecordingState(appointmentData, isCurrentlyRecording);
|
|
26188
26589
|
const { addSegments, finalizeRecording, prepareForNewRecording, initializeSession } = useTranscriptionManager({
|
|
@@ -26200,7 +26601,8 @@ const useAudioRecording = (options = {}) => {
|
|
|
26200
26601
|
]);
|
|
26201
26602
|
const { socket: preconnectedSocket, consumeSocket } = useWebSocketPreconnect({
|
|
26202
26603
|
wssUrl,
|
|
26203
|
-
enabled: !!wssUrl
|
|
26604
|
+
enabled: !!wssUrl && permission === "granted",
|
|
26605
|
+
isRecordingActive: isCurrentlyRecording
|
|
26204
26606
|
});
|
|
26205
26607
|
const preconnectedSocketRef = reactExports.useRef(null);
|
|
26206
26608
|
reactExports.useEffect(() => {
|
|
@@ -26216,6 +26618,11 @@ const useAudioRecording = (options = {}) => {
|
|
|
26216
26618
|
reactExports.useEffect(() => {
|
|
26217
26619
|
segmentsRef.current = segments;
|
|
26218
26620
|
}, [segments]);
|
|
26621
|
+
const handleServerCloseRef = reactExports.useRef(null);
|
|
26622
|
+
const handleUnexpectedClose = reactExports.useCallback((event) => {
|
|
26623
|
+
var _a3;
|
|
26624
|
+
(_a3 = handleServerCloseRef.current) == null ? void 0 : _a3.call(handleServerCloseRef, event);
|
|
26625
|
+
}, []);
|
|
26219
26626
|
const { startRecording } = useWebSocketConnection({
|
|
26220
26627
|
wssUrl,
|
|
26221
26628
|
language,
|
|
@@ -26228,19 +26635,27 @@ const useAudioRecording = (options = {}) => {
|
|
|
26228
26635
|
currentSocketRef,
|
|
26229
26636
|
preconnectedSocketRef,
|
|
26230
26637
|
onConsumePreconnectedSocket: consumeSocket,
|
|
26231
|
-
addSegments
|
|
26638
|
+
addSegments,
|
|
26639
|
+
onUnexpectedClose: handleUnexpectedClose
|
|
26232
26640
|
});
|
|
26233
26641
|
const { cleanupPromise } = useAudioRecordingCleanup();
|
|
26642
|
+
const stopOnDeviceLostRef = reactExports.useRef(null);
|
|
26643
|
+
const handleDeviceLost = reactExports.useCallback(() => {
|
|
26644
|
+
var _a3;
|
|
26645
|
+
(_a3 = stopOnDeviceLostRef.current) == null ? void 0 : _a3.call(stopOnDeviceLostRef);
|
|
26646
|
+
}, []);
|
|
26234
26647
|
const { cleanup: audioProcessorCleanup } = useAudioProcessor({
|
|
26235
26648
|
stream: state.stream,
|
|
26236
26649
|
socket: state.socket,
|
|
26237
26650
|
isServerReady: state.isServerReady,
|
|
26238
26651
|
enabled,
|
|
26239
26652
|
connectionLoading,
|
|
26240
|
-
setAudioContext: state.setAudioContext
|
|
26653
|
+
setAudioContext: state.setAudioContext,
|
|
26654
|
+
onDeviceLost: handleDeviceLost
|
|
26241
26655
|
});
|
|
26242
|
-
const { handleToggleRecording } = useRecordingActions({
|
|
26656
|
+
const { handleToggleRecording, stopCapture } = useRecordingActions({
|
|
26243
26657
|
recordingState: {
|
|
26658
|
+
socket: state.socket,
|
|
26244
26659
|
stream: state.stream,
|
|
26245
26660
|
audioContext: state.audioContext,
|
|
26246
26661
|
animationFrameId: state.animationFrameId,
|
|
@@ -26274,8 +26689,309 @@ const useAudioRecording = (options = {}) => {
|
|
|
26274
26689
|
currentSocketRef,
|
|
26275
26690
|
segmentsRef
|
|
26276
26691
|
},
|
|
26277
|
-
toastText
|
|
26692
|
+
toastText,
|
|
26693
|
+
noMicToast
|
|
26694
|
+
});
|
|
26695
|
+
const micDisconnectedText = formatMessage2({
|
|
26696
|
+
id: "Microphone disconnected",
|
|
26697
|
+
defaultMessage: "Microphone disconnected"
|
|
26698
|
+
});
|
|
26699
|
+
const micDisconnectedMessage = formatMessage2({
|
|
26700
|
+
id: "The microphone was disconnected during recording",
|
|
26701
|
+
defaultMessage: "The microphone was disconnected during recording"
|
|
26702
|
+
});
|
|
26703
|
+
const micReconnectedText = formatMessage2({
|
|
26704
|
+
id: "Microphone reconnected",
|
|
26705
|
+
defaultMessage: "Microphone reconnected"
|
|
26706
|
+
});
|
|
26707
|
+
const recordingInterruptedText = formatMessage2({
|
|
26708
|
+
id: "Recording interrupted",
|
|
26709
|
+
defaultMessage: "Recording interrupted"
|
|
26710
|
+
});
|
|
26711
|
+
const recordingInterruptedMessage = formatMessage2({
|
|
26712
|
+
id: "The server closed the session unexpectedly. Please start recording again.",
|
|
26713
|
+
defaultMessage: "The server closed the session unexpectedly. Please start recording again."
|
|
26278
26714
|
});
|
|
26715
|
+
const micFallbackText = formatMessage2({
|
|
26716
|
+
id: "Microphone changed",
|
|
26717
|
+
defaultMessage: "Microphone changed"
|
|
26718
|
+
});
|
|
26719
|
+
const micFallbackMessage = formatMessage2({
|
|
26720
|
+
id: "Your selected microphone was unavailable. Recording continues with the default microphone.",
|
|
26721
|
+
defaultMessage: "Your selected microphone was unavailable. Recording continues with the default microphone."
|
|
26722
|
+
});
|
|
26723
|
+
reactExports.useEffect(() => {
|
|
26724
|
+
handleServerCloseRef.current = (event) => {
|
|
26725
|
+
if (state.isStoppingRef.current)
|
|
26726
|
+
return;
|
|
26727
|
+
logger.warn(`Server closed WebSocket unexpectedly (code: ${event.code}) — stopping session`);
|
|
26728
|
+
stopCapture();
|
|
26729
|
+
setToastState({
|
|
26730
|
+
variation: ToastVariation.danger,
|
|
26731
|
+
title: recordingInterruptedText,
|
|
26732
|
+
message: recordingInterruptedMessage,
|
|
26733
|
+
visible: true,
|
|
26734
|
+
duration: 0
|
|
26735
|
+
});
|
|
26736
|
+
};
|
|
26737
|
+
}, [
|
|
26738
|
+
stopCapture,
|
|
26739
|
+
state.isStoppingRef,
|
|
26740
|
+
setToastState,
|
|
26741
|
+
recordingInterruptedText,
|
|
26742
|
+
recordingInterruptedMessage
|
|
26743
|
+
]);
|
|
26744
|
+
const selectedDeviceRef = reactExports.useRef(selectedDevice);
|
|
26745
|
+
reactExports.useEffect(() => {
|
|
26746
|
+
selectedDeviceRef.current = selectedDevice;
|
|
26747
|
+
}, [selectedDevice]);
|
|
26748
|
+
const lastRecoveryAtRef = reactExports.useRef(0);
|
|
26749
|
+
const RECOVERY_LOOP_GUARD_MS = 1e4;
|
|
26750
|
+
const didFallbackRef = reactExports.useRef(false);
|
|
26751
|
+
const prevIsRecordingRef = reactExports.useRef(false);
|
|
26752
|
+
reactExports.useEffect(() => {
|
|
26753
|
+
if (isCurrentlyRecording && !prevIsRecordingRef.current) {
|
|
26754
|
+
didFallbackRef.current = false;
|
|
26755
|
+
}
|
|
26756
|
+
prevIsRecordingRef.current = isCurrentlyRecording;
|
|
26757
|
+
}, [isCurrentlyRecording]);
|
|
26758
|
+
reactExports.useEffect(() => {
|
|
26759
|
+
stopOnDeviceLostRef.current = async () => {
|
|
26760
|
+
var _a3, _b2, _c, _d;
|
|
26761
|
+
if (state.isStoppingRef.current)
|
|
26762
|
+
return;
|
|
26763
|
+
if (Date.now() - lastRecoveryAtRef.current < RECOVERY_LOOP_GUARD_MS) {
|
|
26764
|
+
if (!didFallbackRef.current) {
|
|
26765
|
+
logger.warn("Ghost device detected — attempting to switch to a different microphone before giving up");
|
|
26766
|
+
try {
|
|
26767
|
+
const fallbackStream = await getMediaStream(null);
|
|
26768
|
+
if (state.isStoppingRef.current) {
|
|
26769
|
+
fallbackStream.getTracks().forEach((t) => t.stop());
|
|
26770
|
+
return;
|
|
26771
|
+
}
|
|
26772
|
+
const fallbackDeviceId = (_a3 = fallbackStream.getAudioTracks()[0]) == null ? void 0 : _a3.getSettings().deviceId;
|
|
26773
|
+
const currentStreamDeviceId = (_c = (_b2 = state.stream) == null ? void 0 : _b2.getAudioTracks()[0]) == null ? void 0 : _c.getSettings().deviceId;
|
|
26774
|
+
if (fallbackDeviceId && fallbackDeviceId !== currentStreamDeviceId) {
|
|
26775
|
+
logger.info(`Switched to fallback microphone (${fallbackDeviceId}) after ghost on ${currentStreamDeviceId}`);
|
|
26776
|
+
didFallbackRef.current = true;
|
|
26777
|
+
lastRecoveryAtRef.current = Date.now();
|
|
26778
|
+
state.setStream(fallbackStream);
|
|
26779
|
+
setToastState({
|
|
26780
|
+
variation: ToastVariation.danger,
|
|
26781
|
+
title: micFallbackText,
|
|
26782
|
+
message: micFallbackMessage,
|
|
26783
|
+
visible: true,
|
|
26784
|
+
duration: 0
|
|
26785
|
+
});
|
|
26786
|
+
return;
|
|
26787
|
+
}
|
|
26788
|
+
fallbackStream.getTracks().forEach((t) => t.stop());
|
|
26789
|
+
logger.warn("Fallback getMediaStream returned the same ghost device — no alternative available");
|
|
26790
|
+
} catch (error) {
|
|
26791
|
+
logger.warn("Fallback getMediaStream failed — no alternative available", error);
|
|
26792
|
+
}
|
|
26793
|
+
} else {
|
|
26794
|
+
logger.warn("Ghost device detected on the fallback too — stopping recording");
|
|
26795
|
+
}
|
|
26796
|
+
stopCapture();
|
|
26797
|
+
setToastState({
|
|
26798
|
+
variation: ToastVariation.danger,
|
|
26799
|
+
title: micDisconnectedText,
|
|
26800
|
+
message: micDisconnectedMessage,
|
|
26801
|
+
visible: true,
|
|
26802
|
+
duration: 0
|
|
26803
|
+
});
|
|
26804
|
+
return;
|
|
26805
|
+
}
|
|
26806
|
+
const currentSegments = segmentsRef.current;
|
|
26807
|
+
let lastPhrase = "";
|
|
26808
|
+
for (let i = currentSegments.length - 1; i >= 0; i--) {
|
|
26809
|
+
const texts = currentSegments[i].text;
|
|
26810
|
+
if (texts == null ? void 0 : texts.length) {
|
|
26811
|
+
const last = texts[texts.length - 1];
|
|
26812
|
+
if (last == null ? void 0 : last.text) {
|
|
26813
|
+
lastPhrase = last.text.length > 60 ? last.text.substring(0, 60) + "…" : last.text;
|
|
26814
|
+
break;
|
|
26815
|
+
}
|
|
26816
|
+
}
|
|
26817
|
+
}
|
|
26818
|
+
const MAX_RETRIES = 3;
|
|
26819
|
+
const RETRY_DELAY = 2e3;
|
|
26820
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
26821
|
+
await sleep(RETRY_DELAY);
|
|
26822
|
+
if (state.isStoppingRef.current)
|
|
26823
|
+
return;
|
|
26824
|
+
try {
|
|
26825
|
+
const requestedDevice = selectedDeviceRef.current;
|
|
26826
|
+
const newStream = await getMediaStream(requestedDevice);
|
|
26827
|
+
if (state.isStoppingRef.current) {
|
|
26828
|
+
newStream.getTracks().forEach((t) => t.stop());
|
|
26829
|
+
return;
|
|
26830
|
+
}
|
|
26831
|
+
const actualDeviceId = (_d = newStream.getAudioTracks()[0]) == null ? void 0 : _d.getSettings().deviceId;
|
|
26832
|
+
const usedFallback = !!requestedDevice && requestedDevice !== "no-permission" && requestedDevice !== "no-devices" && requestedDevice !== "error" && !!actualDeviceId && actualDeviceId !== requestedDevice;
|
|
26833
|
+
if (usedFallback) {
|
|
26834
|
+
logger.warn(`Selected microphone (${requestedDevice}) unavailable — recording continues with fallback device (${actualDeviceId})`);
|
|
26835
|
+
} else {
|
|
26836
|
+
logger.info(`Microphone recovered after ${attempt + 1} attempt(s)`);
|
|
26837
|
+
}
|
|
26838
|
+
lastRecoveryAtRef.current = Date.now();
|
|
26839
|
+
state.setStream(newStream);
|
|
26840
|
+
if (usedFallback) {
|
|
26841
|
+
setToastState({
|
|
26842
|
+
variation: ToastVariation.danger,
|
|
26843
|
+
title: micFallbackText,
|
|
26844
|
+
message: micFallbackMessage,
|
|
26845
|
+
visible: true,
|
|
26846
|
+
duration: 0
|
|
26847
|
+
});
|
|
26848
|
+
}
|
|
26849
|
+
const reconnectedMessage = lastPhrase ? formatMessage2({
|
|
26850
|
+
id: 'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.',
|
|
26851
|
+
defaultMessage: 'The microphone was briefly disconnected. Part of the recording after "{lastPhrase}" may have been lost.'
|
|
26852
|
+
}, { lastPhrase }) : formatMessage2({
|
|
26853
|
+
id: "The microphone was briefly disconnected. Part of the recording may have been lost.",
|
|
26854
|
+
defaultMessage: "The microphone was briefly disconnected. Part of the recording may have been lost."
|
|
26855
|
+
});
|
|
26856
|
+
setToastState({
|
|
26857
|
+
variation: ToastVariation.default,
|
|
26858
|
+
title: micReconnectedText,
|
|
26859
|
+
message: reconnectedMessage,
|
|
26860
|
+
visible: true,
|
|
26861
|
+
duration: 0
|
|
26862
|
+
});
|
|
26863
|
+
return;
|
|
26864
|
+
} catch (e) {
|
|
26865
|
+
logger.debug(`Microphone recovery attempt ${attempt + 1}/${MAX_RETRIES} failed`);
|
|
26866
|
+
}
|
|
26867
|
+
}
|
|
26868
|
+
if (state.isStoppingRef.current)
|
|
26869
|
+
return;
|
|
26870
|
+
stopCapture();
|
|
26871
|
+
setToastState({
|
|
26872
|
+
variation: ToastVariation.danger,
|
|
26873
|
+
title: micDisconnectedText,
|
|
26874
|
+
message: micDisconnectedMessage,
|
|
26875
|
+
visible: true,
|
|
26876
|
+
duration: 0
|
|
26877
|
+
});
|
|
26878
|
+
};
|
|
26879
|
+
}, [
|
|
26880
|
+
setToastState,
|
|
26881
|
+
micDisconnectedText,
|
|
26882
|
+
micDisconnectedMessage,
|
|
26883
|
+
micReconnectedText,
|
|
26884
|
+
micFallbackText,
|
|
26885
|
+
micFallbackMessage,
|
|
26886
|
+
formatMessage2,
|
|
26887
|
+
segmentsRef,
|
|
26888
|
+
state.isStoppingRef,
|
|
26889
|
+
state.setStream,
|
|
26890
|
+
state.stream,
|
|
26891
|
+
stopCapture
|
|
26892
|
+
]);
|
|
26893
|
+
const connectionLostText = formatMessage2({
|
|
26894
|
+
id: "Connection lost",
|
|
26895
|
+
defaultMessage: "Connection lost"
|
|
26896
|
+
});
|
|
26897
|
+
const connectionLostMessage = formatMessage2({
|
|
26898
|
+
id: "Internet connection was lost during recording. Audio may not reach the server until the connection is restored.",
|
|
26899
|
+
defaultMessage: "Internet connection was lost during recording. Audio may not reach the server until the connection is restored."
|
|
26900
|
+
});
|
|
26901
|
+
const connectionRestoredText = formatMessage2({
|
|
26902
|
+
id: "Connection restored",
|
|
26903
|
+
defaultMessage: "Connection restored"
|
|
26904
|
+
});
|
|
26905
|
+
const connectionRestoredMessage = formatMessage2({
|
|
26906
|
+
id: "Internet connection has been restored. Recording continues normally.",
|
|
26907
|
+
defaultMessage: "Internet connection has been restored. Recording continues normally."
|
|
26908
|
+
});
|
|
26909
|
+
const slowConnectionText = formatMessage2({
|
|
26910
|
+
id: "Slow connection",
|
|
26911
|
+
defaultMessage: "Slow connection"
|
|
26912
|
+
});
|
|
26913
|
+
const slowConnectionMessage = formatMessage2({
|
|
26914
|
+
id: "Your internet connection appears to be slow. Some audio may be delayed.",
|
|
26915
|
+
defaultMessage: "Your internet connection appears to be slow. Some audio may be delayed."
|
|
26916
|
+
});
|
|
26917
|
+
reactExports.useEffect(() => {
|
|
26918
|
+
if (!isCurrentlyRecording)
|
|
26919
|
+
return;
|
|
26920
|
+
const handleOffline = () => {
|
|
26921
|
+
logger.warn("Network offline detected during recording");
|
|
26922
|
+
setToastState({
|
|
26923
|
+
variation: ToastVariation.danger,
|
|
26924
|
+
title: connectionLostText,
|
|
26925
|
+
message: connectionLostMessage,
|
|
26926
|
+
visible: true,
|
|
26927
|
+
duration: 0
|
|
26928
|
+
});
|
|
26929
|
+
};
|
|
26930
|
+
const handleOnline = () => {
|
|
26931
|
+
logger.info("Network back online during recording");
|
|
26932
|
+
setToastState({
|
|
26933
|
+
variation: ToastVariation.default,
|
|
26934
|
+
title: connectionRestoredText,
|
|
26935
|
+
message: connectionRestoredMessage,
|
|
26936
|
+
visible: true,
|
|
26937
|
+
duration: 0
|
|
26938
|
+
});
|
|
26939
|
+
};
|
|
26940
|
+
window.addEventListener("offline", handleOffline);
|
|
26941
|
+
window.addEventListener("online", handleOnline);
|
|
26942
|
+
return () => {
|
|
26943
|
+
window.removeEventListener("offline", handleOffline);
|
|
26944
|
+
window.removeEventListener("online", handleOnline);
|
|
26945
|
+
};
|
|
26946
|
+
}, [
|
|
26947
|
+
isCurrentlyRecording,
|
|
26948
|
+
setToastState,
|
|
26949
|
+
connectionLostText,
|
|
26950
|
+
connectionLostMessage,
|
|
26951
|
+
connectionRestoredText,
|
|
26952
|
+
connectionRestoredMessage
|
|
26953
|
+
]);
|
|
26954
|
+
reactExports.useEffect(() => {
|
|
26955
|
+
if (!isCurrentlyRecording || !state.socket)
|
|
26956
|
+
return;
|
|
26957
|
+
const GROWING_TICKS_LIMIT = 5;
|
|
26958
|
+
const MIN_BUFFER = 5e3;
|
|
26959
|
+
let prevBuffered = 0;
|
|
26960
|
+
let growingTicks = 0;
|
|
26961
|
+
let warned = false;
|
|
26962
|
+
const interval = setInterval(() => {
|
|
26963
|
+
if (!state.socket || state.socket.readyState !== WebSocket.OPEN)
|
|
26964
|
+
return;
|
|
26965
|
+
if (!navigator.onLine)
|
|
26966
|
+
return;
|
|
26967
|
+
const current = state.socket.bufferedAmount;
|
|
26968
|
+
if (current > prevBuffered && current > MIN_BUFFER) {
|
|
26969
|
+
growingTicks++;
|
|
26970
|
+
if (growingTicks >= GROWING_TICKS_LIMIT && !warned) {
|
|
26971
|
+
warned = true;
|
|
26972
|
+
logger.warn(`WebSocket buffer growing for ${growingTicks}s (${current} bytes) — slow connection`);
|
|
26973
|
+
setToastState({
|
|
26974
|
+
variation: ToastVariation.danger,
|
|
26975
|
+
title: slowConnectionText,
|
|
26976
|
+
message: slowConnectionMessage,
|
|
26977
|
+
visible: true,
|
|
26978
|
+
duration: 5e3
|
|
26979
|
+
});
|
|
26980
|
+
}
|
|
26981
|
+
} else {
|
|
26982
|
+
growingTicks = 0;
|
|
26983
|
+
warned = false;
|
|
26984
|
+
}
|
|
26985
|
+
prevBuffered = current;
|
|
26986
|
+
}, 1e3);
|
|
26987
|
+
return () => clearInterval(interval);
|
|
26988
|
+
}, [
|
|
26989
|
+
isCurrentlyRecording,
|
|
26990
|
+
state.socket,
|
|
26991
|
+
setToastState,
|
|
26992
|
+
slowConnectionText,
|
|
26993
|
+
slowConnectionMessage
|
|
26994
|
+
]);
|
|
26279
26995
|
const isDisabled = disabled || connectionLoading || chatMicrophoneActive;
|
|
26280
26996
|
return {
|
|
26281
26997
|
stream: state.stream,
|
|
@@ -33596,7 +34312,7 @@ class PromptCache {
|
|
|
33596
34312
|
}
|
|
33597
34313
|
}
|
|
33598
34314
|
const promptCacheSingleton = new PromptCache();
|
|
33599
|
-
const __version__ = "0.5.
|
|
34315
|
+
const __version__ = "0.5.19";
|
|
33600
34316
|
var define_process_env_default = { NODE_ENV: "production" };
|
|
33601
34317
|
let globalEnv;
|
|
33602
34318
|
const isBrowser = () => typeof window !== "undefined" && typeof window.document !== "undefined";
|
|
@@ -35934,6 +36650,22 @@ class Client2 {
|
|
|
35934
36650
|
}
|
|
35935
36651
|
return outputs;
|
|
35936
36652
|
}
|
|
36653
|
+
/**
|
|
36654
|
+
* Filter content from new_token events to prevent streaming LLM output
|
|
36655
|
+
* from being uploaded via events.
|
|
36656
|
+
*/
|
|
36657
|
+
_filterNewTokenEvents(events) {
|
|
36658
|
+
if (!events || events.length === 0) {
|
|
36659
|
+
return events;
|
|
36660
|
+
}
|
|
36661
|
+
return events.map((event) => {
|
|
36662
|
+
if (event.name === "new_token") {
|
|
36663
|
+
const _a3 = event, { kwargs: _2 } = _a3, rest2 = __objRest(_a3, ["kwargs"]);
|
|
36664
|
+
return rest2;
|
|
36665
|
+
}
|
|
36666
|
+
return event;
|
|
36667
|
+
});
|
|
36668
|
+
}
|
|
35937
36669
|
async prepareRunCreateOrUpdateInputs(run) {
|
|
35938
36670
|
const runParams = __spreadValues({}, run);
|
|
35939
36671
|
if (runParams.inputs !== void 0) {
|
|
@@ -35942,6 +36674,9 @@ class Client2 {
|
|
|
35942
36674
|
if (runParams.outputs !== void 0) {
|
|
35943
36675
|
runParams.outputs = await this.processOutputs(runParams.outputs);
|
|
35944
36676
|
}
|
|
36677
|
+
if (runParams.events !== void 0) {
|
|
36678
|
+
runParams.events = this._filterNewTokenEvents(runParams.events);
|
|
36679
|
+
}
|
|
35945
36680
|
return runParams;
|
|
35946
36681
|
}
|
|
35947
36682
|
async _getResponse(path2, queryParams) {
|
|
@@ -36707,6 +37442,9 @@ Context: ${context}`);
|
|
|
36707
37442
|
if (run.outputs) {
|
|
36708
37443
|
run.outputs = await this.processOutputs(run.outputs);
|
|
36709
37444
|
}
|
|
37445
|
+
if (run.events) {
|
|
37446
|
+
run.events = this._filterNewTokenEvents(run.events);
|
|
37447
|
+
}
|
|
36710
37448
|
const data = __spreadProps(__spreadValues({}, run), { id: runId });
|
|
36711
37449
|
if (!this._filterForSampling([data], true).length) {
|
|
36712
37450
|
return;
|
|
@@ -124530,8 +125268,17 @@ const MicrophoneButton = ({ onTextUpdate, disabled = false }) => {
|
|
|
124530
125268
|
getMicrophones(newStream);
|
|
124531
125269
|
} catch (error) {
|
|
124532
125270
|
logger.audioError("Microphone error:", error);
|
|
124533
|
-
|
|
124534
|
-
|
|
125271
|
+
if (isNoMicrophoneError(error)) {
|
|
125272
|
+
setNoMicrophoneToast(setToastState, formatMessage2({
|
|
125273
|
+
id: "No microphone available",
|
|
125274
|
+
defaultMessage: "No microphone available"
|
|
125275
|
+
}), formatMessage2({
|
|
125276
|
+
id: "Connect a microphone and try again.",
|
|
125277
|
+
defaultMessage: "Connect a microphone and try again."
|
|
125278
|
+
}));
|
|
125279
|
+
} else {
|
|
125280
|
+
setDeniedPermissionToast(setToastState, toastText);
|
|
125281
|
+
}
|
|
124535
125282
|
}
|
|
124536
125283
|
}
|
|
124537
125284
|
};
|
|
@@ -125386,20 +126133,31 @@ const ChatView = () => {
|
|
|
125386
126133
|
const Chat$1 = () => {
|
|
125387
126134
|
return jsxRuntimeExports.jsx(ChatView, {});
|
|
125388
126135
|
};
|
|
125389
|
-
const
|
|
125390
|
-
const { message, visible, setToastState, title, variation, duration } = useToastContext();
|
|
126136
|
+
const ToastItem = ({ toast, id: id2, removeToast }) => {
|
|
125391
126137
|
const [show, setShow] = reactExports.useState(false);
|
|
126138
|
+
const dismiss = reactExports.useCallback(() => {
|
|
126139
|
+
setShow(false);
|
|
126140
|
+
setTimeout(() => removeToast(id2), 300);
|
|
126141
|
+
}, [removeToast, id2]);
|
|
125392
126142
|
reactExports.useEffect(() => {
|
|
125393
|
-
|
|
125394
|
-
|
|
125395
|
-
const
|
|
125396
|
-
|
|
125397
|
-
|
|
125398
|
-
|
|
125399
|
-
|
|
126143
|
+
const showTimer = setTimeout(() => setShow(true), 10);
|
|
126144
|
+
if (toast.duration && toast.duration > 0) {
|
|
126145
|
+
const dismissTimer = setTimeout(dismiss, toast.duration);
|
|
126146
|
+
return () => {
|
|
126147
|
+
clearTimeout(showTimer);
|
|
126148
|
+
clearTimeout(dismissTimer);
|
|
126149
|
+
};
|
|
125400
126150
|
}
|
|
125401
|
-
|
|
125402
|
-
|
|
126151
|
+
return () => clearTimeout(showTimer);
|
|
126152
|
+
}, [toast.duration, dismiss]);
|
|
126153
|
+
const isPersistent = toast.duration === 0;
|
|
126154
|
+
return jsxRuntimeExports.jsxs("div", { role: "alert", className: `omniscribe_toast-item ${toast.variation === ToastVariation.danger ? "omniscribe_toast-item-danger" : "omniscribe_toast-item-black"} ${show ? "omniscribe_toast-item-show" : "omniscribe_toast-item-hide"}`, children: [jsxRuntimeExports.jsxs("div", { className: "omniscribe_toast-subcontainer", children: [jsxRuntimeExports.jsx("span", { className: "omniscribe_toast-title", children: toast.title }), jsxRuntimeExports.jsx("span", { className: "omniscribe_toast-msg", children: toast.message })] }), isPersistent && jsxRuntimeExports.jsx("button", { className: "omniscribe_toast-close", onClick: dismiss, "aria-label": "Close", children: "✕" })] });
|
|
126155
|
+
};
|
|
126156
|
+
const Toast = () => {
|
|
126157
|
+
const { toasts, removeToast } = useToastContext();
|
|
126158
|
+
if (toasts.length === 0)
|
|
126159
|
+
return null;
|
|
126160
|
+
return jsxRuntimeExports.jsx("div", { className: "omniscribe_toast-stack", "aria-live": "polite", children: toasts.map((t) => jsxRuntimeExports.jsx(ToastItem, { toast: t, id: t.id, removeToast }, t.id)) });
|
|
125403
126161
|
};
|
|
125404
126162
|
const ArrowIcon = ({ className, width = 16, height = 16, strokeColor = "#4A5364" }) => jsxRuntimeExports.jsxs("svg", { width, height, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", className, children: [jsxRuntimeExports.jsx("path", { d: "M8.00033 3.33335L12.667 8.00002L8.00033 12.6667", stroke: strokeColor, strokeLinecap: "round", strokeLinejoin: "round" }), jsxRuntimeExports.jsx("path", { d: "M3.33366 8L12.667 8", stroke: strokeColor, strokeLinecap: "round", strokeLinejoin: "round" })] });
|
|
125405
126163
|
const ConfigurationItem = ({ title, description, icon: icon2, onClick, onKeyDown }) => jsxRuntimeExports.jsxs("div", { className: "omniscribe_config-item", onClick, role: "button", tabIndex: 0, onKeyDown: (e) => onKeyDown(e, onClick), children: [jsxRuntimeExports.jsx("div", { className: "omniscribe_config-item-icon", children: icon2 }), jsxRuntimeExports.jsxs("div", { className: "omniscribe_config-item-content", children: [jsxRuntimeExports.jsx("h3", { className: "omniscribe_config-item-title", children: title }), jsxRuntimeExports.jsx("p", { className: "omniscribe_config-item-description", children: description })] }), jsxRuntimeExports.jsx("div", { className: "omniscribe_config-item-arrow", children: jsxRuntimeExports.jsx(ArrowIcon, {}) })] });
|
|
@@ -126505,7 +127263,6 @@ const AppSkeleton = () => {
|
|
|
126505
127263
|
const WIDTH = "650px";
|
|
126506
127264
|
const HEIGHT = "665px";
|
|
126507
127265
|
const App = () => {
|
|
126508
|
-
const toast = useToastContext();
|
|
126509
127266
|
const { isLoading: isSettingsLoading } = useSettingsContext();
|
|
126510
127267
|
const [isChat, setIsChat] = reactExports.useState(true);
|
|
126511
127268
|
const [showConfig, setShowConfig] = reactExports.useState(false);
|
|
@@ -126524,37 +127281,59 @@ const App = () => {
|
|
|
126524
127281
|
if (isSettingsLoading) {
|
|
126525
127282
|
return jsxRuntimeExports.jsx(OmniscribeContainer, { width: WIDTH, height: HEIGHT, children: jsxRuntimeExports.jsx(OmniscribeLayout, { children: jsxRuntimeExports.jsx(AppSkeleton, {}) }) });
|
|
126526
127283
|
}
|
|
126527
|
-
return jsxRuntimeExports.jsx(OmniscribeContainer, { width: WIDTH, height: HEIGHT, children: jsxRuntimeExports.jsxs(OmniscribeLayout, { children: [jsxRuntimeExports.jsx(UtilityButtons, { isChat, setIsChat, showConfig, setShowConfig, configScreen, setConfigScreen }), renderContent(),
|
|
127284
|
+
return jsxRuntimeExports.jsx(OmniscribeContainer, { width: WIDTH, height: HEIGHT, children: jsxRuntimeExports.jsxs(OmniscribeLayout, { children: [jsxRuntimeExports.jsx(UtilityButtons, { isChat, setIsChat, showConfig, setShowConfig, configScreen, setConfigScreen }), renderContent(), jsxRuntimeExports.jsx(Toast, {})] }) });
|
|
126528
127285
|
};
|
|
127286
|
+
let nextId = 0;
|
|
126529
127287
|
const ToastProvider = ({ toast, children }) => {
|
|
126530
|
-
const [
|
|
126531
|
-
|
|
126532
|
-
|
|
126533
|
-
|
|
126534
|
-
|
|
126535
|
-
|
|
126536
|
-
|
|
127288
|
+
const [toasts, setToasts] = reactExports.useState([]);
|
|
127289
|
+
const addToast = reactExports.useCallback((t) => {
|
|
127290
|
+
if (!t.visible)
|
|
127291
|
+
return;
|
|
127292
|
+
setToasts((prev) => {
|
|
127293
|
+
const isDupe = prev.some((existing) => existing.title === t.title && existing.message === t.message);
|
|
127294
|
+
if (isDupe && t.duration !== 0) {
|
|
127295
|
+
return prev;
|
|
127296
|
+
}
|
|
127297
|
+
const base = isDupe ? prev.filter((existing) => !(existing.title === t.title && existing.message === t.message)) : prev;
|
|
127298
|
+
const id2 = String(++nextId);
|
|
127299
|
+
const next = [...base, __spreadProps(__spreadValues({ duration: 3e3 }, t), { id: id2 })];
|
|
127300
|
+
return next.length > MAX_TOASTS ? next.slice(-MAX_TOASTS) : next;
|
|
127301
|
+
});
|
|
127302
|
+
}, []);
|
|
127303
|
+
const removeToast = reactExports.useCallback((id2) => {
|
|
127304
|
+
setToasts((prev) => prev.filter((t) => t.id !== id2));
|
|
127305
|
+
}, []);
|
|
127306
|
+
const setToastState = reactExports.useCallback((action) => {
|
|
127307
|
+
if (action.visible) {
|
|
127308
|
+
addToast(action);
|
|
127309
|
+
}
|
|
127310
|
+
}, [addToast]);
|
|
126537
127311
|
reactExports.useEffect(() => {
|
|
126538
|
-
var _a3;
|
|
127312
|
+
var _a3, _b2, _c, _d;
|
|
126539
127313
|
if (toast) {
|
|
126540
|
-
|
|
126541
|
-
|
|
126542
|
-
|
|
126543
|
-
|
|
126544
|
-
|
|
126545
|
-
|
|
126546
|
-
|
|
126547
|
-
|
|
127314
|
+
try {
|
|
127315
|
+
const parsed = typeof toast === "string" ? JSON.parse(toast) : toast;
|
|
127316
|
+
if (parsed.visible) {
|
|
127317
|
+
addToast({
|
|
127318
|
+
title: (_a3 = parsed.title) != null ? _a3 : "",
|
|
127319
|
+
message: (_b2 = parsed.message) != null ? _b2 : "",
|
|
127320
|
+
visible: true,
|
|
127321
|
+
variation: (_c = parsed.variation) != null ? _c : ToastVariation.default,
|
|
127322
|
+
duration: (_d = parsed.duration) != null ? _d : 3e3
|
|
127323
|
+
});
|
|
127324
|
+
}
|
|
127325
|
+
} catch (e) {
|
|
127326
|
+
logger.warn("ToastProvider: invalid JSON in toast prop");
|
|
127327
|
+
}
|
|
126548
127328
|
}
|
|
126549
|
-
}, [toast]);
|
|
126550
|
-
|
|
126551
|
-
|
|
126552
|
-
|
|
126553
|
-
|
|
126554
|
-
variation,
|
|
126555
|
-
duration,
|
|
127329
|
+
}, [toast, addToast]);
|
|
127330
|
+
const contextValue = reactExports.useMemo(() => ({
|
|
127331
|
+
toasts,
|
|
127332
|
+
addToast,
|
|
127333
|
+
removeToast,
|
|
126556
127334
|
setToastState
|
|
126557
|
-
},
|
|
127335
|
+
}), [toasts, addToast, removeToast, setToastState]);
|
|
127336
|
+
return jsxRuntimeExports.jsx(ToastContext.Provider, { value: contextValue, children });
|
|
126558
127337
|
};
|
|
126559
127338
|
const TranscriptorProvider = ({ transcriptorSelectValues, screenLoader, children }) => {
|
|
126560
127339
|
const [{ segments, userTranscriptions, roomState, modalTextAreaInstructions, selectValues, selectedData, devices, selectedDevice, permission, transcriptorLoader, enabled, connectionLoading, generating, chatMicrophoneActive }, setState] = reactExports.useState({
|
|
@@ -127325,10 +128104,21 @@ function ProcessingThreadsProvider({ children }) {
|
|
|
127325
128104
|
]);
|
|
127326
128105
|
return jsxRuntimeExports.jsx(ProcessingThreadsContext.Provider, { value, children });
|
|
127327
128106
|
}
|
|
128107
|
+
const appendClientVersion = (url) => {
|
|
128108
|
+
if (!url)
|
|
128109
|
+
return url;
|
|
128110
|
+
try {
|
|
128111
|
+
const parsed = new URL(url);
|
|
128112
|
+
parsed.searchParams.set("client_version", version$2);
|
|
128113
|
+
return parsed.toString();
|
|
128114
|
+
} catch (e) {
|
|
128115
|
+
return url;
|
|
128116
|
+
}
|
|
128117
|
+
};
|
|
127328
128118
|
const ApiConfigProvider = ({ children, clientBaseUrl, clientWssUrl, clientApiKey, isOpen, setIsOpen, hasTemplateConfig }) => {
|
|
127329
128119
|
const [{ baseUrl, langGraphBaseUrl, apiKey, wssUrl }, setConfig] = reactExports.useState({
|
|
127330
128120
|
baseUrl: clientBaseUrl,
|
|
127331
|
-
wssUrl: clientWssUrl,
|
|
128121
|
+
wssUrl: appendClientVersion(clientWssUrl),
|
|
127332
128122
|
langGraphBaseUrl: clientBaseUrl + "/lang-graph/",
|
|
127333
128123
|
apiKey: clientApiKey
|
|
127334
128124
|
});
|
|
@@ -127339,7 +128129,7 @@ const ApiConfigProvider = ({ children, clientBaseUrl, clientWssUrl, clientApiKey
|
|
|
127339
128129
|
if (clientBaseUrl && clientApiKey) {
|
|
127340
128130
|
setConfig({
|
|
127341
128131
|
baseUrl: clientBaseUrl,
|
|
127342
|
-
wssUrl: clientWssUrl,
|
|
128132
|
+
wssUrl: appendClientVersion(clientWssUrl),
|
|
127343
128133
|
langGraphBaseUrl: clientBaseUrl + "/lang-graph/",
|
|
127344
128134
|
apiKey: clientApiKey
|
|
127345
128135
|
});
|
|
@@ -129340,7 +130130,7 @@ const zig$1 = /* @__PURE__ */ _mergeNamespaces({
|
|
|
129340
130130
|
__proto__: null,
|
|
129341
130131
|
default: zig
|
|
129342
130132
|
}, [zigExports]);
|
|
129343
|
-
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#Omniscribe {\n font-family: 'Lato', sans-serif;\n /* define colors */\n --active: #0a3785;\n --background-primary: #e7effd;\n --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: #e5e7ec;\n --custom-black: #13161a;\n --primary: #105bdb;\n --border: #e5e7ec;\n --white: #fdfdfd;\n --omni: #daf2ff;\n --omni-secondary: rgba(219, 219, 219, 0.75);\n --primary-button: #105bdb;\n --primary-text: #36a3cf;\n --primary-900: #061044;\n --blue-100: #dbeafe;\n --blue-200: #bfdbfe;\n --blue-500: #105bdb;\n --blue-600: #2563eb;\n --blue-700: #1d4ed8;\n --report: var(--primary-button);\n --gray: #616161;\n --black: #1b2125;\n --sky-blue: #dbecff;\n --blue: #5886ba;\n --blue-600: #0b1962;\n --background: #f3f3f3bb;\n --foreground: oklch(0.145 0 0);\n --primary: #061044;\n --primary-foreground: oklch(0.985 0 0);\n --secondary: #132caa;\n --secondary-foreground: #fff;\n --secondary-hover: #2847e7;\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: 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: 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/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: 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: 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.omniscribe_chat-view-footer-scroll-to-bottom {\n position: fixed;\n bottom: 17%;\n left: 50%;\n transform: translateX(-50%);\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: white;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n\n/* Footer swap - crossfade between expanded/collapsed rows */\n.omniscribe_chat-view-footer-swap {\n position: relative;\n}\n\n.omniscribe_chat-view-footer-swap-layer {\n opacity: 0;\n pointer-events: none;\n}\n\n.omniscribe_chat-view-footer-swap-layer--visible {\n opacity: 1;\n pointer-events: auto;\n transition: opacity 0.3s ease;\n}\n\n/* Hide the inactive layer so it doesn't take space */\n.omniscribe_chat-view-footer-swap-layer:not(\n .omniscribe_chat-view-footer-swap-layer--visible\n ) {\n position: absolute;\n inset: 0;\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: 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: 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.omniscribe_chat-view-combined-input-container--with-files {\n border-radius: 20px;\n gap: 12px;\n align-items: flex-start;\n min-width: 0;\n max-width: 462px;\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: white;\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: solid 1px #e5e7ec;\n}\n\n.omniscribe_chat-view-combined-clip-icon:hover {\n background-color: #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: #4a5364;\n height: 20px;\n}\n\n.omniscribe_chat-view-combined-textarea::placeholder {\n color: var(--color-gray-400, #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: #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: #2847e7;\n}\n\n.omniscribe_chat-view-combined-send-btn:disabled {\n background-color: #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: #132caa;\n}\n\n.omniscribe_chat-view-combined-stop-btn:hover {\n background-color: #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: #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: #e7effd !important;\n color: #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: #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(--Text-Active, #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 #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: white;\n border-bottom: 1px solid var(--Stroke-greyscale-Active, #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: #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: #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/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: #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: #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: 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: #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: #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: #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: #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: #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.omniscribe_transcribe-dropdown {\n display: flex;\n align-items: center;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: white;\n transition: all 0.2s ease;\n font-size: var(--font-size-100, 14px);\n font-weight: 500;\n color: var(--color-gray-700, #374151);\n white-space: nowrap;\n overflow: hidden;\n flex-shrink: 0;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25);\n margin-bottom: 7px;\n margin-left: 1px;\n padding-inline: 12px;\n}\n\n/* Expanded state - no pill style */\n.omniscribe_transcribe-dropdown--expanded {\n border: none;\n background-color: transparent;\n box-shadow: none;\n}\n\n.omniscribe_transcribe-dropdown--expanded\n .omniscribe_transcribe-dropdown--recording {\n background-color: transparent;\n border: none;\n}\n\n.omniscribe_transcribe-dropdown:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--color-gray-50, #f9fafb);\n border-color: var(--color-gray-300, #d1d5db);\n}\n\n.omniscribe_transcribe-dropdown-main {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 8px 8px 0px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: inherit;\n font-weight: inherit;\n color: inherit;\n}\n\n.omniscribe_transcribe-dropdown--expanded .omniscribe_transcribe-dropdown-main {\n padding-block: 0;\n}\n\n.omniscribe_transcribe-dropdown-main:disabled {\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-dropdown-expand {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 12px 8px 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n.omniscribe_transcribe-dropdown-expand:disabled {\n cursor: not-allowed;\n}\n\n/* Recording state - neutral gray, NOT red */\n.omniscribe_transcribe-dropdown--recording {\n background-color: var(--color-gray-50, #f9fafb);\n border-color: var(--color-gray-300, #d1d5db);\n color: var(--color-gray-700, #374151);\n}\n\n.omniscribe_transcribe-dropdown--recording:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--color-gray-100, #f3f4f6);\n}\n\n.omniscribe_transcribe-dropdown--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Icon container with blue background like Figma */\n.omniscribe_transcribe-dropdown-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 9999px;\n background-color: #e7effd;\n}\n\n.omniscribe_transcribe-dropdown-icon svg {\n color: var(--color-primary, #2563eb);\n}\n\n/* Recording state - keep blue icon with pulse animation */\n.omniscribe_transcribe-dropdown--recording\n .omniscribe_transcribe-dropdown-icon {\n background-color: #e7effd;\n animation: transcribe-pulse 1.5s ease-in-out infinite;\n}\n\n.omniscribe_transcribe-dropdown--recording\n .omniscribe_transcribe-dropdown-icon\n svg {\n color: var(--color-primary, #2563eb);\n}\n\n@keyframes transcribe-pulse {\n 0%,\n 100% {\n opacity: 1;\n box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.4);\n }\n 50% {\n opacity: 0.6;\n box-shadow: 0 0 0 4px rgba(37, 99, 235, 0);\n }\n}\n\n.omniscribe_transcribe-dropdown-label {\n flex: 1;\n text-align: left;\n}\n\n.omniscribe_transcribe-dropdown-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-gray-400, #9ca3af);\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(--color-gray-600, #4b5563);\n}\n\n/* Generate Report Button - Figma style */\n.omniscribe_transcribe-generate-btn {\n border-radius: 12px !important;\n gap: 8px;\n padding-block: 4px !important;\n padding-inline: 8px !important;\n height: auto !important;\n}\n\n.omniscribe_transcribe-generate-btn:hover:not(:disabled) {\n background-color: #1d4ed8;\n}\n\n.omniscribe_transcribe-generate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Collapsed state - vertical pill */\n.omniscribe_transcribe-collapsed {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: white;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\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: #e7effd;\n color: var(--color-primary, #2563eb);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-play:hover:not(:disabled) {\n background-color: #d0e0fc;\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 animation: transcribe-pulse 1.5s ease-in-out infinite;\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(--color-gray-500, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-expand:hover:not(:disabled) {\n background-color: var(--color-gray-100, #f3f4f6);\n color: var(--color-gray-700, #374151);\n}\n\n\n/* Source: modules/chat/components/input/TranscriptionPanel.css */\n/* Animated wrapper for expand/collapse */\n.omniscribe_transcription-panel-wrapper {\n height: 0;\n opacity: 0;\n overflow: hidden;\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.5);\n opacity: 1;\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: #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(--color-gray-100, #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: #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(--color-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: #f6f7f9;\n padding: 4px;\n border-radius: 8px;\n color: #13161a;\n line-height: 1.7 !important;\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: #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: #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: #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: #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: #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: #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: #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: #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: #f5f5f5;\n border: 1px solid #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: #f8f9fa;\n color: #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: #f8f9fa;\n color: #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: #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: #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: #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: #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: #f8f9fa;\n border: 1px solid #e0e0e0;\n transition: background-color 0.2s ease;\n max-width: 280px;\n}\n\n.omniscribe_message-document:hover {\n background-color: #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: #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: #6c757d;\n}\n\n.omniscribe_message-documents-count {\n margin-top: 4px;\n font-size: 11px;\n color: #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: #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: #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: #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: #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(--Greyscale-200, #edeff2);\n border: 1px solid var(--Stroke-greyscale-Active, #e5e7ec);\n border-radius: var(--Radius-radius-round, 99999px);\n cursor: pointer;\n color: #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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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: #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\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: #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(--Stroke-greyscale-Active, #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: #f6f7f9;\n border-top: 1px solid #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: #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(--Text-greyscale-Primary, #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: #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: #ffffff;\n overflow: hidden;\n border-bottom: 1px solid var(--Stroke-greyscale-Active, #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(--Greyscale-100, #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(--Stroke-greyscale-Active, #e5e7ec);\n position: relative;\n padding: 8px;\n display: flex;\n align-items: center;\n\n &:hover {\n background-color: var(--Greyscale-100, #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(--Greyscale-100, #f6f7f9);\n border: 1px solid var(--Stroke-greyscale-Active, #105bdb);\n}\n\n.omniscribe_btn-label {\n margin-left: 6px;\n font-size: 14px;\n color: #212529;\n font-weight: 500;\n}\n\n.omniscribe_btn-label-active {\n color: #105bdb;\n}\n\n.omniscribe_btn-label-inactive {\n color: #212529;\n}\n\n.omniscribe_icon {\n color: var(--active-black);\n}\n\n.omniscribe_icon-active {\n color: #105bdb;\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(--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 #e5e7ec;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: #374151;\n background-color: white;\n resize: none;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_chat-prompt-textarea::placeholder {\n color: #9ca3af;\n font-style: italic;\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: #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: #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(--primary-color, #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}\n\n.omniscribe_source-checkbox {\n width: 16px;\n height: 16px;\n accent-color: #105bdb;\n cursor: pointer;\n}\n\n.omniscribe_source-name {\n flex: 1;\n font-size: 12px;\n color: #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: #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: #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: #252a32;\n margin: 0;\n}\n\n.omniscribe_source-selector-description {\n font-size: 14px;\n color: #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(--Stroke-greyscale-Active, #e5e7ec);\n background: #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: #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: #f9fafb;\n}\n\n.omniscribe_config-item:focus {\n outline: none;\n background-color: #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: #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: #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: #4a5364;\n}\n\n.omniscribe_config-item-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #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: #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: #374151;\n line-height: 1.4;\n}\n\n.omniscribe_config-language-section {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_config-language-section-title {\n font-size: 16px;\n font-weight: 600;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.omniscribe_config-subscreen-description {\n margin: 0 0 0 0;\n font-size: 14px;\n line-height: 18px;\n color: #13161a;\n font-weight: 400;\n}\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 #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: #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: #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: #e5e8eb;\n color: #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: #f9fafb;\n border: 1px solid #e5e8eb;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.omniscribe_config-dictionary-row:hover {\n background-color: #f3f4f6;\n border-color: #d1d5db;\n}\n\n.omniscribe_config-dictionary-cell {\n flex: 1;\n font-size: 14px;\n line-height: 20px;\n color: #374151;\n word-break: break-word;\n font-weight: 500;\n}\n\n.omniscribe_config-dictionary-arrow {\n color: #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: #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: #6b7280;\n font-size: 14px;\n line-height: 20px;\n background-color: #f9fafb;\n border: 2px dashed #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: #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: #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 #e5e7ec;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: #374151;\n background-color: 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: #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: white;\n border-bottom: 1px solid #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: #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: #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: #f3f4f6;\n}\n\n.omniscribe_template-field-content {\n padding: 0 0 12px 34px;\n background: 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 #e1e8ed;\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n background: 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: #95a5a6;\n display: flex;\n}\n\n/* Template fields container */\n.omniscribe_template-fields {\n display: flex;\n flex-direction: column;\n background: 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: #f6f7f9;\n color: #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: 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/report-button/ReportButton.css */\n.omniscribe_report-button-container {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n}\n.omniscribe_report-button-width {\n max-height: 32px;\n font-size: var(--text-xs) !important;\n}\n.omniscribe_regenerate-button-width {\n max-height: 32px;\n background-color: var(--blue-500) !important;\n font-size: var(--text-xs) !important;\n}\n.omniscribe_regenerate-button-width:hover {\n background-color: #0c48ad !important; /* darker shade of blue */\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: #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 #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 #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: #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: #a4adbc;\n}\n\n.omniscribe_audio-recorder-refresh-icon {\n color: #252a32;\n}\n\n.omniscribe_audio-recorder-star-icon {\n cursor: pointer;\n display: inline-block;\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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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 &: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: #edeff2;\n cursor: not-allowed;\n color: #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: white;\n border: 1px solid #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 #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: #6b7280;\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-close:hover {\n background-color: #f3f4f6;\n color: #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: white;\n color: black;\n border: 1px solid #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: white;\n border: 1px solid #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: white;\n color: black;\n border: 1px solid #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: white;\n color: black;\n border: 1px solid #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(--light-border);\n cursor: pointer;\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(--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(--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(--Stroke-greyscale-Active, #e5e7ec);\n flex-shrink: 0;\n}\n\n.omniscribe_separator--horizontal {\n height: 0;\n width: 100%;\n border-top: 1px solid var(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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-container {\n position: fixed;\n bottom: calc(var(--spacing) * 5);\n top: calc(var(--spacing) * -30);\n border-radius: var(--radius);\n padding: calc(var(--spacing) * 4);\n height: fit-content;\n transition-duration: 500ms;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n width: calc(var(--spacing) * 120);\n}\n\n.omniscribe_toast-container-danger {\n background-color: var(--color-red-500);\n}\n.omniscribe_toast-container-black {\n background-color: var(--black);\n}\n.omniscribe_toast-container-show {\n right: calc(var(--spacing) * 10);\n}\n.omniscribe_toast-container-hide {\n right: -100%;\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}\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\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: #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 #132caa;\n}\n\n.omniscribe_toggle-switch-checked {\n background-color: #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 background-color: 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: #6b7280;\n min-width: 70px;\n}\n\n.omniscribe_toggle-switch-checked + .omniscribe_toggle-status {\n color: #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: #ffffff;\n color: #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: #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";
|
|
130133
|
+
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#Omniscribe {\n font-family: 'Lato', sans-serif;\n /* define colors */\n --active: #0a3785;\n --background-primary: #e7effd;\n --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: #e5e7ec;\n --custom-black: #13161a;\n --primary: #105bdb;\n --border: #e5e7ec;\n --white: #fdfdfd;\n --omni: #daf2ff;\n --omni-secondary: rgba(219, 219, 219, 0.75);\n --primary-button: #105bdb;\n --primary-text: #36a3cf;\n --primary-900: #061044;\n --blue-100: #dbeafe;\n --blue-200: #bfdbfe;\n --blue-500: #105bdb;\n --blue-600: #2563eb;\n --blue-700: #1d4ed8;\n --report: var(--primary-button);\n --gray: #616161;\n --black: #1b2125;\n --sky-blue: #dbecff;\n --blue: #5886ba;\n --blue-600: #0b1962;\n --background: #f3f3f3bb;\n --foreground: oklch(0.145 0 0);\n --primary: #061044;\n --primary-foreground: oklch(0.985 0 0);\n --secondary: #132caa;\n --secondary-foreground: #fff;\n --secondary-hover: #2847e7;\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: 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: 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/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: 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: 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.omniscribe_chat-view-footer-scroll-to-bottom {\n position: fixed;\n bottom: 17%;\n left: 50%;\n transform: translateX(-50%);\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: white;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n}\n\n/* Footer swap - crossfade between expanded/collapsed rows */\n.omniscribe_chat-view-footer-swap {\n position: relative;\n}\n\n.omniscribe_chat-view-footer-swap-layer {\n opacity: 0;\n pointer-events: none;\n}\n\n.omniscribe_chat-view-footer-swap-layer--visible {\n opacity: 1;\n pointer-events: auto;\n transition: opacity 0.3s ease;\n}\n\n/* Hide the inactive layer so it doesn't take space */\n.omniscribe_chat-view-footer-swap-layer:not(\n .omniscribe_chat-view-footer-swap-layer--visible\n ) {\n position: absolute;\n inset: 0;\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: 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: 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.omniscribe_chat-view-combined-input-container--with-files {\n border-radius: 20px;\n gap: 12px;\n align-items: flex-start;\n min-width: 0;\n max-width: 462px;\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: white;\n cursor: pointer;\n transition: background-color 0.2s ease;\n border: solid 1px #e5e7ec;\n}\n\n.omniscribe_chat-view-combined-clip-icon:hover {\n background-color: #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: #4a5364;\n height: 20px;\n}\n\n.omniscribe_chat-view-combined-textarea::placeholder {\n color: var(--color-gray-400, #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: #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: #2847e7;\n}\n\n.omniscribe_chat-view-combined-send-btn:disabled {\n background-color: #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: #132caa;\n}\n\n.omniscribe_chat-view-combined-stop-btn:hover {\n background-color: #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: #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: #e7effd !important;\n color: #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: #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(--Text-Active, #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 #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: white;\n border-bottom: 1px solid var(--Stroke-greyscale-Active, #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: #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: #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/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: #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: #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: 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: #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: #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: #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: #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: #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.omniscribe_transcribe-dropdown {\n display: flex;\n align-items: center;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n background-color: white;\n transition: all 0.2s ease;\n font-size: var(--font-size-100, 14px);\n font-weight: 500;\n color: var(--color-gray-700, #374151);\n white-space: nowrap;\n overflow: hidden;\n flex-shrink: 0;\n box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25);\n margin-bottom: 7px;\n margin-left: 1px;\n padding-inline: 12px;\n}\n\n/* Expanded state - no pill style */\n.omniscribe_transcribe-dropdown--expanded {\n border: none;\n background-color: transparent;\n box-shadow: none;\n}\n\n.omniscribe_transcribe-dropdown--expanded\n .omniscribe_transcribe-dropdown--recording {\n background-color: transparent;\n border: none;\n}\n\n.omniscribe_transcribe-dropdown:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--color-gray-50, #f9fafb);\n border-color: var(--color-gray-300, #d1d5db);\n}\n\n.omniscribe_transcribe-dropdown-main {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 8px 8px 0px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: inherit;\n font-weight: inherit;\n color: inherit;\n}\n\n.omniscribe_transcribe-dropdown--expanded .omniscribe_transcribe-dropdown-main {\n padding-block: 0;\n}\n\n.omniscribe_transcribe-dropdown-main:disabled {\n cursor: not-allowed;\n}\n\n.omniscribe_transcribe-dropdown-expand {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 12px 8px 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n.omniscribe_transcribe-dropdown-expand:disabled {\n cursor: not-allowed;\n}\n\n/* Recording state - neutral gray, NOT red */\n.omniscribe_transcribe-dropdown--recording {\n background-color: var(--color-gray-50, #f9fafb);\n border-color: var(--color-gray-300, #d1d5db);\n color: var(--color-gray-700, #374151);\n}\n\n.omniscribe_transcribe-dropdown--recording:hover:not(\n .omniscribe_transcribe-dropdown--disabled\n ) {\n background-color: var(--color-gray-100, #f3f4f6);\n}\n\n.omniscribe_transcribe-dropdown--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Icon container with blue background like Figma */\n.omniscribe_transcribe-dropdown-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 9999px;\n background-color: #e7effd;\n}\n\n.omniscribe_transcribe-dropdown-icon svg {\n color: var(--color-primary, #2563eb);\n}\n\n/* Recording state - keep blue icon with pulse animation */\n.omniscribe_transcribe-dropdown--recording\n .omniscribe_transcribe-dropdown-icon {\n background-color: #e7effd;\n animation: transcribe-pulse 1.5s ease-in-out infinite;\n}\n\n.omniscribe_transcribe-dropdown--recording\n .omniscribe_transcribe-dropdown-icon\n svg {\n color: var(--color-primary, #2563eb);\n}\n\n@keyframes transcribe-pulse {\n 0%,\n 100% {\n opacity: 1;\n box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.4);\n }\n 50% {\n opacity: 0.6;\n box-shadow: 0 0 0 4px rgba(37, 99, 235, 0);\n }\n}\n\n.omniscribe_transcribe-dropdown-label {\n flex: 1;\n text-align: left;\n}\n\n.omniscribe_transcribe-dropdown-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-gray-400, #9ca3af);\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(--color-gray-600, #4b5563);\n}\n\n/* Generate Report Button - Figma style */\n.omniscribe_transcribe-generate-btn {\n border-radius: 12px !important;\n gap: 8px;\n padding-block: 4px !important;\n padding-inline: 8px !important;\n height: auto !important;\n}\n\n.omniscribe_transcribe-generate-btn:hover:not(:disabled) {\n background-color: #1d4ed8;\n}\n\n.omniscribe_transcribe-generate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Collapsed state - vertical pill */\n.omniscribe_transcribe-collapsed {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background-color: white;\n border: 1px solid var(--border, #e5e7eb);\n border-radius: 9999px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\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: #e7effd;\n color: var(--color-primary, #2563eb);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-play:hover:not(:disabled) {\n background-color: #d0e0fc;\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 animation: transcribe-pulse 1.5s ease-in-out infinite;\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(--color-gray-500, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.omniscribe_transcribe-collapsed-expand:hover:not(:disabled) {\n background-color: var(--color-gray-100, #f3f4f6);\n color: var(--color-gray-700, #374151);\n}\n\n\n/* Source: modules/chat/components/input/TranscriptionPanel.css */\n/* Animated wrapper for expand/collapse */\n.omniscribe_transcription-panel-wrapper {\n height: 0;\n opacity: 0;\n overflow: hidden;\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.5);\n opacity: 1;\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: #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(--color-gray-100, #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: #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(--color-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: #f6f7f9;\n padding: 4px;\n border-radius: 8px;\n color: #13161a;\n line-height: 1.7 !important;\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: #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: #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: #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: #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: #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: #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: #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: #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: #f5f5f5;\n border: 1px solid #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: #f8f9fa;\n color: #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: #f8f9fa;\n color: #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: #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: #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: #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: #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: #f8f9fa;\n border: 1px solid #e0e0e0;\n transition: background-color 0.2s ease;\n max-width: 280px;\n}\n\n.omniscribe_message-document:hover {\n background-color: #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: #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: #6c757d;\n}\n\n.omniscribe_message-documents-count {\n margin-top: 4px;\n font-size: 11px;\n color: #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: #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: #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: #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: #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(--Greyscale-200, #edeff2);\n border: 1px solid var(--Stroke-greyscale-Active, #e5e7ec);\n border-radius: var(--Radius-radius-round, 99999px);\n cursor: pointer;\n color: #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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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: #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\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: #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(--Stroke-greyscale-Active, #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: #f6f7f9;\n border-top: 1px solid #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: #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(--Text-greyscale-Primary, #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: #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: #ffffff;\n overflow: hidden;\n border-bottom: 1px solid var(--Stroke-greyscale-Active, #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(--Greyscale-100, #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(--Stroke-greyscale-Active, #e5e7ec);\n position: relative;\n padding: 8px;\n display: flex;\n align-items: center;\n\n &:hover {\n background-color: var(--Greyscale-100, #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(--Greyscale-100, #f6f7f9);\n border: 1px solid var(--Stroke-greyscale-Active, #105bdb);\n}\n\n.omniscribe_btn-label {\n margin-left: 6px;\n font-size: 14px;\n color: #212529;\n font-weight: 500;\n}\n\n.omniscribe_btn-label-active {\n color: #105bdb;\n}\n\n.omniscribe_btn-label-inactive {\n color: #212529;\n}\n\n.omniscribe_icon {\n color: var(--active-black);\n}\n\n.omniscribe_icon-active {\n color: #105bdb;\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(--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 #e5e7ec;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: #374151;\n background-color: white;\n resize: none;\n outline: none;\n transition: border-color 0.15s ease;\n}\n\n.omniscribe_chat-prompt-textarea::placeholder {\n color: #9ca3af;\n font-style: italic;\n}\n\n.omniscribe_chat-character-count {\n font-size: 12px;\n color: #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: #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(--primary-color, #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}\n\n.omniscribe_source-checkbox {\n width: 16px;\n height: 16px;\n accent-color: #105bdb;\n cursor: pointer;\n}\n\n.omniscribe_source-name {\n flex: 1;\n font-size: 12px;\n color: #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: #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: #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: #252a32;\n margin: 0;\n}\n\n.omniscribe_source-selector-description {\n font-size: 14px;\n color: #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(--Stroke-greyscale-Active, #e5e7ec);\n background: #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: #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: #f9fafb;\n}\n\n.omniscribe_config-item:focus {\n outline: none;\n background-color: #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: #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: #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: #4a5364;\n}\n\n.omniscribe_config-item-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #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: #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: #374151;\n line-height: 1.4;\n}\n\n.omniscribe_config-language-section {\n display: flex;\n flex-direction: column;\n}\n\n.omniscribe_config-language-section-title {\n font-size: 16px;\n font-weight: 600;\n color: #374151;\n margin-bottom: 8px;\n}\n\n.omniscribe_config-subscreen-description {\n margin: 0 0 0 0;\n font-size: 14px;\n line-height: 18px;\n color: #13161a;\n font-weight: 400;\n}\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 #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: #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: #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: #e5e8eb;\n color: #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: #f9fafb;\n border: 1px solid #e5e8eb;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.omniscribe_config-dictionary-row:hover {\n background-color: #f3f4f6;\n border-color: #d1d5db;\n}\n\n.omniscribe_config-dictionary-cell {\n flex: 1;\n font-size: 14px;\n line-height: 20px;\n color: #374151;\n word-break: break-word;\n font-weight: 500;\n}\n\n.omniscribe_config-dictionary-arrow {\n color: #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: #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: #6b7280;\n font-size: 14px;\n line-height: 20px;\n background-color: #f9fafb;\n border: 2px dashed #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: #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: #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 #e5e7ec;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n line-height: 1.5;\n color: #374151;\n background-color: 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: #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: white;\n border-bottom: 1px solid #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: #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: #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: #f3f4f6;\n}\n\n.omniscribe_template-field-content {\n padding: 0 0 12px 34px;\n background: 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 #e1e8ed;\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n background: 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: #95a5a6;\n display: flex;\n}\n\n/* Template fields container */\n.omniscribe_template-fields {\n display: flex;\n flex-direction: column;\n background: 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: #f6f7f9;\n color: #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: 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/report-button/ReportButton.css */\n.omniscribe_report-button-container {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 0.5rem;\n}\n.omniscribe_report-button-width {\n max-height: 32px;\n font-size: var(--text-xs) !important;\n}\n.omniscribe_regenerate-button-width {\n max-height: 32px;\n background-color: var(--blue-500) !important;\n font-size: var(--text-xs) !important;\n}\n.omniscribe_regenerate-button-width:hover {\n background-color: #0c48ad !important; /* darker shade of blue */\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: #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 #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 #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: #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: #a4adbc;\n}\n\n.omniscribe_audio-recorder-refresh-icon {\n color: #252a32;\n}\n\n.omniscribe_audio-recorder-star-icon {\n cursor: pointer;\n display: inline-block;\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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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 &: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: #edeff2;\n cursor: not-allowed;\n color: #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: white;\n border: 1px solid #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 #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: #6b7280;\n transition:\n background-color 0.2s,\n color 0.2s;\n}\n\n.omniscribe_feedback-close:hover {\n background-color: #f3f4f6;\n color: #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: white;\n color: black;\n border: 1px solid #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: white;\n border: 1px solid #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: white;\n color: black;\n border: 1px solid #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: white;\n color: black;\n border: 1px solid #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(--light-border);\n cursor: pointer;\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(--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(--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(--Stroke-greyscale-Active, #e5e7ec);\n flex-shrink: 0;\n}\n\n.omniscribe_separator--horizontal {\n height: 0;\n width: 100%;\n border-top: 1px solid var(--Stroke-greyscale-Active, #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(--Stroke-greyscale-Active, #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: #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 #132caa;\n}\n\n.omniscribe_toggle-switch-checked {\n background-color: #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 background-color: 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: #6b7280;\n min-width: 70px;\n}\n\n.omniscribe_toggle-switch-checked + .omniscribe_toggle-status {\n color: #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: #ffffff;\n color: #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: #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";
|
|
129344
130134
|
const injectedCss$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
129345
130135
|
__proto__: null,
|
|
129346
130136
|
default: injectedCss
|