diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000..7d0156c --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,4 @@ +reviews: + path_filters: + - "!server/wwwroot/js/app.js" + - "!server/wwwroot/js/app.css" diff --git a/server/ClientApp/src/components/Dashboard.tsx b/server/ClientApp/src/components/Dashboard.tsx index 2914b07..2bf1c99 100644 --- a/server/ClientApp/src/components/Dashboard.tsx +++ b/server/ClientApp/src/components/Dashboard.tsx @@ -30,21 +30,6 @@ interface HealthInfo { models: Record; } -interface AllModelSettings { - ocr: ModelEntry; - translate: ModelEntry; - inpaint: ModelEntry; - bubble: ModelEntry; - preferred_translation_engine: string; -} - -interface ModelEntry { - repo: string; - dir: string; - enabled: boolean; - files: string; -} - // ── Sub-components ─────────────────────────────────────────────────────────── function StatusBadge(props: { ok: boolean | null; label: string }) { @@ -98,6 +83,7 @@ export function Dashboard() { onMount(fetchHealth); function fetchHealth() { + setErr(null); fetch("/health") .then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`); @@ -126,23 +112,20 @@ export function Dashboard() { async function changeEngine(engine: string) { const h = health(); if (!h || saving()) return; + setErr(null); setSaving(true); try { - // Fetch current settings to avoid overwriting other fields - const settingsRes = await fetch("/api/settings"); - if (!settingsRes.ok) throw new Error("Failed to load settings"); - const settings = (await settingsRes.json()) as AllModelSettings; - settings.preferred_translation_engine = engine; - - const putRes = await fetch("/api/settings", { - method: "PUT", + // Narrow PATCH endpoint updates only preferred_translation_engine, + // avoiding a read-modify-write cycle that would persist env-derived values to disk. + const res = await fetch("/api/settings/engine", { + method: "PATCH", headers: { "Content-Type": "application/json" }, - body: JSON.stringify(settings), + body: JSON.stringify({ engine }), }); - if (!putRes.ok) throw new Error("Failed to save settings"); + if (!res.ok) throw new Error(`Failed to save settings (HTTP ${res.status})`); setSavedEngine(engine); } catch (e) { - console.error("Failed to update translation engine:", e); + setErr(String(e)); } finally { setSaving(false); } diff --git a/server/ClientApp/src/pages/JobsListPage.tsx b/server/ClientApp/src/pages/JobsListPage.tsx index 162c8a4..cc8c233 100644 --- a/server/ClientApp/src/pages/JobsListPage.tsx +++ b/server/ClientApp/src/pages/JobsListPage.tsx @@ -55,49 +55,52 @@ function JobCard(props: { : jobOriginalUrl(props.job.id); return ( - + + {/* Nav button covers thumbnail + info */} + + + ); } @@ -131,9 +134,11 @@ export function JobsListPage() { // Delete confirm state const [pendingDeleteId, setPendingDeleteId] = createSignal(null); const [isDeleting, setIsDeleting] = createSignal(false); + const [deleteError, setDeleteError] = createSignal(null); function requestDelete(id: string, e: MouseEvent): void { e.stopPropagation(); + setDeleteError(null); setPendingDeleteId(id); } @@ -145,6 +150,9 @@ export function JobsListPage() { await deleteJob(id); setPendingDeleteId(null); refetch(); + } catch (err) { + setPendingDeleteId(null); + setDeleteError(err instanceof Error ? err.message : "Failed to delete job"); } finally { setIsDeleting(false); } @@ -180,6 +188,22 @@ export function JobsListPage() { + {/* Delete error */} + + {(msg) => ( + + )} + + {/* States */}
diff --git a/server/src/ModelSettingsStore.cs b/server/src/ModelSettingsStore.cs index e264dc4..7d6ef24 100644 --- a/server/src/ModelSettingsStore.cs +++ b/server/src/ModelSettingsStore.cs @@ -119,6 +119,38 @@ public async Task UpdateAsync(AllModelSettings updated) finally { _writeLock.Release(); } } + /// + /// Atomically updates only the preferred translation engine and persists to disk. + /// Clones the current settings inside the write lock to avoid a read-modify-write race. + /// + public async Task UpdateEngineAsync(string engine) + { + if (string.IsNullOrWhiteSpace(engine)) + throw new ArgumentException("Engine is required.", nameof(engine)); + engine = engine.Trim(); + + await _writeLock.WaitAsync(); + try + { + var current = _current; + var updated = new AllModelSettings + { + Ocr = current.Ocr, + Translate = current.Translate, + Inpaint = current.Inpaint, + Bubble = current.Bubble, + PreferredTranslationEngine = engine, + }; + var dir = Path.GetDirectoryName(_filePath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + await File.WriteAllTextAsync(_filePath, JsonSerializer.Serialize(updated, JsonOpts)); + _current = updated; + _logger.LogInformation("[ModelSettings] Persisted to {Path}", _filePath); + return _current; + } + finally { _writeLock.Release(); } + } + // ── Private helpers ─────────────────────────────────────────────────────── /// Build settings from env vars, using AppConfig-derived paths as dir defaults. @@ -193,7 +225,15 @@ private static AllModelSettings Merge(AllModelSettings env, AllModelSettings fil Translate = MergeEntry(env.Translate, file.Translate, "TRANSLATE_MODEL_REPO", "TRANSLATE_MODELS_DIR", "TRANSLATE_MODEL_ENABLED", "TRANSLATE_MODEL_FILES"), Inpaint = MergeEntry(env.Inpaint, file.Inpaint, "INPAINT_MODEL_REPO", "INPAINT_MODELS_DIR", "INPAINT_MODEL_ENABLED", "INPAINT_MODEL_FILES"), Bubble = MergeEntry(env.Bubble, file.Bubble, "BUBBLE_MODEL_REPO", "BUBBLE_MODELS_DIR", "BUBBLE_MODEL_ENABLED", "BUBBLE_MODEL_FILES"), - PreferredTranslationEngine = file.PreferredTranslationEngine, + // Env wins; fall back to file (only if non-empty), then the env-derived default. + // IsNullOrWhiteSpace guards against whitespace-only env vars being treated as set. + PreferredTranslationEngine = + Environment.GetEnvironmentVariable("PREFERRED_TRANSLATION_ENGINE") is { } rawPe + && !string.IsNullOrWhiteSpace(rawPe) + ? rawPe.Trim() + : string.IsNullOrWhiteSpace(file.PreferredTranslationEngine) + ? env.PreferredTranslationEngine + : file.PreferredTranslationEngine, }; } diff --git a/server/src/Routes/SettingsRoutes.cs b/server/src/Routes/SettingsRoutes.cs index 652ad82..24dc8fe 100644 --- a/server/src/Routes/SettingsRoutes.cs +++ b/server/src/Routes/SettingsRoutes.cs @@ -1,5 +1,8 @@ namespace WebOcrServer; +/// Narrow patch body for updating only the preferred translation engine. +public record EngineUpdateRequest(string Engine); + public static class SettingsRoutes { public static void MapSettingsRoutes(this WebApplication app) @@ -18,5 +21,17 @@ public static void MapSettingsRoutes(this WebApplication app) var saved = await store.UpdateAsync(updated); return Results.Ok(saved); }); + + // PATCH /api/settings/engine — updates only preferred_translation_engine without + // touching other settings, avoiding the read-modify-write footgun on env-derived values. + app.MapMethods("/api/settings/engine", ["PATCH"], async ( + EngineUpdateRequest req, ModelSettingsStore store) => + { + if (string.IsNullOrWhiteSpace(req.Engine)) + return Results.BadRequest(new { error = "engine is required" }); + + var saved = await store.UpdateEngineAsync(req.Engine); + return Results.Ok(new { preferred_translation_engine = saved.PreferredTranslationEngine }); + }); } } diff --git a/server/src/Routes/TranslateRoutes.cs b/server/src/Routes/TranslateRoutes.cs index 5ba72bf..36d8e1d 100644 --- a/server/src/Routes/TranslateRoutes.cs +++ b/server/src/Routes/TranslateRoutes.cs @@ -11,16 +11,26 @@ public static void MapTranslateRoutes(this WebApplication app) BootState boot, InferenceQueue queue, ModelSettingsStore modelSettings, + AppConfig config, IServiceScopeFactory scopeFactory, ILogger logger) => { - if (!boot.TranslateReady) - return Results.Json(new { error = "Translate model not ready" }, statusCode: 503); - if (string.IsNullOrWhiteSpace(req.Text)) return Results.BadRequest(new { error = "text is required" }); - var engine = req.TranslateEngine ?? modelSettings.Current.PreferredTranslationEngine; + var rawEngine = string.IsNullOrWhiteSpace(req.TranslateEngine) + ? modelSettings.Current.PreferredTranslationEngine + : req.TranslateEngine; + + // Resolve "auto": prefer DeepL when configured, fall back to local. + var engine = rawEngine.Equals("auto", StringComparison.OrdinalIgnoreCase) + ? (config.DeeplAvailable ? "deepl" : "local") + : rawEngine; + + // Only require the local model when the chosen engine is not an external API (DeepL). + var needsLocal = !engine.Equals("deepl", StringComparison.OrdinalIgnoreCase); + if (needsLocal && !boot.TranslateReady) + return Results.Json(new { error = "Translate model not ready" }, statusCode: 503); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); await queue.Writer.WriteAsync(new TranslateJob(req.Text, engine, tcs)); diff --git a/server/wwwroot/js/app.css b/server/wwwroot/js/app.css index 5bec8d7..28d18b4 100644 --- a/server/wwwroot/js/app.css +++ b/server/wwwroot/js/app.css @@ -1,3 +1,3 @@ /*! tailwindcss v4.3.0 | 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-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking: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;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-outline-style:solid}}}@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-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-100:oklch(96.2% .044 156.743);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-700:oklch(50.8% .118 165.612);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--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-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-2xl:42rem;--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-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--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-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--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;-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{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.right-2{right:calc(var(--spacing) * 2)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-2{left:calc(var(--spacing) * 2)}.z-50{z-index:50}.m-6{margin:calc(var(--spacing) * 6)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-auto{margin-top:auto}.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)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-3\/4{aspect-ratio:3/4}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-32{height:calc(var(--spacing) * 32)}.h-full{height:100%}.h-screen{height:100vh}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-50>:not(:last-child)){border-color:var(--color-slate-50)}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.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-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-red-200{border-color:var(--color-red-200)}.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)}.border-slate-700{border-color:var(--color-slate-700)}.border-violet-500{border-color:var(--color-violet-500)}.border-l-violet-500{border-left-color:var(--color-violet-500)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500\/90{background-color:#fb2c36e6}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/90{background-color:color-mix(in oklab, var(--color-red-500) 90%, transparent)}}.bg-red-600{background-color:var(--color-red-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-violet-50{background-color:var(--color-violet-50)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.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-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-10{padding-right:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-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}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-emerald-700{color:var(--color-emerald-700)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-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-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-white\!{color:var(--color-white)!important}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.accent-violet-600{accent-color:var(--color-violet-600)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--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)}.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)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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)}.ring-1{--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)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-slate-500:is(:where(.group):hover *){color:var(--color-slate-500)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}@media (hover:hover){.hover\:w-48:hover{width:calc(var(--spacing) * 48)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-violet-700:hover{background-color:var(--color-violet-700)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-slate-500:hover{color:var(--color-slate-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-white:hover{color:var(--color-white)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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)}.hover\:ring-slate-300:hover{--tw-ring-color:var(--color-slate-300)}}.focus\:border-violet-400:focus{border-color:var(--color-violet-400)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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-violet-400:focus{--tw-ring-color:var(--color-violet-400)}.focus\:ring-violet-500:focus{--tw-ring-color:var(--color-violet-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-violet-500:focus-visible{outline-color:var(--color-violet-500)}.active\:bg-red-200:active{background-color:var(--color-red-200)}.active\:bg-slate-200:active{background-color:var(--color-slate-200)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (width>=64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=80rem){.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}body{font-family:Inter,system-ui,sans-serif}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} +@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-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking: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;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-outline-style:solid}}}@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-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-100:oklch(96.2% .044 156.743);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-700:oklch(50.8% .118 165.612);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--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-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-2xl:42rem;--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-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--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-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--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;-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{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.right-2{right:calc(var(--spacing) * 2)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-50{z-index:50}.m-6{margin:calc(var(--spacing) * 6)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-auto{margin-top:auto}.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)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-3\/4{aspect-ratio:3/4}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-32{height:calc(var(--spacing) * 32)}.h-full{height:100%}.h-screen{height:100vh}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-md{max-width:var(--container-md)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-50>:not(:last-child)){border-color:var(--color-slate-50)}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.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-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-red-200{border-color:var(--color-red-200)}.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)}.border-slate-700{border-color:var(--color-slate-700)}.border-violet-500{border-color:var(--color-violet-500)}.border-l-violet-500{border-left-color:var(--color-violet-500)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500\/90{background-color:#fb2c36e6}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/90{background-color:color-mix(in oklab, var(--color-red-500) 90%, transparent)}}.bg-red-600{background-color:var(--color-red-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-violet-50{background-color:var(--color-violet-50)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.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-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-10{padding-right:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--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-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}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-emerald-700{color:var(--color-emerald-700)}.text-green-500{color:var(--color-green-500)}.text-green-700{color:var(--color-green-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-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-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-white\!{color:var(--color-white)!important}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.accent-violet-600{accent-color:var(--color-violet-600)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--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)}.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)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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)}.ring-1{--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)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-slate-500:is(:where(.group):hover *){color:var(--color-slate-500)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}@media (hover:hover){.hover\:w-48:hover{width:calc(var(--spacing) * 48)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-violet-700:hover{background-color:var(--color-violet-700)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-slate-500:hover{color:var(--color-slate-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-white:hover{color:var(--color-white)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px 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)}.hover\:ring-slate-300:hover{--tw-ring-color:var(--color-slate-300)}}.focus\:border-violet-400:focus{border-color:var(--color-violet-400)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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-violet-400:focus{--tw-ring-color:var(--color-violet-400)}.focus\:ring-violet-500:focus{--tw-ring-color:var(--color-violet-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-violet-500:focus-visible{outline-color:var(--color-violet-500)}.active\:bg-red-200:active{background-color:var(--color-red-200)}.active\:bg-slate-200:active{background-color:var(--color-slate-200)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (width>=64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width>=80rem){.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}body{font-family:Inter,system-ui,sans-serif}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} /*$vite$:1*/ \ No newline at end of file diff --git a/server/wwwroot/js/app.js b/server/wwwroot/js/app.js index 0aa29f5..21bb8c4 100644 --- a/server/wwwroot/js/app.js +++ b/server/wwwroot/js/app.js @@ -1 +1 @@ -(function(){var e=Object.defineProperty,t=(e,t)=>()=>(e&&(t=e(e=0)),t),n=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};function r(e){let t=String(e),n=t.length-1;return R.context.id+(n?String.fromCharCode(96+n):``)+t}function i(e){R.context=e}function a(){return{...R.context,id:R.getNextContextId(),count:0}}function o(e,t){let n=H,r=B,i=e.length===0,a=t===void 0?r:t,o=i?ke:{owned:null,cleanups:null,context:a?a.context:null,owner:a},s=i?e:()=>e(()=>h(()=>N(o)));B=o,H=null;try{return A(s,!0)}finally{H=n,B=r}}function s(e,t){t=t?Object.assign({},Te,t):Te;let n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0};return[ee.bind(n),e=>(typeof e==`function`&&(e=V&&V.running&&V.sources.has(n)?e(n.tValue):e(n.value)),T(n,e))]}function c(e,t,n){let r=O(e,t,!0,z);je&&V&&V.running?U.push(r):E(r)}function l(e,t,n){let r=O(e,t,!1,z);je&&V&&V.running?U.push(r):E(r)}function u(e,t,n){De=ne;let r=O(e,t,!1,z),i=Ie&&C(Ie);i&&(r.suspense=i),(!n||!n.render)&&(r.user=!0),W?W.push(r):E(r)}function d(e,t,n){n=n?Object.assign({},Te,n):Te;let r=O(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,je&&V&&V.running?(r.tState=z,U.push(r)):E(r),ee.bind(r)}function f(e){return e&&typeof e==`object`&&`then`in e}function p(e,t,n){let r,i,a;typeof t==`function`?(r=e,i=t,a=n||{}):(r=!0,i=e,a=t||{});let o=null,l=Ae,u=null,p=!1,m=!1,g=`initialValue`in a,_=typeof r==`function`&&d(r),v=new Set,[y,x]=(a.storage||s)(a.initialValue),[S,w]=s(void 0),[ee,T]=s(void 0,{equals:!1}),[E,D]=s(g?`ready`:`unresolved`);R.context&&(u=R.getNextContextId(),a.ssrLoadFrom===`initial`?l=a.initialValue:R.load&&R.has(u)&&(l=R.load(u)));function O(e,t,n,r){return o===e&&(o=null,r!==void 0&&(g=!0),(e===l||t===l)&&a.onHydrated&&queueMicrotask(()=>a.onHydrated(r,{value:t})),l=Ae,V&&e&&p?(V.promises.delete(e),p=!1,A(()=>{V.running=!0,k(t,n)},!1)):k(t,n)),t}function k(e,t){A(()=>{t===void 0&&x(()=>e),D(t===void 0?g?`ready`:`unresolved`:`errored`),w(t);for(let e of v.keys())e.decrement();v.clear()},!1)}function j(){let e=Ie&&C(Ie),t=y(),n=S();if(n!==void 0&&!o)throw n;return H&&!H.user&&e&&c(()=>{ee(),o&&(e.resolved&&V&&p?V.promises.add(o):v.has(e)||(e.increment(),v.add(e)))}),t}function te(e=!0){if(e!==!1&&m)return;m=!1;let t=_?_():r;if(p=V&&V.running,t==null||t===!1){O(o,h(y));return}V&&o&&V.promises.delete(o);let n,a=l===Ae?h(()=>{try{return i(t,{value:y(),refetching:e})}catch(e){n=e}}):l;if(n!==void 0){O(o,void 0,oe(n),t);return}else if(!f(a))return O(o,a,void 0,t),a;return o=a,`v`in a?(a.s===1?O(o,a.v,void 0,t):O(o,void 0,oe(a.v),t),a):(m=!0,queueMicrotask(()=>m=!1),A(()=>{D(g?`refreshing`:`pending`),T()},!1),a.then(e=>O(a,e,void 0,t),e=>O(a,void 0,oe(e),t)))}Object.defineProperties(j,{state:{get:()=>E()},error:{get:()=>S()},loading:{get(){let e=E();return e===`pending`||e===`refreshing`}},latest:{get(){if(!g)return j();let e=S();if(e&&!o)throw e;return y()}}});let M=B;return _?c(()=>(M=B,te(!1))):te(!1),[j,{refetch:e=>b(M,()=>te(e)),mutate:x}]}function m(e){return A(e,!1)}function h(e){if(!Me&&H===null)return e();let t=H;H=null;try{return Me?Me.untrack(e):e()}finally{H=t}}function g(e,t,n){let r=Array.isArray(e),i,a=n&&n.defer;return n=>{let o;if(r){o=Array(e.length);for(let t=0;tt(o,i,n));return i=o,s}}function _(e){u(()=>h(e))}function v(e){return B===null||(B.cleanups===null?B.cleanups=[e]:B.cleanups.push(e)),e}function y(){return B}function b(e,t){let n=B,r=H;B=e,H=null;try{return A(t,!0)}catch(e){ce(e)}finally{B=n,H=r}}function x(e){if(V&&V.running)return e(),V.done;let t=H,n=B;return Promise.resolve().then(()=>{H=t,B=n;let r;return(je||Ie)&&(r=V||={sources:new Set,effects:[],promises:new Set,disposed:new Set,queue:new Set,running:!0},r.done||=new Promise(e=>r.resolve=e),r.running=!0),A(e,!1),H=B=null,r?r.done:void 0})}function S(e,t){let n=Symbol(`context`);return{id:n,Provider:ue(n),defaultValue:e}}function C(e){let t;return B&&B.context&&(t=B.context[e.id])!==void 0?t:e.defaultValue}function w(e){let t=d(e),n=d(()=>le(t()));return n.toArray=()=>{let e=n();return Array.isArray(e)?e:e==null?[]:[e]},n}function ee(){let e=V&&V.running;if(this.sources&&(e?this.tState:this.state))if((e?this.tState:this.state)===z)E(this);else{let e=U;U=null,A(()=>re(this),!1),U=e}if(H){let e=this.observers;if(!e||e[e.length-1]!==H){let t=e?e.length:0;H.sources?(H.sources.push(this),H.sourceSlots.push(t)):(H.sources=[this],H.sourceSlots=[t]),e?(e.push(H),this.observerSlots.push(H.sources.length-1)):(this.observers=[H],this.observerSlots=[H.sources.length-1])}}return e&&V.sources.has(this)?this.tValue:this.value}function T(e,t,n){let r=V&&V.running&&V.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(r,t)){if(V){let r=V.running;(r||!n&&V.sources.has(e))&&(V.sources.add(e),e.tValue=t),r||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&A(()=>{for(let t=0;t1e6)throw U=[],Error()},!1)}return t}function E(e){if(!e.fn)return;N(e);let t=Ne;D(e,V&&V.running&&V.sources.has(e)?e.tValue:e.value,t),V&&!V.running&&V.sources.has(e)&&queueMicrotask(()=>{A(()=>{V&&(V.running=!0),H=B=e,D(e,e.tValue,t),H=B=null},!1)})}function D(e,t,n){let r,i=B,a=H;H=B=e;try{r=e.fn(t)}catch(t){return e.pure&&(V&&V.running?(e.tState=z,e.tOwned&&e.tOwned.forEach(N),e.tOwned=void 0):(e.state=z,e.owned&&e.owned.forEach(N),e.owned=null)),e.updatedAt=n+1,ce(t)}finally{H=a,B=i}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&`observers`in e?T(e,r,!0):V&&V.running&&e.pure?(V.sources.has(e)||(e.value=r),V.sources.add(e),e.tValue=r):e.value=r,e.updatedAt=n)}function O(e,t,n,r=z,i){let a={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:B,context:B?B.context:null,pure:n};if(V&&V.running&&(a.state=0,a.tState=r),B===null||B!==ke&&(V&&V.running&&B.pure?B.tOwned?B.tOwned.push(a):B.tOwned=[a]:B.owned?B.owned.push(a):B.owned=[a]),Me&&a.fn){let e=a.fn,[t,n]=s(void 0,{equals:!1}),r=Me.factory(e,n);v(()=>r.dispose());let i,o=()=>x(n).then(()=>{i&&=(i.dispose(),void 0)});a.fn=n=>(t(),V&&V.running?(i||=Me.factory(e,o),i.track(n)):r.track(n))}return a}function k(e){let t=V&&V.running;if((t?e.tState:e.state)===0)return;if((t?e.tState:e.state)===Oe)return re(e);if(e.suspense&&h(e.suspense.inFallback))return e.suspense.effects.push(e);let n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt=0;r--){if(e=n[r],t){let t=e,i=n[r+1];for(;(t=t.owner)&&t!==i;)if(V.disposed.has(t))return}if((t?e.tState:e.state)===z)E(e);else if((t?e.tState:e.state)===Oe){let t=U;U=null,A(()=>re(e,n[0]),!1),U=t}}}function A(e,t){if(U)return e();let n=!1;t||(U=[]),W?n=!0:W=[],Ne++;try{let t=e();return j(n),t}catch(e){n||(W=null),U=null,ce(e)}}function j(e){if(U&&=(je&&V&&V.running?M(U):te(U),null),e)return;let t;if(V){if(!V.promises.size&&!V.queue.size){let e=V.sources,n=V.disposed;W.push.apply(W,V.effects),t=V.resolve;for(let e of W)`tState`in e&&(e.state=e.tState),delete e.tState;V=null,A(()=>{for(let e of n)N(e);for(let t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;eDe(n),!1),t&&t()}function te(e){for(let t=0;t{r.delete(n),A(()=>{V.running=!0,k(n)},!1),V&&(V.running=!1)}))}}function ne(e){let t,n=0;for(t=0;t=0;t--)N(e.tOwned[t]);delete e.tOwned}if(V&&V.running&&e.pure)ae(e,!0);else if(e.owned){for(t=e.owned.length-1;t>=0;t--)N(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}V&&V.running?e.tState=0:e.state=0}function ae(e,t){if(t||(e.tState=0,V.disposed.add(e)),e.owned)for(let t=0;tn=h(()=>(B.context={...B.context,[e]:t.value},w(()=>t.children))),void 0),n}}function de(e){for(let t=0;t1?[]:null;return v(()=>de(a)),()=>{let u=e()||[],d=u.length,f,p;return u[we],h(()=>{let e,t,s,h,g,_,v,y,b;if(d===0)c!==0&&(de(a),a=[],r=[],i=[],c=0,l&&=[]),n.fallback&&(r=[Le],i[0]=o(e=>(a[0]=e,n.fallback())),c=1);else if(c===0){for(i=Array(d),p=0;p=_&&y>=_&&r[v]===u[y];v--,y--)s[y]=i[v],h[y]=a[v],l&&(g[y]=l[v]);for(e=new Map,t=Array(y+1),p=y;p>=_;p--)b=u[p],f=e.get(b),t[p]=f===void 0?-1:f,e.set(b,p);for(f=_;f<=v;f++)b=r[f],p=e.get(b),p!==void 0&&p!==-1?(s[p]=i[f],h[p]=a[f],l&&(g[p]=l[f]),p=t[p],e.set(b,p)):a[f]();for(p=_;pe(t||{}));return i(n),r}return h(()=>e(t||{}))}function pe(){return!0}function me(e){return(e=typeof e==`function`?e():e)?e:{}}function he(){for(let e=0,t=this.length;e=0;n--){let r=me(e[n])[t];if(r!==void 0)return r}},has(t){for(let n=e.length-1;n>=0;n--)if(t in me(e[n]))return!0;return!1},keys(){let t=[];for(let n=0;n=0;t--){let i=e[t];if(!i)continue;let a=Object.getOwnPropertyNames(i);for(let e=a.length-1;e>=0;e--){let t=a[e];if(t===`__proto__`||t===`constructor`)continue;let o=Object.getOwnPropertyDescriptor(i,t);if(!r[t])r[t]=o.get?{enumerable:!0,configurable:!0,get:he.bind(n[t]=[o.get.bind(i)])}:o.value===void 0?void 0:o;else{let e=n[t];e&&(o.get?e.push(o.get.bind(i)):o.value!==void 0&&e.push(()=>o.value))}}}let i={},a=Object.keys(r);for(let e=a.length-1;e>=0;e--){let t=a[e],n=r[t];n&&n.get?Object.defineProperty(i,t,n):i[t]=n?n.value:void 0}return i}function ge(e,...t){let n=t.length;if(Ce&&Se in e){let r=n>1?t.flat():t[0],i=t.map(t=>new Proxy({get(n){return t.includes(n)?e[n]:void 0},has(n){return t.includes(n)&&n in e},keys(){return t.filter(t=>t in e)}},ze));return i.push(new Proxy({get(t){return r.includes(t)?void 0:e[t]},has(t){return r.includes(t)?!1:t in e},keys(){return Object.keys(e).filter(e=>!r.includes(e))}},ze)),i}let r=[];for(let e=0;e<=n;e++)r[e]={};for(let i of Object.getOwnPropertyNames(e)){let a=n;for(let e=0;e{let a=R.context;if(a){let[r,o]=s();R.count||=0,R.count++,(n||=e()).then(e=>{!R.done&&i(a),R.count--,o(()=>e.default),i()}),t=r}else if(!t){let[r]=p(()=>(n||=e()).then(e=>e.default));t=r}let o;return d(()=>(o=t())?h(()=>{if(!a||R.done)return o(r);let e=R.context;i(a);let t=o(r);return i(e),t}):``)};return r.preload=()=>n||((n=e()).then(e=>t=()=>e.default),n),r}function I(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return d(fe(()=>e.each,e.children,t||void 0))}function L(e){let t=e.keyed,n=d(()=>e.when,void 0,void 0),r=t?n:d(n,void 0,{equals:(e,t)=>!e==!t});return d(()=>{let i=r();if(i){let a=e.children;return typeof a==`function`&&a.length>0?h(()=>a(t?i:()=>{if(!h(r))throw Be(`Show`);return n()})):a}return e.fallback},void 0,void 0)}function ve(e){let t=w(()=>e.children),n=d(()=>{let e=t(),n=Array.isArray(e)?e:[e],r=()=>void 0;for(let e=0;ea()?void 0:i.when,void 0,void 0),s=i.keyed?o:d(o,void 0,{equals:(e,t)=>!e==!t});r=()=>a()||(s()?[t,o,i]:void 0)}return r});return d(()=>{let t=n()();if(!t)return e.fallback;let[r,i,a]=t,o=a.children;return typeof o==`function`&&o.length>0?h(()=>o(a.keyed?i():()=>{if(h(n)()?.[0]!==r)throw Be(`Match`);return i()})):o},void 0,void 0)}function ye(e){return e}function be(){Ve&&[...Ve].forEach(e=>e())}var R,xe,Se,Ce,we,Te,Ee,De,z,Oe,ke,Ae,B,V,je,Me,H,U,W,Ne,Pe,Fe,Ie,Le,Re,ze,Be,Ve,G=t((()=>{R={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return r(this.context.count)},getNextContextId(){return r(this.context.count++)}},xe=(e,t)=>e===t,Se=Symbol(`solid-proxy`),Ce=typeof Proxy==`function`,we=Symbol(`solid-track`),Te={equals:xe},Ee=null,De=te,z=1,Oe=2,ke={owned:null,cleanups:null,context:null,owner:null},Ae={},B=null,V=null,je=null,Me=null,H=null,U=null,W=null,Ne=0,[Pe,Fe]=s(!1),Le=Symbol(`fallback`),Re=!1,ze={get(e,t,n){return t===Se?n:e.get(t)},has(e,t){return t===Se?!0:e.has(t)},set:pe,deleteProperty:pe,getOwnPropertyDescriptor(e,t){return{configurable:!0,enumerable:!0,get(){return e.get(t)},set:pe,deleteProperty:pe}},ownKeys(e){return e.keys()}},Be=e=>`Stale read from <${e}>.`}));function He(e,t){let n=vt[e];return typeof n==`object`?n[t]?n.$:void 0:n}function Ue(e,t,n){let r=n.length,i=t.length,a=r,o=0,s=0,c=t[i-1].nextSibling,l=null;for(;or-s){let i=t[o];for(;s{i=r,t===document?e():Y(t,e(),t.firstChild?null:void 0,n)},r.owner),()=>{i(),t.textContent=``}}function K(e,t,n,r){let i,a=()=>{let t=r?document.createElementNS(`http://www.w3.org/1998/Math/MathML`,`template`):document.createElement(`template`);return t.innerHTML=e,n?t.content.firstChild.firstChild:r?t.firstChild:t.content.firstChild},o=t?()=>h(()=>document.importNode(i||=a(),!0)):()=>(i||=a()).cloneNode(!0);return o.cloneNode=o,o}function q(e,t=window.document){let n=t[Ct]||(t[Ct]=new Set);for(let r=0,i=e.length;rr.call(e,n[1],t))}else e.addEventListener(t,n,typeof n!=`function`&&n)}function Ye(e,t,n={}){let r=Object.keys(t||{}),i=Object.keys(n),a,o;for(a=0,o=i.length;ai.children=st(e,t.children,i.children)),l(()=>typeof t.ref==`function`&&$e(t.ref,e)),l(()=>et(e,t,n,!0,i,!0)),i}function $e(e,t,n){return h(()=>e(t,n))}function Y(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!=`function`)return st(e,t,r,n);l(r=>st(e,t(),r,n),r)}function et(e,t,n,r,i={},a=!1){t||={};for(let r in i)if(!(r in t)){if(r===`children`)continue;i[r]=at(e,r,null,i[r],n,a,t)}for(let o in t){if(o===`children`){r||st(e,t.children);continue}let s=t[o];i[o]=at(e,o,s,i[o],n,a,t)}}function tt(e){let t,n;return!nt()||!(t=R.registry.get(n=dt()))?e():(R.completed&&R.completed.add(t),R.registry.delete(n),t)}function nt(e){return!!R.context&&!R.done&&(!e||e.isConnected)}function rt(e){return e.toLowerCase().replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function it(e,t,n){let r=t.trim().split(/\s+/);for(let t=0,i=r.length;t-1&&xt[t.split(`:`)[0]];r?Ge(e,r,t,n):J(e,_t[t]||t,n)}return n}function ot(e){if(R.registry&&R.events&&R.events.find(([t,n])=>n===e))return;let t=e.target,n=`$$${e.type}`,r=e.target,i=e.currentTarget,a=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),o=()=>{let r=t[n];if(r&&!t.disabled){let i=t[`${n}Data`];if(i===void 0?r.call(t,e):r.call(t,i,e),e.cancelBubble)return}return t.host&&typeof t.host!=`string`&&!t.host._$host&&t.contains(e.target)&&a(t.host),!0},s=()=>{for(;o()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get(){return t||document}}),R.registry&&!R.done&&(R.done=_$HY.done=!0),e.composedPath){let n=e.composedPath();a(n[0]);for(let e=0;e{let i=t();for(;typeof i==`function`;)i=i();n=st(e,i,n,r)}),()=>n;else if(Array.isArray(t)){let o=[],c=n&&Array.isArray(n);if(ct(o,t,n,i))return l(()=>n=st(e,o,n,r,!0)),()=>n;if(a){if(!o.length)return n;if(r===void 0)return n=[...e.childNodes];let t=o[0];if(t.parentNode!==e)return n;let i=[t];for(;(t=t.nextSibling)!==r;)i.push(t);return n=i}if(o.length===0){if(n=ut(e,n,r),s)return n}else c?n.length===0?lt(e,o,r):Ue(e,n,o):(n&&ut(e),lt(e,o));n=o}else if(t.nodeType){if(a&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=ut(e,n,r,t);ut(e,n,null,t)}else n==null||n===``||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}return n}function ct(e,t,n,r){let i=!1;for(let a=0,o=t.length;a=0;a--){let o=t[a];if(i!==o){let t=o.parentNode===e;!r&&!a?t?e.replaceChild(i,o):e.insertBefore(i,n):t&&o.remove()}else r=!0}}else e.insertBefore(i,n);return[i]}function dt(){return R.getNextContextId()}function ft(e,t=!1,n=void 0){return t?document.createElementNS(wt,e):document.createElement(e,{is:n})}function pt(e,t){let n=d(e);return d(()=>{let e=n();switch(typeof e){case`function`:return h(()=>e(t));case`string`:let n=bt.has(e),r=R.context?tt():ft(e,n,h(()=>t.is));return Qe(r,t,n),r}})}function mt(e){let[,t]=ge(e,[`component`]);return pt(()=>e.component,t)}var ht,gt,_t,vt,yt,bt,xt,St,Ct,wt,X=t((()=>{G(),ht=new Set([`className`,`value`,`readOnly`,`noValidate`,`formNoValidate`,`isMap`,`noModule`,`playsInline`,`adAuctionHeaders`,`allowFullscreen`,`browsingTopics`,`defaultChecked`,`defaultMuted`,`defaultSelected`,`disablePictureInPicture`,`disableRemotePlayback`,`preservesPitch`,`shadowRootClonable`,`shadowRootCustomElementRegistry`,`shadowRootDelegatesFocus`,`shadowRootSerializable`,`sharedStorageWritable`,...`allowfullscreen.async.alpha.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.hidden.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.adauctionheaders.browsingtopics.credentialless.defaultchecked.defaultmuted.defaultselected.defer.disablepictureinpicture.disableremoteplayback.preservespitch.shadowrootclonable.shadowrootcustomelementregistry.shadowrootdelegatesfocus.shadowrootserializable.sharedstoragewritable`.split(`.`)]),gt=new Set([`innerHTML`,`textContent`,`innerText`,`children`]),_t=Object.assign(Object.create(null),{className:`class`,htmlFor:`for`}),vt=Object.assign(Object.create(null),{class:`className`,novalidate:{$:`noValidate`,FORM:1},formnovalidate:{$:`formNoValidate`,BUTTON:1,INPUT:1},ismap:{$:`isMap`,IMG:1},nomodule:{$:`noModule`,SCRIPT:1},playsinline:{$:`playsInline`,VIDEO:1},readonly:{$:`readOnly`,INPUT:1,TEXTAREA:1},adauctionheaders:{$:`adAuctionHeaders`,IFRAME:1},allowfullscreen:{$:`allowFullscreen`,IFRAME:1},browsingtopics:{$:`browsingTopics`,IMG:1},defaultchecked:{$:`defaultChecked`,INPUT:1},defaultmuted:{$:`defaultMuted`,AUDIO:1,VIDEO:1},defaultselected:{$:`defaultSelected`,OPTION:1},disablepictureinpicture:{$:`disablePictureInPicture`,VIDEO:1},disableremoteplayback:{$:`disableRemotePlayback`,AUDIO:1,VIDEO:1},preservespitch:{$:`preservesPitch`,AUDIO:1,VIDEO:1},shadowrootclonable:{$:`shadowRootClonable`,TEMPLATE:1},shadowrootdelegatesfocus:{$:`shadowRootDelegatesFocus`,TEMPLATE:1},shadowrootserializable:{$:`shadowRootSerializable`,TEMPLATE:1},sharedstoragewritable:{$:`sharedStorageWritable`,IFRAME:1,IMG:1}}),yt=new Set([`beforeinput`,`click`,`dblclick`,`contextmenu`,`focusin`,`focusout`,`input`,`keydown`,`keyup`,`mousedown`,`mousemove`,`mouseout`,`mouseover`,`mouseup`,`pointerdown`,`pointermove`,`pointerout`,`pointerover`,`pointerup`,`touchend`,`touchmove`,`touchstart`]),bt=new Set(`altGlyph.altGlyphDef.altGlyphItem.animate.animateColor.animateMotion.animateTransform.circle.clipPath.color-profile.cursor.defs.desc.ellipse.feBlend.feColorMatrix.feComponentTransfer.feComposite.feConvolveMatrix.feDiffuseLighting.feDisplacementMap.feDistantLight.feDropShadow.feFlood.feFuncA.feFuncB.feFuncG.feFuncR.feGaussianBlur.feImage.feMerge.feMergeNode.feMorphology.feOffset.fePointLight.feSpecularLighting.feSpotLight.feTile.feTurbulence.filter.font.font-face.font-face-format.font-face-name.font-face-src.font-face-uri.foreignObject.g.glyph.glyphRef.hkern.image.line.linearGradient.marker.mask.metadata.missing-glyph.mpath.path.pattern.polygon.polyline.radialGradient.rect.set.stop.svg.switch.symbol.text.textPath.tref.tspan.use.view.vkern`.split(`.`)),xt={xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`},St=e=>d(()=>e()),Ct=`_$DX_DELEGATE`,wt=`http://www.w3.org/2000/svg`}));X();function Tt(){let e=new Set;function t(t){return e.add(t),()=>e.delete(t)}let n=!1;function r(t,r){if(n)return!(n=!1);let i={to:t,options:r,defaultPrevented:!1,preventDefault:()=>i.defaultPrevented=!0};for(let a of e)a.listener({...i,from:a.location,retry:e=>{e&&(n=!0),a.navigate(t,{...r,resolve:!1})}});return!i.defaultPrevented}return{subscribe:t,confirm:r}}function Et(){(!window.history.state||window.history.state._depth==null)&&window.history.replaceState({...window.history.state,_depth:window.history.length-1},``),kt=window.history.state._depth}function Dt(e){return{...e,_depth:window.history.state&&window.history.state._depth}}function Ot(e,t){let n=!1;return()=>{let r=kt;Et();let i=r==null?null:kt-r;if(n){n=!1;return}i&&t(i)?(n=!0,window.history.go(-i)):e()}}var kt,At=t((()=>{Et()}));function jt(e,t=!1){let n=e.replace(Ht,`$1`);return n?t||/^[?#]/.test(n)?n:`/`+n:``}function Mt(e,t,n){if(Vt.test(t))return;let r=jt(e),i=n&&jt(n),a=``;return a=!i||t.startsWith(`/`)?r:i.toLowerCase().indexOf(r.toLowerCase())===0?i:r+i,(a||`/`)+jt(t,!a)}function Nt(e,t){if(e==null)throw Error(t);return e}function Pt(e,t){return jt(e).replace(/\/*(\*.*)?$/g,``)+jt(t)}function Ft(e){let t={};return e.searchParams.forEach((e,n)=>{n in t?Array.isArray(t[n])?t[n].push(e):t[n]=[t[n],e]:t[n]=e}),t}function It(e,t,n){let[r,i]=e.split(`/*`,2),a=r.split(`/`).filter(Boolean),o=a.length;return e=>{let r=e.split(`/`).filter(Boolean),s=r.length-o;if(s<0||s>0&&i===void 0&&!t)return null;let c={path:o?``:`/`,params:{}},l=e=>n===void 0?void 0:n[e];for(let e=0;et===e;return t===void 0?!0:typeof t==`string`?n(t):typeof t==`function`?t(e):Array.isArray(t)?t.some(n):t instanceof RegExp?t.test(e):!1}function Rt(e){let[t,n]=e.pattern.split(`/*`,2),r=t.split(`/`).filter(Boolean);return r.reduce((e,t)=>e+(t.startsWith(`:`)?2:3),r.length-(n===void 0?0:1))}function zt(e){let t=new Map,n=y();return new Proxy({},{get(r,i){return t.has(i)||b(n,()=>t.set(i,d(()=>e()[i]))),t.get(i)()},getOwnPropertyDescriptor(){return{enumerable:!0,configurable:!0}},ownKeys(){return Reflect.ownKeys(e())},has(t,n){return n in e()}})}function Bt(e){let t=/(\/?\:[^\/]+)\?/.exec(e);if(!t)return[e];let n=e.slice(0,t.index),r=e.slice(t.index+t[0].length),i=[n,n+=t[1]];for(;t=/^(\/\:[^\/]+)\?/.exec(r);)i.push(n+=t[1]),r=r.slice(t[0].length);return Bt(r).reduce((e,t)=>[...e,...i.map(e=>e+t)],[])}var Vt,Ht,Ut,Wt=t((()=>{G(),Vt=/^(?:[a-z0-9]+:)?\/\//i,Ht=/^\/+|(\/)\/+$/g,Ut=`http://sr`}));function Gt(e,t=``){let{component:n,preload:r,load:i,children:a,info:o}=e,s=!a||Array.isArray(a)&&!a.length,c={key:e,component:n,preload:r||i,info:o};return qt(e.path).reduce((n,r)=>{for(let i of Bt(r)){let a=Pt(t,i),o=s?a:a.split(`/*`,1)[0];o=o.split(`/`).map(e=>e.startsWith(`:`)||e.startsWith(`*`)?e:encodeURIComponent(e)).join(`/`),n.push({...c,originalPath:r,pattern:o,matcher:It(o,!s,e.matchFilters)})}return n},[])}function Kt(e,t=0){return{routes:e,score:Rt(e[e.length-1])*1e4-t,matcher(t){let n=[];for(let r=e.length-1;r>=0;r--){let i=e[r],a=i.matcher(t);if(!a)return null;n.unshift({...a,route:i})}return n}}}function qt(e){return Array.isArray(e)?e:[e]}function Jt(e,t=``,n=[],r=[]){let i=qt(e);for(let e=0,a=i.length;et.score-e.score)}function Yt(e,t){for(let n=0,r=e.length;n{let n=e();try{return new URL(n,r)}catch{return console.error(`Invalid path ${n}`),t}},r,{equals:(e,t)=>e.href===t.href}),a=d(()=>i().pathname),o=d(()=>i().search,!0),s=d(()=>i().hash),c=()=>``,l=g(o,()=>Ft(i()));return{get pathname(){return a()},get search(){return o()},get hash(){return s()},get state(){return t()},get key(){return c()},query:n?n(l):zt(l)}}function Zt(){return fn}function Qt(e){pn=e}function $t(e,t,n,r={}){let{signal:[i,a],utils:o={}}=e,c=o.parsePath||(e=>e),u=o.renderPath||(e=>e),f=o.beforeLeave||Tt(),p=Mt(``,r.base||``);if(p===void 0)throw Error(`${p} is not a valid base path`);p&&!i().value&&a({value:p,replace:!0,scroll:!1});let[_,v]=s(!1),y,S=(e,t)=>{t.value===w()&&t.state===T()||(y===void 0&&v(!0),fn=e,y=t,x(()=>{y===t&&(ee(y.value),E(y.state),be(),k[1](e=>e.filter(e=>e.pending)))}).finally(()=>{y===t&&m(()=>{fn=void 0,e===`navigate`&&ie(y),v(!1),y=void 0})}))},[w,ee]=s(i().value),[T,E]=s(i().state),D=Xt(w,T,o.queryWrapper),O=[],k=s([]),A=d(()=>typeof r.transformUrl==`function`?Yt(t(),r.transformUrl(D.pathname)):Yt(t(),D.pathname)),j=()=>{let e=A(),t={};for(let n=0;np,outlet:()=>null,resolvePath(e){return Mt(p,e)}};return l(g(i,e=>S(`native`,e),{defer:!0})),{base:M,location:D,params:te,isRouting:_,renderPath:u,parsePath:c,navigatorFactory:re,matches:A,beforeLeave:f,preloadRoute:N,singleFlight:r.singleFlight===void 0?!0:r.singleFlight,submissions:k};function ne(e,t,n){h(()=>{if(typeof t==`number`){t&&(o.go?o.go(t):console.warn(`Router integration does not support relative routing`));return}let r=!t||t[0]===`?`,{replace:i,resolve:a,scroll:s,state:c}={replace:!1,resolve:!r,scroll:!0,...n},l=a?e.resolvePath(t):Mt(r&&D.pathname||``,t);if(l===void 0)throw Error(`Path '${t}' is not a routable path`);if(O.length>=tn)throw Error(`Too many redirects`);let u=w();(l!==u||c!==T())&&f.confirm(l,n)&&(O.push({value:u,replace:i,scroll:s,state:T()}),S(`navigate`,{value:l,state:c}))})}function re(e){return e=e||C(rn)||M,(t,n)=>ne(e,t,n)}function ie(e){let t=O[0];t&&(a({...e,replace:t.replace,scroll:t.scroll}),O.length=0)}function N(e,r){let i=Yt(t(),e.pathname),a=fn;fn=`preload`;for(let t in i){let{route:a,params:o}=i[t];a.component&&a.component.preload&&a.component.preload();let{preload:s}=a;pn=!0,r&&s&&b(n(),()=>s({params:o,location:{pathname:e.pathname,search:e.search,hash:e.hash,query:Ft(e),state:null,key:``},intent:`preload`})),pn=!1}fn=a}}function en(e,t,n,r){let{base:i,location:a,params:o}=e,{pattern:s,component:c,preload:l}=r().route,u=d(()=>r().path);c&&c.preload&&c.preload(),pn=!0;let f=l?l({params:o,location:a,intent:fn||`initial`}):void 0;return pn=!1,{parent:t,pattern:s,path:u,outlet:()=>c?P(c,{params:o,location:a,data:f,get children(){return n()}}):n(),resolvePath(e){return Mt(i.path(),e,u())}}}var tn,nn,rn,an,on,sn,cn,ln,un,dn,fn,pn,mn=t((()=>{G(),X(),At(),Wt(),tn=100,nn=S(),rn=S(),an=()=>Nt(C(nn),` and 'use' router primitives can be only used inside a Route.`),on=()=>C(rn)||an().base,sn=e=>{let t=on();return d(()=>t.resolvePath(e()))},cn=e=>{let t=an();return d(()=>{let n=e();return n===void 0?n:t.renderPath(n)})},ln=()=>an().navigatorFactory(),un=()=>an().location,dn=()=>an().params}));function hn(e){let t=e.routerState.location,n=e.routerState.params,r=d(()=>e.preload&&h(()=>{Qt(!0),e.preload({params:n,location:t,intent:Zt()||`initial`}),Qt(!1)}));return P(L,{get when(){return e.root},keyed:!0,get fallback(){return e.children},children:i=>P(i,{params:n,location:t,get data(){return r()},get children(){return e.children}})})}function gn(e){let t=[],n,r=d(g(e.routerState.matches,(i,a,s)=>{let c=a&&i.length===a.length,l=[];for(let n=0,u=i.length;n{t[n]=i,l[n]=en(e.routerState,l[n-1]||e.routerState.base,vn(()=>r()[n+1]),()=>{let t=e.routerState.matches();return t[n]??t[0]})}))}return t.splice(i.length).forEach(e=>e()),s&&c?s:(n=l[0],l)}));return vn(()=>r()&&n)()}var _n,vn,yn,bn=t((()=>{X(),G(),mn(),_n=e=>t=>{let{base:n}=t,r=w(()=>t.children),i=d(()=>Jt(r(),t.base||``)),a,o=$t(e,i,()=>a,{base:n,singleFlight:t.singleFlight,transformUrl:t.transformUrl});return e.create&&e.create(o),P(nn.Provider,{value:o,get children(){return P(hn,{routerState:o,get root(){return t.root},get preload(){return t.rootPreload||t.rootLoad},get children(){return[St(()=>(a=y())&&null),P(gn,{routerState:o,get branches(){return i()}})]}})}})},vn=e=>()=>P(L,{get when(){return e()},keyed:!0,children:e=>P(rn.Provider,{value:e,get children(){return e.outlet()}})}),yn=e=>{let t=w(()=>e.children);return F(e,{get children(){return t()}})}}));function xn([e,t],n,r){return[n?()=>n(e()):e,r?e=>t(r(e)):t]}function Sn(e){let t=!1,n=e=>typeof e==`string`?{value:e}:e,r=xn(s(n(e.get()),{equals:(e,t)=>e.value===t.value&&e.state===t.state}),void 0,n=>(!t&&e.set(n),R.registry&&!R.done&&(R.done=!0),n));return e.init&&v(e.init((i=e.get())=>{t=!0,r[1](n(i)),t=!1})),_n({signal:r,create:e.create,utils:e.utils})}function Cn(e,t,n){return e.addEventListener(t,n),()=>e.removeEventListener(t,n)}function wn(e,t){let n=e&&document.getElementById(e);n?n.scrollIntoView():t&&window.scrollTo(0,0)}var Tn=t((()=>{G(),bn()})),En,Dn=t((()=>{En=new Map}));function On(e=!0,t=!1,n=`/_server`,r){return i=>{let a=i.base.path(),o=i.navigatorFactory(i.base),s,c;function l(e){return e.namespaceURI===`http://www.w3.org/2000/svg`}function u(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;let n=e.composedPath().find(e=>e instanceof Node&&e.nodeName.toUpperCase()===`A`);if(!n||t&&!n.hasAttribute(`link`))return;let r=l(n),i=r?n.href.baseVal:n.href;if((r?n.target.baseVal:n.target)||!i&&!n.hasAttribute(`state`))return;let o=(n.getAttribute(`rel`)||``).split(/\s+/);if(n.hasAttribute(`download`)||o&&o.includes(`external`))return;let s=r?new URL(i,document.baseURI):new URL(i);if(!(s.origin!==window.location.origin||a&&s.pathname&&!s.pathname.toLowerCase().startsWith(a.toLowerCase())))return[n,s]}function d(e){let t=u(e);if(!t)return;let[n,r]=t,a=i.parsePath(r.pathname+r.search+r.hash),s=n.getAttribute(`state`);e.preventDefault(),o(a,{resolve:!1,replace:n.hasAttribute(`replace`),scroll:!n.hasAttribute(`noscroll`),state:s?JSON.parse(s):void 0})}function f(e){let t=u(e);if(!t)return;let[n,a]=t;r&&(a.pathname=r(a.pathname)),i.preloadRoute(a,n.getAttribute(`preload`)!==`false`)}function p(e){clearTimeout(s);let t=u(e);if(!t)return c=null;let[n,a]=t;c!==n&&(r&&(a.pathname=r(a.pathname)),s=setTimeout(()=>{i.preloadRoute(a,n.getAttribute(`preload`)!==`false`),c=n},20))}function m(e){if(e.defaultPrevented)return;let t=e.submitter&&e.submitter.hasAttribute(`formaction`)?e.submitter.getAttribute(`formaction`):e.target.getAttribute(`action`);if(!t)return;if(!t.startsWith(`https://action/`)){let e=new URL(t,Ut);if(t=i.parsePath(e.pathname+e.search),!t.startsWith(n))return}if(e.target.method.toUpperCase()!==`POST`)throw Error(`Only POST forms are supported for Actions`);let r=En.get(t);if(r){e.preventDefault();let t=new FormData(e.target,e.submitter);r.call({r:i,f:e.target},e.target.enctype===`multipart/form-data`?t:new URLSearchParams(t))}}q([`click`,`submit`]),document.addEventListener(`click`,d),e&&(document.addEventListener(`mousemove`,p,{passive:!0}),document.addEventListener(`focusin`,f,{passive:!0}),document.addEventListener(`touchstart`,f,{passive:!0})),document.addEventListener(`submit`,m),v(()=>{document.removeEventListener(`click`,d),e&&(document.removeEventListener(`mousemove`,p),document.removeEventListener(`focusin`,f),document.removeEventListener(`touchstart`,f)),document.removeEventListener(`submit`,m)})}}var kn=t((()=>{X(),G(),Dn(),Wt()}));function An(e){let t=e.replace(/^.*?#/,``);if(!t.startsWith(`/`)){let[,e=`/`]=window.location.hash.split(`#`,2);return`${e}#${t}`}return t}function jn(e){let t=()=>window.location.hash.slice(1),n=Tt();return Sn({get:t,set({value:e,replace:t,scroll:n,state:r}){t?window.history.replaceState(Dt(r),``,`#`+e):window.history.pushState(r,``,`#`+e);let i=e.indexOf(`#`);wn(i>=0?e.slice(i+1):``,n),Et()},init:e=>Cn(window,`hashchange`,Ot(e,e=>!n.confirm(e&&e<0?e:t()))),create:On(e.preload,e.explicitLinks,e.actionBase),utils:{go:e=>window.history.go(e),renderPath:e=>`#${e}`,parsePath:An,beforeLeave:n}})(e)}var Mn=t((()=>{kn(),Tn(),At()})),Nn=t((()=>{bn(),Tn(),X(),kn(),At(),Mn()}));function Pn(e){e=F({inactiveClass:`inactive`,activeClass:`active`},e);let[,t]=ge(e,[`href`,`state`,`class`,`activeClass`,`inactiveClass`,`end`]),n=sn(()=>e.href),r=cn(n),i=un(),a=d(()=>{let t=n();if(t===void 0)return[!1,!1];let r=jt(t.split(/[?#]/,1)[0]).toLowerCase(),a=decodeURI(jt(i.pathname).toLowerCase());return[e.end?r===a:a.startsWith(r+`/`)||a===r,r===a]});return(()=>{var n=Fn();return Qe(n,F(t,{get href(){return r()||e.href},get state(){return JSON.stringify(e.state)},get classList(){return{...e.class&&{[e.class]:!0},[e.inactiveClass]:!a()[0],[e.activeClass]:a()[0],...t.classList}},link:``,get"aria-current"(){return a()[1]?`page`:void 0}}),!1,!1),n})()}var Fn,In=t((()=>{X(),G(),mn(),Wt(),Fn=K(``)})),Ln=t((()=>{G(),X(),Dn(),mn()})),Rn=t((()=>{Nn(),In(),At(),mn(),Wt(),Ln()})),zn,Bn=t((()=>{zn={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`}})),Vn,Hn,Un,Wn,Z,Q=t((()=>{X(),G(),Bn(),Vn=K(``),Hn=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),Un=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),Wn=e=>{let[t,n]=ge(e,[`color`,`size`,`strokeWidth`,`children`,`class`,`name`,`iconNode`,`absoluteStrokeWidth`]);return(()=>{var e=Vn();return Qe(e,F(zn,{get width(){return t.size??zn.width},get height(){return t.size??zn.height},get stroke(){return t.color??zn.stroke},get"stroke-width"(){return St(()=>!!t.absoluteStrokeWidth)()?Number(t.strokeWidth??zn[`stroke-width`])*24/Number(t.size):Number(t.strokeWidth??zn[`stroke-width`])},get class(){return Un(`lucide`,`lucide-icon`,t.name==null?void 0:`lucide-${Hn(t?.name)}`,t.class==null?``:t.class)}},n),!0,!0),Y(e,P(I,{get each(){return t.iconNode},children:([e,t])=>P(mt,F({component:e},t))})),e})()},Z=Wn})),Gn,Kn,qn,Jn=t((()=>{X(),Q(),Gn=[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]],Kn=e=>P(Z,F(e,{name:`Activity`,iconNode:Gn})),qn=Kn})),Yn,Xn,Zn,Qn=t((()=>{X(),Q(),Yn=[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]],Xn=e=>P(Z,F(e,{name:`ArrowLeft`,iconNode:Yn})),Zn=Xn})),$n,er,tr,nr=t((()=>{X(),Q(),$n=[[`path`,{d:`M12 7v14`,key:`1akyts`}],[`path`,{d:`M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z`,key:`ruj8y`}]],er=e=>P(Z,F(e,{name:`BookOpen`,iconNode:$n})),tr=er})),rr,ir,ar,or=t((()=>{X(),Q(),rr=[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]],ir=e=>P(Z,F(e,{name:`ChevronDown`,iconNode:rr})),ar=ir})),sr,cr,lr,ur=t((()=>{X(),Q(),sr=[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]],cr=e=>P(Z,F(e,{name:`ChevronRight`,iconNode:sr})),lr=cr})),dr,fr,pr,mr=t((()=>{X(),Q(),dr=[[`path`,{d:`m18 15-6-6-6 6`,key:`153udz`}]],fr=e=>P(Z,F(e,{name:`ChevronUp`,iconNode:dr})),pr=fr})),hr,gr,_r,vr=t((()=>{X(),Q(),hr=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`,key:`yps3ct`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]],gr=e=>P(Z,F(e,{name:`CircleCheckBig`,iconNode:hr})),_r=gr})),yr,br,xr,Sr=t((()=>{X(),Q(),yr=[[`path`,{d:`M10.1 2.182a10 10 0 0 1 3.8 0`,key:`5ilxe3`}],[`path`,{d:`M13.9 21.818a10 10 0 0 1-3.8 0`,key:`11zvb9`}],[`path`,{d:`M17.609 3.721a10 10 0 0 1 2.69 2.7`,key:`1iw5b2`}],[`path`,{d:`M2.182 13.9a10 10 0 0 1 0-3.8`,key:`c0bmvh`}],[`path`,{d:`M20.279 17.609a10 10 0 0 1-2.7 2.69`,key:`1ruxm7`}],[`path`,{d:`M21.818 10.1a10 10 0 0 1 0 3.8`,key:`qkgqxc`}],[`path`,{d:`M3.721 6.391a10 10 0 0 1 2.7-2.69`,key:`1mcia2`}],[`path`,{d:`M6.391 20.279a10 10 0 0 1-2.69-2.7`,key:`1fvljs`}]],br=e=>P(Z,F(e,{name:`CircleDashed`,iconNode:yr})),xr=br})),Cr,wr,Tr,Er=t((()=>{X(),Q(),Cr=[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]],wr=e=>P(Z,F(e,{name:`CircleX`,iconNode:Cr})),Tr=wr})),Dr,Or,kr,Ar=t((()=>{X(),Q(),Dr=[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`polyline`,{points:`12 6 12 12 16 14`,key:`68esgv`}]],Or=e=>P(Z,F(e,{name:`Clock`,iconNode:Dr})),kr=Or})),jr,Mr,Nr,Pr=t((()=>{X(),Q(),jr=[[`path`,{d:`M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4`,key:`1pf5j1`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`,key:`tnqrlb`}],[`path`,{d:`m5 12-3 3 3 3`,key:`oke12k`}],[`path`,{d:`m9 18 3-3-3-3`,key:`112psh`}]],Mr=e=>P(Z,F(e,{name:`FileCode2`,iconNode:jr})),Nr=Mr})),Fr,Ir,Lr,Rr=t((()=>{X(),Q(),Fr=[[`path`,{d:`M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z`,key:`1rqfz7`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`,key:`tnqrlb`}],[`path`,{d:`M9 15h6`,key:`cctwl0`}],[`path`,{d:`M12 18v-6`,key:`17g6i2`}]],Ir=e=>P(Z,F(e,{name:`FilePlus`,iconNode:Fr})),Lr=Ir})),zr,Br,Vr,Hr=t((()=>{X(),Q(),zr=[[`path`,{d:`M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z`,key:`1rqfz7`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`,key:`tnqrlb`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]],Br=e=>P(Z,F(e,{name:`FileText`,iconNode:zr})),Vr=Br})),Ur,Wr,Gr,Kr=t((()=>{X(),Q(),Ur=[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]],Wr=e=>P(Z,F(e,{name:`FolderOpen`,iconNode:Ur})),Gr=Wr})),qr,Jr,Yr,Xr=t((()=>{X(),Q(),qr=[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]],Jr=e=>P(Z,F(e,{name:`Globe`,iconNode:qr})),Yr=Jr})),Zr,Qr,$r,ei=t((()=>{X(),Q(),Zr=[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`1d0kgt`}]],Qr=e=>P(Z,F(e,{name:`House`,iconNode:Zr})),$r=Qr})),ti,ni,ri,ii=t((()=>{X(),Q(),ti=[[`line`,{x1:`2`,x2:`22`,y1:`2`,y2:`22`,key:`a6p6uj`}],[`path`,{d:`M10.41 10.41a2 2 0 1 1-2.83-2.83`,key:`1bzlo9`}],[`line`,{x1:`13.5`,x2:`6`,y1:`13.5`,y2:`21`,key:`1q0aeu`}],[`line`,{x1:`18`,x2:`21`,y1:`12`,y2:`15`,key:`5mozeu`}],[`path`,{d:`M3.59 3.59A1.99 1.99 0 0 0 3 5v14a2 2 0 0 0 2 2h14c.55 0 1.052-.22 1.41-.59`,key:`mmje98`}],[`path`,{d:`M21 15V5a2 2 0 0 0-2-2H9`,key:`43el77`}]],ni=e=>P(Z,F(e,{name:`ImageOff`,iconNode:ti})),ri=ni})),ai,oi,si,ci=t((()=>{X(),Q(),ai=[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}],[`circle`,{cx:`9`,cy:`9`,r:`2`,key:`af1f0g`}],[`path`,{d:`m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21`,key:`1xmnt7`}]],oi=e=>P(Z,F(e,{name:`Image`,iconNode:ai})),si=oi})),li,ui,di,fi=t((()=>{X(),Q(),li=[[`path`,{d:`m5 8 6 6`,key:`1wu5hv`}],[`path`,{d:`m4 14 6-6 2-3`,key:`1k1g8d`}],[`path`,{d:`M2 5h12`,key:`or177f`}],[`path`,{d:`M7 2h1`,key:`1t2jsx`}],[`path`,{d:`m22 22-5-10-5 10`,key:`don7ne`}],[`path`,{d:`M14 18h6`,key:`1m8k6r`}]],ui=e=>P(Z,F(e,{name:`Languages`,iconNode:li})),di=ui})),pi,mi,hi,gi=t((()=>{X(),Q(),pi=[[`path`,{d:`M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z`,key:`zw3jo`}],[`path`,{d:`M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12`,key:`1wduqc`}],[`path`,{d:`M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17`,key:`kqbvx6`}]],mi=e=>P(Z,F(e,{name:`Layers`,iconNode:pi})),hi=mi})),_i,vi,yi,bi=t((()=>{X(),Q(),_i=[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`,key:`48i651`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`,key:`1svkeh`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`,key:`vw1qmm`}]],vi=e=>P(Z,F(e,{name:`Monitor`,iconNode:_i})),yi=vi})),xi,Si,Ci,wi=t((()=>{X(),Q(),xi=[[`path`,{d:`M12 20h9`,key:`t2du7b`}],[`path`,{d:`M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z`,key:`1ykcvy`}]],Si=e=>P(Z,F(e,{name:`PenLine`,iconNode:xi})),Ci=Si})),Ti,Ei,Di,Oi=t((()=>{X(),Q(),Ti=[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]],Ei=e=>P(Z,F(e,{name:`Pen`,iconNode:Ti})),Di=Ei})),ki,Ai,ji,Mi=t((()=>{X(),Q(),ki=[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]],Ai=e=>P(Z,F(e,{name:`Plus`,iconNode:ki})),ji=Ai})),Ni,Pi,Fi,Ii=t((()=>{X(),Q(),Ni=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]],Pi=e=>P(Z,F(e,{name:`RefreshCw`,iconNode:Ni})),Fi=Pi})),Li,Ri,zi,Bi=t((()=>{X(),Q(),Li=[[`path`,{d:`M3 7V5a2 2 0 0 1 2-2h2`,key:`aa7l1z`}],[`path`,{d:`M17 3h2a2 2 0 0 1 2 2v2`,key:`4qcy5o`}],[`path`,{d:`M21 17v2a2 2 0 0 1-2 2h-2`,key:`6vwrx8`}],[`path`,{d:`M7 21H5a2 2 0 0 1-2-2v-2`,key:`ioqczr`}],[`path`,{d:`M7 8h8`,key:`1jbsf9`}],[`path`,{d:`M7 12h10`,key:`b7w52i`}],[`path`,{d:`M7 16h6`,key:`1vyc9m`}]],Ri=e=>P(Z,F(e,{name:`ScanText`,iconNode:Li})),zi=Ri})),Vi,Hi,Ui,Wi=t((()=>{X(),Q(),Vi=[[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}],[`path`,{d:`M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5`,key:`tn8das`}],[`path`,{d:`M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5`,key:`1g2pve`}],[`path`,{d:`M6 6h.01`,key:`1utrut`}],[`path`,{d:`M6 18h.01`,key:`uhywen`}],[`path`,{d:`m15.7 13.4-.9-.3`,key:`1jwmzr`}],[`path`,{d:`m9.2 10.9-.9-.3`,key:`qapnim`}],[`path`,{d:`m10.6 15.7.3-.9`,key:`quwk0k`}],[`path`,{d:`m13.6 15.7-.4-1`,key:`cb9xp7`}],[`path`,{d:`m10.8 9.3-.4-1`,key:`1uaiz5`}],[`path`,{d:`m8.3 13.6 1-.4`,key:`s6srou`}],[`path`,{d:`m14.7 10.8 1-.4`,key:`4d31cq`}],[`path`,{d:`m13.4 8.3-.3.9`,key:`1bm987`}]],Hi=e=>P(Z,F(e,{name:`ServerCog`,iconNode:Vi})),Ui=Hi})),Gi,Ki,qi,Ji=t((()=>{X(),Q(),Gi=[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]],Ki=e=>P(Z,F(e,{name:`ShieldAlert`,iconNode:Gi})),qi=Ki})),Yi,Xi,Zi,Qi=t((()=>{X(),Q(),Yi=[[`path`,{d:`M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z`,key:`4pj2yx`}],[`path`,{d:`M20 3v4`,key:`1olli1`}],[`path`,{d:`M22 5h-4`,key:`1gvqau`}],[`path`,{d:`M4 17v2`,key:`vumght`}],[`path`,{d:`M5 18H3`,key:`zchphs`}]],Xi=e=>P(Z,F(e,{name:`Sparkles`,iconNode:Yi})),Zi=Xi})),$i,ea,ta,na=t((()=>{X(),Q(),$i=[[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`,key:`4alrt4`}],[`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`,key:`v07s0e`}],[`line`,{x1:`10`,x2:`10`,y1:`11`,y2:`17`,key:`1uufr5`}],[`line`,{x1:`14`,x2:`14`,y1:`11`,y2:`17`,key:`xtxkd`}]],ea=e=>P(Z,F(e,{name:`Trash2`,iconNode:$i})),ta=ea})),ra,ia,aa,oa=t((()=>{X(),Q(),ra=[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]],ia=e=>P(Z,F(e,{name:`X`,iconNode:ra})),aa=ia})),sa=t((()=>{Jn(),Qn(),nr(),or(),ur(),mr(),Sr(),Ar(),Pr(),Rr(),Hr(),Kr(),Xr(),ii(),ci(),fi(),gi(),bi(),wi(),Mi(),Ii(),Bi(),Wi(),Ji(),Qi(),na(),oa()})),ca=t((()=>{vr()})),la=t((()=>{Er()})),ua=t((()=>{ei()})),da=t((()=>{Oi()})),fa=t((()=>{ca(),la(),ua(),da()})),pa=t((()=>{})),ma=t((()=>{})),ha=t((()=>{fa(),pa(),ma()})),ga=t((()=>{})),_a=t((()=>{sa(),ha(),ga()}));X(),Rn(),_a();var va=K(`
`),ya=K(``),ba=K(``),xa=[{href:`/`,label:`Home`,Icon:$r},{href:`/status`,label:`Server Status`,Icon:Ui},{href:`/openapi`,label:`OpenAPI`,Icon:Nr},{href:`/library`,label:`Library`,Icon:tr},{href:`/jobs`,label:`Jobs`,Icon:si}];function Sa(e){return(()=>{var t=va(),n=t.firstChild;n.firstChild;var r=n.nextSibling;return Y(n,()=>xa.map(e=>P(Pn,{get href(){return e.href},get end(){return e.href===`/`},class:`flex items-center gap-3 rounded-lg px-1 py-2 text-slate-400 transition-colors hover:bg-slate-800 hover:text-white`,activeClass:`bg-slate-800 text-white!`,get children(){return[(()=>{var t=ya();return Y(t,P(e.Icon,{class:`h-5 w-5`})),t})(),(()=>{var t=ba();return Y(t,()=>e.label),t})()]}})),null),Y(r,()=>e.children),t})()}X(),G();var Ca=K(`
W

WebOCR

Manga OCR · Translation · Typesetting`),wa=K(`v`);function Ta(){let[e,t]=s(null);return _(()=>{fetch(`/health`).then(e=>e.ok?e.json():Promise.reject()).then(t).catch(()=>{})}),(()=>{var t=Ca();return t.firstChild.nextSibling,Y(t,P(L,{get when(){return e()},children:e=>(()=>{var t=wa();return t.firstChild,Y(t,()=>e().version,null),t})()}),null),t})()}function Ea(e){return P(L,{get when(){return e.ok!==null},get fallback(){return(()=>{var t=ka();return Y(t,P(xr,{class:`h-3 w-3 animate-spin`}),null),Y(t,()=>e.label,null),t})()},get children(){return P(L,{get when(){return e.ok},get fallback(){return(()=>{var t=Aa();return Y(t,P(Tr,{class:`h-3 w-3`}),null),Y(t,()=>e.label,null),t})()},get children(){var t=Oa();return Y(t,P(_r,{class:`h-3 w-3`}),null),Y(t,()=>e.label,null),t}})}})}function Da(){let[e,t]=s(null),[n,r]=s(null),[i,a]=s(!1),[o,c]=s(null);_(u);function u(){fetch(`/health`).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{t(e),c(e.preferred_translation_engine)}).catch(e=>r(String(e)))}let d=()=>{if(n())return!1;let t=e();return t?t.status===`ok`:null},f=()=>{if(n())return`error`;let t=e();return t?t.status:`connecting`};async function p(t){if(!(!e()||i())){a(!0);try{let e=await fetch(`/api/settings`);if(!e.ok)throw Error(`Failed to load settings`);let n=await e.json();if(n.preferred_translation_engine=t,!(await fetch(`/api/settings`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)})).ok)throw Error(`Failed to save settings`);c(t)}catch(e){console.error(`Failed to update translation engine:`,e)}finally{a(!1)}}}return(()=>{var t=Ma(),r=t.firstChild,a=r.firstChild.firstChild,s=a.nextSibling.nextSibling;return Y(a,P(yi,{class:`h-6 w-6 text-slate-700`})),Y(s,P(Ea,{get ok(){return d()},get label(){return f()}})),Y(r,P(L,{get when(){return n()},get children(){var e=ja();return Y(e,P(qi,{class:`h-4 w-4 shrink-0`}),null),Y(e,n,null),e}}),null),Y(r,P(L,{get when(){return e()},children:e=>[(()=>{var t=Na(),n=t.firstChild.nextSibling.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling,a=i.firstChild,o=a.firstChild,s=a.nextSibling,c=i.nextSibling.firstChild,l=c.firstChild,u=c.nextSibling;return Y(r,()=>e().version),Y(a,P(Gr,{class:`h-3.5 w-3.5`}),o),Y(s,()=>e().data_dir),Y(c,P(Yr,{class:`h-3.5 w-3.5`}),l),Y(u,P(Ea,{get ok(){return e().deepl_available},get label(){return e().deepl_available?`configured`:`not configured`}})),t})(),(()=>{var t=Pa(),n=t.firstChild.nextSibling;return Y(n,P(I,{get each(){return Object.entries(e().models)},children:([e,t])=>{let n=Va[e]??{label:e,Icon:qn},r=n.Icon;return(()=>{var e=La(),i=e.firstChild,a=i.nextSibling,o=a.nextSibling;return Y(i,P(r,{class:`h-4 w-4`})),Y(a,()=>n.label),Y(o,()=>t.name),Y(e,P(L,{get when(){return t.enabled},get fallback(){return Ra()},get children(){return P(Ea,{get ok(){return t.ready},get label(){return t.ready?`ready`:`loading`}})}}),null),e})()}})),t})(),(()=>{var t=Ia(),n=t.firstChild.nextSibling.firstChild.nextSibling;return Y(n,P(I,{each:[{value:`auto`,label:`Auto`,desc:`DeepL if configured, else local`},{value:`local`,label:`Local`,desc:`Opus-MT (on-device)`},{value:`deepl`,label:`DeepL`,desc:`DeepL API`}],children:t=>{let n=()=>o()===t.value,r=()=>t.value===`deepl`&&!e().deepl_available;return(()=>{var e=Ba();return e.$$click=()=>p(t.value),Y(e,()=>t.label,null),Y(e,P(L,{get when(){return n()},get children(){return za()}}),null),l(a=>{var o=r()||i(),s=r()?`DeepL API key not configured`:t.desc,c=`rounded-lg border px-4 py-2 text-sm transition-colors ${n()?`border-violet-500 bg-violet-50 font-semibold text-violet-700`:`border-slate-200 bg-white text-slate-600 hover:border-slate-300 hover:bg-slate-50`} ${r()?`cursor-not-allowed opacity-40`:``}`;return o!==a.e&&(e.disabled=a.e=o),s!==a.t&&J(e,`title`,a.t=s),c!==a.a&&qe(e,a.a=c),a},{e:void 0,t:void 0,a:void 0}),e})()}}),null),Y(n,P(L,{get when(){return i()},get children(){var e=Fa(),t=e.firstChild;return Y(e,P(xr,{class:`h-3 w-3 animate-spin`}),t),e}}),null),t})()]}),null),t})()}var Oa,ka,Aa,ja,Ma,Na,Pa,Fa,Ia,La,Ra,za,Ba,Va,Ha=t((()=>{X(),G(),_a(),Oa=K(``),ka=K(``),Aa=K(``),ja=K(`

`),Ma=K(`

Server Status

ASP.NET Core · Manga-OCR · Opus-MT

`),Na=K(`
Server info
Version
Data dir
DeepL
`),Pa=K(`
Models
    `),Fa=K(` Saving…`),Ia=K(`
    Translation engine

    Default engine used when a request doesn't specify one. Takes effect immediately; no restart needed.

    `),La=K(`
  • `),Ra=K(`disabled`),za=K(`✓`),Ba=K(`