diff --git a/manifest.json b/manifest.json index aaf6bd8..e18546c 100644 --- a/manifest.json +++ b/manifest.json @@ -10,7 +10,8 @@ "storage", "activeTab", "scripting", - "notifications" + "notifications", + "identity" ], "host_permissions": [ @@ -19,9 +20,16 @@ "https://api.openai.com/*", "https://api.anthropic.com/*", "https://generativelanguage.googleapis.com/*", - "https://en.wiktionary.org/*" + "https://en.wiktionary.org/*", + "https://www.googleapis.com/*", + "https://oauth2.googleapis.com/*" ], + "oauth2": { + "client_id": "PLACEHOLDER.apps.googleusercontent.com", + "scopes": ["https://www.googleapis.com/auth/drive.appdata"] + }, + "content_security_policy": { "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" }, diff --git a/src/background/background.js b/src/background/background.js index bf6e20d..25a4d53 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -14,6 +14,7 @@ import { saveCard } from '../storage/cardStorage.js'; import { createCard, validateLlmData } from '../shared/cardSchema.js'; import { getConfig } from '../config/configStorage.js'; import { t } from '../i18n/strings.js'; +import { pushSync } from '../sync/syncManager.js'; const MENU_ID = 'ordforrad_add'; @@ -71,6 +72,7 @@ chrome.contextMenus.onClicked.addListener(async (info, tab) => { const card = createCard(word, context, tab.url ?? '', data); await saveCard(card); + pushSync().catch(err => console.warn('[Ordforråd] Sync push failed:', err)); await chrome.storage.session.remove('lastError'); chrome.action.setBadgeText({ text: '' }); chrome.runtime.sendMessage({ type: 'CARD_ADDED', card, word }).catch(() => {}); diff --git a/src/config/configStorage.js b/src/config/configStorage.js index 02af686..5fe822c 100644 --- a/src/config/configStorage.js +++ b/src/config/configStorage.js @@ -5,7 +5,7 @@ * and default values. */ -const CONFIG_KEY = 'user_config'; +import { CONFIG_KEY } from '../shared/storageKeys.js'; /** Maps ISO language codes to German language keys (reverse of LANG_CODE). */ const LANG_CODE_REVERSE = { diff --git a/src/i18n/strings.js b/src/i18n/strings.js index 7e210bb..b34b32b 100644 --- a/src/i18n/strings.js +++ b/src/i18n/strings.js @@ -74,6 +74,15 @@ const STRINGS = { setupStep2: 'Wähle einen Anbieter und gib deinen API-Key ein', setupStep3: 'Wähle ein Modell und klicke auf Speichern', setupHint: 'Dann Rechtsklick auf ein beliebiges Wort, um deine erste Karteikarte zu erstellen.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Kartenabgleich über Google Drive auf all deinen Geräten.', + syncConnect: 'Mit Google Drive verbinden', + syncConnected: 'Google Drive verbunden', + syncDisconnect: 'Trennen', + syncLast: 'Zuletzt synchronisiert:', + syncDisconnected: 'Google Drive getrennt.', + syncError: 'Sync-Fehler', }, en: { @@ -113,6 +122,15 @@ const STRINGS = { setupStep2: 'Choose a provider and enter your API key', setupStep3: 'Select a model, then click Save', setupHint: 'Then right-click any word on a webpage to create your first flashcard.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Sync your cards across devices via Google Drive.', + syncConnect: 'Connect Google Drive', + syncConnected: 'Google Drive connected', + syncDisconnect: 'Disconnect', + syncLast: 'Last synced:', + syncDisconnected: 'Google Drive disconnected.', + syncError: 'Sync error', }, da: { @@ -152,6 +170,15 @@ const STRINGS = { setupStep2: 'Vælg en udbyder og indtast din API-nøgle', setupStep3: 'Vælg en model og klik på Gem', setupHint: 'Højreklik derefter på et vilkårligt ord for at oprette dit første kort.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synkroniser dine kort på tværs af enheder via Google Drive.', + syncConnect: 'Forbind Google Drive', + syncConnected: 'Google Drive forbundet', + syncDisconnect: 'Afbryd', + syncLast: 'Sidst synkroniseret:', + syncDisconnected: 'Google Drive afbrudt.', + syncError: 'Sync-fejl', }, fr: { @@ -191,6 +218,15 @@ const STRINGS = { setupStep2: 'Choisissez un fournisseur et entrez votre clé API', setupStep3: 'Sélectionnez un modèle, puis cliquez sur Enregistrer', setupHint: 'Ensuite, faites un clic droit sur n\'importe quel mot pour créer votre première carte.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synchronisez vos fiches sur tous vos appareils via Google Drive.', + syncConnect: 'Connecter Google Drive', + syncConnected: 'Google Drive connecté', + syncDisconnect: 'Déconnecter', + syncLast: 'Dernière sync :', + syncDisconnected: 'Google Drive déconnecté.', + syncError: 'Erreur de sync', }, es: { @@ -230,6 +266,15 @@ const STRINGS = { setupStep2: 'Elige un proveedor e introduce tu clave API', setupStep3: 'Selecciona un modelo y haz clic en Guardar', setupHint: 'Luego haz clic derecho en cualquier palabra para crear tu primera tarjeta.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Sincroniza tus tarjetas en todos tus dispositivos mediante Google Drive.', + syncConnect: 'Conectar Google Drive', + syncConnected: 'Google Drive conectado', + syncDisconnect: 'Desconectar', + syncLast: 'Última sincronización:', + syncDisconnected: 'Google Drive desconectado.', + syncError: 'Error de sync', }, it: { @@ -269,6 +314,15 @@ const STRINGS = { setupStep2: 'Scegli un provider e inserisci la tua chiave API', setupStep3: 'Seleziona un modello e clicca su Salva', setupHint: 'Poi clicca col destro su qualsiasi parola per creare la tua prima scheda.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Sincronizza le schede su tutti i tuoi dispositivi tramite Google Drive.', + syncConnect: 'Connetti Google Drive', + syncConnected: 'Google Drive connesso', + syncDisconnect: 'Disconnetti', + syncLast: 'Ultima sync:', + syncDisconnected: 'Google Drive disconnesso.', + syncError: 'Errore di sync', }, pt: { @@ -308,6 +362,15 @@ const STRINGS = { setupStep2: 'Escolha um provedor e insira sua chave API', setupStep3: 'Selecione um modelo e clique em Salvar', setupHint: 'Depois, clique com o botão direito em qualquer palavra para criar seu primeiro cartão.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Sincronize seus cartões em todos os dispositivos pelo Google Drive.', + syncConnect: 'Conectar Google Drive', + syncConnected: 'Google Drive conectado', + syncDisconnect: 'Desconectar', + syncLast: 'Última sync:', + syncDisconnected: 'Google Drive desconectado.', + syncError: 'Erro de sync', }, nl: { @@ -347,6 +410,15 @@ const STRINGS = { setupStep2: 'Kies een aanbieder en voer je API-sleutel in', setupStep3: 'Selecteer een model en klik op Opslaan', setupHint: 'Klik dan met de rechtermuisknop op een woord om je eerste kaart te maken.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synchroniseer je kaarten op al je apparaten via Google Drive.', + syncConnect: 'Google Drive verbinden', + syncConnected: 'Google Drive verbonden', + syncDisconnect: 'Ontkoppelen', + syncLast: 'Laatste sync:', + syncDisconnected: 'Google Drive ontkoppeld.', + syncError: 'Sync-fout', }, sv: { @@ -386,6 +458,15 @@ const STRINGS = { setupStep2: 'Välj en leverantör och ange din API-nyckel', setupStep3: 'Välj en modell och klicka på Spara', setupHint: 'Högerklicka sedan på valfritt ord för att skapa ditt första kort.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synkronisera dina kort på alla enheter via Google Drive.', + syncConnect: 'Anslut Google Drive', + syncConnected: 'Google Drive anslutet', + syncDisconnect: 'Koppla bort', + syncLast: 'Senast synkad:', + syncDisconnected: 'Google Drive bortkopplat.', + syncError: 'Synkfel', }, nb: { @@ -425,6 +506,15 @@ const STRINGS = { setupStep2: 'Velg en leverandør og skriv inn API-nøkkelen din', setupStep3: 'Velg en modell og klikk på Lagre', setupHint: 'Høyreklikk deretter på et vilkårlig ord for å opprette ditt første kort.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synkroniser kortene dine på alle enheter via Google Drive.', + syncConnect: 'Koble til Google Drive', + syncConnected: 'Google Drive tilkoblet', + syncDisconnect: 'Koble fra', + syncLast: 'Sist synkronisert:', + syncDisconnected: 'Google Drive frakoblet.', + syncError: 'Sync-feil', }, fi: { @@ -464,6 +554,15 @@ const STRINGS = { setupStep2: 'Valitse palveluntarjoaja ja syötä API-avaimesi', setupStep3: 'Valitse malli ja napsauta Tallenna', setupHint: 'Napsauta sitten mitä tahansa sanaa hiiren kakkospainikkeella luodaksesi ensimmäisen korttisi.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synkronoi kortit kaikille laitteille Google Driven kautta.', + syncConnect: 'Yhdistä Google Drive', + syncConnected: 'Google Drive yhdistetty', + syncDisconnect: 'Katkaise yhteys', + syncLast: 'Viimeksi synkronoitu:', + syncDisconnected: 'Google Drive irrotettu.', + syncError: 'Synkronointivirhe', }, pl: { @@ -503,6 +602,15 @@ const STRINGS = { setupStep2: 'Wybierz dostawcę i wpisz swój klucz API', setupStep3: 'Wybierz model i kliknij Zapisz', setupHint: 'Następnie kliknij prawym przyciskiem na dowolne słowo, aby utworzyć pierwszą kartę.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synchronizuj karty na wszystkich urządzeniach przez Google Drive.', + syncConnect: 'Połącz z Google Drive', + syncConnected: 'Google Drive połączony', + syncDisconnect: 'Rozłącz', + syncLast: 'Ostatnia sync:', + syncDisconnected: 'Google Drive rozłączony.', + syncError: 'Błąd synchronizacji', }, cs: { @@ -542,6 +650,15 @@ const STRINGS = { setupStep2: 'Vyberte poskytovatele a zadejte svůj API klíč', setupStep3: 'Vyberte model a klikněte na Uložit', setupHint: 'Poté klikněte pravým tlačítkem na libovolné slovo a vytvořte svou první kartu.', + sync: 'Sync', + syncTitle: 'Sync', + syncDesc: 'Synchronizujte karty na všech zařízeních přes Google Drive.', + syncConnect: 'Připojit Google Drive', + syncConnected: 'Google Drive připojen', + syncDisconnect: 'Odpojit', + syncLast: 'Poslední sync:', + syncDisconnected: 'Google Drive odpojen.', + syncError: 'Chyba synchronizace', }, ru: { @@ -581,6 +698,15 @@ const STRINGS = { setupStep2: 'Выберите поставщика и введите API-ключ', setupStep3: 'Выберите модель и нажмите Сохранить', setupHint: 'Затем щёлкните правой кнопкой мыши по любому слову, чтобы создать первую карточку.', + sync: 'Синхр.', + syncTitle: 'Синхронизация', + syncDesc: 'Синхронизируйте карточки на всех устройствах через Google Drive.', + syncConnect: 'Подключить Google Drive', + syncConnected: 'Google Drive подключён', + syncDisconnect: 'Отключить', + syncLast: 'Последняя синхронизация:', + syncDisconnected: 'Google Drive отключён.', + syncError: 'Ошибка синхронизации', }, tr: { @@ -620,6 +746,15 @@ const STRINGS = { setupStep2: 'Bir sağlayıcı seçin ve API anahtarınızı girin', setupStep3: 'Bir model seçin ve Kaydet\'e tıklayın', setupHint: 'Ardından herhangi bir kelimeye sağ tıklayarak ilk kartınızı oluşturun.', + sync: 'Senkron.', + syncTitle: 'Senkronizasyon', + syncDesc: 'Google Drive üzerinden tüm cihazlarınızda kartları senkronize edin.', + syncConnect: "Google Drive'a Bağlan", + syncConnected: 'Google Drive bağlı', + syncDisconnect: 'Bağlantıyı Kes', + syncLast: 'Son senkronizasyon:', + syncDisconnected: 'Google Drive bağlantısı kesildi.', + syncError: 'Senkronizasyon hatası', }, hu: { @@ -659,6 +794,15 @@ const STRINGS = { setupStep2: 'Válasszon szolgáltatót és adja meg API-kulcsát', setupStep3: 'Válasszon modellt és kattintson a Mentés gombra', setupHint: 'Ezután kattintson jobb gombbal bármely szóra az első kártya létrehozásához.', + sync: 'Szinkron', + syncTitle: 'Szinkronizáció', + syncDesc: 'Szinkronizáld a kártyáid minden eszközön Google Drive-on keresztül.', + syncConnect: 'Google Drive csatlakoztatása', + syncConnected: 'Google Drive csatlakoztatva', + syncDisconnect: 'Leválasztás', + syncLast: 'Utolsó szinkronizálás:', + syncDisconnected: 'Google Drive leválasztva.', + syncError: 'Szinkronizálási hiba', }, el: { @@ -698,6 +842,15 @@ const STRINGS = { setupStep2: 'Επιλέξτε πάροχο και εισάγετε το κλειδί API σας', setupStep3: 'Επιλέξτε μοντέλο και κάντε κλικ στο Αποθήκευση', setupHint: 'Στη συνέχεια κάντε δεξί κλικ σε οποιαδήποτε λέξη για να δημιουργήσετε την πρώτη σας κάρτα.', + sync: 'Συγχρ.', + syncTitle: 'Συγχρονισμός', + syncDesc: 'Συγχρονίστε τις κάρτες σας σε όλες τις συσκευές μέσω Google Drive.', + syncConnect: 'Σύνδεση Google Drive', + syncConnected: 'Google Drive συνδέθηκε', + syncDisconnect: 'Αποσύνδεση', + syncLast: 'Τελευταίος συγχρονισμός:', + syncDisconnected: 'Google Drive αποσυνδέθηκε.', + syncError: 'Σφάλμα συγχρονισμού', }, is: { @@ -737,6 +890,15 @@ const STRINGS = { setupStep2: 'Veldu veitanda og sláðu inn API-lykilinn þinn', setupStep3: 'Veldu líkan og smelltu á Vista', setupHint: 'Hægrismelltu svo á hvaða orð sem er til að búa til fyrsta spjaldið þitt.', + sync: 'Sync', + syncTitle: 'Samstilling', + syncDesc: 'Samstilltu spjöldin þín á öllum tækjum í gegnum Google Drive.', + syncConnect: 'Tengja Google Drive', + syncConnected: 'Google Drive tengt', + syncDisconnect: 'Aftengja', + syncLast: 'Síðast samstillt:', + syncDisconnected: 'Google Drive aftengt.', + syncError: 'Samstillingarvillar', }, ja: { @@ -777,6 +939,15 @@ const STRINGS = { setupStep2: 'プロバイダーを選択しAPIキーを入力', setupStep3: 'モデルを選択して保存をクリック', setupHint: 'その後、任意の単語を右クリックして最初のカードを作成してください。', + sync: '同期', + syncTitle: '同期', + syncDesc: 'Google Driveですべてのデバイスのカードを同期します。', + syncConnect: 'Google Driveに接続', + syncConnected: 'Google Drive接続済み', + syncDisconnect: '切断', + syncLast: '最終同期:', + syncDisconnected: 'Google Driveを切断しました。', + syncError: '同期エラー', }, ko: { @@ -817,6 +988,15 @@ const STRINGS = { setupStep2: '제공자를 선택하고 API 키를 입력하세요', setupStep3: '모델을 선택하고 저장을 클릭하세요', setupHint: '그런 다음 웹페이지에서 아무 단어나 우클릭하여 첫 번째 카드를 만드세요.', + sync: '동기화', + syncTitle: '동기화', + syncDesc: 'Google Drive로 모든 기기에서 카드를 동기화합니다.', + syncConnect: 'Google Drive 연결', + syncConnected: 'Google Drive 연결됨', + syncDisconnect: '연결 해제', + syncLast: '마지막 동기화:', + syncDisconnected: 'Google Drive 연결이 해제되었습니다.', + syncError: '동기화 오류', }, zh: { @@ -857,6 +1037,15 @@ const STRINGS = { setupStep2: '选择提供商并输入API密钥', setupStep3: '选择模型,然后点击保存', setupHint: '然后右键点击网页上的任意单词来创建您的第一张卡片。', + sync: '同步', + syncTitle: '同步', + syncDesc: '通过Google Drive在所有设备上同步卡片。', + syncConnect: '连接Google Drive', + syncConnected: 'Google Drive已连接', + syncDisconnect: '断开连接', + syncLast: '上次同步:', + syncDisconnected: 'Google Drive已断开。', + syncError: '同步错误', }, ar: { @@ -896,6 +1085,15 @@ const STRINGS = { setupStep2: 'اختر مزوِّدًا وأدخل مفتاح API الخاص بك', setupStep3: 'اختر نموذجًا ثم انقر على حفظ', setupHint: 'ثم انقر بزر الماوس الأيمن على أي كلمة لإنشاء بطاقتك الأولى.', + sync: 'مزامنة', + syncTitle: 'المزامنة', + syncDesc: 'زامن بطاقاتك على جميع أجهزتك عبر Google Drive.', + syncConnect: 'ربط Google Drive', + syncConnected: 'Google Drive مرتبط', + syncDisconnect: 'قطع الاتصال', + syncLast: 'آخر مزامنة:', + syncDisconnected: 'تم قطع اتصال Google Drive.', + syncError: 'خطأ في المزامنة', }, }; diff --git a/src/popup/popup.css b/src/popup/popup.css index ff5b8f8..7cb3b1a 100644 --- a/src/popup/popup.css +++ b/src/popup/popup.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-1\/2{left:50%}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-px{margin-top:1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.max-h-150{max-height:calc(var(--spacing) * 150)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-110{width:calc(var(--spacing) * 110)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[140px\]{max-width:140px}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-14>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 14) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 14) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-400{border-color:var(--color-rose-400)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-white{background-color:var(--color-white)}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-rose-300{color:var(--color-rose-300)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\/50{color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-rose-400:hover{background-color:var(--color-rose-400)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:text-rose-500:hover{color:var(--color-rose-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-rose-400:focus{--tw-ring-color:var(--color-rose-400)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:border-\[\#3c4043\]{border-color:#3c4043}.dark\:border-\[\#5a4a2a\]{border-color:#5a4a2a}.dark\:border-\[\#5a3333\]{border-color:#5a3333}.dark\:border-\[\#5f6368\]{border-color:#5f6368}.dark\:border-amber-700\/40{border-color:#b7500066}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-700\/40{border-color:color-mix(in oklab, var(--color-amber-700) 40%, transparent)}}.dark\:border-slate-600{border-color:var(--color-slate-600)}.dark\:bg-\[\#3a3020\]{background-color:#3a3020}.dark\:bg-\[\#3c2020\]{background-color:#3c2020}.dark\:bg-\[\#3c4043\]{background-color:#3c4043}.dark\:bg-\[\#292a2d\]{background-color:#292a2d}.dark\:bg-\[\#202124\]{background-color:#202124}.dark\:bg-amber-900\/20{background-color:#7b330633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/20{background-color:color-mix(in oklab, var(--color-amber-900) 20%, transparent)}}.dark\:text-\[\#5f6368\]{color:#5f6368}.dark\:text-\[\#7a4444\]{color:#7a4444}.dark\:text-\[\#9aa0a6\]{color:#9aa0a6}.dark\:text-\[\#b89d5c\]{color:#b89d5c}.dark\:text-\[\#bdc1c6\]{color:#bdc1c6}.dark\:text-\[\#d4b878\]{color:#d4b878}.dark\:text-\[\#e8eaed\]{color:#e8eaed}.dark\:text-\[\#f0a0a0\]{color:#f0a0a0}.dark\:text-\[\#f0d090\]{color:#f0d090}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-rose-400{color:var(--color-rose-400)}@media (hover:hover){.dark\:hover\:bg-\[\#3c4043\]:hover{background-color:#3c4043}.dark\:hover\:text-\[\#f0a0a0\]:hover{color:#f0a0a0}.dark\:hover\:text-rose-400:hover{color:var(--color-rose-400)}}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-green-400:oklch(79.2% .209 151.711);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-1\/2{left:50%}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-px{margin-top:1px}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.max-h-150{max-height:calc(var(--spacing) * 150)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-110{width:calc(var(--spacing) * 110)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[140px\]{max-width:140px}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-14>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 14) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 14) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-400{border-color:var(--color-rose-400)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-green-400{background-color:var(--color-green-400)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-white{background-color:var(--color-white)}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-green-400{color:var(--color-green-400)}.text-rose-300{color:var(--color-rose-300)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-white{color:var(--color-white)}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\/50{color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:border-rose-400:hover{border-color:var(--color-rose-400)}.hover\:bg-rose-400:hover{background-color:var(--color-rose-400)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:text-rose-500:hover{color:var(--color-rose-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-rose-400:focus{--tw-ring-color:var(--color-rose-400)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:border-\[\#3c4043\]{border-color:#3c4043}.dark\:border-\[\#5a4a2a\]{border-color:#5a4a2a}.dark\:border-\[\#5a3333\]{border-color:#5a3333}.dark\:border-\[\#5f6368\]{border-color:#5f6368}.dark\:border-amber-700\/40{border-color:#b7500066}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-700\/40{border-color:color-mix(in oklab, var(--color-amber-700) 40%, transparent)}}.dark\:border-slate-600{border-color:var(--color-slate-600)}.dark\:bg-\[\#3a3020\]{background-color:#3a3020}.dark\:bg-\[\#3c2020\]{background-color:#3c2020}.dark\:bg-\[\#3c4043\]{background-color:#3c4043}.dark\:bg-\[\#292a2d\]{background-color:#292a2d}.dark\:bg-\[\#202124\]{background-color:#202124}.dark\:bg-amber-900\/20{background-color:#7b330633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/20{background-color:color-mix(in oklab, var(--color-amber-900) 20%, transparent)}}.dark\:text-\[\#5f6368\]{color:#5f6368}.dark\:text-\[\#7a4444\]{color:#7a4444}.dark\:text-\[\#9aa0a6\]{color:#9aa0a6}.dark\:text-\[\#b89d5c\]{color:#b89d5c}.dark\:text-\[\#bdc1c6\]{color:#bdc1c6}.dark\:text-\[\#d4b878\]{color:#d4b878}.dark\:text-\[\#e8eaed\]{color:#e8eaed}.dark\:text-\[\#f0a0a0\]{color:#f0a0a0}.dark\:text-\[\#f0d090\]{color:#f0d090}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-rose-400{color:var(--color-rose-400)}@media (hover:hover){.dark\:hover\:bg-\[\#3c4043\]:hover{background-color:#3c4043}.dark\:hover\:text-\[\#f0a0a0\]:hover{color:#f0a0a0}.dark\:hover\:text-rose-400:hover{color:var(--color-rose-400)}}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file diff --git a/src/popup/popup.html b/src/popup/popup.html index 63dad35..2712cb9 100644 --- a/src/popup/popup.html +++ b/src/popup/popup.html @@ -19,6 +19,13 @@

Ordforråd

data-i18n="export" disabled> Anki-Export + + + +