diff --git a/.ai/rules/general.md b/.ai/rules/general.md new file mode 100644 index 00000000..b2102565 --- /dev/null +++ b/.ai/rules/general.md @@ -0,0 +1,21 @@ +--- +paths: + - '**/*' +--- + +# General + +## Befehle direkt im Dev-Container ausführen +Die Arbeitsumgebung /var/www/html liegt bereits im DEV-Container. PHP-/Artisan-, Composer- und Node-Befehle dort direkt ausführen (z. B. php artisan test --compact), ohne vendor/bin/sail davor. Eine Sail-Meldung über nicht laufendes Docker ist in diesem Container kein Nachweis, dass Docker auf dem Host gestoppt ist. Diese ausdrückliche Benutzeranweisung ersetzt die allgemeine Sail-Prefix-Vorgabe für diese Umgebung. + +## Fremde oder frische Laravel-Projekte nie gegen die lokale Datenbank testen +Auf `global-mysql` liegen die Datenbanken mehrerer Projekte, und Container-Umgebungsvariablen haben in Laravel Vorrang vor `.env` und nicht erzwungenen `phpunit.xml`-Werten. Ein frisches Laravel-Projekt hat die SQLite-Zeilen in `phpunit.xml` nur auskommentiert — `RefreshDatabase` führt dann `migrate:fresh` auf der Datenbank aus, die die Umgebung vorgibt (07.10.2026: so wurde `pressekonto` vollständig geleert). Deshalb: +- Tests, `migrate`, `migrate:fresh`, `db:wipe` oder Seeder eines anderen bzw. frisch angelegten Laravel-Projekts in diesem Container nur mit `DB_CONNECTION=sqlite DB_DATABASE=:memory: DB_URL=` davor ausführen, z. B. `DB_CONNECTION=sqlite DB_DATABASE=:memory: DB_URL= php artisan test`. +- Vorher prüfen, dass `phpunit.xml` dort SQLite `:memory:` mit `force="true"` setzt (siehe `dev/git-deploy-monitoring/02-fehlerprotokoll-glitchtip.md`, „Testdatenbank absichern“). +- `php artisan migrate` in diesem Projekt erst nach `php artisan migrate:status`: Stehen unerwartet viele Migrationen aus, ist die Datenbank nicht die erwartete — anhalten und nachfragen. + +## Keine personenbezogenen Daten oder Schlüssel ins Repository +Datenbank-Dumps, Produktions-Logs, Postman-Collections, Adresslisten, `.env`-Inhalte und API-Schlüssel nie committen, auch nicht unter `dev/` oder im Archiv. Am 12.05.2026 wurden zwei Produktiv-Dumps committet; Enttracken half nicht, erst die Historienbereinigung vom 09.10.2026 hat sie entfernt (alle Hashes neu, Force-Push, Server-Abgleich). Deshalb: +- Vor jedem `git add` prüfen, ob neue Dateien solche Daten enthalten; im Zweifel nachfragen. Solche Arbeitsdateien gehören ins Scratchpad und werden nach Gebrauch gelöscht. +- Ist es doch passiert: nicht nur löschen, sondern Betreiber informieren und nach `dev/betrieb/git-deploy.md`, Abschnitt G vorgehen (zuerst Schlüssel rotieren). +- Die Historie nie ohne ausdrückliche Freigabe umschreiben oder force-pushen. diff --git a/.ai/rules/index.md b/.ai/rules/index.md new file mode 100644 index 00000000..f6afe6f7 --- /dev/null +++ b/.ai/rules/index.md @@ -0,0 +1,7 @@ +# Project Rules Index + +Before planning or editing, find the row whose globs match the file's path and read that rule file. + +| Applies to | Rule file | +| --- | --- | +| **/* | .ai/rules/general.md | diff --git a/.env.example b/.env.example index e5f3e016..bf459027 100644 --- a/.env.example +++ b/.env.example @@ -278,6 +278,14 @@ UMAMI_ENABLED=false # erst nach Ergänzung der Datenschutzerklärung einschalten. UMAMI_PORTAL_ENABLED=false UMAMI_IDENTIFY_USERS=false +# Nur lesender API-Zugang für Admin ▸ Reports ▸ Wachstum und `umami:report` +# (Umami-Benutzer mit der Rolle „View only“, Mitglied im Team mit den drei +# Websites). Ohne diese Werte zeigt die Seite die Umami-Kennzahlen als +# „nicht verbunden“. +UMAMI_API_URL= +UMAMI_API_USERNAME= +UMAMI_API_PASSWORD= +UMAMI_API_TEAM_ID= # Haupt-E-Mail für alle rechtlichen Anliegen (Impressum, Datenschutz, AGB, # Meldeverfahren, Richtlinien) — auf allen drei Domains identisch. @@ -346,3 +354,24 @@ IMAGE_PRECHECK=false IMAGE_PRECHECK_STAGE=1 # IMAGE_PRECHECK_MODEL= # IMAGE_PRECHECK_DOWNGRADE= + +# Proxy-Vertrauen: leer = keinem Proxy (Live, nginx direkt). Lokal ohne Angabe `*` (Traefik). +# Steht ein Proxy/CDN davor, dessen Adressbereiche kommagetrennt eintragen. +# TRUSTED_PROXIES= +# HSTS: ohne Angabe nur bei APP_ENV=production an, max-age 1 Jahr. +# SECURITY_HSTS= +# SECURITY_HSTS_MAX_AGE=31536000 +# CSP im Melde-Modus: ohne Angabe nur bei APP_ENV=production an, Meldungen in storage/logs/csp-*.log. +# SECURITY_CSP_REPORT_ONLY= + +# Spamschutz mit Cloudflare Turnstile (Kontakt-Widget, Registrierung). Ohne beide Keys aus. +# Lokal die Testkeys von Cloudflare verwenden (1x00000000000000000000AA / 1x0000000000000000000000000000000AA), +# die echten Keys sind an die Live-Hostnamen gebunden. Ist Cloudflare nicht erreichbar, +# wird durchgelassen und markiert; TURNSTILE_FAIL_OPEN=false lehnt stattdessen ab. +TURNSTILE_SITE_KEY= +TURNSTILE_SECRET_KEY= +# TURNSTILE_TIMEOUT=3 +# TURNSTILE_FAIL_OPEN=true +# Unbestätigte Bot-Registrierungen nach 14 Tagen löschen (users:prune-bot-registrations). +# Erst einschalten, nachdem der Probelauf auf Live geprüft ist. +# USERS_PRUNE_BOT_REGISTRATIONS=false diff --git a/.gitignore b/.gitignore index 6f55249b..f0a5d94a 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,8 @@ config/files/ # Produktions-Logs zur Auswertung (können personenbezogene Daten enthalten) /dev/**/*.log + +# Nachweise zum Anwaltspaket: Screenshots und Verträge nicht versionieren +# (Vertraulich, Kunden- und Organisationsnummern, Größe). Ablage lokal und im Paket. +/dev/rechtliches/nachweise/*.png +/dev/rechtliches/nachweise/*.pdf diff --git a/CLAUDE.md b/CLAUDE.md index c25a5836..d1db8b96 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -172,12 +172,24 @@ look at GlitchTip or at production errors, follow workflow and the privacy rules for error reporting. Monitoring decisions: `dev/betrieb/monitoring-plan.md`; deploys: `dev/betrieb/deploy-runbook.md`. +### Webanalyse (Umami) and growth figures + +Self-hosted Umami (`sys.adametz.media`, v3 API) is reachable read-only via +`UMAMI_API_*` in `.env` (view-only user, websites in the team „Presse +Reports“, IDs in `config/domains.php`; never print the credentials or the +token). Use `php artisan umami:report` for page views, referrers and +channels, and `php artisan growth:report` for the abort conditions of the +growth blocks (Roadmap 6.1, thresholds in `config/growth.php`) — the same +figures as Admin ▸ Reports ▸ Wachstum. The conversion funnel itself: +`php artisan conversion:funnel`. + ### Testing Framework - **Pest PHP** (v3.8+) - Modern testing framework built on PHPUnit - Configuration: `phpunit.xml` and `tests/Pest.php` - Test database: Uses `DB_DATABASE=testing` environment (configured in phpunit.xml) - Test directories: `tests/Feature/` (authentication, dashboard, settings) and `tests/Unit/` +- **Never run tests, migrations or seeders of another or freshly created Laravel project in this container against MySQL.** `global-mysql` holds several projects' databases and container env vars beat `.env`; a fresh project's `RefreshDatabase` wiped `pressekonto` on 07.10.2026. Prefix such runs with `DB_CONNECTION=sqlite DB_DATABASE=:memory: DB_URL=` and check `migrate:status` before `migrate` here (details: `.ai/rules/general.md`). ## Important Files & Configuration diff --git a/_docs/api/v1.yml b/_docs/api/v1.yml index 69f334cf..d40c0ec6 100644 --- a/_docs/api/v1.yml +++ b/_docs/api/v1.yml @@ -212,25 +212,12 @@ paths: /newsletter/subscribe: post: tags: [Newsletter] - summary: Subscribe an email address - description: Requires `newsletter:subscribe`. - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SubscribeNewsletterRequest' + deprecated: true + summary: Discontinued — newsletter subscription via the API + description: Discontinued on 2026-10-09. Responds with 410 and creates no subscription. responses: - '201': - description: Subscription created. - content: - application/json: - schema: - $ref: '#/components/schemas/NewsletterSubscriptionResponse' - '403': - $ref: '#/components/responses/Forbidden' - '422': - $ref: '#/components/responses/ValidationError' + '410': + description: Endpoint discontinued. components: securitySchemes: sanctumBearer: diff --git a/app/Actions/Fortify/UpdateUserPassword.php b/app/Actions/Fortify/UpdateUserPassword.php index 70056390..bd96bd4d 100644 --- a/app/Actions/Fortify/UpdateUserPassword.php +++ b/app/Actions/Fortify/UpdateUserPassword.php @@ -3,7 +3,7 @@ namespace App\Actions\Fortify; use App\Models\User; -use Illuminate\Support\Facades\Hash; +use App\Services\Auth\PasswordChanger; use Illuminate\Support\Facades\Validator; use Laravel\Fortify\Contracts\UpdatesUserPasswords; @@ -12,7 +12,10 @@ class UpdateUserPassword implements UpdatesUserPasswords use PasswordValidationRules; /** - * Validate and update the user's password. + * Validate and update the user's password. Die Fortify-Route dazu ist + * abgeschaltet (Sicherheitsaudit 07.10.2026, Entscheidung 4); die Action + * nutzt trotzdem den gemeinsamen PasswordChanger, falls sie wieder + * aktiviert wird. * * @param array $input */ @@ -25,8 +28,6 @@ class UpdateUserPassword implements UpdatesUserPasswords 'current_password.current_password' => __('The provided password does not match your current password.'), ])->validateWithBag('updatePassword'); - $user->forceFill([ - 'password' => Hash::make($input['password']), - ])->save(); + app(PasswordChanger::class)->change($user, $input['password'], request()->hasSession() ? request()->session() : null); } } diff --git a/app/Console/Commands/AuditAdmins.php b/app/Console/Commands/AuditAdmins.php new file mode 100644 index 00000000..a1b5b876 --- /dev/null +++ b/app/Console/Commands/AuditAdmins.php @@ -0,0 +1,151 @@ + */ + private const CUSTOMER_ROLES = ['customer', 'api-only']; + + protected $signature = 'audit:admins + {--with-emails : Vollständige E-Mail-Adressen statt nur der Domain ausgeben}'; + + protected $description = 'Listet alle Konten mit Admin-, Editor-, Super-Admin- oder Sonderrechten als Markdown (Nachweis BN-02).'; + + public function handle(): int + { + $users = $this->privilegedUsers(); + $now = now(); + + $this->line(sprintf('# Berechtigungen, Stand %s', $now->format('d.m.Y H:i'))); + $this->newLine(); + $this->line($this->summary($users, $now)); + $this->newLine(); + $this->line('| ID | E-Mail | Rollen | Super-Admin | Aktiv | Gelöscht | Admin-Zugang | TOTP | Passkeys | Letzte Anmeldung | API-Tokens | Sitzungen zuletzt widerrufen |'); + $this->line('|---|---|---|---|---|---|---|---|---|---|---|---|'); + + foreach ($users as $user) { + $this->line('| '.implode(' | ', $this->row($user)).' |'); + } + + if ($users->isEmpty()) { + $this->line('| – | – | – | – | – | – | – | – | – | – | – | – |'); + } + + $this->newLine(); + $this->line('Admin-Zugang = aktiv und Super-Admin oder Rolle `admin`/`editor` (`User::canAccessAdmin()`). Sitzungen liegen in Redis und sind je Konto nicht zählbar; ein Widerruf beendet alle älteren Sitzungen.'); + $this->newLine(); + $this->line('**Zugänge außerhalb der Anwendung** (Ploi, Hetzner-Konsole, SSH): [eintragen]'); + + return self::SUCCESS; + } + + /** + * @return Collection + */ + private function privilegedUsers(): Collection + { + return User::query() + ->withTrashed() + ->with(['roles:id,name', 'permissions:id,name']) + ->withCount(['passkeys', 'tokens']) + ->withMax('tokens', 'last_used_at') + ->where(fn (Builder $query) => $query + ->where('is_super_admin', true) + ->orWhereHas('roles', fn (Builder $roles) => $roles->whereNotIn('name', self::CUSTOMER_ROLES)) + ->orWhereHas('permissions')) + ->orderBy('id') + ->get(); + } + + /** + * @param Collection $users + */ + private function summary(Collection $users, Carbon $now): string + { + $withAccess = $users->filter(fn (User $user): bool => ! $user->trashed() && $user->canAccessAdmin()); + $withSecondFactor = $withAccess->filter(fn (User $user): bool => $this->hasSecondFactor($user)); + $editors = $withAccess->filter(fn (User $user): bool => $user->roles->contains('name', 'editor')); + $superAdmins = $withAccess->where('is_super_admin', true); + + return sprintf( + 'Stand %s: %d %s mit Zugang zum Admin-Bereich, davon %d mit zweitem Faktor (TOTP oder Passkey), %d Super-Admin, %d Editor-%s. Gelistet %s %d %s mit Rechten über den Kundenbereich hinaus, einschließlich gesperrter und gelöschter.', + $now->format('d.m.Y'), + $withAccess->count(), + $withAccess->count() === 1 ? 'Konto' : 'Konten', + $withSecondFactor->count(), + $superAdmins->count(), + $editors->count(), + $editors->count() === 1 ? 'Konto' : 'Konten', + $users->count() === 1 ? 'ist' : 'sind', + $users->count(), + $users->count() === 1 ? 'Konto' : 'Konten', + ); + } + + /** + * @return list + */ + private function row(User $user): array + { + $roles = $user->roles->pluck('name') + ->merge($user->permissions->pluck('name')->map(fn (string $name): string => 'direkt: '.$name)) + ->implode(', '); + $revokedAt = $user->sessions_revoked_at_ms + ? Carbon::createFromTimestampMs($user->sessions_revoked_at_ms)->timezone(config('app.timezone'))->format('d.m.Y H:i') + : '–'; + $tokenLastUsedAt = $user->getAttribute('tokens_max_last_used_at'); + $tokenLastUsed = $tokenLastUsedAt + ? ', zuletzt '.Carbon::parse($tokenLastUsedAt)->format('d.m.Y') + : ''; + + return [ + (string) $user->id, + $this->email($user), + $roles !== '' ? $roles : '–', + $user->is_super_admin ? 'ja' : 'nein', + $user->is_active ? 'ja' : 'gesperrt', + $user->trashed() ? $user->deleted_at->format('d.m.Y') : 'nein', + ! $user->trashed() && $user->canAccessAdmin() ? 'ja' : 'nein', + $user->two_factor_confirmed_at ? 'ja' : 'nein', + (string) $user->passkeys_count, + $user->last_login_at?->format('d.m.Y H:i') ?? '–', + $user->tokens_count.$tokenLastUsed, + $revokedAt, + ]; + } + + private function hasSecondFactor(User $user): bool + { + return $user->two_factor_confirmed_at !== null || $user->passkeys_count > 0; + } + + private function email(User $user): string + { + if ($this->option('with-emails')) { + return (string) $user->email; + } + + return '…@'.Str::after((string) $user->email, '@'); + } +} diff --git a/app/Console/Commands/BackfillChangelog.php b/app/Console/Commands/BackfillChangelog.php new file mode 100644 index 00000000..6f4ed3d2 --- /dev/null +++ b/app/Console/Commands/BackfillChangelog.php @@ -0,0 +1,54 @@ + $rows */ + $rows = require database_path('seeders/data/changelog-backfill.php'); + $created = 0; + + foreach ($rows as $row) { + $key = 'backfill:'.sha1($row['date'].'|'.$row['category'].'|'.$row['text']); + + if (ChangelogEntry::query()->where('source_key', $key)->exists()) { + continue; + } + + $created++; + + if ($this->option('dry-run')) { + continue; + } + + ChangelogEntry::query()->create([ + 'released_on' => $row['date'], + 'release_tag' => $row['tag'], + 'category' => ChangelogCategory::from($row['category']), + 'text' => $row['text'], + 'status' => ChangelogStatus::Draft, + 'source_key' => $key, + 'review_note' => 'Nachtrag aus Protokoll und Roadmap — Datum und Text prüfen.', + ]); + } + + $this->info(sprintf('%s%d von %d Einträgen nachgetragen (Entwurf). Freigabe im Admin ▸ Changelog.', $this->option('dry-run') ? '[Dry-Run] ' : '', $created, count($rows))); + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/CollectChangelog.php b/app/Console/Commands/CollectChangelog.php new file mode 100644 index 00000000..5493d64e --- /dev/null +++ b/app/Console/Commands/CollectChangelog.php @@ -0,0 +1,61 @@ +collect( + (string) $this->argument('from'), + (string) $this->argument('to'), + $this->option('date') !== null ? Carbon::parse((string) $this->option('date')) : null, + (bool) $this->option('dry-run'), + ); + } catch (Throwable $e) { + $this->error($e->getMessage()); + + return self::FAILURE; + } + + $this->info(sprintf( + '%s%d neue Entwürfe, %d schon vorhanden, %d Commits ohne Changelog-Zeile (intern).', + $this->option('dry-run') ? '[Dry-Run] ' : '', + $result['created'], + $result['existing'], + $result['internal'], + )); + + if ($result['entries'] !== []) { + $this->table( + ['Rubrik', 'Text', 'Hinweis'], + array_map(static fn ($entry): array => [ + $entry->category->label(), + $entry->text, + $entry->review_note ?? '', + ], $result['entries']), + ); + $this->line(' Freigabe im Admin ▸ Changelog.'); + } + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/PruneBotRegistrations.php b/app/Console/Commands/PruneBotRegistrations.php new file mode 100644 index 00000000..3a362c77 --- /dev/null +++ b/app/Console/Commands/PruneBotRegistrations.php @@ -0,0 +1,145 @@ +option('days') ?? config('auth.prune_bot_registrations.after_days', 14)); + + if ($days < 7) { + $this->error('Die Frist muss mindestens 7 Tage betragen.'); + + return self::FAILURE; + } + + $candidates = $this->candidates($days)->limit((int) $this->option('limit'))->get(); + + if ($candidates->isEmpty()) { + $this->info('Keine Bot-Registrierungen zu löschen.'); + + return self::SUCCESS; + } + + if ($this->option('dry-run')) { + $this->table( + ['ID', 'Angelegt', 'Name', 'E-Mail', 'Zufallsname'], + $candidates->map(fn (User $user): array => [ + $user->id, + $user->created_at?->format('d.m.Y H:i'), + Str::limit((string) $user->name, 30), + $this->maskEmail((string) $user->email), + GibberishDetector::isRandomPersonName((string) $user->name) ? 'ja' : '', + ])->all(), + ); + $this->info(sprintf( + 'Probelauf: %d Konten älter als %d Tage würden gelöscht, davon %d mit Zufallsnamen.', + $candidates->count(), + $days, + $candidates->filter(fn (User $user): bool => GibberishDetector::isRandomPersonName((string) $user->name))->count(), + )); + + return self::SUCCESS; + } + + $deleted = 0; + $failed = 0; + + foreach ($candidates as $user) { + try { + DB::transaction(fn () => $user->forceDelete()); + $deleted++; + } catch (\Throwable $exception) { + $failed++; + Log::channel('spam')->warning('Bot-Registrierung konnte nicht gelöscht werden.', [ + 'user_id' => $user->id, + 'error' => $exception->getMessage(), + ]); + } + } + + Log::channel('spam')->info('Bot-Registrierungen gelöscht.', ['deleted' => $deleted, 'failed' => $failed, 'days' => $days]); + $this->info("Bot-Registrierungen gelöscht: {$deleted}".($failed > 0 ? ", {$failed} fehlgeschlagen (siehe spam-Log)" : '').'.'); + + return $failed > 0 ? self::FAILURE : self::SUCCESS; + } + + /** + * @return Builder + */ + private function candidates(int $days): Builder + { + $query = User::query() + ->whereNull('legacy_id') + ->whereNull('email_verified_at') + ->whereNull('last_login_at') + ->whereNull('oauth_provider') + ->where('is_active', false) + ->where('is_super_admin', false) + ->where('created_at', '<', now()->subDays($days)) + ->whereDoesntHave('roles') + ->whereNotExists(fn (QueryBuilder $query) => $query + ->from('personal_access_tokens') + ->whereColumn('personal_access_tokens.tokenable_id', 'users.id') + ->where('personal_access_tokens.tokenable_type', (new User)->getMorphClass())); + + foreach (self::USAGE_TABLES as $table) { + $query->whereNotExists(fn (QueryBuilder $sub) => $sub + ->from($table) + ->whereColumn($table.'.user_id', 'users.id')); + } + + return $query->orderBy('id'); + } + + private function maskEmail(string $email): string + { + [$local, $domain] = array_pad(explode('@', $email, 2), 2, ''); + + return Str::substr($local, 0, 2).'***@'.$domain; + } +} diff --git a/app/Console/Commands/QuarantineContactSpam.php b/app/Console/Commands/QuarantineContactSpam.php new file mode 100644 index 00000000..76e595a4 --- /dev/null +++ b/app/Console/Commands/QuarantineContactSpam.php @@ -0,0 +1,60 @@ +open() + ->whereNull('user_id') + ->orderBy('id') + ->get() + ->map(fn (ContactMessage $message): array => [ + 'message' => $message, + // Ohne Zeitstempel: Der Altbestand hatte kein Formular-Feld dafür. + 'reason' => $filter->reasonFor((string) $message->name, (string) $message->message, null), + ]) + ->filter(fn (array $hit): bool => $hit['reason'] !== null); + + $this->table( + ['Vorgang', 'Eingang', 'Grund', 'Nachricht'], + $hits->map(fn (array $hit): array => [ + $hit['message']->reference(), + $hit['message']->created_at?->format('d.m.Y'), + $hit['reason'], + Str::limit(Str::squish((string) $hit['message']->message), 60), + ])->all(), + ); + + if ($this->option('dry-run')) { + $this->info("Probelauf: {$hits->count()} Anliegen würden als Spam markiert."); + + return self::SUCCESS; + } + + foreach ($hits as $hit) { + $hit['message']->markAsSpam(null, $hit['reason']); + } + + $this->info("{$hits->count()} Anliegen als Spam markiert. Offen bleiben: ".ContactMessage::query()->open()->count().'.'); + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/ReportGrowth.php b/app/Console/Commands/ReportGrowth.php new file mode 100644 index 00000000..56c2dd02 --- /dev/null +++ b/app/Console/Commands/ReportGrowth.php @@ -0,0 +1,74 @@ +build((bool) $this->option('fresh')); + + if ($this->option('json')) { + $this->line((string) json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); + + return self::SUCCESS; + } + + $period = $data['period']; + $this->info(sprintf( + 'Wachstum — Zeitraum %s bis %s, Zwischenblick %s, %d %% der Zeit vergangen', + $period['start']->format('d.m.Y'), + $period['end']->format('d.m.Y'), + $period['review']->format('d.m.Y'), + (int) round($period['elapsed_share'] * 100), + )); + + foreach ($data['blocks'] as $block) { + $this->newLine(); + $this->line("{$block['title']}"); + + $this->table( + ['Bedingung', 'Ist', 'Soll heute', 'Schwelle', 'Status'], + array_map(static fn (array $criterion): array => [ + $criterion['label'], + $criterion['actual'] ?? '–', + $criterion['expected'] ?? '–', + $criterion['threshold'], + GrowthReport::statusLabel($criterion['status']), + ], $block['criteria']), + ); + + foreach ($block['criteria'] as $criterion) { + if ($criterion['note'] !== null) { + $this->line(' '.$criterion['note']); + } + } + + $this->line(' '.$block['consequence']); + } + + if ($data['pages'] !== []) { + $this->newLine(); + $this->line('Transparenzseiten, letzte 30 Tage (Umami)'); + $this->table( + ['Portal', 'Seite', 'Aufrufe', 'aus der Suche'], + array_map(static fn (array $row): array => [$row['brand'], $row['page'], $row['views'], $row['search_views']], $data['pages']), + ); + } + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/ReportUmami.php b/app/Console/Commands/ReportUmami.php new file mode 100644 index 00000000..f5618265 --- /dev/null +++ b/app/Console/Commands/ReportUmami.php @@ -0,0 +1,103 @@ +isConfigured()) { + $this->error('Umami-API nicht konfiguriert: UMAMI_API_URL, UMAMI_API_USERNAME und UMAMI_API_PASSWORD setzen.'); + + return self::FAILURE; + } + + $metric = (string) $this->option('metric'); + + if (! in_array($metric, self::METRICS, true)) { + $this->error('Unbekannte Rangliste. Möglich: '.implode(', ', self::METRICS).'.'); + + return self::INVALID; + } + + $to = $this->option('to') !== null ? Carbon::parse((string) $this->option('to'))->endOfDay() : Carbon::now(); + $from = $this->option('from') !== null ? Carbon::parse((string) $this->option('from'))->startOfDay() : $to->copy()->subDays(30); + $sites = (array) $this->option('site') ?: UmamiClient::BRANDS; + $filters = filled($this->option('path')) ? ['path' => 'c.'.$this->option('path')] : []; + $limit = max(1, min(500, (int) $this->option('limit'))); + + $result = []; + + try { + foreach ($sites as $site) { + $websiteId = $umami->websiteId((string) $site); + + if ($websiteId === null) { + $this->warn("Keine Umami-Website für „{$site}“ in config/domains.php."); + + continue; + } + + $result[$site] = [ + 'stats' => $umami->stats($websiteId, $from, $to, $filters), + $metric => $umami->metrics($websiteId, $metric, $from, $to, $filters, $limit), + ]; + } + } catch (UmamiUnavailable $e) { + $this->error($e->getMessage()); + + return self::FAILURE; + } + + if ($this->option('json')) { + $this->line((string) json_encode([ + 'from' => $from->toIso8601String(), + 'to' => $to->toIso8601String(), + 'filters' => $filters, + 'sites' => $result, + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); + + return self::SUCCESS; + } + + $this->info(sprintf('Umami — %s bis %s%s', $from->format('d.m.Y'), $to->format('d.m.Y'), $filters === [] ? '' : ', Pfad enthält „'.$this->option('path').'“')); + + foreach ($result as $site => $data) { + $this->newLine(); + $this->line("{$site}"); + $this->table( + ['Aufrufe', 'Besucher', 'Besuche', 'Absprünge'], + [[$data['stats']['pageviews'], $data['stats']['visitors'], $data['stats']['visits'], $data['stats']['bounces']]], + ); + $this->table( + [ucfirst($metric), 'Anzahl'], + array_map(static fn (array $row): array => [$row['x'], $row['y']], $data[$metric]), + ); + } + + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/ResyncAutomaticMemberships.php b/app/Console/Commands/ResyncAutomaticMemberships.php new file mode 100644 index 00000000..4b894030 --- /dev/null +++ b/app/Console/Commands/ResyncAutomaticMemberships.php @@ -0,0 +1,107 @@ +countAutomaticGrants(); + + $userIds = DB::table('company_user') + ->whereIn('granted_via', ['auto', 'auto-upgrade']) + ->when($this->option('user'), fn ($query, $userId) => $query->where('user_id', (int) $userId)) + ->distinct() + ->pluck('user_id'); + + if ($userIds->isEmpty()) { + $this->info('Keine automatisch vergebenen Firmenrechte gefunden — nichts zu tun.'); + + return self::SUCCESS; + } + + DB::beginTransaction(); + + try { + $bar = $this->output->createProgressBar($userIds->count()); + + foreach ($userIds->chunk(200) as $chunk) { + User::query()->whereIn('id', $chunk->all())->get()->each(function (User $user) use ($contactAccess, $bar): void { + $contactAccess->syncMembershipsForEmail($user); + $bar->advance(); + }); + } + + $bar->finish(); + $this->newLine(); + + $after = $this->countAutomaticGrants(); + $revoked = max(0, $before - $after); + $summary = "Abgeglichen: {$userIds->count()} User. Automatische Rechte vorher {$before}, nachher {$after}."; + + if ($this->option('dry-run')) { + DB::rollBack(); + $this->info($summary.' Probelauf — nichts gespeichert.'); + + return self::SUCCESS; + } + + $limit = max(self::MAX_REVOKE_ABSOLUTE, (int) ceil($before * self::MAX_REVOKE_SHARE)); + + if ($revoked > $limit && ! $this->option('force')) { + DB::rollBack(); + $this->error($summary." Es würden {$revoked} Rechte wegfallen (Grenze {$limit}) — zurückgerollt. Ursache prüfen, nur bei Absicht mit --force wiederholen."); + + return self::FAILURE; + } + + DB::commit(); + $this->info($summary); + + return self::SUCCESS; + } catch (\Throwable $e) { + DB::rollBack(); + + throw $e; + } + } + + private function countAutomaticGrants(): int + { + return DB::table('company_user') + ->where('role', 'responsible') + ->whereIn('granted_via', ['auto', 'auto-upgrade']) + ->count(); + } +} diff --git a/app/Console/Commands/SettleUnpaidLegacyInvoices.php b/app/Console/Commands/SettleUnpaidLegacyInvoices.php index 25875513..ed4d9238 100644 --- a/app/Console/Commands/SettleUnpaidLegacyInvoices.php +++ b/app/Console/Commands/SettleUnpaidLegacyInvoices.php @@ -20,7 +20,7 @@ use Illuminate\Support\Facades\Storage; /** * Bereinigt die Altlast aus unbezahlten Legacy-Rechnungen (Einordnung - * 16.09.2026, dev/lagacy-rechnungen/entwicklungsplan-2026-09-16.md, Phase B). + * 16.09.2026, dev/archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md, Phase B). * * `legacy:grandfather-subscriptions` hat Bestandsschutz-Posten auch aus * Rechnungen abgeleitet, die nie bezahlt wurden. Dieser Befehl löst das diff --git a/app/Enums/ActivityType.php b/app/Enums/ActivityType.php index 2cdb356e..cf33a157 100644 --- a/app/Enums/ActivityType.php +++ b/app/Enums/ActivityType.php @@ -44,6 +44,12 @@ enum ActivityType: string case TwoFactorFailed = 'two_factor_failed'; + /** Cloudflare Turnstile war nicht erreichbar — Formular durchgelassen, bitte nachprüfen (Spamschutz). */ + case BotCheckUnavailable = 'bot_check_unavailable'; + + /** Admin hat eine gebuchte Platzierung vorzeitig beendet. */ + case BoostEnded = 'boost_ended'; + public function label(): string { return match ($this) { @@ -73,6 +79,8 @@ enum ActivityType: string self::LoginFailed => 'Anmeldung fehlgeschlagen', self::LoginLockout => 'Anmeldesperre', self::TwoFactorFailed => '2FA fehlgeschlagen', + self::BotCheckUnavailable => 'Ohne Bot-Prüfung', + self::BoostEnded => 'Boost beendet', }; } @@ -102,6 +110,8 @@ enum ActivityType: string self::ManualInvoice => 'amber', self::LoginFailed, self::TwoFactorFailed => 'orange', self::LoginLockout => 'red', + self::BotCheckUnavailable => 'orange', + self::BoostEnded => 'amber', }; } } diff --git a/app/Enums/BotCheckStatus.php b/app/Enums/BotCheckStatus.php new file mode 100644 index 00000000..507262fd --- /dev/null +++ b/app/Enums/BotCheckStatus.php @@ -0,0 +1,27 @@ + 'Neu', + self::Improved => 'Verbessert', + self::Fixed => 'Behoben', + self::Security => 'Sicherheit', + }; + } + + /** + * Reihenfolge innerhalb eines Tages. + */ + public function order(): int + { + return match ($this) { + self::New => 1, + self::Improved => 2, + self::Fixed => 3, + self::Security => 4, + }; + } + + /** + * Wert aus der Commit-Zeile `Changelog: …` — Groß-/Kleinschreibung egal. + */ + public static function fromTrailer(string $value): ?self + { + return self::tryFrom(mb_strtolower(trim($value))); + } +} diff --git a/app/Enums/ChangelogStatus.php b/app/Enums/ChangelogStatus.php new file mode 100644 index 00000000..c8ad1d8e --- /dev/null +++ b/app/Enums/ChangelogStatus.php @@ -0,0 +1,28 @@ + 'Entwurf', + self::Published => 'Freigegeben', + self::Discarded => 'Verworfen', + }; + } + + public function badgeColor(): string + { + return match ($this) { + self::Draft => 'amber', + self::Published => 'green', + self::Discarded => 'zinc', + }; + } +} diff --git a/app/Enums/ContactMessageStatus.php b/app/Enums/ContactMessageStatus.php index 61f47949..e646a3a7 100644 --- a/app/Enums/ContactMessageStatus.php +++ b/app/Enums/ContactMessageStatus.php @@ -9,6 +9,9 @@ enum ContactMessageStatus: string case Resolved = 'resolved'; case Rejected = 'rejected'; + /** Quarantäne des Spamschutzes: keine Mail, nicht im Zähler, nach 30 Tagen gelöscht. */ + case Spam = 'spam'; + public function label(): string { return match ($this) { @@ -16,6 +19,7 @@ enum ContactMessageStatus: string self::InProgress => 'In Bearbeitung', self::Resolved => 'Erledigt', self::Rejected => 'Abgelehnt', + self::Spam => 'Spam', }; } diff --git a/app/Enums/ConversionEventType.php b/app/Enums/ConversionEventType.php index 8b549206..0f2505ff 100644 --- a/app/Enums/ConversionEventType.php +++ b/app/Enums/ConversionEventType.php @@ -12,11 +12,21 @@ namespace App\Enums; * Die Wiedereinreichung nach Ablehnung gehört ausdrücklich NICHT hierher. Sie * misst etwas anderes, nämlich ob die Infoseite (1d) wirkt, und wird gegen den * Basiswert aus 0.2 separat geführt (`press-releases:rejection-rate`). + * + * Stufen 2 und 3 seit 13.10.2026 (Roadmap 6.16): Vorher sprang die Leiter vom + * Klick auf IRGENDEINEN Mail-Link direkt zur Einlösung. Ob jemand die + * Verwaltungsseite überhaupt geöffnet und den Link angefordert hatte, war + * nicht zu sehen — und damit nicht, ob es am Hinweis, an der Seite oder an + * der Zustellung hakt. */ enum ConversionEventType: string { case MailLinkClicked = 'mail_link_clicked'; + case ManagePageOpened = 'manage_page_opened'; + + case AccessRequested = 'access_requested'; + case MagicLinkConsumed = 'magic_link_consumed'; case NewsroomEdited = 'newsroom_edited'; @@ -32,10 +42,12 @@ enum ConversionEventType: string { return match ($this) { self::MailLinkClicked => 1, - self::MagicLinkConsumed => 2, - self::NewsroomEdited => 3, - self::AccountCreated => 4, - self::FirstBooking => 5, + self::ManagePageOpened => 2, + self::AccessRequested => 3, + self::MagicLinkConsumed => 4, + self::NewsroomEdited => 5, + self::AccountCreated => 6, + self::FirstBooking => 7, }; } @@ -43,6 +55,8 @@ enum ConversionEventType: string { return match ($this) { self::MailLinkClicked => 'Mail-Link geklickt', + self::ManagePageOpened => 'Verwaltungsseite geöffnet', + self::AccessRequested => 'Anmeldelink angefordert', self::MagicLinkConsumed => 'Magic Link eingelöst', self::NewsroomEdited => 'Newsroom bearbeitet', self::AccountCreated => 'Konto angelegt', @@ -58,7 +72,9 @@ enum ConversionEventType: string { return match ($this) { self::MailLinkClicked => 'Betreff oder Anlass trägt nicht', - self::MagicLinkConsumed => 'Der Verwaltungszugang wird nicht verstanden', + self::ManagePageOpened => 'Der Hinweis auf die Verwaltung wird übersehen', + self::AccessRequested => 'Der Verwaltungszugang wird nicht verstanden', + self::MagicLinkConsumed => 'Der Link kommt nicht an oder wird nicht geöffnet', self::NewsroomEdited => 'Kein Anreiz, das Profil zu pflegen', self::AccountCreated => 'Der Nutzen des Kontos ist nicht erkennbar', self::FirstBooking => 'Preis oder Angebot passt nicht', diff --git a/app/Enums/SecurityChange.php b/app/Enums/SecurityChange.php new file mode 100644 index 00000000..5f4ef6bf --- /dev/null +++ b/app/Enums/SecurityChange.php @@ -0,0 +1,51 @@ + 'Ihr Passwort wurde geändert.', + self::PasswordReset => 'Ihr Passwort wurde über „Passwort vergessen“ neu gesetzt.', + self::EmailChanged => 'Die Login-Adresse Ihres Kontos wurde geändert.', + self::TwoFactorEnabled => 'Die Zwei-Faktor-Authentifizierung wurde aktiviert.', + self::TwoFactorDisabled => 'Die Zwei-Faktor-Authentifizierung wurde deaktiviert.', + self::GoogleLinked => 'Ein Google-Konto wurde mit Ihrem Konto verknüpft.', + self::PasskeyAdded => 'Ein neuer Passkey wurde zu Ihrem Konto hinzugefügt.', + self::PasskeyRemoved => 'Ein Passkey wurde aus Ihrem Konto entfernt.', + self::SecondFactorsReset => 'Ein Administrator hat Ihre Passkeys und Ihre Zwei-Faktor-Authentifizierung zurückgesetzt.', + }; + } + + /** + * Ob andere angemeldete Geräte dabei abgemeldet wurden. + */ + public function endsOtherSessions(): bool + { + return in_array($this, [self::PasswordChanged, self::PasswordReset], true); + } +} diff --git a/app/Http/Controllers/Api/V1/NewsletterSubscriptionController.php b/app/Http/Controllers/Api/V1/NewsletterSubscriptionController.php index 92e58ed0..c56892fb 100644 --- a/app/Http/Controllers/Api/V1/NewsletterSubscriptionController.php +++ b/app/Http/Controllers/Api/V1/NewsletterSubscriptionController.php @@ -3,78 +3,21 @@ namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; -use App\Http\Requests\Api\V1\SubscribeNewsletterRequest; -use App\Models\NewsletterSubscription; use Illuminate\Http\JsonResponse; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Str; +/** + * Newsletter-Anmeldung über die API — abgeschaltet am 09.10.2026 + * (Roadmap 4.3). Der Endpunkt legte Abos ohne Bestätigungsweg an, obwohl die + * Spezifikation ein Double-Opt-in versprach, und wurde seit dem Go-Live nicht + * genutzt. Eine Anmeldung mit Double-Opt-in kommt mit dem Branchen-Digest + * (Roadmap 6.4); bis dahin antwortet die Route mit 410. + */ class NewsletterSubscriptionController extends Controller { - public function store(SubscribeNewsletterRequest $request): JsonResponse + public function store(): JsonResponse { - $validated = $request->validated(); - - $email = mb_strtolower($validated['email']); - - $subscription = DB::transaction(function () use ($request, $validated, $email): NewsletterSubscription { - $subscription = NewsletterSubscription::withoutGlobalScopes() - ->where('portal', $validated['portal']) - ->where('email', $email) - ->lockForUpdate() - ->first(); - - // Nur ein fremder, tatsächlich gesetzter Eigentümer blockiert (409). - // Verwaiste Datensätze (user_id NULL nach Konto-Löschung/Legacy-Import) - // dürfen neu gebunden werden — sonst wäre die portal+email-Kombination - // dauerhaft nicht mehr abonnierbar. - if ($subscription !== null && $subscription->user_id !== null && $subscription->user_id !== $request->user()->id) { - abort(409, 'This email address is already subscribed.'); - } - - if ($subscription === null) { - return NewsletterSubscription::withoutGlobalScopes()->create([ - 'portal' => $validated['portal'], - 'email' => $email, - 'user_id' => $request->user()->id, - 'salutation_key' => $validated['salutation_key'] ?? null, - 'first_name' => $validated['first_name'] ?? null, - 'last_name' => $validated['last_name'] ?? null, - 'ip_address' => $request->ip(), - 'is_confirmed' => false, - 'confirmation_token' => Str::random(32), - 'subscribed_at' => now(), - 'unsubscribed_at' => null, - ]); - } - - $attributes = [ - 'user_id' => $request->user()->id, - 'salutation_key' => $validated['salutation_key'] ?? null, - 'first_name' => $validated['first_name'] ?? null, - 'last_name' => $validated['last_name'] ?? null, - 'ip_address' => $request->ip(), - 'subscribed_at' => now(), - 'unsubscribed_at' => null, - ]; - - if (! $subscription->is_confirmed) { - $attributes['confirmation_token'] = Str::random(32); - } - - $subscription->update($attributes); - - return $subscription; - }); - return response()->json([ - 'message' => 'Newsletter subscription created.', - 'data' => [ - 'id' => $subscription->id, - 'portal' => $subscription->portal->value, - 'email' => $subscription->email, - 'is_confirmed' => $subscription->is_confirmed, - ], - ], 201); + 'message' => 'Newsletter subscription via the API has been discontinued.', + ], 410); } } diff --git a/app/Http/Controllers/Auth/ConfirmEmailChangeController.php b/app/Http/Controllers/Auth/ConfirmEmailChangeController.php index 5b7b693f..487ea586 100644 --- a/app/Http/Controllers/Auth/ConfirmEmailChangeController.php +++ b/app/Http/Controllers/Auth/ConfirmEmailChangeController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers\Auth; +use App\Enums\SecurityChange; use App\Http\Controllers\Controller; use App\Models\User; use App\Services\Auth\ContactAccessService; +use App\Services\Auth\SecurityNotifier; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -15,7 +17,7 @@ class ConfirmEmailChangeController extends Controller * signierten Link aus der Mail an die NEUE Adresse geklickt hat. * Bis dahin bleibt die alte Adresse aktiv (kein Aussperren bei Tippfehlern). */ - public function __invoke(Request $request, User $user, string $hash, ContactAccessService $contactAccess): RedirectResponse + public function __invoke(Request $request, User $user, string $hash, ContactAccessService $contactAccess, SecurityNotifier $notifier): RedirectResponse { abort_unless($request->user()->is($user), 403); @@ -34,6 +36,8 @@ class ConfirmEmailChangeController extends Controller ->with('security-error', __('Die neue E-Mail-Adresse wird inzwischen von einem anderen Konto verwendet. Die Änderung wurde verworfen.')); } + $previousEmail = (string) $user->email; + $user->forceFill([ 'email' => $user->pending_email, 'email_verified_at' => now(), @@ -45,6 +49,11 @@ class ConfirmEmailChangeController extends Controller // vergeben – nicht erst beim nächsten Login. $contactAccess->syncMembershipsForEmail($user); + // Die bisherige Adresse erfährt von der Änderung (Sicherheitsaudit + // 07.10.2026, S-06) — sonst bliebe eine Übernahme per fremder Session + // für den Inhaber unsichtbar. + $notifier->notify($user, SecurityChange::EmailChanged, recipient: $previousEmail, newEmail: (string) $user->email); + return redirect()->route('me.security') ->with('security-status', __('Ihre E-Mail-Adresse wurde erfolgreich geändert.')); } diff --git a/app/Http/Controllers/Auth/GoogleController.php b/app/Http/Controllers/Auth/GoogleController.php index f2df20c3..2544cab6 100644 --- a/app/Http/Controllers/Auth/GoogleController.php +++ b/app/Http/Controllers/Auth/GoogleController.php @@ -3,17 +3,24 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\Models\User; use App\Services\Auth\LoginCompletion; +use App\Services\Auth\SocialAccountLinker; use App\Services\Auth\SocialAuthService; +use App\Services\Auth\SocialLoginResult; use App\Support\LoginRedirect; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; +use Laravel\Socialite\AbstractUser; use Laravel\Socialite\Facades\Socialite; /** * Google-Login (WS-6). Erst-Login legt – de-dupliziert über die E-Mail – einen - * aktiven, verifizierten customer-Account an; bestehende Accounts werden nur - * verknüpft. Deaktivierte Accounts werden nicht reaktiviert. + * aktiven, verifizierten customer-Account an; bestehende Accounts werden + * verknüpft, bei Adressen außerhalb von Googles Zuständigkeit erst nach + * Bestätigung per E-Mail (Sicherheitsaudit 07.10.2026, S-05). Deaktivierte + * Accounts werden nicht reaktiviert. */ class GoogleController extends Controller { @@ -22,29 +29,72 @@ class GoogleController extends Controller return Socialite::driver('google')->redirect(); } - public function callback(Request $request, SocialAuthService $social, LoginCompletion $completion): RedirectResponse + public function callback(Request $request, SocialAuthService $social, SocialAccountLinker $linker, LoginCompletion $completion): RedirectResponse { try { $googleUser = Socialite::driver('google')->user(); } catch (\Throwable) { - return redirect()->route('login')->withErrors([ - 'email' => __('Die Anmeldung mit Google ist fehlgeschlagen. Bitte versuchen Sie es erneut.'), - ]); + return $this->failed(__('Die Anmeldung mit Google ist fehlgeschlagen. Bitte versuchen Sie es erneut.')); } - $user = $social->resolveUser( + $raw = $googleUser instanceof AbstractUser ? $googleUser->getRaw() : []; + $providerId = (string) $googleUser->getId(); + + $result = $social->resolve( 'google', - (string) $googleUser->getId(), + $providerId, $googleUser->getEmail(), $googleUser->getName(), + emailVerified: filter_var($raw['email_verified'] ?? false, FILTER_VALIDATE_BOOLEAN), + hostedDomain: isset($raw['hd']) ? (string) $raw['hd'] : null, ); - if (! $user || ! $user->is_active) { - return redirect()->route('login')->withErrors([ - 'email' => __('Ihr Konto ist nicht aktiv. Bitte wenden Sie sich an den Support.'), - ]); + if ($result->outcome === SocialLoginResult::UNVERIFIED_EMAIL) { + return $this->failed(__('Google hat keine bestätigte E-Mail-Adresse übermittelt. Bitte melden Sie sich per E-Mail-Link an.')); } + if ($result->outcome === SocialLoginResult::PROVIDER_MISMATCH) { + Log::warning('google-login.provider-mismatch', ['user_id' => $result->user?->getKey()]); + + return $this->failed(__('Ihr Konto ist bereits mit einem anderen Google-Konto verknüpft. Bitte melden Sie sich per E-Mail-Link an.')); + } + + $user = $result->user; + + if (! $user || ! $user->is_active) { + return $this->failed(__('Ihr Konto ist nicht aktiv. Bitte wenden Sie sich an den Support.')); + } + + if ($result->outcome === SocialLoginResult::CONFIRM_LINK) { + if (! $linker->requestConfirmation($user, 'google', $providerId)) { + return $this->failed(__('Zu viele Anfragen. Bitte warten Sie einige Minuten und versuchen Sie es erneut.')); + } + + return redirect()->route('login')->with('status', __('Für Ihr bestehendes Konto ist eine einmalige Bestätigung nötig: Wir haben Ihnen einen Link an Ihre E-Mail-Adresse geschickt. Bitte öffnen Sie ihn in diesem Browser.')); + } + + return $this->completeLogin($request, $user, $completion); + } + + /** + * Bestätigungslink aus der Mail (SocialAccountLinker): verknüpft und + * meldet an — nur in der Browser-Session, die den Google-Login begonnen hat. + */ + public function confirmLink(Request $request, User $user, SocialAccountLinker $linker, LoginCompletion $completion): RedirectResponse + { + if (! $linker->confirm($user, (string) $request->query('provider_id', ''))) { + return $this->failed(__('Der Bestätigungslink ist ungültig oder abgelaufen. Bitte öffnen Sie ihn im selben Browser, in dem Sie die Anmeldung mit Google gestartet haben, oder starten Sie die Anmeldung erneut.')); + } + + if (! $user->is_active) { + return $this->failed(__('Ihr Konto ist nicht aktiv. Bitte wenden Sie sich an den Support.')); + } + + return $this->completeLogin($request, $user, $completion); + } + + private function completeLogin(Request $request, User $user, LoginCompletion $completion): RedirectResponse + { // 2FA aktiv: wie Passwort- und Magic-Link-Login nicht direkt einloggen, // sondern in Fortifys Challenge übergeben (Audit F02). Google belegt // den Besitz des Postfachs, nicht den zweiten Faktor. @@ -65,4 +115,9 @@ class GoogleController extends Controller LoginRedirect::homeFor($user), )); } + + private function failed(string $message): RedirectResponse + { + return redirect()->route('login')->withErrors(['email' => $message]); + } } diff --git a/app/Http/Controllers/Auth/MagicLinkConsumeController.php b/app/Http/Controllers/Auth/MagicLinkConsumeController.php index 24df8dad..4bb74ef2 100644 --- a/app/Http/Controllers/Auth/MagicLinkConsumeController.php +++ b/app/Http/Controllers/Auth/MagicLinkConsumeController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers\Auth; -use App\Enums\ConversionEventType; use App\Http\Controllers\Controller; use App\Models\MagicLink; use App\Models\PressRelease; @@ -75,13 +74,10 @@ class MagicLinkConsumeController extends Controller return redirect()->route('login')->with('status', __('The magic login link has expired or was already used.')); } - // Stufe 2 der Konversionsleiter. Die Herkunft kommt vom Token, nicht + // Stufe 4 der Konversionsleiter. Die Herkunft kommt vom Token, nicht // aus der Session — die ist beim Weg über Mail und Domainwechsel // längst gerissen (Roadmap 0.4). - $this->recorder->record( - ConversionEventType::MagicLinkConsumed, - $this->recorder->sourceOf($magicLink), - ); + $this->recorder->recordMagicLinkConsumed($magicLink); $user = $magicLink->user; @@ -123,10 +119,7 @@ class MagicLinkConsumeController extends Controller ]); if ($claimed > 0) { - $this->recorder->record( - ConversionEventType::MagicLinkConsumed, - $this->recorder->sourceOf($magicLink), - ); + $this->recorder->recordMagicLinkConsumed($magicLink); } } diff --git a/app/Http/Controllers/CspReportController.php b/app/Http/Controllers/CspReportController.php new file mode 100644 index 00000000..8d3cf253 --- /dev/null +++ b/app/Http/Controllers/CspReportController.php @@ -0,0 +1,65 @@ +getContent(); + + if (! config('security.csp.report_only') || $body === '' || strlen($body) > self::MAX_BYTES) { + return response()->noContent(); + } + + $report = json_decode($body, true)['csp-report'] ?? null; + + if (! is_array($report)) { + return response()->noContent(); + } + + $entry = [ + 'directive' => mb_substr((string) ($report['effective-directive'] ?? $report['violated-directive'] ?? ''), 0, 60), + 'blocked' => $this->scrub($report['blocked-uri'] ?? ''), + 'document' => $this->scrub($report['document-uri'] ?? ''), + 'source' => $this->scrub($report['source-file'] ?? ''), + 'line' => (int) ($report['line-number'] ?? 0), + 'sample' => mb_substr((string) ($report['script-sample'] ?? ''), 0, 40), + ]; + + if (Cache::add('csp-report.'.sha1(json_encode($entry)), true, now()->addHour())) { + Log::channel('csp')->warning('CSP-Verstoß (nur gemeldet)', $entry); + } + + return response()->noContent(); + } + + private function scrub(mixed $value): string + { + $value = mb_substr(is_string($value) ? $value : '', 0, 500); + $parts = parse_url($value); + + // Schlüsselwörter wie „inline“, „eval“, „data“ unverändert. + if (! is_array($parts) || empty($parts['host'])) { + return mb_substr(strtok($value, '?#') ?: '', 0, 60); + } + + $path = preg_replace('#/[A-Za-z0-9_-]{32,}(?=/|$)#', '/[Filtered]', $parts['path'] ?? ''); + + return mb_substr(($parts['scheme'] ?? 'https').'://'.$parts['host'].$path, 0, 200); + } +} diff --git a/app/Http/Controllers/Web/ChangelogController.php b/app/Http/Controllers/Web/ChangelogController.php new file mode 100644 index 00000000..07c4dbc6 --- /dev/null +++ b/app/Http/Controllers/Web/ChangelogController.php @@ -0,0 +1,81 @@ +onHub($request)) { + return redirect($this->hubBase().'/changelog', 301); + } + + DomainAssetContext::applyWebDomainConfig('pressekonto'); + + return view('web.changelog', [ + 'entries' => $this->timeline->entries(), + 'feedUrl' => $this->hubBase().'/changelog/feed', + ]); + } + + public function feed(Request $request): Response|RedirectResponse + { + if (! $this->onHub($request)) { + return redirect($this->hubBase().'/changelog/feed', 301); + } + + $base = $this->hubBase(); + $entries = $this->timeline->entries(50); + + $items = $entries->map(fn (ChangelogEntry $entry): array => [ + 'title' => $entry->category->label().': '.Str::limit($entry->publicText(), 90), + 'link' => $base.'/changelog#eintrag-'.$entry->id, + 'published_at' => $entry->released_on->copy()->setTime(12, 0)->toRfc2822String(), + 'description' => $entry->publicText(), + 'category' => $entry->category->label(), + 'creator' => null, + ])->all(); + + $xml = view('web.feed', [ + 'channel' => [ + 'title' => 'pressekonto – Changelog', + 'link' => $base.'/changelog', + 'self' => $base.'/changelog/feed', + 'description' => 'Neuerungen auf pressekonto, presseecho und businessportal24.', + 'language' => 'de', + 'last_build' => ($entries->first()?->released_on?->copy()->setTime(12, 0) ?? Carbon::now())->toRfc2822String(), + ], + 'items' => $items, + ])->render(); + + return response($xml, 200, ['Content-Type' => 'application/rss+xml; charset=UTF-8']); + } + + private function onHub(Request $request): bool + { + return str_contains($request->getHost(), 'pressekonto'); + } + + private function hubBase(): string + { + return rtrim((string) config('domains.domain_portal_url'), '/'); + } +} diff --git a/app/Http/Controllers/Web/ContactController.php b/app/Http/Controllers/Web/ContactController.php index 1bf3f243..c8fc9bc8 100644 --- a/app/Http/Controllers/Web/ContactController.php +++ b/app/Http/Controllers/Web/ContactController.php @@ -2,14 +2,21 @@ namespace App\Http\Controllers\Web; +use App\Enums\ActivityType; +use App\Enums\BotCheckStatus; +use App\Enums\ContactMessageStatus; use App\Enums\ContactMessageTopic; use App\Http\Controllers\Controller; -use App\Mail\ContactRequestSubmitted; use App\Models\ContactMessage; +use App\Services\ActivityLog; +use App\Services\Spam\ContactSpamFilter; +use App\Services\Spam\SpamLog; +use App\Services\Spam\TurnstileVerifier; +use App\Services\Web\ContactMessageNotifier; use App\Support\WebPortalContext; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\RateLimiter; use Illuminate\Validation\Rule; use Illuminate\Validation\ValidationException; @@ -20,9 +27,21 @@ use Illuminate\Validation\ValidationException; * (contact_messages) und versendet zusätzlich eine Mail an die Brand- * Kontaktadresse (config domains.*.brand.contact_email, Fallback: * Absenderadresse der Anwendung). + * + * Spamschutz (dev/sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md): + * Cloudflare Turnstile für Gäste, danach Inhaltsfilter. Treffer des Filters + * landen in der Quarantäne (Status Spam, keine Mail); war Cloudflare nicht + * erreichbar, wird angenommen und im Verlauf markiert. */ class ContactController extends Controller { + public function __construct( + private readonly TurnstileVerifier $turnstile, + private readonly ContactSpamFilter $spamFilter, + private readonly ContactMessageNotifier $notifier, + private readonly ActivityLog $activityLog, + ) {} + public function __invoke(Request $request): RedirectResponse { // Bot: ein ausgefülltes Honeypot-Feld → still und neutral abnicken, @@ -53,27 +72,66 @@ class ContactController extends Controller $this->ensureNotRateLimited($request); RateLimiter::hit($this->throttleKey($request), 3600); + // Bestätigte Kunden sind keine Bots. Unbestätigte Konten (dort + // landen die Bot-Registrierungen) prüfen wir wie Gäste. + $trusted = $request->user()?->hasVerifiedEmail() === true; + + $botCheck = $trusted ? null : $this->turnstile->verifyRequest($request, 'contact'); + + if ($botCheck?->blocks()) { + throw ValidationException::withMessages([ + 'turnstile' => __('web.launcher.bot_check_failed'), + ]); + } + + $spamReason = $trusted ? null : $this->spamFilter->reasonFor( + $validated['name'], + $validated['message'], + $request->string(ContactSpamFilter::STARTED_FIELD)->toString(), + ); + $topic = ContactMessageTopic::tryFrom($validated['topic'] ?? '') ?? ContactMessageTopic::Contact; - ContactMessage::create([ + $message = ContactMessage::create([ 'portal' => $this->portal($request), 'topic' => $topic, + 'status' => $spamReason !== null ? ContactMessageStatus::Spam : ContactMessageStatus::Open, 'name' => $validated['name'], 'email' => $validated['email'], 'message' => $validated['message'], 'page_url' => $validated['page_url'] ?? null, + 'payload' => array_filter([ + 'spam_reason' => $spamReason, + 'bot_check' => $botCheck?->status === BotCheckStatus::Skipped ? null : $botCheck?->status->value, + 'bot_check_reason' => $botCheck?->needsReview() ? $botCheck->reason : null, + ]) ?: null, 'requester_ip' => $request->ip(), 'user_id' => $request->user()?->id, ]); - Mail::to($this->recipient())->queue((new ContactRequestSubmitted( - senderName: $validated['name'], - senderEmail: $validated['email'], - messageText: $validated['message'], - host: $request->getHost(), - topicLabel: $topic->label(), - pageUrl: $validated['page_url'] ?? null, - ))->afterCommit()); + // Spam: gespeichert zur Nachprüfung, aber keine Mail. Der Absender + // bekommt dieselbe Bestätigung wie alle — der Bot lernt nichts. + if ($spamReason !== null) { + Log::channel('spam')->info('Kontaktanfrage in Quarantäne.', [ + 'reason' => $spamReason, + 'portal' => $message->portal, + 'ip_prefix' => SpamLog::ipPrefix($request->ip()), + ]); + + return $this->done(); + } + + if ($botCheck?->needsReview()) { + $this->activityLog->record( + ActivityType::BotCheckUnavailable, + sprintf('Kontaktanfrage %s ohne Bot-Prüfung angenommen (%s) — bitte nachprüfen.', $message->reference(), $botCheck->reason), + subject: $message, + actorLabel: (string) $message->email, + meta: ['form' => 'contact', 'reason' => $botCheck->reason], + ); + } + + $this->notifier->notify($message, $request->getHost()); return $this->done(); } @@ -96,19 +154,6 @@ class ContactController extends Controller return WebPortalContext::portalFromHost()->value; } - private function recipient(): string - { - // Auch die Hub-Domain (pressekonto) nutzt das Formular — sie ist kein - // Spoke-Portal, daher vor dem WebPortalContext am Host unterscheiden. - if (str_contains(request()->getHost(), 'pressekonto')) { - $brand = config('domains.domains.pressekonto.brand', []); - } else { - $brand = WebPortalContext::fromRequest()->domainConfig['brand'] ?? []; - } - - return $brand['contact_email'] ?? config('mail.from.address'); - } - private function ensureNotRateLimited(Request $request): void { if (! RateLimiter::tooManyAttempts($this->throttleKey($request), 5)) { diff --git a/app/Http/Controllers/Web/NewsroomClaimController.php b/app/Http/Controllers/Web/NewsroomClaimController.php index 86a1c1cb..3455c003 100644 --- a/app/Http/Controllers/Web/NewsroomClaimController.php +++ b/app/Http/Controllers/Web/NewsroomClaimController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Web; +use App\Enums\ConversionEventType; use App\Enums\ConversionSource; use App\Http\Controllers\Controller; use App\Models\Company; @@ -9,6 +10,7 @@ use App\Models\PressRelease; use App\Scopes\PortalScope; use App\Services\Company\MergedNewsroomLookup; use App\Services\Company\NewsroomClaimService; +use App\Services\Conversion\ConversionRecorder; use App\Support\WebPortalContext; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; @@ -29,9 +31,10 @@ class NewsroomClaimController extends Controller public function __construct( private readonly NewsroomClaimService $claims, private readonly MergedNewsroomLookup $mergedNewsrooms, + private readonly ConversionRecorder $recorder, ) {} - public function show(string $edition, string $slug): View|Response|RedirectResponse + public function show(Request $request, string $edition, string $slug): View|Response|RedirectResponse { $context = WebPortalContext::fromRequest(); $company = $this->claims->findClaimable($context->portalValues, $slug); @@ -40,6 +43,8 @@ class NewsroomClaimController extends Controller return $this->resolveMissing($context, $edition, $slug); } + $this->recorder->recordManagePageOpened($request, $company, $this->sourceOf($request), $this->landingPressRelease($request, $company)); + return view('web.newsroom-claim', [ 'company' => $company, 'recipients' => $this->claims->maskedRecipients($company), @@ -70,7 +75,8 @@ class NewsroomClaimController extends Controller // Enumeration-sicher: dieselbe Meldung, ob ein Konto deaktiviert ist // oder nicht — die Adresse ist ohnehin nur maskiert sichtbar. - $sent = $this->claims->request($company, $request->ip(), $this->sourceOf($request), $this->landingPressReleaseId($request, $company)); + $landing = $this->landingPressRelease($request, $company); + $sent = $this->claims->request($company, $request->ip(), $this->sourceOf($request), $landing?->getKey()); // Der Firmenzähler zählt nur tatsächlich versendete Links — sonst // sperrten Dritte den Inhaber mit Fehlversuchen 24 h aus @@ -78,6 +84,10 @@ class NewsroomClaimController extends Controller // Drossel oben. if ($sent > 0) { RateLimiter::hit($this->companyKey($company->getKey()), 86400); + + // Stufe 3 der Konversionsleiter (Roadmap 6.16): nur, wenn + // wirklich ein Link verschickt wurde. + $this->recorder->record(ConversionEventType::AccessRequested, $this->sourceOf($request), $company, $landing); } return back()->with('newsroom-claim-status', __('static.newsroom_claim.flash_sent')); @@ -88,7 +98,7 @@ class NewsroomClaimController extends Controller * Link), landet er nach dem Login auf genau dieser Meldung samt Aufrufen * (Roadmap 1c.2) — sofern sie wirklich zu dieser Firma gehört. */ - private function landingPressReleaseId(Request $request, Company $company): ?int + private function landingPressRelease(Request $request, Company $company): ?PressRelease { $id = (int) $request->input('pr', 0); @@ -96,7 +106,7 @@ class NewsroomClaimController extends Controller return null; } - return PressRelease::query()->withoutGlobalScope(PortalScope::class)->whereKey($id)->where('company_id', $company->getKey())->exists() ? $id : null; + return PressRelease::query()->withoutGlobalScope(PortalScope::class)->whereKey($id)->where('company_id', $company->getKey())->first(); } private function resolveMissing(WebPortalContext $context, string $edition, string $slug): Response|RedirectResponse diff --git a/app/Http/Middleware/BlockUnusedFortifyRoutes.php b/app/Http/Middleware/BlockUnusedFortifyRoutes.php index b2f38128..e4687c34 100644 --- a/app/Http/Middleware/BlockUnusedFortifyRoutes.php +++ b/app/Http/Middleware/BlockUnusedFortifyRoutes.php @@ -33,6 +33,9 @@ class BlockUnusedFortifyRoutes 'two-factor.secret-key', 'two-factor.recovery-codes', 'two-factor.regenerate-recovery-codes', + // Passkeys löscht die Sicherheitsseite mit Identitätsnachweis + // (Entscheidung 5, 07.10.2026). + 'passkey.destroy', ]; public function handle(Request $request, Closure $next): Response diff --git a/app/Http/Middleware/EnsureApiAccessIsBooked.php b/app/Http/Middleware/EnsureApiAccessIsBooked.php new file mode 100644 index 00000000..904efef0 --- /dev/null +++ b/app/Http/Middleware/EnsureApiAccessIsBooked.php @@ -0,0 +1,38 @@ +user(); + + if ($user instanceof User && ! $this->eligibility->hasApiAccess($user)) { + return response()->json([ + 'message' => 'API access requires an active subscription or booking.', + ], 403); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/EnsurePasskeyManagementIsConfirmed.php b/app/Http/Middleware/EnsurePasskeyManagementIsConfirmed.php new file mode 100644 index 00000000..ff8b68a0 --- /dev/null +++ b/app/Http/Middleware/EnsurePasskeyManagementIsConfirmed.php @@ -0,0 +1,49 @@ + + */ + public const GUARDED_ROUTES = [ + 'passkey.registration-options', + 'passkey.store', + ]; + + public function __construct(private readonly SecurityConfirmation $confirmation) {} + + public function handle(Request $request, Closure $next): Response + { + if (! in_array($request->route()?->getName(), self::GUARDED_ROUTES, true)) { + return $next($request); + } + + $user = $request->user(); + + if (! $user instanceof User || app(UserImpersonation::class)->isActive() || ! $this->confirmation->isFresh($user)) { + abort(403, __('Bitte bestätigen Sie zuerst Ihre Identität.')); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/EnsureSessionIsNotRevoked.php b/app/Http/Middleware/EnsureSessionIsNotRevoked.php index 10b61adf..71081acb 100644 --- a/app/Http/Middleware/EnsureSessionIsNotRevoked.php +++ b/app/Http/Middleware/EnsureSessionIsNotRevoked.php @@ -2,6 +2,7 @@ namespace App\Http\Middleware; +use App\Models\User; use App\Services\Auth\SessionRevocation; use Closure; use Illuminate\Auth\SessionGuard; @@ -11,8 +12,8 @@ use Symfony\Component\HttpFoundation\Response; /** * Meldet eine Session ab, die vor der letzten Sperre ihres Kontos entstanden - * ist (SessionRevocation, Audit K-04). Kostet je angemeldetem Request einen - * Cache-Zugriff; Gäste lösen keinen aus. + * ist (SessionRevocation, Audit K-04). Die Marke steht am geladenen User; + * bis zum Release nach v1.6.0 kommt ein Cache-Zugriff dazu (Übergang). */ class EnsureSessionIsNotRevoked { @@ -33,7 +34,7 @@ class EnsureSessionIsNotRevoked $user = $guard->user(); - if ($user === null || ! $this->revocation->isRevoked((int) $user->getAuthIdentifier(), $request->session())) { + if (! $user instanceof User || ! $this->revocation->isRevoked($user, $request->session())) { return $next($request); } diff --git a/app/Http/Middleware/EnsureStrongAdminAuthentication.php b/app/Http/Middleware/EnsureStrongAdminAuthentication.php new file mode 100644 index 00000000..372e5fa2 --- /dev/null +++ b/app/Http/Middleware/EnsureStrongAdminAuthentication.php @@ -0,0 +1,38 @@ +user(); + + if (! $user instanceof User || ! $this->strong->isRequiredFor($user) || $this->strong->isSatisfiedBy($user)) { + return $next($request); + } + + if (! $request->isMethod('GET') || $request->expectsJson()) { + abort(403, __('Bitte bestätigen Sie Ihre Anmeldung mit Passkey oder Authenticator-Code.')); + } + + $request->session()->put(StrongAuthentication::INTENDED_KEY, $request->fullUrl()); + + return redirect()->route('strong-auth.confirm'); + } +} diff --git a/app/Http/Middleware/RecordMailLinkClick.php b/app/Http/Middleware/RecordMailLinkClick.php index 681ddb5a..52c26632 100644 --- a/app/Http/Middleware/RecordMailLinkClick.php +++ b/app/Http/Middleware/RecordMailLinkClick.php @@ -7,7 +7,6 @@ use App\Enums\ConversionSource; use App\Models\PressRelease; use App\Scopes\PortalScope; use App\Services\Conversion\ConversionRecorder; -use App\Support\CrawlerIdentifier; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\RateLimiter; @@ -49,7 +48,7 @@ class RecordMailLinkClick // Nur echte Aufrufe. Mailclients und Sicherheitsscanner holen Links // vorab per HEAD oder mit eigener Kennung; das wäre kein Klick, // sondern eine Zustellung (Umsetzungsaudit 29.09.2026, R-08). - if (! $request->isMethod('GET') || $this->isScanner($request->userAgent())) { + if (! $request->isMethod('GET') || $this->recorder->isAutomatedVisit($request->userAgent())) { return $next($request); } @@ -81,23 +80,6 @@ class RecordMailLinkClick return $next($request); } - private function isScanner(?string $userAgent): bool - { - $userAgent = mb_strtolower(trim((string) $userAgent)); - - if ($userAgent === '' || CrawlerIdentifier::identify($userAgent) !== null) { - return true; - } - - foreach ((array) config('conversion.mail_clicks.scanner_agents', []) as $pattern) { - if (str_contains($userAgent, mb_strtolower((string) $pattern))) { - return true; - } - } - - return false; - } - /** * Scope-frei aufgelöst: Der Klick landet je nach Link auf dem Hub oder auf * einem der beiden Spokes, der Portal-Scope würde die Meldung dort diff --git a/app/Http/Middleware/SecurityHeaders.php b/app/Http/Middleware/SecurityHeaders.php index e01e3ad6..9d7a47ea 100644 --- a/app/Http/Middleware/SecurityHeaders.php +++ b/app/Http/Middleware/SecurityHeaders.php @@ -2,6 +2,7 @@ namespace App\Http\Middleware; +use App\Support\ContentSecurityPolicy; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; @@ -10,8 +11,8 @@ use Symfony\Component\HttpFoundation\Response; * Applikationsseitige Security-Header (R6.2) — bewusst unabhängig vom * Reverse-Proxy gesetzt, damit der Schutz auch bei Proxy-Wechsel bleibt. * Bereits vorhandene Header (z. B. vom Proxy) werden nicht überschrieben. - * CSP fehlt absichtlich: Livewire/Alpine/Vite brauchen eine eigene - * Inline-Script-Strategie — separat einführen, nicht nebenbei. + * HSTS nur auf HTTPS-Antworten und laut config/security.php. + * CSP vorerst nur im Melde-Modus (ContentSecurityPolicy, config/security.php). */ class SecurityHeaders { @@ -30,6 +31,16 @@ class SecurityHeaders } } + if (config('security.csp.report_only') + && str_contains((string) $response->headers->get('Content-Type'), 'text/html') + && ! $response->headers->has('Content-Security-Policy-Report-Only')) { + $response->headers->set('Content-Security-Policy-Report-Only', ContentSecurityPolicy::header()); + } + + if ($request->isSecure() && config('security.hsts.enabled') && ! $response->headers->has('Strict-Transport-Security')) { + $response->headers->set('Strict-Transport-Security', 'max-age='.(int) config('security.hsts.max_age')); + } + return $response; } } diff --git a/app/Http/Requests/Api/V1/SubscribeNewsletterRequest.php b/app/Http/Requests/Api/V1/SubscribeNewsletterRequest.php deleted file mode 100644 index 429be1c5..00000000 --- a/app/Http/Requests/Api/V1/SubscribeNewsletterRequest.php +++ /dev/null @@ -1,38 +0,0 @@ -user()?->tokenCan('newsletter:subscribe') === true; - } - - /** - * Get the validation rules that apply to the request. - * - * @return array|string> - */ - public function rules(): array - { - return [ - 'portal' => ['required', Rule::in([ - Portal::Presseecho->value, - Portal::Businessportal24->value, - ])], - 'email' => ['required', 'email', 'max:190'], - 'salutation_key' => ['nullable', 'string', 'max:20'], - 'first_name' => ['nullable', 'string', 'max:80'], - 'last_name' => ['nullable', 'string', 'max:80'], - ]; - } -} diff --git a/app/Http/Responses/PasskeyLoginResponse.php b/app/Http/Responses/PasskeyLoginResponse.php new file mode 100644 index 00000000..3c5989e1 --- /dev/null +++ b/app/Http/Responses/PasskeyLoginResponse.php @@ -0,0 +1,38 @@ +user(); + + app(LoginCompletion::class)->recordLogin($user, $request); + + $target = LoginRedirect::safeTarget( + $user, + $request->session()->pull('url.intended'), + LoginRedirect::homeFor($user), + ); + + return $request->wantsJson() + ? new JsonResponse(['redirect' => $target]) + : redirect($target); + } +} diff --git a/app/Listeners/CountFailedLoginsPerIp.php b/app/Listeners/CountFailedLoginsPerIp.php new file mode 100644 index 00000000..655ac3fd --- /dev/null +++ b/app/Listeners/CountFailedLoginsPerIp.php @@ -0,0 +1,25 @@ +guard !== 'web' || ! app()->bound('request')) { + return; + } + + $this->throttle->recordFailure(request()->ip()); + } +} diff --git a/app/Listeners/ProcessStripeWebhook.php b/app/Listeners/ProcessStripeWebhook.php index a2f6c499..988d7f16 100644 --- a/app/Listeners/ProcessStripeWebhook.php +++ b/app/Listeners/ProcessStripeWebhook.php @@ -248,7 +248,7 @@ class ProcessStripeWebhook return; } - // Stufe 5 der Konversionsleiter: die erste bezahlte Rechnung eines + // Stufe 7 der Konversionsleiter: die erste bezahlte Rechnung eines // Kontos. Deckt Abos und alle über Rechnung abgewickelten Zahlungen ab; // Einmalkäufe melden zusätzlich in fulfillSinglePurchase(). Die Sperre // je Firma sorgt dafür, dass trotzdem nur die erste Buchung zählt. @@ -469,7 +469,7 @@ class ProcessStripeWebhook if ($result['marked_paid']) { Log::channel('billing')->info('Einmalkauf als bezahlt markiert.', ['single_purchase_id' => $purchase->id]); - // Stufe 5 der Konversionsleiter. recordFirstBooking() zählt je + // Stufe 7 der Konversionsleiter. recordFirstBooking() zählt je // Firma nur den ersten Treffer, deshalb dürfen beide Zahlungspfade // melden, ohne sich gegenseitig zu verfälschen. $this->conversions->recordFirstBooking($purchase->user); diff --git a/app/Listeners/RecordAuthActivity.php b/app/Listeners/RecordAuthActivity.php index 2766c3ff..67170080 100644 --- a/app/Listeners/RecordAuthActivity.php +++ b/app/Listeners/RecordAuthActivity.php @@ -69,7 +69,7 @@ class RecordAuthActivity meta: ['way' => 'form'], ); - // Stufe 4 der Konversionsleiter. Ohne Firmenbezug — beim Anlegen des + // Stufe 6 der Konversionsleiter. Ohne Firmenbezug — beim Anlegen des // Kontos steht noch keine fest; die Zuordnung entsteht erst, wenn ein // Newsroom beansprucht wird. $this->recorder->record(ConversionEventType::AccountCreated, ConversionSource::Organic); diff --git a/app/Listeners/RevokeAccessAfterPasswordReset.php b/app/Listeners/RevokeAccessAfterPasswordReset.php new file mode 100644 index 00000000..e0ac6a2a --- /dev/null +++ b/app/Listeners/RevokeAccessAfterPasswordReset.php @@ -0,0 +1,42 @@ +user instanceof User) { + return; + } + + $this->sessions->revokeAllFor($event->user); + + MagicLink::query() + ->where('user_id', $event->user->getKey()) + ->whereIn('purpose', MagicLink::LOGIN_PURPOSES) + ->whereNull('consumed_at') + ->update(['consumed_at' => now()]); + + $this->notifier->notify($event->user, SecurityChange::PasswordReset); + } +} diff --git a/app/Listeners/TrackSecondFactorEvents.php b/app/Listeners/TrackSecondFactorEvents.php new file mode 100644 index 00000000..aaa9c6b1 --- /dev/null +++ b/app/Listeners/TrackSecondFactorEvents.php @@ -0,0 +1,71 @@ +user instanceof User) { + return; + } + + $this->strong->mark($event->user, 'passkey'); + $this->confirmation->markConfirmed($event->user); + + // Login per Passkey: Anmeldeweg für das Aktivitätsprotokoll. + if (! auth()->guard('web')->check()) { + request()->attributes->set(RecordAuthActivity::AUTH_METHOD_ATTRIBUTE, 'passkey'); + } + } + + public function handleValidTwoFactorCode(ValidTwoFactorAuthenticationCodeProvided $event): void + { + $this->strong->mark($event->user, 'totp'); + } + + public function handlePasskeyRegistered(PasskeyRegistered $event): void + { + if (! $event->user instanceof User) { + return; + } + + // Die Registrierung verlangt Benutzerverifizierung am Gerät — die + // Session ist damit ebenso stark bestätigt wie durch einen Login. + $this->strong->mark($event->user, 'passkey'); + + $this->notifier->notify($event->user, SecurityChange::PasskeyAdded); + } + + public function handlePasskeyDeleted(PasskeyDeleted $event): void + { + if ($event->user instanceof User) { + $this->notifier->notify($event->user, SecurityChange::PasskeyRemoved); + } + } +} diff --git a/app/Livewire/Concerns/ConfirmsIdentity.php b/app/Livewire/Concerns/ConfirmsIdentity.php new file mode 100644 index 00000000..650e48e3 --- /dev/null +++ b/app/Livewire/Concerns/ConfirmsIdentity.php @@ -0,0 +1,142 @@ +user(); + + if (! app(SecurityConfirmation::class)->sendEmailCode($user)) { + throw ValidationException::withMessages([ + 'securityEmailCode' => __('Zu viele Codes angefordert. Bitte warten Sie einige Minuten.'), + ]); + } + + $this->securityEmailCodeSent = true; + } + + /** + * Art des Nachweises für die Anzeige: fresh, two_factor, password oder email_code. + */ + public function securityProofKind(User $user): string + { + return match (true) { + app(SecurityConfirmation::class)->isFresh($user) => 'fresh', + $user->hasEnabledTwoFactorAuthentication() => 'two_factor', + (string) $user->password !== '' => 'password', + default => 'email_code', + }; + } + + protected function assertSecurityProof(User $user): void + { + $confirmation = app(SecurityConfirmation::class); + + if ($confirmation->isFresh($user)) { + return; + } + + if ($user->hasEnabledTwoFactorAuthentication()) { + $this->assertSecondFactor($user); + } elseif ((string) $user->password !== '') { + try { + $this->validate(['securityPassword' => ['required', 'string', 'current_password']]); + } finally { + $this->reset('securityPassword'); + } + } else { + $this->assertEmailCode($user); + } + + $confirmation->markConfirmed($user); + } + + /** + * Prüft `securityCode` als TOTP (Fortify-Provider, replay-geschützt) oder + * als Wiederherstellungs-Code (wird dabei verbraucht). Fünf Fehlversuche + * pro Minute, damit eine Session die sechs Stellen nicht durchprobiert. + */ + protected function assertSecondFactor(User $user): void + { + $this->validate(['securityCode' => ['required', 'string']]); + + $code = trim($this->securityCode); + $this->reset('securityCode'); + + $throttleKey = 'security-proof:'.$user->getKey(); + + if (RateLimiter::tooManyAttempts($throttleKey, 5)) { + throw ValidationException::withMessages([ + 'securityCode' => __('Zu viele Fehlversuche. Bitte warten Sie eine Minute.'), + ]); + } + + $secret = decrypt($user->two_factor_secret); + + if (app(TwoFactorAuthenticationProvider::class)->verify($secret, $code)) { + RateLimiter::clear($throttleKey); + + return; + } + + if (in_array($code, $user->recoveryCodes() ?? [], true)) { + $user->replaceRecoveryCode($code); + RateLimiter::clear($throttleKey); + + return; + } + + RateLimiter::hit($throttleKey, 60); + + throw ValidationException::withMessages([ + 'securityCode' => __('Der Code ist ungültig. Geben Sie einen aktuellen Code aus Ihrer Authenticator-App oder einen Wiederherstellungs-Code ein.'), + ]); + } + + private function assertEmailCode(User $user): void + { + $this->validate(['securityEmailCode' => ['required', 'string']], [ + 'securityEmailCode.required' => __('Bitte fordern Sie einen Bestätigungscode per E-Mail an und geben Sie ihn ein.'), + ]); + + $code = $this->securityEmailCode; + $this->reset('securityEmailCode'); + + if (! app(SecurityConfirmation::class)->verifyEmailCode($user, $code)) { + throw ValidationException::withMessages([ + 'securityEmailCode' => __('Der Code ist ungültig oder abgelaufen. Bitte fordern Sie einen neuen Code an.'), + ]); + } + + $this->securityEmailCodeSent = false; + } +} diff --git a/app/Mail/PressReleaseHeldForReview.php b/app/Mail/PressReleaseHeldForReview.php index 385fa538..27e2cf8d 100644 --- a/app/Mail/PressReleaseHeldForReview.php +++ b/app/Mail/PressReleaseHeldForReview.php @@ -7,6 +7,7 @@ use App\Enums\EmailNotificationType; use App\Mail\Concerns\Unsubscribable; use App\Models\PressRelease; use App\Models\User; +use App\Services\Auth\MailAccessLink; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; @@ -35,6 +36,16 @@ class PressReleaseHeldForReview extends Mailable public int $maxAttempts; + /** + * Empfänger ohne Konto (API-Meldung, Roadmap 6.17): Adresse dieser Mail + * und Link, der einen Anmeldelink an sie schickt. Der Link zum Kundenbereich + * führte sonst auf eine Anmeldeseite für ein Konto, das der Empfänger + * nicht kennt. + */ + public ?string $accessEmail = null; + + public ?string $accessUrl = null; + public function __construct( public readonly User $user, public readonly PressRelease $pressRelease, @@ -55,6 +66,8 @@ class PressReleaseHeldForReview extends Mailable ]); if ($recipientEmail !== null && mb_strtolower(trim($recipientEmail)) !== mb_strtolower((string) $user->email)) { + $this->accessEmail = trim($recipientEmail); + $this->accessUrl = app(MailAccessLink::class)->url($this->accessEmail, $pressRelease, ConversionSource::MailReview); $this->configureAddressUnsubscribe($recipientEmail, EmailNotificationType::PressReleaseRejected); } else { $this->configureUnsubscribe($user, EmailNotificationType::PressReleaseRejected); diff --git a/app/Mail/PressReleasePublished.php b/app/Mail/PressReleasePublished.php index 0c869871..f1d13819 100644 --- a/app/Mail/PressReleasePublished.php +++ b/app/Mail/PressReleasePublished.php @@ -7,6 +7,7 @@ use App\Enums\EmailNotificationType; use App\Mail\Concerns\Unsubscribable; use App\Models\PressRelease; use App\Models\User; +use App\Services\Auth\MailAccessLink; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; @@ -39,6 +40,16 @@ class PressReleasePublished extends Mailable */ public ?string $manageNewsroomUrl = null; + /** + * Empfänger ohne Konto (API-Meldung an Pressekontakt oder Firmen-E-Mail, + * Roadmap 6.17): Adresse, an die diese Mail geht, und der Link, der mit + * einem Klick einen Anmeldelink an genau diese Adresse schickt. Null für + * Kunden, die selbst eingereicht haben — die kennen ihr Konto. + */ + public ?string $accessEmail = null; + + public ?string $accessUrl = null; + public function __construct( public readonly User $user, public readonly PressRelease $pressRelease, @@ -72,6 +83,8 @@ class PressReleasePublished extends Mailable // Geht die Mail an einen Empfänger ohne Konto (API-Meldung), meldet // der Abmeldelink diese Adresse ab — nicht das Konto des Einlieferers. if ($recipientEmail !== null && mb_strtolower(trim($recipientEmail)) !== mb_strtolower((string) $user->email)) { + $this->accessEmail = trim($recipientEmail); + $this->accessUrl = app(MailAccessLink::class)->url($this->accessEmail, $pressRelease, ConversionSource::MailPublish); $this->configureAddressUnsubscribe($recipientEmail, EmailNotificationType::PressReleasePublished); } else { $this->configureUnsubscribe($user, EmailNotificationType::PressReleasePublished); diff --git a/app/Mail/PressReleaseRejected.php b/app/Mail/PressReleaseRejected.php index 78630327..ee41af33 100644 --- a/app/Mail/PressReleaseRejected.php +++ b/app/Mail/PressReleaseRejected.php @@ -8,6 +8,7 @@ use App\Enums\Portal; use App\Mail\Concerns\Unsubscribable; use App\Models\PressRelease; use App\Models\User; +use App\Services\Auth\MailAccessLink; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; @@ -29,6 +30,16 @@ class PressReleaseRejected extends Mailable */ public string $recipientName; + /** + * Empfänger ohne Konto (API-Meldung, Roadmap 6.17/6.18): Adresse dieser + * Mail und Link, der einen Anmeldelink an sie schickt. Nach der Anmeldung + * kann der Pressekontakt die Meldung überarbeiten und kostenlos erneut + * einreichen (Entscheidung 14.10.2026). + */ + public ?string $accessEmail = null; + + public ?string $accessUrl = null; + public function __construct( public readonly User $user, public readonly PressRelease $pressRelease, @@ -53,6 +64,8 @@ class PressReleaseRejected extends Mailable // Geht die Mail an einen Empfänger ohne Konto (API-Meldung), meldet // der Abmeldelink diese Adresse ab — nicht das Konto des Einlieferers. if ($recipientEmail !== null && mb_strtolower(trim($recipientEmail)) !== mb_strtolower((string) $user->email)) { + $this->accessEmail = trim($recipientEmail); + $this->accessUrl = app(MailAccessLink::class)->url($this->accessEmail, $pressRelease, ConversionSource::MailReject); $this->configureAddressUnsubscribe($recipientEmail, EmailNotificationType::PressReleaseRejected); } else { $this->configureUnsubscribe($user, EmailNotificationType::PressReleaseRejected); diff --git a/app/Mail/SecurityChangeNotice.php b/app/Mail/SecurityChangeNotice.php new file mode 100644 index 00000000..5a0e6a33 --- /dev/null +++ b/app/Mail/SecurityChangeNotice.php @@ -0,0 +1,54 @@ + 'user:'.$this->user->id]); + } + + public function envelope(): Envelope + { + return new Envelope( + subject: 'Sicherheitshinweis zu Ihrem pressekonto' + ); + } + + public function content(): Content + { + return new Content( + view: 'emails.auth.security-change-notice' + ); + } + + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/SecurityConfirmationCode.php b/app/Mail/SecurityConfirmationCode.php new file mode 100644 index 00000000..e672a6ee --- /dev/null +++ b/app/Mail/SecurityConfirmationCode.php @@ -0,0 +1,51 @@ + 'user:'.$this->user->id]); + } + + public function envelope(): Envelope + { + return new Envelope( + subject: 'Ihr Bestätigungscode für pressekonto' + ); + } + + public function content(): Content + { + return new Content( + view: 'emails.auth.security-confirmation-code' + ); + } + + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/SocialAccountLinkConfirmation.php b/app/Mail/SocialAccountLinkConfirmation.php new file mode 100644 index 00000000..5da5fb32 --- /dev/null +++ b/app/Mail/SocialAccountLinkConfirmation.php @@ -0,0 +1,51 @@ + 'user:'.$this->user->id]); + } + + public function envelope(): Envelope + { + return new Envelope( + subject: 'Google-Anmeldung für Ihr pressekonto bestätigen' + ); + } + + public function content(): Content + { + return new Content( + view: 'emails.auth.social-account-link-confirmation' + ); + } + + public function attachments(): array + { + return []; + } +} diff --git a/app/Models/ActivityEvent.php b/app/Models/ActivityEvent.php index 276bf3b1..bf33c882 100644 --- a/app/Models/ActivityEvent.php +++ b/app/Models/ActivityEvent.php @@ -3,6 +3,8 @@ namespace App\Models; use App\Enums\ActivityType; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\MassPrunable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphTo; @@ -13,6 +15,8 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; */ class ActivityEvent extends Model { + use MassPrunable; + public $timestamps = false; protected $fillable = [ @@ -50,4 +54,14 @@ class ActivityEvent extends Model { return $this->morphTo(); } + + /** + * Einträge nach der Löschfrist (config monitoring.retention, 395 Tage). + * + * @return Builder + */ + public function prunable(): Builder + { + return static::query()->where('occurred_at', '<', now()->subDays((int) config('monitoring.retention.activity_events_days'))); + } } diff --git a/app/Models/ApiUsageLog.php b/app/Models/ApiUsageLog.php index d6d9f07c..de7cf87c 100644 --- a/app/Models/ApiUsageLog.php +++ b/app/Models/ApiUsageLog.php @@ -2,12 +2,16 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\MassPrunable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Laravel\Sanctum\PersonalAccessToken; class ApiUsageLog extends Model { + use MassPrunable; + public $timestamps = false; protected $fillable = [ @@ -45,4 +49,14 @@ class ApiUsageLog extends Model { return $this->belongsTo(PersonalAccessToken::class); } + + /** + * Zugriffe nach der Löschfrist (config monitoring.retention, 90 Tage). + * + * @return Builder + */ + public function prunable(): Builder + { + return static::query()->where('requested_at', '<', now()->subDays((int) config('monitoring.retention.api_usage_logs_days'))); + } } diff --git a/app/Models/ChangelogEntry.php b/app/Models/ChangelogEntry.php new file mode 100644 index 00000000..a63d7c60 --- /dev/null +++ b/app/Models/ChangelogEntry.php @@ -0,0 +1,71 @@ + */ + use HasFactory; + + protected $fillable = [ + 'released_on', + 'release_tag', + 'category', + 'text', + 'status', + 'source_key', + 'commit_subject', + 'review_note', + 'article_worthy', + 'published_at', + 'reviewed_by_user_id', + ]; + + protected function casts(): array + { + return [ + 'released_on' => 'date', + 'category' => ChangelogCategory::class, + 'status' => ChangelogStatus::class, + 'article_worthy' => 'boolean', + 'published_at' => 'datetime', + ]; + } + + /** + * @return BelongsTo + */ + public function reviewer(): BelongsTo + { + return $this->belongsTo(User::class, 'reviewed_by_user_id'); + } + + /** + * @param Builder $query + */ + public function scopePublished(Builder $query): void + { + $query->where('status', ChangelogStatus::Published->value); + } + + /** + * Öffentlicher Text: Sicherheit immer nur als Sammelzeile (E5), egal + * was im Entwurf steht. + */ + public function publicText(): string + { + return $this->category === ChangelogCategory::Security ? ChangelogCategory::SECURITY_LINE : $this->text; + } +} diff --git a/app/Models/Company.php b/app/Models/Company.php index 1dcd1af4..194c9f60 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -161,6 +161,54 @@ class Company extends Model return $this->gone_at !== null; } + /** + * Öffentliche Newsroom-Seiten dieser Firma, je Portal — nur dort, wo sie + * schon erscheint: Der Newsroom ist öffentlich ab der ersten sichtbaren + * Meldung in dieser Sprache (Roadmap 1b.1). Deutsch hat Vorrang, sonst + * Englisch. Für die Verknüpfung „Firma ↔ Newsroom“ im Kunden- und + * Adminbereich. + * + * @return list + */ + public function publicNewsroomLinks(): array + { + if (! $this->slug || ! $this->is_active || $this->isGone()) { + return []; + } + + $portals = $this->portal === Portal::Both ? [Portal::Presseecho, Portal::Businessportal24] : [$this->portal]; + $links = []; + + foreach ($portals as $portal) { + $languages = PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->where('company_id', $this->getKey()) + ->whereIn('portal', [$portal->value, Portal::Both->value]) + ->visibleInArchive() + ->whereIn('language', ['de', 'en']) + ->distinct() + ->pluck('language') + ->all(); + + if ($languages === []) { + continue; + } + + $links[] = [ + 'portal' => $portal, + 'label' => $portal->label(), + 'url' => sprintf( + '%s/%s/newsroom/%s', + rtrim((string) ($portal === Portal::Presseecho ? config('domains.domain_presseecho_url') : config('domains.domain_businessportal_url')), '/'), + in_array('de', $languages, true) ? 'de' : 'en', + $this->slug, + ), + ]; + } + + return $links; + } + /** * Trägt eine fremde, lebende Firma auf einem ANDEREN Portal diesen Slug? * Dann darf diese Firma nicht `both` werden: Die öffentliche Auflösung diff --git a/app/Models/ContactMessage.php b/app/Models/ContactMessage.php index 3aa9d7ea..1a54bdaf 100644 --- a/app/Models/ContactMessage.php +++ b/app/Models/ContactMessage.php @@ -7,6 +7,7 @@ use App\Enums\ContactMessageTopic; use Database\Factories\ContactMessageFactory; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\MassPrunable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -21,6 +22,11 @@ class ContactMessage extends Model /** @use HasFactory */ use HasFactory; + use MassPrunable; + + /** Tage, die Spam zur Nachprüfung in der Quarantäne bleibt. */ + public const SPAM_RETENTION_DAYS = 30; + protected $fillable = [ 'portal', 'topic', @@ -47,6 +53,87 @@ class ContactMessage extends Model ]; } + /** + * Spam-Quarantäne nach Ablauf der Prüffrist löschen (model:prune). + * + * @return Builder + */ + public function prunable(): Builder + { + return self::query() + ->where('status', ContactMessageStatus::Spam->value) + ->where('created_at', '<', now()->subDays(self::SPAM_RETENTION_DAYS)); + } + + public function isSpam(): bool + { + return $this->status === ContactMessageStatus::Spam; + } + + /** + * In die Spam-Quarantäne legen (Admin, Sammelaktion oder Altbestand). + * Ein vorhandener Filtergrund bleibt erhalten. + */ + public function markAsSpam(?User $by, string $reason = 'manual'): void + { + $this->update([ + 'status' => ContactMessageStatus::Spam->value, + 'payload' => [...($this->payload ?? []), 'spam_reason' => $this->payload['spam_reason'] ?? $reason], + 'resolved_by_user_id' => $by?->id, + 'resolved_at' => now(), + ]); + } + + /** + * Fehlalarm: zurück in die offene Queue. Gibt zurück, ob die Team-Mail + * noch aussteht: Hat der Filter die Anfrage beim Eingang abgefangen, ging + * keine raus — beim ersten Zurückholen wird sie nachgeholt. Von Hand + * markierter Spam hatte seine Mail schon. + */ + public function releaseFromSpam(): bool + { + $payload = $this->payload ?? []; + $mailPending = isset($payload['spam_reason']) + && $payload['spam_reason'] !== 'manual' + && ! isset($payload['released_from_spam_at']); + + $this->update([ + 'status' => ContactMessageStatus::Open->value, + 'payload' => [...$payload, 'released_from_spam_at' => now()->toIso8601String()], + 'resolved_by_user_id' => null, + 'resolved_at' => null, + ]); + + return $mailPending; + } + + /** + * Grund der Quarantäne für die Admin-Ansicht (ContactSpamFilter). + */ + public function spamReasonLabel(): ?string + { + $reason = $this->payload['spam_reason'] ?? null; + + return match ($reason) { + null => null, + 'link' => 'Link im Text', + 'page_title' => 'Floskel mit Seitentitel', + 'gibberish' => 'Zeichensalat', + 'blacklist' => 'Begriff der Sperrliste', + 'too_fast' => 'Zu schnell abgesendet', + 'manual' => 'Von Hand markiert', + default => (string) $reason, + }; + } + + /** + * Angenommen, obwohl Cloudflare Turnstile nicht erreichbar war. + */ + public function skippedBotCheck(): bool + { + return ($this->payload['bot_check'] ?? null) === 'unavailable'; + } + /** * Öffentliche Vorgangsnummer — analog zu Legal-Requests ("M-{id}"). */ diff --git a/app/Models/User.php b/app/Models/User.php index 14ff463e..d323a24d 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -19,14 +19,16 @@ use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Laravel\Cashier\Billable; +use Laravel\Fortify\Contracts\PasskeyUser; +use Laravel\Fortify\PasskeyAuthenticatable; use Laravel\Fortify\TwoFactorAuthenticatable; use Laravel\Sanctum\HasApiTokens; use Spatie\Permission\Traits\HasRoles; -class User extends Authenticatable implements MustVerifyEmail +class User extends Authenticatable implements MustVerifyEmail, PasskeyUser { /** @use HasFactory */ - use Billable, HasApiTokens, HasFactory, HasRoles, Notifiable, SoftDeletes, TwoFactorAuthenticatable; + use Billable, HasApiTokens, HasFactory, HasRoles, Notifiable, PasskeyAuthenticatable, SoftDeletes, TwoFactorAuthenticatable; /** * The attributes that are mass assignable. @@ -85,6 +87,7 @@ class User extends Authenticatable implements MustVerifyEmail 'deleted_at' => 'datetime', 'password' => 'hashed', 'press_release_quota_used_this_month' => 'integer', + 'sessions_revoked_at_ms' => 'integer', ]; } diff --git a/app/Observers/ActivityLogObserver.php b/app/Observers/ActivityLogObserver.php index 4f463852..13b3b021 100644 --- a/app/Observers/ActivityLogObserver.php +++ b/app/Observers/ActivityLogObserver.php @@ -3,6 +3,7 @@ namespace App\Observers; use App\Enums\ActivityType; +use App\Enums\ContactMessageStatus; use App\Models\ContactMessage; use App\Models\LegalRequest; use App\Models\NewsletterSubscription; @@ -23,6 +24,8 @@ class ActivityLogObserver public function created(Model $model): void { match (true) { + // Spam-Quarantäne gehört nicht in den Verlauf. + $model instanceof ContactMessage && $model->status === ContactMessageStatus::Spam => null, $model instanceof ContactMessage => $this->activityLog->record( ActivityType::ContactRequest, sprintf('Kontaktanfrage „%s“ von %s (%s).', $model->topic->label(), $model->name, $model->email), diff --git a/app/Observers/CompanyMembershipObserver.php b/app/Observers/CompanyMembershipObserver.php new file mode 100644 index 00000000..64909a00 --- /dev/null +++ b/app/Observers/CompanyMembershipObserver.php @@ -0,0 +1,105 @@ +wasChanged('email')) { + $this->contactAccess->syncMembershipsForEmail($model); + } + + return; + } + + $relevant = $model instanceof Contact ? ['email', 'company_id'] : ['email']; + + if (! $model->wasChanged($relevant)) { + return; + } + + $this->resync( + emails: [$model->getOriginal('email'), $model->getAttribute('email')], + companyIds: $this->companyIdsOf($model, withOriginal: true), + ); + } + + public function deleted(Model $model): void + { + if ($model instanceof User) { + return; + } + + $this->resync([$model->getAttribute('email')], $this->companyIdsOf($model)); + } + + public function restored(Model $model): void + { + $this->deleted($model); + } + + /** + * @return list + */ + private function companyIdsOf(Company|Contact|Model $model, bool $withOriginal = false): array + { + $ids = $model instanceof Contact + ? [$model->getAttribute('company_id'), $withOriginal ? $model->getOriginal('company_id') : null] + : [$model->getKey()]; + + return array_values(array_unique(array_map('intval', array_filter($ids)))); + } + + /** + * Alle User, deren automatische Rechte an den betroffenen Firmen hängen, + * sowie alle User mit einer der betroffenen Adressen. + * + * @param list $emails + * @param list $companyIds + */ + private function resync(array $emails, array $companyIds): void + { + $userIds = $companyIds === [] ? collect() : DB::table('company_user') + ->whereIn('company_id', $companyIds) + ->whereIn('granted_via', ['auto', 'auto-upgrade']) + ->pluck('user_id'); + + /** @var Collection $users */ + $users = User::query()->whereIn('id', $userIds->all())->get(); + + foreach (array_unique(array_filter(array_map( + fn (?string $email): string => mb_strtolower(trim((string) $email)), + $emails, + ))) as $email) { + $users = $users->merge(EmailQuery::whereEmail(User::query(), $email)->get()); + } + + $users->unique('id')->each(fn (User $user) => $this->contactAccess->syncMembershipsForEmail($user)); + } +} diff --git a/app/Policies/LegacyInvoicePolicy.php b/app/Policies/LegacyInvoicePolicy.php index f0957570..e2c05036 100644 --- a/app/Policies/LegacyInvoicePolicy.php +++ b/app/Policies/LegacyInvoicePolicy.php @@ -2,9 +2,16 @@ namespace App\Policies; +use App\Authorization\Permission; use App\Models\LegacyInvoice; use App\Models\User; +/** + * Alt-Rechnungen aus dem Legacy-Import. Kunden sehen ihre eigenen Belege, + * fremde nur mit `billing:manage` — der Panel-Zugang (Editor) allein reicht + * nicht (Sicherheitsaudit 07.10.2026, S-01). Gilt für die Kunden- und die + * Admin-Downloadroute gleichermaßen. + */ class LegacyInvoicePolicy { public function before(User $user): ?bool @@ -19,7 +26,7 @@ class LegacyInvoicePolicy public function view(User $user, LegacyInvoice $legacyInvoice): bool { - if ($user->canAccessAdmin()) { + if ($user->can(Permission::BillingManage)) { return true; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4f097013..d78c2514 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,6 +6,7 @@ use App\Contracts\NewsletterSyncClient; use App\Exceptions\MailDeliveryPausedException; use App\Helpers\ThemeHelper; use App\Http\Middleware\BlockAdminDuringImpersonation; +use App\Http\Middleware\EnsureStrongAdminAuthentication; use App\Http\Middleware\EnsureUserIsAdmin; use App\Http\Middleware\EnsureUserIsCustomer; use App\Http\Middleware\LogSlowAdminRequests; @@ -31,6 +32,7 @@ use App\Models\User; use App\Models\WithdrawalRequest; use App\Observers\ActivityLogObserver; use App\Observers\AdminPerformanceCacheObserver; +use App\Observers\CompanyMembershipObserver; use App\Observers\CompanyPublicCacheObserver; use App\Observers\EmailDomainObserver; use App\Observers\ImageRightsConfirmationObserver; @@ -64,6 +66,7 @@ use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Queue; use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; +use Illuminate\Validation\Rules\Password; use Laravel\Cashier\Cashier; use Laravel\Fortify\Events\TwoFactorAuthenticationFailed; use Livewire\Livewire; @@ -106,6 +109,18 @@ class AppServiceProvider extends ServiceProvider // Ausgelieferte Version in `php artisan about` (Datei RELEASE bzw. APP_VERSION). AboutCommand::add('Pressekonto', fn (): array => ['Version' => config('app.version') ?? '—']); + // Passwortregeln für neue und geänderte Passwörter (Sicherheitsaudit + // 07.10.2026, Phase 4). Bestehende kürzere Passwörter bleiben gültig. + // Der Leak-Abgleich fragt Have I Been Pwned per k-Anonymität ab (nur + // die ersten 5 Zeichen des SHA-1-Hashes verlassen den Server) und + // lässt das Passwort durch, wenn der Dienst nicht antwortet — daher + // nur in Produktion, Tests und lokale Entwicklung bleiben offline. + Password::defaults(function (): Password { + $rule = Password::min(12); + + return $this->app->isProduction() ? $rule->uncompromised() : $rule; + }); + // Die Generations-Nummer der Seiten-Caches wird prozessintern gemerkt. // Ein Queue-Worker lebt über beliebig viele Jobs hinweg und würde sonst // dauerhaft mit dem Stand seines ersten Zugriffs arbeiten — Keys einer @@ -243,6 +258,12 @@ class AppServiceProvider extends ServiceProvider Company::observe(EmailDomainObserver::class); Contact::observe(EmailDomainObserver::class); + // Automatische Firmenrechte sofort neu bewerten, wenn sich ihre + // E-Mail-Grundlage ändert (Sicherheitsaudit 07.10.2026, S-03). + Company::observe(CompanyMembershipObserver::class); + Contact::observe(CompanyMembershipObserver::class); + User::observe(CompanyMembershipObserver::class); + // Öffentliche Seiten-Caches bei Löschung/Deaktivierung einer Firma // verwerfen — auf jedem Löschweg, nicht nur im Admin-Formular (F13). Company::observe(CompanyPublicCacheObserver::class); @@ -266,6 +287,7 @@ class AppServiceProvider extends ServiceProvider Livewire::addPersistentMiddleware([ BlockAdminDuringImpersonation::class, EnsureUserIsAdmin::class, + EnsureStrongAdminAuthentication::class, EnsureUserIsCustomer::class, LogSlowAdminRequests::class, ]); diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php index 4112cd29..5c2df3c4 100644 --- a/app/Providers/FortifyServiceProvider.php +++ b/app/Providers/FortifyServiceProvider.php @@ -6,7 +6,10 @@ use App\Actions\Fortify\CreateNewUser; use App\Actions\Fortify\ResetUserPassword; use App\Actions\Fortify\UpdateUserPassword; use App\Http\Responses\FailedTwoFactorChallengeResponse; +use App\Http\Responses\PasskeyLoginResponse; use App\Http\Responses\RoleAwareLoginResponse; +use App\Models\User; +use App\Services\Auth\LoginIpThrottle; use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Http\Request; use Illuminate\Support\Facades\RateLimiter; @@ -17,6 +20,10 @@ use Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse; use Laravel\Fortify\Contracts\LoginResponse; use Laravel\Fortify\Contracts\TwoFactorLoginResponse; use Laravel\Fortify\Fortify; +use Laravel\Passkeys\Contracts\PasskeyLoginResponse as PasskeyLoginResponseContract; +use Laravel\Passkeys\Contracts\PasskeyUser; +use Laravel\Passkeys\Passkey; +use Laravel\Passkeys\Passkeys; class FortifyServiceProvider extends ServiceProvider { @@ -30,6 +37,7 @@ class FortifyServiceProvider extends ServiceProvider // Fortifys Default leitet auf die nicht registrierte Route // `two-factor.login` (views => false) – zurück zur Livewire-Challenge. $this->app->singleton(FailedTwoFactorLoginResponse::class, FailedTwoFactorChallengeResponse::class); + $this->app->singleton(PasskeyLoginResponseContract::class, PasskeyLoginResponse::class); } /** @@ -46,6 +54,20 @@ class FortifyServiceProvider extends ServiceProvider // Keine View-Definitionen, die Auth-Seiten sind Livewire-Komponenten RateLimiter::for('login', function (Request $request) { + // IP-weite Obergrenze über alle Konten (LoginIpThrottle) — der + // Zähler ist derselbe wie in der Livewire-Anmeldung. + $ipThrottle = app(LoginIpThrottle::class); + + if ($ipThrottle->isBlocked($request->ip())) { + $seconds = $ipThrottle->availableIn($request->ip()); + + return $request->expectsJson() + ? response()->json(['message' => __('auth.throttle', ['seconds' => $seconds, 'minutes' => ceil($seconds / 60)])], 429, ['Retry-After' => $seconds]) + : back()->withInput($request->only(Fortify::username()))->withErrors([ + Fortify::username() => __('auth.throttle', ['seconds' => $seconds, 'minutes' => ceil($seconds / 60)]), + ]); + } + $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); return Limit::perMinute(5)->by($throttleKey); @@ -54,5 +76,15 @@ class FortifyServiceProvider extends ServiceProvider RateLimiter::for('two-factor', function (Request $request) { return Limit::perMinute(5)->by($request->session()->get('login.id')); }); + + RateLimiter::for('passkeys', function (Request $request) { + return Limit::perMinute(10)->by($request->user()?->getAuthIdentifier() ?? $request->ip()); + }); + + // Passkey-Login (Entscheidung 5, 07.10.2026): nur aktive, verifizierte + // Konten — wie die übrigen Anmeldewege. + Passkeys::authorizeLoginUsing(function (Request $request, PasskeyUser $user, Passkey $passkey): bool { + return $user instanceof User && $user->is_active && $user->hasVerifiedEmail(); + }); } } diff --git a/app/Rules/NoPromotionalText.php b/app/Rules/NoPromotionalText.php index 07e0dd32..4832672d 100644 --- a/app/Rules/NoPromotionalText.php +++ b/app/Rules/NoPromotionalText.php @@ -21,7 +21,7 @@ use Illuminate\Contracts\Validation\ValidationRule; class NoPromotionalText implements ValidationRule { /** Schema, www. — oder eine nackte Domain mit Pfad („spam.example/deal"). */ - private const LINK_PATTERN = '~(?:https?://|www\.|\b[a-z0-9-]+\.[a-z]{2,}/\S)~iu'; + public const LINK_PATTERN = '~(?:https?://|www\.|\b[a-z0-9-]+\.[a-z]{2,}/\S)~iu'; private const EMAIL_PATTERN = '~[^\s@]+@[^\s@]+\.[a-z]{2,}~iu'; diff --git a/app/Services/Admin/AdminSystemHealth.php b/app/Services/Admin/AdminSystemHealth.php index 15b9cab5..0832ad4f 100644 --- a/app/Services/Admin/AdminSystemHealth.php +++ b/app/Services/Admin/AdminSystemHealth.php @@ -3,6 +3,8 @@ namespace App\Services\Admin; use App\Authorization\Permission as PermissionCatalog; +use App\Enums\ActivityType; +use App\Models\ActivityEvent; use App\Models\ArchiveEntry; use App\Models\FailedLoginTally; use App\Models\PressReleaseAttachment; @@ -11,6 +13,7 @@ use App\Services\Archive\ArchivePendingQueue; use App\Services\Archive\EvidenceArchive; use App\Services\Monitoring\HealthProbe; use App\Services\PressRelease\Images\PressReleaseImageRemover; +use App\Services\Spam\TurnstileVerifier; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; @@ -238,6 +241,45 @@ class AdminSystemHealth : 'SESSION_SECURE_COOKIE ist aus'.($isLocal ? ' (lokal ok).' : ' — in https-Umgebungen aktivieren.'), ]; + // Imagick trägt Herkunftsprüfung und KI-Vorab-Check der Bilder. Fehlt + // die Erweiterung, scheitern beide still (Bilder werden durchgelassen) + // — so geschehen auf Live bis 08.10.2026. + $precheckEnabled = (bool) config('images.precheck.enabled'); + $checks[] = [ + 'key' => 'imagick', + 'label' => 'PHP-Erweiterung Imagick', + 'status' => $this->imagickAvailable() ? self::StatusOk : ($precheckEnabled ? self::StatusCritical : self::StatusWarn), + 'detail' => $this->imagickAvailable() + ? 'Imagick ist geladen (Herkunftsprüfung und KI-Vorab-Check der Bilder).' + : 'Imagick fehlt — Herkunftsprüfung'.($precheckEnabled ? ' und KI-Vorab-Check' : '').' der Bilder laufen ins Leere. Auf dem Server php8.4-imagick installieren und PHP-FPM neu laden.', + ]; + + // Spamschutz (Cloudflare Turnstile): Keys in Produktion gesetzt, und + // Formulare, die bei nicht erreichbarem Cloudflare durchgelassen und + // markiert wurden (Entscheidung 09.10.2026) — die gehören nachgeprüft. + $turnstileEnabled = TurnstileVerifier::enabled(); + $checks[] = [ + 'key' => 'turnstile', + 'label' => 'Spamschutz (Cloudflare Turnstile)', + 'status' => ($turnstileEnabled || ! app()->isProduction()) ? self::StatusOk : self::StatusWarn, + 'detail' => $turnstileEnabled + ? 'Bot-Prüfung für Kontakt-Widget und Registrierung ist aktiv.' + : 'TURNSTILE_SITE_KEY/TURNSTILE_SECRET_KEY fehlen — Kontakt-Widget und Registrierung laufen ohne Bot-Prüfung.', + ]; + + $unchecked = ActivityEvent::query() + ->where('type', ActivityType::BotCheckUnavailable->value) + ->where('occurred_at', '>=', now()->subDays(7)) + ->count(); + $checks[] = [ + 'key' => 'bot_check_unavailable', + 'label' => 'Formulare ohne Bot-Prüfung', + 'status' => $unchecked > 0 ? self::StatusWarn : self::StatusOk, + 'detail' => $unchecked > 0 + ? sprintf('%d Formular(e) in 7 Tagen angenommen, während Cloudflare nicht erreichbar war — im Verlauf (Typ „Ohne Bot-Prüfung“) nachprüfen.', $unchecked) + : 'In den letzten 7 Tagen wurde jedes Formular geprüft.', + ]; + // Herkunftsprüfung der Bild-Uploads (Bildkennzeichnung E.7): Fehler // der letzten sieben Tage zählen; Zustand D im Formular blockiert // nichts, muss aber sichtbar bleiben. @@ -341,6 +383,11 @@ class AdminSystemHealth return $checks; } + protected function imagickAvailable(): bool + { + return class_exists(\Imagick::class); + } + /** * @param array $queue */ diff --git a/app/Services/Analytics/UmamiClient.php b/app/Services/Analytics/UmamiClient.php new file mode 100644 index 00000000..1b949115 --- /dev/null +++ b/app/Services/Analytics/UmamiClient.php @@ -0,0 +1,166 @@ +` sucht nach „enthält“, Zeiten in Millisekunden. + */ +class UmamiClient +{ + private const string TOKEN_CACHE_KEY = 'umami.api-token'; + + /** Marken mit eigener Umami-Website. */ + public const array BRANDS = ['pressekonto', 'presseecho', 'businessportal24']; + + public function isConfigured(): bool + { + return filled(config('services.umami.api_url')) + && filled(config('services.umami.api_username')) + && filled(config('services.umami.api_password')); + } + + public function websiteId(string $brand): ?string + { + $id = config('domains.domains.'.$brand.'.brand.umami_website_id'); + + return is_string($id) && $id !== '' ? $id : null; + } + + /** + * Kennzahlen eines Zeitraums, optional gefiltert (z. B. `['path' => 'c.preise']`). + * + * @param array $filters + * @return array{pageviews: int, visitors: int, visits: int, bounces: int, totaltime: int} + */ + public function stats(string $websiteId, CarbonInterface $from, CarbonInterface $to, array $filters = []): array + { + $data = $this->get('/api/websites/'.$websiteId.'/stats', $this->range($from, $to) + $filters); + + return [ + 'pageviews' => (int) ($data['pageviews'] ?? 0), + 'visitors' => (int) ($data['visitors'] ?? 0), + 'visits' => (int) ($data['visits'] ?? 0), + 'bounces' => (int) ($data['bounces'] ?? 0), + 'totaltime' => (int) ($data['totaltime'] ?? 0), + ]; + } + + /** + * Rangliste einer Dimension: `path`, `referrer`, `channel`, `country`, + * `browser`, `os`, `device`, `event` … + * + * @param array $filters + * @return list + */ + public function metrics(string $websiteId, string $type, CarbonInterface $from, CarbonInterface $to, array $filters = [], int $limit = 10): array + { + $data = $this->get('/api/websites/'.$websiteId.'/metrics', $this->range($from, $to) + $filters + [ + 'type' => $type, + 'limit' => $limit, + ]); + + return array_values(array_map( + static fn (array $row): array => ['x' => (string) ($row['x'] ?? ''), 'y' => (int) ($row['y'] ?? 0)], + array_filter($data, 'is_array'), + )); + } + + /** + * @param array $query + * @return array + */ + private function get(string $path, array $query): array + { + $response = $this->send($path, $query, $this->token()); + + if ($response->status() === 401) { + Cache::forget(self::TOKEN_CACHE_KEY); + $response = $this->send($path, $query, $this->token()); + } + + if (! $response->successful()) { + throw new UmamiUnavailable(sprintf('Umami antwortet mit %d auf %s.', $response->status(), $path)); + } + + $data = $response->json(); + + return is_array($data) ? $data : []; + } + + /** + * @param array $query + */ + private function send(string $path, array $query, string $token): Response + { + try { + return Http::baseUrl($this->baseUrl()) + ->withToken($token) + ->acceptJson() + ->connectTimeout(5) + ->timeout((int) config('services.umami.api_timeout_seconds', 15)) + ->get($path, $query); + } catch (ConnectionException $e) { + throw new UmamiUnavailable('Umami nicht erreichbar.', previous: $e); + } + } + + private function token(): string + { + if (! $this->isConfigured()) { + throw new UmamiUnavailable('Umami-API nicht konfiguriert (UMAMI_API_URL, UMAMI_API_USERNAME, UMAMI_API_PASSWORD).'); + } + + return Cache::remember(self::TOKEN_CACHE_KEY, now()->addHours(12), function (): string { + try { + $response = Http::baseUrl($this->baseUrl()) + ->acceptJson() + ->connectTimeout(5) + ->timeout((int) config('services.umami.api_timeout_seconds', 15)) + ->post('/api/auth/login', [ + 'username' => (string) config('services.umami.api_username'), + 'password' => (string) config('services.umami.api_password'), + ]); + } catch (ConnectionException $e) { + throw new UmamiUnavailable('Umami nicht erreichbar.', previous: $e); + } + + $token = $response->json('token'); + + if (! $response->successful() || ! is_string($token) || $token === '') { + throw new UmamiUnavailable(sprintf('Umami-Anmeldung abgelehnt (%d).', $response->status())); + } + + return $token; + }); + } + + private function baseUrl(): string + { + return rtrim((string) config('services.umami.api_url'), '/'); + } + + /** + * @return array{startAt: int, endAt: int} + */ + private function range(CarbonInterface $from, CarbonInterface $to): array + { + return [ + 'startAt' => $from->getTimestampMs(), + 'endAt' => $to->getTimestampMs(), + ]; + } +} diff --git a/app/Services/Analytics/UmamiUnavailable.php b/app/Services/Analytics/UmamiUnavailable.php new file mode 100644 index 00000000..df7014e6 --- /dev/null +++ b/app/Services/Analytics/UmamiUnavailable.php @@ -0,0 +1,11 @@ +hasApiAccess($user); + } + + /** + * Gilt beim Erzeugen eines Tokens und bei jedem API-Aufruf + * (EnsureApiAccessIsBooked). + */ + public function hasApiAccess(User $user): bool { return $this->denialReason($user) === null; } diff --git a/app/Services/Auth/ContactAccessService.php b/app/Services/Auth/ContactAccessService.php index 012573cf..1cf3e931 100644 --- a/app/Services/Auth/ContactAccessService.php +++ b/app/Services/Auth/ContactAccessService.php @@ -119,13 +119,14 @@ class ContactAccessService * (`granted_via = manual`) bleiben, ebenso Mitgliedschaften aus der * API-Zuordnung (`granted_via = api`, Audit R-01) — ihre Grundlage ist * die Freischaltung des Einlieferers, nicht die E-Mail. + * + * Neben Login und E-Mail-Bestätigung ruft auch der + * CompanyMembershipObserver diese Methode auf, sobald sich Kontakt- oder + * Firmenadressen bzw. Kontaktzuordnungen ändern — der Entzug greift damit + * in der laufenden Session (Sicherheitsaudit 07.10.2026, S-03). */ public function syncMembershipsForEmail(User $user): void { - if (! $user->is_active || ! $user->hasVerifiedEmail()) { - return; - } - $email = mb_strtolower(trim((string) $user->email)); if ($email === '') { @@ -136,9 +137,15 @@ class ContactAccessService $companies = $this->companiesFor($email); $companyIds = $this->companyIdsFrom($contacts, $companies); + // Entzogen wird nur, was keine E-Mail-Grundlage mehr hat — unabhängig + // vom Kontostatus (S-03). Bestandskonten aus dem Altsystem haben kein + // `email_verified_at`; ihre noch begründeten Rechte bleiben. Eine + // erste Fassung entzog Unverifizierten pauschal alles und nahm beim + // Abgleich am 07.10.2026 so 19.598 begründete Rechte weg (v1.4.1). $this->revokeStaleAutomaticGrants($user, $companyIds); - if ($companyIds->isEmpty()) { + // Neue Rechte nur für aktive Konten mit nachgewiesener Adresse (F01). + if (! $user->is_active || ! $user->hasVerifiedEmail() || $companyIds->isEmpty()) { return; } diff --git a/app/Services/Auth/LoginIpThrottle.php b/app/Services/Auth/LoginIpThrottle.php new file mode 100644 index 00000000..90c3dcf1 --- /dev/null +++ b/app/Services/Auth/LoginIpThrottle.php @@ -0,0 +1,43 @@ +key($ip), self::DECAY_SECONDS); + } + + public function isBlocked(?string $ip): bool + { + return RateLimiter::tooManyAttempts($this->key($ip), self::MAX_FAILURES); + } + + public function availableIn(?string $ip): int + { + return RateLimiter::availableIn($this->key($ip)); + } + + private function key(?string $ip): string + { + return 'login-failures-ip|'.($ip ?? 'unknown'); + } +} diff --git a/app/Services/Auth/MailAccessLink.php b/app/Services/Auth/MailAccessLink.php new file mode 100644 index 00000000..b2eb012a --- /dev/null +++ b/app/Services/Auth/MailAccessLink.php @@ -0,0 +1,63 @@ +addDays(self::VALID_DAYS), [ + 't' => Crypt::encryptString((string) json_encode([ + 'e' => mb_strtolower(trim($email)), + 'p' => $pressRelease->getKey(), + ])), + 'src' => $source->value, + 'pr' => $pressRelease->getKey(), + ]); + } + + /** + * @return array{email: string, press_release_id: int}|null + */ + public function decode(?string $token): ?array + { + if (blank($token)) { + return null; + } + + try { + $data = json_decode(Crypt::decryptString((string) $token), true); + } catch (DecryptException) { + return null; + } + + if (! is_array($data) || ! is_string($data['e'] ?? null) || ! filter_var($data['e'], FILTER_VALIDATE_EMAIL) || (int) ($data['p'] ?? 0) <= 0) { + return null; + } + + return ['email' => $data['e'], 'press_release_id' => (int) $data['p']]; + } +} diff --git a/app/Services/Auth/PasswordChanger.php b/app/Services/Auth/PasswordChanger.php new file mode 100644 index 00000000..cedcafed --- /dev/null +++ b/app/Services/Auth/PasswordChanger.php @@ -0,0 +1,41 @@ +forceFill([ + 'password' => Hash::make($plainPassword), + 'remember_token' => Str::random(60), + ])->save(); + + if ($currentSession !== null) { + $this->sessions->revokeOthersFor($user, $currentSession); + } else { + $this->sessions->revokeAllFor($user); + } + + $this->notifier->notify($user, SecurityChange::PasswordChanged); + } +} diff --git a/app/Services/Auth/SecurityConfirmation.php b/app/Services/Auth/SecurityConfirmation.php new file mode 100644 index 00000000..31f051a6 --- /dev/null +++ b/app/Services/Auth/SecurityConfirmation.php @@ -0,0 +1,121 @@ +getKey() + && (int) ($confirmed['at'] ?? 0) >= now()->getTimestamp() - self::FRESH_FOR_SECONDS; + } + + public function markConfirmed(User $user): void + { + Session::put(self::SESSION_KEY, [ + 'user_id' => $user->getKey(), + 'at' => now()->getTimestamp(), + ]); + } + + /** + * Schickt einen 6-stelligen Code an die aktuelle Kontoadresse. Liefert + * false, wenn zu viele Codes angefordert wurden (3 je 10 Minuten). + */ + public function sendEmailCode(User $user): bool + { + $throttleKey = 'security-email-code-send:'.$user->getKey(); + + if (RateLimiter::tooManyAttempts($throttleKey, 3)) { + return false; + } + + RateLimiter::hit($throttleKey, 600); + + $code = str_pad((string) random_int(0, 999999), 6, '0', STR_PAD_LEFT); + $expiresAt = now()->addMinutes(self::CODE_VALID_MINUTES); + + Cache::put($this->codeKey($user), [ + 'hash' => $this->hash($code), + 'attempts' => 0, + 'expires_at' => $expiresAt->getTimestamp(), + ], $expiresAt); + + Mail::to($user->email)->queue((new SecurityConfirmationCode( + user: $user, + code: $code, + expiresAt: $expiresAt->format('H:i'), + ))->afterCommit()); + + return true; + } + + /** + * Prüft den Code; er ist nur einmal gültig und nach + * MAX_CODE_ATTEMPTS Fehlversuchen verbraucht. + */ + public function verifyEmailCode(User $user, string $code): bool + { + $key = $this->codeKey($user); + $entry = Cache::get($key); + + if (! is_array($entry) || (int) ($entry['expires_at'] ?? 0) < now()->getTimestamp()) { + return false; + } + + if (hash_equals((string) $entry['hash'], $this->hash(trim($code)))) { + Cache::forget($key); + + return true; + } + + $entry['attempts'] = (int) $entry['attempts'] + 1; + + if ($entry['attempts'] >= self::MAX_CODE_ATTEMPTS) { + Cache::forget($key); + } else { + Cache::put($key, $entry, now()->setTimestamp((int) $entry['expires_at'])); + } + + return false; + } + + private function codeKey(User $user): string + { + return 'security-email-code:'.$user->getKey(); + } + + private function hash(string $code): string + { + return hash_hmac('sha256', $code, (string) config('app.key')); + } +} diff --git a/app/Services/Auth/SecurityNotifier.php b/app/Services/Auth/SecurityNotifier.php new file mode 100644 index 00000000..8f757f13 --- /dev/null +++ b/app/Services/Auth/SecurityNotifier.php @@ -0,0 +1,36 @@ +email)); + + if ($recipient === '') { + return; + } + + Mail::to($recipient)->queue((new SecurityChangeNotice( + user: $user, + change: $change, + occurredAt: now()->format('d.m.Y H:i'), + newEmail: $newEmail, + ))->afterCommit()); + } +} diff --git a/app/Services/Auth/SessionRevocation.php b/app/Services/Auth/SessionRevocation.php index e32901a5..aae87758 100644 --- a/app/Services/Auth/SessionRevocation.php +++ b/app/Services/Auth/SessionRevocation.php @@ -5,7 +5,7 @@ namespace App\Services\Auth; use App\Models\User; use Illuminate\Auth\Events\Login; use Illuminate\Contracts\Session\Session; -use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; /** * Beendet alle offenen Browser-Sessions eines Kontos (Umsetzungsaudit @@ -16,10 +16,12 @@ use Illuminate\Support\Facades\Cache; * ein Zeitstempel je Konto: Jede Anmeldung schreibt ihren Zeitpunkt in die * Session (`Login`-Event), `revokeAllFor()` merkt sich „ungültig vor jetzt", * und die Middleware EnsureSessionIsNotRevoked meldet jede ältere Session - * beim nächsten Request ab. Die Marke lebt so lange wie eine Session - * (`session.lifetime`) — danach ist jede ältere Session ohnehin abgelaufen. - * Remember-Cookies deckt das Rotieren von `remember_token` ab, API-Tokens - * löscht der Aufrufer. + * beim nächsten Request ab. Remember-Cookies deckt das Rotieren von + * `remember_token` ab, API-Tokens löscht der Aufrufer. + * + * Die Marke steht seit v1.6.0 in `users.sessions_revoked_at_ms` und übersteht + * so ein Leeren des Caches (Sicherheitsaudit 07.10.2026, Phase 4). Die + * Middleware liest sie am ohnehin geladenen User — kein zusätzlicher Zugriff. */ class SessionRevocation { @@ -31,13 +33,41 @@ class SessionRevocation /** * Alle bis jetzt entstandenen Sessions des Kontos werden ungültig. */ - public function revokeAllFor(User $user): void + public function revokeAllFor(User $user): int { - Cache::put( - $this->cacheKey((int) $user->getKey()), - now()->getTimestampMs(), - now()->addMinutes(max(1, (int) config('session.lifetime', 120)) + 5), - ); + $revokedAt = now()->getTimestampMs(); + + // Ohne Model-Events und ohne updated_at: Die Marke ist keine + // inhaltliche Änderung am Konto und soll keine Observer auslösen. + $user->newQuery()->whereKey($user->getKey())->update(['sessions_revoked_at_ms' => $revokedAt]); + $user->forceFill(['sessions_revoked_at_ms' => $revokedAt])->syncOriginalAttribute('sessions_revoked_at_ms'); + + return $revokedAt; + } + + /** + * Alle anderen Sessions des Kontos werden ungültig, die übergebene + * (aktuelle) bleibt angemeldet: Sie erhält einen Anmeldezeitpunkt nach + * der Sperre und eine neue Session-ID (Sicherheitsaudit 07.10.2026, S-04). + */ + public function revokeOthersFor(User $user, Session $current): void + { + $revokedAt = $this->revokeAllFor($user); + + $current->put(self::SESSION_KEY, $revokedAt + 1); + $current->migrate(true); + } + + /** + * „Andere Geräte abmelden“ auf der Sicherheitsseite: Remember-Cookies + * anderer Geräte werden ungültig (neuer `remember_token`), alle anderen + * Sessions enden beim nächsten Request, die aktuelle bleibt angemeldet. + */ + public function logoutOtherDevices(User $user, Session $current): void + { + $user->forceFill(['remember_token' => Str::random(60)])->save(); + + $this->revokeOthersFor($user, $current); } /** @@ -57,19 +87,14 @@ class SessionRevocation * Session stammt aus der Zeit vor der letzten Sperre dieses Kontos. * Ohne Anmeldezeitpunkt (Session von vor dem Deploy) gilt sie als alt. */ - public function isRevoked(int $userId, Session $session): bool + public function isRevoked(User $user, Session $session): bool { - $revokedAt = Cache::get($this->cacheKey($userId)); + $revokedAt = (int) $user->sessions_revoked_at_ms; - if ($revokedAt === null) { + if ($revokedAt === 0) { return false; } - return (int) $session->get(self::SESSION_KEY, 0) < (int) $revokedAt; - } - - private function cacheKey(int $userId): string - { - return 'auth.sessions-revoked-at.'.$userId; + return (int) $session->get(self::SESSION_KEY, 0) < $revokedAt; } } diff --git a/app/Services/Auth/SocialAccountLinker.php b/app/Services/Auth/SocialAccountLinker.php new file mode 100644 index 00000000..fda0addc --- /dev/null +++ b/app/Services/Auth/SocialAccountLinker.php @@ -0,0 +1,90 @@ +getKey(); + + if (RateLimiter::tooManyAttempts($throttleKey, 3)) { + return false; + } + + RateLimiter::hit($throttleKey, 600); + + $expiresAt = now()->addMinutes(self::EXPIRES_IN_MINUTES); + + Session::put(self::SESSION_KEY, [ + 'user_id' => $user->getKey(), + 'provider' => $provider, + 'provider_id' => $providerId, + 'expires_at' => $expiresAt->getTimestamp(), + ]); + + $confirmUrl = URL::temporarySignedRoute('oauth.google.confirm-link', $expiresAt, [ + 'user' => $user->getKey(), + 'provider_id' => $providerId, + ]); + + Mail::to($user->email)->queue((new SocialAccountLinkConfirmation( + user: $user, + confirmUrl: $confirmUrl, + expiresAt: $expiresAt->format('H:i'), + ))->afterCommit()); + + return true; + } + + /** + * Speichert die vorgemerkte Verknüpfung, wenn sie zu dieser Session, + * diesem Konto und dieser Provider-Identität gehört. + */ + public function confirm(User $user, string $providerId): bool + { + $pending = Session::pull(self::SESSION_KEY); + + if (! is_array($pending) + || (int) ($pending['user_id'] ?? 0) !== (int) $user->getKey() + || ! hash_equals((string) ($pending['provider_id'] ?? ''), $providerId) + || (int) ($pending['expires_at'] ?? 0) < now()->getTimestamp()) { + return false; + } + + if (filled($user->oauth_provider_id)) { + return hash_equals((string) $user->oauth_provider_id, $providerId); + } + + $this->social->link($user, (string) $pending['provider'], $providerId); + + return true; + } +} diff --git a/app/Services/Auth/SocialAuthService.php b/app/Services/Auth/SocialAuthService.php index fec72863..13862c5f 100644 --- a/app/Services/Auth/SocialAuthService.php +++ b/app/Services/Auth/SocialAuthService.php @@ -2,47 +2,79 @@ namespace App\Services\Auth; +use App\Enums\SecurityChange; use App\Models\User; use Illuminate\Support\Str; /** * Auflösung eines Social-Logins (Google, ggf. weitere) auf einen lokalen User. * - * Identität ist die E-Mail (De-Dup darüber, keine Dubletten). Der Provider - * bestätigt die E-Mail, daher gilt die Verifizierung über den Kanal als erfüllt - * (Entscheidung 15.06.) – kein zusätzlicher E-Mail-Verifizierungsschritt. + * Reihenfolge (Sicherheitsaudit 07.10.2026, S-05): + * 1. Ohne vom Provider bestätigte E-Mail (`email_verified`) kein Login. + * 2. Eine bereits verknüpfte Provider-Identität (`oauth_provider_id`) ist + * die stabile Bindung und gewinnt vor der E-Mail. + * 3. Sonst De-Dup über die E-Mail. Ein Konto, das schon mit einer ANDEREN + * Identität desselben Providers verknüpft ist, wird nicht still + * umgehängt. + * 4. Die Erstverknüpfung eines bestehenden, verifizierten Kontos erfolgt + * direkt nur, wenn Google für das Postfach zuständig ist (gmail.com bzw. + * Workspace-Domain `hd`). Bei sonstigen Adressen belegt Google den + * aktuellen Postfachbesitz nicht — dann erst nach Bestätigungslink an die + * Adresse (SocialAccountLinker). + * + * Neue Konten und noch unverifizierte Selbst-Registrierer werden wie bisher + * direkt angelegt bzw. übernommen (Entscheidung 15.06., Audit K-04). */ class SocialAuthService { + /** + * Domains, deren Postfächer Google selbst betreibt. + */ + private const GOOGLE_MAIL_DOMAINS = ['gmail.com', 'googlemail.com']; + public function __construct( private readonly UserRolePermissionSyncService $roleSync, private readonly CustomerAccountProvisioner $accountProvisioner, private readonly SessionRevocation $sessions, + private readonly SecurityNotifier $notifier, ) {} /** - * Liefert den (ggf. neu angelegten) User zur Social-Identität. Ein - * deaktivierter Bestands-Account wird NICHT reaktiviert – der Aufrufer prüft - * danach is_active und blockiert. + * Ein deaktivierter Bestands-Account wird NICHT reaktiviert – der Aufrufer + * prüft danach is_active und blockiert. */ - public function resolveUser(string $provider, string $providerId, ?string $email, ?string $name): ?User - { + public function resolve( + string $provider, + string $providerId, + ?string $email, + ?string $name, + bool $emailVerified, + ?string $hostedDomain = null, + ): SocialLoginResult { $email = $email ? mb_strtolower(trim($email)) : null; - if ($email === null || $email === '') { - return null; + if ($email === null || $email === '' || ! $emailVerified || $providerId === '') { + return SocialLoginResult::unverifiedEmail(); + } + + $linked = User::query() + ->where('oauth_provider', $provider) + ->where('oauth_provider_id', $providerId) + ->first(); + + if ($linked) { + return SocialLoginResult::login($linked); } $user = User::findByEmail($email); if (! $user) { - return $this->createUser($provider, $providerId, $email, $name); + return SocialLoginResult::login($this->createUser($provider, $providerId, $email, $name)); } - $user->forceFill([ - 'oauth_provider' => $provider, - 'oauth_provider_id' => $providerId, - ]); + if (filled($user->oauth_provider_id)) { + return SocialLoginResult::providerMismatch($user); + } // Noch nicht verifiziert (offener Selbst-Registrierer): der Provider // bestätigt die E-Mail → Onboarding abschließen (aktiv + customer). @@ -54,6 +86,8 @@ class SocialAuthService // oder Magic Link an und setzt bei Bedarf selbst ein Passwort. if ($user->email_verified_at === null) { $user->forceFill([ + 'oauth_provider' => $provider, + 'oauth_provider_id' => $providerId, 'email_verified_at' => now(), 'is_active' => true, 'password' => null, @@ -68,14 +102,47 @@ class SocialAuthService $this->roleSync->assignRoleAndSyncPermissions($user, 'customer'); } - return $user; + return SocialLoginResult::login($user); + } + + if (! $this->providerOwnsMailbox($email, $hostedDomain)) { + return SocialLoginResult::confirmLink($user); } // Bereits verifiziert: nur Provider verknüpfen. is_active bleibt // unangetastet (deaktivierte Accounts werden nicht reaktiviert). - $user->save(); + $this->link($user, $provider, $providerId); - return $user; + return SocialLoginResult::login($user); + } + + /** + * Verknüpft die Provider-Identität mit einem bestehenden Konto und + * informiert den Kontoinhaber darüber. + */ + public function link(User $user, string $provider, string $providerId): void + { + $user->forceFill([ + 'oauth_provider' => $provider, + 'oauth_provider_id' => $providerId, + ])->save(); + + $this->notifier->notify($user, SecurityChange::GoogleLinked); + } + + /** + * Google ist für das Postfach zuständig: eigene Mail-Domain oder eine + * Workspace-Domain (`hd`), zu der die Adresse gehört. + */ + private function providerOwnsMailbox(string $email, ?string $hostedDomain): bool + { + $domain = Str::afterLast($email, '@'); + + if (in_array($domain, self::GOOGLE_MAIL_DOMAINS, true)) { + return true; + } + + return filled($hostedDomain) && strcasecmp(trim($hostedDomain), $domain) === 0; } private function createUser(string $provider, string $providerId, string $email, ?string $name): User diff --git a/app/Services/Auth/SocialLoginResult.php b/app/Services/Auth/SocialLoginResult.php new file mode 100644 index 00000000..6bfa075a --- /dev/null +++ b/app/Services/Auth/SocialLoginResult.php @@ -0,0 +1,47 @@ +is_super_admin || $user->hasRole('admin'); + } + + public function isSatisfiedBy(User $user): bool + { + $strong = Session::get(self::SESSION_KEY); + + return is_array($strong) && (int) ($strong['user_id'] ?? 0) === (int) $user->getKey(); + } + + /** + * @param string $method passkey oder totp + */ + public function mark(User $user, string $method): void + { + Session::put(self::SESSION_KEY, [ + 'user_id' => $user->getKey(), + 'method' => $method, + 'at' => now()->getTimestamp(), + ]); + } + + public function hasPasskeys(User $user): bool + { + return $user->passkeys()->exists(); + } +} diff --git a/app/Services/Billing/ManualInvoiceDunningService.php b/app/Services/Billing/ManualInvoiceDunningService.php index e533c94e..0dfe87de 100644 --- a/app/Services/Billing/ManualInvoiceDunningService.php +++ b/app/Services/Billing/ManualInvoiceDunningService.php @@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Mail; /** * Bearbeitungsweg einer MAN-Rechnung nach der Ausstellung (Legacy- - * Überweisungskunden, dev/lagacy-rechnungen/entwicklungsplan-2026-09-16.md): + * Überweisungskunden, dev/archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md): * * senden → (erinnern) → als bezahlt markieren * → Bestandsschutz beenden (Rechnung storniert, Bündel gekündigt) diff --git a/app/Services/Changelog/ChangelogCollector.php b/app/Services/Changelog/ChangelogCollector.php new file mode 100644 index 00000000..8e3a694b --- /dev/null +++ b/app/Services/Changelog/ChangelogCollector.php @@ -0,0 +1,209 @@ +} + */ + public function collect(string $from, string $to, ?Carbon $releasedOn = null, bool $dryRun = false): array + { + $releasedOn ??= Carbon::today(); + $created = 0; + $existing = 0; + $internal = 0; + $entries = []; + $hasSecurity = false; + + foreach ($this->commits($from, $to) as $commit) { + $trailers = self::parse($commit['message']); + + if ($trailers === null) { + $internal++; + + continue; + } + + [$category, $note] = $this->categoryFor($trailers['category'], $commit['subject']); + + if ($category === ChangelogCategory::Security) { + $hasSecurity = true; + + continue; + } + + $text = $trailers['public']; + + if ($text === null) { + $text = self::suggestionFrom($commit['subject']); + $note ??= 'Kein Public-Satz im Commit — Vorschlag aus dem Commit-Titel.'; + } + + $result = $this->store($commit['hash'], $releasedOn, $to, $category, $text, $commit['subject'], $note, $dryRun); + $result['created'] ? $created++ : $existing++; + $entries[] = $result['entry']; + } + + if ($hasSecurity) { + $result = $this->store('security:'.$to, $releasedOn, $to, ChangelogCategory::Security, ChangelogCategory::SECURITY_LINE, null, null, $dryRun); + $result['created'] ? $created++ : $existing++; + $entries[] = $result['entry']; + } + + return ['created' => $created, 'existing' => $existing, 'internal' => $internal, 'entries' => $entries]; + } + + /** + * Zeilen `Changelog:` und `Public:` aus einer Commit-Nachricht. Null, wenn + * es keine gültige `Changelog:`-Zeile gibt. + * + * @return array{category: ChangelogCategory, public: string|null}|null + */ + public static function parse(string $message): ?array + { + if (! preg_match('/^Changelog:[ \t]*(.+)$/mi', $message, $categoryMatch)) { + return null; + } + + $category = ChangelogCategory::fromTrailer($categoryMatch[1]); + + if ($category === null) { + return null; + } + + $public = null; + + // Public darf umbrechen: bis zur nächsten Leerzeile oder Trailer-Zeile. + if (preg_match('/^Public:[ \t]*(.+(?:\n(?![ \t]*\n)(?![A-Za-z-]+:[ \t]).+)*)/mi', $message, $publicMatch)) { + $public = trim((string) preg_replace('/\s+/', ' ', $publicMatch[1])); + $public = $public === '' ? null : $public; + } + + return ['category' => $category, 'public' => $public]; + } + + /** + * Vorschlag aus dem Commit-Titel: ohne Bereichspräfix (`web: …`), erster + * Buchstabe groß, mit Punkt. + */ + public static function suggestionFrom(string $subject): string + { + $text = trim((string) preg_replace('/^[a-z][\w-]*(\([^)]*\))?!?:\s*/i', '', $subject)); + + return rtrim(mb_strtoupper(mb_substr($text, 0, 1)).mb_substr($text, 1), '.').'.'; + } + + /** + * @return array{0: ChangelogCategory, 1: string|null} + */ + private function categoryFor(ChangelogCategory $category, string $subject): array + { + if ($category === ChangelogCategory::Security) { + return [$category, null]; + } + + $lower = mb_strtolower($subject); + + foreach (self::SECURITY_TERMS as $term) { + if (preg_match('/\b'.preg_quote($term, '/').'\b/u', $lower)) { + return [ChangelogCategory::Security, sprintf('Automatisch auf Sicherheit gesetzt („%s“ im Titel, Rubrik war %s) — zurückstufen nur bewusst.', $term, $category->label())]; + } + } + + return [$category, null]; + } + + /** + * @return array{created: bool, entry: ChangelogEntry} + */ + private function store(string $key, Carbon $releasedOn, string $tag, ChangelogCategory $category, string $text, ?string $subject, ?string $note, bool $dryRun): array + { + $existing = ChangelogEntry::query()->where('source_key', $key)->first(); + + if ($existing !== null) { + return ['created' => false, 'entry' => $existing]; + } + + $entry = new ChangelogEntry([ + 'released_on' => $releasedOn->toDateString(), + 'release_tag' => mb_substr($tag, 0, 20), + 'category' => $category, + 'text' => mb_substr($text, 0, 500), + 'status' => ChangelogStatus::Draft, + 'source_key' => $key, + 'commit_subject' => $subject === null ? null : mb_substr($subject, 0, 255), + 'review_note' => $note === null ? null : mb_substr($note, 0, 255), + ]); + + if (! $dryRun) { + $entry->save(); + } + + return ['created' => true, 'entry' => $entry]; + } + + /** + * Commits von `$from` (ausschließlich) bis `$to`, älteste zuerst, ohne + * Merges. + * + * @return list + */ + private function commits(string $from, string $to): array + { + $result = Process::path($this->repositoryPath ?? base_path())->run([ + 'git', 'log', '--no-merges', '--reverse', '--format=%H%x1f%s%x1f%B%x1e', $from.'..'.$to, + ]); + + if (! $result->successful()) { + throw new RuntimeException(sprintf('git log %s..%s fehlgeschlagen: %s', $from, $to, trim($result->errorOutput()))); + } + + $commits = []; + + foreach (explode("\x1e", $result->output()) as $record) { + $parts = explode("\x1f", trim($record), 3); + + if (count($parts) === 3 && $parts[0] !== '') { + $commits[] = ['hash' => $parts[0], 'subject' => $parts[1], 'message' => $parts[2]]; + } + } + + return $commits; + } +} diff --git a/app/Services/Changelog/ChangelogTimeline.php b/app/Services/Changelog/ChangelogTimeline.php new file mode 100644 index 00000000..4f126858 --- /dev/null +++ b/app/Services/Changelog/ChangelogTimeline.php @@ -0,0 +1,69 @@ + + */ + public function entries(int $limit = 200): Collection + { + $entries = ChangelogEntry::query() + ->published() + ->orderByDesc('released_on') + ->orderBy('id') + ->limit($limit) + ->get(); + + $seenSecurityDays = []; + + return $entries + ->filter(function (ChangelogEntry $entry) use (&$seenSecurityDays): bool { + if ($entry->category !== ChangelogCategory::Security) { + return true; + } + + $day = $entry->released_on->toDateString(); + + if (isset($seenSecurityDays[$day])) { + return false; + } + + $seenSecurityDays[$day] = true; + + return true; + }) + ->sortBy([ + fn (ChangelogEntry $a, ChangelogEntry $b): int => $b->released_on <=> $a->released_on, + fn (ChangelogEntry $a, ChangelogEntry $b): int => $a->category->order() <=> $b->category->order(), + fn (ChangelogEntry $a, ChangelogEntry $b): int => $a->id <=> $b->id, + ]) + ->values(); + } + + /** + * Gibt es einen freigegebenen Eintrag der letzten Tage? Für den + * „Neu“-Hinweis im Kundenbereich (E11). + */ + public function hasRecent(int $days = 14): bool + { + return ChangelogEntry::query() + ->published() + ->where('released_on', '>=', Carbon::today()->subDays($days)->toDateString()) + ->exists(); + } +} diff --git a/app/Services/Conversion/ConversionRecorder.php b/app/Services/Conversion/ConversionRecorder.php index 3d09e1b7..447640ee 100644 --- a/app/Services/Conversion/ConversionRecorder.php +++ b/app/Services/Conversion/ConversionRecorder.php @@ -10,6 +10,9 @@ use App\Models\MagicLink; use App\Models\PressRelease; use App\Models\User; use App\Scopes\PortalScope; +use App\Support\CrawlerIdentifier; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\RateLimiter; /** * Schreibt die Ereignisse der Konversionsleiter (Roadmap 0.5). @@ -73,6 +76,83 @@ class ConversionRecorder $this->record($type, $source, $company, $pressRelease); } + /** + * Stufe 2: die Seite „Diesen Newsroom verwalten“ wurde geöffnet. + * + * Aus einer Mail (`src`) oder über den Hinweis auf der Newsroom- bzw. + * Meldungsseite. Wie beim Mail-Klick zählen nur echte Aufrufe, und + * dieselbe Adresse zählt je Firma höchstens einmal im Zeitfenster. + */ + public function recordManagePageOpened(Request $request, Company $company, ConversionSource $source, ?PressRelease $pressRelease = null): void + { + try { + if (! $request->isMethod('GET') || $this->isAutomatedVisit($request->userAgent())) { + return; + } + + $key = 'manage-page:'.hash('sha256', (string) $request->ip()).':'.$company->getKey(); + $decay = max(1, (int) config('conversion.mail_clicks.throttle_minutes', 30)) * 60; + + if (! RateLimiter::attempt($key, 1, static fn (): bool => true, $decay)) { + return; + } + } catch (\Throwable $e) { + report($e); + + return; + } + + $this->record(ConversionEventType::ManagePageOpened, $source, $company, $pressRelease); + } + + /** + * Stufe 4: Magic Link eingelöst — mit der Firma und Meldung, die das + * Token trägt („Diesen Newsroom verwalten“, Veröffentlichungsmail). + * Ohne diesen Bezug landete jede Einlösung in „ohne Firma“, und die + * Stufe zeigte bis 13.10.2026 immer null Firmen (Roadmap 6.16). + */ + public function recordMagicLinkConsumed(MagicLink $magicLink): void + { + try { + $companyId = (int) ($magicLink->payload['company_id'] ?? 0); + $pressReleaseId = (int) ($magicLink->payload['press_release_id'] ?? 0); + + $company = $companyId > 0 + ? Company::query()->withoutGlobalScope(PortalScope::class)->find($companyId) + : null; + $pressRelease = $pressReleaseId > 0 + ? PressRelease::query()->withoutGlobalScope(PortalScope::class)->find($pressReleaseId) + : null; + } catch (\Throwable $e) { + report($e); + $company = null; + $pressRelease = null; + } + + $this->record(ConversionEventType::MagicLinkConsumed, $this->sourceOf($magicLink), $company, $pressRelease); + } + + /** + * Mailserver-Scanner, Vorschau-Dienste und Crawler — kein Mensch, also + * kein Schritt in der Leiter (Umsetzungsaudit 29.09.2026, R-08). + */ + public function isAutomatedVisit(?string $userAgent): bool + { + $userAgent = mb_strtolower(trim((string) $userAgent)); + + if ($userAgent === '' || CrawlerIdentifier::identify($userAgent) !== null) { + return true; + } + + foreach ((array) config('conversion.mail_clicks.scanner_agents', []) as $pattern) { + if (str_contains($userAgent, mb_strtolower((string) $pattern))) { + return true; + } + } + + return false; + } + /** * Herkunft eines Magic-Link-Tokens. * @@ -102,13 +182,17 @@ class ConversionRecorder } /** - * Stufe 5 der Konversionsleiter. + * Stufe 7 der Konversionsleiter. * * Der Trichter läuft über die FIRMA, gezahlt wird aber vom Konto. Die * Brücke ist die Firma des Kontos — bevorzugt die eigene, sonst die erste * zugeordnete. Ohne Firma bleibt der Bezug leer; das Ereignis ist dann * für die Trichter-Auswertung wertlos, aber immer noch eine ehrliche Zeile * im Log. + * + * Die Herkunft ist wie bei Stufe 5 die des letzten eingelösten Magic + * Links; bis 13.10.2026 stand hier immer `organic`, auch nach einem + * Claim aus der Veröffentlichungsmail (Roadmap 6.16). */ public function recordFirstBooking(?User $user): void { @@ -125,11 +209,11 @@ class ConversionRecorder return; } - $this->recordOnce(ConversionEventType::FirstBooking, ConversionSource::Organic, $company); + $this->recordOnce(ConversionEventType::FirstBooking, $this->lastMagicLinkSource($user), $company); } /** - * Stufe 3 der Konversionsleiter: Newsroom gepflegt (Roadmap 1b.3). + * Stufe 5 der Konversionsleiter: Newsroom gepflegt (Roadmap 1b.3). * * Einmal je Firma. Die Herkunft ist die des letzten eingelösten Magic * Links dieses Kontos — wer über „Diesen Newsroom verwalten" aus der Mail @@ -138,8 +222,17 @@ class ConversionRecorder */ public function recordNewsroomEdited(Company $company, ?User $user): void { + $this->recordOnce(ConversionEventType::NewsroomEdited, $this->lastMagicLinkSource($user), $company); + } + + private function lastMagicLinkSource(?User $user): ConversionSource + { + if ($user === null) { + return ConversionSource::Organic; + } + try { - $source = $user === null ? null : MagicLink::query() + $source = MagicLink::query() ->where('user_id', $user->getKey()) ->whereIn('purpose', MagicLink::LOGIN_PURPOSES) ->whereNotNull('consumed_at') @@ -150,7 +243,7 @@ class ConversionRecorder $source = null; } - $this->recordOnce(ConversionEventType::NewsroomEdited, ConversionSource::parse($source), $company); + return ConversionSource::parse($source); } private function alreadyRecorded(ConversionEventType $type, Company $company): bool diff --git a/app/Services/Growth/GrowthReport.php b/app/Services/Growth/GrowthReport.php new file mode 100644 index 00000000..a21e1395 --- /dev/null +++ b/app/Services/Growth/GrowthReport.php @@ -0,0 +1,271 @@ +>}>, + * umami: array{configured: bool, error: string|null}, + * pages: list, + * } + */ + public function build(bool $fresh = false, ?Carbon $now = null): array + { + $now ??= Carbon::now(); + $start = Carbon::parse((string) config('growth.period.start'))->startOfDay(); + $review = Carbon::parse((string) config('growth.period.review'))->startOfDay(); + $end = Carbon::parse((string) config('growth.period.end'))->endOfDay(); + $elapsedShare = $now->lessThanOrEqualTo($start) ? 0.0 : min(1.0, $start->diffInSeconds($now) / max(1, $start->diffInSeconds($end))); + $ended = $now->greaterThan($end); + + $umami = $this->searchViews($fresh, $now); + + return [ + 'period' => ['start' => $start, 'review' => $review, 'end' => $end, 'elapsed_share' => $elapsedShare], + 'blocks' => [ + [ + 'key' => 'block1', + 'title' => 'Block 1 — Konversion aus dem Bestand', + 'consequence' => 'Wenn verfehlt: Block 1 einfrieren, Gewicht auf Block 3.', + 'criteria' => [ + $this->criterion('claims', 'Firmen mit eingelöstem Verwaltungslink', $this->claimedCompanies($start), (int) config('growth.block1.claims_min'), $elapsedShare, $ended, cumulative: true, + note: $this->claimsWithoutCompanyNote($start)), + $this->criterion('bookings', 'Erstbuchungen über Mail oder Claim', $this->companiesWith(ConversionEventType::FirstBooking, $start), (int) config('growth.block1.bookings_min'), $elapsedShare, $ended, cumulative: true), + $this->criterion('reject_clicks', 'Klicks aus der Ablehnungsmail', $this->rejectMailClicks($start), (int) config('growth.block1.reject_clicks_min'), $elapsedShare, $ended, cumulative: true), + ], + ], + [ + 'key' => 'block2', + 'title' => 'Block 2 — Organische Sichtbarkeit', + 'consequence' => 'Wenn verfehlt: Marketing-Teil nicht weiter ausbauen, nur 2.1 bis 2.3 behalten.', + 'criteria' => [ + $this->criterion('search_views', 'Aufrufe der Transparenzseiten aus der Suche (30 Tage)', $umami['total'], (int) config('growth.block2.search_views_min'), $elapsedShare, $ended, cumulative: false, + note: $umami['error'] ?? 'Gewertet wird der Monat '.Carbon::parse((string) config('growth.block2.evaluation_month').'-01')->locale('de')->isoFormat('MMMM YYYY').'.'), + ], + ], + [ + 'key' => 'block3', + 'title' => 'Block 3 — Reichweite', + 'consequence' => 'Wenn verfehlt: RSS ist kein Verkaufsargument; der Digest muss sich eigenständig begründen.', + 'criteria' => [ + $this->criterion('feed_subscribers', 'Gemeldete Feed-Abonnenten (30 Tage)', $this->feedSubscribers(), (int) config('growth.block3.feed_subscribers_min'), $elapsedShare, $ended, cumulative: false, + note: 'Nur Reader-Dienste, die Abonnenten im User-Agent melden (Feedly, Inoreader …).'), + ], + ], + ], + 'umami' => ['configured' => $this->umami->isConfigured(), 'error' => $umami['error']], + 'pages' => $umami['pages'], + ]; + } + + public static function statusLabel(string $status): string + { + return match ($status) { + 'reached' => 'erreicht', + 'on_track' => 'auf Kurs', + 'behind' => 'hinter Plan', + 'open' => 'noch nicht erreicht', + 'missed' => 'verfehlt', + default => 'keine Daten', + }; + } + + /** + * Flux-Badge-Farbe je Status. + */ + public static function statusColor(string $status): string + { + return match ($status) { + 'reached', 'on_track' => 'green', + 'behind', 'open' => 'amber', + 'missed' => 'red', + default => 'zinc', + }; + } + + /** + * @return array + */ + private function criterion(string $key, string $label, ?int $actual, int $threshold, float $elapsedShare, bool $ended, bool $cumulative, ?string $note = null): array + { + $expected = $cumulative ? (int) ceil($threshold * $elapsedShare) : null; + + $status = match (true) { + $actual === null => 'unknown', + $actual >= $threshold => 'reached', + $ended => 'missed', + $cumulative && $actual >= $expected => 'on_track', + $cumulative => 'behind', + default => 'open', + }; + + return [ + 'key' => $key, + 'label' => $label, + 'actual' => $actual, + 'threshold' => $threshold, + 'expected' => $expected, + 'status' => $status, + 'note' => $note, + ]; + } + + private function claimedCompanies(Carbon $start): int + { + return $this->companiesWith(ConversionEventType::MagicLinkConsumed, $start); + } + + private function companiesWith(ConversionEventType $type, Carbon $start): int + { + return ConversionEvent::query() + ->where('type', $type->value) + ->whereIn('source', array_map(static fn (ConversionSource $source): string => $source->value, self::CLAIM_SOURCES)) + ->whereNotNull('company_id') + ->where('created_at', '>=', $start) + ->distinct() + ->count('company_id'); + } + + /** + * Einlösungen vor v1.10 tragen keine Firma (Roadmap 6.16) und fehlen + * deshalb in der Zählung — der Hinweis macht die Lücke sichtbar. + */ + private function claimsWithoutCompanyNote(Carbon $start): ?string + { + $count = ConversionEvent::query() + ->where('type', ConversionEventType::MagicLinkConsumed->value) + ->whereIn('source', array_map(static fn (ConversionSource $source): string => $source->value, self::CLAIM_SOURCES)) + ->whereNull('company_id') + ->where('created_at', '>=', $start) + ->count(); + + return $count > 0 + ? sprintf('Dazu %d %s ohne Firmenbezug (vor der Korrektur am 13.10.2026 erfasst).', $count, $count === 1 ? 'Einlösung' : 'Einlösungen') + : null; + } + + private function rejectMailClicks(Carbon $start): int + { + return ConversionEvent::query() + ->where('type', ConversionEventType::MailLinkClicked->value) + ->where('source', ConversionSource::MailReject->value) + ->where('created_at', '>=', $start) + ->count(); + } + + private function feedSubscribers(): int + { + return (int) collect($this->feeds->byReader(30))->sum(static fn (array $reader): int => (int) $reader['subscribers']); + } + + /** + * Aufrufe der Transparenzseiten der letzten 30 Tage, gesamt und aus der + * Suche, je Marke und Seite. Deutsch und Englisch zusammen + * (Filter „enthält“ auf den Slug). + * + * @return array{total: int|null, error: string|null, pages: list} + */ + private function searchViews(bool $fresh, Carbon $now): array + { + if (! $this->umami->isConfigured()) { + return ['total' => null, 'error' => 'Umami-API nicht verbunden (UMAMI_API_* in der .env).', 'pages' => []]; + } + + $key = 'growth.block2.'.$now->toDateString(); + + if ($fresh) { + Cache::forget($key); + } + + try { + /** @var list $pages */ + $pages = Cache::remember($key, now()->addMinutes((int) config('growth.cache_minutes', 360)), function () use ($now): array { + $from = $now->copy()->subDays(30); + $engines = (array) config('growth.block2.search_referrers', []); + $rows = []; + + foreach ((array) config('growth.block2.brands', []) as $brand) { + $websiteId = $this->umami->websiteId((string) $brand); + + if ($websiteId === null) { + continue; + } + + foreach ((array) config('growth.block2.pages', []) as $page) { + $filter = ['path' => 'c.'.$page]; + $views = $this->umami->stats($websiteId, $from, $now, $filter)['pageviews']; + $search = 0; + + if ($views > 0) { + foreach ($this->umami->metrics($websiteId, 'referrer', $from, $now, $filter, 100) as $referrer) { + if (self::isSearchReferrer($referrer['x'], $engines)) { + $search += $referrer['y']; + } + } + } + + $rows[] = ['brand' => (string) $brand, 'page' => (string) $page, 'views' => $views, 'search_views' => $search]; + } + } + + return $rows; + }); + } catch (UmamiUnavailable $e) { + return ['total' => null, 'error' => $e->getMessage(), 'pages' => []]; + } + + return ['total' => (int) array_sum(array_column($pages, 'search_views')), 'error' => null, 'pages' => $pages]; + } + + /** + * @param array $engines + */ + private static function isSearchReferrer(string $referrer, array $engines): bool + { + $referrer = mb_strtolower($referrer); + + foreach ($engines as $engine) { + if ($engine !== '' && str_contains($referrer, mb_strtolower((string) $engine))) { + return true; + } + } + + return false; + } +} diff --git a/app/Services/PressRelease/BoostService.php b/app/Services/PressRelease/BoostService.php index c3c7b088..79209f92 100644 --- a/app/Services/PressRelease/BoostService.php +++ b/app/Services/PressRelease/BoostService.php @@ -2,6 +2,7 @@ namespace App\Services\PressRelease; +use App\Enums\ActivityType; use App\Enums\BoostPlacement; use App\Enums\Portal; use App\Enums\PressReleaseClassification; @@ -11,6 +12,7 @@ use App\Models\Boost; use App\Models\PressRelease; use App\Models\User; use App\Scopes\PortalScope; +use App\Services\ActivityLog; use App\Services\Billing\CreditPricingService; use App\Services\Billing\CreditWalletService; use App\Support\WebPageCache; @@ -35,6 +37,7 @@ class BoostService public function __construct( private readonly CreditPricingService $pricing, private readonly CreditWalletService $wallet, + private readonly ActivityLog $activityLog, ) {} /** @@ -180,6 +183,52 @@ class BoostService return $boost; } + /** + * Beendet alle laufenden und bereits angeschlossenen Boosts einer PM + * sofort (Admin ▸ Pressemitteilung), etwa nach einer Test-Buchung oder + * wenn die Platzierung nicht mehr vertretbar ist. Die Zeilen bleiben als + * Buchungsnachweis erhalten; Credits werden nicht zurückgebucht — + * Erstattungen laufen getrennt. + * + * @return int Anzahl der beendeten Boosts + */ + public function endActive(PressRelease $pressRelease, User $endedBy, string $reason): int + { + $now = now(); + $boosts = $pressRelease->boosts()->active()->get(); + + if ($boosts->isEmpty()) { + return 0; + } + + foreach ($boosts as $boost) { + $boost->update([ + 'starts_at' => $boost->starts_at->isFuture() ? $now : $boost->starts_at, + 'ends_at' => $now, + ]); + } + + $boosts->pluck('placement')->unique()->each( + fn (BoostPlacement $placement) => $this->forgetPlacementCaches($pressRelease, $placement), + ); + + $this->activityLog->record( + ActivityType::BoostEnded, + sprintf( + '%s hat %d gebuchte Platzierung(en) von PM #%d vorzeitig beendet. Grund: %s', + $endedBy->name, + $boosts->count(), + $pressRelease->id, + $reason, + ), + user: $endedBy, + subject: $pressRelease, + meta: ['boost_ids' => $boosts->modelKeys(), 'ended_by' => $endedBy->id, 'reason' => $reason], + ); + + return $boosts->count(); + } + /** * Serialisiert Käufe, die dasselbe sichtbare Slot-Inventar verändern. * diff --git a/app/Services/PressRelease/PressReleaseService.php b/app/Services/PressRelease/PressReleaseService.php index b96c35ee..047f2bf7 100644 --- a/app/Services/PressRelease/PressReleaseService.php +++ b/app/Services/PressRelease/PressReleaseService.php @@ -1107,14 +1107,18 @@ class PressReleaseService // API-Einlieferer (z. B. connektar) nicht zuspammen (Entscheidung // 10.07.2026): Statt-Mail an den Pressekontakt der PM, sonst an die // Firmen-E-Mail; nur ohne beides an den Einlieferer selbst. Marker - // ist die Quelle des letzten Review-Uebergangs im Status-Log — der - // Kontotyp ist nicht verlaesslich (connektar ist z. B. 'agency'). + // ist ein Review-Uebergang aus der API im Status-Log — der Kontotyp + // ist nicht verlaesslich (connektar ist z. B. 'agency'). Bewusst + // irgendeiner, nicht der letzte: Reicht der Pressekontakt eine + // abgelehnte API-Meldung im Kundenbereich neu ein (Roadmap 6.18), + // bleibt es eine API-Meldung, und das Ergebnis geht an ihn statt an + // das Konto des Einlieferers. $recipient = $user->email; $recipientName = $user->name; $isApiSubmitter = $pressRelease->statusLogs() ->where('to_status', PressReleaseStatus::Review->value) - ->orderByDesc('id') - ->value('source') === 'api'; + ->where('source', 'api') + ->exists(); if ($isApiSubmitter) { // Scope-frei auflösen: der Mail-Versand läuft auch aus Jobs/ diff --git a/app/Services/Spam/BotCheck.php b/app/Services/Spam/BotCheck.php new file mode 100644 index 00000000..0f92b3d0 --- /dev/null +++ b/app/Services/Spam/BotCheck.php @@ -0,0 +1,27 @@ +status->blocks(); + } + + public function needsReview(): bool + { + return $this->status === BotCheckStatus::Unavailable; + } +} diff --git a/app/Services/Spam/ContactSpamFilter.php b/app/Services/Spam/ContactSpamFilter.php new file mode 100644 index 00000000..9580fc4a --- /dev/null +++ b/app/Services/Spam/ContactSpamFilter.php @@ -0,0 +1,136 @@ +getTimestamp()); + } + + /** + * Grund (technischer Schlüssel) oder null, wenn die Anfrage sauber ist. + */ + public function reasonFor(string $name, string $message, ?string $startedToken): ?string + { + if ($this->containsForeignLink($message)) { + return 'link'; + } + + if ($this->quotesPageTitle($message)) { + return 'page_title'; + } + + if (GibberishDetector::isRandomToken($name) || GibberishDetector::isRandomToken($message)) { + return 'gibberish'; + } + + if ($this->blacklist->find($name.' '.$message) !== null) { + return 'blacklist'; + } + + if ($this->submittedTooFast($startedToken)) { + return 'too_fast'; + } + + return null; + } + + /** + * Gäste dürfen keine Links schicken (Entscheidung 5) — außer die Nachricht + * verweist auf eine unserer Seiten: Korrekturwünsche nennen die eigene + * Pressemitteilung und oft daneben die Firmen-Website (KT-32, KT-161). + */ + private function containsForeignLink(string $message): bool + { + if (preg_match(self::MARKUP_PATTERN, $message) === 1) { + return true; + } + + if (preg_match(NoPromotionalText::LINK_PATTERN, $message) !== 1) { + return false; + } + + $ownHosts = collect((array) config('domains.domains', [])) + ->pluck('domain_name') + ->filter() + ->map(fn (string $host): string => preg_quote(Str::after($host, 'www.'), '~')) + ->unique() + ->implode('|'); + + if ($ownHosts === '') { + return true; + } + + // Mit Schema („https://presseecho.de“) oder mit Pfad („presseecho.de/de/…“). + $ownLink = '~https?://(?:www\.)?(?:'.$ownHosts.')\b|\b(?:www\.)?(?:'.$ownHosts.')/~i'; + + return preg_match($ownLink, $message) !== 1; + } + + /** + * Formular-Bots hängen den Seitentitel an eine Floskel: „Ich wünsche weitere + * Informationen … — aktuelle pressemitteilungen aus der deutschen wirtschaft.“ + */ + private function quotesPageTitle(string $message): bool + { + $haystack = Str::lower($message); + + foreach ((array) config('domains.domains', []) as $domain) { + foreach (preg_split('/\s[–-]\s/u', (string) ($domain['brand']['meta_title'] ?? '')) ?: [] as $segment) { + $segment = Str::lower(trim($segment)); + + if (mb_strlen($segment) >= 20 && str_contains($haystack, $segment)) { + return true; + } + } + } + + return false; + } + + /** + * Fehlt der Zeitstempel oder ist er manipuliert, entscheidet Turnstile — + * dieser Filter greift nur bei nachweislich zu schnellem Absenden. + */ + private function submittedTooFast(?string $startedToken): bool + { + if (blank($startedToken)) { + return false; + } + + try { + $startedAt = (int) Crypt::decryptString($startedToken); + } catch (DecryptException) { + return false; + } + + return now()->getTimestamp() - $startedAt < self::MIN_SECONDS; + } +} diff --git a/app/Services/Spam/GibberishDetector.php b/app/Services/Spam/GibberishDetector.php new file mode 100644 index 00000000..031ba6f7 --- /dev/null +++ b/app/Services/Spam/GibberishDetector.php @@ -0,0 +1,44 @@ += 3 + && preg_match_all('/[a-z]/', $name) >= 3; + } + + /** + * Freies Namensfeld, das auch Firmen tragen kann (Kontaktformular): + * mindestens vier Wechsel von klein auf groß („…aCoVStmZet…“), oder ein + * Block Großbuchstaben + Ziffern + Großbuchstaben. + */ + public static function isRandomToken(string $value): bool + { + $value = trim($value); + + if (preg_match('/^[A-Za-z]{12,}$/', $value) === 1 && preg_match_all('/[a-z][A-Z]/', $value) >= 4) { + return true; + } + + return preg_match('/[A-Z]{5,}\d{4,}[A-Z]{5,}/', $value) === 1; + } +} diff --git a/app/Services/Spam/SpamLog.php b/app/Services/Spam/SpamLog.php new file mode 100644 index 00000000..5b84facc --- /dev/null +++ b/app/Services/Spam/SpamLog.php @@ -0,0 +1,29 @@ +verify( + $request->string(self::TOKEN_FIELD)->toString(), + $request->boolean(self::UNAVAILABLE_FIELD), + $action, + $request->ip(), + ); + } + + public function verify(?string $token, bool $clientUnavailable, string $action, ?string $ip): BotCheck + { + if (! self::enabled()) { + return new BotCheck(BotCheckStatus::Skipped); + } + + $token = trim((string) $token); + + if ($token === '') { + return $clientUnavailable + ? $this->unavailable('widget_not_loaded', $action, $ip) + : $this->failed('missing_token', $action, $ip); + } + + if (strlen($token) > self::MAX_TOKEN_LENGTH) { + return $this->failed('token_too_long', $action, $ip); + } + + try { + $response = Http::asForm() + ->timeout((int) config('services.turnstile.timeout', 3)) + ->post(self::ENDPOINT, array_filter([ + 'secret' => config('services.turnstile.secret_key'), + 'response' => $token, + 'remoteip' => $ip, + ])); + } catch (ConnectionException) { + return $this->unavailable('siteverify_unreachable', $action, $ip); + } + + if (! $response->successful()) { + return $this->unavailable('siteverify_http_'.$response->status(), $action, $ip); + } + + $errors = (array) $response->json('error-codes', []); + + if ($response->json('success') !== true) { + if (in_array('internal-error', $errors, true)) { + return $this->unavailable('siteverify_internal_error', $action, $ip); + } + + if (array_intersect(['missing-input-secret', 'invalid-input-secret'], $errors) !== []) { + // Unser Fehler, nicht der des Absenders — laut melden, nicht blockieren. + Log::error('Turnstile lehnt den Secret-Key ab — TURNSTILE_SECRET_KEY prüfen.', ['errors' => $errors]); + + return $this->unavailable('invalid_secret', $action, $ip); + } + + return $this->failed(implode(',', $errors) ?: 'rejected', $action, $ip); + } + + $returnedAction = (string) $response->json('action', ''); + + // Die Cloudflare-Testkeys (1x…/2x…/3x…) liefern keine echte Aktion. + if (! $this->usesTestSecret() && $returnedAction !== $action) { + return $this->failed('action_mismatch', $action, $ip); + } + + return new BotCheck(BotCheckStatus::Passed); + } + + private function unavailable(string $reason, string $action, ?string $ip): BotCheck + { + $this->log('Bot-Prüfung nicht verfügbar — durchgelassen und markiert.', $reason, $action, $ip); + + if (! config('services.turnstile.fail_open', true)) { + return new BotCheck(BotCheckStatus::Failed, $reason); + } + + return new BotCheck(BotCheckStatus::Unavailable, $reason); + } + + private function failed(string $reason, string $action, ?string $ip): BotCheck + { + $this->log('Bot-Prüfung nicht bestanden.', $reason, $action, $ip); + + return new BotCheck(BotCheckStatus::Failed, $reason); + } + + private function log(string $message, string $reason, string $action, ?string $ip): void + { + Log::channel('spam')->info($message, [ + 'form' => $action, + 'reason' => $reason, + 'ip_prefix' => SpamLog::ipPrefix($ip), + ]); + } + + private function usesTestSecret(): bool + { + return (bool) preg_match('/^[123]x0{20,}/', (string) config('services.turnstile.secret_key')); + } +} diff --git a/app/Services/Web/ContactMessageNotifier.php b/app/Services/Web/ContactMessageNotifier.php new file mode 100644 index 00000000..0b883d4f --- /dev/null +++ b/app/Services/Web/ContactMessageNotifier.php @@ -0,0 +1,40 @@ +recipient($message))->queue((new ContactRequestSubmitted( + senderName: (string) $message->name, + senderEmail: (string) $message->email, + messageText: (string) $message->message, + host: $host ?? $this->hostOf($message), + topicLabel: $message->topic->label(), + pageUrl: $message->page_url, + ))->afterCommit()); + } + + private function recipient(ContactMessage $message): string + { + return config('domains.domains.'.$message->portal.'.brand.contact_email') + ?? config('mail.from.address'); + } + + private function hostOf(ContactMessage $message): string + { + return parse_url((string) $message->page_url, PHP_URL_HOST) + ?: (string) config('domains.domains.'.$message->portal.'.domain_name', $message->portal); + } +} diff --git a/app/Support/ContentSecurityPolicy.php b/app/Support/ContentSecurityPolicy.php new file mode 100644 index 00000000..ee81d6d9 --- /dev/null +++ b/app/Support/ContentSecurityPolicy.php @@ -0,0 +1,75 @@ +`. + */ +class ContentSecurityPolicy +{ + public const REPORT_PATH = '/csp-report'; + + public static function header(): string + { + $own = array_merge(["'self'"], self::ownOrigins()); + $umami = config('services.umami.enabled') ? self::originOf((string) config('services.umami.script_url')) : null; + $errors = self::originOf((string) config('monitoring.browser.dsn')); + // Cloudflare Turnstile (Spamschutz): Skript und Challenge-iframe. + $turnstile = 'https://challenges.cloudflare.com'; + + $directives = [ + 'default-src' => ["'self'"], + 'script-src' => [...$own, "'unsafe-inline'", "'unsafe-eval'", $umami, $turnstile], + 'style-src' => [...$own, "'unsafe-inline'"], + 'img-src' => [...$own, 'data:', 'blob:', 'https:'], + 'font-src' => [...$own, 'data:'], + 'connect-src' => [...$own, $umami, $errors], + 'media-src' => [...$own], + 'object-src' => ["'none'"], + 'frame-src' => ["'self'", $turnstile], + 'frame-ancestors' => ["'self'"], + 'base-uri' => ["'self'"], + 'form-action' => [...$own, 'https://accounts.google.com', 'https://checkout.stripe.com', 'https://billing.stripe.com'], + 'report-uri' => [self::REPORT_PATH], + ]; + + return collect($directives) + ->map(fn (array $sources, string $directive): string => trim($directive.' '.implode(' ', array_unique(array_filter($sources))))) + ->implode('; '); + } + + /** + * Die drei Domains der Anwendung — Formulare und Assets können + * domainübergreifend auf die anderen zeigen. + * + * @return list + */ + private static function ownOrigins(): array + { + return collect([ + config('domains.domain_portal'), + config('domains.domain_presseecho'), + config('domains.domain_businessportal'), + ])->filter()->map(fn (string $host): string => 'https://'.$host)->values()->all(); + } + + private static function originOf(string $url): ?string + { + $parts = parse_url($url); + + if (! is_array($parts) || empty($parts['host'])) { + return null; + } + + return ($parts['scheme'] ?? 'https').'://'.$parts['host'].(isset($parts['port']) ? ':'.$parts['port'] : ''); + } +} diff --git a/app/Support/Monitoring/ErrorReportScrubber.php b/app/Support/Monitoring/ErrorReportScrubber.php index 12cb1c5b..966e8c1d 100644 --- a/app/Support/Monitoring/ErrorReportScrubber.php +++ b/app/Support/Monitoring/ErrorReportScrubber.php @@ -4,6 +4,7 @@ namespace App\Support\Monitoring; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; +use Sentry\Breadcrumb; use Sentry\Event; use Sentry\EventHint; use Sentry\UserDataBag; @@ -41,6 +42,8 @@ class ErrorReportScrubber $event->setUser($userId !== null ? UserDataBag::createFromUserIdentifier($userId) : null); $event->setRequest(self::scrubRequest($event->getRequest())); + $event->setBreadcrumb(array_map(self::scrubBreadcrumb(...), $event->getBreadcrumbs())); + foreach ($event->getExceptions() as $exception) { $exception->setValue(self::scrubText($exception->getValue())); } @@ -58,6 +61,20 @@ class ErrorReportScrubber return $event; } + public static function scrubBreadcrumb(Breadcrumb $breadcrumb): Breadcrumb + { + $message = $breadcrumb->getMessage(); + + return new Breadcrumb( + $breadcrumb->getLevel(), + $breadcrumb->getType(), + $breadcrumb->getCategory(), + $message !== null ? self::scrubText($message) : null, + [], + $breadcrumb->getTimestamp(), + ); + } + /** * @param array $request * @return array diff --git a/bootstrap/app.php b/bootstrap/app.php index f175f80d..b97c4877 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,5 +1,6 @@ withRouting( @@ -38,6 +43,12 @@ return Application::configure(basePath: dirname(__DIR__)) Route::get('/health', HealthController::class) ->middleware('throttle:30,1') ->name('health.deep'); + + // CSP-Meldungen der Browser (Melde-Modus, Sicherheitsaudit + // 07.10.2026) — ohne web-Gruppe: keine Session, kein CSRF. + Route::post(ContentSecurityPolicy::REPORT_PATH, CspReportController::class) + ->middleware('throttle:60,1') + ->name('csp.report'); }, ) ->withMiddleware(function (Middleware $middleware) { @@ -118,16 +129,18 @@ return Application::configure(basePath: dirname(__DIR__)) // ob erzwungen wird, entscheidet die Middleware zur Laufzeit anhand // von config('auth.basic.*') (greift auch unter `config:cache`). $middleware->append(BasicAuthMiddleware::class); - // Trust all proxies (for Traefik/Docker setup) + // Welchen Proxies vertraut wird, steht in config/trustedproxy.php: + // lokal hinter Traefik allen, auf Live (nginx direkt, kein Proxy) + // keinem — sonst könnte jeder Client per X-Forwarded-For seine IP + // fälschen und damit IP-Limits und Protokolle umgehen. $middleware->trustProxies( - at: '*', headers: Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO ); - // Host-Whitelist: Da allen Proxies inkl. X-Forwarded-Host vertraut wird, + // Host-Whitelist: Wo Proxies inkl. X-Forwarded-Host vertraut wird, // muss die App fremde Host-Header verwerfen — sonst kann ein Client per // X-Forwarded-Host die URL-Generierung vergiften (Passwort-Reset-/Verify- // Mails, signierte Links, Cache-Poisoning). Nur die konfigurierten @@ -167,4 +180,18 @@ return Application::configure(basePath: dirname(__DIR__)) // Vertippte artisan-Befehle sind kein Anwendungsfehler (GlitchTip // server-pressekonto, Issue 9: „config:cachels“ auf Live). $exceptions->dontReport(CommandNotFoundException::class); + + // Manipulierte Livewire-Anfragen (Scanner, die gesperrte Properties + // setzen oder Uploads an Komponenten ohne Upload schicken) als 400 + // beantworten statt als 500 bzw. 419 — Livewire weist sie korrekt ab, + // sie sind kein Anwendungsfehler und kein abgelaufenes Formular + // (GlitchTip server-pressekonto, Issues 38 und 39, 08.10.2026). + $exceptions->map( + CannotUpdateLockedPropertyException::class, + fn (CannotUpdateLockedPropertyException $e): BadRequestHttpException => new BadRequestHttpException('Ungültige Livewire-Anfrage.', $e), + ); + $exceptions->map( + MissingFileUploadsTraitException::class, + fn (MissingFileUploadsTraitException $e): BadRequestHttpException => new BadRequestHttpException('Ungültige Livewire-Anfrage.', $e), + ); })->create(); diff --git a/config/auth.php b/config/auth.php index bbe4c241..e7af1ffe 100644 --- a/config/auth.php +++ b/config/auth.php @@ -114,6 +114,21 @@ return [ 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + /* + |-------------------------------------------------------------------------- + | Starke Anmeldung für Administratoren + |-------------------------------------------------------------------------- + | + | Super-Admins und Admins brauchen für den Admin-Bereich eine Session, die + | mit Passkey oder Authenticator-Code bestätigt wurde (Entscheidung 5, + | 07.10.2026, EnsureStrongAdminAuthentication). Abschalten nur als + | Notfallschalter, z. B. wenn WebAuthn auf der Domain ausfällt. In der + | Testsuite aus; die Tests der Funktion schalten sie gezielt ein. + | + */ + + 'require_strong_admin_authentication' => env('AUTH_REQUIRE_STRONG_ADMIN', true), + /* |-------------------------------------------------------------------------- | HTTP Basic Auth Gate (Staging-Schutz) @@ -132,4 +147,21 @@ return [ 'password' => env('BASIC_AUTH_PASSWORD'), ], + /* + |-------------------------------------------------------------------------- + | Bot-Registrierungen aufräumen (Spamschutz B4) + |-------------------------------------------------------------------------- + | + | `users:prune-bot-registrations` löscht über das Formular angelegte + | Konten, die nach `after_days` weder bestätigt noch genutzt wurden. + | Der tägliche Lauf ist aus, bis der Probelauf (--dry-run) auf Live + | geprüft ist; Altkonten aus dem Legacy-Import sind nie betroffen. + | + */ + + 'prune_bot_registrations' => [ + 'enabled' => (bool) env('USERS_PRUNE_BOT_REGISTRATIONS', false), + 'after_days' => 14, + ], + ]; diff --git a/config/domains.php b/config/domains.php index 83cd5896..0ca6ac86 100644 --- a/config/domains.php +++ b/config/domains.php @@ -61,7 +61,7 @@ return [ 'footer_legal' => '© :year pressekonto · Alle Rechte vorbehalten', 'about_label' => 'Über pressekonto', 'meta_title' => 'pressekonto – Publisher-Hub für presseecho und businessportal24', - 'meta_description' => 'Ein Konto, zwei Reichweiten: Pressemitteilungen qualitätsgeprüft auf presseecho und businessportal24 gleichzeitig veröffentlichen.', + 'meta_description' => 'Ein Konto, zwei Reichweiten: Pressemitteilungen nach automatisierter Prüfung auf presseecho und businessportal24 gleichzeitig veröffentlichen.', ], ], @@ -85,11 +85,11 @@ return [ 'report_email' => env('REPORT_EMAIL_PRESSEECHO'), 'umami_website_id' => '3ea8a7b0-105d-4519-b200-138cadc0fbdc', 'tagline_short' => 'Pressemitteilungen · DACH', - 'tagline_long' => 'Fachmeldungen aus Wirtschaft und Industrie. Qualitätsgeprüft. Strukturiert distribuiert.', + 'tagline_long' => 'Fachmeldungen aus Wirtschaft und Industrie. Automatisiert geprüft. Strukturiert distribuiert.', 'footer_legal' => '© :year presseecho · Alle Rechte vorbehalten', 'about_label' => 'Über presseecho', 'meta_title' => 'Aktuelle Pressemitteilungen aus Wirtschaft & Industrie – presseecho', - 'meta_description' => 'Qualitätsgeprüfte Pressemitteilungen aus Wirtschaft und Industrie im DACH-Raum.', + 'meta_description' => 'Automatisiert geprüfte Pressemitteilungen aus Wirtschaft und Industrie im DACH-Raum.', 'newsletter_topics' => [ ['name' => 'Tageszusammenfassung', 'meta' => 'Mo–Fr · 07:00 Uhr', 'active' => true], ['name' => 'Wochenrückblick', 'meta' => 'Sonntags · 18:00 Uhr', 'active' => false], @@ -119,11 +119,11 @@ return [ 'report_email' => env('REPORT_EMAIL_BUSINESSPORTAL'), 'umami_website_id' => 'f03a5fc3-ac44-488f-9118-84004861099f', 'tagline_short' => 'Pressemitteilungen · DACH', - 'tagline_long' => 'Veröffentlichungs-Portal für qualitätsgeprüfte Pressemitteilungen aus Deutschland, Österreich und der Schweiz.', + 'tagline_long' => 'Veröffentlichungs-Portal für automatisiert geprüfte Pressemitteilungen aus Deutschland, Österreich und der Schweiz.', 'footer_legal' => '© :year businessportal24 · Alle Rechte vorbehalten', 'about_label' => 'Über businessportal24', 'meta_title' => 'Aktuelle Pressemitteilungen aus der deutschen Wirtschaft – businessportal24', - 'meta_description' => 'Pressemitteilungen aus Deutschland, Österreich und der Schweiz. Qualitätsgeprüft. Strukturiert distribuiert.', + 'meta_description' => 'Pressemitteilungen aus Deutschland, Österreich und der Schweiz. Automatisiert geprüft. Strukturiert distribuiert.', 'newsletter_topics' => [ ['name' => 'Tageszusammenfassung', 'meta' => 'Mo–Fr · 07:00 Uhr', 'active' => true], ['name' => 'Wochenrückblick', 'meta' => 'Sonntags · 18:00 Uhr', 'active' => false], diff --git a/config/fortify.php b/config/fortify.php index c80f6118..5fe1c329 100644 --- a/config/fortify.php +++ b/config/fortify.php @@ -1,6 +1,7 @@ ['web', BlockUnusedFortifyRoutes::class], + 'middleware' => ['web', BlockUnusedFortifyRoutes::class, EnsurePasskeyManagementIsConfirmed::class], /* |-------------------------------------------------------------------------- @@ -122,6 +123,7 @@ return [ 'limiters' => [ 'login' => 'login', 'two-factor' => 'two-factor', + 'passkeys' => 'passkeys', ], /* @@ -155,12 +157,39 @@ return [ // updateProfileInformation() bewusst AUS (Audit F01): der Endpunkt // tauschte die E-Mail sofort und ohne Verifizierung – Firmenrechte // hängen an der Adresse. Die Kunden-UI nutzt den pending_email-Prozess. - Features::updatePasswords(), + // Features::updatePasswords(), // Abgeschaltet (Sicherheitsaudit 07.10.2026): Passwortwechsel nur über Livewire + PasswordChanger Features::twoFactorAuthentication([ 'confirm' => true, 'confirmPassword' => true, // 'window' => 0, ]), + // Passkeys (Entscheidung 5, 07.10.2026). Den frischen Nachweis vor dem + // Hinzufügen verlangt EnsurePasskeyManagementIsConfirmed statt + // `password.confirm` — Letzteres setzt ein Passwort voraus, das + // Magic-Link- und Google-Konten nicht haben. + Features::passkeys([ + 'confirmPassword' => false, + ]), + ], + + /* + |-------------------------------------------------------------------------- + | Passkeys + |-------------------------------------------------------------------------- + | + | Login und Sicherheitsseite laufen ausschließlich auf der Portal-Domain + | (routes/domains.php) — daran sind die Passkeys gebunden. Bewusst nicht + | APP_URL: die zeigt je nach Umgebung auf ein Web-Portal. + | + */ + + 'passkeys' => [ + 'relying_party_id' => env('PASSKEYS_RP_ID', env('APP_PORTAL_NAME', 'pressekonto.test')), + 'allowed_origins' => [env('APP_PORTAL_URL', 'https://pressekonto.test')], + // Eigener Wert empfohlen: ein APP_KEY-Wechsel würde sonst die Kennungen + // ändern, unter denen die Geräte die Passkeys gespeichert haben. + 'user_handle_secret' => env('PASSKEYS_USER_HANDLE_SECRET', env('APP_KEY')), + 'timeout' => 60000, ], ]; diff --git a/config/growth.php b/config/growth.php new file mode 100644 index 00000000..ab41ccbe --- /dev/null +++ b/config/growth.php @@ -0,0 +1,59 @@ + [ + 'start' => '2026-09-17', + 'review' => '2026-12-17', + 'end' => '2027-03-17', + ], + + // Block 1 — Konversion aus dem Bestand. Gezählt werden eindeutige Firmen. + 'block1' => [ + 'claims_min' => 30, + 'bookings_min' => 3, + 'reject_clicks_min' => 10, + ], + + // Block 2 — Organische Sichtbarkeit: Aufrufe der Transparenzseiten (2.4) + // aus der Suche, gemessen in Umami über die letzten 30 Tage. Gewertet + // wird der Februar 2027. + 'block2' => [ + 'search_views_min' => 100, + 'evaluation_month' => '2027-02', + 'pages' => [ + 'was-kostet-eine-pressemitteilung', + 'pressemitteilung-veroeffentlichen-ohne-abo', + 'pressemitteilung-loeschen-oder-aendern-lassen', + 'pressemitteilung-kostenlos-veroeffentlichen', + ], + 'brands' => ['presseecho', 'businessportal24'], + // Verweisende Domains, die als Suche zählen (enthält). + 'search_referrers' => [ + 'google.', 'googlequicksearchbox', 'bing.', 'duckduckgo.', 'ecosia.', 'yahoo.', + 'search.brave.', 'qwant.', 'startpage.', 'yandex.', 'web.de', 'gmx.', 't-online.', + ], + ], + + // Block 3 — Reichweite: Abonnenten, die Reader-Dienste im User-Agent + // melden (Feedly, Inoreader …), über alle Feeds, letzte 30 Tage. + 'block3' => [ + 'feed_subscribers_min' => 25, + ], + + // Umami-Abfragen werden so lange zwischengespeichert. + 'cache_minutes' => (int) env('GROWTH_REPORT_CACHE_MINUTES', 360), + +]; diff --git a/config/logging.php b/config/logging.php index 98eded0f..93db3dda 100644 --- a/config/logging.php +++ b/config/logging.php @@ -104,6 +104,8 @@ return [ | monitoring Betriebs-Alerts (OperationalAlert): fehlgeschlagene | Scheduler-Tasks/Queue-Jobs, Mail-Breaker, Bounces | market Kursdaten-Abruf (market:refresh) + | csp CSP-Meldungen der Browser (Melde-Modus) + | spam Spamschutz: abgewiesene und ungeprüfte Formulare | admin_slow langsame Admin-Requests (eigene Schwellen/Env-Werte) | */ @@ -116,6 +118,13 @@ return [ 'market' => $topicChannel('market'), + // CSP-Meldungen der Browser (Melde-Modus, CspReportController). + 'csp' => $topicChannel('csp'), + + // Spamschutz: abgewiesene und ungeprüfte Formulare, nur Grund und + // Netz-Präfix (TurnstileVerifier, ContactController). + 'spam' => $topicChannel('spam'), + 'admin_slow' => [ 'driver' => 'daily', 'path' => storage_path('logs/admin-slow.log'), diff --git a/config/monitoring.php b/config/monitoring.php index 4d72102b..15aede5f 100644 --- a/config/monitoring.php +++ b/config/monitoring.php @@ -82,6 +82,23 @@ return [ 'warn_per_day' => (int) env('MONITORING_FAILED_LOGIN_WARN_PER_DAY', 1000), ], + /* + |-------------------------------------------------------------------------- + | Löschfristen der Protokolle (Roadmap 4.2) + |-------------------------------------------------------------------------- + | + | Aktivitäts-Verlauf (activity_events: Anmeldungen, Statuswechsel, + | Admin-Aktionen) wie die Nutzungsstatistik in DSE 5a nach 395 Tagen; + | API-Zugriffsprotokoll (api_usage_logs, mit IP und User-Agent) nach + | 90 Tagen. Entfernt täglich um 04:05 über `model:prune`. + | + */ + + 'retention' => [ + 'activity_events_days' => (int) env('MONITORING_ACTIVITY_RETENTION_DAYS', 395), + 'api_usage_logs_days' => (int) env('MONITORING_API_USAGE_RETENTION_DAYS', 90), + ], + 'scheduler' => [ 'heartbeat_warn_minutes' => 3, 'heartbeat_critical_minutes' => 10, diff --git a/config/security.php b/config/security.php new file mode 100644 index 00000000..cbcc643b --- /dev/null +++ b/config/security.php @@ -0,0 +1,39 @@ + [ + 'enabled' => (bool) env('SECURITY_HSTS', env('APP_ENV') === 'production'), + 'max_age' => (int) env('SECURITY_HSTS_MAX_AGE', 31536000), + ], + + /* + |-------------------------------------------------------------------------- + | Content Security Policy (Melde-Modus) + |-------------------------------------------------------------------------- + | + | Setzt `Content-Security-Policy-Report-Only` auf HTML-Antworten + | (App\Support\ContentSecurityPolicy). Browser blockieren nichts, sie + | melden Verstöße an /csp-report → storage/logs/csp-*.log. Standardmäßig + | nur in Produktion. + | + */ + + 'csp' => [ + 'report_only' => (bool) env('SECURITY_CSP_REPORT_ONLY', env('APP_ENV') === 'production'), + ], + +]; diff --git a/config/sentry.php b/config/sentry.php index 2590b2e1..4bd86e00 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -88,8 +88,10 @@ return [ // Capture Laravel cache events (hits, writes etc.) as breadcrumbs 'cache' => env('SENTRY_BREADCRUMBS_CACHE_ENABLED', false), - // Capture Livewire components like routes as breadcrumbs - 'livewire' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', true), + // Capture Livewire components like routes as breadcrumbs — aus: hängt + // Formularwerte und Properties an (Roadmap 4.9); der Scrubber leert + // die Daten aller Breadcrumbs zusätzlich. + 'livewire' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', false), // Capture SQL queries as breadcrumbs 'sql_queries' => env('SENTRY_BREADCRUMBS_SQL_QUERIES_ENABLED', true), diff --git a/config/services.php b/config/services.php index 3b2ad398..077aa5ed 100644 --- a/config/services.php +++ b/config/services.php @@ -63,5 +63,30 @@ return [ // Ergänzung der Datenschutzerklärung einschalten. 'portal_enabled' => env('UMAMI_PORTAL_ENABLED', false), 'identify_users' => env('UMAMI_IDENTIFY_USERS', false), + + // Nur lesender API-Zugang für Auswertungen (Roadmap 6.16): ein + // Umami-Benutzer mit der Rolle „View only“, die Websites hängen am + // Team. Selbst gehostetes Umami kennt keine API-Schlüssel, nur + // Login und Token. + 'api_url' => env('UMAMI_API_URL'), + 'api_username' => env('UMAMI_API_USERNAME'), + 'api_password' => env('UMAMI_API_PASSWORD'), + 'api_team_id' => env('UMAMI_API_TEAM_ID'), + 'api_timeout_seconds' => (int) env('UMAMI_API_TIMEOUT', 15), + ], + + /* + | Cloudflare Turnstile (Spamschutz, dev/sicherheit/ENTWICKLUNGSPLAN- + | SPAMSCHUTZ-2026-10-09.md): Bot-Prüfung für Kontakt-Widget und + | Registrierung. Ohne beide Keys ist die Prüfung aus (Tests, lokal ohne + | Keys). Lokal die Cloudflare-Testkeys verwenden — die echten Keys sind an + | die Live-Hostnamen gebunden. `fail_open`: Ist Cloudflare nicht + | erreichbar, wird durchgelassen und markiert (Entscheidung 09.10.2026). + */ + 'turnstile' => [ + 'site_key' => env('TURNSTILE_SITE_KEY'), + 'secret_key' => env('TURNSTILE_SECRET_KEY'), + 'timeout' => (int) env('TURNSTILE_TIMEOUT', 3), + 'fail_open' => (bool) env('TURNSTILE_FAIL_OPEN', true), ], ]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php new file mode 100644 index 00000000..9667af07 --- /dev/null +++ b/config/trustedproxy.php @@ -0,0 +1,22 @@ + env('TRUSTED_PROXIES', env('APP_ENV') === 'local' ? '*' : null) ?: null, + +]; diff --git a/database/factories/ChangelogEntryFactory.php b/database/factories/ChangelogEntryFactory.php new file mode 100644 index 00000000..fa04619c --- /dev/null +++ b/database/factories/ChangelogEntryFactory.php @@ -0,0 +1,39 @@ + + */ +class ChangelogEntryFactory extends Factory +{ + /** + * @return array + */ + public function definition(): array + { + return [ + 'released_on' => now()->toDateString(), + 'release_tag' => 'v1.'.fake()->numberBetween(1, 30).'.0', + 'category' => ChangelogCategory::Improved, + 'text' => fake()->sentence(10), + 'status' => ChangelogStatus::Draft, + 'source_key' => fake()->unique()->sha1(), + ]; + } + + public function published(): static + { + return $this->state(['status' => ChangelogStatus::Published, 'published_at' => now()]); + } + + public function category(ChangelogCategory $category): static + { + return $this->state(['category' => $category]); + } +} diff --git a/database/migrations/2026_10_07_165740_create_passkeys_table.php b/database/migrations/2026_10_07_165740_create_passkeys_table.php new file mode 100644 index 00000000..a0b9e7d1 --- /dev/null +++ b/database/migrations/2026_10_07_165740_create_passkeys_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignIdFor(Passkeys::userModel(), 'user_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->string('credential_id')->unique(); + $table->json('credential'); + $table->timestamp('last_used_at')->nullable(); + $table->timestamps(); + + $table->index('user_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('passkeys'); + } +}; diff --git a/database/migrations/2026_10_08_142917_add_sessions_revoked_at_ms_to_users_table.php b/database/migrations/2026_10_08_142917_add_sessions_revoked_at_ms_to_users_table.php new file mode 100644 index 00000000..288383f9 --- /dev/null +++ b/database/migrations/2026_10_08_142917_add_sessions_revoked_at_ms_to_users_table.php @@ -0,0 +1,30 @@ +unsignedBigInteger('sessions_revoked_at_ms')->nullable()->after('remember_token'); + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('sessions_revoked_at_ms'); + }); + } +}; diff --git a/database/migrations/2026_10_14_102302_create_changelog_entries_table.php b/database/migrations/2026_10_14_102302_create_changelog_entries_table.php new file mode 100644 index 00000000..7fc0a419 --- /dev/null +++ b/database/migrations/2026_10_14_102302_create_changelog_entries_table.php @@ -0,0 +1,42 @@ +id(); + $table->date('released_on'); + $table->string('release_tag', 20)->nullable(); + $table->string('category', 20); + $table->string('text', 500); + $table->string('status', 20)->default('draft')->index(); + $table->string('source_key', 64)->unique(); + $table->string('commit_subject', 255)->nullable(); + $table->string('review_note', 255)->nullable(); + $table->boolean('article_worthy')->default(false); + $table->timestamp('published_at')->nullable(); + $table->foreignId('reviewed_by_user_id')->nullable()->constrained('users')->nullOnDelete(); + $table->timestamps(); + + $table->index(['status', 'released_on']); + }); + } + + public function down(): void + { + Schema::dropIfExists('changelog_entries'); + } +}; diff --git a/database/seeders/PlanSeeder.php b/database/seeders/PlanSeeder.php index faff438b..70fb160c 100644 --- a/database/seeders/PlanSeeder.php +++ b/database/seeders/PlanSeeder.php @@ -16,10 +16,11 @@ class PlanSeeder extends Seeder { // Benefits nur mit belegbaren Leistungen (T16: „Inhaltsprüfung" statt // „Redaktionelle Prüfung"; nicht implementierte Boost-/Mengenrabatte - // und die unklare „priorisierte Prüfung" gestrichen). + // und die unklare „priorisierte Prüfung" gestrichen). Seit 12.10.2026 + // „Automatisierte Prüfung" (Decision-Update Bildrechte 3.6). $plans = [ ['slug' => 'starter', 'name' => 'Starter', 'monthly_price_cents' => 2900, 'press_release_quota' => 3, 'daily_limit' => null, 'sort_order' => 1, 'benefits' => [ - 'Inhaltsprüfung & Veröffentlichung inklusive', + 'Automatisierte Prüfung & Veröffentlichung inklusive', 'Veröffentlichung auf presseecho und businessportal24', 'Reduzierter Extra-PM-Preis', ]], diff --git a/database/seeders/data/changelog-backfill.php b/database/seeders/data/changelog-backfill.php new file mode 100644 index 00000000..51b7be23 --- /dev/null +++ b/database/seeders/data/changelog-backfill.php @@ -0,0 +1,35 @@ + + */ +return [ + ['date' => '2026-07-20', 'tag' => 'v1.0.0', 'category' => 'neu', 'text' => 'presseecho und businessportal24 laufen auf dem neuen System: Mit einem Konto bei pressekonto veröffentlichen Sie auf beiden Portalen, jede Meldung wird vor der Veröffentlichung automatisiert geprüft.'], + ['date' => '2026-09-15', 'tag' => null, 'category' => 'neu', 'text' => 'Jede Firma hat einen Newsroom mit all ihren Meldungen. Über „Diesen Newsroom verwalten“ pflegen Sie Beschreibung und Pressekontakte kostenlos.'], + ['date' => '2026-09-16', 'tag' => null, 'category' => 'neu', 'text' => 'Im Kundenbereich zeigt jede veröffentlichte Meldung ihre Aufrufe Tag für Tag.'], + ['date' => '2026-09-16', 'tag' => null, 'category' => 'neu', 'text' => 'Die Seite „Was eine gute Pressemitteilung ausmacht“ erklärt Anlass, Aufbau, Sprache und den Ablauf der Prüfung.'], + ['date' => '2026-09-17', 'tag' => null, 'category' => 'neu', 'text' => 'Jede Branche hat ein Jahresarchiv mit allen Meldungen eines Jahres.'], + ['date' => '2026-09-17', 'tag' => null, 'category' => 'neu', 'text' => 'Neue Infoseiten erklären, was eine Pressemitteilung kostet, wie Sie ohne Abo veröffentlichen und wie sich eine Meldung ändern oder löschen lässt.'], + ['date' => '2026-09-21', 'tag' => null, 'category' => 'neu', 'text' => 'RSS-Feeds für jedes Portal, jede Branche und jeden Newsroom; die Seite „RSS“ erklärt, wie Sie sie abonnieren.'], + ['date' => '2026-09-28', 'tag' => null, 'category' => 'neu', 'text' => 'Beim Hochladen eines Pressebildes bestätigen Sie die Bildrechte und geben an, ob das Bild mit KI erzeugt wurde. Unter jedem Bild steht der Bildnachweis.'], + ['date' => '2026-10-06', 'tag' => 'v1.3.0', 'category' => 'neu', 'text' => 'Rechnungen kommen per E-Mail.'], + ['date' => '2026-10-07', 'tag' => 'v1.4.0', 'category' => 'neu', 'text' => 'Anmelden geht jetzt auch mit einem Passkey – per Fingerabdruck, Gesichtserkennung oder Sicherheitsschlüssel.'], + ['date' => '2026-10-07', 'tag' => 'v1.4.0', 'category' => 'sicherheit', 'text' => 'Sicherheitsverbesserungen eingespielt.'], + ['date' => '2026-10-08', 'tag' => 'v1.6.0', 'category' => 'neu', 'text' => 'In den Sicherheitseinstellungen melden Sie mit einem Klick alle anderen Geräte ab.'], + ['date' => '2026-10-08', 'tag' => 'v1.6.0', 'category' => 'sicherheit', 'text' => 'Sicherheitsverbesserungen eingespielt.'], + ['date' => '2026-10-09', 'tag' => 'v1.7.0', 'category' => 'verbessert', 'text' => 'Kontaktformular und Registrierung sind besser vor Spam geschützt, ohne Bilderrätsel.'], + ['date' => '2026-10-12', 'tag' => 'v1.8.0', 'category' => 'neu', 'text' => 'Die Sicherheitsseite im Konto zeigt dieses Gerät und Ihre letzten Anmeldungen.'], + ['date' => '2026-10-13', 'tag' => 'v1.9.0', 'category' => 'verbessert', 'text' => 'Gebuchte Platzierungen auf Start- und Branchenseiten heißen jetzt „Gebuchte Platzierung“; ein Tipp auf das Schild erklärt, was das bedeutet.'], +]; diff --git a/dev/README.md b/dev/README.md index 55191d16..a75ddbc7 100644 --- a/dev/README.md +++ b/dev/README.md @@ -1,40 +1,54 @@ # dev/ — Projekt- und Betriebsdokumentation -Stand: 29.09.2026 — **das System ist live** (pressekonto.com, presseecho.de, -businessportal24.com). Die Struktur trennt aktive Betriebs-/Planungsdoku von -abgeschlossenen Phasen (Archiv). +Stand: 09.10.2026 · Release v1.7.0 · live seit 20.07.2026 (pressekonto.com, +presseecho.de, businessportal24.com). + +**Einstieg: [`roadmap.md`](roadmap.md)** — die einzige laufende Liste offener +Punkte, mit Verweisen auf die Einzeldokumente. Oben in `dev/` liegt nur, was +im Betrieb oder in laufender Planung gebraucht wird; abgeschlossene Phasen +liegen in `archive/`. ## Aktiv | Pfad | Inhalt | | --- | --- | -| `betrieb/deploy-runbook.md` | Deploy- und Betriebs-Runbook (SFTP-Deploy-Checkliste, Worker, Scheduler, Stripe-Webhook, Rollback) — **erste Anlaufstelle für alles Operative** | -| `betrieb/api-legacy-paritaet.md` | Verhaltens-Referenz der Legacy-API-Kompatibilitätsschicht (`/service/…`) — lebendes Dokument, solange Alt-Integrationen (Connektar) die Pfade nutzen | -| `betrieb/umami.md` | Umami-Analytics-Snippets je Domain | -| `2026-09-01/` | **Aktuelle Roadmap** (`roadmap-2026.md` + Anhänge 1 und 2), Basiswerte Block 0, Umsetzungsprotokoll Teil 1–11 | -| `2026-09-11-audit/` | **Audits und Entwicklungsplan** (`ENTWICKLUNGSPLAN.md`, Blöcke 1–9), Umsetzungsaudits 18.09./25.09./29.09., Bildkennzeichnung (Plan Fassung 2, Decision-Update) — der jüngste Umsetzungsaudit ist der Einstieg in den aktuellen Stand | -| `roadmap.md` | Nachlauf Go-Live (Stand 20.07.) und Ideen-Backlog — die laufende Planung steht in `2026-09-01/` | - -## Lokal / gitignored (bleiben liegen, nicht committen) - -| Pfad | Inhalt | -| --- | --- | -| `migration/` | Medien-Staging der Legacy-Migration (~7 GB Uploads beider Altportale) — Quelle für `legacy:migrate-media`; behalten, bis das Alt-System endgültig abgeschaltet und ein Server-Backup gezogen ist | -| `api/` | Postman-Collection (enthält API-Keys!) und Activity-Log-Auswertungen der Alt-APIs | -| `archive/migration-2026/sql/` | Legacy-DB-Dumps (Snapshots vom 23.04.2026) | +| `roadmap.md` | Aktuelle Roadmap: Sofortmaßnahmen, Termine, Rechtstexte, nächstes Release, Live-Nachweise, Wachstum, technische Schuld | +| `betrieb/git-deploy.md` + `betrieb/deploy.sh` | Deploy per Git-Tag (seit v1.1.3) mit Deploy-Protokoll je Release — **erste Anlaufstelle für Deploys** | +| `betrieb/deploy-runbook.md` | Betriebs-Runbook: Voraussetzungen, `.env`, Worker, Scheduler, Stripe-Webhook, Restore/Archiv (in Teilen veraltet, siehe Roadmap 8.1) | +| `betrieb/monitoring-plan.md` | Betriebsüberwachung Phase 1 (live), Phase 2/3 geplant, externer Monitor | +| `betrieb/api-legacy-paritaet.md` | Verhaltens-Referenz der Legacy-API (`/service/…`), solange connektar die Alt-Pfade nutzt | +| `sicherheit/` | Sicherheitsaudit 07.10., Entwicklungsplan Sicherheit (Wiedervorlage-Tabelle oben), Entwicklungsplan Spamschutz | +| `bildrechte/` | Bildnachweis, KI-Kennzeichnung, Beweisarchiv: Entwicklungsplan Fassung 2 und Decision-Update 22.09. — maßgeblich bis Deploy 3 (Rechtstexte) und Blöcke I/J | +| `rechtliches/` | Anwaltspaket Datenschutz Oktober 2026 (Entwurf): fehlende DSE-Abschnitte, Textentwürfe, Fragen | +| `changelog/` | Decision-Update Changelog-Automatisierung (04.10., noch nicht begonnen) | +| `glitch-tip/` | Fehlerprotokoll: API-Abruf, Triage-Ablauf, Regeln, Protokoll der Einträge | +| `git-deploy-monitoring/` | Projektunabhängiger Baukasten (Git-Deploy, GlitchTip, Monitoring) für andere Laravel-Projekte | ## Archiv (`archive/`) -Abgeschlossene Phasen, als Historie/Referenz erhalten: +| Pfad | Inhalt | +| --- | --- | +| `2026-09-nutzergewinnung/` | Roadmap Nutzergewinnung 01.09. mit Anhängen 1 und 2 (Block 0–2 und 3.1 erledigt, Rest in `roadmap.md`), Basiswerte Block 0 (Vergleichspunkt für 2027), Umsetzungsprotokoll Teil 1–11, Bestandsaufnahme Code, Bounce-Konzept | +| `2026-09-audit/` | Audit 11.09., Entwicklungsplan Blöcke 1–10 (live als v1.1.0), Umsetzungsaudits 18.09./25.09./29.09./02.10., Bildkennzeichnung Vorschlag und Feedback-Audit (ersetzt durch `bildrechte/`), Kontakterreichbarkeit | +| `legacy-rechnungen/` | Entwicklungsplan Legacy-Rechnungen (Phasen B, 0–3 live; Phase 4 in der Roadmap) | +| `betrieb/` | Deploy-Protokoll v1.1.0 (letzter SFTP-Deploy), Umami-Snippets | +| `release/` | Release-Plan, QA-Checkliste, Boost-Platzierung, Go-Live-Roadmap vom 20.07. | +| `optimize/` | System-Optimierungen 0–6 und Cutover-Runbook der Legacy-Migration (mit Anleitung für `--since`-Delta-Läufe) | +| `migration-2026/` | Analyse und Planung der Legacy-Migration (Datenmodell, Merge, API-Kunden, Fortschritt) | +| `frontend/`, `frontend-audits/` | Frontend-Konzepte, Mockups, Responsive-Audits vom 16.07. | +| `agentur-attribution/`, `legacy_logging/`, `legacy_performance/`, `_old/` | Ältere Einzelthemen und Altsystem-Reste | + +## Lokal / gitignored (nicht committen) + +Am 09.10.2026 gelöscht: Medien-Staging der Legacy-Migration (`migration/`, +7,4 GB), Legacy-DB-Dumps (`archive/migration-2026/sql/`), Postman-Collection +und Activity-Logs der Alt-APIs (`api/`), Bounce-Adressliste (`newsletter/`), +Produktions-Log (`2026-10/`). Die Muster in `.gitignore` bleiben, damit solche +Dateien nie wieder versioniert werden. **Personenbezogene Daten und Schlüssel +gehören nicht unter `dev/`.** + +Die Git-Historie wurde am selben Tag von den SQL-Dumps bereinigt; seitdem +sind alle Commit-Hashes neu. Alte Hashes in Doku und Commit-Nachrichten +lassen sich über [`archive/commit-map-2026-10-09.txt`](archive/commit-map-2026-10-09.txt) +auflösen. -- `optimize/` — System-Optimierungsphasen 0–6 **und das Cutover-Runbook der - Legacy-Migration** (erledigt 20.07.2026; enthält weiterhin die Anleitung für - `--since`-Delta-Läufe, falls das Alt-System noch einmal Daten liefert) -- `release/` — Release-Entwicklungsplan, manuelle QA-Checkliste, - Boost-Platzierungs-Entscheidung -- `migration-2026/` — Analyse- und Planungsdoku der Legacy-Migration - (Datenmodell, Merge-Strategie, API-Kunden, Fortschritt) -- `frontend/` + `frontend-audits/` — Frontend-Konzepte und die - Responsive-/Mobile-Audits vom 16.07. -- `agentur-attribution/`, `legacy_logging/`, `legacy_performance/`, `_old/` — - ältere Einzelthemen bzw. Altsystem-Reste diff --git a/dev/2026-09-11-audit/AUDIT.md b/dev/archive/2026-09-audit/AUDIT.md similarity index 100% rename from dev/2026-09-11-audit/AUDIT.md rename to dev/archive/2026-09-audit/AUDIT.md diff --git a/dev/2026-09-11-audit/ENTWICKLUNGSPLAN.md b/dev/archive/2026-09-audit/ENTWICKLUNGSPLAN.md similarity index 100% rename from dev/2026-09-11-audit/ENTWICKLUNGSPLAN.md rename to dev/archive/2026-09-audit/ENTWICKLUNGSPLAN.md diff --git a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-18.md b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-18.md similarity index 100% rename from dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-18.md rename to dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-18.md diff --git a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-25.md b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-25.md similarity index 99% rename from dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-25.md rename to dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-25.md index f1f3b061..6ccc6b12 100644 --- a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-25.md +++ b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-25.md @@ -6,7 +6,7 @@ **Vergleich:** `fb03fb166d08fe891ae5ab3a221c8a232b7c8366..d99f55e5556d601373a1bd251051c015cc9eda91` — 28 Commits, 271 geänderte Dateien, 16.950 hinzugefügte und 644 entfernte Zeilen einschließlich Dokumentation und weiterer Assets. -**Grundlagen:** [letzter Umsetzungs-Audit](UMSETZUNGSAUDIT-2026-09-18.md), [Entwicklungsplan mit Block 7 und Entscheidungen E7–E9](ENTWICKLUNGSPLAN.md), [Bildkennzeichnungsplan, Fassung 2 einschließlich Fortschreibung vom 25.09.](bildkennzeichnung-entwicklungsplan-2026-09-21.md), [Decision-Update vom 22.09.](Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [ursprünglicher Audit](AUDIT.md). +**Grundlagen:** [letzter Umsetzungs-Audit](UMSETZUNGSAUDIT-2026-09-18.md), [Entwicklungsplan mit Block 7 und Entscheidungen E7–E9](ENTWICKLUNGSPLAN.md), [Bildkennzeichnungsplan, Fassung 2 einschließlich Fortschreibung vom 25.09.](../../bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md), [Decision-Update vom 22.09.](../../bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [ursprünglicher Audit](AUDIT.md). **Auftrag:** Änderungen seit dem letzten Audit, deren dokumentierte Umsetzung und die aktuelle Entwicklung prüfen. Ausschließlich diesen neuen Audit erstellen. Keine Änderungen an Anwendung, Tests, Konfiguration, Datenbestand oder vorhandenen Dokumenten. @@ -316,7 +316,7 @@ Die ursprünglichen F01–F28 sind im Audit vom 18.09. vollständig zugeordnet. ### N15 — P2: Alterskohorten lassen zwischen ihren Intervallen ganze Tage aus -**Belege:** `app/Services/PressRelease/ViewDistributionReport.php:123`; [gespeicherte Kohortenauswertung](../2026-09-01/basiswert-0.1-kohorten.json). +**Belege:** `app/Services/PressRelease/ViewDistributionReport.php:123`; [gespeicherte Kohortenauswertung](../2026-09-nutzergewinnung/basiswert-0.1-kohorten.json). **Befund:** Die untere Datumsgrenze einer Kohorte wird mit `reference - (upperDays - 1)` gebildet, während die nächste Kohorte erst bei `reference - upperDays` anschließt. Beispielsweise gehört eine 6,5 Tage alte Meldung weder zu „0–6“ noch zu „7–13“. Dasselbe gilt an den weiteren Übergängen 13/14, 20/21, 27/28, 55/56 und 90/91. diff --git a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-29.md b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-29.md similarity index 99% rename from dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-29.md rename to dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-29.md index 59be9951..c2e574f2 100644 --- a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-09-29.md +++ b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-09-29.md @@ -3,7 +3,7 @@ **Prüfdatum:** 29.09.2026 **Geprüfter Code:** `98c465b` auf `technik/betriebsfixes-2026-09` (entspricht dem Live-Stand nach Deploy 1/1b/2/2b vom 28.09.2026) **Vergleich:** Schwerpunkt `d99f55e..98c465b` (Nacharbeit Block 8: `4e34c3d`, `48129e9`), dazu ein neuer Durchgang über die seit 01.09. gebauten Roadmap- und Bildfunktionen -**Grundlagen:** [Entwicklungsplan Blöcke 1–8](ENTWICKLUNGSPLAN.md), [Umsetzungsaudit 25.09.](UMSETZUNGSAUDIT-2026-09-25.md), [Bildkennzeichnungsplan Fassung 2](bildkennzeichnung-entwicklungsplan-2026-09-21.md), [Decision-Update 22.09.](Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [Roadmap](../2026-09-01/roadmap-2026.md) mit Anhängen 1 und 2, [Umsetzungsprotokoll](../2026-09-01/umsetzung-protokoll.md) +**Grundlagen:** [Entwicklungsplan Blöcke 1–8](ENTWICKLUNGSPLAN.md), [Umsetzungsaudit 25.09.](UMSETZUNGSAUDIT-2026-09-25.md), [Bildkennzeichnungsplan Fassung 2](../../bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md), [Decision-Update 22.09.](../../bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [Roadmap](../2026-09-nutzergewinnung/roadmap-2026.md) mit Anhängen 1 und 2, [Umsetzungsprotokoll](../2026-09-nutzergewinnung/umsetzung-protokoll.md) **Umsetzung:** Am selben Tag als Block 9 umgesetzt — Stand, Entscheidungen E19–E34 und Live-Schritte im [Entwicklungsplan](ENTWICKLUNGSPLAN.md#block-9--umsetzung-des-umsetzungsaudits-vom-29092026). Der Bericht selbst bleibt als Befundstand erhalten; Korrektur: Q-07 war ein Fehlalarm. **Zweck:** Stand der Dinge nach dem Live-Gang aufnehmen, die Block-8-Nacharbeit gegenprüfen, neue Fehler und Optimierungen belegen und alles Offene an einer Stelle sammeln, damit die Entwicklung hier weitergehen kann. diff --git a/dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-10-02.md b/dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-10-02.md similarity index 100% rename from dev/2026-09-11-audit/UMSETZUNGSAUDIT-2026-10-02.md rename to dev/archive/2026-09-audit/UMSETZUNGSAUDIT-2026-10-02.md diff --git a/dev/2026-09-11-audit/bildkennzeichnung-2026-09-15.md b/dev/archive/2026-09-audit/bildkennzeichnung-2026-09-15.md similarity index 100% rename from dev/2026-09-11-audit/bildkennzeichnung-2026-09-15.md rename to dev/archive/2026-09-audit/bildkennzeichnung-2026-09-15.md diff --git a/dev/2026-09-11-audit/bildkennzeichnung-feedback-audit-2026-09-15.md b/dev/archive/2026-09-audit/bildkennzeichnung-feedback-audit-2026-09-15.md similarity index 100% rename from dev/2026-09-11-audit/bildkennzeichnung-feedback-audit-2026-09-15.md rename to dev/archive/2026-09-audit/bildkennzeichnung-feedback-audit-2026-09-15.md diff --git a/dev/2026-09-11-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md b/dev/archive/2026-09-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md similarity index 99% rename from dev/2026-09-11-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md rename to dev/archive/2026-09-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md index 11312e36..d7ad6c49 100644 --- a/dev/2026-09-11-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md +++ b/dev/archive/2026-09-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md @@ -181,6 +181,6 @@ Diese Betriebsdetails sind noch keine implementierten oder abschließend festgel - [SMTP: DNS-Auflösung und impliziter MX, RFC 5321 § 5.1](https://datatracker.ietf.org/doc/html/rfc5321#section-5.1) - [Null MX: Domain nimmt keine E-Mails an, RFC 7505](https://www.rfc-editor.org/rfc/rfc7505.html) - [Postmark: Einordnung von Bounces und Spam-Beschwerden](https://postmarkapp.com/support/article/what-are-bounces-and-spam-complaints) -- [Bisheriges Bounce-Konzept vom 15.09.2026](../2026-09-01/bounce-mails-2026-09-15.md) +- [Bisheriges Bounce-Konzept vom 15.09.2026](../2026-09-nutzergewinnung/bounce-mails-2026-09-15.md) Dieses Dokument ergänzt das bisherige Bounce-Konzept um die Prüfung beim Einreichen und deren Auswirkungen auf die Veröffentlichung. Aussagen zum vorhandenen Verhalten beruhen auf dem oben verlinkten Code, nicht auf einer bestätigten produktiven Ausführung. diff --git a/dev/2026-09-01/basiswert-0.1-kohorten.json b/dev/archive/2026-09-nutzergewinnung/basiswert-0.1-kohorten.json similarity index 100% rename from dev/2026-09-01/basiswert-0.1-kohorten.json rename to dev/archive/2026-09-nutzergewinnung/basiswert-0.1-kohorten.json diff --git a/dev/2026-09-01/basiswert-0.1.json b/dev/archive/2026-09-nutzergewinnung/basiswert-0.1.json similarity index 100% rename from dev/2026-09-01/basiswert-0.1.json rename to dev/archive/2026-09-nutzergewinnung/basiswert-0.1.json diff --git a/dev/2026-09-01/basiswerte-block0.md b/dev/archive/2026-09-nutzergewinnung/basiswerte-block0.md similarity index 100% rename from dev/2026-09-01/basiswerte-block0.md rename to dev/archive/2026-09-nutzergewinnung/basiswerte-block0.md diff --git a/dev/2026-09-01/bestandsaufnahme-code.md b/dev/archive/2026-09-nutzergewinnung/bestandsaufnahme-code.md similarity index 100% rename from dev/2026-09-01/bestandsaufnahme-code.md rename to dev/archive/2026-09-nutzergewinnung/bestandsaufnahme-code.md diff --git a/dev/2026-09-01/bounce-mails-2026-09-15.md b/dev/archive/2026-09-nutzergewinnung/bounce-mails-2026-09-15.md similarity index 100% rename from dev/2026-09-01/bounce-mails-2026-09-15.md rename to dev/archive/2026-09-nutzergewinnung/bounce-mails-2026-09-15.md diff --git a/dev/2026-09-01/roadmap-2026.md b/dev/archive/2026-09-nutzergewinnung/roadmap-2026.md similarity index 100% rename from dev/2026-09-01/roadmap-2026.md rename to dev/archive/2026-09-nutzergewinnung/roadmap-2026.md diff --git a/dev/2026-09-01/roadmap-anhang1-2026.md b/dev/archive/2026-09-nutzergewinnung/roadmap-anhang1-2026.md similarity index 100% rename from dev/2026-09-01/roadmap-anhang1-2026.md rename to dev/archive/2026-09-nutzergewinnung/roadmap-anhang1-2026.md diff --git a/dev/2026-09-01/roadmap-anhang2-2026.md b/dev/archive/2026-09-nutzergewinnung/roadmap-anhang2-2026.md similarity index 100% rename from dev/2026-09-01/roadmap-anhang2-2026.md rename to dev/archive/2026-09-nutzergewinnung/roadmap-anhang2-2026.md diff --git a/dev/2026-09-01/umsetzung-protokoll.md b/dev/archive/2026-09-nutzergewinnung/umsetzung-protokoll.md similarity index 100% rename from dev/2026-09-01/umsetzung-protokoll.md rename to dev/archive/2026-09-nutzergewinnung/umsetzung-protokoll.md diff --git a/dev/betrieb/deploy-v1.1.0.md b/dev/archive/betrieb/deploy-v1.1.0.md similarity index 98% rename from dev/betrieb/deploy-v1.1.0.md rename to dev/archive/betrieb/deploy-v1.1.0.md index 8d5970ba..cfee3c61 100644 --- a/dev/betrieb/deploy-v1.1.0.md +++ b/dev/archive/betrieb/deploy-v1.1.0.md @@ -4,8 +4,8 @@ **Stand:** 05.10.2026 · **Live bisher:** Stand `98c465b` (Deploy 28.09.2026, ca. 14:34) **Inhalt:** alles danach — Blöcke 9 und 10 aus dem Audit -([`ENTWICKLUNGSPLAN.md`](../2026-09-11-audit/ENTWICKLUNGSPLAN.md), Deploy-Plan -dort), Betriebsüberwachung Phase 1 ([`monitoring-plan.md`](monitoring-plan.md)), +([`ENTWICKLUNGSPLAN.md`](../2026-09-audit/ENTWICKLUNGSPLAN.md), Deploy-Plan +dort), Betriebsüberwachung Phase 1 ([`monitoring-plan.md`](../../betrieb/monitoring-plan.md)), Composer-Update, Versionsnummer. Umfang gegenüber Live: 8 additive Migrationen, 2 neue Composer-Pakete diff --git a/dev/archive/betrieb/deploy-v1.10.0.md b/dev/archive/betrieb/deploy-v1.10.0.md new file mode 100644 index 00000000..99cd0bb3 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.10.0.md @@ -0,0 +1,52 @@ +# Deploy v1.10.0 — Messung im Trichter und Seite „Wachstum“ + +**Stand:** 13.10.2026 · **Live bisher:** `v1.9.1` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Roadmap [6.1 und 6.16](../../roadmap.md)): + +- **Messfehler im Trichter behoben.** + - Die Stufe „Magic Link eingelöst“ trägt jetzt die Firma und Meldung aus dem Token. Bisher stand jede Einlösung unter „ohne Firma“, die Stufe zeigte immer 0 Firmen. + - Neue Stufen „Verwaltungsseite geöffnet“ und „Anmeldelink angefordert“ zwischen Mail-Klick und Einlösung. Scanner, Crawler und wiederholte Aufrufe zählen nicht. + - Die Erstbuchung trägt die Herkunft des zuletzt eingelösten Links statt immer `organic`. + - Die Leiter hat jetzt 7 Stufen. +- **Admin ▸ Reports ▸ Wachstum:** + - Abbruchbedingungen für Block 1 bis 3 mit Ist, zeitanteiligem Soll, Schwelle und Status; + - Trichter seit 17.09.; + - Transparenzseiten aus Umami. +- **Neue Befehle:** `php artisan growth:report` (dieselben Zahlen wie die Seite) und `php artisan umami:report` (nur lesend, z. B. `--metric=referrer --path=gute-pressemitteilung`). + +**Umfang:** keine Migration, Scheduler unverändert, neue Assets (beide Builds, mitcommittet). **Neue `.env`-Werte** (nur lesender Umami-Zugang). Ohne sie läuft alles, nur die Umami-Werte zeigen „nicht verbunden“. Suite 2.543 grün, einer übersprungen; Larastan ohne Meldung. + +## Vor dem Deploy: Live-`.env` ergänzen + +```dotenv +UMAMI_API_URL=https://sys.adametz.media +UMAMI_API_USERNAME=… # View-only-Benutzer aus dem Team „Presse Reports“ +UMAMI_API_PASSWORD="…" +UMAMI_API_TEAM_ID=5adb8c3b-9119-46b2-804c-86d6063df941 +``` + +Bei der Gelegenheit auf doppelte Einträge prüfen (wie bei `IMAGE_RIGHTS_V2`/`UMAMI_ENABLED`): + +```bash +grep -E '^[A-Z_]+=' .env | cut -d= -f1 | sort | uniq -d +``` + +## Deploy + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.10.0 +``` + +## Prüfungen danach + +- `/health` meldet `v1.10.0`, die Betriebsüberwachung ist grün. +- `php artisan growth:report --fresh`: alle drei Blöcke, Block 2 mit Zahlen statt „nicht verbunden“. +- `php artisan umami:report --site=businessportal24 --metric=referrer --limit=5` zeigt die Herkunft. +- Admin ▸ Reports ▸ Wachstum öffnet. +- Einmal selbst „Diesen Newsroom verwalten“ auf einer eigenen Firma öffnen und den Link anfordern. Danach zeigt `php artisan conversion:funnel --months=1` unter „Hinweis auf der Newsroom-Seite“ die Stufen 2 und 3 mit Firma. + +## Hinweis zu den Zahlen + +Einlösungen vor diesem Deploy bleiben „ohne Firma“. Die Seite nennt sie als Zusatz unter der Bedingung. Die Stufen „Verwaltungsseite geöffnet“ und „Anmeldelink angefordert“ zählen erst ab dem Deploy. diff --git a/dev/archive/betrieb/deploy-v1.11.0.md b/dev/archive/betrieb/deploy-v1.11.0.md new file mode 100644 index 00000000..695ad00c --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.11.0.md @@ -0,0 +1,24 @@ +# Deploy v1.11.0 — Newsroom verwalten sichtbar, Firma ↔ Newsroom verknüpft + +**Stand:** 13.10.2026 · **Live bisher:** `v1.10.0` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Roadmap [6.17](../../roadmap.md)): + +- **Newsroom-Seite:** Der Verwaltungszugang ist jetzt ein eigener Kasten statt einer grauen Zeile in der Profilbox. Es ist derselbe Kasten wie unter jeder Meldung (gemeinsame Komponente), mit maskierter Adresse und dem Knopf „Anmeldelink anfordern“. Auf Mobil steht er direkt unter dem Profil, am Desktop oben in der Seitenleiste. Der doppelte Kasten „Eigenen Newsroom starten“ entfällt, „Veröffentlichen“ bleibt. +- **Kunden- und Admin-Firmenseite** heißen jetzt „Firma & Newsroom“. Unter dem Namen stehen die Links zum öffentlichen Newsroom je Portal, oder der Hinweis, dass der Newsroom erst mit der ersten Meldung erscheint. Das Menü heißt weiter „Firmen“ (Entscheidung 13.10.2026: Firma bleibt, Newsroom wird verknüpft). + +**Umfang:** keine Migration, keine neuen `.env`-Werte, kein Asset-Diff, Scheduler unverändert. Suite 2.548 grün, einer übersprungen; Larastan ohne Meldung. Erste Commits mit `Changelog:`/`Public:`-Zeilen (E20). + +## Deploy + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.11.0 +``` + +## Prüfungen danach + +- `/health` meldet `v1.11.0`. +- Ein Newsroom auf presseecho.de und businessportal24.com, am Desktop und auf dem Handy: Der Kasten „Diesen Newsroom verwalten“ steht mit maskierter Adresse an der richtigen Stelle. +- Kundenbereich ▸ Firmen ▸ eine Firma: Der Link „Öffentlicher Newsroom“ führt auf die richtige Seite. +- Ab jetzt beobachten: `php artisan conversion:funnel --months=1`, „Hinweis auf der Newsroom-Seite“, Übergang von Stufe 2 nach 3. Vorher 7 → 1. diff --git a/dev/archive/betrieb/deploy-v1.12.0.md b/dev/archive/betrieb/deploy-v1.12.0.md new file mode 100644 index 00000000..61852b99 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.12.0.md @@ -0,0 +1,31 @@ +# Deploy v1.12.0 — Anmeldelink aus der Kundenmail + +**Stand:** 13.10.2026 · **Live bisher:** `v1.11.0` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Roadmap [6.17](../../roadmap.md)): + +- **Veröffentlichungsmail an Empfänger ohne Konto** (API-Meldungen an Pressekontakt oder Firmen-E-Mail): Kasten „Etwas ändern oder die Aufrufe sehen?“ mit der Adresse der Mail und dem Knopf „Anmeldelink anfordern“. Der bisherige Text „in Ihrem Konto … mit Passwort oder Magic-Link“ entfällt. +- **Ablehnungsmail an Empfänger ohne Konto:** „Sie können die Meldung selbst überarbeiten und kostenlos erneut einreichen“, mit Anmeldelink (Entscheidung 14.10.2026, Roadmap 6.18). +- **Behoben:** Die Ergebnismail nach einer Wiedereinreichung durch den Pressekontakt wäre an das Konto des Einlieferers gegangen (connektar). Jetzt gilt eine Meldung als API-Meldung, sobald sie einmal über die API eingereicht wurde, und die Mail geht an den Kontakt. +- **Kunden mit eigenem Konto:** Knopf „Im pressekonto öffnen“ bzw. wie bisher „Pressemitteilung bearbeiten“. +- **Neue Seite `pressekonto.com/zugang`:** nur über den signierten Link aus der Mail (30 Tage gültig, die Adresse steht verschlüsselt im Link). Ein Klick schickt den Anmeldelink an genau diese Adresse, höchstens 3 pro Stunde. Die Anmeldung landet auf der Meldung. Gemessen wird in den Trichterstufen 2 und 3. + +**Umfang:** keine Migration, keine neuen `.env`-Werte, kein Asset-Diff, Scheduler unverändert. Suite 2.555 grün, einer übersprungen; Larastan ohne Meldung. + +## Deploy + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.12.0 +``` + +## Prüfungen danach + +- `/health` meldet `v1.12.0`. +- Den Mailtext selbst ansehen, ohne Versand (die Meldungs-ID ist eine eigene API-Meldung): + ```bash + php artisan tinker --execute '$pr = App\Models\PressRelease::find(ID); file_put_contents(storage_path("app/mail-vorschau.html"), (new App\Mail\PressReleasePublished($pr->user, $pr, "Test", "deine-adresse@beispiel.de", true))->render());' + ``` + `storage/app/mail-vorschau.html` im Browser öffnen und danach löschen. +- Den Ablauf einmal echt durchspielen: Den Link aus der Vorschau öffnen, „Anmeldelink senden“, die Mail kommt an die eingetragene Adresse, der Klick landet auf der Meldung. Die eingetragene Adresse muss als Kontakt oder Firmen-E-Mail dieser Meldung hinterlegt sein, sonst geht nichts raus (neutrale Meldung). +- In den nächsten Tagen: `php artisan conversion:funnel --months=1` unter „Veröffentlichungsmail“, Stufen 2 und 3. diff --git a/dev/archive/betrieb/deploy-v1.13.0.md b/dev/archive/betrieb/deploy-v1.13.0.md new file mode 100644 index 00000000..a4f105e5 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.13.0.md @@ -0,0 +1,37 @@ +# Deploy v1.13.0 — Changelog + +**Stand:** 14.10.2026 · **Live bisher:** `v1.12.0` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Roadmap [6.6](../../roadmap.md), [Decision-Update Changelog](../../changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md), Stufen 1 bis 3): + +- **Entwürfe beim Deploy:** `deploy.sh` ruft nach `up` den Befehl `php artisan changelog:collect ` auf. Aus den Commit-Zeilen `Changelog:`/`Public:` entstehen Entwürfe. Commits ohne diese Zeile bleiben intern, Sicherheit wird je Release zu einer Sammelzeile. Ein Fehler hier bricht den Deploy nicht ab. +- **Admin ▸ Einstellungen ▸ Changelog** (nur `settings:manage`): gegenlesen, bearbeiten, Rubrik ändern, als artikelwürdig markieren, freigeben oder verwerfen. Alle Entwürfe eines Tages lassen sich auf einmal freigeben, Einträge auch von Hand anlegen. +- **Öffentlich:** `pressekonto.com/changelog` und `/changelog/feed` (RSS). Auf presseecho und businessportal24 leitet die Adresse auf den Hub weiter. +- **Kundenmenü:** „Was ist neu“, mit dem Kennzeichen „Neu“, solange ein freigegebener Eintrag höchstens 14 Tage alt ist. + +**Umfang:** **eine Migration** (`create_changelog_entries_table`, neue Tabelle, kein Eingriff in bestehende Tabellen), keine neuen `.env`-Werte, neue Assets (mitcommittet), Scheduler unverändert. Suite 2.564 grün, einer übersprungen; Larastan ohne Meldung. + +## Deploy + +```bash +cd ~/pressekonto.com +# DB-Backup wie üblich vorher, dann: +bash dev/betrieb/deploy.sh v1.13.0 --migrations +``` + +`deploy.sh` läuft aus einer Kopie des **bisher ausgecheckten** Skripts. Beim Deploy von v1.13.0 fehlt der Changelog-Schritt also noch; er greift ab dem nächsten Release. Einmalig von Hand, je Release mit seinem Live-Datum, dazu der Nachtrag seit dem Relaunch: + +```bash +php artisan changelog:collect v1.10.0 v1.11.0 --date=2026-10-13 +php artisan changelog:collect v1.11.0 v1.12.0 --date=2026-10-14 +php artisan changelog:collect v1.12.0 v1.13.0 +php artisan changelog:backfill +``` + +## Prüfungen danach + +- `/health` meldet `v1.13.0`. +- Admin ▸ Changelog: Die Entwürfe stehen dort, die Nachträge mit dem Vermerk „Datum und Text prüfen“. +- Einige Einträge freigeben, dann `pressekonto.com/changelog` öffnen, ebenso den Feed `/changelog/feed`. +- `presseecho.de/changelog` leitet auf `pressekonto.com/changelog` weiter. +- Im Kundenbereich steht „Was ist neu“ mit dem Kennzeichen „Neu“, sobald ein freigegebener Eintrag aus den letzten 14 Tagen existiert. Das Kennzeichen wird bis zu 10 Minuten zwischengespeichert. diff --git a/dev/archive/betrieb/deploy-v1.13.1.md b/dev/archive/betrieb/deploy-v1.13.1.md new file mode 100644 index 00000000..8c80ca99 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.13.1.md @@ -0,0 +1,27 @@ +# Deploy v1.13.1 — Prüfmail mit Anmeldelink, Changelog verlinkt + +**Stand:** 14.10.2026 · **Live bisher:** `v1.13.0` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Roadmap [6.17](../../roadmap.md)): + +- **Mail „Ihre Pressemitteilung wird persönlich geprüft“ an Empfänger ohne Konto** (API-Meldungen): Kasten „Den Stand der Prüfung sehen?“ mit der Adresse der Mail und dem Knopf „Anmeldelink anfordern“, wie in der Veröffentlichungs- und Ablehnungsmail. Bisher führte der Knopf auf die Passwort-Anmeldung. „Sie müssen nichts tun“ bleibt der Kern der Mail. +- **Kunden mit eigenem Konto:** unverändert „Stand der Prüfung ansehen“. +- **Changelog verlinkt** (pressekonto.com): Hauptnavigation vor „FAQ“ (Desktop und Mobilmenü) und Footer-Spalte „Plattform“. +- **Messung:** Die Zugangsseite `/zugang` übernimmt die Herkunft `mail_review` (bisher nur Veröffentlichungs- und Ablehnungsmail). + +**Umfang:** keine Migration, keine neuen `.env`-Werte, kein Asset-Diff, Scheduler unverändert. Suite 2.566 grün, einer übersprungen; Larastan ohne Meldung. + +**Changelog:** Erster Deploy, bei dem `deploy.sh` den Entwurf selbst anlegt (zwei Einträge „Verbessert“). Danach in Admin ▸ Einstellungen ▸ Changelog freigeben. + +## Deploy + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.13.1 +``` + +## Prüfungen danach + +- `/health` meldet `v1.13.1`. +- Die Ausgabe des Deploys zeigt den Schritt „Changelog-Entwurf“ mit einem angelegten Eintrag; im Admin liegt er als Entwurf. +- In den nächsten Wochen: `php artisan conversion:funnel --months=1` unter „Prüfhinweis-Mail“. diff --git a/dev/archive/betrieb/deploy-v1.9.0.md b/dev/archive/betrieb/deploy-v1.9.0.md new file mode 100644 index 00000000..c7acf804 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.9.0.md @@ -0,0 +1,33 @@ +# Deploy v1.9.0 — Rechtspaket: Boost-Kennzeichnung und Rollenprüfung + +**Stand:** 13.10.2026 · **Live bisher:** `v1.8.1` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Inhalt** (Aufgaben U10 und BN-02 aus dem [Anwaltspaket](../../rechtliches/anwaltspaket-datenschutz-2026-10-12.md)): + +- Boost-Label „Gebuchte Platzierung“ (en „Booked placement“) statt „Top-Platzierung“ auf Start- und Branchenseite. Die Erklärung erscheint am Desktop beim Überfahren und auf Mobil per Tipp; Screenreader lesen sie mit. +- Kopfzeile über dem Aufmacher „Aktuell“ statt „Top-Auswahl“. +- Preisseite: „Geboostete Meldungen sind als gebuchte Platzierung gekennzeichnet.“ +- Admin ▸ Pressemitteilung: Panel „Gebuchte Platzierung“ mit Aktion „Boost beenden“. Sie braucht einen Pflichtgrund und `billing:manage`, bucht keine Credits zurück und schreibt den Verlaufstyp „Boost beendet“. +- `php artisan audit:admins`: Berechtigungsliste als Markdown (Nachweis BN-02). + +**Umfang:** keine Migration, keine neuen `.env`-Werte, Scheduler unverändert, neue Assets (beide Builds, mitcommittet). Suite 2.527 grün, einer übersprungen; Larastan ohne Meldung. + +## Deploy + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.9.0 +``` + +## Prüfungen danach + +- `/health` meldet `v1.9.0`, die Betriebsüberwachung ist grün. +- Startseite presseecho.de: Kopfzeile „… · Aktuell“; ohne laufenden Boost erscheint kein Label. +- Preisseite: Satz zur Kennzeichnung in der Note „Boost — was Sie bekommen und was nicht“. +- `php artisan audit:admins` läuft und zeigt den Bestand. + +## Direkt im Anschluss (Rechtspaket) + +1. Rollenprüfung nach [bn-02-ablauf.md](../../rechtliches/nachweise/bn-02-ablauf.md): Vorher-Liste, neue Login-Adresse und Super-Admin-Merker für das Betriebskonto, Altkonten bereinigen, Nachher-Liste. +2. Test-Boost auf eine eigene Test-Mitteilung buchen (Credits über Admin ▸ Benutzer gutschreiben). Screenshots `boost-01` bis `boost-04` nach [nachweise/README.md](../../rechtliches/nachweise/README.md) aufnehmen, dann unter Admin ▸ Pressemitteilung „Boost beenden“. +3. Zeile im Protokoll von `git-deploy.md` und in der Release-Tabelle der Roadmap nachtragen. diff --git a/dev/archive/betrieb/deploy-v1.9.1.md b/dev/archive/betrieb/deploy-v1.9.1.md new file mode 100644 index 00000000..b0c7d314 --- /dev/null +++ b/dev/archive/betrieb/deploy-v1.9.1.md @@ -0,0 +1,24 @@ +# Deploy v1.9.1 — Bildnachweis und Erklärung am Boost-Label auf Mobil + +**Stand:** 13.10.2026 · **Live bisher:** `v1.9.0` · Ablauf nach [git-deploy.md](../../betrieb/git-deploy.md), Abschnitte C und D. + +**Anlass:** Die Screenshots `boost-03` und `boost-04` aus dem Nachweisordner zeigten auf 390 px Breite zwei Fehler. Das Label „Gebuchte Platzierung“ verdeckte den Bildnachweis („Foto: …“) oben rechts am Aufmacher, und die Erklärung stieß rechts an den Bildrand. + +**Inhalt:** + +- Bildnachweis am Aufmacher (Start- und Branchenseite) auf Mobil unten rechts im freien Rand unter der Meta-Zeile, ab `sm` unverändert oben rechts. +- Erklärung am Schild „Gebuchte Platzierung“ rechtsbündig unter dem Label. +- `audit:admins`: „Gelistet ist 1 Konto“ statt „Gelistet sind 1 Konten“. + +**Umfang:** keine Migration, keine neuen `.env`-Werte, neue Assets (mitcommittet). + +## Deploy und Prüfungen + +```bash +cd ~/pressekonto.com +bash dev/betrieb/deploy.sh v1.9.1 +``` + +- `/health` meldet `v1.9.1`. +- presseecho.de auf 390 px mit laufendem Test-Boost: Bildnachweis unten rechts sichtbar, Label oben links, Tipp auf das Label zeigt die Erklärung vollständig. +- Danach `boost-03` und `boost-04` neu aufnehmen und den Test-Boost unter Admin ▸ Pressemitteilung beenden. diff --git a/dev/betrieb/umami.md b/dev/archive/betrieb/umami.md similarity index 100% rename from dev/betrieb/umami.md rename to dev/archive/betrieb/umami.md diff --git a/dev/archive/commit-map-2026-10-09.txt b/dev/archive/commit-map-2026-10-09.txt new file mode 100644 index 00000000..44e8d5ec --- /dev/null +++ b/dev/archive/commit-map-2026-10-09.txt @@ -0,0 +1,510 @@ +# Commit-Hashes vor und nach der Historienbereinigung vom 09.10.2026 +# +# Die Produktiv-SQL-Dumps (dev/migration 2026/sql) wurden aus allen Commits +# entfernt; Inhalt und Reihenfolge sind sonst unverändert, die Hashes sind neu. +# Verweise in der Doku und in Commit-Nachrichten nennen die alten Hashes. +# Spalten: alt neu Betreff (chronologisch) + +5b8bdf4 313270b 12-05-2026 Frontend dev +092ee0e 8bfa378 13-05-2026 Frontend DEV + HUB +0a3e52d 36810ac 19-05-2026 Rebrand Pressekonto, Hub-Flux UI und Legacy-Media-Migration +9b47296 9844b41 Rebrand Hub+Flux +d2ba22c 36c6499 create PM v0.5 +e8c47b7 fd1f6bd 22-05-2026 Optimierung der User und Admin Panels +4bb9094 a8d1228 29-05-2026 Optimierungen Fixes am Code +0efabaf ba0ee12 Multi-Domain-Asset-Infrastruktur: geteilte Vite-Konfiguration und DomainAssetContext +a000238 48993f5 User Panel: Phase-8-Abschluss, Titelbild/Lizenzen/Zeitzonen und KI-Pruef-Pipeline +8d8d957 b2b5ff0 Doku: Status-Sync 11./12.06., Decision-Update Preisstruktur und Phase-9-Plan +4419d9f 6b0ca3f Phase 9 Block 1: Gelb-Routing Direkt-Live, Slot-Verbrauch bei Veroeffentlichung, Submit-Gate +d548f4b d2501ca Phase 9D: Tarif-Datenmodell, Cashier und hybride Rechnungskreise STR-/MAN- +1cd4d8e 9f610f4 P6.6: legacy:grandfather-subscriptions — aktive Legacy-Abos aus dem Rechnungsarchiv migrieren +894a943 808d94f USt-Behandlung: Netto-Preise, VatResolver und Steuer-Ausweis im MAN-Kreis +62e6b7e a9dd565 Doku: zentrale Billing-Referenz und Status-Sync Phase 9D +38fab64 b804dba Phase 9E (Backbone): Stripe-Produkt-Sync und Webhook-Verarbeitung mit STR-Spiegelung +c8dc99c ed99ee2 Phase 9E (Abschluss): Checkout-Flows und Plan-Kontingent statt Quota-Stub +23ac8bc 7818c57 Phase 9F: Tarif-Seite mit Stripe-Checkout und Billing Portal +6a82e2a 5555be4 Buchungs-Seite: Feinschliff nach Review +8f3261d 840cc0d Checkout: Stripe-Tax-Adressanforderung erfüllen +bda755f c5907da Admin-Zahlungsmodul: Zahlungs-Übersicht + Tarif-Verwaltung mit Stripe-Sync +036a534 b126254 Responsive-Härtung: Seiten-Header, Kontextleiste, Stat-Cards +afcca34 d07b138 User-Panel-Restarbeiten: PM-Guard, Profil-Rework, USt-ID-Prüfung, Buchungspflicht-Adresse +b714551 6ba260e Profil-Feinschliff: Pflicht-Badges, Fokus-Fix, Submit-Modal auf Switches +5a8da0c ad75886 PM-Vorschau: Workflow oben + farbig, Metadaten, saubere Inhalts-Typografie +25ea91d 1f31e10 Verlinkung & Backlinks: systemseitige rel-Auszeichnung (Decision-Update 11.06.) +a7c30d4 a193097 Titelbild-Upload: Bildrechte in 5 Schritten + große Bildvorschau +6e0b2b1 5ca76c7 Titelbild: Bildnachweis als Pflichtfeld, Lizenzdetail-Reset bei Typwechsel +cc7b3c3 ced39dd KI-generierte Bilder: eigener Lizenztyp, Anbieter-Bestätigung, Kennzeichnung +284d029 b52751f PM-Vorschau: Firma & Pressekontakt zusammengeführt, Sprache als Badge am Portal +970b490 4052225 PM-Vorschau: Firmen-Kachel im Stil der Firmenübersicht +ad74133 234772b Doku-Abschluss 12.06.: README-Stand, weiteres/-Index, Next Steps (Phase-2/Magic-Link, Duplicate-Content) +ec4aa1d ce5d6c9 Detailplan Umsetzungsphase: Launch-Slice aus Decision-Updates + Merkliste +c804f3b e54f6e2 WS-1: Canonical- & OpenGraph-Meta zentral im Web-Layout +94cb209 f06650a WS-6: E-Mail-Verifizierung, Auth-Flow-Fixes & Legacy-Rollen-Sicherheitsfix +980763c c6b2b67 WS-2: Firmen-Scope für PMs & Magic-Link-Zugang für Pressekontakte +84f7eb3 55d974f Doku: Sicherheits- & Deployment-Hinweise (Auth, Rollen, Verifizierung) +d98d297 f28b698 Security-Härtung Login & Magic-Link (Review 16.06.) +f4ca452 512057c Security: 2FA-Bypass beheben & Login-Pfade konsolidieren +ae79d5b 42b4288 Security: JSON-Login durchläuft die is_active-/Verifizierungschecks +068a5a4 265d1fd WS-6: Google-Login via Laravel Socialite +6c6b9e0 fec2148 WS-2: Magic-Link für Firmen & Pressekontakte vereinheitlicht + Schreibzugriff +fe10adb 46d7ae3 WS-6: Google-Redirect-URI klargestellt (Portal-Domain, .de) + lokaler Testhinweis +2a62204 6431139 WS-6: Google-Redirect-URI auf Live-Domain pressekonto.com korrigiert +95007da 9bce9af WS-3: Recht & Compliance – Rechts-Kern (DSGVO/Persönlichkeitsrecht/Melden + Queue) +6668f49 eaae1e6 WS-3 abgeschlossen dokumentiert: B abgedeckt, A nach Phase 2 verschoben +be7d179 f87c470 WS-4: Bestandsschutz-Abrechnung – gekoppelte Kündigung + Admin-Sichtbarkeit +afefa86 c82c237 WS-4: Bestandsschutz im Kundenbereich als echtes Paket darstellen +a054720 57afcab WS-5: Buchungs-Gate launch-ready – proaktiver Dashboard-Hinweis +253141c 3a1d2e6 Frontend: Editorial-Relaunch der öffentlichen Strecke + Ausgaben-Routing +a2ff47e 7dbc238 WS-7: Live-Deployment-Checkliste + WS-6/WS-7 als erledigt dokumentiert +5a9aab7 97d69a1 Migration: PM-Datum korrekt übernehmen, UUID stabil, Zwei-Phasen-Runbook +b63cd26 1306849 Credit-Wallet + Ledger + Tier-Preisableitung (Fundament) +3e88442 460a255 Pruefzaehler + Pruefkontingent (Decision-Update Phase-2 vorgezogen) +c7a4c8b 0ff874e Boost-Geschaeftslogik (Decision-Update 2.2) +69411b4 c89589b Proof-PDF + Extra-PM-Verkauf ueber die Credit-Wallet (Decision-Update 2.1/2.3) +344aac0 bd7022f Wallet-Topup ueber Stripe (Credit-Pakete mit Bonus-Staffel) +77a4476 31bef7a UI: Credit-Wallet-Hub + Per-PM Add-ons im Backend-Pressekonto +3c61900 dac8fe0 UI-Feinschliff Buchungen: Tarife oben, Credits darunter, Preisliste, USt.-Modal +44b6761 2c41711 Veroeffentlichungs-Gate: proaktive Buchungs-Meldung + Schalter test-stabil +764d56e 7822929 Fix: kein Datenverlust beim 'Buchung auswaehlen' aus dem Submit-Modal +dd5a937 6a7483e Doku: Credit-Oekonomie in WS-7-Checkliste + Umsetzungsstand im Decision-Update +82abdf6 0618080 Doku: Umsetzungsstand der Credit-Oekonomie im Decision-Update +028b059 326ff9b Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege +5feaa8a 624fca6 Zeitzone Europe/Berlin: unnoetige UTC-Konvertierung entfernt +e962cc2 bcac326 Fix: Umbrueche bleiben beim Bearbeiten von Legacy-PMs erhalten +af99189 4ab7460 Status-Widget: immer verfuegbarer Buchungsueberblick in der Topbar +c43ef6a 7de0db3 Status-Widget: kompakte Topbar statt hoher Header-Leiste +3da3353 1ff1cc3 WS-8: N+1 entschaerfen und PM-Zugriffsmuster konsolidieren +1c5eede 1aa4391 WS-8: doppelte Logik konsolidieren (Tags, Kontakt-Query, Billing) +58b427f 7d03ded i18n: Default-Locale auf Deutsch umstellen (Basis fuer EN-Umschaltung) +446aada e96a118 Paket-Vorteile: dynamische, im Admin pflegbare Vorteilsliste je Tarif +474153a f6a8143 Preise-Seite: dynamische Tarif-Vorteile aus dem Plan anzeigen +1ac5bad 052b214 i18n: Auth-Views vollstaendig uebersetzbar machen (Readiness) +39f0af7 6cb7b79 Doku: Launch-Vorbereitung 18.06. (Status-Widget, WS-8, i18n, Paket-Vorteile) +a82964d c7bd940 Optimierung Phase 0: Korrektheit & Security +a5f3ddd 554a731 Optimierung Phase 1: Aufraeumen / toter Code +6cc4c2c 0344ac2 Optimierung 2.1: Admin-PM-Editoren nutzen Tags-Trait +26d5f1a 64349ce Optimierung 2.2: InteractsWithPressReleaseScheduling-Trait +1ee6710 fa995e3 Optimierung 2.3: formRules() via ProvidesPressReleaseFormRules +5ed60c1 b41d34e Optimierung 2.4: Kanonische Pre-Submit-Checkliste +64b16cd 8c53146 Optimierung 2.5: Kontakt-Helfer + tagSuggestionsFor zentralisiert +5d6a949 83d2ee6 Optimierung 2.6: reprocessAfterContentChange im PressReleaseService +28e9064 86ba6c1 Optimierung 2.7: Company::scopeSearchByTerm fuer die Admin-Combobox +af86a16 3a18a2b Optimierung 2.9: HandlesAdminPressReleaseActions::findAdminPR() +a3b069e 153bac7 Optimierung 2.8: Blade-Component +82455c3 6a1240b Doku: Phase 2 im Entwicklungsplan als abgeschlossen markiert +9ddfab6 dba7691 Optimierung 3.1: Company::scopeAccessibleBy() zentralisiert Firmenzugriff +2bf431c 4fc46b0 Optimierung 3.2: API-PR-Ownership-Scope + zentrale Eager-Loads +f2c349a 9a93903 Optimierung 3.3: totes SetDomainUrl entfernt +9ed429f 31d407d Optimierung 3.4: Performance (Logging terminable, Single-Purchase memoisiert) +4466858 b255d90 Optimierung 3.5: Kleinere Zentralisierungen (VAT, findByEmail, Waehrung, Provisioning) +0d0edf1 31e01e4 Optimierung 3.6: Zugriffs-Gates und getrennte Impersonation-Sperre +6961cac 4c80b93 Doku: Phase 3 im Entwicklungsplan abgeschlossen markiert (3.1-3.3 nachgezogen) +f20a95f 987a5a2 Optimierung 4.2: Published-Release-Query ueber PressRelease-Scopes zentralisiert +714a5cd e5a63bc Optimierung 4.1: Web-Portal-/Domain-Kontext extrahiert +3f68052 7625ec7 Optimierung 4.3/4.4 (Preise): Page-Data-Service + Invokable Controller +01f3f7f 418a2bc Optimierung 4.3/4.4 (Suche): Page-Data-Service + Invokable Controller +debcf81 fef6bbc Optimierung 4.3/4.4 (Veroeffentlichen): Page-Data-Service + Invokable Controller +e36f917 a2179ea Optimierung 4.3/4.4 (Newsrooms): Page-Data-Service + Invokable Controller +f17e9a9 179dd8e Optimierung 4.3/4.4 (Newsroom-Detail): Page-Data-Service + Invokable Controller +e19a209 ee74126 Optimierung 4.3/4.4 (Kategorie): Page-Data-Service + Invokable Controller +f3aa27d e879a38 Optimierung 4.3/4.4 (Release-Detail): Page-Data-Service + Invokable Controller +241d67c 43c83ca Optimierung 4.3/4.4 (Home): Page-Data-Service + Invokable Controller +b0353ab 8e0aeda Doku: Phase 4 im Entwicklungsplan abgeschlossen markiert (4.1-4.4) +54bab7e a8958c1 Optimierung 5.1: Tabellen-Concerns (Sortierung, Volltext-Heuristik, Stats) +6bf6a09 89842ac Optimierung 5.2 (Teil 1): ProvidesUserFormRules-Concern +178adb0 69395ef Optimierung 5.3 (Teil 1): Contact::displayName() +abe9a0a 4067911 Optimierung 5.3 (Teil 2): Category::localizedName() +8141fe8 dc68404 Doku: Phase-5.3-Fortschritt (displayName/localizedName erledigt, Rest UI-lastig) +dc4e397 63071a0 Doku: Stand & Wiedereinstieg-Abschnitt im Entwicklungsplan +be1284d 055fd5c Optimierung 5.3: toten portalBadgeColor()-Helfer entfernt +1a30b13 c16b0b7 Doku: portalBadgeColor()-Klaerung im Plan vermerkt (toter Code entfernt) +38884a5 ed1aa07 Perf-Fix: User::accessibleCompanyIds() hydratisiert keine Company-Models mehr +6a406bf 07d98ed Perf: accessibleBy() nutzt company_id-Subquery statt materialisiertem whereIn +7d6b97f 580c918 Perf: Status-Counts der PM-Uebersicht via UNION statt OR-GROUP-BY +6d4965a 83bb2a7 5.4 (Teil 1): + categories/create umgestellt +d2d88ed af15e84 5.4 (Teil 2): page-header in categories/* + companies/create,edit umgestellt +0087489 f3a9c42 Fix: fehlendes .search-wrap-Styling (Suchfeld in /admin/me/firmen unsichtbar) +0c373f5 2a3b561 5.4 (Teil 3): page-header in users/* + contacts/* umgestellt +b9811b7 1eb2243 5.4 (Teil 4): page-header size=lg-Variante + press-releases/* + companies/index +25a4095 27a77bf 5.4 (Teil 5): page-header in roles/* + footer-codes/* + presets/* +8e90eb2 feda8be 5.4 (Teil 6): page-header in payments/invoices/legal/coupons/reports/newsletter +ed396eb 077d313 5.4: + admin/press-releases/index umgestellt +8690425 1c75e61 5.4: empty-state auf customer/press-releases + customer/press-kits ausgerollt +9ee77c8 505852f 5.4: + 13 Wrapper ersetzt +c829624 587d1fd 5.5: + 6 Flash-Bloecke umgestellt +fc91f29 b1b832d 5.5: + 4 Auth-Seiten umgestellt +2b9d1b6 6b1d84f Doku: 5.4 abgeschlossen + 5.5 Teil-Stand im Entwicklungsplan +9e6f775 1729e35 5.2: gemeinsamen Firmen-Sync-Kern als User::syncCompaniesWithRoles() gezogen +dbbf8a4 9fadfe6 5.5: + 6 Auth-Passwortfelder umgestellt +7c5518d 1503d3a Fix: rollenlose aktive Nutzer -> Backfill-Command + Import-Nachlauf +6523a13 0e08d8a 5.5: Auth-Components abgeschlossen (funktional gegengetestet) + Plan-Stand +dd16bed 55d0804 5.3: PressReleaseStatus::badgeClass() zentralisiert + toten statusColor-Code entfernt +7803a12 349991a 5.2: User-Formular-Feldraster in Blade-Components (role/billing) extrahiert +a25355e 90f3245 Plan: Phase 5 vollstaendig abgeschlossen (5.2/5.3/5.5 auf erledigt) +17b586f db7c1df Perf: customer press-releases-Liste ueber UNION statt OR-Paginate +26586d4 1a612e0 R0.1: tote Dev-Varianten-Routen entfernt (fehlende Views -> 500 auf BP24) +fc7213e cb2fe97 Plan: Release-Entwicklungsplan (R0-R6) aus Vier-Achsen-Analyse konsolidiert +f02adf1 a4184af R0.2: gdpr_consent_at bei allen Registrierungspfaden befuellen (DSGVO) +c678e3a f9e3c64 R0.3: Newsletter-Sync-Binding config-aware + ehrliche Test-Sync-Meldung +b64aa9f 17eaa80 R0.4: Seeder produktionssicher (PlanSeeder, keine Fake-Stripe-IDs, Dev-User-Guard) +8653abd c3db80c R0.5: eigene Fehlerseiten 403/404/419/500/503 (self-contained, domain-aware) +c9641e9 ad2879d R1.1: Buchungs-Gate geprueft + safe-by-default; Legacy-Buchungspfade festgeschrieben +f762c5b 54a2e64 R1.3: Quota-Reset als fester Bestandteil des Tarif-Modells festgeschrieben +36e1907 1e9c2f9 Plan: R0 komplett + R1.1/R1.3 erledigt +229ac11 a4d054b R2.1: Kontaktformular-Backend (Controller + Mailable + Brand-Empfaenger) +a4ae82c 4e4aff1 Fix: legal-request-Honeypot nickt Bots wieder still ab +e90bb3c 9875e7b R2.1 (Web): Kontaktformular auf der Kontakt-Seite aktiviert +d1f32e0 5226f5d Plan: R2.1 erledigt + naechste Schritte notiert +66190f2 f6edb4a R2.2: HubPageData - Plan-Katalog + echte Plattform-Kennzahlen fuer die Hub-Landing +bf81709 8d4b3b5 R2.2/R2.3 (Web): Hub-Landing live-faehig - datengetriebene Tarife, ehrliche Inhalte +1417753 38d7cca Plan: R2.2/R2.3 erledigt (Hub-Ueberarbeitung + Plan-Katalog-Pipeline verifiziert) +0acccee 47d03ec Hub (Web): Auth-aware CTAs, Kontakt-Modal statt Mailto, Pruefung-Wording +603ca73 88d6935 Kontakt: Hub-Domain-Anfragen gehen an die pressekonto-Brand-Adresse +268332c 515e249 Recht (Web): Vertrag-widerrufen-Button + zweistufiges Widerrufs-Modal im Hub +4ea3bae 8c0bf00 Recht: Online-Widerruf ohne Login (gesetzlicher Widerrufsbutton) - Backend +e852416 8001280 Plan: Online-Widerruf (R3.0) erledigt + Follow-ups notiert +6621b03 d6461f5 Admin: Widerrufe laufen in der Recht-&-Compliance-Queue auf +c7450da 258502b Hub (Web): statische Seiten (Rechtstexte, API, FAQ ...) rendern das Hub-Geruest +981be2f 239ec57 Plan: Rechtstexte-Architektur referenziert + Hub-Geruest-Vorarbeit notiert +8b8f299 1c3a52a Recht: Kuendigungsbutton nach Par. 312k BGB - Backend + Admin-Queue +6b2356e 52bc534 Recht (Web): Vertraege-hier-kuendigen-Button + Bestaetigungsseite im Hub +244c2ab 20d5398 Recht: Erloeschensklausel-Checkbox im Publikationsflow (Par. 356 BGB) +a6c3aa6 b855cbf Plan: Kuendigungsbutton (R3.0b) + Erloeschens-Checkbox (R3.0c) erledigt +c2d22c6 e9643e6 SEO: host-aware sitemap.xml + dynamische robots.txt je Domain +dd09663 6e5d67c Web: Marketing-Seiten brand-aware (Titel/Meta) statt 'Business Portal 24' +2850d0f 7494f19 Plan: R2.4 SEO-Basics erledigt (Sitemap, robots, Meta) +e4d154c f5bf282 Deploy: .env.example vervollstaendigt + Deploy-Runbook (R5.1/R5.2) +770fda7 2d1c7aa Web (R4): tote Alt-Frontend-Fragmente entfernt +7d2a312 d34088e Web (R3.2): Marketing-Platzhalterseiten zurueckgebaut +03b644e 5537041 Plan: R4.1/R4.2 Aufraeumen + R3.2 Rueckbau erledigt +46f1829 acb2a19 Doku (R6.6): veraltete migration-2026-Dokus mit Verweis-Banner versehen +5c2ef28 89550da Security (R6.2): Haertung nach Audit +27c92d5 f46795b Plan: R6.2 Security-Review + R6.6 Doku-Sync erledigt +b36ecf7 9c9f7f7 Hub-Inhalte: Claims korrigiert + Widerrufs-UI zurueckgebaut (B2B-only, E2) +ca777f2 73fc382 Web-Inhalte auf echten Funktionsstand: FAQ, Hilfe, Veroeffentlichen +136ecc8 0645d1d R3.2: Kontakt-/Ueber-uns-Routen zurueckgebaut, Spoke-Footer bereinigt +43f563c f3a95c8 API-Doku: echte Referenz statt Fantasie-Features +c195878 d577ff5 R3.1: Rechtstexte eingebaut — Impressum, AGB v0.6, Richtlinien, Meldeverfahren +28b5980 545eb52 Preise nach Leistungsbeschreibung v0.2: B2B-Satz, Credit-Anker, Regeln +110f97d fc13038 T2neu: Archiv-Hinweis vor Submit ersetzt Erloeschens-Checkbox (B2B, E2) +e2758ff efe7f86 Plan: Hub-Inhalts-Audit + Rechtstexte-Einbau dokumentiert (E2 B2B-only) +6438444 99ab47b Datenschutzerklaerung v0.3 eingebaut, Cookie-Seite zurueckgebaut +6f9a68b 8916bcc T1neu: Unternehmer-Pflicht-Checkbox im Checkout, protokolliert mit AGB-Version +1e15042 f0cd11a Plan: Datenschutz v0.3 + Cookie-Rueckbau + T1neu in R3.1 dokumentiert +c523224 9832869 System-Mails im pressekonto-CI: zentrales E-Mail-Layout fuer alle Transaktionsmails +14b1822 9d3eef6 Plan: Tagesabschluss 03.07. dokumentiert (Rechtstexte komplett, T1neu, Mail-CI) +4f07104 43397ad Zentrale Rechts-E-Mail info@pressekonto.com fuer alle Rechtstexte +b90e59a 3940d46 Umami-Webanalyse eingebaut, bis zum Go-Live deaktiviert +7624064 dc2b2b0 Plan: Klaerungsliste Rechtstexte komplett beantwortet (06.07.) +196f83a 7510e76 E3: Rechtstext-Versionierung in der DB (legal_documents) +c54c694 0bec71f Ablehnungskategorien live aus der DB (rejection_categories) +5337a14 61a677a T13: Melde-Links sichtbar unter jeder Pressemitteilung +979e6b1 2a9be7a T10: DSA-Meldeformulare mit URL-Feld, Vorgangsnummer und Eingangsbestaetigung +cc77e60 198be38 T12: Depublikations-Checkout mit Tombstone (config-gated) +361560f fac15f7 Plan: R3.1 komplett — Rechtstexte-System fertig (Suite: 956 gruen) +9a9e313 90fd171 Depublikations-Preis festgelegt: 35 Euro netto (O6, User 06.07.) +d0ffe66 d754ef4 QA-Luecke geschlossen: Legacy-Medien-URLs redirecten wieder (301) +6ef4a0d 73f414e R6.1: QA-Checkliste erstellt, Vorpruefung abgeschlossen +3364fd1 3cd7395 Fix: Bestandsschutz ohne explizites Vertragsende zaehlte nie als aktiv +616b784 91992ac Uebernahme bestehender Legacy-API-Integrationen (Keys, Auth, Pfade) +5200686 387d41a Plan + QA-Checkliste: Legacy-Fixes vom 06.07. dokumentiert +5d199f0 3320aaa Rechnungsadressen der Bestandskunden aus dem Legacy-Archiv uebernehmen +b3474a3 bfad13a Spoke-Frontend-Audit: Fake-Inhalte raus, Newsletter-Rueckbau, echte Boersendaten, EN-Lokalisierung +b53af92 2c7b556 Produktiv-SQL-Dumps enttrackt (Security-Review-Befund R6.2) +8f90e6f 339ae5d Plan: Adress-Import, Key-Import-Verifikation und Git-Hygiene 06.07. dokumentiert +08b49a2 1904ea5 Platzhalter-Eintraege ("spaeter") aus der Panel-Seitennavigation entfernt +9ff0a6c b7bbf6d Panel-Navigation: Buchungen zu Finanzen, neue Gruppe Portale +62fbafa 15387d0 QA-Befunde A4: 2FA-Bestätigungsschritt + sicherer E-Mail-Wechsel +af9f238 b42e0e3 2FA-Challenge: Fehlversuch crasht nicht mehr (Route two-factor.login fehlt) +e7d5d58 4fe0882 QA-Checkliste: A1-A4 manuell abgenommen (07.07., inkl. 2FA-Fixes) +fa4bc06 d1c9763 Buchungs-Modal: Dark-Mode-lesbare Preistabelle + aufgeraeumtes Layout +4b7403b 54213ca Stripe Checkout: automatic_tax aktiviert (USt fehlte in der Session) +4cda4d3 2a8fd01 STR-Spiegelung: USt aus total_taxes lesen (Stripe-API ohne tax-Feld) +7e571ee 5166fc7 Rechnungsseite: neue STR/MAN-Rechnungen gelistet, STR bei Stripe verlinkt +6eedaa4 304c581 Checkout: Profil-Rechnungsadresse als Stripe-Rechnungsempfaenger +256aca6 af15660 Checkout: Wallet-Daten duerfen Profil-Rechnungsadresse nicht ueberschreiben +9e76e24 b3780e0 Tarifwechsel im Buchungs-Modal: Abo-Swap mit anteiliger Verrechnung +9a95a69 db65c2e Suche: Volltext-Index + Fix fuer doppelte Alpine-Instanz +090a893 14994e4 PM-Vorschau: echtes Portal-Design, Direkt-Button und Portal-Switch +4b7f6d3 388ca0e Downgrade-Vorkehrungen: Kontingent-Sperre beim Tarifwechsel, Gutschriften nicht spiegeln +ef2b4fe 80e04e2 Downgrades ohne Gutschrift: Tarifwechsel nach unten erst zum Periodenende +c040f39 c4ccc75 Rechnungs-Seite: Archiv-Filter entfernt, Altsystem-Archiv nur für Bestandskunden +fcfbbd4 acd241b PM-Editor: Ablehnungsbegründung direkt auf der Bearbeiten-Seite anzeigen +2a46aed 0f8f0b2 Einreichen-Modal: Panel-Struktur und fixierter Kontingent-Badge +dfb8de9 9600a4f Add-ons: Modal statt Toast bei fehlendem Credit-Guthaben +a21d635 d7f17bb PM-Detailseite: Depublikations-Sektion ans Seitenende verschoben +46ce2c1 930760a single_purchases: type-ENUM um depublication erweitern +9b55e11 28de92e PM-Detailseite: Direktlinks zur öffentlichen Seite je Portal +1ef1e13 881a583 Depublikation: abgebrochener Checkout blockiert nicht mehr +30c407f e457e7a Profilfeld users.agency_name für Übermittler-Attribution +621fc05 402fa4a legacy:migrate-agency-names: Agentur-Namen → users.agency_name +365971a a62a5ee PM-Detailseite: Attributions-Zeile Urheber/Übermittler +56fe5ea 85fddbf Attribution: Übermittler aus users.agency_name statt Agentur-Firma +0b3c6cc 59ac67a companies:retire-agency-type: Firmen-Typ „Agentur" abschaffen +26ce254 3ff95bc UI: Agentur-Angaben im Profil, Firmen-Typ-Auswahl entfernt +c1382ce d57f6b5 Agentur-Attribution: Plan abgehakt, Abnahme-Status 08.07. dokumentiert +723d51c f6882b6 Depublikation: Kauf als eingelöst markieren, Rechnung & Bestätigungs-Mail +f8e8f3e fe8bd2b Buchungsseite: Verlauf mit Kauftyp, Erfolgsmeldungen grün +6c4fd0c 3297179 USt-ID vor jeder Buchung per eVatR gegenprüfen, Stripe-Tax-IDs abgleichen +1822dcb 74e82eb Form-Hooks: Fehl-Scroll aufs erste Feld bei Live-Validation behoben +c387048 807fbc1 KI-Kennzeichnung (Art. 50 KI-VO): Pflicht-Deklaration für Text & Bilder +2882bc4 f11e8aa PM-Editor UX: Kategorie in die Schreibfläche, Bild-Upload als Modal-Flow +75d7baa a254bbd Depublikation: Credit-Preis auf 35 (O6), Preis-Tests nachgezogen +c2ec18b ac870a4 Buchungsseite: Buchungs- und Verlaengerungsdatum des Abos aus Stripe +dc65cfc 07e0bc5 API-Doku: OpenAPI-Spec aus public/ statt geloeschtem docs/ ausliefern +1ad2e54 6984846 Monitoring (R5.3): Betriebs-Alerts fuer Scheduler-/Queue-Ausfaelle +ef5de54 c6b5ec8 Release-Doku: Stand 09.07. nachgezogen; Runbook FULLTEXT-Fenster + Monitoring +72e6a3c fd8e050 Backend-WIP: Kontakt-Queue, Page-Cache, Validierungs-Feedback, i18n +79658bd d1939f6 Web-Frontend: Umbau Spokes/Hub, Kontakt-Widget (contact-launcher) +80a37f8 60d0d9b Release-Doku: Commit-Session vermerkt + Wiedereinstieg fuer morgen +644f860 8f59704 PM-Tracking: Ereignis-Log fuer Aufrufe + Shares (press_release_events) +34ec14d 34f0e0f Web-Frontend: Aufrufe-Anzeige + Share-Tracking auf der PM-Detailseite +2ef41a4 0603fe5 R2.5: legal-request-Hinweistexte final (Wortlaut aus Meldeverfahren v0.1) +bb6a0a0 460e092 QA-Checkliste B-G vertieft (Nachpruefung 10.07.) +56ea3d0 459b339 Dev-Stack: Queue-Worker lauscht auch auf der classification-Queue +813cbd2 01e175e R4.3: Karten-Metadaten-Logik als PressRelease-Praesentations-Helper +9b2409e 3843e53 Web-Frontend: Kartenkomponenten auf PressRelease-Helper umgestellt (R4.3) +5c91e2e 92af015 API: KI-Deklaration als v1-Pflichtfeld, Legacy-Default fuer /service (Entscheidung 10.07.) +c778e41 b185985 Web-Frontend: /api-Doku mit KI-Deklarationsfeldern (curl-Beispiele + Hinweis) +fef4573 5a35242 API-Legacy-Paritaet: Arbeitsdokument mit Alt-Vertrag, Log-Auswertung, Schrittplan +a3fd361 6a45ebf Legacy-API-Paritaet S1+S2: connektar-Flow verhaltensgleich + KI-Schalter +2820385 d9f25ae S4: legacy:seed-api-testdata — API-Testkunde nach connektar-Muster +00f67c4 7a573ca Mail-Routing: API-Einlieferung ueber Status-Log-Quelle erkennen +de532fe 9cb53b1 API: nicht-numerische Routen-IDs als 404 statt TypeError/500 +3ae57d9 b26dc90 Admin-PM-Liste: KI-Pruefungs-Modal + geschaerfte KI-Prompts +c883656 93d7f6d Add-ons: Kaufbestaetigung vor Credit-Abbuchung + deutlichere Buttons +dc2a344 0cda194 KI-Kennzeichnung: 2 Optionen im Submit-Modal + Labels auf Detailseite +744e87d 0665553 Werbeplaetze reaktiviert: Eigenwerbe-Slots oeffnen das Kontakt-Widget +bbcdc72 df6b245 Web: Boost-Platzierung auf Start- und Branchenseite ausspielen +927523c 47c1cac PM-Liste: Hinweis auf laufende Boost-Platzierung unter dem Status +06d80b2 484e062 KI-Klassifikation: Substanzpruefung gegen Gruen-Durchrutscher +51da374 d5b8064 E-Mail-Praeferenzen: Opt-out je Mail-Typ + One-Click-Unsubscribe ohne Login +6e1267f cc61bf2 Add-on-Modal: Pflicht-Schalter + Verlaengerungs-Hinweis bei laufendem Boost +9d6ef50 6be387c Boost-Buchung invalidiert gecachte Start- und Branchenseiten sofort +b1be14e 0677728 Doku: Boost-Platzierung offene Punkte (Hero-Slider, Boost-Begrenzung) fuer Montag +4853d48 0474d22 Boost-Slot-Grenzen (5/3) + Kategorie-Boost zum halben Satz +7a32c66 6796fa4 Preise-Seite: zwei Boost-Stufen inkl. Slot-Hinweis in der Leistungsnote +d92e0f6 842d6a2 Doku: Boost-Platzierung entschieden + umgesetzt (Slot-Grenzen, Kategorie-Boost) +92d1ac2 0cddf5f Add-on-Panel zeigt freie Boost-Plaetze je Stufe +8657311 4f2be1e PM-Uebersicht: Rubrik unter Portal, Boost-moeglich-Hinweis, gruener Haken +7b3a4d7 6f96e4a PM-Detailseite: Inhaltspruefung (Gruen/Gelb/Rot) + Qualitaets-Score sichtbar +b3fdd6f 3295f47 deps: Sicherheits-Updates (Framework/Symfony/Guzzle) einspielen (H6) +7043ea8 aae4569 billing: Nebenläufigkeit & Idempotenz härten (H4, Stripe, Boost-Slots) +0b35c3b 6e84266 press-releases: Publish-Rechte, Quota-Races & Slug vereinheitlichen +000ae93 6250b0b media: PM-Medien privat ausliefern + Vorschau-Signatur (M4, M5, Fix#4/#5) +299837d 39e13d6 security: Host-Whitelist & Legacy-API-Key-Übergabe härten (H5, M11) +4078319 77f8f9c security: Rechteausweitung schließen & Admin-Panel feingranular gaten (K1, H1, H2, M8) +6764fb9 8f517e9 security: Stored-XSS über page_url im Kontaktformular schließen (H3) +ea8d017 fe1525b auth/mail: Magic-Link-2FA (M1) + Mailversand über die Queue +1afcc36 5a49292 newsletter: Bestätigung/Ownership beim Re-Abo korrigieren (M7) +22975e7 23cbd0b performance: Caching, deferred Tracking & externe Timeouts (H7, M12, M13) +573e4ca 830aca5 admin: Betriebsüberwachung im Backend (Queue-Worker & Deployment-Checks) +198ce15 e51fe6f chore: persönliche VS-Code-Workspace-Datei aus dem Repo entfernen +6f6cb13 74f71f7 docs: Audit-Protokoll, KI-Kennzeichnung & Release-Notizen +a546378 700f5e6 dashboard/errors: Onboarding-Card „Erste Schritte" & Hub-Styling der Fehlerseiten +244b7ba ce59cbb auth: Selbst-Registrierungen nicht mehr als Legacy-Bestand einstufen +8a695fd 0b01929 profil: Speichern-Buttons für Persönliche Daten und Konto & Sicherheit +4cc74c2 67f6906 billing: Stripe-Webhook von der Basic-Auth ausnehmen +ff2eee0 425467b billing: asynchrone Zahlarten (PayPal, SEPA) korrekt erfüllen +71b247b e32431e billing: Zahlungsbestätigung per Mail nach jeder Buchung +f1dcb9c 37bcf73 billing: Blindkopie der Zahlungsbestätigung an LEGAL_CONTACT_EMAIL +5585a26 a574898 billing: Stripe-Belege auf Deutsch und sprechende Produktnamen +991af42 3a11963 admin: Aktivitäts-Verlauf unter Reports ▸ Verlauf +7c252ab a3671ba emails: Portal-Wortmarken im Mail-Header ergänzen +47f224f 3e85537 web: Kategorie-Badge im Feed bricht auf Mobile sauber um +6253b36 9c67fc6 docs: Cutover-Runbook für den Go-Live (Legacy-Import & Umschaltung) +c70e175 dec5249 web: Responsive-/Mobile-Fixes fürs öffentliche Frontend +379688f 2ea64ad web: Strukturierte Daten (JSON-LD) und SEO-Metas fürs öffentliche Frontend +b8e2735 07d89a0 web: Preise-Seite zeigt unter Weitere Leistungen nur noch Depublizieren +50d9208 a130299 billing: Veröffentlichungsnachweis mit Titelbild, Bildrechten und Rich-Text +4c73ba0 3151b1f legacy: privatize-media überspringt unmigrierte Legacy-Bildzeilen, --prune-missing löscht sie +2765afe 7971656 legacy: fix-timestamps liest Legacy-Schema-Namen aus der DB-Config statt hartkodiert +3842fbc 9be4731 billing: Abo-Kündigungen aus dem Stripe-Portal im Aktivitäts-Verlauf +263f030 22b7bd3 docs: Runbooks auf den echten Migrationsstand nachgezogen (16.07.) +4668cfc a0c2e66 legacy: --since-Delta für legacy:import + Importer setzen Timestamps wieder korrekt +c8a292e d212230 docs: Cutover-Delta nutzt --since, Medien-Delta-Hinweis +622cd4e 5011f28 legacy: API-Key-Import löst E-Mail-gemergte User über legacy_import_map auf +da189c0 bd4ad85 web: Stale-while-revalidate-Cache für die öffentlichen Seitendaten +6fcc825 3d10cbf web: Startseiten-Feed cachen + Index gegen Filesort der Feed-Query +e69ded4 acf6721 web: www-Hosts lösen aufs Apex-Domain-Theme auf statt aufs Portal-Fallback +fcf8304 42e56a7 web: www-Hosts leiten kanonisch per 301 auf die Apex-Domain +3d1bf38 58c773b web: Domain-spezifische Favicons und App-Icons für alle drei Marken (R5.4) +665c94f 6a4c4d8 docs: dev-Doku für den Live-Betrieb neu sortiert — Archiv + Betrieb + Roadmap +8aba835 783b9da docs: verschobene Doku-Pfade in Code-Kommentaren nachgezogen +7b27ec5 8743bcb Release: Go-Live Pressekonto (20.07.2026) +99f10e6 fa30336 docs: R6.5 in der Roadmap abgehakt (Merge nach main + Tag v1.0.0) +e59e132 e3ce626 admin: PM-Detailseite verlinkt Firma, Autor und Firmen-Benutzer +33e84af d411e6c admin: Verlauf protokolliert jede versendete E-Mail +f327853 215cbcb admin: internes Newsletter-Modul mit Filtern, Protokoll und Abmeldung +80c5f03 ab0030d web: Mail-Abmeldungen landen im Aktivitäts-Verlauf +3f4679f 37e543e admin: Credits und freie PMs ohne Zahlung gutschreiben +ed458b6 5bf9f84 admin: Verlauf protokolliert den Gang zur Stripe-Zahlung +17e22d2 921c533 admin: Benutzer-Übersicht verlinkt die Detailseite zusätzlich zur Schnellansicht +45dc4ce 9b73972 kunde: PM-Liste zeigt Firmen-Kontext unter der Headline und Bild-Thumbnails +021ee2d 58c0cc3 admin: Newsletter mit Abmelde-Liste, Follow-up-Filtern und gedrosseltem Versand +04b49c5 b4b2e01 recht: Meldeverfahren v2 Phasen 1-4 — Re-Sync-Sperre, Anonymisierung, Magic-Link-Intake, Self-Service-Korrektur +e6eca9c 9afbedd recht: Meldeverfahren v2 Phasen 5+7 — DSGVO-Strukturformular, 10-€-Checkout mit KI-Vorprüfung, Triage & Panel-Modal +8fc18c2 f8728c5 technik: Volltext-Indizes von press_releases in eine eigene Suchtabelle auslagern +d14cb84 6a34ab4 technik: Aufrufe über ein Ereignis-Log zählen statt im Request +2024df9 0c8e94a web: Entfernung mit 410 Gone als Alternative zur Löschung +48d401e 982de2a api: Ziel-Portal einer Einreichung explizit auflösen statt vom Konto erben +49182ec e634af0 newsletter: Unzustellbare Adressen aus beiden Empfängerlisten nehmen +eb1eba4 f6934f5 mail: Anrede an den tatsächlichen Empfänger binden +e746ded e783adc technik: Statische Analyse wieder aussagekräftig machen +8d41669 a85f6ba db: Index auf companies.email +81d9c43 ac4b959 dev: Bestandsaufnahme und Umsetzungsprotokoll zum Code-Durchgang 01.09. +aab2240 c497628 reports: Basiswerte für die Konversionsmessung (Roadmap 0.1 und 0.2) +2391c85 748a0d4 reports: Aufrufe nach Alter aufschlüsseln und Basiswerte festhalten +2691a4d 45f2d90 conversion: Konversionsleiter mit Herkunft auf dem Magic-Link-Token (Block 0) +e536e52 8df6b9e companies: Trockenlauf zur Newsroom-Konsolidierung (Roadmap 1a.1) +5d0570b 7c40a0c companies: Tippfehler und Zusätze im Trockenlauf als dieselbe Firma erkennen +5e46ff9 a0ac32c companies: Adress-Klassifizierung persistieren (Roadmap 1a.2, E1 = 3) +5e5414a c17e4b9 dev: Live-Trockenlauf der Adress-Klassifizierung protokolliert +e2f7cf1 8a1e79a dev: scharfer Klassifizierungslauf auf Live protokolliert +00af8b1 77318dc companies: Aufrufe als Veröffentlichungsnachweis im Altbestand werten +982bd6e 66d8398 api: Token-Gate erkennt aktive Stripe-Abos +8b86b88 2aebb9d companies: Zusammenführung im Bestand, rückabwickelbar (Roadmap 1a.3) +1368e2c f3e7aca dev: Live-Trockenlauf der Zusammenführung protokolliert +202cf34 235c20c companies: Zusammenführungen zum Nachprüfen auflisten +cd16fd1 b91f41d dev: Live-Läufe der Zusammenführung protokolliert +d60f31d 4303266 dev: kompletten Live-Lauf der Zusammenführung protokolliert +8baca9d 8dad652 api: neue Firmen dem bestehenden Newsroom zuordnen (Roadmap 1a.4) +0be476b 0f52e9f dev: Block 1a in der Roadmap als erledigt markiert, 1a.4-Entscheidung festgehalten +abfcd77 a3e0042 newsroom: Seite verschwindet mit der letzten veröffentlichten Meldung (Roadmap 1b.1/1b.5) +9143cc4 0c1c072 newsroom: Verwaltungszugang „Diesen Newsroom verwalten" (Roadmap 1b.2) +0101488 7f714fb newsroom: Hinweis „Diesen Newsroom verwalten“ auf der Seite und in der Mail (Roadmap 1b.4, E4) +079477a a69b021 web: Melden- und Verwaltungsblock auf der Meldungsseite hervorheben +87f95fb 85b039e newsroom: Beschreibung pflegen, durch die Rot-Ebene geprüft (Roadmap 1b.3) +0a658bb 8bf40ee mail: zentrale Bounce-Suppression mit Versand-Gate und Circuit Breaker (Roadmap 1b.6, Schritte 1–2) +e800065 f9c97cc mail: Rückläufer aus dem Bounce-Postfach lesen (Roadmap 1b.6, Schritt 3) +e84c277 e7e12b9 admin: Mail-Sperrliste, Markierung nicht erreichbarer Newsrooms (Roadmap 1b.6, Schritt 4) +71d9639 6e159ec deps: Composer- und npm-Pakete innerhalb der Constraints aktualisiert +fddfd8a 4cefdf7 mail: Bounce-Abruf liest RFC 6533, All-Inkl-Freitext und ganze INBOX +ada41cb f581e1e mail: Kontakterreichbarkeit - Formpruefung, Domainpruefung, Einlieferer-Bericht +36691a5 a00f9dc billing: MAN-Rechnungen fuer Ueberweisungskunden bearbeiten, hold-Altlast bereinigen +09ec866 3ef1b84 customer: Sichtbarkeit belegen - Aufrufe im Verlauf, Newsroom-Uebersicht (Roadmap 1c) +58bc82a 7fb5a2f billing: tote Null-Pruefungen auf NOT-NULL-Spalten entfernt (phpstan) +c08c9e5 5f7fbd0 web: Hilfeseite "Was eine gute Pressemitteilung ausmacht", Hinweis in der Ablehnungsmail (Roadmap 1d.1, 1d.2, 1d.6) +0692d89 13716b9 press-releases: begrenzter Pruefkreislauf mit Admin-Queue (Roadmap 1d.4, E3) +35db30e 9380937 mail: adressbezogene Abmeldung fuer Empfaenger ohne Konto (Roadmap 1d.3) +4fd1db7 4dffb13 press-releases: Mail "wird persoenlich geprueft" beim Block, Blade-Guard fuer @php-Bloecke (Roadmap 1d, Nachtrag) +87ca908 5d8e379 companies: Kurzfelder des Profils ohne Links, Adressen und Spam (NoPromotionalText) +99ffd01 8ea5e52 companies: Links aus Firmennamen normalisieren — API-Eingang und Bestandsbefehl +713024b 8cd76df companies: Befehl zum Deaktivieren der Legacy-Linkspam-Registrierungen +b74f881 b60a28d web: Entitaeten im JSON-LD verknuepft, News-Sitemap und llms.txt (Roadmap 2.1, 2.2, 2.7) +84ea617 4616bb7 web: Jahresarchiv je Branche, Kategoriebeschreibungen, Portalname im Titel (Roadmap 2.3) +b6e4bc5 106edb1 web: Transparenzseiten — was kostet, ohne Abo, loeschen/aendern (Roadmap 2.4) +1fd6d2c c96c8a6 web: Transparenz-Navigation ueber der Headline der Preisseite (Roadmap 2.4) +6446e19 134af42 web: Unter-Navigation Preise/Transparenz auf allen vier Seiten mit aktivem Punkt +7088d09 951b6c4 web: Crawler-Abruf-Protokoll und Panel „Auslieferung" ohne Google-Link (Anhang 1: 1c.0, 1c.1, 1c.6) +6c4618a 6b87282 admin: Indexierungsstatus aus der Search Console, Kundenansicht vorbereitet und zu (Anhang 1: 1c.4, E8) +f1648a0 3751386 web: Erstquelle-Absatz in der Veröffentlichungsmail, vierte Transparenzseite „kostenlos veröffentlichen" (Anhang 1: 1d, 2.4, E7) +b44fded 3c6fb69 admin: URL Inspection immer auf en-US abfragen +10c91ac d9e181a docs: Search Console live, Schlüsseldateien ausgeschlossen, Kontingent erklärt +447dc4c 87558ab web: Hilfe in der Topleiste neben FAQ; 2.5/E5 geschlossen +ee267c6 4edb915 web: Doppelveröffentlichung — Prüfsumme, kanonische Zuordnung (aus bis E9), Quellenauskunft, noindex im Portal (Anhang 2) +4c17a17 5dcaf4e web: E9 und E10 entschieden — Zuordnung aktiv, eine Adresse je statischer Seite, Hub-Portalseiten leiten weiter +24c1bbf edb2d49 web: Portal-Inhalte sind auf dem Hub nicht mehr erreichbar (Anhang 2, E10) +0ab53bf 1d76f5a auth: Firmenrechte nur aus nachgewiesener Adresse, 2FA auf allen Login-Wegen (Audit Block 1, Deploy A) +62202a4 301bca3 auth: automatische Firmenrechte mit Herkunft und Entzug, Nachweis vor Sicherheitsaktionen (Audit Block 1, Deploy C) +a7f991f eeb1cde newsletter: jeden Empfänger genau einmal, atomarer Start, Wiederanlauf (Audit Block 2, Deploy B) +f235156 72432fd web/api/ki: Soft Deletes wieder wirksam, Caches bei Firmenwechsel, KI-Ergebnis an Inhalt gebunden (Audit Block 3+4, Deploy D) +375f4df 9a88e82 billing/dev: Vertragsende in der MAN-Abrechnung, Rechnungslauf ohne Tageskappe, Qualitätsgates (Audit Block 5+6, Deploy E) +4fa9859 226fb81 dev: Umsetzungsprotokoll und Live-Schritte zum Audit-Entwicklungsplan +ec6705e 207f103 tests: Kategorie-Portal in den API-Tests festlegen +c882194 2e8c081 tests: Titel in der MAN-PDF-Adresse festlegen +fb03fb1 c46dfd3 dev: Protokoll — Gesamtsuite grün, zwei zufallsabhängige Tests festgezurrt +1cd9fd1 eb95b3b billing: Vertragsablauf bedingt beenden, Kundenmail nachholbar (Block 7, U11/U12) +235d392 05cf53e security/api/betrieb: Fortify-2FA-Nebenwege gesperrt, Policy nur für aktive Super-Admins, Nachprüfungen aus dem Umsetzungsaudit (Block 7, U08–U10, U13, 7.1, 7.2, 7.5) +ea68362 082e6bb ki/quota: Hash-Bindung atomar bis in den Publish-Lock, roter Re-Check lehnt ab, Kontingent-Altbestand (Block 7, U02–U04) +7819527 1c421c0 dev: Umsetzungsaudit vom 18.09. abgelegt, Block 7 mit Abgleich, Entscheidungen E7–E9 und Protokoll im Entwicklungsplan +3ea9688 c26bdff admin: Bericht „Indexierung & Abrufe" — Rolle Erstquelle/Kopie, Quellenbefund, Crawler-Abrufe; Schlüsselpfad ab Projektwurzel +b8c6af5 5122624 auth: automatische Firmenzuordnung beim Wegfall der E-Mail-Grundlage entfernen statt senken (Block 7.13, U01, E7) +2ec6169 85d7c2b betrieb: Logs je Thema in Tagesdateien (billing, ki, monitoring, market); Doku: Duplicate-Content-Decision durch Anhang 2 abgelöst +b423650 e2ef4de admin: Search-Console-Vorgabe für businessportal24 auf die .com-Property +d0c7194 9d5e5a0 web: RSS-Feeds je Branche und je Portal (Roadmap 3.1); dev: Sichtung des Ordners, Protokoll-Teile umnummeriert +23811ad ff75159 web: RSS-Feed je Newsroom, RSS-Übersichtsseite, „RSS" in der Topleiste (Roadmap 3.1, Nachtrag) +44d0bb6 fc70067 web: Abruf-Protokoll der RSS-Feeds — Reader-Dienst, gemeldete Abonnenten, Admin-Bericht, Panel (Roadmap 3.1) +e620ef3 2b042d6 web: Datenschutzerklärung — Abschnitt 5a „Eigene Nutzungsstatistiken ohne Personenbezug", Frist 395 Tage (Roadmap 0.7) +dab14dc eb65802 press-releases: assign-canonicals leert Seiten- und Sitemap-Caches; dev: Live-Lauf 21.09.2026 protokolliert (9.221 Paare) +f9019ee 1c38c82 reports: Kohortenalter ab Stichtag statt ab --to; legacy:settle-unpaid kennt bereits ersetzte Quellen; dev: Basiswert 0.1 vom Live-System ausgewertet +5ef123c 2b5960b dev: Basiswert 0.1 abgeschlossen — Kohorte 28–55 Tage am Stichtag 21.09.2026 (Median 122 / 314), Nach-Deploy-Stand +605d853 6df36c9 dev: Roadmap Block 0 — 0.2 bis 0.6 als erledigt geführt (Stand Protokoll Teil 2) +b624f80 83cb6e1 assets: Inter (18pt-Schnitte) mit OFL 1.1 für den eingebrannten Bildnachweis (Bildkennzeichnung O4) +e9bdff3 214aea8 images: Datenmodell, Textarchiv, Herkunftsprüfung und gemeinsamer Uploader für Formular v2 (Bildkennzeichnung Block A) +40953d6 3d3ddc2 images: Titelbild-Formular v2, Admin-Upload mit Kundenbestätigung, Entfernen mit Sofortlöschung (Bildkennzeichnung Block B) +65ac72c 24184f1 api: Bildupload v1 unter Formular v2 (Pflichtfelder, Kennung des Wortlauts, Bestätigung mit Token), Legacy-Bildupload abgeschaltet, API-Doku (Bildkennzeichnung Block C) +2124ffd 9f44546 web/admin/pdf: gemeinsame Bildnachweis-Auflösung, Detailfenster am Artikelbild, Bestätigungsstand in Kunden- und Adminansicht, Wortwahl „automatisierte Prüfung" (Bildkennzeichnung Block D) +46b89e1 da167b7 images: Lebenszyklus — Veröffentlichungsgate, published_ever_at, Snapshot der veröffentlichten Fassung, Sofortlöschung, Legacy-Bereinigung, Beweiszugriff, Korrekturweg (Bildkennzeichnung Block E) +0240c14 b5b7041 archive: Beweisarchiv — verschlüsselte Einträge, Legal Hold, Purge mit Tombstone, Restore-Abgleich, Auslöser und Admin-Seite (Bildkennzeichnung Block F) +62723b5 075d0d9 legal/web: Zustimmungsgate je Dokumentversion (aus bis AGB 0.7), OG-Variante mit eingebranntem Bildnachweis, Nachweis in Teasern (Bildkennzeichnung Blöcke G und H) +3b613fa 70e15d5 images: press-release-images:regenerate-variants --only=og für den Bestand, Testhelfer eindeutig benannt (Bildkennzeichnung H.1) +0e5cd20 8bb7049 images: KI-Vorab-Check für Titelbilder — Vision-Sichtung mit definiertem Ausgang je Befund, Admin-Queue, Protokoll und Archiv-Snapshot (Bildkennzeichnung Block K) +6d558cd bcd02f2 web: KI-Badge am Artikelbild nach rechts unten, damit es das Nachweis-Zeichen links nicht überlappt (Bildkennzeichnung D.2) +d99f55e aaeee24 admin: Management ▸ Bilder — Liste aller Titelbilder mit PM-Link, Nachweis, Kennzeichnung, Bestätigungsstand und KI-Vorab-Check, Filter nach Sichtung/Zustand/Ausgang (Bildkennzeichnung) +4e34c3d 34fa342 tests/legal: Testdatenbank-Guard vor den DB-Traits, Flags in phpunit.xml gepinnt, Zustimmung an gezeigte Fassung gebunden (Umsetzungsaudit 25.09.: N22, N06, 5.3) +48129e9 2a2215b audit: Nacharbeit Umsetzungsaudit 25.09.2026 — Bildfreigabe, Beweisarchiv, KI-Atomarität, Berichte (Block 8, N01–N05, N07, N08, N10–N21, 5.1, 5.2) +b80cce6 c38bceb dev: Entwicklungsplan Block 8 — Abgleich Umsetzungsaudit 25.09., Entscheidungen E10–E18, Live-Schritte, Protokoll +97cd8f9 c6543eb dev: Entscheidungen E10–E18 vom Betreiber bestätigt (25.09.2026) +21e8871 05cd604 dev: Bildkennzeichnung — Deploy 1, 2 und 2b am 28.09.2026 live, Protokoll +98c465b 80536ab dev: Bildkennzeichnung — Deploy 1b live (Formular v2 an, Testkonto geprüft), Precheck und Gate bleiben aus +cf07723 1a11fb6 WIP-Schnappschuss vor Migration 2026-09-28 (uncommittete Änderungen von technik/betriebsfixes-2026-09) +1d417f8 1ccb4a8 auth/security: API-Firmenzuordnung nur für Mitglieder oder Allowlist, Google-Vorabübernahme geschlossen, gemeinsamer Login-Abschluss (Umsetzungsaudit 29.09.: R-01, K-04, K-07, K-08, B-10) +c2e0b85 d6e49c1 web/seo: Änderungsdatum unabhängig von Aufrufen, EN-URLs in Sitemap und Legacy-API, signierte Bounce-Referenz, Merge/Canonical konsistent (Umsetzungsaudit 29.09.: R-02 bis R-11, N17, N18, OPT-1, OPT-2; 02.10.: O01) +dfb0513 3dbc3fa tests: gemeinsamer Testhelfer, DB_URL-Guard vor RefreshDatabase, Larastan voller Scope ohne Meldung (Umsetzungsaudit 29.09.: Q-01, Q-02; 02.10.: O02) +f0eeef0 c82f279 press-releases/jobs: Scheduler respektiert manuelle Prüfung und kommt an Blockaden vorbei, Newsletter-Versand per Schalter gesperrt, kurze Scheduler-Sperren (Umsetzungsaudit 29.09.: K-01, K-02, K-05, K-06, K-09, E9, OPT-8, OPT-9; 02.10.: O06) +5ec252d f1c0e27 images: nur freigegebene Bilder in Feed und PDF, versionierte Veröffentlichungssnapshots, Bestätigung an das gezeigte Bild gebunden, getrennte Rückhaltegründe (Umsetzungsaudit 29.09.: B-01 bis B-14, N09, OPT-3 bis OPT-5; 02.10.: O03) +7cd84b2 60650ba archive: Auftragstabelle statt Marker, exklusiver Abschluss, Quarantäne, Restore über Payload-Identität und signierte Exporte, Schlüsselrotation (Umsetzungsaudit 29.09.: A-01 bis A-15, OPT-6, 5.1 d; 02.10.: O04, O05, O07, O08) +aa47e11 4a7e496 dev: Umsetzungsaudits 29.09. und 02.10., Entwicklungsplan Blöcke 9 und 10 mit bestätigten Entscheidungen E19–E34 und Deploy-Plan, Runbook ergänzt +2701588 448643b dev: Commit-Hashes der Blöcke 9 und 10 im Protokoll nachgetragen +f2ed268 2079dfd deps: Composer-Update (Laravel 12.69.3, Livewire 4.4.7, Flux 2.20.1, Fortify 1.40.0), league/commonmark 2.10.3 behebt zwei Advisories; Sentry-SDKs für GlitchTip (sentry/sentry-laravel, @sentry/browser) +8769a71 d884eb7 monitoring: Betriebsüberwachung Phase 1 — GlitchTip (Server- und Browserfehler), Fehlersignale ohne Exception, /health mit Scheduler-Herzschlag, ntfy-Alarme, fehlgeschlagene Anmeldungen im Verlauf, Umami im Kundenbereich, Versionsnummer +22b62df 8690165 dev: Monitoring-Plan (Phasen 1–3, Entscheidungen M1–M9, Protokoll), Deploy-Checkliste v1.1.0, Runbook um Versionsdatei und Composer-Schritt ergänzt +df7ebdc 9a05cb9 mcp: Context7-API-Schlüssel aus .mcp.json und .codex/config.toml entfernt — kommt jetzt aus CONTEXT7_API_KEY +33dc991 c837ef9 dev: Deploy-Checkliste v1.1.0 — Paket gebaut, Entwicklerdateien aus der Paketliste ausgenommen +8a64bd7 2dda9ec dev: Deploy-Checkliste — Server braucht kein Git +b1cec16 984d001 chore: docs/ aus dem Repository — lebt im Obsidian-Vault (Devcontainer-Mount), Q-05 entschieden; entpackte Deploy-Pakete ignoriert +cd18832 01d68c2 dev: Deploy v1.1.0 am 05.10.2026 live — Protokoll in Deploy-Checkliste, Entwicklungsplan (Blöcke 9/10) und Monitoring-Plan +f288ab6 1d7ce9e dev: Roadmap — Volt entfernen und auf Livewire-4-Single-File-Components umstellen (Umfang, Schritte) +4ca099f dd688e5 dev: KAS-Passwort erledigt — SSH-Zugang des Altsystems geändert und deaktiviert, KAS-Hosting bleibt für die Postfächer +73da704 129de4f deploy: Git-Deploy per Tag — dev/betrieb/deploy.sh, Ablauf und einmalige Umstellung in git-deploy.md, Runbook §10; public/build wird versioniert +e316734 168a1cd build: Assets für v1.1.1 +2f02acc 17dceec tests: Testsuite meldet nicht mehr an GlitchTip — Sentry-DSNs in phpunit.xml geleert, Wächtertest; Produktions-Logs unter dev/ ignoriert +16af374 3fd3ac0 fix: Registrierung — Platzhalter serverseitig übersetzt statt als Alpine-Ausdruck (GlitchTip browser-pressekonto 15), Wächtertest; Promise-Ablehnungen mit Typ und Inhalt (10); vertippte artisan-Befehle nicht melden (server-pressekonto 9) +a90f24a df557e4 search-console: vorübergehende Google-Fehler einmal wiederholt und nur als Warnung protokolliert, Portal-Abbruch nach fünf Fehlern in Folge, Zeitbudget 40 Minuten (GlitchTip server-pressekonto 11–14) +88b4feb 9e35c73 dev: GlitchTip-Dokumentation (dev/glitch-tip) — Überblick, Meldewege, API-Abruf, Ablauf zur Fehlerbehebung, Regeln, Protokoll der Einträge; Verweis in CLAUDE.md +072fd62 3a6cb6a dev: GlitchTip-Doku auf Git-Deploy umgestellt (Release-Datei schreibt deploy.sh) +eb2bf0b 88f343d build: Assets für v1.1.2 +92709d8 2a61122 fix: eigene Flux-Icons ins Repository — macOS-Muster "Icon" in der .gitignore traf bei core.ignorecase auch resources/views/flux/icon/ +79bb6cf 5782297 dev: Git-Deploy live seit v1.1.3 (06.10.2026) — Protokoll, Befunde der Umwandlung, Runbook §10 und GlitchTip-Doku angepasst +31da9ea 2cde728 livewire: Volt entfernt — Komponenten als Livewire-4-Single-File-Components, Route::livewire(), Livewire::test(); livewire/volt deinstalliert +a5bf331 6d03d8d billing: Rechnungsversand — PDF im Anhang der Zahlungsmail, optionale Rechnungs-E-Mail, Stripe-Rechnungs-PDF direkt aus dem Kundenbereich +debf094 da9411b dev: Deploy v1.2.0 (Volt entfernt) im Git-Deploy-Protokoll +bc5e151 9f806de dev: Git-Deploy — FPM-Reload ohne Passwort getestet, PK_FPM_RELOAD ungesetzt lassen; Nginx-Fehlerlog ausgewertet, process_control_timeout bewusst nicht gesetzt +06e37c9 2c25eea dev: Monitoring-Plan — Nachtrag fehlgeschlagene Anmeldungen (Befund, Auswertung) und Einrichtung des externen Monitors (Uptime Kuma, ntfy, zweite Ebene) +0aaee12 05535aa auth: fehlgeschlagene Anmeldungen mit Einstieg (livewire/fortify/two-factor); unbekannte Adressen als Tageszähler statt Verlaufseintrag, Kachel im Systemstatus, Löschfrist 90 Tage +ce6e8b4 c223daa deploy: Worker-Prüfung am Ende von deploy.sh — monitoring:queue-probe stellt einen Test-Job ein und wartet bis 60 s; ohne Worker Exit 3 mit Hinweis +dfc7ed1 3b4448a dev: Worker-Ausfall 06.10. dokumentiert — Runbook ohne pauschales queue:retry all, Vorgehen bei stehendem Worker, externer Monitor erledigt (status.adametz.media) +c385ad9 d083110 dev: Deploy v1.3.2 im Git-Deploy-Protokoll (Worker-Prüfung 4 s, Supervisor enabled) +2215826 32e1349 dev: Baukasten Git-Deploy und Betriebsüberwachung für andere Laravel-Projekte (dev/git-deploy-monitoring) — Anleitungen, Checkliste, Vorlagen für Laravel, deploy.sh und Monitoring-Server +d1d2ab3 fd8dd74 ops: Lokale Datenbank gegen fremde Testläufe absichern — DB_* nicht mehr als Container-Umgebung, Agenten-Regel, Testdatenbank-Pflicht im Baukasten +1c07fcb bae8347 security: Sicherheitsaudit 07.10.2026 (S-01–S-06) behoben, Passkeys und Zweitfaktor-Pflicht für Admins +5dc3bf5 8045ef1 build: Assets für v1.4.0 +c76e420 af72810 fix: Abgleich der Firmenrechte entzieht Bestandskonten ohne E-Mail-Bestätigung nicht mehr pauschal alle Rechte — memberships:resync-auto mit Probelauf und Notbremse +6eb7c08 f693226 dev: Deploy v1.4.0 und v1.4.1 im Git-Deploy-Protokoll, Release-Stand im Sicherheitsaudit und Entwicklungsplan +6d85d29 e77d9e7 feat: API-Zugang endet mit der Buchung, optionales Ablaufdatum für API-Tokens +7fa310f 3def447 security: Proxy-Vertrauen nur noch lokal, HSTS in Produktion, Tests ohne echte ntfy-Pushes +0048682 798ae75 dev: Deploy v1.5.0 im Git-Deploy-Protokoll +35a49cc 077e522 dev: Phase 4 im Sicherheits-Entwicklungsplan auf Stand v1.5.0/v1.6.0 +c751d4e 5dfd622 security: Andere Geräte abmelden, IP-weites Login-Limit, dauerhafte Sperrmarke, Passwortregeln, CSP im Melde-Modus +f92d1e0 9c4962f build: npm-Advisories für shell-quote und source-map-js behoben +6a86fa4 65086ca dev: Deploy v1.6.0 im Git-Deploy-Protokoll +28e78f5 75e206d dev: Imagick als Server-Voraussetzung, Wiedervorlage der Restpunkte im Sicherheits-Entwicklungsplan +69aaef4 b06f5a8 build: Assets für v1.6.1 +87ad433 bbc2b60 fix: Imagick in der Betriebsüberwachung, Scanner-Anfragen an Livewire als 400, abgebrochene Alpine-Übergänge nicht mehr melden +43420f0 61f449f dev: Deploy v1.6.1 im Git-Deploy-Protokoll +64d53a5 010258a build: Assets für v1.7.0 +9cb39b6 b3bcc43 dev: Entwicklungsplan Spamschutz, Wiedervorlage der Nacharbeiten nach dem Deploy +beae7e2 06d2889 feat: Spamschutz für Kontakt-Widget und Registrierung mit Cloudflare Turnstile +70ed7d1 35fd2f6 dev: Deploy v1.7.0 im Git-Deploy-Protokoll, Spamschutz-Nacharbeiten erledigt +3376f01 8e3554b dev: Doku aufgeräumt, neue Roadmap als einzige Liste offener Punkte diff --git a/dev/lagacy-rechnungen/entwicklungsplan-2026-09-16.md b/dev/archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md similarity index 100% rename from dev/lagacy-rechnungen/entwicklungsplan-2026-09-16.md rename to dev/archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md diff --git a/dev/archive/rechtliches-2026-10/antworten-rueckfragen-anwaltspaket-2026-10-12.md b/dev/archive/rechtliches-2026-10/antworten-rueckfragen-anwaltspaket-2026-10-12.md new file mode 100644 index 00000000..c5ffd3e6 --- /dev/null +++ b/dev/archive/rechtliches-2026-10/antworten-rueckfragen-anwaltspaket-2026-10-12.md @@ -0,0 +1,174 @@ +# Antworten auf die Rückfragen zum Anwaltspaket + +> **Korrektur 13.10.2026 (archiviert):** Abschnitt 1 ist überholt. Die Juli-Mails wurden über das Newsletter-Modul versendet (21.07. an 10, 22.07. an 954 Konten), nicht über `auth:send-go-live-mails`. Belege: [`nachweise/`](../../rechtliches/nachweise/README.md). + +> **Historischer Befund mit Ergänzungen:** Die [Korrekturen und Antworten](../../rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md) präzisieren insbesondere Juli-Versand, OpenAI-Speicherung, Berechtigungen und geplante Portal-Updates. Die frühere Schlussfolgerung aus verbliebenen Reset-Tokens auf nicht versandte Mails ist nicht belastbar; Betreiberangaben und Versandnachweise sind getrennt zu berücksichtigen. + +**Stand:** 12.10.2026 · **Gehört zu:** [`anwaltspaket-datenschutz-2026-10.md`](anwaltspaket-datenschutz-2026-10.md) + +**Grundlage:** Code (Release v1.8.0), Live-Seiten und Summen aus der lokalen Kopie der Live-Datenbank (Stand etwa 07.10.2026; nur Zählungen, keine Personendaten). + +**Status:** ✅ aus Code und Daten beantwortet · ◐ teilweise, Rest beim Betreiber · ✗ nur der Betreiber weiß es + +| Nr. | Status | Kurzantwort | +|---|---|---| +| 1 | ◐ | Überwiegend Gratiskonten. Nach Datenlage nicht informiert. Die alte Datenschutzerklärung liegt nicht im Repository. | +| 2 | ✅ | Noch nicht gebaut. Weder Modell noch Protokoll der Überarbeitung stehen fest. | +| 3 | ✅ | Ja. Texte werden auf der Detailseite gekennzeichnet, Bilder am Bild, im Bildnachweis und im Vorschaubild. | +| 4 | ◐ | Credits verfallen technisch nicht. Agency ist monatlich kündbar. Eine Erstattung gibt es im System nicht. Überweisung nur bei Altkunden. | +| 5 | ◐ | OpenAI-Aufrufe ohne Speicherung (`store`). Ob die Verträge vorliegen, weiß nur der Betreiber. Gemini und Anthropic stehen in der DSE, werden aber nicht genutzt. | +| 6 | ✅ | 6 Konten mit Admin-Rechten, davon 3 aktiv. Mails an Nichtkunden werden mit Adresse und Betreff protokolliert. | +| 7 | ◐ | Die Zähler liegen in Redis, nicht im Arbeitsspeicher von PHP. Ob Redis auf die Platte schreibt, zeigt nur der Server. | +| 8 | ◐ | Nutzer-ID nur im Kundenbereich des Hubs, derzeit ausgeschaltet. Die Frist für Rohdaten ist eine Einstellung der Instanz. | +| 9 | ✅ | Einzelunternehmen „adametz.media, Inhaber Kevin Adametz“, so auch im Impressum. | + +--- + +## 1. Altkonten (F7, § 7 Abs. 3 UWG) — ◐ + +**Zahlen** + +- 66.368 übernommene Konten: 50.485 von businessportal24, 15.883 von presseecho. +- Angelegt zwischen Juli 2010 und Juli 2026; 59.602 davon sind aktiv. +- 46.627 Konten haben mindestens eine Mitteilung veröffentlicht. +- **Nur 445 Konten haben je eine Rechnung bekommen.** Das sind 887 Rechnungen von 2010 bis 2026, bezahlt per PayPal (475) und Überweisung (rund 300). +- Weit über 99 % sind also **Gratiskonten**. Auf den alten Portalen war Veröffentlichen kostenlos. + +**Information bei der Migration** + +- Nach der Datenlage **wurden die Konten nicht informiert**. Der Befehl `auth:send-go-live-mails` erzeugt pro Konto ein Token zum Zurücksetzen des Passworts. Aus dem Juli 2026 liegt genau eines vor, bei rund 60.000 Mails müssten es Zehntausende sein. +- Seit dem 20.07. haben sich nur 23 Altkonten angemeldet. +- Roadmap 5.8 führt die Go-Live-Mails weiter als „Stand unbekannt“. +- **Betreiber bitte bestätigen.** + +**Datenschutzerklärung bei der Erhebung:** Sie liegt nicht im Repository. Quelle wäre das Archiv der alten Portale, zum Beispiel die Wayback Machine für presseecho.de und businessportal24.com 2010–2026. ✗ + +**Bewertung für F7:** Wer nie etwas gekauft hat, ist kein Bestandskunde im Sinne von § 7 Abs. 3 UWG. Infrage kämen höchstens die 445 zahlenden Konten, und auch nur mit Hinweis auf das Widerspruchsrecht bei der Erhebung. Das stützt die Empfehlung „nur Opt-in“. + +## 2. Portal-Updates: Modell und dokumentierte Überarbeitung (F10, A6) — ✅ + +- **Noch nicht gebaut.** Die Pipeline aus dem [Decision-Update Changelog](../../changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md) steht auf Roadmap 6.6, nicht begonnen. +- **Modell:** Für die Portal-Updates ist noch keines festgelegt. Die bestehenden Prüfungen laufen über OpenAI, Standard `gpt-5.4-mini` (`OPENAI_MODEL`). Naheliegend ist, dasselbe Modell zu nehmen. +- **Überarbeitung, wie geplant:** + - Stufe 3: Admin-Liste zum Streichen, Umformulieren und Freigeben. + - Stufe 5: manuelle Freigabe des Artikels. + - Entschieden ist bisher nur „jeder Artikel wird vom Betreiber überarbeitet und freigegeben“ (O4). Diff und Freigabeprotokoll sind noch nicht festgelegt. +- **Vorschlag, damit „dokumentierte Überarbeitung“ belegbar ist:** pro Artikel speichern + - den KI-Entwurf und die veröffentlichte Fassung, + - den Unterschied zwischen beiden, + - wer freigegeben hat und wann. + + Das kostet wenig, wenn es beim Bau gleich mit angelegt wird. +- **Kundenmeldungen (A6):** Das Portal bearbeitet Kundentexte nicht (AGB § 7 Abs. 5). Die KI-Angabe ist eine Selbsterklärung des Einreichers, siehe Frage 3. + +## 3. Kennzeichnung von KI-Inhalten in Kundenmeldungen (F10, A6) — ✅ + +`ai_generated` gehört zur Bild-Deklaration. Für Texte heißen die Werte `mostly_ai` und `fully_ai`. + +**Texte** + +- Ist eine Mitteilung als „ganz oder überwiegend mit generativer KI erstellt“ deklariert, steht auf der **Detailseite über dem Text** ein Hinweiskasten. Er spricht in der Stimme des Einreichers: „KI-generiert: Nach Angaben des einreichenden Unternehmens wurde diese Pressemitteilung ganz oder überwiegend mit generativer KI erstellt.“ +- In Listen und Teasern erscheint keine Kennzeichnung. +- Bestand: 9 Mitteilungen `mostly_ai`, 5.122 `none`. Rund 176.000 Altmeldungen haben keine Angabe. + +**Bilder** + +- Bei `ai_generated` oder `ai_edited` gibt es ein **Schild am Bild** auf der Detailseite: „KI-generiert“ bzw. „KI-bearbeitet“. +- Der Hinweis erscheint außerdem in der Bildinformation, mit Angabe der Quelle der Kennzeichnung, und in der Nachweiszeile der Teaser. +- Er ist auch in das Vorschaubild für soziale Netzwerke eingeblendet. +- Bestand: 24 `ai_generated`, 8 `ai_edited`, 7 Altbilder mit KI-Merker. + +**Lücke** + +- Die **Alt-API** (`/service/…`, connektar) setzt bei Texten selbst „ohne KI“ und bestätigt das im Namen des Kunden. +- API v1 verlangt die Angabe dagegen als Pflichtfeld. +- Siehe Roadmap 2, „connektar `ai_declaration`“. + +## 4. Credits, Kündigung, Erstattung, Überweisung — ◐ + +- **Verfall:** + - AGB § 5 Abs. 2: mindestens drei Jahre ab Ende des Kaufjahres. + - **Im Code gibt es weder einen Verfall noch die versprochene Erinnerungsmail.** Credits verfallen derzeit also nie. + - Die Erinnerung muss vor dem ersten möglichen Ablauf gebaut sein. Für Käufe aus 2026 ist das der 31.12.2029. +- **Agency** (199 €/Monat) wird wie alle Tarife monatlich oder jährlich bezahlt. Bei monatlicher Zahlung ist er nach AGB § 11 Abs. 2 monatlich kündbar. +- **Erstattung:** + - Das System hat keinen Ablauf dafür. Die Status „refunded“ sind angelegt, werden aber nirgends gesetzt. + - In den Daten seit Go-Live: keine erstattete Zahlung, 17 bezahlte und 3 stornierte Rechnungen. + - Bisherige Fälle liefen, wenn überhaupt, im Stripe-Dashboard. Wie sie abgerechnet wurden, weiß nur der Betreiber. ✗ +- **Überweisung:** + - Für Neukunden nur Stripe. + - Überweisung gibt es nur für Altkunden mit Bestandsschutz („MAN-Kreis“): 23 alte Zahlungsvereinbarungen, bisher 3 MAN-Rechnungen. + - „FMI“ kommt im Code und in den Altdaten nicht vor. Bitte die Abkürzung erklären. ✗ + +## 5. Auftragsverarbeitungsverträge, OpenAI (D2, D4, D6, D8, F9) — ◐ + +- **Verträge:** Ob sie abgeschlossen sind, weiß nur der Betreiber. ✗ Wo man sie üblicherweise abschließt: + - **Hetzner:** online in Robot bzw. der Cloud Console. Die DSE behauptet in Abschnitt 3, dass er besteht. + - **ALL-INKL:** im KAS-Kundenbereich. + - **Cloudflare:** Die Customer-DPA ist Teil der Nutzungsbedingungen. + - **Stripe:** Die DPA ist Teil des Services Agreement. Laut DSE ist Stripe für die Zahlungsabwicklung aber selbst verantwortlich. +- **OpenAI:** + - Die drei Prüfungen (Klassifizierung, Inhaltsbewertung, Bild-Vorabcheck) rufen `chat/completions` ohne `store`-Parameter auf. Die Anfragen werden damit nicht für spätere Verwendung gespeichert. + - Ob ein DPA abgeschlossen ist und ob Zero Data Retention beantragt wurde, steht nicht im Code. Beides sind Einstellungen der Organisation bei OpenAI. ✗ + - Ohne Zero Data Retention bewahrt OpenAI Anfragen bis zu 30 Tage zur Missbrauchskontrolle auf. + + API über OpenAI Ireland +https://openai.com/de-DE/index/offering-zero-data-retention-for-frontier-models/ +https://openai.com/de-DE/index/expanding-data-residency-access-to-business-customers-worldwide/ +Um die Option „Keine Datenaufbewahrung“ (Zero Data Retention / ZDR) für die Prüfung Ihrer Pressemitteilungen zu aktivieren, müssen Sie die KI über die OpenAI API an Ihr Presseportal anbinden. Für die neueste Generation der Frontier-Modelle nutzt OpenAI das Verfahren Private Safety Processing (PSP). Dadurch werden missbräuchliche Muster vollautomatisch erkannt, ohne dass OpenAI Ihre Prompts oder die Texte der Pressemitteilungen dauerhaft aufbewahrt oder für menschliche Reviews speichert. "das ist gemacht worden. Eine andere Möglichkeit besteht derzeit nicht." + +- **Befund DSE Abschnitt 10/8:** Dort stehen „Google Gemini“ und „Anthropic Claude“. **Beide sind nicht angebunden.** Es läuft nur OpenAI, beziehungsweise ohne Schlüssel eine regelbasierte Prüfung. In Fassung 0.4 sollte nur OpenAI stehen, mit einer Formulierung für künftige Anbieter. + +## 6. Aktivitätsverlauf (F3) — ✅ + +- **Zugriff:** + - Jeder mit Admin-Zugang sieht den Verlauf unter Admin ▸ Berichte ▸ Aktivität. Eine eigene Berechtigung gibt es dafür nicht. + - Admin-Zugang haben die Rollen `admin` und `editor` sowie der Super-Admin-Merker. + - Betroffen sind **6 Konten, davon 3 aktiv**: + - das Konto unter `@pressekonto.com` (letzte Anmeldung 07.10.2026), + - eines unter `@me.com` (14.07.2026), + - eines unter `@stern-consulting.eu` (letzte Anmeldung 2012). + - Die drei inaktiven (`@stern-tours.de`, `@googlemail.com`, `@gmx.at`) sind gesperrt. + - **Bitte prüfen**, ob die beiden aktiven Fremdkonten dir gehören. Wenn nicht: Admin-Rolle entziehen. Seit v1.4 brauchen Admins zwar einen zweiten Faktor, das ändert aber nichts an der Frage des Zugriffs. +- **Mails an Nichtkunden:** + - **Ja.** Jede versendete Mail wird mit **Empfängeradresse und Betreff** protokolliert, als „Handelnder“ steht der Kontoname oder sonst die Adresse. + - Das betrifft auch Pressekontakte ohne Konto. 5.007 von 7.642 Mail-Einträgen gehören zu keinem Konto. + - Ein Name erscheint bei Nichtkunden nur, wenn er im Betreff steht. + - Seit v1.8 gilt eine Löschfrist von 395 Tagen. + +## 7. Speicher der Anmeldebegrenzung (F4, Text 7a) — ◐ + +- **Wo die Zähler liegen:** Sie laufen über den Laravel-Cache. Der steht laut Vorlage auf **Redis** (`CACHE_STORE=redis`), ebenso die Sessions. Den Wert in der Live-`.env` bitte bestätigen. +- **Was gezählt wird:** + - Fehlversuche je IP-Adresse: 15 Minuten, Sperre ab 20. + - Zusätzlich Versuche je **Kombination aus E-Mail-Adresse und IP**: 1 Minute, höchstens 5. + - Text 7a nennt nur die IP-Adresse. +- **„Im Arbeitsspeicher“ stimmt nur eingeschränkt.** Redis hält die Daten im Arbeitsspeicher, schreibt je nach Konfiguration aber Sicherungen auf die Platte (RDB/AOF). Prüfen auf dem Server: + + ``` + redis-cli CONFIG GET save + redis-cli CONFIG GET appendonly + ``` + + ✗ +- **Vorschlag für 7a:** „… für höchstens 15 Minuten in einem Zwischenspeicher; die Einträge verfallen danach automatisch.“ Damit stimmt der Text unabhängig von der Redis-Konfiguration. +- Getrennt davon gibt es die Tageszählung fehlgeschlagener Anmeldungen (`failed_login_tallies`, 90 Tage). Sie steht bereits im Paket. + +## 8. Umami (F6) — ◐ + +- **Wo die Nutzer-ID gesetzt wird:** + - Nur im **Kundenbereich auf dem Hub** (Routen `me.*`), nie während eines Support-Zugriffs auf ein Kundenkonto. + - Nur wenn `UMAMI_PORTAL_ENABLED` **und** `UMAMI_IDENTIFY_USERS` an sind. **Beide sind derzeit aus** (Roadmap 3.6). + - Auf den Portalen gibt es nie eine Nutzer-ID. +- **Form der ID:** `user-`, unverschlüsselt. Pseudonym nur gegenüber Umami; der Betreiber kann sie direkt zuordnen. Falls der Anwalt es verlangt, lässt sie sich mit einem Prüfwert (HMAC) verschleiern. +- **Frist für Rohdaten:** + - Die Anwendung legt keine fest; sie ist eine Einstellung der Instanz auf sys.adametz.media. + - Nach meinem Kenntnisstand löscht Umami ohne eigene Einrichtung nichts automatisch. + - Bitte auf der Instanz prüfen und eine Frist festlegen, zum Beispiel 13 Monate, passend zu 5a. ✗ + +## 9. Verantwortlicher (DSE Abschnitt 1) — ✅ + +- Einzelunternehmen, ohne eigene Rechtsform. +- Schreibweise: **„adametz.media, Inhaber: Kevin Adametz, In der Lake 4, 33739 Bielefeld“**. So steht es in DSE, AGB § 1 Abs. 2 und Impressum (§ 5 DDG, USt-IdNr. DE298729654). +- „Adametz Media“ kommt in den Rechtstexten nicht vor. +- Bitte bestätigen, dass sich daran nichts ändert, etwa durch eine Gründung. diff --git a/dev/archive/rechtliches-2026-10/anwaltspaket-datenschutz-2026-10.md b/dev/archive/rechtliches-2026-10/anwaltspaket-datenschutz-2026-10.md new file mode 100644 index 00000000..6b27a0f3 --- /dev/null +++ b/dev/archive/rechtliches-2026-10/anwaltspaket-datenschutz-2026-10.md @@ -0,0 +1,223 @@ +# Anwaltspaket Datenschutz und Rechtstexte — Oktober 2026 + +**Stand:** 09.10.2026 · **Entwurf, vor Versand vom Betreiber zu prüfen** +**Angebot:** pressekonto.com (Kundenbereich, „Hub“), presseecho.de und businessportal24.com (Portale) +**Bezug:** Datenschutzerklärung (DSE) Version 0.3 vom 03.07.2026 mit späteren Ergänzungen 5a (21.09.) und 6a (09.10.); AGB 0.6; Decision-Update Bildrechte vom 22.09.2026 + +Einordnungen in diesem Dokument sind technische Beschreibungen und Vorschläge, keine Rechtsberatung. Jede Frage nennt unseren Standpunkt („Default“), damit Sie bestätigen oder widersprechen können. + +--- + +## 1. Anliegen + +Seit Juli sind mehrere Verarbeitungen hinzugekommen, die die DSE noch nicht oder nur pauschal beschreibt. Einige laufen bereits produktiv. Wir bitten um: + +1. Prüfung und Freigabe der Textentwürfe in Abschnitt 4 (neue DSE-Fassung 0.4), +2. Antwort auf die Fragen in Abschnitt 5, +3. die bereits angekündigte Prüfung des Pakets Bildrechte (Agenda A1–A7, Anlage 1) mit AGB 0.7 und den DSE-Abschnitten 9a/9b in derselben Sitzung. + +Die DSE ist eine Datei mit zwei Ausprägungen: Auf dem Hub erscheinen zusätzlich Kundenkonto, Magic-Link-Anmeldung und Stripe (Abschnitte 7–9), auf den Portalen stattdessen Änderungslinks, Medienprivileg und Newsroom. Die Nummerierung unterscheidet sich deshalb je Host (siehe Frage F1). + +--- + +## 2. Übersicht + +| Nr. | Verarbeitung | Produktiv | In der DSE | Default Rechtsgrundlage | Default Frist | +|---|---|---|---|---|---| +| D1 | Bild-Originale, Rechtebestätigung, Beweisarchiv | seit 28.09.2026 | nein (Entwurf 9a/9b in Anlage 1) | Art. 6 Abs. 1 lit. f; Art. 17 Abs. 3 lit. e | Beweisarchiv 3 Jahre nach Jahresende | +| D2 | Fehlerprotokoll (GlitchTip, selbst gehostet) | seit 05.10.2026 | nein | Art. 6 Abs. 1 lit. f | 90 Tage | +| D3 | Anmeldesicherheit: Fehlversuche, Limits, Zwei-Faktor, Passkeys, Google-Login | schrittweise seit Juli, zuletzt 08.10.2026 | nein | Art. 6 Abs. 1 lit. b und f | siehe Text | +| D4 | E-Mail-Zustellung: Rückläufer, Sperrliste, Abmeldung | seit 15.09.2026 | nur pauschal (Abschnitt 12) | Art. 6 Abs. 1 lit. f (Sperrliste zusätzlich lit. c) | Rückläufer 395 Tage, Sperrliste unbefristet | +| D5 | Aktivitätsverlauf und API-Zugriffsprotokoll | seit Juli 2026 | nein | Art. 6 Abs. 1 lit. f | 395 bzw. 90 Tage (ab nächstem Release) | +| D6 | Cloudflare Turnstile | seit 09.10.2026 | ja, Abschnitt 6a als Vorschlag | Art. 6 Abs. 1 lit. f; § 25 Abs. 2 Nr. 2 TDDDG | — | +| D7 | Webanalyse im Kundenbereich mit pseudonymer Nutzer-ID | **nicht aktiv** | nein | Art. 6 Abs. 1 lit. f? | Umami-Aufbewahrung | +| D8 | KI-Vorabprüfung von Bildern (OpenAI) | **nicht aktiv** | nein | Art. 6 Abs. 1 lit. f | keine Speicherung beim Anbieter | +| D9 | IP-Adressen in Vorgangsdaten (Kontakt, Meldungen, Widerruf, Kündigung, Buchungsbestätigung) | seit Juli 2026 | nur „technische Metadaten“ | Art. 6 Abs. 1 lit. f | geplant 90 Tage, danach entfernt | +| D10 | Newsletter an Kontoinhaber | Versand **gesperrt** | nein | offen (Frage F7) | — | + +--- + +## 3. Sachverhalt je Verarbeitung + +### D1 — Bild-Originale, Rechtebestätigung, Beweisarchiv + +Ausführlich in Anlage 1 (Decision-Update Bildrechte, Abschnitte 3 und 4) mit Textentwurf 9a/9b. Zwei Abweichungen des tatsächlichen Stands vom dortigen Entwurf: + +- Ein Archiveintrag enthält neben dem zuletzt veröffentlichten Stand auch **Name, E-Mail und Telefon der Pressekontakte** der Mitteilung sowie **Name und E-Mail des Einreichers**; der Entwurf nennt nur „Konto und Firma“. Wir würden den Text ergänzen statt das Archiv zu kürzen, weil die Kontaktangaben Teil der veröffentlichten Fassung waren. +- Die Browser-Kennung (User-Agent) wird auf 250 Zeichen gekürzt, nicht weiter reduziert. Der Entwurf spricht von einer „gekürzten Kennung“. + +Weitere Fristen aus diesem Bereich, die die DSE bisher nicht nennt: Entwürfe und nie veröffentlichte, abgelehnte Einreichungen werden 180 Tage nach der letzten Änderung samt Medien gelöscht; Bearbeitungsstände von Korrekturen nach 30 Tagen. + +### D2 — Fehlerprotokoll (GlitchTip) + +Tritt im Server oder im Browser ein technischer Fehler auf, wird ein Fehlerbericht an eine selbst gehostete GlitchTip-Instanz übermittelt (errors.adametz.media). Der Server steht bei der Hetzner Online GmbH im Rechenzentrum Falkenstein (Deutschland); auf demselben Server läuft die Webanalyse Umami. + +- **Inhalt:** Fehlermeldung und Programmstelle, aufgerufene Adresse und Herkunftsseite (Abfrageparameter bis auf eine Freigabeliste entfernt, Token und Signaturen ersetzt), Browser und Betriebssystem, Softwarestand, bei angemeldeten Nutzern **nur die interne Nutzer-ID**. +- **Nicht enthalten:** IP-Adresse, Name, E-Mail-Adressen (in Fehlertexten automatisch ersetzt), Cookies, Formularinhalte und Request-Bodys. Seit dem nächsten Release werden auch die Begleitdaten von Protokollschritten („Breadcrumbs“) entfernt. +- Im Browser wird die Fehlerbibliothek erst beim ersten Fehler geladen, ohne Cookies und ohne Sitzungsverfolgung. Die Verbindung geht dann direkt vom Browser zum Fehlerserver. +- **Frist:** 90 Tage (Einstellung der GlitchTip-Instanz). + +### D3 — Anmeldesicherheit + +- **Fehlgeschlagene Anmeldungen** mit unbekannter Adresse: nur ein Tageszähler je Einstieg und Quelle, die Quelle als gekürzter, mit geheimem Schlüssel gebildeter Hash der IP-Adresse; Löschung nach 90 Tagen. +- Fehlgeschlagene Anmeldungen und Sperren **bekannter Konten**: Eintrag im Aktivitätsverlauf (Konto, Grund, gekürzter IP-Hash), Frist wie D5. +- **Begrenzung von Anmeldeversuchen:** Zähler je IP-Adresse bzw. Adresse und IP im Zwischenspeicher, Verfall nach 1 bzw. 15 Minuten. +- **Letzte Anmeldung:** Zeitpunkt und IP-Adresse der letzten Anmeldung am Konto, für den Kontoinhaber auf der Sicherheitsseite sichtbar (Hinweis bei fremden Anmeldungen). Wird bei jeder Anmeldung überschrieben, keine Historie. +- **Zwei-Faktor-Authentifizierung** (Authenticator-App): verschlüsseltes Geheimnis und Wiederherstellungscodes am Konto. +- **Passkeys:** öffentlicher Schlüssel und technische Kennungen des Authentifikators, vom Nutzer vergebener Name, Zeitpunkt der letzten Nutzung; das Gerät selbst und biometrische Daten verlassen das Gerät nicht. +- **Anmeldung mit Google:** Bei Nutzung übermittelt Google Name, E-Mail-Adresse und eine Google-Kennung; wir speichern die Kennung am Konto. Google Ireland Ltd. / Google LLC (USA, EU-US Data Privacy Framework). +- **Abmeldung anderer Geräte:** nur ein Zeitstempel am Konto. + +### D4 — E-Mail-Zustellung + +- **Rückläufer:** Unzustellbarkeitsmeldungen werden aus einem eigenen Postfach (bei ALL-INKL) abgeholt und ausgewertet: Empfängeradresse, Art und Text der Meldung, interne Referenz der auslösenden Mail. Frist 395 Tage. +- **Sperrliste:** Adressen, die dauerhaft nicht zustellbar sind oder sich abgemeldet haben, erhalten keine Mails mehr. Die Sperrliste ist unbefristet, solange sie ihren Zweck erfüllt (Zusendung gegen den Willen bzw. an tote Adressen verhindern). +- **Abmeldung:** Jede Benachrichtigung enthält einen Abmeldelink (auch per Ein-Klick-Abmeldung im Mailprogramm). Für Empfänger ohne Konto (z. B. Pressekontakte) wird die Abmeldung als Eintrag in der Sperrliste gespeichert. +- Offener technischer Punkt: Die abgeholten Rückläufer-Mails bleiben bisher unbefristet in Ordnern des Postfachs; wir würden sie nach 90 Tagen löschen (Frage F5). + +### D5 — Aktivitätsverlauf und API-Zugriffsprotokoll + +- **Aktivitätsverlauf** (nur für Administratoren): Registrierungen, Anmeldungen mit Anmeldeweg, Statuswechsel von Mitteilungen, eingehende Anfragen, Mailversand mit Empfänger und Betreff, Administratorhandlungen. Enthält Namen und E-Mail-Adressen im Klartext. Zweck: Nachvollziehbarkeit, Missbrauchserkennung, Support. Kunden sehen ihre eigenen Anmeldungen auf der Sicherheitsseite. **Frist: 395 Tage** (ab dem nächsten Release, bisher keine). +- **API-Zugriffsprotokoll:** je Anfrage an die Programmierschnittstelle Konto, Token, Methode, Pfad, Statuscode, Dauer, **IP-Adresse und User-Agent**. Zweck: Betrieb, Missbrauchserkennung, Abrechnungsnachweis. **Frist: 90 Tage** (ab dem nächsten Release, bisher keine). + +### D6 — Cloudflare Turnstile + +Abschnitt 6a ist seit 09.10.2026 als Vorschlag live. Ergänzend zum Text: Unser Server übermittelt bei der Prüfung zusätzlich die IP-Adresse des Nutzers an Cloudflare („remoteip“). Ist Cloudflare nicht erreichbar, wird das Formular angenommen und intern markiert. + +### D7 — Webanalyse im Kundenbereich (nicht aktiv) + +Umami (selbst gehostet, cookielos) läuft heute nur auf den öffentlichen Seiten. Geplant: auch im Kundenbereich, wahlweise mit **pseudonymer Nutzer-ID** („user-123“, ohne Name und E-Mail), um Bedienprobleme einem Konto zuordnen zu können, sowie mit Ladezeit-Messwerten (Web Vitals). Das widerspräche dem heutigen Satz „Es werden keine Nutzerprofile erstellt“ (Abschnitt 5). Wir schalten das erst nach Ihrer Antwort ein (Frage F6). + +### D8 — KI-Vorabprüfung von Bildern (nicht aktiv) + +Hochgeladene Bilder würden verkleinert (lange Kante 1024 px), ohne Metadaten und ohne Dateiname, Konto oder sonstige Kennung an OpenAI übermittelt und auf offensichtliche Probleme gesichtet (z. B. Wasserzeichen von Bildagenturen, unzulässige Inhalte, ob Personen erkennbar sind — keine Identifizierung). Das Ergebnis speichern wir mit der Rechtebestätigung (9a). Einschalten erst nach Abschluss eines Auftragsverarbeitungsvertrags und Freigabe des Absatzes. + +### D9 — IP-Adressen in Vorgangsdaten + +Bei Kontaktanfragen, Meldungen nach dem Meldeverfahren, Widerrufen, Kündigungen und Buchungsbestätigungen speichern wir die IP-Adresse des Absenders im Klartext, bisher ohne eigene Frist. Zweck: Missbrauchsabwehr und Nachweis des Eingangs. Vorschlag: IP-Adresse nach 90 Tagen entfernen, der Vorgang selbst folgt seiner fachlichen Frist (Meldedaten drei Jahre, Vertragsdaten gesetzliche Aufbewahrung). + +### D10 — Newsletter an Kontoinhaber (Versand gesperrt) + +Es gibt ein Kampagnenmodul für Mails an Kontoinhaber. Der Versand ist technisch gesperrt. Wir planen künftig nur Mails mit ausdrücklicher Einwilligung (Opt-in-Schalter im Konto, standardmäßig aus), z. B. einen monatlichen Rückblick auf Neuerungen. + +--- + +## 4. Textentwürfe für die DSE 0.4 + +Stil und Aufbau wie die bestehende DSE. Abschnittsnummern vorläufig; die Einordnung je Host klärt Frage F1. Platzhalter in eckigen Klammern. + +### 3a. Fehlerprotokoll (neu, nach Abschnitt 3) + +> Um technische Fehler schnell zu erkennen und zu beheben, übermitteln unsere Server und — nur wenn in Ihrem Browser ein Fehler auftritt — Ihr Browser einen Fehlerbericht an eine von uns selbst betriebene Fehlerdatenbank (GlitchTip) auf einem Server der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, im Rechenzentrum Falkenstein (Deutschland). +> +> Dabei werden insbesondere verarbeitet: +> - Fehlermeldung, betroffene Programmstelle und Zeitpunkt, +> - die aufgerufene Seite und die Herkunftsseite, bereinigt um Zugangs- und Bestätigungscodes, +> - Browser, Betriebssystem und Softwarestand, +> - wenn Sie angemeldet sind, Ihre interne Kundennummer. +> +> IP-Adressen, Namen, E-Mail-Adressen, Cookies und Formularinhalte werden nicht übermittelt; E-Mail-Adressen in Fehlermeldungen werden vor der Übermittlung unkenntlich gemacht. Im Browser wird die Fehlerkomponente erst beim Auftreten eines Fehlers geladen und setzt keine Cookies. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Unser berechtigtes Interesse liegt im sicheren und fehlerfreien Betrieb unseres Angebots. Fehlerberichte werden nach 90 Tagen gelöscht. + +### 7a. Anmeldung und Kontosicherheit (neu, Hub, nach Abschnitt 7) + +> Zum Schutz Ihres Kontos verarbeiten wir bei der Anmeldung folgende Daten: +> - Zeitpunkt und IP-Adresse Ihrer letzten Anmeldung; beides sehen Sie auf der Seite „Konto-Sicherheit“, damit Ihnen fremde Anmeldungen auffallen. Die Angabe wird bei jeder Anmeldung überschrieben. +> - Ihre Anmeldungen mit Zeitpunkt und Anmeldeweg (Passwort, Magic-Link, Google, Passkey) sowie fehlgeschlagene Anmeldeversuche und Sperren Ihres Kontos in unserem internen Aktivitätsverlauf. Die IP-Adresse wird dort nur als gekürzter, mit einem geheimen Schlüssel gebildeter Prüfwert gespeichert. +> - Anmeldeversuche mit Adressen, zu denen kein Konto besteht, zählen wir nur als Tagessumme je Quelle (ebenfalls als gekürzter Prüfwert der IP-Adresse). +> - Für die Begrenzung von Anmeldeversuchen zählen wir Fehlversuche je IP-Adresse für höchstens 15 Minuten im Arbeitsspeicher. +> +> Wenn Sie die Zwei-Faktor-Authentifizierung einrichten, speichern wir das Geheimnis Ihrer Authenticator-App und Ihre Wiederherstellungscodes verschlüsselt. Wenn Sie einen Passkey anlegen, speichern wir dessen öffentlichen Schlüssel, technische Kennungen des Authentifikators, den von Ihnen vergebenen Namen und den Zeitpunkt der letzten Nutzung; Ihr privater Schlüssel und biometrische Merkmale verlassen Ihr Gerät nicht. Über Hinzufügen und Entfernen eines Passkeys informieren wir Sie per E-Mail. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Bereitstellung eines sicheren Kundenkontos) und Art. 6 Abs. 1 lit. f DSGVO (Schutz vor unbefugten Zugriffen). Einträge im Aktivitätsverlauf löschen wir nach 395 Tagen, Tagessummen fehlgeschlagener Anmeldungen nach 90 Tagen. Zwei-Faktor-Daten und Passkeys löschen wir, wenn Sie sie entfernen, spätestens mit Ihrem Konto. +> +> **Anmeldung mit Google.** Wenn Sie „Mit Google anmelden“ wählen, übermittelt uns Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Ihren Namen, Ihre E-Mail-Adresse und eine Google-Kennung; die Kennung speichern wir an Ihrem Konto, um Sie bei der nächsten Anmeldung zuzuordnen. Für die Anmeldung bei Google gilt dessen Datenschutzerklärung. Eine Übermittlung an Google LLC in den USA ist möglich; Google LLC ist unter dem EU-US Data Privacy Framework zertifiziert (Art. 45 DSGVO). Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. + +### 7b. Aktivitätsverlauf und Programmierschnittstelle (neu, Hub) + +> Für die Nachvollziehbarkeit von Vorgängen, die Missbrauchserkennung und den Support führen wir einen internen Aktivitätsverlauf, auf den nur Administratoren Zugriff haben. Er enthält insbesondere Registrierungen und Anmeldungen, Statuswechsel von Pressemitteilungen, eingegangene Anfragen, versandte Benachrichtigungen mit Empfänger und Betreff sowie Handlungen von Administratoren. Einträge werden nach 395 Tagen gelöscht. +> +> Wenn Sie unsere Programmierschnittstelle (API) nutzen, protokollieren wir je Anfrage Ihr Konto und den verwendeten Zugangsschlüssel, die aufgerufene Funktion, das Ergebnis, die Dauer sowie IP-Adresse und Browser- bzw. Programmkennung. Das Protokoll dient dem Betrieb, der Missbrauchserkennung und dem Nachweis der Nutzung und wird nach 90 Tagen gelöscht. +> +> Rechtsgrundlage ist jeweils Art. 6 Abs. 1 lit. f DSGVO; bei der API-Nutzung zusätzlich Art. 6 Abs. 1 lit. b DSGVO. + +### 12a. Zustellbarkeit und Abmeldung (Ergänzung zu Abschnitt 12) + +> Erhalten wir eine Meldung, dass eine E-Mail nicht zugestellt werden konnte, werten wir sie automatisch aus und speichern die Empfängeradresse, die Art und den Text der Meldung sowie eine interne Referenz der betroffenen E-Mail. Adressen, die dauerhaft nicht erreichbar sind, nehmen wir in eine Sperrliste auf und senden keine weiteren E-Mails an sie. +> +> Jede Benachrichtigung enthält einen Link zur Abmeldung; Ihr Mailprogramm kann die Abmeldung auch direkt auslösen. Haben Sie kein Kundenkonto — zum Beispiel als in einer Pressemitteilung genannter Pressekontakt —, speichern wir Ihre Abmeldung in derselben Sperrliste. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt in der zuverlässigen Zustellung und darin, keine unerwünschten oder unzustellbaren E-Mails zu versenden. Für die Beachtung Ihrer Abmeldung ist die Speicherung zudem erforderlich, um Ihren Widerspruch dauerhaft umzusetzen. Zustellmeldungen löschen wir nach 395 Tagen; Einträge der Sperrliste bleiben bestehen, solange sie für diesen Zweck erforderlich sind. + +### 6 — Ergänzung zur Kontaktaufnahme (IP-Adresse) + +> Zum Schutz vor Missbrauch speichern wir bei Kontaktanfragen, Meldungen, Widerrufen und Kündigungen über unsere Formulare die IP-Adresse, von der die Anfrage gesendet wurde, und löschen sie nach 90 Tagen. Die übrigen Angaben speichern wir, solange es zur Bearbeitung und Dokumentation des Vorgangs erforderlich ist. + +*(setzt die Umsetzung von D9 voraus)* + +### 5 — Ergänzung Webanalyse im Kundenbereich (nur falls D7 eingeschaltet wird) + +> Im Kundenbereich auf pressekonto.com setzen wir Umami ebenfalls ein. Damit wir Bedienprobleme erkennen und beheben können, ordnen wir die Nutzung dort einer pseudonymen Kennung Ihres Kundenkontos zu (zum Beispiel „user-123“); Name und E-Mail-Adresse werden nicht übermittelt. Außerdem erfassen wir Ladezeiten der Seiten. Für die öffentlichen Seiten der Portale bleibt es bei der Erfassung ohne Personenbezug. + +### 9a — Ergänzung KI-Vorabprüfung von Bildern (nur falls D8 eingeschaltet wird) + +> Hochgeladene Bilder übermitteln wir in verkleinerter Form, ohne Metadaten und ohne Angaben zu Ihrem Konto an [OpenAI, L.L.C. / OpenAI Ireland Ltd.], wo sie automatisiert auf offensichtliche Probleme gesichtet werden (zum Beispiel Wasserzeichen von Bildagenturen, unzulässige Inhalte, ob Personen erkennbar sind; eine Identifizierung von Personen findet nicht statt). Eine Speicherung beim Anbieter zu eigenen Zwecken erfolgt nicht. Das Ergebnis speichern wir mit der Rechtebestätigung. + +### 13 — neue Zeilen in der Liste der Speicherfristen + +> - Fehlerberichte (Abschnitt 3a) werden nach 90 Tagen gelöscht. +> - Einträge im Aktivitätsverlauf werden nach 395 Tagen gelöscht, Tagessummen fehlgeschlagener Anmeldungen nach 90 Tagen, das API-Zugriffsprotokoll nach 90 Tagen. +> - Zustellmeldungen werden nach 395 Tagen gelöscht; Einträge der Sperrliste bleiben bestehen, solange sie erforderlich sind. +> - IP-Adressen aus Formularanfragen werden nach 90 Tagen entfernt. +> - Entwürfe und nie veröffentlichte, abgelehnte Pressemitteilungen werden 180 Tage nach der letzten Änderung gelöscht. +> - Beweisarchiv zu entfernten Inhalten und Bildern (Abschnitte 9a, 9b): drei Jahre nach Ende des Jahres der Entfernung, bei laufender Auseinandersetzung bis zu deren Abschluss. +> +> Geänderter Satz am Ende von Abschnitt 13: „Gelöschte Daten können in Sicherungskopien noch bis zu 14 Tage enthalten sein.“ (bisher „bis zu vier Wochen“; gleiche Korrektur im Entwurf 9b: „Sicherungskopien werden innerhalb von 14 Tagen überschrieben“). + +--- + +## 5. Fragen + +| Nr. | Frage | Unser Default | +|---|---|---| +| F1 | Nummerierung je Host: Die Bild-Abschnitte 9a/9b betreffen Uploads im Kundenbereich (Hub) und veröffentlichte Bilder (Portale). Gemeinsamer Abschnitt auf beiden Hosts mit eigener Nummer? | Ja, auf beiden Hosts als eigener Abschnitt hinter „Automatisierte Inhaltsprüfung“ | +| F2 | Reicht für das Fehlerprotokoll (3a) lit. f ohne Einwilligung, auch für die Übermittlung aus dem Browser (§ 25 TDDDG: Laden der Fehlerkomponente erst im Fehlerfall, keine Speicherung auf dem Endgerät)? | Ja | +| F3 | Aktivitätsverlauf mit Klarnamen und Adressen 395 Tage — verhältnismäßig, oder kürzere Frist für Anmeldeereignisse (z. B. 180 Tage)? | 395 Tage einheitlich, gleiche Frist wie Abschnitt 5a | +| F4 | IP-Adresse der letzten Anmeldung im Klartext am Konto, für den Kunden sichtbar — vertretbar unter lit. f/b? | Ja, ohne Historie | +| F5 | Sperrliste unbefristet, abgeholte Rückläufer-Mails im Postfach 90 Tage — tragfähig? Ist für die Sperrliste lit. c (Beachtung des Widerspruchs) neben lit. f zu nennen? | Ja / lit. f genügt | +| F6 | Webanalyse im Kundenbereich mit pseudonymer Nutzer-ID (D7): lit. f ohne Einwilligung möglich, oder Einwilligung nötig? Muss der Satz „Es werden keine Nutzerprofile erstellt“ dann allgemein entfallen? | lit. f, Satz auf die Portale beschränken | +| F7 | Newsletter an Kontoinhaber (D10): Reicht ein Opt-in-Schalter im Konto (Standard aus) mit Bestätigung per E-Mail? Ist Bestandskundenwerbung nach § 7 Abs. 3 UWG für die Altkonten aus den früheren Portalen (rund 60.000) überhaupt in Betracht zu ziehen? | Nur Opt-in, kein Rückgriff auf § 7 Abs. 3 UWG | +| F8 | Turnstile (6a): Text freigeben; zusätzliche Übermittlung der IP-Adresse durch unseren Server ergänzen? | Ja, ergänzen | +| F9 | KI-Vorabprüfung von Bildern (D8): reicht der AVV mit OpenAI und der Absatz, oder ist wegen der Prüfung „Personen erkennbar“ eine weitergehende Prüfung nötig (Art. 9 DSGVO, biometrische Daten)? | AVV und Absatz genügen; es findet keine Identifizierung statt | +| F10 | Art. 50 Abs. 4 KI-VO für automatisch vorformulierte Eigenartikel („Portal-Updates“), die der Betreiber vor Veröffentlichung überarbeitet und freigibt — entfällt die Kennzeichnungspflicht durch die redaktionelle Verantwortung? Gleiche Frage für Kundenmeldungen (A6) | Ja, bei dokumentierter Überarbeitung | +| F11 | Versionierung: Die DSE trägt noch „Version 0.3 vom 03.07.2026“, obwohl 5a und 6a ergänzt wurden. Neue Fassung 0.4 mit Änderungshinweis genügt? | Ja | + +--- + +## 6. Weitere Punkte für dieselbe Sitzung + +- **Paket Bildrechte** (Anlage 1, Abschnitt 7; Interessenabwägung Anlage 2): Agenda A1–A7, AGB 0.7 (§ 8a, § 9), DSE 9a/9b, Bestätigungstext v3, Zustimmungsgate für Bestandskunden; dazu die vier offenen Fragen zu Löschanfragen. +- **Syndikationsvertrag** als Standarddokument (Roadmap 3.5). +- **Boost-Platzierung:** Hinweis zur Kennzeichnung bezahlter Platzierungen (Anlage 4). +- **Refund-Regel** für Buchungen festschreiben (heute Einzelfall über Stripe). + +--- + +## 7. Vor dem Versand vom Betreiber zu klären + +- ~~Anbieter und Standort des Servers für GlitchTip und Umami~~ — Hetzner, Falkenstein (Betreiber, 09.10.2026). +- ~~Rotation der Datensicherungen~~ — **14 Tage** (Betreiber, 09.10.2026). Die DSE sagt bisher „bis zu vier Wochen“ (Abschnitt 13), der Entwurf 9b „innerhalb von vier Wochen überschrieben“ — beides in 0.4 auf 14 Tage (siehe Abschnitt 4, Zeilen für 13). +- **Server-Logs:** stehen auf dem Server derzeit auf 52 Tage, die DSE verspricht in Abschnitt 3 und 13 aber 14 Tage. **Am 09.10.2026 auf 14 Tage umgestellt** (Roadmap 5.13); die DSE-Aussage stimmt wieder. +- Server-Monitoring (Auslastungsdaten des Servers) wird höchstens 14 Tage gespeichert; nach unserem Verständnis ohne Personenbezug, daher kein eigener DSE-Abschnitt. +- Interessenabwägung zum Beweisarchiv als eigenes Dokument beilegen: Entwurf [`interessenabwaegung-beweisarchiv-2026-10.md`](interessenabwaegung-beweisarchiv-2026-10.md), vom Betreiber zu prüfen, zu datieren und abzuzeichnen. +- Screenshots: Bild-Upload-Formular mit Rechtebestätigung, Nachweiszeile unter dem Bild, Sicherheitsseite. +- Umsetzung D9 (IP-Fristen) und die Löschfristen aus D5 vor Inkrafttreten der DSE 0.4 live haben (D5: nächstes Release). + +## Anlagen + +1. Decision-Update Bildrechte und Beweisarchiv vom 22.09.2026 (`dev/bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md`), Abschnitte 3, 4, 7, 8 +2. Interessenabwägung Beweisarchiv (`dev/rechtliches/interessenabwaegung-beweisarchiv-2026-10.md`) +3. Aktuelle DSE (Fassung 0.3 mit 5a und 6a, Hub und Portale) und AGB 0.6 im Wortlaut: [`../../rechtliches/anlage-rechtstexte-live-2026-10-12.md`](../../rechtliches/anlage-rechtstexte-live-2026-10-12.md), Teile A–C, mit Hinweisen zum Abgleich +4. Boost-Platzierung: Note der Preisseite im Wortlaut und Label „Top-Platzierung“ auf Start- und Branchenseite in derselben Anlage, Teil D; Hintergrund in `dev/archive/release/boost-platzierung-offen.md` +5. Screenshots (siehe Abschnitt 7) diff --git a/dev/archive/rechtliches-2026-10/auswertung-und-abschlussentscheidungen-2026-10-12.md b/dev/archive/rechtliches-2026-10/auswertung-und-abschlussentscheidungen-2026-10-12.md new file mode 100644 index 00000000..5b938214 --- /dev/null +++ b/dev/archive/rechtliches-2026-10/auswertung-und-abschlussentscheidungen-2026-10-12.md @@ -0,0 +1,225 @@ +# Rechtliches: Auswertung und Entscheidungen für den Paketabschluss + +**Prüfdatum:** 12.10.2026 + +**Codebasis:** Arbeitsstand auf Commit `8124d20`, vor Beginn ohne lokale Änderungen + +**Status:** Fachliche Entscheidungsvorlage; keine erteilte Rechtsfreigabe und kein Nachweis des produktiven Betriebs + +Geprüfte Ausgangsdokumente: + +- [Anwaltspaket Datenschutz und Rechtstexte](anwaltspaket-datenschutz-2026-10.md), Entwurf vom 09.10.2026. +- [Interessenabwägung Beweisarchiv](interessenabwaegung-beweisarchiv-2026-10.md), Entwurf vom 09.10.2026. + +## 1. Meine Abschlussbewertung + +**Beide Dokumente werden benötigt und sollten erhalten bleiben. Das Paket ist in der vorliegenden Fassung noch nicht abschließbar.** Das Anwaltspaket bündelt die externe Prüfung; die Interessenabwägung dokumentiert intern, warum welche Daten für die Beweisführung aufbewahrt werden. Ein Anwaltspaket in genau dieser Form ist keine gesetzliche Pflicht. Eine nachvollziehbare Begründung der gewählten Verarbeitung ist dagegen wesentlich für die Rechenschaftspflicht. Die Abwägung sollte Interesse, Erforderlichkeit und Gegeninteressen konkret prüfen; genau diese drei Prüfschritte beschreibt auch der [EDSA in seinen Leitlinien 1/2024, Konsultationsfassung](https://www.edpb.europa.eu/system/files/2024-10/edpb_guidelines_202401_legitimateinterest_en.pdf). + +Die technische Grundlage des Archivs ist substanziell: Verschlüsselung, Rechteprüfung, Zweckangabe bei Inhaltsabrufen, Protokollierung, Legal Holds, Löschläufe und Restore-Abgleich sind vorhanden. Der Hauptmangel ist die fehlende Übereinstimmung zwischen tatsächlichem Datenlebenszyklus und den zugesagten Fristen bzw. Schutzmaßnahmen. Einige Aussagen sind auch innerhalb der Dokumente widersprüchlich. + +**Meine Empfehlung:** Den Abschluss auf die bereits verwendeten Verarbeitungen konzentrieren. Nutzerbezogene Hub-Analyse, KI-Bildprüfung und Newsletter-Kampagnen bleiben deaktiviert und erhalten eigene Aktivierungskriterien. Ihre spätere Einführung muss diesen Abschluss nicht verzögern. Die im Anwaltspaket zusätzlich genannten Verträge, Refund-Regeln und bezahlten Platzierungen bekommen eigene Zuständigkeiten; sie dürfen nicht als mitgeprüft oder erledigt gelten. + +Die nachstehenden Entscheidungen sind Empfehlungen. Sie ändern weder Produktivkonfiguration noch freigegebene Rechtstexte. In diesem Auftrag wurde die Auswertung angelegt; die Anwendung und die beiden Ausgangsdokumente wurden nicht geändert. + +## 2. Zusammenfassung der beiden Dokumente + +### 2.1 Anwaltspaket Datenschutz + +**Zweck:** Die DSE von Version 0.3 auf einen belastbaren neuen Stand bringen und die Bildrechteprüfung mit AGB 0.7 koordinieren. Erfasst sind zehn Verarbeitungsbereiche D1–D10 und elf Fragen F1–F11. + +**Gut und beizubehalten:** Die Trennung nach Verarbeitung, die konkreten Textentwürfe, die Benennung der Datenarten und die Unterscheidung zwischen bereits genutzten und geplanten Funktionen. Ein Anwalt erhält dadurch eine prüfbare Arbeitsgrundlage statt einer abstrakten Frageliste. + +**Zu korrigieren:** Unzutreffende Löschzusagen, die absolute Zusage zum Fehlerprotokoll, die Darstellung des API-Schlüssels sowie der Eindruck, ein AVV allein löse die Datenschutzfragen der Bildprüfung. Angaben wie „ab nächstem Release“ müssen durch „im geprüften Code vorhanden; produktiver Einsatz nachzuweisen“ oder einen konkreten Auslieferungsnachweis ersetzt werden. + +**Entscheidung:** Dokument als Versandunterlage behalten, vor Versand anhand dieser Auswertung berichtigen. Die Abschnitte zu deaktivierten Funktionen ausdrücklich als spätere Erweiterung ausweisen. Eine gemeinsame Sitzung ist sinnvoll; ein pauschales „Ja“ zu allen vorgeschlagenen Defaults wäre fachlich nicht ausreichend. + +### 2.2 Interessenabwägung Beweisarchiv + +**Zweck:** Die Speicherung von Originalen, Rechtebestätigungen und entfernten Veröffentlichungen für Nachweis, Rechtsverteidigung und Rückgriff begründen. + +**Gut und beizubehalten:** Klare Zweckbindung, Betrachtung milderer Mittel, nicht öffentliche Aufbewahrung und die Trennung zwischen veröffentlichten und nie veröffentlichten Bildern. Das Archivkonzept sollte grundsätzlich erhalten bleiben. + +**Zu korrigieren:** Die Bewertung „Auswirkungen gering“ ist ohne Differenzierung zu pauschal. Originale können GPS-Daten und weitere bislang nicht veröffentlichte Angaben enthalten. Auch das Fortbestehen eines entfernten Bildes kann für Betroffene erheblich sein. „Das Archiv erweitert die Kenntnis niemandes“ trägt deshalb als generelle Aussage nicht. Darüber hinaus stimmen Aussagen zu Löschvermerken, Zugriffen, Restore-Schutz und Legal Holds nicht vollständig mit dem Code überein. + +**Entscheidung:** Als eigenständigen internen Nachweis fortführen, aber erst nach Korrektur und Umsetzung der beschlossenen Schutzmaßnahmen datieren und abzeichnen. Eine Unterschrift heilt keine Abweichung zwischen Text und Betrieb. Verantwortlicher, Freigabedatum, zuständige Person und nächster Prüftermin müssen eingetragen werden. + +## 3. Abgleich D1–D10 mit dem Code + +„Vorhanden“ bezeichnet hier den geprüften Repository-Stand. Daraus folgt keine Bestätigung der aktiven Produktivkonfiguration oder eines erfolgreichen produktiven Löschlaufs. + +| Bereich | Ergebnis des Codeabgleichs | Empfohlene Entscheidung | +|---|---|---| +| **D1 Bildrechte und Beweisarchiv** | Originale, Bestätigungen, Archiv und Aufbewahrungslogik vorhanden. Pressekontakte sowie Einreichername und -E-Mail sind tatsächlich enthalten. Entscheidende Abweichungen bei Restdaten, Holds und Restore; siehe Abschnitt 4. | Beibehalten, aber Datensatz, Frist und Restdaten vollständig beschreiben. Keine pauschale Freigabe des jetzigen Entwurfs. | +| **D2 GlitchTip** | Eigene Bereinigung, interne Nutzer-ID und verzögertes Laden des Browser-SDK vorhanden. Breadcrumb-Begleitdaten werden im aktuellen Code bereits entfernt. Ein vollständiger Ausschluss personenbezogener Inhalte ist nicht gewährleistet. 90 Tage werden nicht durch diesen Anwendungscode erzwungen. | Text begrenzen, Filter nachschärfen und tatsächliche GlitchTip-/Proxy-Aufbewahrung nachweisen. | +| **D3 Anmeldesicherheit** | Letzte Login-IP wird am Konto überschrieben. Bekannte fehlgeschlagene Anmeldungen werden mit gekürztem HMAC protokolliert, unbekannte als Tageszähler. Login-Limits haben kurze Laufzeiten. | Beschreiben wie implementiert. „Im Arbeitsspeicher“ durch „im kurzlebigen Zwischenspeicher“ ersetzen: Cache-Backend ist konfigurierbar, Standard ist Datenbank. Erfolgreiche Login-Ereignisse enthalten im gezeigten Listener den Anmeldeweg, keinen IP-Hash. | +| **D4 Zustellbarkeit** | Bounce-Datensätze werden nach konfigurierten 395 Tagen bereinigt. IMAP-Mails werden in `Processed`, `Ignored`, `Unparsed` verschoben; eine zeitgesteuerte Bereinigung dieser Ordner ist im geprüften Befehl nicht enthalten. | 90 Tage für Rohmails als umzusetzende Vorgabe beschließen. Sperrliste zweckgebunden erhalten. Die Aussage „keine Mails mehr“ präzisieren: selbst angeforderte Magic Links sind von der Abmeldesperre ausgenommen. | +| **D5 Aktivität/API** | 395 bzw. 90 Tage in Konfiguration und `prunable()` vorhanden, täglicher Scheduler eingetragen. API-Log speichert die **ID des Token-Datensatzes**, keinen geheimen Zugangsschlüssel. | DSE entsprechend berichtigen. Produktiven Rollout und ersten erfolgreichen Löschlauf belegen; nicht länger als fehlende Implementierung behandeln. | +| **D6 Turnstile** | `remoteip` wird serverseitig an Cloudflare übermittelt. Bei Nichterreichbarkeit standardmäßig Annahme mit Markierung; über Konfiguration änderbar. | Zusätzlichen Datenfluss aufnehmen. Einwilligungsfreiheit nicht allein mit „keine Werbecookies“ begründen. | +| **D7 Hub-Analyse** | `UMAMI_PORTAL_ENABLED` und `UMAMI_IDENTIFY_USERS` standardmäßig aus. Bei Aktivierung kann `user-{id}` gesendet werden; Portal-Analyse ist auf `me.*` beschränkt und bei Impersonation ausgenommen. | Für diesen Abschluss ausgeschaltet lassen. Kontobezogene Nutzungsanalyse nur nach eigenständiger Prüfung aktivieren. „Ohne Personenbezug“ nicht allein aus Cookielosigkeit ableiten. | +| **D8 KI-Bildprüfung** | Feature standardmäßig aus. Verkleinertes JPEG, maximal 1024 px, Aufruf der Chat-Completions-API; Prompt untersagt Personenidentifikation. Im Code kein Beleg einer vertraglich eingerichteten Nullspeicherung. | Gesperrt lassen. Anbieterrolle, AVV, Übermittlungsgrundlage, reale Speicherbedingungen und sensible Bildinhalte vor Aktivierung klären. | +| **D9 Vorgangs-IP-Adressen** | Klartextfelder in Kontakt-, Melde-, Widerrufs-, Kündigungs- und Buchungsdaten vorhanden. Kein allgemeiner 90-Tage-Bereinigungslauf dafür gefunden. Kontakt-Spam wird gesondert nach 30 Tagen gelöscht. | Eigene IP-Bereinigung mit klaren Ausnahmen und Nachweistest umsetzen. Buchungsbestätigungen auch im DSE-Text nennen; sie fehlen im vorgeschlagenen Absatz. | +| **D10 Newsletter** | Versand standardmäßig gesperrt. Empfängerauswahl basiert derzeit auf „aktiv und nicht abgemeldet“, nicht auf nachgewiesenem Opt-in. | Sperre beibehalten. Vor Aktivierung Einwilligungsnachweis und Empfängerauswahl ändern; das Einschalten eines Flags genügt nicht. | + +**Codebelege:** + +- D1: [PressReleaseArchiver](../../../app/Services/Archive/PressReleaseArchiver.php), insbesondere `depublicationState()` ab Zeile 113 und `pressReleaseHeader()` ab Zeile 305; [ImageRightsConfirmation](../../../app/Models/ImageRightsConfirmation.php) und [ImageUploader](../../../app/Services/PressRelease/Images/PressReleaseImageUploader.php), `recordConfirmation()` ab Zeile 458. +- D2: [ErrorReportScrubber](../../../app/Support/Monitoring/ErrorReportScrubber.php), [Browser-Fehlererfassung](../../../resources/js/error-reporting.js), [Sentry-Konfiguration](../../../config/sentry.php). +- D3: [RecordAuthActivity](../../../app/Listeners/RecordAuthActivity.php), [LoginCompletion](../../../app/Services/Auth/LoginCompletion.php), [LoginIpThrottle](../../../app/Services/Auth/LoginIpThrottle.php), [FortifyServiceProvider](../../../app/Providers/FortifyServiceProvider.php), [Cache-Konfiguration](../../../config/cache.php). +- D4: [FetchMailBounces](../../../app/Console/Commands/FetchMailBounces.php), [PurgeConversionEvents](../../../app/Console/Commands/PurgeConversionEvents.php), [GateOutgoingMail](../../../app/Listeners/GateOutgoingMail.php), [Bounce-Konfiguration](../../../config/bounces.php). +- D5: [ActivityEvent](../../../app/Models/ActivityEvent.php), [ApiUsageLog](../../../app/Models/ApiUsageLog.php), [LogApiUsage](../../../app/Http/Middleware/LogApiUsage.php), [Monitoring-Konfiguration](../../../config/monitoring.php), [Scheduler](../../../routes/console.php). +- D6: [TurnstileVerifier](../../../app/Services/Spam/TurnstileVerifier.php), `verify()` ab Zeile 59. +- D7: [Umami-Komponente](../../../resources/views/components/web/umami.blade.php), [Services-Konfiguration](../../../config/services.php). +- D8: [Bildkonfiguration](../../../config/images.php), [OpenAiImagePrecheckDriver](../../../app/Services/Image/Precheck/Drivers/OpenAiImagePrecheckDriver.php), [PrecheckImagePreparer](../../../app/Services/Image/Precheck/PrecheckImagePreparer.php). +- D9: [ContactMessage](../../../app/Models/ContactMessage.php), [LegalRequest](../../../app/Models/LegalRequest.php), [WithdrawalRequest](../../../app/Models/WithdrawalRequest.php), [TerminationRequest](../../../app/Models/TerminationRequest.php), [BookingConfirmation](../../../app/Models/BookingConfirmation.php), [Scheduler](../../../routes/console.php). +- D10: [Newsletter-Konfiguration](../../../config/newsletter.php), [CampaignSender](../../../app/Services/Newsletter/CampaignSender.php), [CampaignRecipients](../../../app/Services/Newsletter/CampaignRecipients.php), `query()`-Umfeld ab Zeile 142. + +## 4. Wesentliche Korrekturen vor einem Abschluss + +### K1 — Die 180-Tage-Zusage beschreibt keine vollständige Löschung + +Im Anwaltspaket steht, Entwürfe und nie veröffentlichte abgelehnte Einreichungen würden nach 180 Tagen samt Medien gelöscht. [PurgeExpiredPressReleaseDrafts](../../../app/Console/Commands/PurgeExpiredPressReleaseDrafts.php), insbesondere Zeilen 66–81, löscht die Bilder nie veröffentlichter Meldungen und setzt alte Entwürfe auf `archived`. Die Meldungsdatensätze bleiben bestehen. Abgelehnte Meldungen behalten ihren Status; Legacy-Fälle werden besonders behandelt. Der Lauf erfolgt wöchentlich, nicht exakt am 180. Tag. + +**Meine Entscheidungsempfehlung:** Die falsche Zusage vor Versand berichtigen. Als Ziel echte Löschung nie veröffentlichter Entwürfe einschließlich zugehöriger personenbezogener Daten nach 180 Tagen festlegen. Bei abgelehnten Einreichungen nur einen konkret begründeten minimalen Nachweis separat befristen. Keine unbefristete Volltextaufbewahrung allein unter dem Etikett „Vertragsdokumentation“. Die Umsetzung muss mögliche frühere Veröffentlichungen und belegte Streitfälle schützen. + +Auch „Bearbeitungsstände nach 30 Tagen“ benötigt eine Präzisierung: [PurgeRedactionSnapshots](../../../app/Console/Commands/PurgeRedactionSnapshots.php) lässt Snapshots mit offenem Archivauftrag bestehen. Das ist eine Fehlerbehandlung, die überwacht werden muss, keine garantierte Höchstfrist. Das langfristige Beweisarchiv kann denselben Vorher-Stand unabhängig davon enthalten. + +### K2 — Die 90-Tage-Frist für Vorgangs-IP-Adressen ist noch ein Vorhaben + +D9 erkennt die Lücke bereits richtig. Sie ist im geprüften Code weiterhin offen. Die Spam-Bereinigung von `ContactMessage` ersetzt keine IP-Bereinigung regulärer Anfragen. Der DSE-Absatz darf erst als tatsächliches Verfahren veröffentlicht werden, wenn Bereinigung und Altbestandslauf vorhanden sind. + +**Meine Entscheidungsempfehlung:** 90 Tage als technische Obergrenze für diese IP-Felder beschließen, mit dokumentierter Einzelfallverlängerung bei einem konkreten Vorfall. Der fachliche Vorgang bleibt davon getrennt. Zusätzlich die tatsächliche Umsetzung der bestehenden DSE-Frist für Meldevorgänge prüfen: Ein allgemeiner automatischer Löschlauf für `LegalRequest` war im geprüften Scheduler nicht erkennbar; ein dokumentierter manueller Prozess wurde nicht nachgewiesen. + +### K3 — „Bis zum Abschluss“ widerspricht dem Legal-Hold-Code + +[EvidenceArchive::releaseLegalHold()](../../../app/Services/Archive/EvidenceArchive.php), Zeilen 296–313, setzt bei Aufhebung wieder die volle Archivfrist ab Jahresende. Bei Aufhebung im Oktober 2030 läuft sie bis 31.12.2033. Anwaltspaket und Tabelle der Interessenabwägung sagen dagegen „bis zum Abschluss“; weiter unten nennt die Abwägung selbst einen Neustart. + +**Meine Entscheidungsempfehlung:** Keinen automatischen vollständigen Fristneustart als Standard. Ursprüngliche Frist erhalten; nach Abschluss eines Streitfalls prüfen, ob ein konkret dokumentierter weiterer Nachweiszweck besteht. Falls ja, gesondertes Enddatum und Wiedervorlage; andernfalls Löschung, sobald auch die reguläre Frist abgelaufen ist. Das erfordert eine Codeänderung. + +Die regelmäßige Verjährung beträgt drei Jahre; ihr Beginn hängt aber unter anderem von Anspruchsentstehung und Kenntnis ab, nicht schlicht vom Entfernen eines Bildes. Die gewählte Archivfrist ist daher eine betriebliche Regel, keine vollständige Abbildung aller Verjährungsfälle. [§ 195 BGB](https://www.gesetze-im-internet.de/bgb/__195.html), [§ 199 BGB](https://www.gesetze-im-internet.de/bgb/__199.html). + +### K4 — Löschvermerke und Zugriffsprotokolle behalten Personenbezug + +[EvidenceArchive::tombstone()](../../../app/Services/Archive/EvidenceArchive.php), ab Zeile 665, entfernt den Payload und setzt `deleted_at`. Referenzen auf Akteur, Gegenstand und Rechtsvorgang sowie Hold-Vermerke bleiben in der Archivzeile. Das ist kein vollständig inhaltsloser oder anonymer Restdatensatz. + +Das [Zugriffsprotokoll](../../../app/Models/ArchiveAccessLog.php) enthält zusätzlich Admin-ID, Name, E-Mail und Zweck. Änderungen und Löschungen über das Modell sind gesperrt. Eine Aufbewahrungsgrenze fehlt; der offene Punkt in der Interessenabwägung ist tatsächlich unerledigt. + +**Meine Entscheidungsempfehlung:** Bei Payload-Löschung auch Fallfreitexte, unnötige Personenreferenzen und zugehörige Zugriffsdetails löschen oder irreversibel reduzieren. Für einen konkreten Streit über Archivzugriffe darf ein gesondert begründeter Hold bestehen. Übrig bleiben nur die für Restore-Schutz und Löschbeleg erforderlichen Identifikatoren und Zeitpunkte. Auch diese Restdaten erhalten eine überprüfbare Aufbewahrungsregel, mindestens orientiert daran, wie lange rückspielbare Sicherungen existieren. Abrufe aktiver Originale werden dagegen über den allgemeinen Aktivitätsverlauf protokolliert und fallen unter dessen konfigurierte 395 Tage. Diese Frist ausdrücklich vom bislang unbegrenzten Archivzugriffslog unterscheiden. + +### K5 — Restore-Schutz benötigt einen unabhängigen aktuellen Löschstand + +Der Tombstone-Export liegt auf derselben Archiv-Disk wie die Beweise. Werden Datenbank **und** Archiv-Disk auf einen alten Stand zurückgesetzt, kann der aktuelle Löschstand fehlen. [Das Runbook](../../betrieb/deploy-runbook.md), Zeilen 348–354, nennt ein automatisches externes Exportziel ausdrücklich als noch nicht gebaut. Der Abgleich ist ein gesonderter administrativer Befehl. + +**Meine Entscheidungsempfehlung:** Aktuellen Löschstand unabhängig vom zurückzusetzenden Speicher sichern; zeitliche Lücken zwischen Löschung, Export und externer Sicherung berücksichtigen. Restore-Ablauf verbindlich machen und in isolierter Umgebung für „DB alt“, „Disk alt“ und „beide alt“ üben. Erst dann die unbedingte Zusage veröffentlichen, dass bereits gelöschte Einträge nach einer Wiederherstellung erneut entfernt werden. Der aktuelle Stand ist mehr als eine bloß fehlende Übung. + +### K6 — Zugriffsschutz präzise beschreiben + +Archivierte Inhalte benötigen `compliance:manage`. Originale aktiver Bilder sind auch für berechtigte Redakteure erreichbar; bei bereits entfernten Bildern greift zusätzlicher Compliance-Schutz. Belege: [Admin-Routen](../../../routes/admin.php), Zeilen 47–61 und ab 164; [Evidence-Controller](../../../app/Http/Controllers/Admin/PressReleaseImageEvidenceController.php), ab Zeile 44; [Permission](../../../app/Authorization/Permission.php). + +Inhaltsabrufe und Hold-Änderungen werden protokolliert. Die [Archivlistenansicht](../../../resources/views/livewire/admin/archive/index.blade.php) liest Metadaten ohne gleichartige Zweckabfrage und Zugriffsprotokollierung. Die Aussage „jeder Zugriff“ ist deshalb zu weit. + +**Meine Entscheidungsempfehlung:** Den bestehenden fachlichen Unterschied dokumentieren: „Originaldateien aktiver Bilder: berechtigte Redaktion; archivierte Inhalte: Compliance-Administratoren. Jeder Abruf archivierter Inhalte sowie jede Änderung einer Aufbewahrungssperre wird mit Zweck protokolliert.“ Verschlüsselung des Archivpayloads nicht mit einer Verschlüsselung sämtlicher Datenbankmetadaten gleichsetzen. + +### K7 — Das Fehlerprotokoll wird bereinigt, ist aber nicht garantiert personenfrei + +Der [Serverfilter](../../../app/Support/Monitoring/ErrorReportScrubber.php) ersetzt E-Mail-Muster in Meldungen, entfernt Request-Bodys/Cookies und Breadcrumb-Begleitdaten. Er lässt jedoch beispielsweise freigegebene Query-Werte wie `q` und `utm_*`, Breadcrumb-Nachrichten und andere Freitexte bestehen. `scrubQuery()` übernimmt erlaubte Werte ohne zusätzliche Textbereinigung. Namen und IPs innerhalb beliebiger Fehlertexte werden nicht allgemein erkannt. + +Im [Browser](../../../resources/js/error-reporting.js), `rejectionToError()`, können zudem bis zu 300 Zeichen eines abgelehnten Objekts als Fehlertext serialisiert werden. Die anschließende E-Mail-Ersetzung beseitigt nicht alle denkbaren Formular- oder Geheimniswerte. Das ist ein belegter möglicher Datenweg, kein Nachweis, dass konkrete Produktivdaten bereits abgeflossen sind. + +Eine direkte Browserverbindung zum Fehlerserver macht dessen Betreiber technisch auch die Quell-IP zugänglich. Die Bereinigung des Fehlerereignisses belegt keine IP-Freiheit der Transport- oder Webserverlogs. + +**Meine Entscheidungsempfehlung:** Fehlererfassung auf definierte technische Felder begrenzen, erlaubte Query-Inhalte prüfen und beliebige Objektinhalte nicht als Diagnosemeldung übernehmen. In der DSE zwischen Fehlerdatensatz und Verbindungsdaten unterscheiden. Die Zusage „Namen, IP-Adressen und Formularinhalte werden nicht übermittelt“ in dieser Absolutheit nicht freigeben. 90 Tage für GlitchTip durch die Instanzkonfiguration und deren Bereinigung belegen. + +### K8 — Die KI-Bildprüfung braucht mehr als einen AVV + +Die Größenreduktion und das Entfernen von Metadaten sind sinnvolle Maßnahmen. Erkennbare Personen, Dokumente oder sensible Situationen können trotzdem im Bild selbst enthalten sein. „Keine Identifizierung“ beantwortet daher nicht jede Datenschutzfrage. + +Die [offizielle OpenAI-Dokumentation zu Data Controls](https://developers.openai.com/api/docs/guides/your-data) nennt für Chat Completions regulär 30 Tage Abuse-Monitoring-Aufbewahrung. Abweichende Kontrollen sind gesondert einzurichten; für bestimmte Bildinhalte bestehen Ausnahmen auch unter strengeren Einstellungen. Daraus folgt für dieses Paket: „Keine Speicherung beim Anbieter“ ist ohne belegte kontospezifische Bedingungen nicht tragfähig. Trainingsnutzung und Speicherung sind unterschiedliche Fragen. + +**Meine Entscheidungsempfehlung:** D8 aus dem aktuellen Aktivierungsumfang herausnehmen. Vor späterer Freigabe tatsächlichen Vertragspartner, AVV, Transfermechanismus, Speicherbedingungen und den Umgang mit sensiblen Motiven festlegen. Eine zusätzliche Datenschutz-Folgenabschätzung nicht pauschal behaupten, sondern deren Erforderlichkeit anhand der konkreten Verarbeitung prüfen lassen. + +## 5. Meine Entscheidungen zu F1–F11 + +| Frage | Empfehlung | Begründung / Bedingung | +|---|---|---| +| **F1 Nummerierung** | Gemeinsame Themenstruktur auf allen Hosts; Hub-spezifische Inhalte kenntlich machen. | Bildrechte und Archiv auf allen betroffenen Hosts beschreiben. Überschriften und stabile Anker statt widersprüchlicher interner Verweise verwenden. | +| **F2 Fehlerprotokoll ohne Einwilligung** | Für technisch erforderliche Fehlerdiagnose vertretbare Prüfposition, aber kein pauschales Ja. | Datenumfang nach K7 korrigieren. Browserzugriffe gesondert prüfen; Cookielosigkeit entscheidet die Frage nicht allein. | +| **F3 Aktivitätsverlauf 395 Tage** | Den einheitlichen Default nicht ungeprüft übernehmen. Vorschlag: gewöhnliche Login-/Fehlversuchsereignisse 90 Tage, übrige Support-/Geschäftsereignisse höchstens 395 Tage mit Zweckbegründung. | Sicherheitsvorfälle gezielt länger halten. Dieselbe Frist wie Nutzungsstatistik ist allein keine Begründung. Dies ist eine vorgeschlagene Änderung, nicht der aktuelle Code. | +| **F4 Letzte Login-IP** | Beibehalten, wenn die Anzeige einen konkreten Sicherheitsnutzen hat; zusätzlich Löschung nach z. B. 90 Tagen ohne neue Anmeldung vorsehen. | Überschreiben begrenzt die Anzahl, aber nicht die Dauer bei inaktiven Konten. Kürzung auf eine hinreichende Anzeigepräzision prüfen. | +| **F5 Sperrliste/Rohmails** | Sperrliste zweckgebunden erhalten; Rohmails nach 90 Tagen löschen. | Nur notwendige Sperrdaten behalten, Entsperrung und periodische Prüfung regeln. In D4 steht einmal zusätzlich lit. c, F5 sagt lit. f genüge: anwaltlich eine konsistente Grundlage je Sperrgrund festlegen, eine gesetzliche Pflicht gegebenenfalls konkret benennen. | +| **F6 Hub-Analyse mit Nutzer-ID** | Für diesen Abschluss auslassen und ausgeschaltet halten. | `user-123` bleibt dem Konto zuordenbar. Nutzen zuerst mit aggregierter Analyse prüfen; eine Änderung des DSE-Satzes allein schafft keine tragfähige Grundlage. | +| **F7 Newsletter** | Nur nachgewiesenes Opt-in, keine pauschale Nutzung der Altkonten. | Bestätigung, Wortlaut/Fassung, Zeitpunkt, Quelle und Widerruf dokumentieren. Empfängerauswahl muss Einwilligung voraussetzen. Die Voraussetzungen der Bestandskundenausnahme sind gesondert, nicht durch ein vorhandenes Konto erfüllt. | +| **F8 Turnstile** | Den zusätzlichen serverseitigen IP-Datenfluss aufnehmen. | Anbieterrolle, Drittlandübermittlung und tatsächliche Endgerätezugriffe im Einsatz prüfen. Technischen Ausfallpfad sachlich beschreiben. | +| **F9 KI-Bildprüfung** | Default „AVV und Absatz genügen“ ablehnen. | Voraussetzungen nach K8, danach separate Freigabe. | +| **F10 KI-Textkennzeichnung** | Redaktionelle Ausnahme für eigene Texte nur bei tatsächlich belegter menschlicher Prüfung und übernommener redaktioneller Verantwortung verwenden. | Kein automatischer Übertrag auf sämtliche Kundenmeldungen, keine generelle Ausnahme für KI-Bilder oder Deepfakes. Freigabeprozess und Verantwortlichen dokumentieren. | +| **F11 DSE-Version** | Neue Fassung mit Datum und nachvollziehbarem Änderungshinweis veröffentlichen. | Vorher alle Hostvarianten und Fristen abgleichen. DSE-Information von der Einbeziehung neuer AGB/Richtlinien unterscheiden; die DSE benötigt nicht pauschal eine Zustimmung. | + +Für F2/F6/F8 ist [§ 25 TDDDG](https://www.gesetze-im-internet.de/ttdsg/__25.html) maßgeblich: Er betrifft nicht nur Cookies, sondern auch bestimmte Zugriffe auf Informationen im Endgerät; die Ausnahme hängt insbesondere an der unbedingten Erforderlichkeit für den gewünschten Dienst. Für F7 siehe [§ 7 UWG](https://www.gesetze-im-internet.de/uwg_2004/__7.html). Für die begrenzte redaktionelle Ausnahme in F10 siehe [Art. 50 Abs. 4 KI-VO](https://eur-lex.europa.eu/eli/reg/2024/1689/oj/deu). + +## 6. Entscheidungen zur Interessenabwägung + +**Originale und veröffentlichte Fassungen grundsätzlich behalten.** Der Beweiswert einer Originaldatei ist nachvollziehbar; eine Prüfsumme ersetzt die Datei nicht. Die pauschale Speicherung aller Metadaten bleibt aber eine zu begründende Abwägungsentscheidung. Für GPS-Daten, Geräteseriennummern und sensible Motive mildere Mittel konkret prüfen. Metadatenentfernung verändert zugleich die Beweisdatei; deshalb ist eine bloße technische Kürzung ohne abgestimmtes Nachweiskonzept keine ausreichende Lösung. + +**Kontaktdaten nur im nachweislich relevanten Umfang aufnehmen.** Die damals tatsächlich veröffentlichte Kontaktzeile kann zum Nachweis erforderlich sein. Daraus folgt nicht automatisch die Erforderlichkeit beliebiger zusätzlicher Kontodaten. Pressekontakt und Einreicher getrennt begründen und nicht lediglich „den DSE-Text verlängern“. + +**Drei Jahre nach Jahresende als zu prüfende Standardregel behalten.** Ereignistypen differenzieren: Entfernung eines veröffentlichten Bildes, vollständige Depublikation, kleine Korrektur und Kennzeichnungsänderung haben nicht automatisch denselben Beweisbedarf. Für nie veröffentlichte Inhalte bleibt das Beweisarchiv grundsätzlich ausgeschlossen. Für konkrete Rechtsstreitigkeiten gilt ein dokumentierter Hold mit regelmäßiger Wiedervorlage; kein unbegründeter Neustart nach dessen Ende. + +**Löschanträge nicht pauschal wegen laufender Frist ablehnen.** Art. 17 Abs. 3 lit. e DSGVO ist eine Ausnahme vom Löschanspruch, soweit die weitere Speicherung für Rechtsansprüche erforderlich ist; die Frist allein ersetzt diese Prüfung nicht. Die eigentliche Verarbeitungsgrundlage bleibt separat zu begründen. Lösch- und Widerspruchsfälle benötigen eine dokumentierte Einzelentscheidung. [DSGVO, insbesondere Art. 17–21](https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?from=EN&qid=1672161133881&uri=CELEX%3A32016R0679). + +**Sensible Inhalte gesondert behandeln.** Keine Identifizierung bedeutet nicht, dass ein Bild niemals Gesundheitsdaten oder andere besondere Kategorien enthält. Erforderlichkeit und einschlägige Ausnahme müssen für solche Fälle gesondert geklärt werden. Rechtsverteidigung kann relevant sein, ist aber keine pauschale Freigabe für jede Bildspeicherung. [DSGVO, Art. 9](https://eur-lex.europa.eu/legal-content/DE/TXT/PDF/?from=EN&qid=1672161133881&uri=CELEX%3A32016R0679). + +**Risiken und Gegenmaßnahmen ehrlich bewerten.** Statt „Auswirkungen gering“: Risiken fortbestehender sensibler Bilder, unerwarteter Archivierung, Metadaten und missbräuchlicher interner Zugriffe benennen. Dagegen die konkret umgesetzten Berechtigungen, Verschlüsselung, Zweckbindung, Fristen und Kontrollen stellen. Betroffeneninformation für nicht selbst hochladende Kontakte bzw. Abgebildete und Umgang mit Auskunft/Einschränkung in der Freigabe klären. + +**Backups nicht als erledigt behandeln.** Die 14 Tage sind im Ausgangspaket eine Betreiberangabe, kein in dieser Prüfung verifizierter Betriebsnachweis. Die [Roadmap, Punkt 1.5](../../roadmap.md) nennt zusätzlich noch zu löschende alte Backups. Vor einer allgemeinen 14-Tage-Zusage müssen Umfang und Inhalt dieser Sonderkopien geprüft und gegebenenfalls bereinigt sein. Einmalige Deploy- oder Migrationssicherungen können die reguläre Rotation unterlaufen. + +## 7. Welche Fragen beim Anwalt verbleiben + +Die Agenda A1–A7 aus dem [Decision-Update Bildrechte](../../bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md) sollte erhalten bleiben, mit präzisierten Aufträgen: + +| Agenda | Konkreter Prüfauftrag | +|---|---| +| **A1 AGB-Konsistenz** | § 8a und § 9 einschließlich Rechteeinräumung, Bearbeitung, Social-Media-Ausgabe und Rückgriff im Zusammenspiel freigeben. Code kann die Wirksamkeit nicht beweisen. | +| **A2 Rolle des Portals** | Tatsächliche Moderation, eigene Beiträge, Kennzeichnung und Leistungsversprechen bei der Einordnung berücksichtigen; Hoster-Status nicht allein aus dem Wording ableiten. | +| **A3 Vertretung/Bestätigung** | Kontoinhaber, Agentur, API-Akteur und Admin-Upload sauber zuordnen; Umfang des rechtlich belastbaren Rückgriffs prüfen. | +| **A4 Archiv** | Originale/Metadaten, Kontaktdaten, Ereignistypen, Standardfrist, Hold-Ende, Restdaten und sensible Inhalte ausdrücklich beurteilen. Die korrigierte Interessenabwägung vorlegen. | +| **A5 Einbeziehung** | Neue AGB/Richtlinien bei Bestandskunden und konkreten Einreichungen rechtlich tragfähig einbeziehen; Bestätigungsfassung und technisches Gate zusammen freigeben. | +| **A6 KI-Kennzeichnung** | Textausnahme nach F10 von Bildkennzeichnung trennen; Verantwortlichkeit für portalgesetzte Angaben und Korrekturverfahren prüfen. | +| **A7 Gesamtpaket** | Nach Beantwortung der Einzelpunkte schriftlich festhalten, welche Texte freigegeben sind, welche Betriebsbedingungen gelten und welche Restrisiken akzeptiert werden. | + +Syndikationsvertrag, Kennzeichnung bezahlter Boost-Platzierungen und Refund-Regel sind durch diesen Codeabgleich nicht abschließend bewertet. Sie können separat offen bleiben, sofern sie ausdrücklich aus dem Umfang dieses Datenschutz-/Archivabschlusses herausgenommen und weiterverfolgt werden. Die vier im Anwaltspaket referenzierten Löschanfragen sind weiterhin als eigene Prüfanlage beizufügen. + +## 8. Konkrete Abschlusskriterien + +| Priorität | Aufgabe | Verantwortlich | Erledigt, wenn … | +|---|---|---|---| +| **Vor Versand** | Sachverhalt berichtigen | Betreiber + Entwicklung | K1–K8 eingearbeitet; Ist, Ziel und deaktivierte Funktionen eindeutig getrennt; kein unzutreffendes Lösch- oder Speicherungsversprechen. | +| **Vor Freigabe** | Aufbewahrungsmatrix beschließen | Betreiber + Anwalt | Für Original, Bestätigung, Payload, Archivmetadaten, Zugriffslog, Rohmail, Vorgang und dessen IP sind Zweck, Fristbeginn, Dauer, Ausnahme und Löschverantwortlicher festgelegt. | +| **Vor Abschluss** | Löschlücken schließen | Entwicklung | D9, nie veröffentlichte Textdatensätze, Rohmails sowie Archivrestdaten haben die beschlossene Bereinigung; Altbestand berücksichtigt; gezielte Tests grün. | +| **Vor Abschluss** | Hold-Verhalten angleichen | Entwicklung + Anwalt | Dokument und Code setzen dieselbe Regel um; Abschluss eines Streitfalls erzeugt keine unbegründete neue Vollfrist. | +| **Vor Abschluss** | Fehlerberichte minimieren | Entwicklung + Betrieb | Gegenbeispiele mit personenbezogenen Query-Werten und Fehlerobjekten geprüft; übermittelte Felder sowie getrennte Transportlogs dokumentiert. | +| **Vor Abschluss** | Betriebsnachweise sichern | Betrieb | D5-Löschläufe, GlitchTip-Frist, IMAP-Bereinigung und Backuprotation belegt; Sonderbackups geprüft. | +| **Vor Abschluss** | Restore nachweisen | Betrieb + Entwicklung | Unabhängiger aktueller Löschstand verfügbar; alle drei Restore-Szenarien erfolgreich geübt und protokolliert; Schlüsselwiederherstellung und Hold-Stand geprüft. | +| **Vor Veröffentlichung** | Rechtstexte freigeben | Anwalt + Betreiber | DSE, Bildrechtsklauseln, Bestätigungstext und Einbeziehung abgestimmt; Interessenabwägung korrigiert, datiert und abgezeichnet. | +| **Zum Release** | Versionen und Gate ausrollen | Entwicklung + Betreiber | DSE auf allen Hosts konsistent; AGB/Richtlinien mit passenden Bestätigungsfassungen; Gate erst mit freigegebenen Fassungen aktiv. | +| **Separat** | D7/D8/D10 aktivieren | Produkt + Anwalt + Entwicklung | Eigene Voraussetzungen erfüllt; bis dahin Flags nachweislich aus. Keine Voraussetzung für den jetzigen Abschluss. | + +**Freigaberegel:** Das Paket erhält erst dann den Status „abgeschlossen“, wenn alle einschlägigen Zeilen vor Abschluss/Veröffentlichung/Release nachweislich erledigt sind. Bis dahin lautet der sachgerechte Status „Codeabgleich abgeschlossen, rechtliche und betriebliche Freigabe offen“. Ein korrigiertes Anwaltspaket kann zuvor als ehrlicher Ist-/Zielstand zur Prüfung versandt werden. + +## 9. Prüfverfahren und Grenzen + +Geprüft wurden die beiden Dokumente, die referenzierte Bildrechteagenda, die aktuelle DSE-View, zentrale Archiv-, Bild-, Monitoring-, Login-, Mail- und Newsletterpfade, deren Konfigurationen, der Scheduler sowie einschlägige vorhandene Tests. Laravel-12-Dokumentation zu Verschlüsselung, Autorisierung und Scheduling wurde über Laravel Boost abgefragt. Gesetzes- und Anbieterquellen wurden am 12.10.2026 abgerufen; Empfehlungen sind von bestätigten Codebefunden getrennt. + +Produktive Datenbestände, Hostingverträge, AVV, aktive Remote-Konfigurationen, Cron-Erfolge, Server-/Proxylogs und Backupbestände wurden nicht inspiziert. Die im Anwaltspaket genannten Produktivtermine wurden nicht unabhängig bestätigt. Konfigurationsdefaults sind keine Aussage über aktive Produktionsflags. Die AGB-Fassung kann aus `legal_documents` stammen; der Fallback `0.6` in `config/legal.php` beweist die produktive Fassung nicht. + +Folgender gezielter Testlauf wurde direkt im DEV-Container ausgeführt: + +```bash +php artisan test --compact tests/Feature/Archive/EvidenceArchiveTest.php tests/Feature/Archive/EvidenceArchiveFollowUpTest.php tests/Feature/Monitoring/LogRetentionTest.php tests/Feature/Monitoring/ErrorReportingTest.php tests/Feature/Monitoring/BrowserErrorReportingTest.php tests/Feature/Images/ImageLifecycleTest.php +``` + +**Ergebnis:** 82 Tests bestanden, 559 Assertions, Laufzeit 21,77 Sekunden. Geprüft wurden die vorhandenen Tests zu Beweisarchiv, Archiv-Nacharbeiten, Protokollfristen, Server- und Browserfehlerberichten sowie Bildlebenszyklus. Der zunächst verwendete Sail-Aufruf scheiterte an der im DEV-Container nicht verfügbaren Docker-/Podman-Anbindung; nach Klarstellung des Betreibers erfolgte der erfolgreiche direkte PHP-Aufruf. + +Die bestandenen Tests bestätigen die von ihnen abgedeckten Implementierungsfälle. Sie widerlegen nicht die festgestellten Abweichungen zwischen Dokumenten und Code und ersetzen weder produktive Konfigurationsnachweise noch eine betriebliche Restore-Übung. Für die reine Auswertungsdatei wurden keine neuen Anwendungstests angelegt. + +Die lokalen Markdown-Dateiverweise wurden auf vorhandene Ziele geprüft; die neue Datei wurde auf Whitespace-Fehler geprüft. + +Diese Auswertung ist eine technische und fachliche Entscheidungsvorlage. Die verbindliche rechtliche Bewertung der Abwägung und Vertragsklauseln bleibt Teil der ausdrücklich vorgesehenen anwaltlichen Freigabe. diff --git a/dev/archive/rechtliches-2026-10/interessenabwaegung-beweisarchiv-2026-10.md b/dev/archive/rechtliches-2026-10/interessenabwaegung-beweisarchiv-2026-10.md new file mode 100644 index 00000000..4d5fc7c4 --- /dev/null +++ b/dev/archive/rechtliches-2026-10/interessenabwaegung-beweisarchiv-2026-10.md @@ -0,0 +1,90 @@ +# Interessenabwägung nach Art. 6 Abs. 1 lit. f DSGVO + +## Bild-Originale, Rechtebestätigung und Beweisarchiv + +**Verantwortlicher:** [Name/Firma und Anschrift wie in Abschnitt 1 der Datenschutzerklärung] +**Angebot:** pressekonto.com, presseecho.de, businessportal24.com +**Fassung:** Entwurf vom 09.10.2026 · **in Kraft gesetzt am:** [Datum] · **nächste Überprüfung:** [Datum, spätestens 12 Monate] + +Dieses Dokument hält die Abwägung fest, auf die sich die Abschnitte 9a und 9b der Datenschutzerklärung stützen („Eine dokumentierte Abwägung liegt vor“). Es dient dem Nachweis nach Art. 5 Abs. 2 DSGVO und wird auf Anfrage der Aufsichtsbehörde vorgelegt. Grundlage ist die Kurzfassung im Decision-Update Bildrechte vom 22.09.2026 (Abschnitt 4.4), abgeglichen mit dem technischen Stand vom 09.10.2026. + +--- + +## 1. Gegenstand der Verarbeitung + +| Teil | Was | Wann | Wie lange | +|---|---|---|---| +| A | Hochgeladene **Originaldatei** eines Bildes mit ihren Metadaten (z. B. Kameradaten, Urheberangaben, Herkunftsdaten), die **veröffentlichte Fassung** mit Bildnachweis und KI-Kennzeichnung, das Ergebnis der automatischen **Herkunftsauswertung** | bei jedem veröffentlichten Bild einer Pressemitteilung | solange die Mitteilung mit dem Bild veröffentlicht ist | +| A | **Rechtebestätigung** des Hochladenden: Zeitpunkt, bestätigter Wortlaut und AGB-Fassung, Konto bzw. API-Zugang, Firma, Übermittlungsweg, Prüfsumme der Datei, Angaben zu Bildnachweis und KI, ein mit geheimem Schlüssel gebildeter Prüfwert der IP-Adresse (HMAC), Browserkennung (auf 250 Zeichen gekürzt) | bei jedem Bild-Upload | wie oben | +| B | **Beweisarchiv:** zuletzt veröffentlichter Stand der Mitteilung einschließlich der darin genannten Pressekontakte (Name, E-Mail, Telefon), Angaben zum Einreicher (Konto, Name, E-Mail, Firma), die Daten aus Teil A zu den Bildern, Zeitpunkte von Veröffentlichung und Entfernung, Grund als Kategorie, bei Änderungen der vorherige und der neue Stand, bei Meldeverfahren die E-Mail-Adresse des Antragstellers | wenn eine Mitteilung oder ein Bild aus dem öffentlichen Angebot entfernt, ersetzt oder geändert wird | drei Jahre nach Ende des Jahres der Entfernung; bei laufender Auseinandersetzung bis zu deren Abschluss | +| B | **Zugriffsprotokoll** zum Archiv: Administrator, Aktion, angegebener Zweck, Zeitpunkt | bei jedem Zugriff | [Frist festlegen — bisher unbefristet] | + +**Nicht erfasst:** Bilder, die hochgeladen, aber nie veröffentlicht werden (sofortige Löschung mit Löschung oder Ersetzung), Entwürfe ohne Veröffentlichung, Nutzungs- oder Verhaltensdaten. + +**Betroffene Personen:** Kontoinhaber und ihre Mitarbeiter (Einreicher), in Mitteilungen genannte Pressekontakte, auf Bildern abgebildete Personen, Urheber und Rechteinhaber, Antragsteller im Melde- und Löschverfahren. + +--- + +## 2. Berechtigtes Interesse + +1. **Nachweis gegenüber Rechteinhabern:** Macht ein Urheber oder Lizenzgeber Ansprüche wegen eines veröffentlichten Bildes geltend (§§ 97 ff. UrhG), muss belegbar sein, welche Datei mit welchen Angaben eingereicht wurde und was der Kunde dazu bestätigt hat. +2. **Nachweis gegenüber abgebildeten Personen** (§§ 22, 23 KUG) und Betroffenen, auch bei Schadensersatzforderungen nach Art. 82 DSGVO. +3. **Rückgriff gegen den Kunden**, der die Rechte zugesichert hat (AGB § 8 Abs. 2, künftig § 8a). +4. **Nachweis gegenüber Behörden und Gerichten**, insbesondere zu Melde- und Abhilfeverfahren nach dem Digital Services Act und zur KI-Kennzeichnung (Art. 50 KI-VO). +5. **Nachvollziehbarkeit der eigenen KI-Kennzeichnung**, die das Portal aus den Herkunftsdaten setzt. + +Diese Interessen sind rechtlich anerkannt (Rechtsdurchsetzung und -verteidigung) und konkret: Bildrechte-Abmahnungen sind bei Presseportalen ein typisches Risiko, und nach einer Entfernung auf Antrag liegt der Inhalt sonst nirgends mehr vor. + +--- + +## 3. Erforderlichkeit + +| Datum | Warum erforderlich | Geprüfte mildere Mittel | +|---|---|---| +| Originaldatei mit Metadaten | Nur das Original zeigt, welche Urheber- und Herkunftsangaben der Kunde mitgeliefert hat; die öffentlichen Varianten sind verkleinert und ohne Metadaten | Nur Prüfsumme und Metadatenauszug speichern: belegt die Identität einer vorgelegten Datei, aber nicht deren Inhalt, wenn der Anspruchsteller ein abweichendes Bild vorlegt. **Rückfallebene**, falls die Abwägung anders ausfällt: Originale ohne Herkunftsdaten auf Prüfsumme und Auszug reduzieren (Decision-Update Abschnitt 8) | +| Rechtebestätigung mit Wortlaut, Fassung, Konto, Zeitpunkt | Belegt, wer was wann zugesichert hat — Grundlage des Rückgriffs | keines; ohne diese Angaben ist die Bestätigung nicht nachweisbar | +| IP-Prüfwert und Browserkennung | Zusätzlicher Beleg, dass die Bestätigung aus der Sitzung des Kontos stammt (z. B. bei bestrittener Abgabe durch einen Mitarbeiter) | IP im Klartext — verworfen; nur HMAC mit geheimem Schlüssel. Browserkennung: weitere Kürzung möglich (Frage an den Anwalt) | +| Archiv: letzter veröffentlichter Stand mit Pressekontakten | Belegt, was öffentlich war, auch nach Löschung auf Antrag | Nur Text ohne Kontaktangaben — verworfen, weil die Kontaktangaben Teil der beanstandeten Veröffentlichung sein können | +| Archiv: bei Änderungen alter und neuer Stand | Belegt Umfang und Zeitpunkt einer Korrektur | nur der neue Stand — verworfen, die Korrektur wäre nicht belegbar | +| Frist drei Jahre nach Jahresende | Entspricht der regelmäßigen Verjährung (§§ 195, 199 BGB) für Ansprüche aus Urheber-, Persönlichkeits- und Vertragsrecht | kürzere Frist: Ansprüche könnten nach Löschung des Nachweises noch geltend gemacht werden | + +--- + +## 4. Abwägung mit den Interessen der Betroffenen + +**Art der Daten:** überwiegend Daten, die zuvor öffentlich waren (Mitteilung, Bild, Pressekontakt) oder geschäftlich vom Kunden selbst angegeben wurden. Keine besonderen Kategorien nach Art. 9 DSGVO, sofern ein Bild nicht ausnahmsweise solche erkennen lässt. Original-Metadaten können Standortdaten und Geräteseriennummern enthalten; sie werden nicht veröffentlicht. + +**Vernünftige Erwartungen:** Der Hochladende gibt die Bestätigung ausdrücklich und wird dabei auf AGB und Datenschutzerklärung hingewiesen. Bei einem Presseportal ist erwartbar, dass Veröffentlichungen und Zusicherungen zu Bildrechten dokumentiert werden. Pressekontakte und abgebildete Personen rechnen nicht mit einer Archivierung nach der Entfernung; die Archivierung ist aber nicht öffentlich und dient allein der Rechtsverteidigung. + +**Auswirkungen auf die Betroffenen:** gering. Das Archiv erweitert die Kenntnis niemandes; es ist nicht öffentlich, wird für keinen anderen Zweck verwendet und nicht ausgewertet. Für Antragsteller einer Löschung bleibt der öffentliche Zustand entfernt. + +**Schutzmaßnahmen:** + +- Archiv verschlüsselt (AES-256) mit eigenem Schlüssel, getrennt vom Anwendungsschlüssel, außerhalb des öffentlich erreichbaren Speichers +- Zugriff nur für Administratoren, nur mit Angabe eines Zwecks, jeder Zugriff protokolliert +- Originaldateien nie öffentlich; öffentliche Bildfassungen ohne Standort-, Geräte- und technische Metadaten +- IP-Adresse nur als HMAC +- automatische Löschung nach Fristablauf mit inhaltslosem Löschvermerk; nach einer Wiederherstellung aus der Sicherung werden bereits gelöschte Einträge erneut entfernt; Sicherungen werden nach 14 Tagen überschrieben +- Datensparsamkeit: nie veröffentlichte Bilder und Entwürfe werden nicht archiviert +- Verlängerung über die Frist hinaus nur bei dokumentierter rechtlicher Auseinandersetzung (Legal Hold), danach neue Frist ab Abschluss + +**Betroffenenrechte:** Auskunft wird erteilt. Löschanträge zu Archiveinträgen werden unter Berufung auf Art. 17 Abs. 3 lit. e DSGVO abgelehnt, solange die Frist läuft; der öffentliche Inhalt wird entfernt. Bei einem Widerspruch nach Art. 21 DSGVO wird im Einzelfall geprüft, ob zwingende schutzwürdige Gründe (Rechtsverteidigung) überwiegen; das Ergebnis wird am Vorgang vermerkt. + +--- + +## 5. Ergebnis + +Die Interessen des Verantwortlichen an Nachweis, Rechtsverteidigung und Rückgriff überwiegen. Die Daten sind auf das für diese Zwecke Erforderliche beschränkt, überwiegend zuvor öffentlich, nicht öffentlich zugänglich, verschlüsselt und zugriffsprotokolliert gespeichert und werden nach einer an der Verjährung ausgerichteten Frist automatisch gelöscht. Die Verarbeitung stützt sich auf Art. 6 Abs. 1 lit. f DSGVO; für die Aufbewahrung trotz Löschantrag auf Art. 17 Abs. 3 lit. e DSGVO. + +--- + +## 6. Offene Punkte und Überprüfung + +- [ ] Frist für das Zugriffsprotokoll des Archivs festlegen (Vorschlag: wie der Archiveintrag, Löschung mit dessen Löschvermerk). +- [ ] Restore-Übung durchführen (Roadmap 5.1): Die Zusage „nach einer Wiederherstellung werden gelöschte Einträge erneut entfernt“ ist technisch umgesetzt, aber noch nicht in einer Übung nachgewiesen. +- [ ] Anwaltliche Prüfung (Agenda A4: pauschale Drei-Jahres-Frist für alle Ereignistypen, Speicherung des Originals). +- Überprüfung dieses Dokuments: nach der Anwaltsantwort, bei Einführung der C2PA-Prüfung (Block I), bei Bildern im Newsroom (Block J) und spätestens nach 12 Monaten. + +--- + +**Abgezeichnet:** [Name], [Funktion], [Ort, Datum] diff --git a/dev/archive/rechtliches-2026-10/todo-umsetzungsreife-und-abschluss-2026-10.md b/dev/archive/rechtliches-2026-10/todo-umsetzungsreife-und-abschluss-2026-10.md new file mode 100644 index 00000000..5a71cbda --- /dev/null +++ b/dev/archive/rechtliches-2026-10/todo-umsetzungsreife-und-abschluss-2026-10.md @@ -0,0 +1,181 @@ +# To-do-Liste: Rechtspaket umsetzungsreif machen und abschließen + +> **Fortgeschriebener Arbeitsstand:** Die eingetragenen Betreiberentscheidungen bleiben erhalten. Die [Korrekturen mit Aufbewahrungsmatrix und Umsetzungsauftrag](../../rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md) konkretisieren die Vorbereitung und führen neue Aufgaben unter RP-01 bis RP-12. Die U-Kennungen unten sind historische Verweise; sie dürfen nicht mit den anders belegten U-Kennungen im Klärungsdokument vermischt werden. + +**Stand:** 12.10.2026 + +**Grundlage:** [Auswertung mit Codeabgleich und Entscheidungen](auswertung-und-abschlussentscheidungen-2026-10-12.md). + +**Ziel:** Erst die fachlichen Vorgaben so weit klären, dass die Entwicklung ohne offene Grundsatzentscheidungen arbeiten kann. Danach umsetzen, prüfen und das Paket freigeben. + +**Aktueller Stand:** Codeabgleich vorhanden; 82 bestehende Tests mit 559 Assertions bestanden. Die nachstehenden Entscheidungen, Umsetzungen und Betriebsnachweise sind damit noch nicht erledigt. Vorgeschlagene Fristen sind Arbeitsvorschläge aus der Auswertung, keine bereits erteilten Freigaben. + +## 1. Deine nächsten Aufgaben als Betreiber + +Diese fünf Punkte benötigen deinen Beitrag. Aufbereitung, Dokumentkorrekturen, technische Spezifikation und spätere Implementierung können wir übernehmen. + +### B1 — Umfang festlegen + +- [ ] Festhalten, dass dieses Paket die bereits genutzten Datenschutzverarbeitungen und das Bildrechte-/Beweisarchiv einschließlich DSE, Bildrechtsklauseln, Bestätigungstext und Zustimmungsgate umfasst. +JA +- [ ] Entscheiden, ob die Empfehlung übernommen wird: Hub-Analyse mit Nutzerkennung, KI-Bildprüfung und Newsletter-Kampagnen bleiben ausgeschaltet und werden separat behandelt. +JA +- [ ] Syndikationsvertrag, Refund-Regel und bezahlte Platzierungen eigenen Arbeitspaketen mit Verantwortlichen zuordnen, soweit sie nicht in diesem Paket abgeschlossen werden sollen. +JA + +**Ergebnis:** Ein schriftlich festgelegter Umfang. Für bereits aktive Funktionen lässt sich eine notwendige Klärung nicht durch bloßes Verschieben aus dem Paket erledigen. Deshalb müssen die tatsächlichen Aktivierungsstände unter B3 geprüft werden. + +### B2 — Gewünschte Aufbewahrungsregeln auswählen + +Die folgende Tabelle ist die Entscheidungsvorlage. Du legst die geschäftliche Zielrichtung fest; der Anwalt prüft die rechtliche Tragfähigkeit. Wir übersetzen das Ergebnis anschließend in konkrete Löschregeln. + +| Entscheidung | Meine vorgeschlagene Zielrichtung | Was abschließend feststehen muss | +|---|---|---| +| **E1 Nie veröffentlichte Entwürfe** | Nach 180 Tagen ohne Bearbeitung vollständig löschen. | Fristbeginn, Umgang mit verknüpften Datensätzen und Ausnahmen für belegte Streitfälle. | +| **E2 Abgelehnte, nie veröffentlichte Einreichungen** | Medien nach 180 Tagen entfernen; Volltext nicht unbefristet behalten. Allenfalls minimalen Ablehnungs-/Vertragsnachweis befristet erhalten. | Welche Nachweisfelder erforderlich sind und wie lange sie bleiben. Diese Frist ist noch offen und muss vor der Umsetzung festgelegt werden. | +| **E3 IP-Adressen** | Vorgangs-IP-Adressen nach 90 Tagen entfernen; letzte Login-IP nach 90 Tagen ohne neue Anmeldung entfernen. | Betroffene Felder, Fristbeginn und Verfahren bei einem konkreten Sicherheitsvorfall. Der Vorgang selbst bekommt eine eigene Frist. | +| **E4 Aktivitätsverlauf** | Gewöhnliche Anmelde- und Fehlversuchsereignisse 90 Tage; übrige notwendige Support-/Geschäftsereignisse höchstens 395 Tage. API-Zugriffe 90 Tage. | Zuordnung jedes Ereignistyps zu einer Frist; welche Daten für welchen Zweck gebraucht werden. | +| **E5 E-Mail-Daten** | Rohmails im Bounce-Postfach nach 90 Tagen, ausgewertete Bounce-Datensätze nach 395 Tagen löschen. Sperrliste zweckgebunden erhalten. | Fristbeginn, betroffene Ordner einschließlich Sonderfälle, Minimalfelder der Sperrliste sowie Prüfrhythmus und Entsperrverfahren. | +| **E6 Archiv und Legal Hold** | Drei Jahre nach Jahresende als zu prüfende Standardfrist; kein automatischer vollständiger Fristneustart nach Streitende. | Frist je Ereignistyp; Überprüfung und Ende eines Holds; Behandlung weiterer konkret begründeter Ansprüche. | +| **E7 Archivrest und Zugriffslog** | Beim Löschen des Beweisinhalts auch unnötige Personenreferenzen, Freitexte und Zugriffsdetails entfernen; minimale Löschkennungen für Restore-Schutz behalten. | Exakte Restfelder und deren Endfrist bzw. eindeutig auswertbare Löschbedingung. Abstimmung mit allen rückspielbaren Backups. | +| **E8 Originaldateien und Kontakte** | Original und veröffentlichte Fassung grundsätzlich als Nachweis behalten; Kontakte und Einreicherdaten nur im begründeten Umfang. | Umgang mit GPS-/Gerätemetadaten, sensiblen Bildern, kleinen Korrekturen und zusätzlichen Kontaktdaten. | +| **E9 Fachliche Vorgänge und Snapshots** | Vorhandene Fristen mit dem tatsächlichen Löschverfahren abgleichen; IP-Löschung und Vorgangslöschung getrennt behandeln. | Fristen für reguläre Kontakte, Meldeverfahren, Widerrufe, Kündigungen, Buchungsnachweise und abgelehnte Meldungen; Ausnahmebehandlung bei offenen Archivaufträgen. | + +- [ ] Für E1–E9 jeweils „Vorschlag übernehmen“ oder eine konkrete Abweichung notieren. +Vorschlag übernehmen +- [ ] Offene Restfristen und Datenumfänge als ausdrückliche Fragen an den Anwalt kennzeichnen. + +**Ergebnis:** Beschlossene Arbeitsvorschläge für die anwaltliche Prüfung. Noch keine Löschung von Bestandsdaten. + +### B3 — Betriebsinformationen bereitstellen bzw. prüfen lassen + +- [ ] Verantwortlichen mit Firmenname/Anschrift sowie Ansprechpartner für Datenschutz, Betrieb und Freigabe festlegen. +adametz.media +Inhaber: Kevin Adametz +In der Lake 4 +33739 Bielefeld +Deutschland + +E-Mail: info@pressekonto.com +Telefon: +49 5206 7076721 (kein telefonischer Support) + +- [ ] Tatsächliche Produktivstände von Hub-Analyse, Nutzerkennung, Bildprüfung, Newsletterversand und Zustimmungsgate bestätigen lassen. +- [ ] Aktive AGB-/DSE-Fassung und produktiven Release-Stand feststellen lassen. +- [ ] Speicherfristen der GlitchTip-Instanz und ihrer Webserver-/Proxylogs belegen lassen. +- [ ] Backupübersicht erstellen lassen: reguläre Sicherungen, Archiv-Disk, Datenbank und alte Deploy-/Migrationskopien; jeweilige Speicherorte und tatsächliche Aufbewahrung. +- [ ] Prüfen lassen, ob im Bounce-Postfach bereits eine serverseitige Löschregel existiert und welche Ordner sie erfasst. +- [ ] Vorhandene Anbieter-/Auftragsverarbeitungsunterlagen für die tatsächlich eingesetzten Dienste zusammenstellen, insbesondere Hosting, E-Mail, Fehlerprotokoll und Turnstile; fehlende Unterlagen markieren. +- [ ] Zuständigen und Ablauf für Auskunft, Löschung, Widerspruch, Einschränkung und sensible Bildinhalte benennen. + +Die offen punkte hier Einmal vor belegen mit den Standards defauls beziehungsweise schau auch in den Datenschutz /system nach dem aktuellen Stand +**Ergebnis:** Eine datierte Bestandsübersicht mit Belegverweisen. Eine vorhandene Einstellung belegt noch keinen erfolgreichen Löschlauf; die Laufnachweise folgen vor dem Abschluss. + +### B4 — Unabhängige Sicherung des Löschstands ermöglichen + +- [ ] Mit dem Betrieb einen Speicherort auswählen, der bei einem Restore von Anwendung und Archiv nicht auf denselben alten Stand zurückgesetzt wird. +- [ ] Zuständigkeit, Zugang, Kosten und Aufbewahrung für diesen Speicher festlegen. Vorhandene geeignete Infrastruktur kann verwendet werden; ein Neukauf ist keine Vorgabe. +- [ ] Technisches Konzept erstellen lassen: Wie wird jeder relevante Löschstand gesichert, welche zeitliche Lücke bleibt, und wie wird ein Fehler bemerkt? +- [ ] Isolierte Umgebung und Verantwortlichen für die spätere Restore-Übung festlegen. + +**Ergebnis:** Umsetzbarer Betriebsauftrag. „Wir exportieren täglich“ genügt allein nicht; Löschungen seit dem letzten Export müssen berücksichtigt sein. + +### B5 — Anwaltliche Prüfung organisieren + +- [ ] Ansprechpartner und Prüfungstermin vereinbaren. +- [ ] Das unter V1/V2 korrigierte Paket mit deinen Entscheidungen aus B2 und den Betriebsinformationen übergeben. +- [ ] Schriftliche Antworten zu den aktuell einschlägigen Fragen F1–F11 und A1–A7 anfordern; Fragen zu zurückgestellten Funktionen ausdrücklich als spätere Aktivierungsthemen kennzeichnen. +- [ ] Ausdrückliche Rückmeldung zu Datenumfang, Aufbewahrungsfristen, Hold-Ende, Restdaten, Originalmetadaten, sensiblen Inhalten sowie DSE-/AGB-Texten einholen. + +**Ergebnis:** Antworten und Bedingungen, die eine konkrete Umsetzung ermöglichen. Der Versand ist deine Aufgabe, sofern du uns nicht gesondert damit beauftragst. + +## 2. Vorbereitung, die wir übernehmen können + +### V1 — Sachverhalt und Dokumente berichtigen + +- [ ] [Anwaltspaket](anwaltspaket-datenschutz-2026-10.md) anhand K1–K8 der Auswertung korrigieren. +- [ ] [Interessenabwägung](interessenabwaegung-beweisarchiv-2026-10.md) hinsichtlich Restdaten, Zugriffen, Hold-Ende, Restore-Voraussetzungen und tatsächlichen Risiken berichtigen. +- [ ] „Heute umgesetzt“, „beschlossenes Ziel“ und „später geplant“ eindeutig auseinanderhalten. +- [ ] Richtige technische Angaben aufnehmen: Token-ID statt geheimer API-Schlüssel, kurzlebiger Cache statt garantierter RAM-Speicherung, Ausnahme für angeforderte Magic Links und zusätzliche IP-Übermittlung an Turnstile. +- [ ] Unterschiedliche Rollen für aktive Originale und entfernte Archivinhalte benennen; Umfang der protokollierten Zugriffe präzisieren. + +**Abhängigkeit:** Sachliche Korrekturen können sofort erfolgen; Zieltexte hängen von B2/B3 und den späteren Anwaltsantworten ab. + +### V2 — Eine vollständige Aufbewahrungsmatrix erstellen + +- [ ] Für jede Datenart festhalten: Zweck, Datenfelder, Speicherorte/Kopien, Fristbeginn, Dauer, Löschbedingung, Ausnahme, zuständige Person und technischer Nachweis. +- [ ] Insbesondere Originale, Rechtebestätigungen, Archivinhalt, Restdaten, Zugriffslogs, Vorgänge, IPs, Rohmails, Sperrliste, Fehlerberichte und Backups aufnehmen. +- [ ] Bei zeitgesteuerten Läufen den tatsächlichen Löschzeitpunkt definieren: täglich oder wöchentlich, Zeitzone, Grenztage, Fehlerfall und Wiederholung. +- [ ] Entscheiden, wie bereits überfällige Bestandsdaten behandelt werden; keinen neuen Fristbeginn allein durch die Umstellung erzeugen. +- [ ] Minimalfelder und konkrete Fristen für bislang offene Fälle aus E2/E7/E9 nach der Anwaltsantwort eintragen. + +**Ergebnis:** Eine einzige verbindliche Vorgabe für Code, Betrieb und Rechtstexte. Solange eine für die Umsetzung notwendige Frist oder Löschbedingung fehlt, ist der betroffene Teil nicht umsetzungsreif. + +### V3 — Anwaltsunterlagen vervollständigen + +- [ ] Aktuelle tatsächlich verwendete DSE/AGB und die korrigierten Entwürfe beifügen. +- [ ] Bildrechte-Agenda A1–A7 und die vier referenzierten Fragen zu Löschanfragen beifügen. +- [ ] Ansichten von Rechtebestätigung, Bildnachweis und Kontosicherheit als Anlagen vorbereiten. +- [ ] E1–E9 und F1–F11 mit Vorschlag, Antwortfeld und späterem Antwortdatum versehen. +- [ ] Nach Rücklauf jede Bedingung einem Textabschnitt, einer Entwicklungsaufgabe oder einer Betriebsaufgabe zuordnen. + +### V4 — Umsetzungsauftrag und Abnahme festschreiben + +- [ ] Die Aufgaben U1–U9 unten anhand der geprüften Entscheidungen konkretisieren. +- [ ] Für jede Aufgabe die fachliche Vorgabe, betroffene Daten, Altbestandsbehandlung und messbare Abnahmekriterien eintragen. +- [ ] Entwicklungs-, Betriebs- und Freigabeverantwortliche namentlich zuordnen. +- [ ] Reihenfolge festlegen: Löschregeln und unabhängiger Löschstand abstimmen, Umsetzung testen, Bestandsläufe kontrolliert durchführen, Betrieb nachweisen, Rechtstexte veröffentlichen. +- [ ] Rückfallverhalten festlegen: Ein Rollback darf weder erledigte Löschungen rückgängig machen noch ohne Nachweis neue Funktionen aktivieren. + +## 3. Ab wann ist das Paket umsetzungsreif? + +- [ ] B1: Umfang schriftlich festgelegt. +- [ ] B2/V2: Vollständige Aufbewahrungsmatrix einschließlich aller offenen Restfristen und Ausnahmen vorhanden. +- [ ] B3: Relevanter produktiver Iststand und Betreiberangaben geklärt; fehlende Laufnachweise sind konkret als Abnahmeaufgaben erfasst. +- [ ] B4: Geeigneter unabhängiger Speicher und ausführbares Restore-Konzept festgelegt. +- [ ] B5/V3: Anwaltliche Antworten zu den umsetzungsbestimmenden Fragen liegen vor und sind eingearbeitet. +- [ ] V1: Beide Ausgangsdokumente beschreiben denselben Ist- und Zielstand. +- [ ] V4: Aufgaben, Zuständigkeiten und Abnahmekriterien vollständig; keine Grundsatzentscheidung mehr an die Entwicklung delegiert. + +**Dann lautet der Status: „Umsetzungsreif“.** Dafür müssen die Änderungen noch nicht produktiv sein. Ein nachweislich unabhängiger, bereits geklärter Teil kann vorher umgesetzt werden; ungeklärte Fristen oder Datenlöschungen werden dadurch nicht automatisch freigegeben. + +## 4. Anschließende Umsetzung und ihre Abnahmekriterien + +Dieser Abschnitt macht den späteren Weg zum Abschluss sichtbar. Er ist der Arbeitsvorrat nach Herstellung der Umsetzungsreife. + +| Aufgabe | Umsetzung | Abnahme | +|---|---|---| +| **U1 Vorgangs-IP-Adressen** | Bereinigung aller beschlossenen Felder einschließlich Buchungsbestätigungen und letzter Login-IP; Altbestand und Vorfallsausnahmen berücksichtigen. | Grenzfälle vor/nach Frist getestet; fachlicher Vorgang bleibt erhalten; Ausnahme funktioniert; erster Bestandslauf protokolliert. | +| **U2 Entwürfe, Ablehnungen und Vorgänge** | Echte Löschung bzw. Reduktion nach E1/E2/E9; verknüpfte Daten und Medien einbeziehen. | Nie veröffentlichte Inhalte nach Regel entfernt; veröffentlichte/unklare Legacy-Fälle und Holds geschützt; Fehlversuche werden erneut verarbeitet. | +| **U3 Archiv und Hold-Ende** | Beschlossene Fristlogik sowie Minimierung der Restdaten und Archivzugriffslogs umsetzen. | Kein unbegründeter Fristneustart; fällige personenbezogene Reste verschwinden; laufender Hold schützt erforderliche Daten; Restore-Kennungen bleiben im benötigten Umfang nutzbar. | +| **U4 Anmelde-/Aktivitätsfristen** | Ereignistypen der Matrix zuordnen und Bereinigung anpassen; vorhandene API-Frist verifizieren. | Ereignistypen und Grenztage getestet; dokumentierte Ausnahme für Sicherheitsvorfälle; produktiver Löschlauf belegt. | +| **U5 Bounce-Postfach und Sperrliste** | Rohmails in allen vereinbarten Ordnern bereinigen; nötigenfalls auch tatsächlich erhaltene Kopien berücksichtigen; Sperrdaten und Prüfprozess auf das Beschlossene begrenzen. | Überfällige Rohmails entfernt; Sperren weiterhin wirksam; unklare Rückläufer nach festgelegtem Verfahren behandelt; Lauf überwacht. | +| **U6 Fehlerberichte** | Technische Felder begrenzen, freie Query-/Fehler-/Objektinhalte reduzieren; Instanz- und Transportlogfristen umsetzen. | Testfälle mit Namen, E-Mails, IPs und geheimen/formularbezogenen Werten in Query, Meldung und Fehlerobjekt geprüft; tatsächlich gesendete Daten entsprechen dem beschriebenen Schema. | +| **U7 Löschstand und Restore** | Unabhängige Sicherung, Aktualitäts-/Fehlerprüfung und verbindlichen Restore-Ablauf umsetzen. | Übungen „DB alt“, „Disk alt“, „beide alt“ bestanden; bereits Gelöschtes bleibt entfernt; notwendige Holds und Schlüssel verfügbar; Exportlücken behandelt. | +| **U8 Dokumente und Einbeziehung** | Geprüfte DSE, AGB/Bildrechtsklauseln, passende Bestätigungsfassung und Zustimmungsgate vorbereiten; Informationen auf allen Hosts abstimmen. | Texte entsprechen der fertigen Umsetzung; Versionsverweise stimmen; relevante Einreichungswege geprüft; Bestandskundenverfahren entspricht der Freigabe. | +| **U9 Betrieb und Bestandsnachweise** | Scheduler/Alarme, Backuprotation, Sonderkopien, manuelle Betroffenenprozesse und Verantwortlichkeiten nachweisen. | Echte Laufprotokolle und vollständige Backupübersicht vorhanden; alte Sonderkopien gemäß Entscheidung behandelt; D7/D8/D10 weiterhin wie beschlossen deaktiviert. | + +**Zuordnung zur Auswertung:** U1 → K2/F4; U2 → K1/K2; U3 → K3/K4; U4 → D3/D5/F3; U5 → D4/F5; U6 → K7; U7 → K5; U8 → K6/F1/F10/F11/A1–A7; U9 → Betriebsgrenzen und Abschlusskriterien. K8/F6/F7/F9 bleiben bei beschlossenem Aufschub separate Aktivierungspakete. + +## 5. Wann kannst du „abgeschlossen“ abhaken? + +- [ ] U1–U9 im beschlossenen Umfang umgesetzt und abgenommen; jede Ausnahme ausdrücklich dokumentiert. +- [ ] Gezielte Tests nach den Änderungen bestanden. Die bisherigen 82 Tests sind die Ausgangsbasis, nicht die Abnahme zukünftiger Änderungen. +- [ ] Altbestandsbereinigung und produktive Löschläufe nachgewiesen. +- [ ] Restore-Übung erfolgreich und Ergebnisse dokumentiert. +- [ ] Finale Texte anhand des tatsächlich erreichten Stands geprüft; anwaltliche Bedingungen erfüllt. +- [ ] Interessenabwägung durch den Verantwortlichen datiert und abgezeichnet; nächster Prüftermin spätestens nach zwölf Monaten eingetragen. +- [ ] Geprüfte Texte und erforderliches Zustimmungsgate mit passenden Fassungen veröffentlicht; betroffene Hostvarianten kontrolliert. +- [ ] Roadmap und Paketstatus aktualisiert; zurückgestellte Funktionen bleiben als separate offene Aufgaben sichtbar. + +**Abschlussvermerk:** Datum, produktiver Release-Stand, freigegebene Dokumentfassungen, verantwortliche Person und Verweise auf Test-, Lösch- und Restore-Nachweise festhalten. + +## 6. Empfohlene Reihenfolge + +1. **Du:** B1/B2 entscheiden und B3/B4 beim Betrieb klären lassen. +2. **Wir:** Parallel sachliche Dokumentkorrekturen vorbereiten; mit deinen Angaben Aufbewahrungsmatrix und Anwaltsunterlagen vervollständigen. +3. **Du + Anwalt:** B5 bearbeiten; umsetzungsbestimmende Fragen schriftlich beantworten. +4. **Wir + Betrieb:** Antworten in Aufgaben und Abnahmekriterien übernehmen. Damit ist die Umsetzungsreife erreicht. +5. **Entwicklung + Betrieb:** U1–U9 umsetzen, testen und die tatsächlichen Betriebsnachweise liefern. +6. **Du + Anwalt + Entwicklung:** Endstand freigeben, veröffentlichen und den Abschluss dokumentieren. + +Die bestehenden Informationslücken zu bereits laufenden Verarbeitungen sollten bei der anwaltlichen Prüfung zuerst behandelt werden. Zutreffende Informationen zum aktuellen Stand können als eigene Zwischenfassung vorbereitet werden; zukünftige Lösch- oder Schutzmaßnahmen dürfen dabei noch nicht als umgesetzt beschrieben werden. diff --git a/dev/archive/release/roadmap-go-live-2026-07-20.md b/dev/archive/release/roadmap-go-live-2026-07-20.md new file mode 100644 index 00000000..1c017270 --- /dev/null +++ b/dev/archive/release/roadmap-go-live-2026-07-20.md @@ -0,0 +1,81 @@ +# Roadmap / Offene Punkte + +Stand: 20.07.2026 (Go-Live-Tag). Kurzfristiges zuerst; Details zu erledigten +Phasen im Archiv (`dev/archive/`). + +> **Hinweis 29.09.2026:** Die laufende Planung steht in +> `dev/2026-09-01/roadmap-2026.md`, der Entwicklungsstand in +> `dev/2026-09-11-audit/ENTWICKLUNGSPLAN.md` und im jüngsten Umsetzungsaudit. +> Die Punkte unten stammen vom Go-Live-Tag; ihr Stand ist dort nicht +> nachgeführt und wird im Umsetzungsaudit vom 29.09. (Abschnitt 6.4) als „auf +> Live zu bestätigen" geführt. + +## Nachlauf Go-Live (kurzfristig) + +- [ ] **Go-Live-Mails** an Bestandskunden: erst `php artisan + auth:send-go-live-mails --dry-run` (Anzahl prüfen), dann scharf. + Massenversand läuft über die Queue → Worker-Status vorher grün, + Betriebsüberwachung während des Versands im Blick. +- [ ] **API-Kunden-Mailing** (Connektar & Co.) mit Hinweis auf neue Doku + (`/docs/api/v1`) und Token-Migration — Texte [EXTERN]. +- [x] **Git-Hygiene (R6.5):** erledigt 20.07. — `fix/zeitzone-europe-berlin` + nach `main` gemerged (`7b27ec5`), Release-Tag **v1.0.0**, beides auf + origin. Künftig Feature-Branches von `main`. +- [ ] **Stripe-Test-Artefakte bereinigen:** Test-`stripe_id` am Testuser, + Test-Subscription-Zeilen, STR-Testrechnungen — damit die + Rechnungsnummern-Sequenz sauber ist. +- [ ] **Monitoring scharf:** `MONITORING_ALERT_EMAIL` gesetzt? Cron/Scheduler + + Queue-Worker in Ploi überwacht? +- [ ] **Umami-Snippets** je Domain einbinden (`dev/betrieb/umami.md`). +- [ ] **Connektar-API-Keys rotieren** (mittelfristig — die Legacy-Keys sind + über diverse Test-Kanäle gelaufen; Rotation über `/customer/tokens`). +- [ ] **Alt-System endgültig abschalten**, sobald ein paar Tage stabil: + Webspace und Alt-DBs auf dem KAS stilllegen; vorher letztes Backup der + Alt-DBs und Alt-Uploads sichern. Danach kann auch `dev/migration/` (7 GB + lokales Medien-Staging) auf ein Backup-Medium und vom Arbeitsrechner + runter. **Das KAS-Hosting selbst bleibt** (E-Mail-Postfächer, Stand + 06.10.2026); der SSH-Zugang des Altsystems ist geändert und deaktiviert. + +## Beobachten (erste Wochen) + +- [ ] Betriebsüberwachung täglich: failed_jobs, Worker, Medien-Privatisierung. +- [ ] `storage/logs/laravel.log` auf neue Fehlermuster. +- [ ] Search Console: Indexierung der neuen Domains + 301-Ketten der + Legacy-URLs (www-Redirects, .html-Redirects, presskit→Newsroom). +- [ ] MySQL-Auslastung (die Filesort-Spirale ist behoben; bei neuen + Slow-Queries → Slow-Query-Log). + +## Nächste Entwicklungen / Optimierungen (Ideen-Backlog) + +- [x] **Volt entfernen, auf Livewire-4-Single-File-Components umstellen** + — **erledigt 06.10.2026** (Branch `technik/volt-entfernen`). 83 + Komponenten auf `Livewire\Component`, 73 Routen auf + `Route::livewire()`, 88 Testdateien auf `Livewire::test()`/ + `Livewire::actingAs()`; `VoltServiceProvider` gelöscht, + `livewire/volt` entfernt (sonst keine Paketänderung). + `config/livewire.php` auf v4-Schlüssel: `component_layout`, + `component_placeholder`, `component_locations`, `make_command` (SFC + ohne ⚡). Befund dabei: Der alte Schlüssel `layout` war wirkungslos, + Livewire 4 legte seinen Standard `layouts::app` darüber; alle 73 + gerouteten Komponenten setzen ihr Layout aber selbst. CLAUDE.md, + AGENTS.md, `boost.json`, `.cursorrules` und der Skill + `volt-development` angepasst bzw. entfernt (von Hand — + `boost:update` hätte nebenbei alle Skills auf eine neue + Boost-Fassung gehoben, das ist ein eigener Schritt). Suite 2.325 + grün, einer übersprungen; Larastan und Pint ohne Meldung. + **Larastan erfasst die Komponenten weiterhin nicht**: Es analysiert + nur `.php`-Dateien, Single-File-Komponenten sind Blade-Dateien. + Abhilfe wäre die Umwandlung einzelner großer Komponenten in + Klassen-Komponenten (`php artisan livewire:convert`), kein Muss. + +- [ ] Frontend-Audit-Reste aus `dev/archive/frontend-audits/ + frontend-optimize-protokoll.md` sichten — P2/P3-Punkte, die bewusst + liegen geblieben sind. +- [ ] Offene [EXTERN]-Entscheidungen aus dem Release-Plan prüfen + (`dev/archive/release/entwicklungsplan-release.md`): Preisfreigabe, + Refund-Policy. +- [ ] Cache-Warmer im Scheduler (Startseite + Top-Kategorien alle 5 Min + vorbauen), falls Kaltaufbauten nach Deploys stören — Option B aus der + Performance-Session vom 20.07.; aktuell nicht nötig. +- [ ] Redis als Cache-/Queue-Store erwägen, wenn die Last wächst + (aktuell `database`-Store, läuft stabil). diff --git a/dev/betrieb/deploy-runbook.md b/dev/betrieb/deploy-runbook.md index bc43b1ba..520ab9e9 100644 --- a/dev/betrieb/deploy-runbook.md +++ b/dev/betrieb/deploy-runbook.md @@ -10,7 +10,8 @@ ## 1. Server-Voraussetzungen -- PHP 8.4 (FPM) mit Extensions: `pdo_mysql`, `mbstring`, `intl`, `gd` (Bildvarianten), `curl`, `zip` +- PHP 8.4 (FPM) mit Extensions: `pdo_mysql`, `mbstring`, `intl`, `gd` (Bildvarianten), `curl`, `zip`, `exif`, `imagick` + - `imagick` trägt die Herkunftsprüfung (IPTC/XMP) und den KI-Vorab-Check der Bilder. Fehlt es, laufen beide ins Leere, ohne etwas zu blockieren. Live fehlte es bis 08.10.2026. Einrichtung: `sudo apt install php8.4-imagick`, dann `sudo service php8.4-fpm reload` und `php artisan queue:restart`. Prüfen: `php -m | grep -i imagick` und Admin ▸ Reports ▸ Betriebsüberwachung, Zeile „PHP-Erweiterung Imagick“. - MySQL/MariaDB (Prod: `DB_CONNECTION=mysql`; SQLite ist nur Dev) - Node.js (LTS) + npm — nur zum Bauen der Assets (Builds sind **gitignored**, siehe Schritt 3) - Webserver-vHosts für **alle drei Domains** auf dasselbe `public/` (Host-Routing macht die App) @@ -387,7 +388,7 @@ Doku archiviert unter `dev/archive/optimize/cutover-runbook.md`. mittlere Stelle, Hotfix letzte). Lokal `git describe --tags --always --dirty > RELEASE` und die Datei `RELEASE` mit hochladen — daraus lesen `config('app.version')`, GlitchTip, `/health` und der Systemstatus die Version. Ablauf eines Deploys mit - Paket statt Einzeldateien: `dev/betrieb/deploy-v1.1.0.md`. + Paket statt Einzeldateien: `dev/archive/betrieb/deploy-v1.1.0.md`. 1. Geänderte Dateien hochladen. Bei geändertem `composer.lock`: `composer install --no-dev --optimize-autoloader`, danach — falls `public/vendor/livewire/` existiert — `php artisan vendor:publish --tag=livewire:assets --force`. diff --git a/dev/betrieb/deploy.sh b/dev/betrieb/deploy.sh index af2d4c9b..f3159341 100755 --- a/dev/betrieb/deploy.sh +++ b/dev/betrieb/deploy.sh @@ -140,6 +140,17 @@ fi step "Wartungsmodus aus" php artisan up +# Changelog-Entwürfe aus den Commit-Zeilen `Changelog:`/`Public:` (Decision- +# Update Changelog, Stufe 2, E21). Veröffentlicht wird nichts; Freigabe im +# Admin ▸ Changelog. Ein Fehler hier bricht den Deploy nicht ab. +step "Changelog-Entwurf" +if [[ "$previous" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + php artisan changelog:collect "$previous" "$tag" \ + || echo "!! Changelog-Entwurf nicht angelegt, der Deploy ist trotzdem live. Nachholen: php artisan changelog:collect $previous $tag" >&2 +else + echo "Vorheriger Stand ($previous) ist kein Tag. Von Hand: php artisan changelog:collect $tag" +fi + step "Version" php artisan about --only=pressekonto diff --git a/dev/betrieb/git-deploy.md b/dev/betrieb/git-deploy.md index b91e5b77..9fc16fc4 100644 --- a/dev/betrieb/git-deploy.md +++ b/dev/betrieb/git-deploy.md @@ -1,9 +1,11 @@ # Git-Deploy +> Allgemeine, projektunabhängige Fassung mit Vorlagen: [`../git-deploy-monitoring/`](../git-deploy-monitoring/README.md). + **Stand:** 06.10.2026 · **Status:** umgestellt am 06.10.2026, erster Git-Deploy `v1.1.3` (Protokoll unten) Bis `v1.1.0` gingen Deploys als Paket per SFTP auf den Server -([`deploy-v1.1.0.md`](deploy-v1.1.0.md)). Künftig ist `~/pressekonto.com` ein +([`deploy-v1.1.0.md`](../archive/betrieb/deploy-v1.1.0.md)). Künftig ist `~/pressekonto.com` ein Git-Checkout, und ausgeliefert wird ein Tag aus `origin`. ## Grundsätze @@ -214,6 +216,58 @@ Was bei der Umwandlung (B) auftrat, für den Fall, dass ein weiterer Server so u Aufräumen nach ein paar stabilen Tagen: `~/deploy-v1.1.0.tgz`, `~/backup-vor-v1.1.0.tgz`, `~/backup-vor-git.tgz`, `~/vor-git/`. +## G — Sensible Daten aus der Historie entfernen + +Wurden Kundendaten, Dumps, Logs oder Schlüssel committet, reicht Löschen oder +Enttracken nicht: Die Datei bleibt in jedem Klon und auf jedem Remote +abrufbar. Vorgehen, erprobt am 09.10.2026 (Protokoll unten): + +1. **Schlüssel zuerst rotieren.** Was einmal gepusht war, gilt als bekannt, + auch nach der Bereinigung. +2. **Sichern:** Branches, die nur auf einem Remote liegen, als lokale Branches + anlegen, dann `git bundle create /vor-filter.bundle --all`. Das + Bundle enthält die Daten noch und wird am Ende gelöscht. +3. **Umschreiben** aller Branches und Tags (`git filter-repo` ist besser, fehlt + aber im Dev-Container): + + ```bash + FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f \ + --index-filter 'git rm -r --cached --ignore-unmatch --quiet ""' \ + --tag-name-filter cat -- --branches --tags + ``` + +4. **Prüfen:** Dateibaum (`git rev-parse ^{tree}`) und Commitzahl + (`git rev-list --count `) je Branch und Tag vorher und nachher gleich; + `git rev-list --objects --branches --tags | grep ''` ist leer. +5. **Hash-Zuordnung** alt → neu ins Archiv legen, solange die alten Commits + lokal noch vorhanden sind (Abgleich über Autor- und Committerzeit, Autor, + Betreff). Doku und Commit-Nachrichten nennen weiter die alten Hashes. +6. **Push vom Host** (der Dev-Container hat keinen SSH-Schlüssel), je Remote: + `git push --force-with-lease ` und + `git push --force --tags `. Lehnt Forgejo ab, kurz den Branch-Schutz + lösen. +7. **Server:** `deploy.sh` holt Tags ohne `--force` und scheitert an neu + gesetzten Tags („would clobber existing tag“). Einmal von Hand: + + ```bash + cd ~/pressekonto.com + git status --porcelain # muss leer sein + git fetch --force --tags --prune origin + git checkout --quiet --detach # gleicher Inhalt, neuer Hash + git reflog expire --expire=now --all && git gc --prune=now + git count-objects -vH # size-pack prüfen + ``` + + `RELEASE` bleibt unverändert, ein Deploy ist nicht nötig. +8. **Forgejo und NAS:** Speicherbereinigung des Repositorys anstoßen. Weitere + Klone löschen und neu klonen. +9. **Lokal aufräumen:** `refs/original/*`, verwaiste Remote-Refs und Refs + anderer Werkzeuge (z. B. `refs/codex/…`, sie hielten am 09.10. die alten + Objekte fest) löschen, dann + `git reflog expire --expire=now --all && git gc --prune=now`. Mit + `git cat-file -e ` nachweisen, dass die Objekte weg sind, dann + das Bundle löschen. + ## Betrieb: PHP-FPM beim Deploy Jeder Reload bricht Anfragen ab, die in dieser Sekunde laufen. Im Nginx-Fehlerlog @@ -236,14 +290,21 @@ oder mit root-Zugang, danach `php-fpm8.4 -t` und erst dann neu laden. …/public/api/ is forbidden` (dort liegt die API-Spezifikation `v1.yml`, ein Aufruf von genau `/api/` bekommt 403). Ein Zugriffsprotokoll für die Site führt Ploi nicht. -## Später: Changelog +## Changelog -Der Changelog-Entwurf -([Decision-Update](../2026-10/Decision-Update_Changelog_Automatisierung_2026-10-04.md), -Stufe 2) dockt in `deploy.sh` nach `up` an. Ein Artisan-Befehl liest die Commits -zwischen dem vorherigen und dem neuen Tag. Die liegen jetzt auf dem Server vor. -Daraus legt er die Entwürfe an. Der LLM-Schritt läuft als Queue-Job, damit ein -Ausfall des Anbieters keinen Deploy abbricht. +Seit `v1.13.0` legt `deploy.sh` nach `up` die Changelog-Entwürfe an +([Decision-Update](../changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md), +Stufe 2): `php artisan changelog:collect ` liest die +Commits dazwischen und macht aus den Zeilen `Changelog:` (Neu, Verbessert, +Behoben, Sicherheit) und `Public:` (ein Satz aus Nutzersicht) je einen Entwurf. +Commits ohne `Changelog:` bleiben intern, Sicherheit wird je Release zu einer +Sammelzeile. Ein Fehler bricht den Deploy nicht ab; nachholen mit demselben +Befehl, er legt nichts doppelt an. Freigabe im Admin ▸ Changelog, öffentlich +unter `pressekonto.com/changelog` und `/changelog/feed`. + +Die Zeilen stehen irgendwo in der Commit-Nachricht, am besten direkt vor +`Co-Authored-By`. Git zählt nur den letzten Absatz als Trailer — der Befehl +liest deshalb die ganze Nachricht. ## Protokoll @@ -257,3 +318,13 @@ Ausfall des Anbieters keinen Deploy abbricht. | 06.10.2026 | `v1.2.0` | Volt entfernt (Livewire-4-Single-File-Components). Erster Deploy, der nur noch `deploy.sh` brauchte: keine Migration, Composer entfernt `livewire/volt`. Vom Betreiber durchgeklickt (Login, Kundenbereich, Admin), unauffällig. | | 06.10.2026 | FPM und Nginx-Fehlerlog | `sudo -S service php8.4-fpm reload` ohne Passwort bestätigt (Master bleibt, Worker neu) — `deploy.sh` lädt FPM künftig selbst, `PK_FPM_RELOAD` bleibt ungesetzt. Nginx-Fehlerlog ausgewertet: Verbindungsabbrüche nur zu den Deploy-Zeitpunkten, `process_control_timeout` bewusst nicht gesetzt (siehe „Betrieb: PHP-FPM beim Deploy“). | | 06.10.2026 | Worker-Ausfall nach `v1.3.0` | Supervisor lief nicht. `queue:restart` beim Deploy von `v1.3.0` (16:51) hat den Worker beendet, niemand startete ihn neu — KI-Prüfungen, Mails und eine Zahlungsbestätigung lagen über eine Stunde. Aufgefallen über die Systemstatus-Kachel. Supervisor in Ploi neu gestartet, Rückstau mit einem Ersatz-Worker (`nohup`) abgearbeitet. Ursache für den gestoppten Supervisor ohne root-Zugang nicht feststellbar. Folgen: Worker-Prüfung am Ende von `deploy.sh` (`v1.3.2`), externer Monitor auf `/health` (status.adametz.media). | +| 06.10.2026 | `v1.3.2` | Worker-Prüfung im Deploy. Von Hand nachgeholt (Skript lief aus der Kopie von `v1.3.1`): `monitoring:queue-probe` → Test-Job nach 4 s abgeholt. `systemctl is-enabled supervisor` → `enabled`; ein Neustart ohne Autostart scheidet als Ursache des Ausfalls damit weitgehend aus. | +| 07.10.2026 | `v1.4.0` | Sicherheitsaudit S-01–S-06, Passkeys, Zweitfaktor-Pflicht für Admins; Migration `create_passkeys_table` (`--migrations`). Vorher brach `deploy.sh` wegen Abweichungen ab: Die Doku-Commits nach `v1.3.2` waren von Hand hochgeladen worden, `deploy.sh` hatte dabei sein Ausführungsrecht verloren. Mit `git checkout -- dev/betrieb/…` bereinigt. **Danach entzog `memberships:resync-auto` 19.598 von 19.607 automatischen Firmenrechten**: Bestandskonten ohne `email_verified_at` verloren pauschal alles. | +| 07.10.2026 | `v1.4.1` | Hotfix für den Abgleich: Entzogen wird nur noch, was keine Grundlage mehr hat; das Kommando läuft in einer Transaktion, mit `--dry-run` und Notbremse ab 5 %. Rechte aus dem Backup vor dem Deploy wiederhergestellt (`INSERT IGNORE`, 19.598 eingefügt, danach 19.607). Hinweis: `mysql` auf dem Server braucht `-h`/`-P` aus der `.env`, sonst „Access denied“ für `…@'localhost'`; ohne Passwort geht es über `php artisan tinker`. Probelauf 19.607 → 19.316, danach ausgeführt. Wiederholung am 08.10. ohne Änderung (19.316 Rechte, 14.911 User). Die Nacht verlief ohne Auffälligkeiten. | +| 08.10.2026 | `v1.5.0` | API-Zugang an die Buchung gebunden (403 ohne Abo/Buchung, Tokens bleiben), optionales Token-Ablaufdatum, `sanctum:prune-expired` täglich 04:10. Vorab auf Live geprüft: nginx antwortet direkt, kein Proxy/CDN; Cookies `secure`/`httponly`/`samesite=lax`, HSTS fehlte. Nach dem Deploy: `strict-transport-security: max-age=31536000`, `trustedproxy.proxies` = `null`. Auswirkung der Buchungsprüfung: 2 Konten haben die API in den letzten 30 Tagen genutzt, beide weiterhin mit Zugang. Keine Migration. | +| 08.10.2026 | `v1.6.0` | Mit Migration (`users.sessions_revoked_at_ms`, Batch 22). Härtung aus Phase 4 des Sicherheitsaudits: „Andere Geräte abmelden“, IP-weites Login-Limit (20 Fehlversuche in 15 Minuten), dauerhafte Session-Sperrmarke, Passwörter ab 12 Zeichen mit Leak-Abgleich, CSP im Melde-Modus (`storage/logs/csp-*.log`), npm `shell-quote`/`source-map-js`. Nach dem Deploy: Header `content-security-policy-report-only` vorhanden, Umami- und GlitchTip-Host in `script-src`/`connect-src`. CSP-Log in einigen Tagen auswerten. | +| 08.10.2026 | `v1.6.1` | Vorher auf dem Server `php8.4-imagick` installiert und FPM neu geladen: Die Erweiterung fehlte auf Live, Herkunftsprüfung und KI-Vorab-Check der Bilder liefen seitdem ins Leere. Release: Zeile „PHP-Erweiterung Imagick“ in der Betriebsüberwachung, gebaute Livewire-Anfragen von Scannern (GlitchTip 38, 39) als 400 statt 500/419, Browser-Filter für abgebrochene Alpine-Übergänge (GlitchTip 18). Keine Migration. Nach dem Deploy: Betriebsüberwachung „Imagick ist geladen“. | +| 09.10.2026 | `v1.7.0` | Spamschutz für Kontakt-Widget und Registrierung (Cloudflare Turnstile, Inhaltsfilter mit Spam-Quarantäne, Namensregel bei der Registrierung). Bei nicht erreichbarem Cloudflare wird durchgelassen und markiert. Keine Migration. Vorher: Turnstile-Keys in der `.env`, Widget im Cloudflare-Dashboard mit allen drei Live-Hostnamen. Nach dem Deploy: Kontakt-Widget im Browser getestet, Betriebsüberwachung „Spamschutz (Cloudflare Turnstile)“ grün. `contact-messages:quarantine-spam`: 152 Anliegen in die Quarantäne, 130 offen (Rest per Sammelaktion), echte Korrekturanfragen blieben offen. `users:prune-bot-registrations` nach freigegebenem Probelauf ausgeführt, danach `USERS_PRUNE_BOT_REGISTRATIONS=true` und `config:cache`. | +| 09.10.2026 | Historie bereinigt | Die Produktiv-SQL-Dumps vom 23.04. (`dev/migration 2026/sql`, ~290 MB, Kundendaten) lagen seit `5b8bdf4` in der Historie und auf beiden Remotes. Mit `git filter-branch` aus allen Branches und Tags entfernt; Dateibäume und Commitzahlen aller 21 Refs unverändert, **alle Hashes neu** (Zuordnung alt → neu: [`commit-map-2026-10-09.txt`](../archive/commit-map-2026-10-09.txt)). Tags `v1.0.0`–`v1.7.0` neu gesetzt, gleicher Inhalt. Force-Push auf `origin` und `NAS`, Server-Abgleich nach G.7 (Server `size-pack` 33,4 MiB), Speicherbereinigung in Forgejo und auf dem NAS, keine weiteren Klone. Lokal zusätzlich drei Codex-Checkpoint-Refs entfernt, die noch auf die alte Historie zeigten; danach 33,5 MiB, beide Dump-Blobs nicht mehr vorhanden. Die betroffenen Live-Schlüssel waren bereits rotiert (Betreiber). Vorgehen allgemein in Abschnitt G. | +| 12.10.2026 | `v1.8.0` | Von `v1.7.0`, keine Migration, kein Asset-Diff. Sicherheitsseite mit „Geräte und Anmeldungen“, Breadcrumbs ohne Daten an GlitchTip (Livewire-Breadcrumbs aus), Löschfristen `activity_events` 395 / `api_usage_logs` 90 Tage (erster Lauf 04:05), Newsletter-API 410, Wortwahl „automatisiert geprüft“. Prüfung von außen: alle drei Domains melden Release `v1.8.0` (Meta-Tag der Fehlererfassung), robots.txt und Sitemaps hostkorrekt, Veröffentlichen-Seite mit neuem Text, GlitchTip ohne Einträge unter `v1.8.0`. `/health` mit Token nicht geprüft (lokales Token ≠ Live). Befund: „Qualitätsgeprüft“ stand noch in `config/domains.php` (Meta und Taglines) und im Tarifvorteil „Starter“ (Datenbank) → Hotfix `v1.8.1`. | +| 13.10.2026 | `v1.9.0` | Von `v1.8.1`, keine Migration, mit Asset-Diff. Boost-Label „Gebuchte Platzierung“ mit Erklärung, „Aktuell“ statt „Top-Auswahl“, Admin-Aktion „Boost beenden“, `audit:admins`. Deploy durch den Betreiber; danach auf Live Rollenprüfung BN-02 mit `audit:admins` (ein Admin-Konto mit Passkey und TOTP) und Test-Boost für die Screenshots des Anwaltspakets. Befund aus den Screenshots: auf Mobil verdeckt das Label den Bildnachweis → `v1.9.1`. | diff --git a/dev/betrieb/monitoring-plan.md b/dev/betrieb/monitoring-plan.md index 8480219f..93ad3927 100644 --- a/dev/betrieb/monitoring-plan.md +++ b/dev/betrieb/monitoring-plan.md @@ -77,12 +77,12 @@ sieht: fehlgeschlagene Livewire-Requests mit 5xx (Exception in GlitchTip) und ## Live-Schritte Phase 1 -Ausgeführt mit Deploy v1.1.0 — vollständiger Ablauf in [`deploy-v1.1.0.md`](deploy-v1.1.0.md). +Ausgeführt mit Deploy v1.1.0 — vollständiger Ablauf in [`deploy-v1.1.0.md`](../archive/betrieb/deploy-v1.1.0.md). **Infrastruktur (einmalig)** 1. GlitchTip auf sys.adametz.media (Docker Compose: web, worker, Postgres, - Redis; `GLITCHTIP_MAX_EVENT_LIFE_DAYS=90`). Zwei Projekte anlegen: + Redis; `GLITCHTIP_RETENTION_DAYS=90`, vor GlitchTip 6 `GLITCHTIP_MAX_EVENT_LIFE_DAYS`). Zwei Projekte anlegen: `pressekonto-server` (PHP/Laravel) und `pressekonto-browser` (JavaScript). Alert-Regel je Projekt: Mail an das Ops-Postfach bei neuem Fehlertyp. 2. ntfy: Server (ntfy.sh oder selbst gehostet), Topic mit Zugriffsschutz, @@ -191,7 +191,7 @@ Grundlage für die spätere Changelog-Seite. ### 05.10.2026 — Phase 1 live (v1.1.0) -Mit Deploy v1.1.0 ausgeliefert ([`deploy-v1.1.0.md`](deploy-v1.1.0.md)). +Mit Deploy v1.1.0 ausgeliefert ([`deploy-v1.1.0.md`](../archive/betrieb/deploy-v1.1.0.md)). GlitchTip (`production`), ntfy und Scheduler-Herzschlag auf Live aktiv. Offen aus Phase 1: externer Monitor auf `/health`; DSE-Absätze, danach `UMAMI_PORTAL_ENABLED`/`UMAMI_IDENTIFY_USERS`. @@ -288,7 +288,7 @@ wie Uptime Kuma; fällt dieser aus, kommt kein Push (siehe Schritt 6). und Mail-Benachrichtigung. Er meldet, wenn der Monitoring-Server selbst ausfällt oder beide Server gemeinsam nicht erreichbar sind. -Nach der Einrichtung: Punkt 29 in `deploy-v1.1.0.md` und Phase 1 hier als erledigt eintragen. +Nach der Einrichtung: Punkt 29 in `../archive/betrieb/deploy-v1.1.0.md` und Phase 1 hier als erledigt eintragen. ### 06.10.2026 — Worker-Ausfall und Folgen (v1.3.2) @@ -307,3 +307,10 @@ Serialisierung ohne `$viaSyndication`) — entfernt, nicht nachgesendet. - **Worker-Prüfung im Deploy** (`monitoring:queue-probe`, Ende von `deploy.sh`, Exit 3 ohne Worker). - **Runbook:** kein pauschales `queue:retry all` mehr; Vorgehen bei stehendem Worker. + +### 07.10.2026 — Allgemeine Fassung für andere Projekte + +Git-Deploy und Betriebsüberwachung als übertragbarer Baukasten mit Vorlagen +(Laravel-Dateien, `deploy.sh`, Docker-Compose für GlitchTip/ntfy/Uptime Kuma): +[`../git-deploy-monitoring/`](../git-deploy-monitoring/README.md). In einem +frischen Laravel 12 eingebaut und getestet. diff --git a/dev/2026-09-11-audit/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md b/dev/bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md similarity index 99% rename from dev/2026-09-11-audit/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md rename to dev/bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md index f4d3922a..7ae0bb0a 100644 --- a/dev/2026-09-11-audit/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md +++ b/dev/bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md @@ -154,7 +154,7 @@ Version `richtlinien` in `legal_documents` hochzählen. > > Zugriff auf das Archiv haben nur Administratoren des Anbieters; jeder Zugriff wird protokolliert. Das Archiv wird für keinen anderen Zweck verwendet und nicht an Dritte weitergegeben, außer zur Rechtsverteidigung an unsere rechtlichen Berater oder auf gesetzlicher Grundlage an Behörden und Gerichte. > -> Archiveinträge werden drei Jahre nach dem Ende des Jahres, in dem der Inhalt entfernt wurde, automatisch gelöscht. Läuft zu einem Inhalt eine rechtliche Auseinandersetzung, bleibt der Eintrag bis zu deren Abschluss einschließlich eines Rückgriffs bestehen. Die Löschung wird ohne Inhalt protokolliert. Sicherungskopien werden innerhalb von vier Wochen überschrieben; nach einer Wiederherstellung aus einer Sicherung werden bereits gelöschte Einträge erneut entfernt. +> Archiveinträge werden drei Jahre nach dem Ende des Jahres, in dem der Inhalt entfernt wurde, automatisch gelöscht. Läuft zu einem Inhalt eine rechtliche Auseinandersetzung, bleibt der Eintrag bis zu deren Abschluss einschließlich eines Rückgriffs bestehen. Die Löschung wird ohne Inhalt protokolliert. Sicherungskopien werden innerhalb von 14 Tagen überschrieben *(korrigiert 09.10.2026, Backup-Rotation 14 Tage)*; nach einer Wiederherstellung aus einer Sicherung werden bereits gelöschte Einträge erneut entfernt. **Zeile für Abschnitt 13 (Speicherdauer):** diff --git a/dev/2026-09-11-audit/bildkennzeichnung-entwicklungsplan-2026-09-21.md b/dev/bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md similarity index 99% rename from dev/2026-09-11-audit/bildkennzeichnung-entwicklungsplan-2026-09-21.md rename to dev/bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md index 550b3274..eceea7ec 100644 --- a/dev/2026-09-11-audit/bildkennzeichnung-entwicklungsplan-2026-09-21.md +++ b/dev/bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md @@ -1,7 +1,7 @@ # Entwicklungsplan: Bildnachweis, KI-Kennzeichnung, Rechtebestätigung, Beweisarchiv **Stand:** 22.09.2026, Fassung 2 (Entscheidungen getroffen; Blöcke A bis H und K umgesetzt und committet, Deploy offen; Blöcke I und J stehen aus) -**Grundlage:** [Umsetzungsvorschlag 15.09.](bildkennzeichnung-2026-09-15.md), [Feedback-Audit 15.09.](bildkennzeichnung-feedback-audit-2026-09-15.md), [Decision-Update 22.09.](Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md) und die Antworten des Betreibers vom 21.09. auf die Entscheidungsfragen der Fassung 1. Bei Widerspruch gilt das Decision-Update (im Folgenden „DU"). Code-Abgleich an HEAD `e620ef3` auf `technik/betriebsfixes-2026-09`. +**Grundlage:** [Umsetzungsvorschlag 15.09.](../archive/2026-09-audit/bildkennzeichnung-2026-09-15.md), [Feedback-Audit 15.09.](../archive/2026-09-audit/bildkennzeichnung-feedback-audit-2026-09-15.md), [Decision-Update 22.09.](Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md) und die Antworten des Betreibers vom 21.09. auf die Entscheidungsfragen der Fassung 1. Bei Widerspruch gilt das Decision-Update (im Folgenden „DU"). Code-Abgleich an HEAD `e620ef3` auf `technik/betriebsfixes-2026-09`. **Zweck:** Alle Punkte aus den vier Quellen, die am heutigen Code umsetzbar sind, in einer abarbeitbaren Reihenfolge mit Fix, Test und Aufwand. Gilt zuerst für das Titelbild einer Pressemitteilung; Newsroom-Bilder (Roadmap 1b.3) nutzen denselben Unterbau. Die Fassung 1 vom 21.09. enthielt eine Fragenliste und vier Textanlagen für den Anwalt. Beides ersetzt das Decision-Update (Abschnitte 3 und 7) und ist hier gestrichen. diff --git a/dev/changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md b/dev/changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md new file mode 100644 index 00000000..cab73490 --- /dev/null +++ b/dev/changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md @@ -0,0 +1,219 @@ +# Decision-Update: Changelog und Newsroom-Artikel automatisieren + +*Stand: 04.10.2026, Entscheidungen nachgetragen 09.10.2026 · Projekt Presseportale (pressekonto.com / presseecho.de / businessportal24.com)* + +--- + +## 1. Ziel + +Jede Weiterentwicklung des Systems soll öffentlich sichtbar werden, ohne dass daraus eine eigene Schreibaufgabe entsteht. Zwei Ebenen, beide weitgehend aus dem Entwicklungsprozess heraus erzeugt: + +1. **Changelog** auf pressekonto.com: kurz, datiert, vollständig für alles Sichtbare. +2. **Newsroom-Artikel** in einer eigenen Rubrik: nur für Neuerungen, die das Verhalten eines Nutzers ändern. + +Der Changelog ist der Beweis, dass das Portal lebt. Für Rückkehrer aus den Reaktivierungswellen ist ein Eintrag von letzter Woche überzeugender als jede Formulierung in der Mail. + +--- + +## 2. Bestätigte Entscheidungen + +| Nr. | Entscheidung | Begründung | +|---|---|---| +| E1 | Zwei getrennte Ebenen (Changelog / Artikel), keine Mischform | Changelog darf granular sein, Artikel müssen selten bleiben | +| E2 | Changelog unter pressekonto.com/changelog, datumsbasiert, mit RSS-Feed | Niemand außer Kevin braucht Versionsnummern | +| E3 | Rubriken im Changelog: **Neu**, **Verbessert**, **Behoben**, **Sicherheit** | Sicherheit immer nur als Sammelzeile, siehe E5 | +| E4 | Erzeugung automatisiert aus Commits mit Kennzeichnung; Kevin liest gegen, streicht, gibt frei | Nebenprodukt der Arbeit statt zusätzlicher Aufgabe | +| E5 | Sicherheitskorrekturen erscheinen ausschließlich als „Sicherheitsverbesserungen eingespielt", nur nach dem Deploy, nie mit Beschreibung | Keine Landkarte für Angreifer, keine Verunsicherung für Nutzer | +| E6 | Artikel werden automatisiert aus freigegebenen Changelog-Einträgen erzeugt, nach festen Vorgaben (Abschnitt 4), und landen als unveröffentlichter Entwurf im Newsroom | Gleiche Logik wie beim Changelog: Entwurf automatisch, Freigabe manuell | +| E7 | Artikel nur bei Schwellenwert „Nutzer macht danach etwas anders"; kleinere Einträge werden zum Monatsrückblick gebündelt | Schutz vor Artikel-Inflation und Selbstdruck | +| E8 | Eigene Rubrik „Pressekonto" (Name final offen, siehe O1), eigenes Firmenprofil, klar als Eigenmeldung erkennbar | Keine Vermischung mit Kundenmeldungen | +| E9 | Artikel bekommen ein generisches Update-Bild aus eigenem Template (Portal-Logo, Wort „Update", Monat); kein Stockmaterial | Macht auf einen Blick klar, dass es um Portal-Updates geht; keine Bildrechtefrage | +| E10 | Eigene Artikel durchlaufen denselben Prüf- und Freigabeweg wie Kundenmeldungen | Glaubwürdigkeit; Scoring-Ergebnis ist zugleich Test des Scorings | +| E11 | Dezenter „Neu"-Hinweis im Admin von pressekonto.com, verlinkt auf die letzten Changelog-Einträge | Nutzer sehen Updates dort, wo sie arbeiten | +| E12 | Reaktivierungsmails verlinken künftig auf den Changelog statt auf die Startseite | Rückkehrer sehen sofort, was seit dem letzten Login passiert ist | +| E13 | Freigegebene Artikel werden automatisch in weitere Kanäle verteilt; Changelog-Einträge einzeln nie | Einzelne Einträge im Social-Feed wirken wie ein Bot | +| E14 | Nur kostenlose Kanäle: Bluesky, Mastodon, LinkedIn-Unternehmensseite für pressekonto; X und Threads bleiben außen vor | Kein Budget für Reichweitenexperimente, solange der Nutzen nicht belegt ist | +| E15 | Kevins persönliches LinkedIn-Profil ist **nicht** Teil dieser Pipeline | Gehört zum Markenaufbau Adametz Media, ein anderes Projekt mit anderen Regeln | +| E16 | Monatlicher E-Mail-Rückblick „Was ist neu" nur per Opt-in-Checkbox im Account, standardmäßig aus | Anti-Zombie: Wer es will, klickt; keine Diskussion über § 7 UWG | +| E17 | Benachrichtigungsmails an Pressekontakte bleiben rein informativ, kein Update-Hinweis in der Fußzeile | Sonst kippt die Mail zur Werbung ohne Einwilligung | +| E18 | Alle verteilten Links tragen UTM-Parameter; nach drei Monaten wird je Kanal entschieden: behalten oder abschalten | Reichweite wird gemessen, nicht vermutet | + +--- + +## 3. Pipeline + +### Stufe 1: Kennzeichnung im Commit + +Nur Commits mit einem Changelog-Trailer werden berücksichtigt. Alles ohne Trailer bleibt intern. + +``` +feat(newsroom): Firmenprofil mit Newsroom-Ansicht + +Changelog: Neu +Public: Unternehmen haben jetzt eine eigene Newsroom-Seite mit allen Meldungen. +``` + +``` +fix(upload): Vorschau bricht bei Bildern über 5 MB ab + +Changelog: Behoben +Public: Die Bildvorschau funktioniert jetzt auch bei großen Dateien. +``` + +``` +fix(auth): Session-Fixation beim Magic-Link + +Changelog: Sicherheit +``` + +Regeln: +- `Changelog:` Wert aus Neu / Verbessert / Behoben / Sicherheit. +- `Public:` ein Satz aus Nutzersicht. Fehlt er, formuliert der Generator einen Vorschlag aus dem Commit-Titel; bei **Sicherheit** wird `Public:` ignoriert und immer die Sammelzeile gesetzt. +- Interna (Dateinamen, Tabellen, Bibliotheken, Ticketnummern) gehören nie in `Public:`. +- Commits hinter einem Feature-Flag bekommen den Trailer erst beim Commit, der das Flag öffnet. Sonst erscheinen Features im Changelog, die noch niemand sieht. + +### Stufe 2: Entwurf beim Deploy + +`deploy.sh` (nach `up`, E21) sammelt alle Commits seit dem letzten Release-Tag, filtert auf Trailer, erzeugt pro Rubrik die Einträge und legt sie als **Changelog-Entwurf** mit Datum in der Datenbank ab. Der LLM-Schritt (siehe Vorgaben in Abschnitt 4) glättet nur die Formulierung; er erfindet keine Einträge und fasst mehrere Commits zum selben Feature zu einem Eintrag zusammen. Mehrere Sicherheits-Commits ergeben immer genau eine Sammelzeile. + +### Stufe 3: Review und Freigabe + +Im Admin: Liste der Entwurfseinträge, pro Eintrag streichen / umformulieren / Rubrik ändern / **artikelwürdig** markieren. Freigabe veröffentlicht den Changelog-Eintrag und aktualisiert den RSS-Feed. Zielaufwand: unter fünf Minuten pro Release. + +### Stufe 4: Artikel-Entwurf + +Für jeden als artikelwürdig markierten Eintrag erzeugt der Generator einen Artikel nach den Vorgaben in Abschnitt 4 und legt ihn als unveröffentlichte Meldung im Newsroom an. Bild wird aus dem Template erzeugt (Logo + „Update" + Monat, zwei bis drei Farbvarianten im Wechsel). Ein echter Screenshot kann manuell ergänzt werden, ist aber keine Voraussetzung. + +**Monatsrückblick:** Liegen am Monatsende mindestens [N] freigegebene Einträge ohne eigenen Artikel vor, schlägt das System einen Sammelartikel „Was ist neu im [Monat]" vor. + +### Stufe 5: Prüfung und Veröffentlichung + +Der Artikel durchläuft die automatisierte Qualitätsprüfung wie jede Kundenmeldung. Freigabe manuell. Erstveröffentlichung auf **einem** Portal (siehe O2); eine Zweitveröffentlichung trägt die Referenzkennzeichnung wie bei Kunden. + +--- + +## 4. Vorgaben für die Generatoren + +### Changelog-Einträge +- Ein bis zwei Zeilen, Nutzersicht, Präsens, Verb am Anfang wo möglich („Zeigt jetzt …", „Behoben: …"). +- Keine Dateinamen, Tabellen, Bibliotheken, Ticket- oder Commit-IDs, keine internen Projektnamen. +- Keine Bewertungen („deutlich schneller", „endlich"), keine Superlative. +- Sicherheit: immer exakt „Sicherheitsverbesserungen eingespielt." +- Sprache Deutsch. Englische Fassung nur, wenn O5 entschieden ist. + +### Newsroom-Artikel +- 300 bis 500 Wörter, Titel ohne Ausrufezeichen, Untertitel mit dem konkreten Nutzen. +- Fester Aufbau in Fließtext, ohne Zwischenüberschriften als Labels: Was ist neu, für wen ist es gedacht, wo findet man es, Verweis auf den Changelog. +- Ton erklärend, aus Sicht des Nutzers, nüchtern. Keine Marketingvokabeln, keine Versprechen über künftige Features. +- Regeln aus „KI-Spuren entfernen" gelten: keine Gedankenstrich-Häufung, keine Dreierfiguren, keine Label-Doppelpunkt-Konstruktionen, keine Nominalisierungsketten. +- Der Artikel darf nur beschreiben, was im freigegebenen Changelog-Eintrag steht. Keine Ausschmückung mit Funktionen, die nicht genannt sind. +- Pressekontakt, Firmenprofil und Rubrik werden fest gesetzt, nicht generiert. + +--- + +## 5. Verteilung in weitere Kanäle + +### Was verteilt wird +Ausschließlich freigegebene Newsroom-Artikel und der Monatsrückblick. Quelle ist der RSS-Feed der Rubrik. Changelog-Einträge haben einen eigenen RSS-Feed für Abonnenten, werden aber nicht in soziale Kanäle gespielt. + +### Kanäle (alle kostenlos) + +| Kanal | Weg | Format | Zweck | +|---|---|---|---| +| Bluesky | n8n, offene API | Kurzfassung bis 300 Zeichen + Link | Deutsche Journalisten und Medienleute, wachsend | +| Mastodon | n8n, offene API | Kurzfassung bis 500 Zeichen + Link | Tech- und Medienpublikum, Nullaufwand | +| LinkedIn-Unternehmensseite pressekonto | n8n oder Buffer Free | Drei Sätze mit Frage am Ende + Link | Präsenz; Reichweite wird getestet, nicht vorausgesetzt | +| E-Mail-Rückblick | Aus dem Monatsartikel, Versand über bestehendes Mailsystem | Monatsartikel als Mail | Retention bei bestehenden Nutzern, nur Opt-in | + +Nicht in der Pipeline: X (API kostenpflichtig), Threads (kein deutsches B2B-Publikum), Kevins persönliches LinkedIn-Profil (E15). + +### Technik +- n8n selbst gehostet (Docker auf dem vorhandenen Mac mini), Workflow: RSS-Trigger → pro Kanal eine Kurzfassung erzeugen → posten → Log. +- Die Kurzfassungen erzeugt der Generator pro Kanal getrennt, mit leicht unterschiedlicher Formulierung. Identischer Text auf drei Plattformen ist als Kreuzposting sofort erkennbar. +- UTM-Schema: `utm_source=&utm_medium=social&utm_campaign=update--`; für die Mail `utm_medium=email`. +- Ein Brand-Account pro Kanal (pressekonto), nicht je Portal. Drei Accounts pflegt niemand, auch nicht automatisch. +- Zugang zur LinkedIn-Seiten-API setzt eine Freigabe der App durch LinkedIn voraus; dauert erfahrungsgemäß. Fallback ist Buffer im kostenlosen Tarif, der die Seite ohne eigene API-Freigabe bedient. + +### Opt-in für den E-Mail-Rückblick +Checkbox im Account: „Monatliche Produkt-Updates per E-Mail erhalten", Standard aus, jederzeit abwählbar, Abmeldelink in jeder Mail. Die Reaktivierungsmails weisen auf die Option hin. Kein Versand an Nutzer ohne gesetzten Haken, auch nicht unter Berufung auf § 7 Abs. 3 UWG. + +--- + +## 6. Adversarial Review + +**Commit-Disziplin ist die Sollbruchstelle.** Die Pipeline ist nur so gut wie die Trailer. Wird ein `Public:`-Satz schlampig geschrieben, steht die Schlamperei öffentlich. Gegenmaßnahme ist die Review-Stufe; die darf nie übersprungen werden, auch nicht bei Mini-Releases. + +**Sicherheits-Leak über die Hintertür.** Ein Fix mit `Changelog: Behoben` statt `Sicherheit` beschreibt die Lücke öffentlich. Regel für den Generator: Enthält der Commit-Titel typische Begriffe (auth, session, token, csrf, xss, injection, permission, escape, sanitize, rate limit), wird der Eintrag automatisch auf **Sicherheit** gesetzt und im Review markiert. Zurückstufen nur bewusst. + +**Der Generator halluziniert Features.** Deshalb die harte Regel, dass nur der Changelog-Eintrag Quelle des Artikels ist. Prüfpunkt im Review: Nennt der Artikel etwas, das nicht im Eintrag steht, wird er verworfen, nicht korrigiert. + +**KI-Kennzeichnung der eigenen Texte.** Die Plattform hat eine Kennzeichnung für KI-erstellte Meldungen. Automatisch erzeugte Eigenartikel sind KI-erstellt. Entweder tragen sie die Kennzeichnung, oder Kevin bearbeitet sie vor der Freigabe so, dass redaktionelle Verantwortung erkennbar übernommen wurde. Beides ist vertretbar; was nicht geht, ist bei Kunden kennzeichnen und bei sich selbst nicht. Siehe O4. +**Entscheidung (O4):** Alle Texte werden vorher bearbeitet und freigegeben. Nichts wird automatisiert online gestellt. + +**EU AI Act, Art. 50 Abs. 4.** Für KI-generierte Texte, die veröffentlicht werden, um die Öffentlichkeit zu informieren, gilt ab August 2026 eine Transparenzpflicht; ausgenommen sind Texte unter menschlicher Überprüfung mit redaktioneller Verantwortung. Die manuelle Freigabe deckt das vermutlich ab, aber die Frage gehört auf die Anwaltsagenda, weil sie dieselbe Mechanik betrifft, mit der Kundenmeldungen gekennzeichnet werden. Keine Rechtsberatung, Einordnung. + +**Dünner Content im eigenen Haus.** 30 Changelog-Einträge im Monat sind gut, 30 Artikel wären das Gegenteil dessen, was gegenüber FMI gerade als Qualitätsmaßstab gesetzt wird. Schwellenwert und Monatsrückblick (E7) sind deshalb keine Komfortregeln, sondern Schutz der Positionierung. + +**Behoben-Einträge als Vertrauensfrage.** Eine lange Behoben-Liste nach dem Relaunch kann wirken wie „da war viel kaputt". Das Risiko ist klein gegenüber dem Gewinn an Glaubwürdigkeit, aber die Formulierung sollte beschreiben, was jetzt funktioniert, nicht was vorher nicht ging. + +**Tote Social-Accounts schaden mehr als keine.** Ein Bluesky-Account mit drei Posts aus dem Vorjahr wirkt wie ein verlassenes Portal. Deshalb E18: Nach drei Monaten ohne messbare Besucher wird der Kanal abgeschaltet und der Account gelöscht, nicht stehen gelassen. + +**Automatisierte Posts erzeugen Rückfragen, die niemand beantwortet.** Wer auf Bluesky unter einem Update-Post eine Frage stellt, erwartet eine Antwort. Entweder prüft Kevin die Kanäle einmal pro Woche, oder die Posts enden mit „Fragen gern per Mail an …" und verweisen auf den Kanal, der tatsächlich gelesen wird. + +**Doppelte Rolle auf LinkedIn.** Eine pressekonto-Unternehmensseite und Kevins persönliches Profil sind getrennte Vorhaben, aber dieselbe Plattform. Die Unternehmensseite darf nicht zum Hilfskanal für die persönliche Marke werden und umgekehrt. Trennung gilt für Inhalte, Tonfall und Verantwortung. + +**Startzustand.** Ein leerer Changelog wirkt wie ein leeres Portal. Vor dem Livegang die Relaunch-Features der letzten Wochen als erste Einträge nachtragen (Backfill, datiert auf die tatsächlichen Deploys, soweit rekonstruierbar). + +--- + +## 7. Offene Punkte — Entscheidungen + +*Antworten des Betreibers vom 04.10. und 09.10.2026.* + +| Nr. | Punkt | Entscheidung | +|---|---|---| +| O1 | Name der Rubrik | **„Portal-Updates“** | +| O2 | Portal der Erstveröffentlichung für Eigenartikel | **Beide Portale**, Erstquelle über die bestehende Canonical-Zuordnung (wie bei Kunden) | +| O3 | Schwellenwert N für den Monatsrückblick | **Ab 5 freigegebenen Einträgen monatlich**, darunter wird der nächste Monat mit eingerechnet (dann alle zwei Monate). Der Rückblick soll nicht wirken, als werde ständig repariert: Er erscheint, wenn es Neuigkeiten gibt; Behobenes nur, wenn es für Nutzer spürbar war, Sicherheitskorrekturen nur als kurze Sammelzeile ohne Einzelheiten (E5, E19) | +| O4 | KI-Kennzeichnung bei automatisch erzeugten Eigenartikeln | **Jeder Artikel wird vom Betreiber überarbeitet und freigegeben**, nichts geht automatisiert online | +| O5 | Englische Fassung | **Vorerst nur Deutsch.** Nach drei Monaten anhand des Anteils englischer Seitenaufrufe in Umami neu entscheiden (setzt Umami im Portal voraus, Roadmap 3.6). Changelog-Zeilen sind kurz, eine spätere Übersetzung ist billig | +| O6 | Bild-Template | Betreiber bereitet es vor: einfaches Template mit Titel, Logo und pressekonto-Farben | +| O7 | Backfill der Relaunch-Features | **Ja.** Quelle: Release-Tags und das Protokoll in `dev/betrieb/git-deploy.md` (beschreibt jedes Release nutzernah) | +| O8 | Art. 50 AI Act | **Auf die Anwaltsagenda** | +| O9 | Accounts Bluesky, Mastodon, LinkedIn-Unternehmensseite | In die Roadmap (nach dem ersten Artikel) | +| O10 | n8n und Workflow RSS → Kanäle, LinkedIn-API oder Buffer Free | In die Roadmap (nach O9) | +| O11 | Opt-in-Checkbox für den E-Mail-Rückblick | **Ja.** Vorher mit den bestehenden Abmelde- und Sperrlisten abgleichen und festlegen, welche Liste für welche Mailart gilt | +| O12 | Wer beantwortet Rückfragen in den Social-Kanälen | **Jeder Post endet mit „Fragen gern per Mail an …“**; kein wöchentlicher Kanalcheck nötig | +| O13 | Impressum in den Social-Profilen | **Ja**, Link auf das Impressum von pressekonto | + +**Ergänzende Entscheidungen 09.10.2026** + +| Nr. | Entscheidung | +|---|---| +| E19 | Tonfall: Changelog und Rückblick zeigen Neuigkeiten, kein Reparaturprotokoll. Behobenes erscheint nur, wenn es für Nutzer spürbar war, und beschreibt, was jetzt funktioniert. Sicherheitskorrekturen nur als Sammelzeile „Sicherheitsverbesserungen eingespielt.“ | +| E20 | Commit-Trailer `Changelog:`/`Public:` gelten **ab sofort** (ab v1.8), auch bevor die Pipeline gebaut ist — was nicht gekennzeichnet wird, muss später von Hand rekonstruiert werden | +| E21 | Stufe 2 dockt in `dev/betrieb/deploy.sh` nach `up` an, **nicht** als Ploi-Hook (die Ploi-Hooks sind bewusst aus, `git-deploy.md` „Später: Changelog“) | + +## 8. Revisit-Bedingungen + +- Wenn die Review-Stufe regelmäßig länger als zehn Minuten pro Release dauert: Trailer-Konvention vereinfachen oder Generator-Vorgaben nachschärfen. +- Wenn mehr als zwei Artikel im Monat entstehen: Schwellenwert anheben. +- Wenn eigene Artikel das Scoring nicht bestehen: zuerst das Scoring prüfen, dann die Vorgaben. +- Wenn Nutzer den Changelog nachweislich nicht aufrufen (Zugriffe über drei Monate nahe null): „Neu"-Hinweis im Admin prüfen, nicht den Changelog einstellen. +- Wenn O4/O8 anders ausgeht als angenommen: Artikel-Generator pausieren, bis die Kennzeichnung geklärt ist. +- Drei Monate nach dem ersten verteilten Artikel: UTM-Auswertung je Kanal. Kanäle ohne messbare Besucher werden abgeschaltet und die Accounts gelöscht. +- Wenn ein Kanal kostenpflichtig wird oder seine API schließt: Kanal verlassen, nicht bezahlen. +- Wenn die Opt-in-Quote für den E-Mail-Rückblick nach sechs Monaten unter [X] % der aktiven Nutzer liegt: Platzierung der Checkbox prüfen, nicht den Standard auf „an" setzen. + +--- + +## 9. Anti-Zombie-Check + +| Grundsatz | Erfüllt? | Anmerkung | +|---|---|---| +| Keine versteckten Kosten | Ja | Keine Kostenfolge für Nutzer, keine laufenden Kosten für Kevin (E14) | +| Transparenz | Ja, verstärkt | Öffentlicher, datierter Changelog ist Transparenz in Reinform | +| Kein Dauerbetreuungsaufwand | Ja, wenn Pipeline steht | Review unter fünf Minuten pro Release; Verteilung läuft ohne Eingriff; offen bleibt O12 | +| Keine Vermischung von Eigen- und Kundeninteresse | Ja, bei E8 und E10 | Eigene Rubrik, gleicher Prüfweg | +| Keine ungefragte Kommunikation | Ja, bei E16 und E17 | Opt-in standardmäßig aus; Pressekontakt-Mails bleiben informativ | +| Ehrlichkeit über die eigene Arbeitsweise | Offen, O4 | KI-Kennzeichnung der eigenen Texte muss konsistent zur Kundenregel sein | diff --git a/dev/git-deploy-monitoring/01-git-deploy.md b/dev/git-deploy-monitoring/01-git-deploy.md new file mode 100644 index 00000000..348bf4a7 --- /dev/null +++ b/dev/git-deploy-monitoring/01-git-deploy.md @@ -0,0 +1,261 @@ +# 01 — Git-Deploy per Tag + +Ausgeliefert wird ein **Git-Tag**, nie ein Branch-Stand. Das Live-Verzeichnis ist +ein Git-Checkout dieses Tags. Ein Skript (`vorlagen/deploy.sh`) führt den Deploy +von Hand per SSH aus und bricht ab, **bevor** es etwas verändert, wenn etwas nicht +stimmt. + +Erprobt mit: Ploi-verwaltetem Ubuntu-Server, PHP-FPM 8.4, Nginx, Supervisor, +MySQL, Forgejo als Git-Server. Läuft genauso mit Forge, plain VPS, GitHub/GitLab. + +--- + +## Grundsätze + +- **Nur Tags** (`vX.Y.Z`, SemVer): Feature-Release erhöht die mittlere Stelle, + Hotfix die letzte. Die Tag-Nachricht ist die Release-Notiz (Inhalt, Migrationen, + neue `.env`-Werte, genauer Deploy-Befehl). +- **Deploy nur von Hand** per SSH. Push-Webhooks und „Quick Deploy“ im + Server-Panel bleiben aus — ein Push ist noch kein Release. +- **Assets lokal bauen und committen** (`public/build` versioniert). Auf dem + Server gibt es kein Node. Vite benennt Dateien nach Inhalt — ohne + Frontend-Änderung kein Diff. +- **Auf dem Server wird nichts von Hand geändert.** Das Skript bricht ab, sobald + der Checkout vom Tag abweicht. Auch Hotfixes laufen über Commit → Tag → Deploy. +- **Kein `git clean` auf Live.** `.env`, `storage/`, `vendor/`, `RELEASE`, + `public/storage` sind ignoriert und bleiben unberührt. +- **Deploy im selben Verzeichnis** mit `php artisan down` (Sekunden), keine + Release-Verzeichnisse — `storage/app` bleibt an seinem Ort. +- **Migrationen sind additiv.** Der alte Code muss mit dem neuen Schema laufen; + dann ist der Rollback einfach der vorherige Tag. Kein `migrate:rollback` auf Live. + +--- + +## Voraussetzungen im Repository + +`.gitignore` muss enthalten bzw. darf **nicht** enthalten: + +```gitignore +/RELEASE # schreibt deploy.sh beim Deploy +/.env +/vendor +/node_modules +/public/hot +/public/storage +/storage/*.key +# NICHT ignorieren: /public/build (wird versioniert) +``` + +Prüfen, ob ein Muster versehentlich echte Dateien trifft (macOS-Muster wie +`Icon` treffen bei `core.ignorecase=true` auch `…/icon/`): + +```bash +git ls-files --others --ignored --exclude-standard | grep -v -E '^(vendor|node_modules|storage)/' | head -50 +``` + +Version in der App: `vorlagen/laravel/app/Support/Monitoring/Release.php` plus + +```php +// config/app.php +'version' => App\Support\Monitoring\Release::current(env('APP_VERSION')), +``` + +`deploy.sh` nach `dev/betrieb/deploy.sh` (oder anders, dann `DEPLOY_SCRIPT` +im Skript anpassen) und die Einstellungen oben setzen: + +```bash +DEPLOY_SCRIPT="dev/betrieb/deploy.sh" # Pfad im Repository +PHP_FPM_SERVICE="php8.4-fpm" # systemd-Name +ABOUT_SECTION="" # Abschnitt aus AboutCommand::add, leer = RELEASE ausgeben +QUEUE_PROBE=1 # 0, wenn das Projekt keine Queue hat +``` + +`QUEUE_PROBE=1` setzt `monitoring:queue-probe` voraus (03). + +--- + +## A — Einmalig: Server-Zugang zum Git-Server + +Auf dem Server als App-Benutzer (bei Ploi `ploi`): + +1. `git --version` +2. Deploy-Key erzeugen und im Git-Server **nur lesend** am Repository eintragen: + + ```bash + ssh-keygen -t ed25519 -f ~/.ssh/deploy_meineapp -N "" -C "meineapp-live" + cat ~/.ssh/deploy_meineapp.pub + ``` + +3. `~/.ssh/config`: + + ``` + Host git.example.com + Port 222 + User git + IdentityFile ~/.ssh/deploy_meineapp + IdentitiesOnly yes + ``` + +4. Host-Key aufnehmen, Fingerprint mit dem im Git-Server angezeigten vergleichen: + + ```bash + ssh-keyscan -p 222 git.example.com >> ~/.ssh/known_hosts + ssh-keygen -lf <(ssh-keyscan -p 222 git.example.com 2>/dev/null) + ``` + +5. Test: `git ls-remote ssh://git@git.example.com:222/team/meineapp.git` zeigt die Tags. +6. **FPM-Reload ohne Passwort testen** (Ploi erlaubt das dem Benutzer `ploi`): + + ```bash + ps -o pid,lstart,args -C php-fpm8.4 | head -3 + echo "" | sudo -S service php8.4-fpm reload; echo "Exit: $?" + sleep 2; ps -o pid,lstart,args -C php-fpm8.4 | head -3 + ``` + + Exit 0, `master process` mit gleicher PID, `pool www` neu → das Skript lädt + FPM selbst. Fragt `sudo` nach einem Passwort: beim Deploy + `DEPLOY_FPM_RELOAD=` setzen, das Skript wartet dann auf Enter, bis FPM im + Panel neu geladen ist. **Immer Reload, nie Restart** — Restart entfernt kurz + den Socket, Nginx liefert 502. +7. **Supervisor und Worker prüfen:** `systemctl is-enabled supervisor` → `enabled`; + im Panel ein Worker mit `php artisan queue:work --queue= --tries=3 --max-time=3600`. + +## B — Einmalig: Live-Verzeichnis zum Checkout machen + +### B1 — Neues Projekt + +```bash +cd ~ && git clone ssh://git@git.example.com:222/team/meineapp.git meineapp.de +cd meineapp.de && git checkout --detach v1.0.0 +cp /pfad/zur/.env .env && composer install --no-dev --optimize-autoloader +echo v1.0.0 > RELEASE && php artisan migrate --force && php artisan config:cache +``` + +### B2 — Bestehendes Verzeichnis (bisher SFTP o. Ä.) an Ort und Stelle umwandeln + +Erst ein Tag `vA` erstellen, der **genau** dem Live-Stand entspricht. + +```bash +cd ~ && tar czf backup-vor-git.tgz --exclude=./storage --exclude=./node_modules -C ~/meineapp.de . +cd ~/meineapp.de +git init -q +git remote add origin ssh://git@git.example.com:222/team/meineapp.git +git fetch --tags origin +git update-ref --no-deref HEAD "$(git rev-parse 'vA^{commit}')" +git read-tree HEAD # Index = Tag, Dateien bleiben unangetastet +git status --porcelain # Abweichungen sichten +``` + +| Zeile | Bedeutung | Vorgehen | +|---|---|---| +| ` M datei` | Live weicht vom Tag ab | `git diff -- datei`. Fehlt die Änderung im Repository: erst lokal nachziehen, neuer Tag. Sonst Altstand, wird überschrieben | +| ` D datei` | fehlt auf Live | meist Entwicklerdatei; der Checkout legt sie an | +| `?? datei` | nur auf Live | **nicht löschen** — nach `~/vor-git/` verschieben oder in `.gitignore` aufnehmen (neuer Tag) | + +Bekannte Funde: fehlende `.gitignore` auf Live (dann erscheinen `.env`, +`vendor/` als `??` — verschwinden nach dem Checkout), per SFTP gelöschte +Altdateien, Pfade mit Umlauten (Git setzt sie in Anführungszeichen — beim +Filtern mit `grep` beachten). + +Wenn nichts Unerklärtes übrig ist: + +```bash +git checkout -q -f --detach vA +git status --porcelain # muss leer sein +``` + +Beim ersten Deploy existiert `deploy.sh` evtl. noch nicht im Live-Stand: + +```bash +git show vB:dev/betrieb/deploy.sh > /tmp/deploy.sh && bash /tmp/deploy.sh vB +``` + +--- + +## C — Release lokal (jedes Mal) + +```bash +# 1. sauber und grün +git status # nichts offen +php artisan test --compact --parallel && vendor/bin/phpstan analyse + +# 2. Assets bauen und committen +npm ci && npm run build +git add public/build +git diff --cached --quiet public/build || git commit -m "build: Assets für vX.Y.Z" + +# 3. Tag mit Release-Notiz, pushen (Tags mitnehmen!) +git tag -a vX.Y.Z -m "vX.Y.Z — + +Deploy: , + bash dev/betrieb/deploy.sh vX.Y.Z [--migrations]" +git push origin main --follow-tags +``` + +## D — Deploy (jedes Mal, auf dem Server) + +1. Bringt der Tag Migrationen mit: **DB-Backup**. +2. Neue `.env`-Werte laut Release-Notiz vorher eintragen. +3. Deploy: + + ```bash + cd ~/meineapp.de + bash dev/betrieb/deploy.sh vX.Y.Z # ohne Migrationen + bash dev/betrieb/deploy.sh vX.Y.Z --migrations # mit Migrationen + ``` + +Ablauf im Skript: + +| Schritt | Bei Fehler | +|---|---| +| Arbeitsverzeichnis sauber? | Abbruch, nichts verändert | +| `git fetch --tags`, Tag vorhanden? | Abbruch, nichts verändert | +| Neue Migrationen? Ohne `--migrations` | Abbruch, nichts verändert | +| `down` → Checkout → `RELEASE` → `composer install` → `migrate` → Livewire-Assets → Caches → `queue:restart` → FPM-Reload → `up` | Seite bleibt im Wartungsmodus, Skript nennt den Rollback-Befehl | +| Version ausgeben | — | +| `monitoring:queue-probe --wait=60` | **Exit 3**: live, aber kein Worker — Supervisor/Worker prüfen | + +Optionen: `--clear-schedule` (setzt `withoutOverlapping`-Sperren zurück, nur +wenn sich Sperrdauern geändert haben). Lange Migrationen: +`DB_LOCK_WAIT_TIMEOUT=300 bash dev/betrieb/deploy.sh vX.Y.Z --migrations`. + +Exit-Codes: `0` fertig · `1` abgebrochen · `2` falscher Aufruf · `3` kein Worker. + +Hinweis: Das Skript läuft aus einer Kopie des **vorher** ausgecheckten Stands +(Bash liest Skripte stückweise, Git ersetzt die Datei beim Checkout). Neue +Schritte im Skript greifen also erst beim übernächsten Deploy — beim +einführenden Deploy von Hand nachholen. + +4. Prüfen: `/health` mit Token zeigt `"version":"vX.Y.Z"`, Uptime Kuma grün, + GlitchTip ohne neue Einträge, Logs ohne neue Fehler. + +## E — Rollback + +```bash +bash dev/betrieb/deploy.sh +``` + +Baut `vendor/` und Caches für den alten Tag neu auf. Nur bei Datenproblemen +das DB-Backup einspielen. + +--- + +## Fallstricke + +- **FPM-Restart statt Reload** → 502 für Sekunden (Nginx: `connect() to unix:…fpm.sock failed`). + Einzelne `recv() failed (104: Connection reset by peer)` genau zum Deploy-Zeitpunkt + sind normal (laufende Anfragen beim Reload). Abhilfe wäre + `process_control_timeout = 10s` im Abschnitt `[global]` von + `/etc/php/8.4/fpm/php-fpm.conf` (root) — **nie in die Pool-Datei** (`www.conf`), + dort ist der Schlüssel unbekannt und FPM startet nicht mehr. +- **Supervisor gestoppt** → `queue:restart` beendet den Worker, niemand startet + ihn neu. Deshalb die Worker-Prüfung am Ende. Notlösung ohne sudo: + `nohup php artisan queue:work --tries=3 --max-time=3600 >> storage/logs/worker-manual.log 2>&1 &` +- **Nie `queue:retry all`** nach Ausfällen: alte Jobs tragen den Stand ihrer + Klasse von damals und scheitern oder verschicken veraltete Mails. Erst + `queue:failed` ansehen, gezielt `queue:retry `. +- **Push ohne Tags** → `deploy.sh` findet den Tag nicht. Immer `--follow-tags`. +- **`RELEASE` nicht von Hand neu erzeugen** auf einem anderen Stand als dem Tag + (ergibt `vX.Y.Z-3-gabc-dirty`). Das Skript schreibt sie. +- **Server-Panel-Logs**: Ploi führt für Sites kein Nginx-Zugriffsprotokoll; + das Fehlerlog `/var/log/nginx/-error.log` ist für `ploi` lesbar. diff --git a/dev/git-deploy-monitoring/02-fehlerprotokoll-glitchtip.md b/dev/git-deploy-monitoring/02-fehlerprotokoll-glitchtip.md new file mode 100644 index 00000000..04aa6c2f --- /dev/null +++ b/dev/git-deploy-monitoring/02-fehlerprotokoll-glitchtip.md @@ -0,0 +1,300 @@ +# 02 — Fehlerprotokoll mit GlitchTip + +GlitchTip ist ein selbst gehostetes, Sentry-kompatibles Fehlerprotokoll. Die App +spricht es über die **offiziellen Sentry-SDKs** an (`sentry/sentry-laravel`, +`@sentry/browser`); ohne DSN sind beide ein No-op. Gleiche Fehler werden zu +einem Eintrag gruppiert (Häufigkeit, betroffene URLs, Release), gemeldet wird +nur ein neuer Fehlertyp. + +--- + +## 1. GlitchTip-Server (einmalig, für alle Projekte) + +Vorlage: `vorlagen/server/glitchtip-compose.yml` (GlitchTip 6, Postgres 18, +Valkey; gegen die offizielle `compose.sample.yml` abgleichen). + +1. `SECRET_KEY` (`openssl rand -hex 32`), `GLITCHTIP_DOMAIN`, `EMAIL_URL`, + `DEFAULT_FROM_EMAIL` setzen. Aufbewahrung: `GLITCHTIP_RETENTION_DAYS` + (Standard 90 — ältere Versionen hießen `GLITCHTIP_MAX_EVENT_LIFE_DAYS`). +2. `docker compose -f glitchtip-compose.yml up -d`, Reverse Proxy mit TLS + (`vorlagen/server/Caddyfile`). +3. Erstes Konto anlegen, danach `ENABLE_USER_REGISTRATION: "False"`, neu starten. +4. Organisation anlegen (Slug merken, z. B. `meine-org`). + +## 2. Je Projekt: zwei GlitchTip-Projekte + +| Projekt | Plattform | `.env` | +|---|---|---| +| `-server` | PHP / Laravel | `SENTRY_LARAVEL_DSN` | +| `-browser` | JavaScript | `SENTRY_BROWSER_DSN` | + +Getrennt, weil Browserfehler (Erweiterungen, alte Browser) eine andere +Qualität haben als Serverfehler. Je Projekt eine **Alert-Regel**: Mail bei +neuem Fehlertyp, wenn möglich nur für Umgebung `production`. + +Umgebungen: `SENTRY_ENVIRONMENT=production` auf Live, `local` lokal. Lokal die +DSN nur zum Testen setzen. + +--- + +## 3. Laravel-Anbindung (Server) + +```bash +composer require sentry/sentry-laravel +``` + +Dateien aus `vorlagen/laravel/` kopieren: + +| Datei | Zweck | +|---|---| +| `config/sentry.php` | gehärtete Konfiguration (ersetzt die veröffentlichte) | +| `app/Support/Monitoring/ErrorReportScrubber.php` | `before_send`: nur User-ID, Tokens/Signaturen aus URL/Query/Referer, E-Mails aus Meldungen | +| `app/Support/Monitoring/Release.php` | Version aus `APP_VERSION` oder Datei `RELEASE` | +| `app/Support/Monitoring/ErrorSignal.php` | Warnung ohne Exception, gedrosselt (5 je 10 min und Ort) | +| `app/Http/Middleware/ReportErrorSignals.php` | 404 mit eigenem Referrer, 403/429 für Angemeldete, 419 | + +`bootstrap/app.php`: + +```php +use App\Http\Middleware\ReportErrorSignals; +use Sentry\Laravel\Integration; +use Symfony\Component\Console\Exception\CommandNotFoundException; + + ->withMiddleware(function (Middleware $middleware): void { + // Fehler ohne Exception (toter interner Link, 403/429 für Angemeldete, 419) — + // global, weil 404 vor dem Routing entsteht + $middleware->append(ReportErrorSignals::class); + }) + ->withExceptions(function (Exceptions $exceptions): void { + // Gemeldete Exceptions an GlitchTip (ohne DSN ein No-op); + // Laravels dontReport (404, Validierung, Auth) gilt weiter + Integration::handles($exceptions); + + // Vertippte artisan-Befehle sind kein Anwendungsfehler + $exceptions->dontReport(CommandNotFoundException::class); + }) +``` + +`config/app.php`: + +```php +'version' => App\Support\Monitoring\Release::current(env('APP_VERSION')), +``` + +`config/sentry.php` liest `release` aus derselben Quelle. + +### Was die gehärtete `config/sentry.php` anders macht + +| Option | Wert | Warum | +|---|---|---| +| `send_default_pii` | `false` (fest) | keine IP, keine Cookies, keine Header mit Personenbezug | +| `max_request_body_size` | `never` | Formular- und JSON-Inhalte verlassen den Server nie | +| `before_send` | `ErrorReportScrubber::beforeSend` | User-ID statt Person, Tokens raus, E-Mails → `[email]` | +| `breadcrumbs.logs`, `breadcrumbs.cache` | `false` | Lognachrichten tragen oft E-Mail-Adressen | +| `enable_metrics` | `false` | versteht GlitchTip nicht | +| `ignore_transactions` | `/up`, `/health` | Monitor-Aufrufe sind kein Signal | + +**Je Projekt anpassen:** `ErrorReportScrubber::AllowedQueryParameters` — welche +Query-Parameter unverändert mitgehen dürfen (`utm_*` immer). Dieselbe Liste +steht in `error-reporting.js`. + +--- + +## 4. Browserfehler + +```bash +npm install @sentry/browser +``` + +| Datei | Zweck | +|---|---| +| `resources/js/error-reporting.js` | hört auf `error` und `unhandledrejection`; lädt das SDK erst beim ersten Fehler (1,5 kB statt 32 kB auf fehlerfreien Seiten); filtert URLs und E-Mails | +| `resources/js/error-reporting-sdk.js` | Re-Export der benötigten SDK-Funktionen (Tree-Shaking) | +| `resources/views/components/monitoring/browser-errors.blade.php` | `` mit DSN, Release, User-ID, Bereich — nur mit `SENTRY_BROWSER_DSN` | + +Vite-Eingang ergänzen (`vite.config.js`, `input`): + +```js +input: ['resources/css/app.css', 'resources/js/app.js', 'resources/js/error-reporting.js'], +``` + +Im `` jedes Layouts (Build-Ordner und Bereich anpassen): + +```blade + +``` + +`area` erscheint in GlitchTip als Tag (z. B. `web`, `portal`, `auth`). + +`config/monitoring.php` aus der Vorlage liefert `monitoring.browser.dsn`. + +--- + +## 5. Tests — nie an das echte GlitchTip melden + +`phpunit.xml`: + +```xml + + + + +``` + +Tests aus der Vorlage: `tests/Feature/Monitoring/ErrorReportingTest.php` +(Datenschutzfilter, Wächtertest „the test suite never reports to the real +glitchtip“), `ErrorSignalsTest.php`, `BrowserErrorReportingTest.php`, +`tests/Unit/Monitoring/ReleaseTest.php`. Ereignisse fängt +`tests/Support/FakeGlitchTip.php` ab (`FakeGlitchTip::install()`). + +Die Tests setzen `RefreshDatabase` voraus (in `tests/Pest.php` aktivieren) und +eine `User`-Factory. + +### Testdatenbank absichern (vor `RefreshDatabase`!) + +`RefreshDatabase` führt `migrate:fresh` aus und **löscht alle Tabellen** der +Datenbank, auf die die Tests zeigen. In einer frischen Laravel-Installation +sind die SQLite-Zeilen in `phpunit.xml` auskommentiert, und ohne `force="true"` +haben vorhandene Umgebungsvariablen (Docker-/Container-`environment`, CI) Vorrang +vor `phpunit.xml` und `.env`. So hat am 07.10.2026 das Testen dieser Vorlagen +in einem Demo-Projekt die lokale Datenbank eines anderen Projekts geleert, das +im selben Container lief. + +`phpunit.xml`, im ``-Block: + +```xml + + + + + + +``` + +Guard in `tests/TestCase.php` — `setUpTraits()` läuft vor jedem +Datenbank-Trait und bricht ab, bevor etwas geleert wird (auch bei einem +gecachten `bootstrap/cache/config.php`): + +```php +protected function setUpTraits(): array +{ + $default = (string) \Illuminate\Support\Facades\DB::getDefaultConnection(); + $connection = (array) config('database.connections.'.$default, []); + + if (! empty($connection['url']) + || ($connection['driver'] ?? null) !== 'sqlite' + || ($connection['database'] ?? null) !== ':memory:') { + throw new \RuntimeException("Tests laufen nicht gegen SQLite :memory: ({$default}) — abgebrochen, bevor RefreshDatabase etwas leert."); + } + + return parent::setUpTraits(); +} +``` + +Wer Vorlagen in einem Wegwerf-Projekt ausprobiert, startet die Tests +zusätzlich explizit mit `DB_CONNECTION=sqlite DB_DATABASE=:memory: php artisan test`. + +--- + +## 6. Regeln für den Code + +- **Keine variablen Zahlen in Fehlermeldungen**, wenn sie gruppiert werden + sollen — GlitchTip gruppiert nach Text. Variable Werte in den Kontext oder + einen Fingerprint setzen (Muster: `ErrorSignal`). +- **Vorübergehende Fremdfehler nicht einzeln melden** (Timeouts, 5xx, 429 von + externen APIs): einmal wiederholen, dann `Log::warning`; Alarm erst, wenn ein + Lauf abbricht oder die Mehrheit scheitert. Muster: + + ```php + try { + $response = Http::timeout(20) + ->retry(2, 3000, fn (Throwable $e) => $e instanceof ConnectionException + || ($e instanceof RequestException && ($e->response->serverError() || $e->response->status() === 429)), + throw: false) + ->post($url, $payload); + } catch (ConnectionException $e) { + throw new ServiceTemporarilyUnavailable('… nicht erreichbar', previous: $e); // eigene Klasse + } + // Aufrufer: catch (ServiceTemporarilyUnavailable) → Log::warning, sonst report() + ``` + +- **Keine Personenbezüge** in Meldungen bauen; der Filter ist das Netz, nicht der Plan. + +--- + +## 7. Auswertung per API (für Entwickler und KI-Chats) + +Lese-Token in GlitchTip (Profil ▸ Auth Tokens): Scopes `project:read`, +`event:read` — **kein** Schreibrecht. Lokal als `GLITCHTIP_API_TOKEN` in die +`.env`, nie ausgeben, nie committen. Ohne `org:read` liefert die +Organisationsliste 403; Projekte und Issues funktionieren. + +```bash +T=$(grep -E "^GLITCHTIP_API_TOKEN=" .env | cut -d= -f2- | tr -d "'\"") +B=https://errors.example.com/api/0 +ORG=meine-org + +# Projekte (IDs) +curl -s -H "Authorization: Bearer $T" "$B/projects/" | python3 -c " +import json,sys; [print(p['id'], p['slug']) for p in json.load(sys.stdin)]" + +# Offene Einträge eines Projekts, nur Live +curl -s -H "Authorization: Bearer $T" \ + "$B/organizations/$ORG/issues/?project=1&query=is:unresolved&environment=production&limit=100" \ +| python3 -c " +import json,sys +for i in json.load(sys.stdin): + print(i['id'], i['count'], i['firstSeen'][:16], i['lastSeen'][:16], '|', (i['title'] or '')[:100])" + +# Letztes Ereignis: Umgebung, Release, URL, Stacktrace +curl -s -H "Authorization: Bearer $T" "$B/issues//events/latest/" | python3 -c " +import json,sys +e=json.load(sys.stdin); t={x['key']:x['value'] for x in e.get('tags',[])} +print('env:',t.get('environment'),'| release:',t.get('release'),'| area:',t.get('area')) +for en in e.get('entries',[]): + if en['type']=='exception': + for v in en['data'].get('values',[]): + print('EXC',v.get('type'),':',(v.get('value') or '')[:300]) + for f in ((v.get('stacktrace') or {}).get('frames') or [])[-8:]: + print(' ',f.get('filename'),f.get('function'),f.get('lineNo')) + if en['type']=='request': print('REQ',en['data'].get('url')) + if en['type']=='breadcrumbs': + for b in en['data'].get('values',[])[-6:]: print('BC',b.get('category'),(b.get('message') or '')[:120])" +``` + +### Ablauf „schau in GlitchTip“ + +1. Offene Einträge beider Projekte abrufen, zuerst `environment=production`. +2. Einordnen: + + | Klasse | Erkennen | Vorgehen | + |---|---|---| + | Test-/Entwicklungsrauschen | Umgebung `local`, Texte aus Tests | nichts am Code; auflösen | + | Bedienfehler am Server | z. B. `CommandNotFoundException` | `dontReport` | + | Externer Dienst vorübergehend | Timeouts/5xx fremder APIs | Muster aus Abschnitt 6 | + | Echter Bug | Stacktrace in `app/`, `resources/`, Browserfehler mit eigener URL | roter Test → Fix → Deploy | + | Unklar | z. B. `Error: [object Object]` | Erfassung verbessern, nächstes Auftreten abwarten | + +3. Bei Browserfehlern zeigen die Frames oft nur `livewire.min.js` — der Hinweis + steckt im Funktionsnamen (`[Alpine] __('…')` = Alpine-Ausdruck) → in + `resources/views` danach suchen. Kann ein Muster wiederkommen: Wächtertest + über alle Dateien. +4. Fix ausliefern (Hotfix-Tag), danach in GlitchTip auflösen (von Hand — + Token ist nur lesend). Kommt der Fehler mit neuem Release wieder, öffnet + GlitchTip den Eintrag neu. +5. **Breadcrumbs lesen**: Sie zeigen die SQL-Abfragen vor dem Fehler — oft + erkennt man daran Job, Modell und Datensatz (z. B. `failed_jobs`-Insert → + Fehler in einem Queue-Job; `payload.createdAt` verrät alte Jobs). + +Im Projekt eine Kurzfassung mit den echten Werten (Instanz, Org-Slug, +Projekt-IDs) unter `dev/glitch-tip/README.md` ablegen und in `CLAUDE.md` +verweisen — dann finden KI-Chats sie automatisch. + +--- + +## 8. Datenschutz (vor dem Einschalten) + +- Datenschutzerklärung: Fehlerprotokollierung (Dienst selbst gehostet, + Kategorien: User-ID, URL, Browser, Fehlermeldung; Frist = Aufbewahrung in + GlitchTip, z. B. 90 Tage; Rechtsgrundlage berechtigtes Interesse am sicheren Betrieb). +- Kein Auftragsverarbeiter, wenn GlitchTip auf eigenem Server läuft (Hoster ggf. AVV). diff --git a/dev/git-deploy-monitoring/03-betriebsueberwachung.md b/dev/git-deploy-monitoring/03-betriebsueberwachung.md new file mode 100644 index 00000000..d1cfc19e --- /dev/null +++ b/dev/git-deploy-monitoring/03-betriebsueberwachung.md @@ -0,0 +1,222 @@ +# 03 — Betriebsüberwachung: /health, Herzschlag, Worker, Alarme, Uptime Kuma + +GlitchTip (02) sieht nur Fehler, die PHP noch melden kann. Dieser Teil deckt den +Rest ab: Scheduler steht, Worker steht, Platte voll, Server weg — und meldet es +aufs Handy. + +--- + +## 1. Bausteine in der App + +Dateien aus `vorlagen/laravel/` kopieren: + +| Datei | Zweck | +|---|---| +| `config/monitoring.php` | Alarme (Mail, ntfy), Browser-DSN, Health-Token, Schwellen | +| `app/Support/OperationalAlert.php` | Alarm: immer `Log::critical` (Kanal `monitoring`), dazu Text-Mail und ntfy — unabhängig voneinander, Best-Effort | +| `app/Services/Monitoring/HealthProbe.php` | Prüfungen DB, Cache, Queue-Rückstau, Scheduler-Herzschlag, Plattenplatz | +| `app/Http/Controllers/HealthController.php` | `GET /health` mit Token → JSON, 200 oder 503 | +| `app/Console/Commands/MonitoringHeartbeat.php` | `monitoring:heartbeat`, minütlich vom Scheduler | +| `app/Console/Commands/MonitoringQueueProbe.php` + `app/Jobs/Monitoring/QueueProbe.php` | `monitoring:queue-probe`: Test-Job, wartet bis zum Abholen (Ende von `deploy.sh`) | +| `tests/Feature/Monitoring/HealthEndpointTest.php`, `QueueProbeTest.php` | Tests | + +Log-Kanal `monitoring` in `config/logging.php` ergänzen (eigene Datei, rotierend): + +```php +'monitoring' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/monitoring.log'), + 'level' => 'debug', + 'days' => 14, +], +``` + +### Verdrahtung + +`bootstrap/app.php` — Route außerhalb der `web`-Gruppe (keine Session, kein CSRF): + +```php +use App\Http\Controllers\HealthController; +use Illuminate\Support\Facades\Route; + + ->withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + then: function (): void { + // Tiefer Health-Check für den externen Monitor + Route::get('/health', HealthController::class) + ->middleware('throttle:30,1') + ->name('health.deep'); + }, + ) +``` + +Hat das Projekt Basic Auth (Staging) oder eine Host-Whitelist (`trustHosts`): +`/health` von Basic Auth ausnehmen (der Monitor schickt seinen eigenen +`Authorization`-Header) und IP/`localhost` als Host zulassen. + +`routes/console.php`: + +```php +use App\Console\Commands\MonitoringHeartbeat; +use App\Support\OperationalAlert; +use Illuminate\Console\Scheduling\Event; +use Illuminate\Support\Facades\Schedule; + +// Betriebs-Alert, wenn ein geplanter Task fehlschlägt — an JEDEN Task hängen +$alertOnFailure = fn (string $task) => function (Event $event) use ($task): void { + OperationalAlert::send("Geplanter Task fehlgeschlagen: {$task}", ['exit_code' => $event->exitCode]); +}; + +// Herzschlag: fällt der Scheduler aus (Cron weg, Server hängt), greift kein +// onFailure mehr — dann meldet /health den fehlenden Herzschlag +Schedule::command(MonitoringHeartbeat::class) + ->everyMinute() + ->withoutOverlapping(2) + ->onFailure($alertOnFailure('monitoring:heartbeat')); + +// Fehlgeschlagene Jobs nach 30 Tagen entfernen +Schedule::command('queue:prune-failed', ['--hours=720']) + ->dailyAt('03:55') + ->withoutOverlapping(30) + ->onFailure($alertOnFailure('queue:prune-failed')); +``` + +Bei allen eigenen Tasks: `withoutOverlapping()` mit **kurzer** Sperrdauer +(Standard wäre 24 h — ein abgestürzter Lauf blockiert sonst einen Tag) und +`->onFailure($alertOnFailure(''))`. + +`app/Providers/AppServiceProvider.php` → `boot()`: + +```php +use App\Support\OperationalAlert; +use Illuminate\Foundation\Console\AboutCommand; +use Illuminate\Queue\Events\JobFailed; +use Illuminate\Support\Facades\Queue; + + // Betriebs-Alert bei endgültig fehlgeschlagenem Queue-Job + Queue::failing(function (JobFailed $event): void { + OperationalAlert::send("Queue-Job fehlgeschlagen: {$event->job->resolveName()}", [ + 'connection' => $event->connectionName, + 'queue' => $event->job->getQueue(), + 'exception' => $event->exception->getMessage(), + ]); + }); + + // Ausgelieferte Version in `php artisan about` (Abschnitt-Name = ABOUT_SECTION in deploy.sh) + AboutCommand::add('App', fn (): array => ['Version' => config('app.version') ?? '—']); +``` + +### Die Prüfungen von `/health` + +| Prüfung | `critical` (→ 503) | `warn` (200) | +|---|---|---| +| `database` | `select 1` scheitert | — | +| `cache` | Schreiben/Lesen scheitert | — | +| `queue` | ältester wartender Job ≥ `MONITORING_QUEUE_BACKLOG_SECONDS` (300) — nur Treiber `database` | — | +| `scheduler` | kein Herzschlag oder ≥ 10 min alt | ≥ 3 min alt | +| `disk` | freier Platz < `MONITORING_DISK_MIN_FREE_PERCENT` (10 %) | < 20 % | + +Ohne konfiguriertes `MONITORING_HEALTH_TOKEN` gibt es den Endpunkt nicht (404), +falsches Token → 404. Token im Header `Authorization: Bearer …` oder `?token=`. +Antwort enthält `version`. + +Der Herzschlag liegt in `storage/framework/scheduler-heartbeat` (übersteht +`cache:clear`, keine Migration). **Mehrere App-Server:** stattdessen eine +DB-Zeile, sonst prüft jeder Server nur seine eigene Datei. + +Andere Queue-Treiber (Redis, SQS): `queue`-Prüfung meldet „nicht prüfbar“; +dann eine eigene Prüfung ergänzen (z. B. `Queue::size()` plus Alter des +ältesten Jobs) oder Horizon-Status abfragen. + +--- + +## 2. ntfy — Push aufs Handy + +Server einmalig: `vorlagen/server/ntfy-compose.yml` + `ntfy-server.yml` +(`auth-default-access: deny-all` — ohne Anmeldung kein Lesen, kein Schreiben). + +Je Projekt: + +```bash +ntfy user add meineapp-alerts # Passwort wird nicht gebraucht +ntfy access meineapp-alerts meineapp-ops write-only # darf nur schreiben +ntfy access meineapp-ops read-only # entfällt bei Admin-Rolle +ntfy token add meineapp-alerts # → tk_… in MONITORING_NTFY_TOKEN +``` + +Test: `curl -H "Authorization: Bearer tk_…" -d "Test" https://push.example.com/meineapp-ops`. +Handy: ntfy-App, Server hinzufügen (mit eigenem Benutzer), Topic abonnieren. + +Warum eigener Benutzer mit Token: gerät der Token in falsche Hände, kann damit +niemand mitlesen; `ntfy token remove` sperrt ihn ohne Passwortwechsel. + +`OperationalAlert` sendet JSON an die Basis-URL (`topic`, `title`, `message`, +`priority`, `tags`) — UTF-8-sicher, anders als Header-basierte Aufrufe. + +--- + +## 3. Uptime Kuma — externer Monitor + +Auf einem **anderen** Server als die App (`vorlagen/server/uptime-kuma-compose.yml`). +Admin-Konto anlegen, 2FA aktivieren. + +| Monitor | Typ / Ziel | Intervall | Wiederholungen | +|---|---|---|---| +| ` /health` | HTTP(s), `https://meineapp.de/health`, Header `{"Authorization": "Bearer "}`, Status `200-299` | 60 s | 2 | +| ` /up` je Domain | HTTP(s), `https:///up` | 5 min | 1 | +| Zertifikate | Settings ▸ Certificate Expiry Notification | 14 Tage vorher | — | + +Benachrichtigung: ntfy (Server, Topic, Priorität 4, Access Token) und SMTP-Mail. + +Ein stehender Worker fällt so nach etwa 5 + 2 Minuten auf (Queue-Schwelle plus +Wiederholungen) — ein zusätzlicher Alarm aus dem Scheduler ist dann überflüssig. + +**Test:** zweiter Monitor mit falschem Token → 404 → Alarm muss auf Handy und +per Mail ankommen; danach löschen. + +**Zweite Ebene (empfohlen):** kostenloser externer Dienst (z. B. UptimeRobot) +auf `https://meineapp.de/up` mit Mail — meldet auch, wenn der Monitoring-Server +selbst ausfällt. + +--- + +## 4. Worker-Prüfung im Deploy + +`deploy.sh` ruft am Ende `php artisan monitoring:queue-probe --wait=60` auf: +Test-Job auf die Standard-Queue, Abholung wird über den Cache quittiert. Kein +Worker → Exit 3 mit Hinweis. Von Hand jederzeit: + +```bash +php artisan monitoring:queue-probe +ps -eo pid,lstart,args | grep "queue:work" | grep -v grep +``` + +Voraussetzung: Der Worker bedient die Standard-Queue, und App und Worker teilen +denselben Cache-Store (nicht `array`). + +--- + +## 5. Erweiterungen (Muster aus Pressekonto, nicht in den Vorlagen) + +- **Admin-Systemstatus-Seite**: Kacheln aus `HealthProbe::checks()` plus + projektspezifische Prüfungen (fehlende Permissions, `APP_DEBUG` an, + ausstehende Datenmigrationen, letzte fehlgeschlagene Jobs). +- **Fehlgeschlagene Logins**: falsches Passwort / Konto ohne Passwort / + Sperre in einen Aktivitäts-Verlauf, mit Einstieg (`livewire`/`fortify`) und + gekürztem HMAC der IP statt Klartext. Unbekannte Adressen **nur zählen** + (Tag × Einstieg × IP-Hash), sonst verdecken Credential-Stuffing-Wellen + (bei Pressekonto 250/Tag aus 50 Quellen) die relevanten Einträge. +- **Webanalyse**: Umami selbst gehostet, cookielos; Query-Parameter mit + `data-before-send` filtern (signierte Links!), im Admin und bei + Impersonation nicht tracken. +- **Nginx-Fehlerlog** gelegentlich zusammenfassen: + + ```bash + sed -E 's/^[0-9\/]+ [0-9:]+ //; s/[0-9]+#[0-9]+: \*[0-9]+ //; s/client: [0-9a-f.:]+/client: X/; s/, (server|request|upstream|host|referrer): .*//' \ + /var/log/nginx/-error.log | cut -c1-180 | sort | uniq -c | sort -rn | head -25 + ``` + + `access forbidden by rule` = Scanner suchen `/.env` (gut so); + `recv() failed (104…)` nur zu Deploy-Zeiten = Reload, unkritisch. diff --git a/dev/git-deploy-monitoring/04-checkliste-neues-projekt.md b/dev/git-deploy-monitoring/04-checkliste-neues-projekt.md new file mode 100644 index 00000000..63a87b99 --- /dev/null +++ b/dev/git-deploy-monitoring/04-checkliste-neues-projekt.md @@ -0,0 +1,68 @@ +# 04 — Checkliste: Übernahme in ein neues Projekt + +Platzhalter: `meineapp` (Projektname), `meineapp.de` (Live-Domain), +`errors.example.com` / `push.example.com` / `status.example.com` (Monitoring-Server), +`git.example.com` (Git-Server). Details in 01–03. + +## 0. Monitoring-Server (nur beim ersten Projekt) + +- [ ] GlitchTip: `vorlagen/server/glitchtip-compose.yml`, `SECRET_KEY`, Domain, SMTP, `GLITCHTIP_RETENTION_DAYS` +- [ ] Erstes Konto, danach `ENABLE_USER_REGISTRATION: "False"`; Organisation angelegt +- [ ] ntfy: `ntfy-compose.yml` + `ntfy-server.yml` (`deny-all`), eigener Admin-Benutzer, Handy-App verbunden +- [ ] Uptime Kuma: `uptime-kuma-compose.yml`, Admin mit 2FA, ntfy- und Mail-Benachrichtigung +- [ ] Reverse Proxy mit TLS für alle drei (`Caddyfile` oder vorhandener Proxy) +- [ ] Monitoring-Server ≠ App-Server + +## 1. Monitoring-Server: je Projekt + +- [ ] GlitchTip-Projekte `meineapp-server` (PHP/Laravel) und `meineapp-browser` (JavaScript), DSNs notiert +- [ ] Alert-Regel je Projekt: Mail bei neuem Fehlertyp (möglichst nur `production`) +- [ ] ntfy: Benutzer `meineapp-alerts`, `write-only` auf `meineapp-ops`, Token erzeugt; eigener Benutzer liest +- [ ] Lese-Token für die GlitchTip-API (`project:read`, `event:read`) für die lokale `.env` + +## 2. Laravel-Teil + +- [ ] `composer require sentry/sentry-laravel` · `npm install @sentry/browser` +- [ ] `vorlagen/laravel/` ins Projekt kopieren (Pfade 1:1) +- [ ] `ErrorReportScrubber::AllowedQueryParameters` und `ALLOWED_QUERY` in `error-reporting.js` angepasst +- [ ] `bootstrap/app.php`: `/health`-Route, `ReportErrorSignals`, `Integration::handles`, `dontReport(CommandNotFoundException)` (02 §3, 03 §1) +- [ ] `config/app.php`: `'version' => Release::current(env('APP_VERSION'))` +- [ ] `config/logging.php`: Kanal `monitoring` +- [ ] `routes/console.php`: `$alertOnFailure`, Herzschlag, `queue:prune-failed`; alle eigenen Tasks mit `withoutOverlapping()` und `onFailure` +- [ ] `AppServiceProvider::boot()`: `Queue::failing` → `OperationalAlert`, `AboutCommand::add` +- [ ] Vite-Eingang `resources/js/error-reporting.js`; `` in jedem Layout-`` +- [ ] Basic Auth / `trustHosts`: `/health` ausgenommen bzw. erreichbar +- [ ] **Vor** `RefreshDatabase`: Testdatenbank absichern (02 §5, „Testdatenbank absichern“): + `phpunit.xml` mit SQLite `:memory:` **und `force="true"`** (`DB_CONNECTION`, `DB_DATABASE`, `DB_URL` leer; + je als `` und ``), dazu der Guard in `tests/TestCase.php`. Eine frische Laravel-Installation + hat diese Zeilen nur auskommentiert — ohne `force` gewinnen vorhandene Umgebungsvariablen. +- [ ] Gegenprobe: `DB_CONNECTION=mysql DB_DATABASE=gibtsnicht php artisan test` muss trotzdem grün laufen + (bzw. der Guard laut abbrechen) — nie eine echte Datenbank leeren +- [ ] `phpunit.xml`: Sentry-DSNs leer (`force="true"`); danach `tests/Pest.php` mit `RefreshDatabase` +- [ ] `.env.example` um `vorlagen/env-beispiel.env` ergänzt +- [ ] Tests grün: `php artisan test --compact tests/Feature/Monitoring tests/Unit/Monitoring` (30 Tests) +- [ ] Datenschutzerklärung: Fehlerprotokollierung (Kategorien, Frist, Rechtsgrundlage) + +## 3. Git-Deploy + +- [ ] `.gitignore`: `/RELEASE` ignoriert, `/public/build` **nicht** ignoriert; ignorierte Dateien gesichtet (01, Voraussetzungen) +- [ ] `vorlagen/deploy.sh` → `dev/betrieb/deploy.sh`, Einstellungen oben gesetzt (`DEPLOY_SCRIPT`, `PHP_FPM_SERVICE`, `ABOUT_SECTION`, `QUEUE_PROBE`) +- [ ] Assets gebaut und committet, Tag `vX.Y.Z` mit Release-Notiz, `git push --follow-tags` +- [ ] Server: Deploy-Key (nur lesen), `~/.ssh/config`, Host-Key-Fingerprint geprüft, `git ls-remote` zeigt Tags +- [ ] Server: FPM-**Reload** ohne Passwort getestet (sonst `DEPLOY_FPM_RELOAD=`) +- [ ] Server: `systemctl is-enabled supervisor` → `enabled`; Worker im Panel mit richtigen Queues +- [ ] Server-Panel: „Quick Deploy“/Push-Webhook aus +- [ ] Live-Verzeichnis: neu geklont (B1) oder umgewandelt (B2, Abweichungen gesichtet, `git status` leer) +- [ ] Live-`.env`: DSNs, `SENTRY_ENVIRONMENT=production`, ntfy-Werte, **eigenes** `MONITORING_HEALTH_TOKEN`, `MONITORING_ALERT_EMAIL` +- [ ] Erster Deploy: `bash dev/betrieb/deploy.sh vX.Y.Z [--migrations]` → endet mit „Queue-Worker läuft“ + +## 4. Abnahme + +- [ ] `php artisan about` zeigt die Version +- [ ] `curl -s -H "Authorization: Bearer " https://meineapp.de/health` → `"status":"ok"`, richtige `version` +- [ ] `php artisan tinker --execute 'report(new RuntimeException("Test"));'` → erscheint in GlitchTip (`production`, Release = Tag) +- [ ] Browser-Konsole: `setTimeout(() => { throw new Error('Test test@example.com') })` → GlitchTip Browser, E-Mail als `[email]` +- [ ] `php artisan tinker --execute 'App\Support\OperationalAlert::send("Test");'` → Push und Mail +- [ ] Uptime Kuma: `/health` (mit Header) und `/up` je Domain grün; Test-Monitor mit falschem Token löst Alarm aus +- [ ] Zweite Ebene (externer Dienst auf `/up`) eingerichtet +- [ ] Im Projekt: Kurz-Doku mit echten Werten (`dev/glitch-tip/README.md`), Verweis in `CLAUDE.md` diff --git a/dev/git-deploy-monitoring/README.md b/dev/git-deploy-monitoring/README.md new file mode 100644 index 00000000..8b270dc9 --- /dev/null +++ b/dev/git-deploy-monitoring/README.md @@ -0,0 +1,121 @@ +# Git-Deploy und Betriebsüberwachung — Baukasten für Laravel-Projekte + +**Stand:** 07.10.2026 · **Herkunft:** Pressekonto, live seit v1.1.3 (Git-Deploy) bzw. v1.1.0 (Monitoring) +**Für:** Entwickler und KI-Chats, die dieses Setup in ein anderes Laravel-Projekt übernehmen. + +Dieser Ordner beschreibt ein erprobtes Betriebs-Setup aus zwei Teilen und liefert +die Dateien dafür mit: + +1. **Git-Deploy per Tag** — ausgeliefert wird nur ein Git-Tag, von Hand per SSH, + mit einem Skript, das abbricht, bevor es etwas kaputt macht. +2. **Betriebsüberwachung** — Fehler, Ausfälle und stehende Hintergrundprozesse + fallen auf, bevor Kunden sie melden: GlitchTip (Fehlerprotokoll), `/health` + (tiefer Health-Check), Uptime Kuma (externer Monitor), ntfy (Push aufs Handy). + +Die Laravel-Vorlagen sind in einem frischen Laravel 12 (12.69, PHP 8.4, Pest 3) +eingebaut und getestet (30 Tests grün); `deploy.sh` ist gegen ein simuliertes +Repository durchgespielt (Deploy, Abbruch bei Migrationen, Drift, Rollback, +fehlender Worker). + +--- + +## Inhalt + +| Datei | Wofür | +|---|---| +| [`01-git-deploy.md`](01-git-deploy.md) | Prinzip, einmalige Einrichtung, Release, Deploy, Rollback, Fallstricke | +| [`02-fehlerprotokoll-glitchtip.md`](02-fehlerprotokoll-glitchtip.md) | GlitchTip aufsetzen, Laravel anbinden (Server + Browser), Datenschutz, Auswertung per API | +| [`03-betriebsueberwachung.md`](03-betriebsueberwachung.md) | `/health`, Scheduler-Herzschlag, Worker-Prüfung, Alarme (Mail + ntfy), Uptime Kuma | +| [`04-checkliste-neues-projekt.md`](04-checkliste-neues-projekt.md) | Abhakliste für die Übernahme in ein neues Projekt | +| `vorlagen/deploy.sh` | Deploy-Skript (Einstellungen oben im Skript) | +| `vorlagen/env-beispiel.env` | alle `.env`-Werte mit Kommentar | +| `vorlagen/laravel/…` | PHP/JS/Blade-Dateien und Tests, Pfade wie im Projekt — 1:1 kopierbar | +| `vorlagen/server/…` | Docker-Compose für GlitchTip, ntfy, Uptime Kuma; ntfy-Konfiguration; Caddyfile | + +--- + +## Architektur + +``` + ┌────────────────────────── Monitoring-Server ──────────────────────────┐ + │ GlitchTip (errors.…) ntfy (push.…) Uptime Kuma (status.…) │ + └─────▲──────────────────────▲──────────────────────┬────────────────────┘ + Fehler (Sentry-SDK) │ Betriebs-Alerts │ prüft jede │ Minute + │ (JSON-POST) │ /health, /up │ + ┌─────────────────────┴──────────────────────┴──────────────────────▼────────────────────┐ + │ App-Server: Laravel │ + │ • Exceptions + Fehlersignale → GlitchTip • Scheduler schreibt Herzschlag/Minute │ + │ • fehlgeschlagene Jobs/Tasks → Mail + ntfy • /health: DB, Cache, Queue, Scheduler, │ + │ • deploy.sh: Tag auschecken, Worker prüfen Platte → 200 / 503 │ + └─────────────────────▲───────────────────────────────────────────────────────────────────┘ + │ git fetch --tags (Deploy-Key, nur lesen) + ┌────────┴────────┐ + │ Git-Server │ ← lokal: Commit, Assets bauen, Tag, push + │ (Forgejo o. Ä.) │ + └─────────────────┘ +``` + +**Wichtig:** Uptime Kuma läuft auf einem anderen Server als die App — sonst fällt +der Monitor mit dem überwachten System aus. ntfy liegt auf demselben Server wie +Uptime Kuma; fällt dieser aus, kommt kein Push. Dafür gibt es eine zweite Ebene +(kostenloser externer Dienst, nur Mail), siehe 03. + +### Wer meldet was? + +| Ausfall | Wer merkt es | Kanal | +|---|---|---| +| Exception im Code (Request, Job, Command) | Sentry-SDK | GlitchTip → Mail bei neuem Fehlertyp | +| JavaScript-Fehler im Browser | `error-reporting.js` | GlitchTip (Projekt Browser) | +| Toter interner Link, 403/429 für Angemeldete, 419 | `ReportErrorSignals` | GlitchTip (Warnung) | +| Job endgültig fehlgeschlagen | `Queue::failing` | Mail + ntfy | +| Geplanter Task fehlgeschlagen | `onFailure` | Mail + ntfy | +| Worker steht | `/health` (Queue-Rückstau) | Uptime Kuma → ntfy/Mail | +| Scheduler/Cron steht | `/health` (Herzschlag) | Uptime Kuma | +| Platte fast voll, DB/Cache weg | `/health` | Uptime Kuma | +| Server/PHP-FPM/Nginx/SSL weg | `/up`, `/health` nicht erreichbar | Uptime Kuma (+ zweite Ebene) | +| Worker kommt nach dem Deploy nicht zurück | `deploy.sh` (Test-Job) | Exit 3 im Terminal | + +--- + +## Reihenfolge für ein neues Projekt + +1. **Monitoring-Server** einmalig aufsetzen (GlitchTip, ntfy, Uptime Kuma) — wird + von allen Projekten geteilt. Je Projekt nur neue GlitchTip-Projekte, ein + ntfy-Topic und Monitore. +2. **Laravel-Teil** einbauen (02, 03), Tests grün, ausliefern. +3. **Git-Deploy** einrichten (01) — für ein bestehendes Live-Verzeichnis mit der + Umwandlung an Ort und Stelle. +4. **Uptime Kuma** auf `/health` richten, Alarm testen. + +Die Abhakliste dazu: [`04-checkliste-neues-projekt.md`](04-checkliste-neues-projekt.md). + +--- + +## Bewusst nicht im Baukasten + +- **Zero-Downtime mit Release-Verzeichnissen** (Envoyer/Deployer-Stil): Wer + große Dateien unter `storage/app` hält, deployt besser im selben Verzeichnis + mit `artisan down` (wenige Sekunden). +- **Admin-Systemstatus-Seite**: projektspezifisch. `HealthProbe::scheduler()` + und `disk()` lassen sich dort mitbenutzen. +- **Webanalyse (Umami)** und **Auswertung fehlgeschlagener Logins**: in + Pressekonto vorhanden, aber eng mit dem Projekt verwoben. Muster in 03, + Abschnitt „Erweiterungen“. + +--- + +## Erfahrungen aus dem Betrieb (warum es so gebaut ist) + +| Erfahrung | Folge im Baukasten | +|---|---| +| Die Testsuite meldete absichtlich provozierte Fehler („Queue weg“) an das echte GlitchTip | DSNs in `phpunit.xml` leer, Wächtertest | +| GlitchTip gruppiert nach Text — `…after 20002 ms` und `…20001 ms` wurden getrennte Einträge | keine variablen Zahlen in Meldungen; Fingerprint bei Signalen | +| Ein Google-Aussetzer erzeugte 28 Fehlermeldungen in einer Nacht | vorübergehende Fremdfehler: Retry, `Log::warning`, Alarm erst bei Abbruch | +| Nach `queue:restart` kam der Worker nicht zurück — Supervisor lief nicht. Eine Stunde blieben Jobs liegen | Worker-Prüfung am Ende von `deploy.sh`, `/health` prüft den Rückstau | +| FPM per „Restart“ statt „Reload“ → Socket kurz weg → 502 | `deploy.sh` macht `reload`; Restart nie | +| Version auf Live zeigte `v1.1.0-3-g…-dirty` | `deploy.sh` schreibt `RELEASE` = Tag selbst | +| macOS-Muster `Icon` in `.gitignore` traf bei `core.ignorecase` auch `resources/views/flux/icon/` | bei der Umstellung `git status` auf Live genau sichten (01, Fallstricke) | +| Per SFTP gelöschte Dateien lagen noch auf Live | Umwandlung zeigt Abweichungen, bevor ausgecheckt wird | +| `deploy.sh` wird beim Checkout ersetzt, während Bash es liest | Skript läuft aus einer Kopie | +| Alte fehlgeschlagene Jobs scheiterten nach `queue:retry all` an geänderten Klassen | nie pauschal `retry all`; `queue:prune-failed` nach 30 Tagen | +| `:placeholder="__('…')"` an `` → Alpine-Fehler im Browser, nur durch GlitchTip gefunden | Browserfehler erfassen; Muster mit Wächtertest abfangen | diff --git a/dev/git-deploy-monitoring/vorlagen/deploy.sh b/dev/git-deploy-monitoring/vorlagen/deploy.sh new file mode 100755 index 00000000..eb7950ee --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/deploy.sh @@ -0,0 +1,176 @@ +#!/usr/bin/env bash +# +# Deploy eines Git-Tags auf Live — Vorlage aus dev/git-deploy-monitoring +# (Anleitung: 01-git-deploy.md). Im Projekt z. B. als dev/betrieb/deploy.sh +# ablegen; Pfad und Einstellungen im Block „Projekt-Einstellungen“ anpassen. +# +# Aufruf im App-Verzeichnis auf dem Server: +# +# cd ~/meine-app.de +# bash dev/betrieb/deploy.sh v1.2.0 # ohne neue Migrationen +# bash dev/betrieb/deploy.sh v1.2.0 --migrations # mit Migrationen, DB-Backup vorher! +# +# Optionen: +# --migrations Neue Migrationen ausführen. Ohne diese Option bricht das +# Skript ab, sobald der Tag neue Migrationen mitbringt. +# --clear-schedule php artisan schedule:clear-cache (alte withoutOverlapping-Sperren). +# +# Umgebung (optional): +# DEPLOY_FPM_RELOAD Befehl zum Neuladen von PHP-FPM (Standard siehe unten). +# Leer setzen, wenn FPM von Hand im Server-Panel neu geladen +# wird — dann wartet das Skript auf Enter. Nie „Restart“: +# der entfernt kurz den Socket, Nginx liefert 502. +# +# Exit-Codes: 0 fertig, 1 abgebrochen (siehe Ausgabe), 2 falscher Aufruf, +# 3 live, aber kein Queue-Worker hat den Test-Job abgeholt. +# +# Rollback: dasselbe Skript mit dem vorherigen Tag. + +set -euo pipefail + +# ---- Projekt-Einstellungen -------------------------------------------------- +DEPLOY_SCRIPT="dev/betrieb/deploy.sh" # Pfad dieses Skripts im Repository +PHP_FPM_SERVICE="php8.4-fpm" # systemd-Name des FPM-Dienstes +ABOUT_SECTION="" # z. B. "meineapp" (AboutCommand::add), leer = RELEASE ausgeben +QUEUE_PROBE=1 # 1 = monitoring:queue-probe am Ende, 0 = Projekt ohne Queue +# ----------------------------------------------------------------------------- + +# Git ersetzt diese Datei beim Checkout. Bash liest Skripte stückweise, deshalb +# läuft der Deploy aus einer Kopie. +if [[ -z "${DEPLOY_COPY:-}" ]]; then + copy="$(mktemp)" + cp "$0" "$copy" + DEPLOY_COPY="$copy" exec bash "$copy" "$@" +fi +trap 'rm -f "$DEPLOY_COPY"' EXIT + +tag="${1:-}" +shift || true +run_migrations=0 +clear_schedule=0 + +for option in "$@"; do + case "$option" in + --migrations) run_migrations=1 ;; + --clear-schedule) clear_schedule=1 ;; + *) echo "Unbekannte Option: $option" >&2; exit 2 ;; + esac +done + +if [[ ! "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Aufruf: bash $DEPLOY_SCRIPT vX.Y.Z [--migrations] [--clear-schedule]" >&2 + exit 2 +fi + +if [[ ! -f artisan || ! -d .git ]]; then + echo "Im App-Verzeichnis aufrufen (artisan und .git fehlen hier)." >&2 + exit 2 +fi + +step() { printf '\n==> %s\n' "$*"; } + +step "Arbeitsverzeichnis prüfen" +drift="$(git status --porcelain)" +if [[ -n "$drift" ]]; then + echo "Das Arbeitsverzeichnis weicht vom ausgecheckten Stand ab:" >&2 + echo "$drift" >&2 + echo "Erst klären (git diff), dann deployen. Nichts wurde verändert." >&2 + exit 1 +fi + +step "Tags von origin holen" +git fetch --quiet --tags origin + +if ! git rev-parse --quiet --verify "refs/tags/$tag^{commit}" > /dev/null; then + echo "Tag $tag gibt es auf origin nicht." >&2 + exit 1 +fi + +previous="$(cat RELEASE 2>/dev/null || git describe --tags --always)" +echo "Live: $previous → Ziel: $tag" + +if [[ "$(git rev-parse HEAD)" == "$(git rev-parse "$tag^{commit}")" ]]; then + echo "$tag ist bereits ausgecheckt. Nichts zu tun." + exit 0 +fi + +new_migrations="$(git diff --name-only --diff-filter=A HEAD "$tag" -- database/migrations)" +if [[ -n "$new_migrations" ]]; then + echo "Neue Migrationen:" + echo "$new_migrations" | sed 's/^/ /' + if [[ "$run_migrations" -ne 1 ]]; then + echo "Abbruch: DB-Backup ziehen und mit --migrations erneut aufrufen. Nichts wurde verändert." >&2 + exit 1 + fi +fi + +trap 'echo; echo "!! Deploy abgebrochen. Die Seite bleibt im Wartungsmodus." >&2; echo "!! Rollback: bash $DEPLOY_SCRIPT $previous" >&2; rm -f "$DEPLOY_COPY"' ERR + +step "Wartungsmodus" +php artisan down --retry=60 + +step "Checkout $tag" +git checkout --quiet --detach "$tag" +echo "$tag" > RELEASE + +step "Composer" +composer install --no-dev --optimize-autoloader --no-interaction + +if [[ -n "$new_migrations" ]]; then + step "Migrationen" + php artisan migrate --force +fi + +if [[ -d public/vendor/livewire ]]; then + php artisan vendor:publish --tag=livewire:assets --force +fi + +step "Caches" +php artisan config:cache +php artisan route:cache +php artisan view:clear +php artisan view:cache +php artisan event:cache + +if [[ "$clear_schedule" -eq 1 ]]; then + php artisan schedule:clear-cache +fi + +step "Worker und PHP-FPM" +php artisan queue:restart +default_fpm_reload="echo '' | sudo -S service $PHP_FPM_SERVICE reload" +fpm_reload="${DEPLOY_FPM_RELOAD-$default_fpm_reload}" +if [[ -n "$fpm_reload" ]]; then + bash -c "$fpm_reload" +else + echo "PHP-FPM jetzt im Server-Panel neu laden (Reload, nicht Restart), danach Enter." + read -r +fi + +step "Wartungsmodus aus" +php artisan up + +step "Version" +if [[ -n "$ABOUT_SECTION" ]]; then + php artisan about --only="$ABOUT_SECTION" +else + cat RELEASE +fi + +trap - ERR + +# Läuft ein Worker? `queue:restart` oben beendet ihn; neu starten muss ihn +# Supervisor. Läuft Supervisor nicht, steht die Queue still, ohne dass es +# jemand merkt. +if [[ "$QUEUE_PROBE" -eq 1 ]]; then + step "Queue-Worker" + if ! php artisan monitoring:queue-probe --wait=60; then + echo + echo "!! Deploy $tag ist live, aber KEIN Queue-Worker läuft." >&2 + echo "!! Jetzt Supervisor und den Worker im Server-Panel prüfen — sonst bleiben Jobs und Mails liegen." >&2 + exit 3 + fi +fi + +echo +echo "Deploy $tag fertig (vorher $previous). Weiter mit den Prüfungen aus der Deploy-Anleitung." diff --git a/dev/git-deploy-monitoring/vorlagen/env-beispiel.env b/dev/git-deploy-monitoring/vorlagen/env-beispiel.env new file mode 100644 index 00000000..c40ccbad --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/env-beispiel.env @@ -0,0 +1,24 @@ +# --- Version (leer lassen: kommt aus der Datei RELEASE, die deploy.sh schreibt) +APP_VERSION= + +# --- GlitchTip (02-fehlerprotokoll-glitchtip.md) +SENTRY_LARAVEL_DSN= # Projekt „-server“ (PHP/Laravel) +SENTRY_BROWSER_DSN= # Projekt „-browser“ (JavaScript), öffentlich +SENTRY_ENVIRONMENT=production # lokal: local +SENTRY_RELEASE= # leer lassen + +# --- Betriebs-Alerts (03-betriebsueberwachung.md) +MONITORING_ALERTS_ENABLED=true +MONITORING_ALERT_EMAIL=ops@example.com +MONITORING_NTFY_URL=https://push.example.com +MONITORING_NTFY_TOPIC=meineapp-ops +MONITORING_NTFY_TOKEN= # tk_… des Benutzers meineapp-alerts (nur Schreibrecht) +MONITORING_NTFY_PRIORITY=4 + +# --- Tiefer Health-Check /health (Bearer-Token für Uptime Kuma) +MONITORING_HEALTH_TOKEN= # openssl rand -hex 24 — je Umgebung ein eigener Wert +MONITORING_QUEUE_BACKLOG_SECONDS=300 +MONITORING_DISK_MIN_FREE_PERCENT=10 + +# --- Nur lokal: Lesezugriff auf die GlitchTip-API für die Auswertung +GLITCHTIP_API_TOKEN= # Scopes project:read, event:read — nie committen diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringHeartbeat.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringHeartbeat.php new file mode 100644 index 00000000..c75e5fd8 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringHeartbeat.php @@ -0,0 +1,25 @@ +recordHeartbeat(); + + return self::SUCCESS; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringQueueProbe.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringQueueProbe.php new file mode 100644 index 00000000..a1aa6d00 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Console/Commands/MonitoringQueueProbe.php @@ -0,0 +1,50 @@ +option('wait')); + + QueueProbe::dispatch($token); + + for ($second = 0; $second <= $wait; $second++) { + if (Cache::has(QueueProbe::cacheKey($token))) { + Cache::forget(QueueProbe::cacheKey($token)); + $this->info(sprintf('Queue-Worker läuft (Test-Job nach %d s abgeholt).', $second)); + + return self::SUCCESS; + } + + if ($second < $wait) { + Sleep::for(1)->second(); + } + } + + $this->error(sprintf('Kein Queue-Worker hat den Test-Job innerhalb von %d s abgeholt.', $wait)); + $this->line('Worker prüfen: läuft Supervisor (bzw. der Worker im Server-Panel)? Notfalls: nohup php artisan queue:work --tries=3 --max-time=3600 &'); + + return self::FAILURE; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Controllers/HealthController.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Controllers/HealthController.php new file mode 100644 index 00000000..df4c89a3 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Controllers/HealthController.php @@ -0,0 +1,39 @@ +bearerToken() ?? $request->query('token', '')); + + abort_if($token === '' || ! hash_equals($token, $given), 404); + + $checks = $probe->checks(); + $status = HealthProbe::worstStatus($checks); + + return response()->json([ + 'status' => $status, + 'version' => config('app.version'), + 'checked_at' => now()->toIso8601String(), + 'checks' => collect($checks)->mapWithKeys(fn (array $check): array => [ + $check['key'] => ['status' => $check['status'], 'detail' => $check['detail']], + ]), + ], $status === HealthProbe::StatusCritical ? 503 : 200) + ->header('Cache-Control', 'no-store'); + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Middleware/ReportErrorSignals.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Middleware/ReportErrorSignals.php new file mode 100644 index 00000000..c0c22d66 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Http/Middleware/ReportErrorSignals.php @@ -0,0 +1,96 @@ +signalFor($request, $response->getStatusCode()); + + if ($signal !== null) { + $location = $this->locationOf($request); + $context = [ + 'status' => $response->getStatusCode(), + 'method' => $request->method(), + 'path' => '/'.ltrim($request->path(), '/'), + 'referer' => $this->refererPath($request), + 'livewire' => $request->hasHeader('X-Livewire'), + ]; + + defer(fn () => $this->errorSignal->report($signal, $location, $context)); + } + + return $response; + } + + private function signalFor(Request $request, int $status): ?string + { + return match (true) { + $status === 404 && $this->hasInternalReferer($request) => ErrorSignal::DeadInternalLink, + $status === 403 && $request->user() !== null => ErrorSignal::AccessDenied, + $status === 419 => ErrorSignal::PageExpired, + $status === 429 && $request->user() !== null => ErrorSignal::Throttled, + default => null, + }; + } + + /** + * Livewire-Requests laufen alle über denselben Update-Endpunkt — der Ort + * ist dort die Seite, auf der der Nutzer stand. + */ + private function locationOf(Request $request): string + { + if ($request->hasHeader('X-Livewire')) { + return 'livewire '.($this->refererPath($request) ?? '/'); + } + + $routeName = $request->route()?->getName(); + + return $routeName !== null + ? $routeName + : '/'.ltrim($request->path(), '/'); + } + + private function hasInternalReferer(Request $request): bool + { + $referer = $request->headers->get('referer'); + + return is_string($referer) && parse_url($referer, PHP_URL_HOST) === $request->getHost(); + } + + private function refererPath(Request $request): ?string + { + $referer = $request->headers->get('referer'); + + if (! is_string($referer) || $referer === '') { + return null; + } + + $path = parse_url($referer, PHP_URL_PATH); + + return is_string($path) ? ErrorReportScrubber::scrubPath($path) : null; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Jobs/Monitoring/QueueProbe.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Jobs/Monitoring/QueueProbe.php new file mode 100644 index 00000000..c267b252 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Jobs/Monitoring/QueueProbe.php @@ -0,0 +1,31 @@ +token), now()->toIso8601String(), now()->addMinutes(10)); + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Services/Monitoring/HealthProbe.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Services/Monitoring/HealthProbe.php new file mode 100644 index 00000000..d73723ed --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Services/Monitoring/HealthProbe.php @@ -0,0 +1,198 @@ +toIso8601String(), LOCK_EX); + } + + public function lastHeartbeat(): ?Carbon + { + $value = @file_get_contents(self::heartbeatPath()); + + return is_string($value) && trim($value) !== '' ? Carbon::parse(trim($value)) : null; + } + + /** + * @return list + */ + public function checks(): array + { + return [ + $this->database(), + $this->cache(), + $this->queue(), + $this->scheduler(), + $this->disk(), + ]; + } + + /** + * @param list $checks + */ + public static function worstStatus(array $checks): string + { + $statuses = array_column($checks, 'status'); + + return match (true) { + in_array(self::StatusCritical, $statuses, true) => self::StatusCritical, + in_array(self::StatusWarn, $statuses, true) => self::StatusWarn, + default => self::StatusOk, + }; + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + public function scheduler(): array + { + $lastBeat = $this->lastHeartbeat(); + $warnMinutes = (int) config('monitoring.scheduler.heartbeat_warn_minutes'); + $criticalMinutes = (int) config('monitoring.scheduler.heartbeat_critical_minutes'); + $minutesAgo = $lastBeat !== null ? (int) $lastBeat->diffInMinutes(now(), absolute: true) : null; + + return $this->check( + 'scheduler', + 'Scheduler', + match (true) { + $minutesAgo === null, $minutesAgo >= $criticalMinutes => self::StatusCritical, + $minutesAgo >= $warnMinutes => self::StatusWarn, + default => self::StatusOk, + }, + $lastBeat === null + ? 'Noch kein Herzschlag — läuft `schedule:run` per Cron (bzw. `schedule:work`)?' + : 'Letzter Herzschlag '.$lastBeat->format('d.m.Y H:i:s').' (vor '.$minutesAgo.' Min.).', + ); + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + public function disk(): array + { + $path = storage_path(); + $free = @disk_free_space($path); + $total = @disk_total_space($path); + + if ($free === false || $total === false || $total <= 0) { + return $this->check('disk', 'Plattenplatz', self::StatusWarn, 'Plattenplatz nicht ermittelbar.'); + } + + $freePercent = round($free / $total * 100, 1); + $minPercent = (float) config('monitoring.health.disk_min_free_percent'); + + return $this->check( + 'disk', + 'Plattenplatz', + match (true) { + $freePercent < $minPercent => self::StatusCritical, + $freePercent < $minPercent * 2 => self::StatusWarn, + default => self::StatusOk, + }, + sprintf('%s %% frei (%s GB von %s GB).', $freePercent, round($free / 1024 ** 3, 1), round($total / 1024 ** 3, 1)), + ); + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + private function database(): array + { + try { + DB::select('select 1'); + + return $this->check('database', 'Datenbank', self::StatusOk, 'Verbindung steht.'); + } catch (Throwable $exception) { + return $this->check('database', 'Datenbank', self::StatusCritical, 'Keine Verbindung: '.Str::limit($exception->getMessage(), 120)); + } + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + private function cache(): array + { + try { + $value = Str::random(8); + Cache::put('monitoring:health-probe', $value, 60); + + return Cache::get('monitoring:health-probe') === $value + ? $this->check('cache', 'Cache', self::StatusOk, 'Schreiben und Lesen funktionieren.') + : $this->check('cache', 'Cache', self::StatusCritical, 'Geschriebener Wert kommt nicht zurück.'); + } catch (Throwable $exception) { + return $this->check('cache', 'Cache', self::StatusCritical, 'Nicht erreichbar: '.Str::limit($exception->getMessage(), 120)); + } + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + private function queue(): array + { + if (config('queue.default') !== 'database') { + return $this->check('queue', 'Queue', self::StatusOk, 'Treiber '.config('queue.default').' — Rückstau hier nicht prüfbar.'); + } + + try { + $now = now()->getTimestamp(); + $oldestAvailable = DB::table('jobs') + ->whereNull('reserved_at') + ->where('available_at', '<=', $now) + ->min('available_at'); + } catch (Throwable $exception) { + return $this->check('queue', 'Queue', self::StatusCritical, 'Jobs-Tabelle nicht lesbar: '.Str::limit($exception->getMessage(), 120)); + } + + $waitingSeconds = $oldestAvailable !== null ? max(0, $now - (int) $oldestAvailable) : 0; + $criticalSeconds = (int) config('monitoring.health.queue_backlog_critical_seconds'); + + return $this->check( + 'queue', + 'Queue', + $waitingSeconds >= $criticalSeconds ? self::StatusCritical : self::StatusOk, + $oldestAvailable === null + ? 'Kein wartender Job.' + : 'Ältester wartender Job seit '.$waitingSeconds.' s.'.($waitingSeconds >= $criticalSeconds ? ' Worker gestoppt?' : ''), + ); + } + + /** + * @return array{key: string, label: string, status: string, detail: string} + */ + private function check(string $key, string $label, string $status, string $detail): array + { + return ['key' => $key, 'label' => $label, 'status' => $status, 'detail' => $detail]; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorReportScrubber.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorReportScrubber.php new file mode 100644 index 00000000..76bdaf56 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorReportScrubber.php @@ -0,0 +1,159 @@ + + */ + public const AllowedQueryParameters = ['page', 'q', 'tab', 'sort']; + + private const EmailPattern = '/[A-Z0-9._%+\-]+@[A-Z0-9.\-]+\.[A-Z]{2,}/i'; + + /** Pfadsegmente, die wie ein Token aussehen (Magic Links, Reset-Links). */ + private const TokenSegmentPattern = '#(?<=/)[A-Za-z0-9_\-]{32,}(?=/|$)#'; + + public static function beforeSend(Event $event, ?EventHint $hint = null): ?Event + { + $userId = self::authenticatedUserId(); + + $event->setUser($userId !== null ? UserDataBag::createFromUserIdentifier($userId) : null); + $event->setRequest(self::scrubRequest($event->getRequest())); + + foreach ($event->getExceptions() as $exception) { + $exception->setValue(self::scrubText($exception->getValue())); + } + + if ($event->getMessage() !== null) { + $formatted = $event->getMessageFormatted(); + + $event->setMessage( + self::scrubText($event->getMessage()), + $event->getMessageParams(), + $formatted !== null ? self::scrubText($formatted) : null, + ); + } + + return $event; + } + + /** + * @param array $request + * @return array + */ + public static function scrubRequest(array $request): array + { + if (isset($request['url']) && is_string($request['url'])) { + $request['url'] = self::scrubUrl($request['url']); + } + + if (isset($request['query_string']) && is_string($request['query_string'])) { + $request['query_string'] = self::scrubQuery($request['query_string']); + } + + unset($request['data'], $request['cookies']); + + foreach ($request['headers'] ?? [] as $name => $values) { + if (strtolower((string) $name) === 'referer') { + $request['headers'][$name] = array_map( + static fn (mixed $value): string => self::scrubUrl((string) $value), + (array) $values, + ); + } + } + + return $request; + } + + public static function scrubUrl(string $url): string + { + $query = parse_url($url, PHP_URL_QUERY); + $withoutQuery = $query !== null && $query !== false ? Str::before($url, '?') : $url; + $scrubbedPath = self::scrubPath(self::scrubPathTokens($withoutQuery)); + + return $query !== null && $query !== false && $query !== '' + ? $scrubbedPath.'?'.self::scrubQuery($query) + : $scrubbedPath; + } + + public static function scrubQuery(string $query): string + { + parse_str($query, $parameters); + + $scrubbed = []; + foreach ($parameters as $name => $value) { + $isAllowed = in_array((string) $name, self::AllowedQueryParameters, true) + || str_starts_with((string) $name, 'utm_'); + + $scrubbed[$name] = $isAllowed && is_string($value) ? $value : self::Filtered; + } + + return http_build_query($scrubbed, '', '&', PHP_QUERY_RFC3986); + } + + public static function scrubPath(string $path): string + { + return self::scrubText((string) preg_replace(self::TokenSegmentPattern, self::Filtered, $path)); + } + + public static function scrubText(string $text): string + { + return (string) preg_replace(self::EmailPattern, '[email]', $text); + } + + /** + * Ersetzt Routenparameter, deren Name auf ein Geheimnis hindeutet + * (`token`, `hash`, `signature`), im Pfad der aktuellen Route. + */ + private static function scrubPathTokens(string $url): string + { + try { + $route = request()->route(); + } catch (Throwable) { + return $url; + } + + if ($route === null) { + return $url; + } + + foreach ($route->parameters() as $name => $value) { + if (is_string($value) && $value !== '' && Str::contains(strtolower((string) $name), ['token', 'hash', 'signature'])) { + $url = str_replace(rawurlencode($value), self::Filtered, str_replace($value, self::Filtered, $url)); + } + } + + return $url; + } + + private static function authenticatedUserId(): int|string|null + { + try { + return Auth::id(); + } catch (Throwable) { + return null; + } + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorSignal.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorSignal.php new file mode 100644 index 00000000..db66cbc5 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/ErrorSignal.php @@ -0,0 +1,68 @@ + 'Toter interner Link', + self::AccessDenied => 'Zugriff verweigert (angemeldet)', + self::PageExpired => 'Seite abgelaufen (419)', + self::Throttled => 'Drosselung trifft angemeldeten Nutzer', + ]; + + private const MaxReportsPerWindow = 5; + + private const WindowSeconds = 600; + + /** + * @param array $context + */ + public function report(string $signal, string $location, array $context = []): bool + { + $location = Str::limit($location, 200, ''); + + $reported = RateLimiter::attempt( + 'error-signal:'.sha1($signal.'|'.$location), + self::MaxReportsPerWindow, + static fn (): bool => true, + self::WindowSeconds, + ); + + if ($reported === false) { + return false; + } + + withScope(function (Scope $scope) use ($signal, $location, $context): void { + $scope->setFingerprint(['error-signal', $signal, $location]); + $scope->setTag('signal', $signal); + $scope->setContext('signal', $context); + + captureMessage((self::Labels[$signal] ?? $signal).': '.$location, Severity::warning()); + }); + + return true; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/Release.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/Release.php new file mode 100644 index 00000000..48e6aeb0 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/Monitoring/Release.php @@ -0,0 +1,36 @@ + RELEASE`) — + * der Live-Server hat kein Git, solange per SFTP deployt wird. + * + * Versionen sind Git-Tags nach SemVer: Feature-Deploy erhöht die mittlere, + * Hotfix die letzte Stelle. Auf dem Tag ergibt das „v1.1.0“, mit späteren + * Commits „v1.1.0-2-gabc1234“, mit uncommitteten Änderungen „…-dirty“. + */ +class Release +{ + public static function current(?string $configured, ?string $basePath = null): ?string + { + $configured = trim((string) $configured); + + if ($configured !== '') { + return $configured; + } + + $file = rtrim($basePath ?? base_path(), '/').'/RELEASE'; + + if (! is_file($file)) { + return null; + } + + $release = trim((string) file_get_contents($file)); + + return preg_match('/^[A-Za-z0-9._\-]{1,64}$/', $release) === 1 ? $release : null; + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/OperationalAlert.php b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/OperationalAlert.php new file mode 100644 index 00000000..7b3cc56f --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/app/Support/OperationalAlert.php @@ -0,0 +1,96 @@ + $context + */ + public static function send(string $summary, array $context = []): void + { + Log::channel('monitoring')->critical('[monitoring] '.$summary, $context); + + if (! config('monitoring.alerts.enabled')) { + return; + } + + self::mail($summary, $context); + self::push($summary, $context); + } + + /** + * @param array $context + */ + private static function mail(string $summary, array $context): void + { + $recipient = config('monitoring.alerts.mail_to'); + + if (empty($recipient)) { + return; + } + + try { + Mail::raw( + $summary."\n\n".json_encode($context, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + fn ($message) => $message->to($recipient)->subject('['.config('app.name').'] Betriebs-Alert: '.Str::limit($summary, 80)), + ); + } catch (Throwable $e) { + Log::channel('monitoring')->error('[monitoring] Alert-Mail konnte nicht versendet werden.', [ + 'summary' => $summary, + 'error' => $e->getMessage(), + ]); + } + } + + /** + * JSON-Publish an die ntfy-Basis-URL (UTF-8-sicher, anders als Header). + * + * @param array $context + */ + private static function push(string $summary, array $context): void + { + $url = (string) config('monitoring.alerts.ntfy.url'); + $topic = (string) config('monitoring.alerts.ntfy.topic'); + + if ($url === '' || $topic === '') { + return; + } + + $details = collect($context) + ->map(fn (mixed $value, string $key): string => $key.': '.(is_scalar($value) || $value === null ? (string) $value : json_encode($value))) + ->implode("\n"); + + try { + Http::timeout(5) + ->connectTimeout(3) + ->when(filled(config('monitoring.alerts.ntfy.token')), fn ($request) => $request->withToken((string) config('monitoring.alerts.ntfy.token'))) + ->post(rtrim($url, '/'), [ + 'topic' => $topic, + 'title' => config('app.name').' ('.app()->environment().'): Betriebs-Alert', + 'message' => Str::limit(trim($summary."\n\n".$details), 3500), + 'priority' => (int) config('monitoring.alerts.ntfy.priority'), + 'tags' => ['rotating_light'], + ]) + ->throw(); + } catch (Throwable $e) { + Log::channel('monitoring')->error('[monitoring] ntfy-Push konnte nicht versendet werden.', [ + 'summary' => $summary, + 'error' => $e->getMessage(), + ]); + } + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/config/monitoring.php b/dev/git-deploy-monitoring/vorlagen/laravel/config/monitoring.php new file mode 100644 index 00000000..87a7f5e3 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/config/monitoring.php @@ -0,0 +1,73 @@ + [ + 'enabled' => (bool) env('MONITORING_ALERTS_ENABLED', true), + + // Ops-Postfach. Leer = keine Alert-Mail (Log und ntfy laufen trotzdem). + 'mail_to' => env('MONITORING_ALERT_EMAIL'), + + // Zweiter Alarmweg: Push über ntfy, JSON-POST + // an die Basis-URL. Ohne URL oder Topic aus. + 'ntfy' => [ + 'url' => env('MONITORING_NTFY_URL'), + 'topic' => env('MONITORING_NTFY_TOPIC'), + 'token' => env('MONITORING_NTFY_TOKEN'), + 'priority' => (int) env('MONITORING_NTFY_PRIORITY', 4), + ], + ], + + /* + |-------------------------------------------------------------------------- + | Browserfehler + |-------------------------------------------------------------------------- + | + | Eigenes GlitchTip-Projekt für JavaScript-Fehler. Die DSN ist öffentlich + | (steht im HTML), sie erlaubt nur das Einliefern von Ereignissen. Ohne + | DSN wird kein Skript eingebunden. + | + */ + + 'browser' => [ + 'dsn' => env('SENTRY_BROWSER_DSN'), + 'sample_rate' => (float) env('SENTRY_BROWSER_SAMPLE_RATE', 1.0), + ], + + /* + |-------------------------------------------------------------------------- + | Health-Endpunkt und Scheduler-Herzschlag + |-------------------------------------------------------------------------- + | + | `/health` antwortet nur mit gültigem Token (Bearer-Header oder + | `?token=`); ohne konfiguriertes Token gibt es den Endpunkt nicht (404). + | Der Scheduler schreibt jede Minute einen Herzschlag; bleibt er aus, ist + | der Cron-Eintrag weg oder der Server hängt. + | + */ + + 'health' => [ + 'token' => env('MONITORING_HEALTH_TOKEN'), + 'queue_backlog_critical_seconds' => (int) env('MONITORING_QUEUE_BACKLOG_SECONDS', 300), + 'disk_min_free_percent' => (float) env('MONITORING_DISK_MIN_FREE_PERCENT', 10), + ], + + 'scheduler' => [ + 'heartbeat_warn_minutes' => 3, + 'heartbeat_critical_minutes' => 10, + ], + +]; diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/config/sentry.php b/dev/git-deploy-monitoring/vorlagen/laravel/config/sentry.php new file mode 100644 index 00000000..a3a71cc8 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/config/sentry.php @@ -0,0 +1,180 @@ + env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')), + + // @see https://spotlightjs.com/ + // 'spotlight' => env('SENTRY_SPOTLIGHT', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#logger + // 'logger' => Sentry\Logger\DebugFileLogger::class, // By default this will log to `storage_path('logs/sentry.log')` + + // The release version of your application + // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) + // Gleiche Kennung wie config('app.version'): SENTRY_RELEASE bzw. + // APP_VERSION, sonst die beim Deploy geschriebene Datei RELEASE. + 'release' => Release::current(env('SENTRY_RELEASE', env('APP_VERSION'))), + + // When left empty or `null` the Laravel environment will be used (usually discovered from `APP_ENV` in your `.env`) + 'environment' => env('SENTRY_ENVIRONMENT'), + + // Override the organization ID used for trace continuation checks. + 'org_id' => env('SENTRY_ORG_ID') === null ? null : (int) env('SENTRY_ORG_ID'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#sample_rate + 'sample_rate' => env('SENTRY_SAMPLE_RATE') === null ? 1.0 : (float) env('SENTRY_SAMPLE_RATE'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces_sample_rate + 'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_TRACES_SAMPLE_RATE'), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#profiles_sample_rate + 'profiles_sample_rate' => env('SENTRY_PROFILES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_PROFILES_SAMPLE_RATE'), + + // Only continue incoming traces when the organization IDs are compatible with this SDK instance. + 'strict_trace_continuation' => env('SENTRY_STRICT_TRACE_CONTINUATION', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_logs + 'enable_logs' => env('SENTRY_ENABLE_LOGS', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_metrics + 'enable_metrics' => env('SENTRY_ENABLE_METRICS', false), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#log_flush_threshold + 'log_flush_threshold' => env('SENTRY_LOG_FLUSH_THRESHOLD') === null ? null : (int) env('SENTRY_LOG_FLUSH_THRESHOLD'), + + // The minimum log level that will be sent to Sentry as logs using the `sentry_logs` logging channel + 'logs_channel_level' => env('SENTRY_LOG_LEVEL', env('SENTRY_LOGS_LEVEL', env('LOG_LEVEL', 'debug'))), + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send_default_pii + 'send_default_pii' => false, + + // Formular- und JSON-Inhalte verlassen den Server nie. + 'max_request_body_size' => 'never', + + // User-ID statt Person, Tokens aus URL/Query/Referer, E-Mails aus Meldungen. + 'before_send' => [ErrorReportScrubber::class, 'beforeSend'], + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_exceptions + // 'ignore_exceptions' => [], + + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_transactions + 'ignore_transactions' => [ + // Ignore Laravel's default health URL + '/up', + '/health', + ], + + // Breadcrumb specific configuration + 'breadcrumbs' => [ + // Capture Laravel logs as breadcrumbs + 'logs' => env('SENTRY_BREADCRUMBS_LOGS_ENABLED', false), + + // Capture Laravel cache events (hits, writes etc.) as breadcrumbs + 'cache' => env('SENTRY_BREADCRUMBS_CACHE_ENABLED', false), + + // Capture Livewire components like routes as breadcrumbs + 'livewire' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', true), + + // Capture SQL queries as breadcrumbs + 'sql_queries' => env('SENTRY_BREADCRUMBS_SQL_QUERIES_ENABLED', true), + + // Capture SQL query bindings (parameters) in SQL query breadcrumbs + 'sql_bindings' => env('SENTRY_BREADCRUMBS_SQL_BINDINGS_ENABLED', false), + + // Capture queue job information as breadcrumbs + 'queue_info' => env('SENTRY_BREADCRUMBS_QUEUE_INFO_ENABLED', true), + + // Capture command information as breadcrumbs + 'command_info' => env('SENTRY_BREADCRUMBS_COMMAND_JOBS_ENABLED', true), + + // Capture HTTP client request information as breadcrumbs + 'http_client_requests' => env('SENTRY_BREADCRUMBS_HTTP_CLIENT_REQUESTS_ENABLED', true), + + // Capture send notifications as breadcrumbs + 'notifications' => env('SENTRY_BREADCRUMBS_NOTIFICATIONS_ENABLED', true), + ], + + // Performance monitoring specific configuration + 'tracing' => [ + // Trace queue jobs as their own transactions (this enables tracing for queue jobs) + 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', true), + + // Capture queue jobs as spans when executed on the sync driver + 'queue_jobs' => env('SENTRY_TRACE_QUEUE_JOBS_ENABLED', true), + + // Capture SQL queries as spans + 'sql_queries' => env('SENTRY_TRACE_SQL_QUERIES_ENABLED', true), + + // Capture SQL query bindings (parameters) in SQL query spans + 'sql_bindings' => env('SENTRY_TRACE_SQL_BINDINGS_ENABLED', false), + + // Capture where the SQL query originated from on the SQL query spans + 'sql_origin' => env('SENTRY_TRACE_SQL_ORIGIN_ENABLED', true), + + // Define a threshold in milliseconds for SQL queries to resolve their origin + 'sql_origin_threshold_ms' => env('SENTRY_TRACE_SQL_ORIGIN_THRESHOLD_MS', 100), + + // Capture views rendered as spans + 'views' => env('SENTRY_TRACE_VIEWS_ENABLED', true), + + // Capture Livewire components as spans + 'livewire' => env('SENTRY_TRACE_LIVEWIRE_ENABLED', true), + + // Capture HTTP client requests as spans + 'http_client_requests' => env('SENTRY_TRACE_HTTP_CLIENT_REQUESTS_ENABLED', true), + + // Capture Laravel cache events (hits, writes etc.) as spans + 'cache' => env('SENTRY_TRACE_CACHE_ENABLED', true), + + // Capture Redis operations as spans (this enables Redis events in Laravel) + 'redis_commands' => env('SENTRY_TRACE_REDIS_COMMANDS', false), + + // Capture where the Redis command originated from on the Redis command spans + 'redis_origin' => env('SENTRY_TRACE_REDIS_ORIGIN_ENABLED', true), + + // Capture send notifications as spans + 'notifications' => env('SENTRY_TRACE_NOTIFICATIONS_ENABLED', true), + + // Enable tracing for requests without a matching route (404's) + 'missing_routes' => env('SENTRY_TRACE_MISSING_ROUTES_ENABLED', false), + + // Configures if the performance trace should continue after the response has been sent to the user until the application terminates + // This is required to capture any spans that are created after the response has been sent like queue jobs dispatched using `dispatch(...)->afterResponse()` for example + 'continue_after_response' => env('SENTRY_TRACE_CONTINUE_AFTER_RESPONSE', true), + + // Capture AI agent interactions as spans (requires laravel/ai) + 'gen_ai' => env('SENTRY_TRACE_GEN_AI_ENABLED', true), + + // Capture AI invoke_agent spans + 'gen_ai_invoke_agent' => env('SENTRY_TRACE_GEN_AI_INVOKE_AGENT_ENABLED', true), + + // Capture AI chat spans + 'gen_ai_chat' => env('SENTRY_TRACE_GEN_AI_CHAT_ENABLED', true), + + // Capture AI execute_tool spans + 'gen_ai_execute_tool' => env('SENTRY_TRACE_GEN_AI_EXECUTE_TOOL_ENABLED', true), + + // Capture AI embeddings spans + 'gen_ai_embeddings' => env('SENTRY_TRACE_GEN_AI_EMBEDDINGS_ENABLED', true), + + // Enable the tracing integrations supplied by Sentry (recommended) + 'default_integrations' => env('SENTRY_TRACE_DEFAULT_INTEGRATIONS_ENABLED', true), + ], + +]; diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting-sdk.js b/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting-sdk.js new file mode 100644 index 00000000..402c8a1a --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting-sdk.js @@ -0,0 +1,5 @@ +/** + * Nur die benötigten SDK-Funktionen — der dynamische Import in + * error-reporting.js zieht so nicht das ganze Paket (Replay, Feedback …) nach. + */ +export { captureException, init, setTag, setUser } from '@sentry/browser'; diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting.js b/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting.js new file mode 100644 index 00000000..6b936664 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/resources/js/error-reporting.js @@ -0,0 +1,128 @@ +/** + * Browserfehler an GlitchTip. + * + * Fehlerfreie Seiten laden nur diese paar Zeilen: Das Sentry-SDK wird erst + * beim ersten Fehler nachgeladen (eigener Chunk) und meldet dann genau diesen + * Fehler. Konfiguration kommt aus , das die + * Blade-Komponente x-monitoring.browser-errors setzt. + * + * Fehlgeschlagene Livewire-Requests (5xx, 419) meldet bereits der Server. + */ +const config = (() => { + const meta = document.querySelector('meta[name="pk-error-reporting"]'); + + try { + return meta ? JSON.parse(meta.content) : null; + } catch { + return null; + } +})(); + +const ALLOWED_QUERY = ['page', 'q', 'tab', 'sort']; // wie ErrorReportScrubber::AllowedQueryParameters +const TOKEN_SEGMENT = /(?<=\/)[A-Za-z0-9_-]{32,}(?=\/|$)/g; +const EMAIL = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi; + +/** Gleiche Regeln wie ErrorReportScrubber auf dem Server. */ +function scrubUrl(value) { + try { + const url = new URL(value, window.location.origin); + url.pathname = url.pathname.replace(TOKEN_SEGMENT, '[Filtered]'); + for (const key of [...url.searchParams.keys()]) { + if (!ALLOWED_QUERY.includes(key) && !key.startsWith('utm_')) { + url.searchParams.set(key, '[Filtered]'); + } + } + url.hash = ''; + + return url.toString().replace(EMAIL, '[email]'); + } catch { + return '[Filtered]'; + } +} + +let sdk = null; + +function loadSdk() { + sdk ??= import('./error-reporting-sdk.js').then((Sentry) => { + Sentry.init({ + dsn: config.dsn, + release: config.release || undefined, + environment: config.environment, + sampleRate: config.sampleRate ?? 1, + sendDefaultPii: false, + // Eigene Listener unten statt GlobalHandlers (sonst doppelt); + // keine Breadcrumbs (Klicktexte, URLs) und keine Sessions. + integrations: (defaults) => + defaults.filter( + (integration) => + !['GlobalHandlers', 'Breadcrumbs', 'BrowserSession', 'BrowserApiErrors'].includes(integration.name), + ), + ignoreErrors: ['ResizeObserver loop', 'Script error.', 'AbortError'], + denyUrls: [/^chrome-extension:\/\//, /^moz-extension:\/\//, /^safari-(web-)?extension:\/\//], + beforeSend(event) { + if (event.request?.url) { + event.request.url = scrubUrl(event.request.url); + } + if (event.request?.headers?.Referer) { + event.request.headers.Referer = scrubUrl(event.request.headers.Referer); + } + for (const exception of event.exception?.values ?? []) { + if (exception.value) { + exception.value = exception.value.replace(EMAIL, '[email]'); + } + } + + return event; + }, + }); + + if (config.userId) { + Sentry.setUser({ id: String(config.userId) }); + } + Sentry.setTag('area', config.area); + + return Sentry; + }); + + return sdk; +} + +/** + * Promise-Ablehnungen mit Objekt statt Error kamen als „Error: [object Object]“ + * an — Typ und Inhalt mitschicken, + * damit die Quelle erkennbar ist. + */ +function rejectionToError(reason) { + if (reason instanceof Error) { + return reason; + } + + const kind = reason?.constructor?.name ?? typeof reason; + let text; + try { + text = typeof reason === 'string' ? reason : JSON.stringify(reason); + } catch { + text = String(reason); + } + + return new Error(`Unbehandelte Ablehnung (${kind}): ${String(text ?? '').slice(0, 300)}`); +} + +function capture(error) { + loadSdk() + .then((Sentry) => Sentry.captureException(error)) + .catch(() => {}); +} + +if (config?.dsn) { + window.addEventListener('error', (event) => { + // Ressourcenfehler (Bild, Skript) haben kein `error` — nur echte Skriptfehler. + if (event.error) { + capture(event.error); + } + }); + + window.addEventListener('unhandledrejection', (event) => { + capture(rejectionToError(event.reason)); + }); +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/resources/views/components/monitoring/browser-errors.blade.php b/dev/git-deploy-monitoring/vorlagen/laravel/resources/views/components/monitoring/browser-errors.blade.php new file mode 100644 index 00000000..0b1b07b8 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/resources/views/components/monitoring/browser-errors.blade.php @@ -0,0 +1,14 @@ +@props(['build' => 'build', 'area' => 'web']) +{{-- Browserfehler an GlitchTip. Ohne SENTRY_BROWSER_DSN + wird nichts eingebunden; das SDK selbst lädt erst beim ersten Fehler. --}} +@if (filled(config('monitoring.browser.dsn'))) + + @vite(['resources/js/error-reporting.js'], $build) +@endif diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/BrowserErrorReportingTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/BrowserErrorReportingTest.php new file mode 100644 index 00000000..f8d10f93 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/BrowserErrorReportingTest.php @@ -0,0 +1,38 @@ +withoutVite(); +}); + +test('nothing is rendered without a browser dsn', function () { + config()->set('monitoring.browser.dsn', null); + + expect(Blade::render(''))->toBe(''); +}); + +test('the configuration carries dsn, release and the user id only', function () { + config()->set('monitoring.browser.dsn', 'https://public@glitchtip.test/2'); + config()->set('sentry.release', 'abc1234'); + $user = User::factory()->create(['email' => 'kunde@example.com']); + $this->actingAs($user); + + $html = Blade::render(''); + + preg_match('/toMatchArray([ + 'dsn' => 'https://public@glitchtip.test/2', + 'release' => 'abc1234', + 'userId' => $user->id, + 'area' => 'portal', + ]) + ->and($html)->not->toContain('kunde@example.com'); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorReportingTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorReportingTest.php new file mode 100644 index 00000000..ca527458 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorReportingTest.php @@ -0,0 +1,95 @@ +create(['email' => 'kunde@example.com']); + $this->actingAs($user); + + report(new RuntimeException('Import für kunde@example.com fehlgeschlagen')); + + expect($glitchTip->events)->toHaveCount(1); + + $event = $glitchTip->events[0]; + expect($event->getUser()?->getId())->toBe($user->id) + ->and($event->getUser()?->getEmail())->toBeNull() + ->and($event->getExceptions()[0]->getValue())->toBe('Import für [email] fehlgeschlagen'); +}); + +test('exceptions laravel does not report stay out of glitchtip', function () { + $glitchTip = FakeGlitchTip::install(); + + $this->get('/diese-seite-gibt-es-nicht')->assertNotFound(); + + expect($glitchTip->events)->toBe([]); +}); + +test('a mistyped artisan command is not reported', function () { + $glitchTip = FakeGlitchTip::install(); + + report(new CommandNotFoundException('Command "config:cachels" is not defined.')); + + expect($glitchTip->events)->toBe([]); +}); + +test('request data loses tokens, signatures and bodies', function () { + $scrubbed = ErrorReportScrubber::scrubRequest([ + 'url' => 'https://app.test/einladung/5?signature=abc123&expires=1700000000&page=2', + 'query_string' => 'signature=abc123&expires=1700000000&page=2&utm_source=nl', + 'data' => ['password' => 'geheim'], + 'cookies' => ['app_session' => 'x'], + 'headers' => ['referer' => ['https://app.test/reset-password/'.str_repeat('a', 64).'?email=kunde@example.com']], + ]); + + expect($scrubbed['url'])->toBe('https://app.test/einladung/5?signature=%5BFiltered%5D&expires=%5BFiltered%5D&page=2') + ->and($scrubbed['query_string'])->toBe('signature=%5BFiltered%5D&expires=%5BFiltered%5D&page=2&utm_source=nl') + ->and($scrubbed)->not->toHaveKeys(['data', 'cookies']) + ->and($scrubbed['headers']['referer'][0])->toBe('https://app.test/reset-password/[Filtered]?email=%5BFiltered%5D'); +}); + +test('route parameters named like secrets are removed from the url', function () { + Route::middleware('web')->get('/_test/magic/{token}', function () { + $event = Event::createEvent(); + $event->setRequest(['url' => request()->fullUrl()]); + + return ErrorReportScrubber::beforeSend($event)?->getRequest()['url']; + }); + + $this->get('/_test/magic/kurz123') + ->assertSuccessful() + ->assertSee('/_test/magic/[Filtered]', false) + ->assertDontSee('kurz123'); +}); + +test('messages and exception values lose e-mail addresses', function () { + $event = Event::createEvent(); + $event->setMessage('Bounce von info@firma.de', [], 'Bounce von info@firma.de'); + $event->setExceptions([new ExceptionDataBag(new RuntimeException('Duplicate entry \'a.b@c.org\''))]); + + $scrubbed = ErrorReportScrubber::beforeSend($event); + + expect($scrubbed?->getMessage())->toBe('Bounce von [email]') + ->and($scrubbed?->getMessageFormatted())->toBe('Bounce von [email]') + ->and($scrubbed?->getExceptions()[0]->getValue())->toBe('Duplicate entry \'[email]\'') + ->and($scrubbed?->getUser())->toBeNull(); +}); + +test('the test suite never reports to the real glitchtip', function () { + // Ohne diese Absicherung landeten absichtlich provozierte Fehler + // („Queue weg“, „Datenbank nicht erreichbar“) als Issues in GlitchTip. + expect(config('sentry.dsn'))->toBeEmpty() + ->and(config('monitoring.browser.dsn'))->toBeEmpty() + ->and(SentrySdk::getCurrentHub()->getClient()?->getOptions()->getDsn())->toBeNull(); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorSignalsTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorSignalsTest.php new file mode 100644 index 00000000..2b831591 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/ErrorSignalsTest.php @@ -0,0 +1,71 @@ +withoutDefer(); + $this->glitchTip = FakeGlitchTip::install(); + + Route::middleware('web')->get('/_test/forbidden', fn () => abort(403))->name('test.forbidden'); + Route::middleware('web')->get('/_test/expired', fn () => abort(419))->name('test.expired'); + Route::middleware('web')->get('/_test/throttled', fn () => abort(429))->name('test.throttled'); +}); + +test('a 404 reached from one of our own pages is reported as a dead internal link', function () { + $this->get('/gibt-es-nicht', ['referer' => url('/de/presse')])->assertNotFound(); + + expect($this->glitchTip->messages())->toBe(['Toter interner Link: /gibt-es-nicht']); + + $event = $this->glitchTip->events[0]; + expect($event->getTags())->toMatchArray(['signal' => ErrorSignal::DeadInternalLink]) + ->and($event->getFingerprint())->toBe(['error-signal', ErrorSignal::DeadInternalLink, '/gibt-es-nicht']) + ->and($event->getContexts()['signal']['referer'])->toBe('/de/presse'); +}); + +test('a 404 without referer or from another site is not reported', function () { + $this->get('/gibt-es-nicht')->assertNotFound(); + $this->get('/gibt-es-nicht', ['referer' => 'https://google.com/search'])->assertNotFound(); + + expect($this->glitchTip->events)->toBe([]); +}); + +test('403 and 429 are reported only for signed-in users', function () { + $this->get('/_test/forbidden')->assertForbidden(); + $this->get('/_test/throttled')->assertTooManyRequests(); + + expect($this->glitchTip->events)->toBe([]); + + $this->actingAs(User::factory()->create()); + $this->get('/_test/forbidden')->assertForbidden(); + $this->get('/_test/throttled')->assertTooManyRequests(); + + expect($this->glitchTip->messages())->toBe([ + 'Zugriff verweigert (angemeldet): test.forbidden', + 'Drosselung trifft angemeldeten Nutzer: test.throttled', + ]); +}); + +test('an expired page is always reported, for livewire with the page as location', function () { + $this->get('/_test/expired')->assertStatus(419); + $this->get('/_test/expired', ['X-Livewire' => '1', 'referer' => url('/me/pressemitteilungen/neu')])->assertStatus(419); + + expect($this->glitchTip->messages())->toBe([ + 'Seite abgelaufen (419): test.expired', + 'Seite abgelaufen (419): livewire /me/pressemitteilungen/neu', + ]); +}); + +test('each signal group is capped at five reports per window', function () { + foreach (range(1, 7) as $attempt) { + $this->get('/_test/expired'); + } + + expect($this->glitchTip->events)->toHaveCount(5); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/HealthEndpointTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/HealthEndpointTest.php new file mode 100644 index 00000000..0b2bea2d --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/HealthEndpointTest.php @@ -0,0 +1,91 @@ +set('monitoring.health.token', 'geheimes-monitor-token'); + config()->set('monitoring.health.disk_min_free_percent', 0); + config()->set('queue.default', 'database'); +}); + +afterEach(function () { + @unlink(HealthProbe::heartbeatPath()); +}); + +function healthHeaders(): array +{ + return ['Authorization' => 'Bearer geheimes-monitor-token']; +} + +test('the endpoint does not exist without a configured token or with a wrong one', function () { + app(HealthProbe::class)->recordHeartbeat(); + + $this->get('/health', healthHeaders())->assertOk(); + + $this->get('/health', ['Authorization' => 'Bearer falsch'])->assertNotFound(); + $this->get('/health')->assertNotFound(); + + config()->set('monitoring.health.token', null); + $this->get('/health', healthHeaders())->assertNotFound(); +}); + +test('a healthy system answers 200 with every check', function () { + config()->set('app.version', 'v1.1.0'); + $this->artisan('monitoring:heartbeat')->assertSuccessful(); + + $this->get('/health?token=geheimes-monitor-token') + ->assertOk() + ->assertHeader('Cache-Control', 'no-store, private') + ->assertJsonPath('status', 'ok') + ->assertJsonPath('version', 'v1.1.0') + ->assertJsonPath('checks.database.status', 'ok') + ->assertJsonPath('checks.cache.status', 'ok') + ->assertJsonPath('checks.queue.status', 'ok') + ->assertJsonPath('checks.scheduler.status', 'ok') + ->assertJsonStructure(['checks' => ['disk' => ['status', 'detail']]]); +}); + +test('a missing or stale heartbeat makes the endpoint fail', function () { + $this->get('/health', healthHeaders()) + ->assertStatus(503) + ->assertJsonPath('checks.scheduler.status', 'critical'); + + app(HealthProbe::class)->recordHeartbeat(); + + $this->travel(4)->minutes(); + $this->get('/health', healthHeaders())->assertOk()->assertJsonPath('checks.scheduler.status', 'warn'); + + $this->travel(7)->minutes(); + $this->get('/health', healthHeaders())->assertStatus(503)->assertJsonPath('checks.scheduler.status', 'critical'); +}); + +test('a queue backlog older than five minutes makes the endpoint fail', function () { + app(HealthProbe::class)->recordHeartbeat(); + + DB::table('jobs')->insert([ + 'queue' => 'default', + 'payload' => '{}', + 'attempts' => 0, + 'reserved_at' => null, + 'available_at' => now()->subMinutes(6)->getTimestamp(), + 'created_at' => now()->subMinutes(6)->getTimestamp(), + ]); + + $this->get('/health', healthHeaders()) + ->assertStatus(503) + ->assertJsonPath('checks.queue.status', 'critical'); +}); + +test('the endpoint skips the session and the web middleware group', function () { + app(HealthProbe::class)->recordHeartbeat(); + + $this->get('/health', healthHeaders()) + ->assertOk() + ->assertCookieMissing(config('session.cookie')); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/OperationalAlertTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/OperationalAlertTest.php new file mode 100644 index 00000000..9de5664a --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/OperationalAlertTest.php @@ -0,0 +1,82 @@ +set('monitoring.alerts.enabled', true); + config()->set('monitoring.alerts.mail_to', null); + config()->set('monitoring.alerts.ntfy', ['url' => null, 'topic' => null, 'token' => null, 'priority' => 4]); +}); + +test('an alert always logs critical to the monitoring channel', function () { + $monitoringLog = Mockery::spy(LoggerInterface::class); + Log::shouldReceive('channel')->with('monitoring')->andReturn($monitoringLog); + + OperationalAlert::send('Geplanter Task fehlgeschlagen: demo', ['exit_code' => 1]); + + $monitoringLog->shouldHaveReceived('critical')->once(); +}); + +test('an alert mails the configured recipient', function () { + config()->set('monitoring.alerts.mail_to', 'ops@example.com'); + Event::fake([MessageSent::class]); + + OperationalAlert::send('Etwas ist kaputt', ['exit_code' => 1]); + + Event::assertDispatched(MessageSent::class, function (MessageSent $event): bool { + $recipients = array_map(fn ($address): string => $address->getAddress(), $event->message->getTo()); + + return in_array('ops@example.com', $recipients, true) + && str_contains((string) $event->message->getSubject(), 'Etwas ist kaputt'); + }); +}); + +test('an alert is pushed to ntfy as json with token and priority', function () { + config()->set('monitoring.alerts.ntfy', ['url' => 'https://push.example.com/', 'topic' => 'app-ops', 'token' => 'tk_geheim', 'priority' => 4]); + Http::fake(['push.example.com*' => Http::response(['id' => 'x'])]); + + OperationalAlert::send('Queue-Job fehlgeschlagen: Demo', ['exit_code' => 1]); + + Http::assertSent(fn (Request $request): bool => $request->url() === 'https://push.example.com' + && $request->hasHeader('Authorization', 'Bearer tk_geheim') + && $request['topic'] === 'app-ops' + && $request['priority'] === 4 + && str_contains($request['message'], 'exit_code: 1')); +}); + +test('a failing push never bubbles up and nothing is sent when alerts are off', function () { + config()->set('monitoring.alerts.ntfy', ['url' => 'https://push.example.com', 'topic' => 'app-ops', 'token' => null, 'priority' => 4]); + Http::fake(['push.example.com*' => Http::response('down', 502)]); + + OperationalAlert::send('Etwas ist kaputt'); + Http::assertSentCount(1); + + config()->set('monitoring.alerts.enabled', false); + OperationalAlert::send('Etwas ist kaputt'); + Http::assertSentCount(1); +}); + +test('a failed queue job triggers an alert via the registered listener', function () { + config()->set('monitoring.alerts.ntfy', ['url' => 'https://push.example.com', 'topic' => 'app-ops', 'token' => null, 'priority' => 4]); + Http::fake(); + + $job = Mockery::mock(Job::class); + $job->shouldReceive('resolveName')->andReturn('App\\Jobs\\Demo'); + $job->shouldReceive('getQueue')->andReturn('default'); + + event(new JobFailed('database', $job, new RuntimeException('boom'))); + + Http::assertSent(fn (Request $request): bool => str_contains($request['message'], 'App\\Jobs\\Demo')); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/QueueProbeTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/QueueProbeTest.php new file mode 100644 index 00000000..69c04b25 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Feature/Monitoring/QueueProbeTest.php @@ -0,0 +1,39 @@ +artisan('monitoring:queue-probe', ['--wait' => 30]) + ->expectsOutputToContain('Queue-Worker läuft (Test-Job nach 0 s abgeholt).') + ->assertSuccessful(); + + Sleep::assertSleptTimes(0); +}); + +test('without a worker the probe fails after the waiting time with a hint', function () { + Sleep::fake(); + Queue::fake(); + + $this->artisan('monitoring:queue-probe', ['--wait' => 5]) + ->expectsOutputToContain('Kein Queue-Worker hat den Test-Job innerhalb von 5 s abgeholt.') + ->expectsOutputToContain('Worker prüfen') + ->assertFailed(); + + Queue::assertPushed(QueueProbe::class, fn (QueueProbe $job): bool => $job->queue === null); + Sleep::assertSleptTimes(5); +}); + +test('the probe job only acknowledges its own token', function () { + (new QueueProbe('abc'))->handle(); + + expect(cache()->has(QueueProbe::cacheKey('abc')))->toBeTrue() + ->and(cache()->has(QueueProbe::cacheKey('xyz')))->toBeFalse(); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Support/FakeGlitchTip.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Support/FakeGlitchTip.php new file mode 100644 index 00000000..f3c38b1a --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Support/FakeGlitchTip.php @@ -0,0 +1,63 @@ +events + */ +class FakeGlitchTip implements TransportInterface +{ + /** @var list */ + public array $events = []; + + public static function install(): self + { + $transport = new self; + + $client = ClientBuilder::create([ + 'dsn' => 'https://public@glitchtip.test/1', + 'default_integrations' => false, + 'send_default_pii' => config('sentry.send_default_pii'), + 'max_request_body_size' => config('sentry.max_request_body_size'), + 'before_send' => config('sentry.before_send'), + ])->setTransport($transport)->getClient(); + + SentrySdk::getCurrentHub()->bindClient($client); + + return $transport; + } + + public function send(Event $event): Result + { + $this->events[] = $event; + + return new Result(ResultStatus::success(), $event); + } + + public function close(?int $timeout = null): Result + { + return new Result(ResultStatus::success()); + } + + /** + * @return list + */ + public function messages(): array + { + return array_values(array_map( + static fn (Event $event): string => (string) ($event->getMessage() ?? $event->getExceptions()[0]?->getValue()), + $this->events, + )); + } +} diff --git a/dev/git-deploy-monitoring/vorlagen/laravel/tests/Unit/Monitoring/ReleaseTest.php b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Unit/Monitoring/ReleaseTest.php new file mode 100644 index 00000000..e0aff22b --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/laravel/tests/Unit/Monitoring/ReleaseTest.php @@ -0,0 +1,38 @@ +dir = sys_get_temp_dir().'/release-test-'.uniqid(); + mkdir($this->dir); +}); + +afterEach(function () { + @unlink($this->dir.'/RELEASE'); + @rmdir($this->dir); +}); + +test('the configured value wins over the release file', function () { + file_put_contents($this->dir.'/RELEASE', "abc1234\n"); + + expect(Release::current('v1.2.0', $this->dir))->toBe('v1.2.0'); +}); + +test('the release file is used when nothing is configured', function () { + file_put_contents($this->dir.'/RELEASE', "98c465b-dirty\n"); + + expect(Release::current(null, $this->dir))->toBe('98c465b-dirty') + ->and(Release::current(' ', $this->dir))->toBe('98c465b-dirty'); +}); + +test('without file or with garbage there is no release', function () { + expect(Release::current(null, $this->dir))->toBeNull(); + + file_put_contents($this->dir.'/RELEASE', ' # bei jedem Deploy'); + + expect(Release::current(null, $this->dir))->toBeNull(); +}); diff --git a/dev/git-deploy-monitoring/vorlagen/server/Caddyfile b/dev/git-deploy-monitoring/vorlagen/server/Caddyfile new file mode 100644 index 00000000..68b54215 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/server/Caddyfile @@ -0,0 +1,14 @@ +# Reverse Proxy mit automatischem TLS (Let's Encrypt) für den Monitoring-Server. +# Wer schon nginx/Traefik/Ploi nutzt, trägt dort dieselben drei Ziele ein. + +errors.example.com { + reverse_proxy 127.0.0.1:8000 +} + +push.example.com { + reverse_proxy 127.0.0.1:2586 +} + +status.example.com { + reverse_proxy 127.0.0.1:3001 +} diff --git a/dev/git-deploy-monitoring/vorlagen/server/glitchtip-compose.yml b/dev/git-deploy-monitoring/vorlagen/server/glitchtip-compose.yml new file mode 100644 index 00000000..3f5cc499 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/server/glitchtip-compose.yml @@ -0,0 +1,54 @@ +# GlitchTip — selbst gehostetes Fehlerprotokoll (Sentry-kompatibel). +# Grundlage: offizielle compose.sample.yml (GlitchTip 6, Stand 10/2026), +# https://glitchtip.com/documentation/install — vor dem Einsatz abgleichen. +# +# Start: docker compose -f glitchtip-compose.yml up -d +# Danach: https:// öffnen, Konto anlegen, dann +# ENABLE_USER_REGISTRATION auf "False" setzen und neu starten. + +x-environment: &default-environment + DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres + VALKEY_URL: redis://valkey:6379 + SECRET_KEY: change_me # openssl rand -hex 32 + GLITCHTIP_DOMAIN: https://errors.example.com # mit Schema + DEFAULT_FROM_EMAIL: errors@example.com + EMAIL_URL: smtp://user:password@smtp.example.com:587 # Alert-Mails + ENABLE_USER_REGISTRATION: "False" # nach dem ersten Konto aus + GLITCHTIP_RETENTION_DAYS: "90" # Aufbewahrung — in der Datenschutzerklärung nennen + ENABLE_ADMIN: "False" + ENABLE_OPENAPI: "False" + # Weniger RAM (256–512 MB): Valkey abschalten und Postgres als Queue nutzen + # VALKEY_URL: "" + # GLITCHTIP_ENABLE_LOGS: "False" + # GLITCHTIP_ENABLE_UPTIME: "False" # wir nutzen Uptime Kuma + +x-depends_on: &default-depends_on + - postgres + - valkey + +services: + postgres: + image: postgres:18 + environment: + POSTGRES_HOST_AUTH_METHOD: "trust" # nur im internen Docker-Netz erreichbar + restart: unless-stopped + volumes: + - pg-data:/var/lib/postgresql + valkey: + image: valkey/valkey:9 + restart: unless-stopped + web: + image: glitchtip/glitchtip:6 # neue Hauptversionen: https://glitchtip.com/blog/ + depends_on: *default-depends_on + ports: + - "127.0.0.1:8000:8000" # nur für den Reverse Proxy + environment: + <<: *default-environment + SERVER_ROLE: all_in_one + restart: unless-stopped + volumes: + - uploads:/code/uploads + +volumes: + pg-data: + uploads: diff --git a/dev/git-deploy-monitoring/vorlagen/server/ntfy-compose.yml b/dev/git-deploy-monitoring/vorlagen/server/ntfy-compose.yml new file mode 100644 index 00000000..964a59f1 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/server/ntfy-compose.yml @@ -0,0 +1,17 @@ +# ntfy — Push-Benachrichtigungen aufs Handy (Betriebs-Alerts, Uptime Kuma). +# Start: docker compose -f ntfy-compose.yml up -d +# Konfiguration: ./ntfy/server.yml (Vorlage ntfy-server.yml) + +services: + ntfy: + image: binwiederhier/ntfy + command: serve + restart: unless-stopped + environment: + TZ: Europe/Berlin + volumes: + - ./ntfy/server.yml:/etc/ntfy/server.yml:ro + - ./ntfy/cache:/var/cache/ntfy + - ./ntfy/lib:/var/lib/ntfy + ports: + - "127.0.0.1:2586:80" # nur für den Reverse Proxy diff --git a/dev/git-deploy-monitoring/vorlagen/server/ntfy-server.yml b/dev/git-deploy-monitoring/vorlagen/server/ntfy-server.yml new file mode 100644 index 00000000..6fcffda2 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/server/ntfy-server.yml @@ -0,0 +1,13 @@ +# ntfy-Serverkonfiguration (im Container: /etc/ntfy/server.yml) +base-url: "https://push.example.com" +behind-proxy: true +cache-file: "/var/cache/ntfy/cache.db" +auth-file: "/var/lib/ntfy/user.db" +# Ohne Anmeldung darf niemand lesen oder schreiben — der Topic-Name ist kein Geheimnis. +auth-default-access: "deny-all" + +# Benutzer und Rechte danach im Container anlegen: +# docker compose -f ntfy-compose.yml exec ntfy ntfy user add --role=admin ich +# docker compose -f ntfy-compose.yml exec ntfy ntfy user add meineapp-alerts +# docker compose -f ntfy-compose.yml exec ntfy ntfy access meineapp-alerts meineapp-ops write-only +# docker compose -f ntfy-compose.yml exec ntfy ntfy token add meineapp-alerts # → tk_… in die App-.env diff --git a/dev/git-deploy-monitoring/vorlagen/server/uptime-kuma-compose.yml b/dev/git-deploy-monitoring/vorlagen/server/uptime-kuma-compose.yml new file mode 100644 index 00000000..9445d592 --- /dev/null +++ b/dev/git-deploy-monitoring/vorlagen/server/uptime-kuma-compose.yml @@ -0,0 +1,12 @@ +# Uptime Kuma — externer Monitor (prüft /health und /up von außen). +# Auf einem ANDEREN Server als die überwachte App betreiben, sonst fällt er mit ihr aus. +# Start: docker compose -f uptime-kuma-compose.yml up -d + +services: + uptime-kuma: + image: louislam/uptime-kuma:2 # aktuelle Hauptversion prüfen + restart: unless-stopped + volumes: + - ./uptime-kuma:/app/data + ports: + - "127.0.0.1:3001:3001" # nur für den Reverse Proxy diff --git a/dev/glitch-tip/README.md b/dev/glitch-tip/README.md index cb6b1c79..1ede86f4 100644 --- a/dev/glitch-tip/README.md +++ b/dev/glitch-tip/README.md @@ -21,7 +21,7 @@ Entscheidungen: [`../betrieb/monitoring-plan.md`](../betrieb/monitoring-plan.md) | Projekt 2 | `browser-pressekonto` — JavaScript-Fehler aus dem Browser | | Umgebungen | `production` (Live), `local` (Entwicklung). Nur `production` ist Betrieb | | Release | Git-Tag aus der Datei `RELEASE` (z. B. `v1.1.0`), siehe Abschnitt 6 | -| Aufbewahrung | 90 Tage (`GLITCHTIP_MAX_EVENT_LIFE_DAYS` auf dem GlitchTip-Server) | +| Aufbewahrung | 90 Tage (`GLITCHTIP_RETENTION_DAYS` auf dem GlitchTip-Server; ältere Versionen: `GLITCHTIP_MAX_EVENT_LIFE_DAYS`) | | Alarmierung | GlitchTip-Alert-Regel: Mail bei neuem Fehlertyp. Betriebs-Alerts der App (fehlgeschlagene Jobs/Tasks) laufen getrennt über Mail + ntfy (`push.adametz.media`, Topic `pressekonto-ops`) | GlitchTip ist **nicht** das einzige Signal. Daneben: `/health` (externer @@ -143,7 +143,7 @@ Wenn der Auftrag lautet „schau in GlitchTip“, „was sagt GlitchTip“ o. Ä ## 5. Regeln, die nicht verletzt werden dürfen -- **Datenschutz (M4):** `send_default_pii` bleibt `false`, `max_request_body_size` bleibt `never`, Log- und Cache-Breadcrumbs bleiben aus, `ErrorReportScrubber` bleibt in `before_send`. Kein Name, keine E-Mail, keine IP an GlitchTip — nur die interne User-ID. Neue Query-Parameter, die mitgehen sollen, nur über `ErrorReportScrubber::AllowedQueryParameters` (und dieselbe Liste in `error-reporting.js` / Umami-Filter). +- **Datenschutz (M4):** `send_default_pii` bleibt `false`, `max_request_body_size` bleibt `never`, Log- und Cache-Breadcrumbs bleiben aus, `ErrorReportScrubber` bleibt in `before_send` und entfernt die Daten aller Breadcrumbs; Livewire-Breadcrumbs bleiben aus (sie tragen Formularwerte und Properties, Roadmap 4.9). Kein Name, keine E-Mail, keine IP an GlitchTip — nur die interne User-ID. Neue Query-Parameter, die mitgehen sollen, nur über `ErrorReportScrubber::AllowedQueryParameters` (und dieselbe Liste in `error-reporting.js` / Umami-Filter). - **Keine variablen Zahlen in Fehlermeldungen**, wenn sie gruppiert werden sollen: GlitchTip gruppiert nach Text. `…after 20002 ms` und `…after 20001 ms` wurden drei getrennte Einträge (Issues 11, 13, 14). Variable Werte in den Kontext, nicht in die Meldung — oder einen Fingerprint setzen wie `ErrorSignal`. - **Vorübergehende Fremdfehler nicht einzeln melden.** Sonst flutet ein Google-Ausfall GlitchTip und verdeckt echte Fehler. - **Tests melden nie an GlitchTip** (Abschnitt 2). Neue Sentry-Tests nur mit `FakeGlitchTip`. diff --git a/dev/partner/bewertung_bestepresse-optionen.md b/dev/partner/bewertung_bestepresse-optionen.md new file mode 100644 index 00000000..06b5175c --- /dev/null +++ b/dev/partner/bewertung_bestepresse-optionen.md @@ -0,0 +1,184 @@ +# Bewertung: BestePresse-Rubrik und weitere Optionen der Zusammenarbeit + +**Stand:** 19.09.2026 +**Bezug:** Konzept „Rubrik BestePresse" (konzept_bestepresse-rubrik.md) + +--- + +## Teil A — Pro und Contra der Rubrik + +### Pro + +| Punkt | Warum es zählt | +|---|---| +| **Geringer Aufwand, kein Geldfluss** | Rubrik, Kuratorenrolle, Kandidatenliste, Infoseiten. Kein Honorar, keine Provision, keine Sonderentwicklung. Als Solo-Betreiber ist das der entscheidende Punkt. | +| **Löst den Interessenkonflikt strukturell** | Bezahlt wird für Veröffentlichung, die Spitze ist Auswahl aus bereits Veröffentlichtem. Brunns Kernbedenken ist damit beantwortet — er kann zustimmen, ohne sein Prinzip zu verletzen. | +| **Ein Urteil, das du selbst nicht glaubwürdig fällen kannst** | Als Betreiber hast du immer den Anreiz zu füllen. Ein externer Kurator ohne Füllanreiz ist das Seltene an dieser Konstellation. | +| **Anspruch für Einsender** | Die sichtbare Spitze gibt allen darunter ein Ziel. Das treibt Werkzeugnutzung und Qualität — und damit deine Kernpositionierung. | +| **Differenzierung** | Kein Standardportal hat eine unabhängig kuratierte Spitze. Das ist ein Argument gegenüber Direktkunden, das sonst niemand hat. | +| **Lernmaterial** | Kuratorenbegründungen verbessern die Vorauswahl. Fachurteile in dieser Qualität bekommst du sonst nicht. | +| **Archiv als Substanz** | Ausgezeichnete Meldungen bleiben stehen, bilden über Monate einen Korpus mit Suchmaschinenwert und Belegcharakter. | +| **Messbar und abbrechbar** | Sechs Monate, Nullmessung, klare Kennzahlen. Wenn es nicht trägt, ist der Ausstieg sauber. | +| **Hohe Annahmewahrscheinlichkeit** | Beantwortet seine offene Frage (wie bleibt BestePresse sichtbar) und gibt ihm, was er braucht, ohne dass sein Ansatz „verschwindet". | +| **DSGVO-sauber** | Keine Datenweitergabe, keine Kaltansprache, Kurator sieht nur öffentliche Meldungen. | + +### Contra + +| Punkt | Risiko | Gegenmaßnahme | +|---|---|---| +| **Fremde Marke auf eigenen Portalen** | Reputationskopplung: Wird IMKIS nachlässig, kontrovers oder inaktiv, fällt es auf dein Portal zurück. | Name lizenziert, nicht übertragen. Regelung für das Ende. Kurze öffentliche Begründung als Qualitätsnachweis. | +| **Abhängigkeit vom Kurator** | Endet die Partnerschaft, verschwindet die Spitze — und mit ihr ein Qualitätsversprechen, das du bis dahin daran geknüpft hast. | Rubrik an dein Portal binden (URL, Struktur, Archiv). Bei Ende Umbenennung, kein Löschen. Automatische Vorauswahl als Rückfallebene. | +| **Leere Rubrik bei dünnem Zufluss** | Strenger Kurator plus wenig Volumen = wochenlang nichts. Sieht nach verlassenem Bereich aus, ausgerechnet jetzt beim Aufbau. | Laufend statt Rhythmus. Archiv sichtbar halten. Rubrik erst live schalten, wenn erste Auszeichnungen vorliegen. | +| **Unbezahlter Aufwand bei ihm** | Motivation kann nachlassen, besonders wenn ihm keine Aufträge daraus entstehen. Er hat wenig Eigengeschäft, das ihn trägt. | Aufwand klein halten (Kandidatenliste). Gegenleistung in Naturalien prüfen (siehe Teil B, Option 2). Nach 3 Monaten offen über Motivation sprechen. | +| **Zwei-Klassen-Frust bei zahlenden Kunden** | „Ich zahle und werde nie ausgezeichnet." Kann zu Beschwerden oder Abwanderung führen. | Infoseite erklärt Kriterien und Weg. Keine sichtbare Abwertung regulärer Meldungen. Werkzeuge als Angebot, nicht als Vorwurf. | +| **Asymmetrie der Sichtbarkeit** | Er bekommt Markenpräsenz auf zwei Portalen für 20–40 geprüfte Kandidaten im Monat. Das ist viel Reichweite für wenig Aufwand. | Bewusst als Preis für Unabhängigkeit akzeptieren — aber nach 6 Monaten prüfen, ob die Gegenleistung (Auswahl, Verbreitung) real war. | +| **Er lernt deine Bewertungstendenz** | Auch ohne Zahlen sieht er, welche Meldungen oben landen. Über Monate lässt sich daraus ein Bild ableiten. | Keine Score-Werte, nur Status. Keine Einsicht in Kriterien. Kandidatenliste bewusst breit (Top-40), nicht scharf (Top-5). | +| **Der Test prüft auch deinen Score** | Trifft die Vorauswahl nicht, sieht der Kurator nur Mittelmaß, zeichnet nichts aus, beide sind frustriert — und schuld ist unklar. | Treffsicherheit als eigene Kennzahl (§7 des Konzepts). Vorher intern prüfen, ob die Top-40 tatsächlich die besten sind. | +| **Exklusivität ungeklärt** | Betreibt er bestepresse.de parallel weiter, könnte er die ausgezeichneten Meldungen dort ebenfalls listen. Die Spitze wäre dann nicht mehr deine. | Klären: Auszeichnung erscheint primär auf deinen Portalen; sein Portal darf verlinken, nicht duplizieren. | +| **Zusätzlicher Zugangspfad** | Eine weitere Rolle mit Login ist eine weitere Angriffsfläche. | Minimale Rechte, Magic-Link, keine Schreibrechte auf Meldungen. | + +### Gesamteinschätzung + +Die Contras sind real, aber jedes hat eine Gegenmaßnahme, die sich vor dem Start einbauen lässt. Keines ist ein Ausschlussgrund. Das größte Risiko ist nicht die Partnerschaft, sondern der Zeitpunkt: Bei dünnem Zufluss kann die Spitze leer wirken. Deshalb Rubrik erst live schalten, wenn erste Auszeichnungen vorliegen. + +--- + +## Teil B — Weitere Optionen für die Zusammenarbeit + +Jede Option mit Einschätzung: Nutzen für dich, Nutzen für ihn, Aufwand, Risiko, Empfehlung. + +### Option 1 — Gutscheine für Seminarteilnehmer + +Teilnehmer erhalten im Seminar einen Code für eine kostenlose (oder vergünstigte) erste Veröffentlichung der dort erarbeiteten Meldung. + +| | | +|---|---| +| Nutzen für dich | Warme Kontakte werden zu registrierten Nutzern; Grenzkosten nahe null; die Meldung ist frisch geschult und besteht den Filter. | +| Nutzen für ihn | Sein Seminar endet mit einem sichtbaren Ergebnis statt mit einem Dokument — ein echtes Verkaufsargument. | +| Aufwand | Gutscheinmechanik im Hub (wahrscheinlich vorhanden oder klein). | +| Risiko | Einmalnutzer statt Kunden; Wert-Erosion, wenn „kostenlos" zur Erwartung wird. | +| Bedingungen | Begrenzt (Anzahl je Seminar, Gültigkeit), Registrierung erforderlich, normale Prüfung, transparent kommuniziert („erste Veröffentlichung inklusive, danach reguläre Preise"). | +| **Empfehlung** | **Ja, sofort.** Passt zur Anti-Zombie-Haltung, solange es transparent ist. | + +### Option 2 — Kontingent für IMKIS als Gegenleistung für die Kuratierung + +Statt Honorar erhält IMKIS monatlich X Veröffentlichungen, die er für Seminare oder Kunden einsetzt. + +| | | +|---|---| +| Nutzen für dich | Vergütung ohne Geldfluss; koppelt seinen Anreiz an dein Portal; jede genutzte Veröffentlichung ist ein neuer Account bei dir. | +| Nutzen für ihn | Konkrete, verwertbare Gegenleistung; kann er als Bestandteil seiner Leistung einpreisen. | +| Aufwand | Kontingentverwaltung im Hub. | +| Risiko | Wert-Signal: Was du verschenkst, wirkt weniger wert. Er könnte das Kontingent weiterverkaufen. | +| Bedingungen | Begrenzt (z. B. 3–5/Monat), nicht übertragbar an Dritte außerhalb seiner Seminare/Kunden, Endnutzer registriert sich selbst, normale Prüfung. | +| **Empfehlung** | **Ja, als elegante Lösung des Vergütungsproblems.** Besser als ein Honorar, weil es sein Interesse an deinem Portal stärkt statt es zu neutralisieren. | + +### Option 3 — Gekauftes Kontingent (Wholesale) + +IMKIS kauft Veröffentlichungen mit Mengenrabatt und rechnet sie in Seminar- oder Beratungspreise ein. + +| | | +|---|---| +| Nutzen für dich | Umsatz sofort, planbar. | +| Nutzen für ihn | Marge oder Mehrwert im eigenen Angebot. | +| Aufwand | Wie Option 2 plus Abrechnung. | +| Risiko | Kundenbeziehung liegt bei ihm; dein Portal wird Zulieferer. Bei Registrierungspflicht bleibt der Account trotzdem bei dir. | +| **Empfehlung** | **Später, wenn Option 1/2 Volumen zeigen.** Jetzt zu früh — er hat noch kein Volumen, das ein Kontingent rechtfertigt. | + +### Option 4 — Redaktionsleistung sichtbar auf den Portalen + +Meldungen, die IMKIS überarbeitet hat, tragen ein Attribut „redaktionell geprüft" (kein drittes Level, ein Merkmal). + +| | | +|---|---| +| Nutzen für dich | Qualitätsmerkmal, das sonst niemand hat; Rückweg von seiner Leistung zu deiner Veröffentlichung. | +| Nutzen für ihn | Sichtbares Verkaufsargument für seine Redaktion. | +| Risiko | Verwischt die Zwei-Stufen-Logik, wenn es wie eine dritte Stufe wirkt. Interessenkonflikt mit der Auszeichnung (siehe Konzept §9). | +| **Empfehlung** | **Vorsichtig, als Attribut, nicht als Stufe.** Erst wenn Rubrik läuft und die Konfliktregel steht. | + +### Option 5 — Gastbeiträge für die Infoseiten + +IMKIS liefert Fachtexte für „Bessere Pressemitteilungen" und die BestePresse-Erklärseite. + +| | | +|---|---| +| Nutzen für dich | Inhalte mit Substanz für Suche und KI-Auffindbarkeit, ohne eigenen Schreibaufwand. | +| Nutzen für ihn | Expertise sichtbar, Autorenzeile, Verlinkung. | +| Aufwand | Redaktion und Einpflege. | +| Risiko | Inhalte gehören ihm oder dir? Vorher klären. Noch mehr IMKIS-Sichtbarkeit. | +| **Empfehlung** | **Ja, mit Nutzungsrecht bei dir.** Passt zu seiner Motivation („zurück zur Pressearbeit"). | + +### Option 6 — Kurzer Gastauftritt im Seminar + +Du zeigst Portal und Werkzeuge 15–20 Minuten remote in seinen Presseseminaren. + +| | | +|---|---| +| Nutzen für dich | Direkte Konversion im wertvollsten Moment; du bist als Person sichtbar. | +| Nutzen für ihn | Praxisdemonstration im Seminar, Mehrwert für Teilnehmer. | +| Aufwand | 15–20 Minuten je Seminar, 15–20 Seminare im Jahr. | +| Risiko | Zeit — das ist deine knappste Ressource. | +| **Empfehlung** | **Testweise bei 2–3 Seminaren.** Wenn Konversion sichtbar, aufzeichnen und als Video einbinden lassen. | + +### Option 7 — Jahresauswahl „BestePresse des Jahres" + +Einmal jährlich Best-of aus der Rubrik mit eigener Meldung darüber (Meta-PR). + +| | | +|---|---| +| Nutzen für dich | Aufmerksamkeit, Anlass für Redaktionen, Anreiz für Einsender über das Jahr. | +| Nutzen für ihn | Höhepunkt seiner Kuratierung, Redaktionsanlass. | +| Aufwand | Gering, wenn die Rubrik läuft. | +| Risiko | Award-Inflation, wenn es zu früh oder zu oft passiert. | +| **Empfehlung** | **Ab Jahr zwei**, wenn die Rubrik Substanz hat. | + +### Option 8 — Fachliche Schärfung der Kriterien gegen Vergütung + +IMKIS liefert journalistische Kriterien und Testfälle für Score und Werkzeuge — als Beratung, vergütet in Geld oder Kontingent. + +| | | +|---|---| +| Nutzen für dich | Verbessert deinen Kern; Fachurteil, das du nicht selbst hast. | +| Nutzen für ihn | Honorar oder Kontingent; Einfluss auf Qualitätsverständnis. | +| Risiko | Grenze zur Offenlegung der Prüflogik. Er liefert Maßstäbe, sieht nicht die Gewichtung. | +| **Empfehlung** | **Ja, aber als separater Auftrag**, nicht als Partnerschaftsbestandteil. Klar begrenzt. | + +### Option 9 — Kostenloser Qualitätscheck als Einstieg + +Interessenten laden eine Meldung hoch, bekommen eine Bewertung, dann das Angebot zur Veröffentlichung (dein Freemium-Einstieg für Prüfung, nicht Veröffentlichung). + +| | | +|---|---| +| Nutzen für dich | Lead-Instrument, zeigt Werkzeug, führt zur Veröffentlichung. | +| Nutzen für ihn | Anschluss für redaktionelle Hilfe bei schwacher Bewertung. | +| Risiko | Bewertung wird öffentlich sichtbar, Rückschluss auf Kriterien; Missbrauch als Gratis-Prüfdienst. | +| **Empfehlung** | **Eigenes Produkt, unabhängig von IMKIS.** Erst bauen, wenn Werkzeuge stehen; Ergebnis grob (Ampel), nicht als Zahl. | + +### Option 10 — Backlink von bestepresse.de + +Sein Portal (falls er es weiterbetreibt) nennt presseecho als Veröffentlichungsort. + +| | | +|---|---| +| Nutzen für dich | Zufluss, Verlinkung. | +| Risiko | Abhängig von seiner Portalentscheidung. | +| **Empfehlung** | **Mitnehmen, nicht darauf bauen.** | + +--- + +## Rangfolge für das Treffen + +| Priorität | Option | Zeitpunkt | +|---|---|---| +| 1 | Rubrik BestePresse (Konzept) | Start nach Treffen | +| 2 | Gutscheine für Seminarteilnehmer | sofort | +| 3 | Kontingent als Gegenleistung für Kuratierung | mit Start der Rubrik | +| 4 | Gastbeiträge für Infoseiten | erste 3 Monate | +| 5 | Gastauftritt im Seminar (2–3 Tests) | erste 3 Monate | +| 6 | Redaktionell-geprüft-Attribut | nach Konfliktregel, ab Monat 3 | +| 7 | Fachliche Schärfung als Auftrag | separat, bei Bedarf | +| 8 | Wholesale-Kontingent | nach 6 Monaten, bei Volumen | +| 9 | Jahresauswahl | Jahr 2 | +| 10 | Qualitätscheck-Freemium | eigenes Produkt, unabhängig | + +**Für das Treffen anbieten:** 1, 2, 3. **Als Idee einbringen:** 4, 5. **Zurückhalten:** der Rest. diff --git a/dev/partner/decision-update_spitze-ohne-partner.md b/dev/partner/decision-update_spitze-ohne-partner.md new file mode 100644 index 00000000..967aa88f --- /dev/null +++ b/dev/partner/decision-update_spitze-ohne-partner.md @@ -0,0 +1,99 @@ +# Decision-Update: Spitze ohne Partner — Schwelle statt Quote + +**Stand:** 13.10.2026 +**Status:** Entscheidung; Umsetzung in der genannten Reihenfolge +**Abschluss:** Kooperation IMKIS/BestePresse (Juli–Oktober 2026) beidseitig freundlich beendet. Kontakt bleibt; Option Markenberatung für IMKIS-Kunden offen. + +--- + +## 1. Entscheidung + +Die Spitzen-Rubrik wird **ohne externen Kurator** umgesetzt. Auswahl erfolgt über eine **feste, öffentlich bekannte Schwelle** auf Basis des bestehenden Scorings — nicht über eine Quote („die besten 10 %") und nicht über redaktionelles Ermessen des Betreibers. + +**Grund:** Der Betreiber hat einen Füllanreiz und kann deshalb nicht glaubwürdig von Hand kuratieren. Eine Schwelle löst das: Sie füllt sich nur, wenn jemand sie reißt, und darf leer bleiben, ohne dass jemand entscheiden muss. Transparent ausgewiesen („automatisch ermittelt nach veröffentlichten Kriterien") ist das ehrlicher als eine unkontrollierte Redaktion. + +**Name:** offen. Nicht „BestePresse" (fremde Marke). Vorschläge: „Top-Meldungen", „Ausgezeichnet", „Die Besten". Entscheidung bei Umsetzung. + +--- + +## 2. Kern-Learning aus dem IMKIS-Austausch + +**Der Anreiz ist das Produkt, nicht der Partner.** Qualität steigt nur, wenn es etwas zu erreichen gibt: mehr Sichtbarkeit für Meldungen, die eine klare Messlatte überschreiten. Eine sichtbare Spitze erzeugt den Wunsch, die Werkzeuge liefern den Weg, die Markenarbeit ist der Grund, warum es funktioniert. + +**Die Kette:** Marke → gute Meldung → Spitze → Sichtbarkeit → Kunden. + +- Markenbetriebssystem: Ursache guter Meldungen (wer weiß, wofür er steht, schreibt mit Substanz) +- Werkzeuge (KI-gestützt): Brücke von Ebene 1 zu Ebene 2 +- Spitze: sichtbares Ziel, das den Aufwand lohnt +- Portal: der Ort, an dem es sichtbar wird + +KI darf an jeder Stelle helfen. Die Regeln kommen vom Betreiber. + +--- + +## 3. Drei Bedingungen, damit der Anreiz zieht + +| Bedingung | Warum | Umsetzung | +|---|---|---| +| **Kriterien bekannt** | Wer nicht weiß, wonach gemessen wird, strengt sich nicht an. | Infoseite erklärt Kriterienkategorien — nicht die Gewichtung. | +| **Abstand erreichbar** | Wenn nur Behördenmeldungen die Spitze erreichen, gibt der Mittelstand auf. | Werkzeuge als Brücke; Schwelle so setzen, dass gute Unternehmensmeldungen sie erreichen können. | +| **Nie käuflich** | Sobald Verdacht besteht, man könne sich hochkaufen, ist der Anreiz tot. | Keine Kopplung an Pakete, kein Upsell in die Spitze. Anti-Zombie-Prinzip auf Qualität angewandt. | + +--- + +## 4. Was aus dem Konzept „Rubrik BestePresse" übernommen wird + +Unverändert gültig (siehe konzept_bestepresse-rubrik.md): +- Zwei sichtbare Stufen: regulär und Spitze; keine sichtbare Abwertung regulärer Meldungen +- Rubrik auf beiden Portalen, getrennte Auswahl je Portal +- Laufend statt Rhythmus; Archiv bleibt sichtbar +- Prominente Platzierung auf der Startseite +- Label an jeder ausgezeichneten Meldung (Liste, Rubrik, Detailseite) +- Infoseite „Was ist die Spitze" + Verknüpfung mit „Bessere Pressemitteilungen" +- Messgrößen und Nullmessung (§7 des Konzepts) + +Entfällt: Kuratorenrolle, Kuratorenzugang, Begründung durch Kurator, Lernnutzung fremder Urteile, Namensregelung. + +Ersetzt durch: automatische Kennzeichnung ab Schwelle; öffentliche Kurzbegründung aus den erfüllten Kriterienkategorien (maschinell erzeugt, transparent als solche gekennzeichnet). + +--- + +## 5. Reihenfolge (verbindlich) + +1. **Spitze + Infoseite** — sichtbares Ziel und erklärte Kriterien +2. **Werkzeuge** — der Weg zur Spitze; hier entsteht Umsatz +3. **Zufluss verschärfen** — connektar/openPR schärfer filtern, erst wenn Direktkunden tragen + +Nicht umgekehrt: Ein Qualitätsportal mit leerer Liste überzeugt niemanden. + +--- + +## 6. Partnervorlage (wiederverwendbar) + +Aus dem IMKIS-Prozess liegt eine fertige Vorlage für künftige Partner (PR-Agenturen, Trainer, Verlage) vor: +- Ebenenmodell als Rahmen +- Gutscheine für Seminar-/Kursteilnehmer (erste Veröffentlichung vergünstigt) +- Kontingent als Gegenleistung für Leistung in Naturalien +- Provision für vermittelte Neukunden (Erfolgsvergütung, Codes zur Attribution) +- Vermittlung fremder Leistungen statt Weiterverkauf (Auftrag direkt, spiegelbildliche Provision) +- Interessenkonflikt-Regel: vermittelte/betreute Meldungen bei Auszeichnung kennzeichnen +- Keine Vorleistung vor erfolgreichem Pilot; 6 Monate, Nullmessung, Zahlen + +Dateien: konzept_bestepresse-rubrik.md, bewertung_bestepresse-optionen.md, gegenmatrix_presseecho_bestepresse.md + +--- + +## 7. Offen / zu entscheiden + +1. Name der Rubrik +2. Schwellenwert — initial konservativ setzen, nach Nullmessung justieren +3. Wortlaut der maschinellen Kurzbegründung +4. Ob die Schwelle je Portal unterschiedlich liegt + +--- + +## Änderungshistorie + +| Datum | Änderung | +|---|---| +| 13.10.2026 | Erstfassung nach Abschluss des IMKIS-Austauschs | diff --git a/dev/partner/gegenmatrix_presseecho_bestepresse.md b/dev/partner/gegenmatrix_presseecho_bestepresse.md new file mode 100644 index 00000000..0a9ec276 --- /dev/null +++ b/dev/partner/gegenmatrix_presseecho_bestepresse.md @@ -0,0 +1,240 @@ +# Themenmatrix — Rückmeldung PresseEcho zu BestePresse + +**Stand:** 24.08.2026 +**Grundlage:** Themenmatrix IMKIS/BestePresse (Stefan Brunn) +**Zweck:** Ergänzung und Gegenperspektive als Gesprächsgrundlage für das persönliche Treffen + +--- + +## Vorbemerkung + +Die Matrix trifft die richtigen Fragen. Ergänzt sind hier drei Dinge: die Nutzenseite aus Sicht von PresseEcho, vier Themenfelder, die bislang fehlen, und einige Klarstellungen zum Ausgangsstand. Der Aufbau folgt bewusst der Originalstruktur. + +**Zwei Rahmenpunkte vorab:** + +1. **Kundenbeziehungen bleiben getrennt.** Veröffentlicher, die über PresseEcho publizieren, sind Kunden von PresseEcho. Veröffentlicher, die BestePresse zuführt, bleiben in der Betreuung von BestePresse. Ein wechselseitiger Zugriff auf den jeweils anderen Kundenstamm ist nicht vorgesehen. +2. **Die Portale werden in schlanker Struktur betrieben.** Alles, was dauerhaften Entwicklungs- oder Betreuungsaufwand erzeugt, ist der begrenzende Faktor — nicht die inhaltliche Bereitschaft. + +--- + +## Felder 1–12: Ergänzte Nutzenperspektive + +### 1. Grundidee der Zusammenarbeit + +**Ergänzung:** Der komplementäre Kern ist tragfähig — PresseEcho bringt laufende Portale, Archiv, Index-Historie, Prüf- und Abrechnungsinfrastruktur; BestePresse bringt Methodenautorität, redaktionelle Expertise und Zugang zu qualitätsorientierten Auftraggebern. + +**Nutzen für PresseEcho:** Zugang zu qualitativ hochwertigen Einsendern über einen Kanal, der bisher nicht erschlossen ist. + +**Klarstellung:** BestePresse bleibt eigenständig. Eine technische oder organisatorische Verschmelzung ist derzeit nicht das Ziel; sinnvoll ist eine Kooperation zweier eigenständiger Angebote. + +**Kein zusätzliches Portal:** Der Aufbau einer weiteren gemeinsamen Plattform ist nicht vorgesehen. Eine neue Domain startet ohne Archiv und ohne Index-Historie, erzeugt dauerhaften Wartungsaufwand und schafft bei Mehrfachveröffentlichung ein Duplicate-Content-Problem. Derselbe Effekt lässt sich innerhalb von presseecho.de erreichen: ein **kuratierter Qualitätsbereich** mit ausgezeichneten Meldungen, eigenem Feed für Redaktionen und sichtbarer Kennzeichnung — ohne neues System und mit sofortiger Sichtbarkeit. + +**Partner ist die Firma, nicht das Portal:** Eine Platzierung auf den Portalen bezieht sich auf IMKIS als redaktionellen Dienstleister. Eine Platzierung von bestepresse.de als Presseportal kommt nicht in Betracht. + +### 2. Marken und Positionierung + +**Ergänzung:** Ebenso relevant wie die Frage „BestePresse als Premiumtarif von PresseEcho?" ist die Gegenrichtung: PresseEcho darf nicht als reiner Infrastrukturdienstleister einer fremden Qualitätsmarke erscheinen. Beide Marken müssen als eigenständige Absender erkennbar bleiben. + +**Offen:** Wie wird die Verbindung nach außen benannt? Kooperation, Partnerschaft, Empfehlung? + +### 3. Kundenkontakte und Neukundengewinnung + +**Klarstellung (wesentlich):** Eine gezielte Ansprache von Veröffentlichern über PresseEcho durch BestePresse ist ausgeschlossen. Gründe: + +- **Struktur:** Ein erheblicher Teil der Meldungen erreicht die Portale über Presseverteiler. Die Absender dieser Meldungen sind keine Vertragskunden von PresseEcho, sondern Kunden des jeweiligen Verteilers. Eine werbliche Ansprache dieser Adressen wäre eine Kaltansprache ohne Rechtsgrundlage — nach UWG und DSGVO nicht tragfähig, und zusätzlich ein Eingriff in die Kundenbeziehungen der Verteiler. +- **Kundenbeziehung:** Eine Ansprache mit dem Tenor „Ihre PM könnte qualitativ verbessert werden" belastet die Beziehung zu zahlenden Direktkunden. + +**Gangbare Alternative:** Sichtbare, freiwillige Angebote im Veröffentlichungsprozess und auf einer öffentlichen Informationsseite (siehe Feld 18), die der Interessent selbst ansteuert — statt aktiver Ansprache von außen. Keine Weitergabe von Kontaktdaten in beide Richtungen. + +**Umgekehrte Richtung (bislang nicht abgebildet):** Der eigentliche Zuführkanal liegt bei BestePresse — Fortbildungs- und Schulungsteilnehmer sowie bestehende Auftraggeber, die eine Empfehlung für ein seriöses Veröffentlichungsportal benötigen. Dieses Feld sollte in der Matrix eigenständig auftauchen (siehe Feld 13). + +### 4. Medienansprache und Reichweite + +**Ergänzung:** Sinnvolles gemeinsames Feld. Eine kuratierte, vorselektierte Quelle für Redaktionen ist ein Angebot, das kein Standardportal hat. + +**Nutzen für PresseEcho:** Journalistische Nutzung stärkt das Argument gegenüber Einsendern („Ihre Meldung wird tatsächlich gelesen"). + +**Offen:** Wer betreibt die Medienansprache operativ und trägt die laufende Pflege von Verteilern und Newslettern? + +### 5. Customer Journey + +**Ergänzung:** Beide Richtungen sind denkbar und sollten nicht künstlich vereinheitlicht werden: + +- *Veröffentlichung → Qualitätsangebot:* Kunde publiziert, erhält optional ein Angebot zur Verbesserung. +- *Prüfung → Verbesserung → Veröffentlichung:* BestePresse-Kunde wird nach redaktioneller Arbeit zur Veröffentlichung geführt. + +**Wichtig:** Der zweite Pfad ist der wirtschaftlich relevantere für PresseEcho und sollte im Mittelpunkt der Pilotphase stehen. + +### 6. Freemium, Premium und Produkttreppe + +**Klarstellung:** PresseEcho arbeitet ohne kostenlose Veröffentlichungsstufe. Preise sind öffentlich und transparent einsehbar, ohne automatische Verlängerung und ohne Mindestlaufzeit. Ein kostenloser Schnellcheck als Lead-Instrument von BestePresse ist davon unberührt, sofern er nicht als kostenlose Veröffentlichung missverstanden wird. + +**Nutzen für PresseEcho:** Eine klar getrennte Produkttreppe (Prüfung/Redaktion bei BestePresse, Veröffentlichung bei PresseEcho) vermeidet Preiskonkurrenz zwischen den Partnern. + +### 7. Qualitätsprüfung und KI + +**Klarstellung zum Ausgangsstand:** PresseEcho betreibt bereits ein produktiv laufendes, automatisiertes Bewertungsverfahren mit versionierter Bewertungsgrundlage. Meldungen werden auf dieser Basis abgelehnt; das Verfahren ist eingeführt und kalibriert. + +Die Formulierung, PresseEcho „erhalte ein zusätzliches Qualitätsinstrument", trifft den Stand daher nicht. Realistischer ist eine Arbeitsteilung: + +- **PresseEcho:** automatisierte Vorprüfung im Veröffentlichungsprozess (bestehend, bleibt in eigener Hoheit) +- **BestePresse:** redaktionelle, menschliche Begutachtung und inhaltliche Verifizierung als eigenständige Leistung + +**Zu klären:** Wessen Bewertung entscheidet über eine Auszeichnung? Wer darf die Kriterien ändern? Die Bewertungslogik von PresseEcho bleibt in eigener Verantwortung und wird nicht offengelegt oder fremdgesteuert. + +### 8. Redaktionelle Services + +**Ergänzung:** Klares Feld für BestePresse, keine Überschneidung mit PresseEcho. Redaktionelle Dienstleistung wird nicht angeboten und ist auch nicht geplant. + +**Nutzen für PresseEcho:** Abgelehnte oder schwache Einsendungen erhalten erstmals einen sinnvollen Anschluss statt einer Sackgasse. + +**Offen:** Wie wird Beratung sichtbar von unabhängiger Bewertung getrennt (siehe Feld 9)? + +### 9. Unabhängige Besten-Auswahl + +**Anmerkung:** Das stärkste Feld der Matrix — die Frage wird zu Recht selbst gestellt. Der Interessenkonflikt (bezahlte Überarbeitung und anschließende Auszeichnung derselben Meldung) ist real und muss vor einem Start geklärt sein, nicht danach. + +**Der konkrete Konflikt:** Wenn dieselbe Seite bezahlte Überarbeitung verkauft und zugleich über die Auszeichnung mitentscheidet, lässt sich die Auszeichnung faktisch erwerben. Sichtbar wird das auf den Portalen — also dort, wo das Siegel erscheint. Die Frage muss daher vor einem Start geklärt sein. + +**Mögliche Trennungen (eine davon ist zu wählen):** +- Bewertungsgrundlage bleibt allein das Verfahren von PresseEcho; BestePresse steuert redaktionelle Verifizierung bei, entscheidet aber nicht über die Aufnahme. +- Wer eine Meldung kostenpflichtig überarbeitet hat, wirkt an deren Bewertung nicht mit. +- Überarbeitete Meldungen werden bei einer Auszeichnung als solche gekennzeichnet. + +**Zu klären:** Wessen Marke trägt die Auszeichnung, und auf wessen Seiten erscheint sie? + +### 10. Upselling und gegenseitige Vermittlung + +**Ergänzung:** Grundsätzlich sinnvoll und technisch einfach umsetzbar, sofern es bei sichtbaren, freiwilligen Hinweisen bleibt. + +**Grenze:** Keine aktive Ansprache über Kontaktdaten der jeweils anderen Seite (siehe Feld 3). Empfehlungen ja, Adressweitergabe nein. + +### 11. Technik, Plattform und Daten + +**Klarstellung (wesentlich):** Eine gemeinsame Nutzung von CMS, Login, Payment, Kundenkonto und Datenbank ist derzeit nicht vorgesehen. Der Betrieb erfolgt in schlanker Struktur; jede tiefe Integration erzeugt dauerhaften Wartungsaufwand, der den begrenzenden Faktor darstellt. + +**Realistischer Rahmen:** +- Zuführung von Meldungen über die bestehende Einreichungs- und Schnittstellenlogik +- Abrechnung über das bestehende System von PresseEcho +- Keine Sonderentwicklungen für die Pilotphase + +**Datenhoheit:** Nutzungs-, Bewertungs- und Kundendaten aus dem Betrieb der Portale verbleiben bei PresseEcho. Daten aus redaktioneller Begutachtung verbleiben bei BestePresse. + +### 12. Gemeinsamer Markteffekt + +**Klarstellung:** Die Rollenzuschreibung „PresseEcho liefert Breite und Markt, BestePresse erzeugt Auswahl und Prestige" bildet die beabsichtigte Zusammenarbeit nicht vollständig ab. Ergänzend gilt: BestePresse bringt qualitätsorientierte Auftraggeber und Empfehlungen aus dem Fortbildungsgeschäft ein, PresseEcho bringt Veröffentlichungsinfrastruktur, Reichweite und Auffindbarkeit. + +Der Kreislaufgedanke — mehr Einsendungen, bessere Qualität, journalistische Nutzung — ist überzeugend, sofern beide Seiten Zuführung leisten. + +--- + +## Ergänzende Felder + +### 13. Fortbildung und Empfehlung als Zuführkanal + +**Leitfrage:** Wie werden Schulungs- und Fortbildungsteilnehmer sowie bestehende Auftraggeber von IMKIS auf PresseEcho geführt? + +**Zu besprechen:** In welcher Form erfolgt eine Empfehlung im Schulungskontext? Welche Materialien wären hilfreich? Um welche Größenordnung an Teilnehmern und Auftraggebern pro Jahr geht es? + +**Nutzen:** Für IMKIS ein empfehlbares, seriöses Portal, das die eigene Qualitätsposition stützt; für PresseEcho ein wiederkehrender Zugang zu geschulten Einsendern. + +### 14. Wirtschaftliche Aufteilung + +**Leitfrage:** Wer erhält welchen Anteil an welchem Umsatz? + +**Zu besprechen:** Vermittlungsprovision, Kontingente oder reines Empfehlungsmodell ohne Geldfluss? Wer stellt dem Endkunden gegenüber die Rechnung? Wie werden kombinierte Leistungen (Redaktion + Veröffentlichung) abgerechnet? + +**Anmerkung:** In der bisherigen Matrix nicht enthalten, aber für jede Form der Zusammenarbeit vorab zu klären. + +### 15. Pilotphase + +**Leitfrage:** Wie sieht ein kleiner, unverbindlicher Testlauf aus, bevor Strukturen festgelegt werden? + +**Vorschlag:** Eine überschaubare Zahl echter Meldungen aus dem Kundenkreis von BestePresse über PresseEcho veröffentlichen. Ohne Sonderentwicklung, über bestehende Wege, mit gemeinsamer Auswertung nach einem definierten Zeitraum. + +**Nutzen:** Beide Seiten sehen an konkreten Fällen, ob Qualität, Ablauf und Erwartungen zusammenpassen — mit geringem Aufwand und ohne Bindung. + +### 16. Beendigung der Zusammenarbeit + +**Leitfrage:** Was gilt, wenn die Kooperation endet? + +**Zu besprechen:** Kundenzuordnung, Umgang mit gemeinsam erzeugten Inhalten und Auszeichnungen, Verbleib von Daten, Fortbestand veröffentlichter Meldungen. + +**Grundposition:** Veröffentlichte Meldungen bleiben bestehen. Kundenbeziehungen bleiben bei der Seite, die sie eingebracht hat. + +### 17. businessportal24.com + +**Anmerkung:** Neben presseecho.de wird businessportal24.com betrieben. Beide werden über einen gemeinsamen Zugang verwaltet. Für wirtschafts- und unternehmensbezogene Themen ist businessportal24 der passendere Ort; für allgemeine und thematisch breitere Meldungen presseecho. + +**Zu besprechen:** Ob und wie businessportal24 in eine Zusammenarbeit einbezogen wird. + +### 18. Anschluss nach Qualitätsprüfung (Kernfeld) + +**Leitfrage:** Was geschieht mit Meldungen, die die Prüfung nicht bestehen oder schwach abschneiden? + +**Ausgangslage:** Meldungen werden bereits heute abgelehnt. Wer über einen Verteiler einspeist, kann seine Meldung nicht selbst überarbeiten und steht damit vor einer Sackgasse. An dieser Stelle trifft ein bestätigtes Qualitätsproblem auf eine hohe Motivation, es zu lösen — also genau auf die Leistung von IMKIS. + +**Vorgeschlagene Umsetzung:** +- Benachrichtigungen (Veröffentlichung wie Ablehnung) bleiben sachlich und transaktional, ohne werblichen Teil. +- Sie enthalten die Bewertung in verständlicher Form und einen Verweis auf eine öffentliche Informationsseite zum Thema „Was macht eine gute Pressemitteilung aus". +- Auf dieser Seite werden Kriterien erklärt, Verbesserungswege gezeigt und Partner sowie Qualitätskennzeichnung sichtbar gemacht. + +**Nutzen beidseitig:** PresseEcho verwandelt eine Ablehnung in einen Service; IMKIS erhält qualifizierte Interessenten, die selbst aktiv geworden sind. Kein Datenaustausch, keine Kaltansprache, kein Eingriff in Kundenbeziehungen Dritter. + +### 19. Produktabgrenzung: automatisierte Hilfe und redaktionelle Leistung + +**Leitfrage:** Wie werden KI-gestützte Textverbesserung und menschliche Redaktion voneinander abgegrenzt? + +**Hintergrund:** Beide Angebote setzen im selben Moment an, nämlich bei einer als schwach bewerteten Meldung. Ohne vorherige Abgrenzung entsteht dort Wettbewerb statt Ergänzung. + +**Vorgeschlagene Arbeitsteilung:** + +| Stufe | Anbieter | Leistung | +|---|---|---| +| Selbstbedienung | PresseEcho | automatisierte Verbesserungshilfe, niedrigschwellig, sofort verfügbar | +| Redaktionell | IMKIS | menschliche Überarbeitung, Beratung, journalistischer Nachrichtenwinkel | +| Qualifizierung | IMKIS | Fortbildung und Schulung | + +**Gegenseitige Zusicherung:** PresseEcho bietet keine redaktionelle Dienstleistung an; IMKIS baut kein konkurrierendes automatisiertes Werkzeug im Veröffentlichungsprozess auf. + +**Klarstellung:** Bewertungslogik und zugehörige Entwicklungen von PresseEcho bleiben in eigener Hoheit und sind nicht Gegenstand der Zusammenarbeit. + +--- + +## Vorschlag für den weiteren Ablauf + +1. Persönliches Treffen zum Abgleich der Perspektiven +2. Gegenseitiger fachlicher Austausch (zehn Punkte aus Marketing- bzw. PR-Sicht) +3. Klärung von Zuführung, wirtschaftlicher Aufteilung und Bewertungshoheit (Felder 7, 13, 14) +4. Kleine Pilotphase mit echten Meldungen (Feld 15) +5. Auswertung, danach Entscheidung über eine dauerhafte Form + +--- + +## Interne Notiz (nicht zum Weitergeben) + +**Verhandlungsposition:** +- Ausgangslage: laufende Portale, Archiv, produktives Scoring, Abrechnung — Gegenüber im Beta-Stadium. Kontaktaufnahme ging von IMKIS aus. +- Eigener Bedarf: Ausbau der Direktkundenbasis, Reduzierung der Abhängigkeit von einzelnen Verteilern. Nicht offenlegen. +- Realer Nutzen der Kooperation liegt in Feld 13 (Empfehlungskanal Fortbildung) und in qualitätsorientierten Auftraggebern — nicht in Prestige. + +**Rote Linien:** +- Kein Zugriff auf den eigenen Kundenstamm für fremde Ansprache (Feld 3) +- Keine gemeinsame Infrastruktur mit dauerhaftem Wartungsaufwand (Feld 11) +- Keine Offenlegung oder Fremdsteuerung der Bewertungslogik (Feld 7) +- Keine Sonderentwicklung vor einem erfolgreichen Piloten +- Kein drittes Portal, keine neue Domain (Feld 1) +- Keine Platzierung von bestepresse.de als Portal auf den eigenen Seiten (Feld 1) + +**Nicht offenlegen:** +- Der „große Kundenpool" existiert so nicht: Der überwiegende Teil der Meldungen kommt über Verteiler, die Absender sind keine Direktkunden. Feld 3 nach außen als Rechts- und Kundenschutzfrage führen, nicht als Bestandsfrage. +- Eigene Entwicklungspläne im Bereich automatisierter Textverbesserung nur so weit ansprechen, wie für die Abgrenzung in Feld 19 nötig. + +**Eigentlicher Gewinn der Kooperation:** Feld 13 (Empfehlungskanal Fortbildung) und Feld 18 (Anschluss nach Ablehnung). Alles andere ist nachrangig. + +**Attributionsvorschlag für den Piloten:** Gutscheincodes, die IMKIS in Schulungen und bei Kunden ausgibt. Zeigt ohne Nachfrage, wie tragfähig der Kanal wirklich ist, und koppelt eine spätere Vergütung an tatsächliche Buchungen. + +**Offene Fragen an das Gegenüber:** +- Größenordnung: wie viele Auftraggeber, wie viele Schulungsteilnehmer pro Jahr? +- Was geschieht mit bestepresse.de bei einer Kooperation — eigenständig, ruhend oder parallel? +- Welche Form der Gegenleistung wird vorgestellt? diff --git a/dev/partner/konzept_bestepresse-rubrik.md b/dev/partner/konzept_bestepresse-rubrik.md new file mode 100644 index 00000000..631030f5 --- /dev/null +++ b/dev/partner/konzept_bestepresse-rubrik.md @@ -0,0 +1,135 @@ +# Konzept: Rubrik „BestePresse" — kuratierte Spitze auf presseecho.de und businessportal24.com + +**Stand:** 19.09.2026 +**Status:** Konzept für das Treffen am 01.10.2026; Testballon 6 Monate +**Grundidee:** Dreistufiges Ebenenmodell. Öffentlich sichtbar sind nur zwei Stufen: reguläre Pressemitteilungen und die kuratierte Spitze „BestePresse". Die Spitze wird von IMKIS ausgewählt, ist nicht käuflich und darf leer bleiben. + +--- + +## 1. Ziele + +| Für PresseEcho / businessportal24 | Für IMKIS | +|---|---| +| Sichtbarer Qualitätsanspruch, der das gesamte Portal aufwertet | Reichweite und Sichtbarkeit für den Namen BestePresse | +| Anreiz für Einsender, bessere Meldungen zu erstellen (Ebene 1 → 2 → Spitze) | Zufluss an Kandidaten ohne eigene Akquise | +| Differenzierung gegenüber Standardportalen | Reputation als redaktionelle Instanz | +| Lernmaterial für die Weiterentwicklung der automatischen Prüfung | Nachfrage nach redaktioneller Hilfe bei Einsendern, die in die Spitze wollen | + +**Nicht Ziel:** Geldfluss zwischen den Partnern in der Testphase. Beide verdienen an ihren eigenen Leistungen (Veröffentlichung bzw. Redaktion/Seminare). + +--- + +## 2. Struktur auf den Portalen + +- **Rubrik „BestePresse"** auf beiden Portalen, je eigene Unterseite mit Archiv. +- **Getrennte Auswahl je Portal**, weil die Leserschaft verschieden ist. Gleicher Name, gleiche Regeln, eigene Kandidatenliste. +- **Label** an jeder ausgezeichneten Meldung, auch in Listen und auf der Detailseite. Wortlaut vorzugsweise deutsch: „BestePresse · kuratiert von IMKIS" statt „by IMKIS". +- **Rhythmus:** laufend — eine Meldung wird ausgezeichnet, wenn sie es verdient. Kein Wochen- oder Monatszwang (vermeidet Füllzwang). Die Verbreitung (Newsletter, Feed) darf einen Rhythmus haben, die Auswahl nicht. +- **Archiv:** Ausgezeichnete Meldungen bleiben dauerhaft in der Rubrik. Über die Zeit entsteht ein Korpus, der belegt, was unter Qualität verstanden wird. + +--- + +## 3. Sichtbarkeit — was wer sieht + +| Element | Öffentlich | Einsender (Login) | Kurator (Login) | Betreiber | +|---|---|---|---|---| +| Label „BestePresse" an der Meldung | ja | ja | ja | ja | +| Rubrik mit allen ausgezeichneten Meldungen | ja | ja | ja | ja | +| Kurze öffentliche Begründung (1–2 Sätze) | **empfohlen: ja** | ja | ja | ja | +| Ausführliche Kuratoren-Notiz | nein | ja | ja | ja | +| Score-Werte | nein | eigene Meldung | **nein** (nur Kandidatenstatus) | ja | +| Kandidatenliste | nein | nein | ja | ja | +| Aufrufe je Meldung | *zu prüfen* | eigene Meldung | erst nach Auswahl | ja | + +**Grundsatz:** Nach außen gibt es genau zwei Stufen. Keine sichtbare Abwertung regulärer Meldungen. + +**Zur öffentlichen Begründung (abweichend vom Ausgangsvorschlag):** Eine kurze, sichtbare Begründung ist empfohlen, weil sie (a) die Auswahl nachvollziehbar macht und vor dem Verdacht der Beliebigkeit schützt, (b) das beste Lehrmaterial für andere Einsender ist und (c) die eigentliche sichtbare Leistung von IMKIS darstellt — ohne sie ist die Kuratierung nur ein Label. Vorschlag: zwei Felder — ein öffentlicher Satz („Ausgezeichnet, weil …") und eine ausführliche interne Notiz. + +--- + +## 4. Kuratorenzugang + +Eigene Rolle „Kurator" im Hub, minimale Rechte: + +- sieht die **Kandidatenliste** je Portal: die 20–40 Meldungen mit den höchsten Bewertungen der letzten 30 Tage, sortiert, **ohne sichtbare Score-Werte** (nur Reihenfolge / Kandidatenstatus) +- kann eine Meldung **auszeichnen** oder **verwerfen** +- Pflichtfeld: **kurze öffentliche Begründung**; optionales Feld: **ausführliche interne Notiz** +- kann Auszeichnungen **zurücknehmen** +- **kein** Zugriff auf Kundendaten, Rechnungen, Bearbeitung der Meldungen selbst, Score-Details oder Prüfkriterien +- sieht **Aufrufe erst nach der Auswahl**, damit Popularität die Entscheidung nicht beeinflusst + +Die Vorauswahl über den bestehenden Score reduziert den Aufwand von „alles sichten" auf „Kandidaten prüfen". Ob die Vorauswahl trifft, ist selbst Teil des Tests (siehe §7). + +--- + +## 5. Informationsseiten + +Auf beiden Portalen und im Hub eine Erklärseite „Was ist BestePresse": + +1. Was die Rubrik ist und wer auswählt +2. Nach welchen Gesichtspunkten ausgewählt wird — Kriterienkategorien, nicht die Prüflogik +3. Dass Aufnahme nicht gekauft werden kann +4. Wie man dorthin kommt: gute Meldungen, Hinweise, Werkzeuge, redaktionelle Hilfe +5. Verweis auf die Infoseite „Bessere Pressemitteilungen" (und umgekehrt) + +Diese Seite ist der Ort, an dem der Anspruch für Einsender entsteht. Sie sollte vor dem Start der Rubrik stehen. + +--- + +## 6. Ablauf + +1. Meldung wird regulär veröffentlicht (bezahlt, gefiltert). +2. Automatische Vorauswahl: hohe Bewertung → Kandidatenstatus, erscheint in der Kuratorenliste. +3. Kurator prüft, zeichnet aus oder verwirft, schreibt Begründung. +4. Meldung erhält Label, erscheint in der Rubrik, Einsender wird benachrichtigt. +5. Verbreitung: Feed der Rubrik (Portal), Newsletter und Redaktionskontakte (IMKIS) mit nachverfolgbaren Links. +6. Begründungen und Entscheidungen werden intern ausgewertet (siehe §8). + +--- + +## 7. Messgrößen für den Testballon (6 Monate) + +Vor dem Start eine Nullmessung erheben, sonst sind die Zahlen nicht bewertbar. + +| Bereich | Kennzahl | Quelle | +|---|---|---| +| Auswahl | Kandidaten/Monat, Ausgezeichnete/Monat, Selektionsquote | Hub | +| Treffsicherheit der Vorauswahl | Anteil der Auszeichnungen aus den Top-10 vs. Top-40 | Hub | +| Reichweite Rubrik | Aufrufe der Rubrikseite, Verweildauer | Umami | +| Wirkung je Meldung | Aufrufe ausgezeichneter Meldungen vs. Durchschnitt aller Meldungen | Umami | +| Suche | Impressionen/Klicks der Rubrik und ausgezeichneter Meldungen | Search Console | +| Externe Verbreitung | Klicks aus Newsletter und Redaktionsmailings | UTM-Links | +| Geschäft PresseEcho | neue Direktkunden mit Bezug zur Rubrik, Nutzung der Werkzeuge nach Kandidatenstatus | Hub / Nachfrage | +| Geschäft IMKIS | Anfragen und Aufträge mit Bezug zur Rubrik | Bericht IMKIS | + +Auswertung nach 3 und 6 Monaten gemeinsam. Danach Entscheidung: fortführen, anpassen, beenden. + +--- + +## 8. Lernnutzung der Kuratorenentscheidungen + +Die Begründungen und Entscheidungen werden intern ausgewertet, um die automatische Vorauswahl zu verbessern. + +**Das muss offen kommuniziert werden.** Wer später erfährt, dass seine Urteile ohne sein Wissen ein Verfahren trainiert haben, das ihn teilweise ersetzt, hat einen berechtigten Vertrauensbruch. Deshalb: Vor dem Start ausdrücklich benennen („Ihre Begründungen helfen uns, die Vorauswahl treffsicherer zu machen"), und klarstellen, dass die *Auswahl* selbst dauerhaft beim Kurator bleibt — die Automatik verbessert nur die *Kandidatenliste*. Das ist auch inhaltlich richtig: Der Betreiber hat einen Füllanreiz, den ein Kurator nicht hat. + +--- + +## 9. Regelungen (schriftlich festhalten) + +- **Name:** „BestePresse" wird für die Dauer der Zusammenarbeit als Rubrikname genutzt. URL, Struktur, Archiv und Daten gehören dem Portalbetreiber. PresseEcho meldet keine Marke oder Domain mit diesem Begriff an. +- **Ende:** Bei Beendigung wird die Rubrik umbenannt; die Seite bleibt mit Weiterleitung bestehen, bereits ausgezeichnete Meldungen behalten ihre Kennzeichnung mit Datum. +- **Unabhängigkeit:** Aufnahme ist nicht käuflich und wird auch so kommuniziert. Meldungen, die IMKIS selbst redaktionell überarbeitet hat, werden bei Auszeichnung als solche gekennzeichnet — oder IMKIS enthält sich, und die Vorauswahl entscheidet allein. (Eine der beiden Varianten wählen.) +- **Keine Füllpflicht:** Bleibt die Rubrik über Wochen leer, ist das zulässig und gewollt. +- **Aufwand:** Rubrik, Kuratorenrolle, Kandidatenliste, Label, Infoseiten und Tracking baut der Portalbetreiber. Das ist der Umfang; weitere Entwicklung im Rahmen dieses Tests ist nicht vorgesehen. +- **Verpflichtung IMKIS:** Kandidatenliste mindestens monatlich sichten; Verbreitung über eigene Kanäle mit nachverfolgbaren Links; Rückmeldung zu Anfragen/Aufträgen für die Auswertung. + +--- + +## 10. Zu bestätigen / zu klären + +1. Öffentliche Kurzbegründung: ja oder nur intern? (Empfehlung: ja, ein Satz.) +2. Aufrufe je Meldung öffentlich sichtbar? (Prüfen, ob derzeit der Fall; für den Kurator erst nach Auswahl.) +3. Variante für den Interessenkonflikt (Kennzeichnung oder Enthaltung). +4. Kandidatenfenster: letzte 30 Tage oder laufend seit letzter Sichtung? +5. Label-Wortlaut. +6. Offenlegung der Lernnutzung gegenüber IMKIS vor dem Start. diff --git a/dev/rechtliches/anlage-rechtstexte-live-2026-10-12.md b/dev/rechtliches/anlage-rechtstexte-live-2026-10-12.md new file mode 100644 index 00000000..78329084 --- /dev/null +++ b/dev/rechtliches/anlage-rechtstexte-live-2026-10-12.md @@ -0,0 +1,913 @@ +# Anlage zum Anwaltspaket: Rechtstexte im Live-Stand und Boost-Kennzeichnung + +**Abgerufen:** 12.10.2026 von den Live-Seiten (Release v1.8.0) +**Gehört zu:** [Versandfassung](anwaltspaket-datenschutz-2026-10-12.md), Anlage 3 + +Inhalt: + +- **A** Datenschutzerklärung 0.3 auf dem Hub [pressekonto.com/de/datenschutz](https://pressekonto.com/de/datenschutz) +- **B** Datenschutzerklärung 0.3 auf den Portalen [presseecho.de/de/datenschutz](https://presseecho.de/de/datenschutz) und [businessportal24.com/de/datenschutz](https://businessportal24.com/de/datenschutz) +- **C** AGB 0.6, auf allen drei Domains gleich +- **D** Boost: Note auf der Preisseite, Label auf Startseite und Branchenseite + +Die Texte sind wörtlich aus dem ausgelieferten HTML übernommen. Nur die Formatierung ist in Markdown umgesetzt: Überschriften, Listen, Fettdruck und Links. + +## Vorab: Hinweise zum Abgleich + +Beim Zusammenstellen fiel Folgendes auf. Der Anwalt sollte es kennen, bevor er den Text liest. + +1. **Gültigkeit der Änderungslinks, Portal-Fassung Abschnitt 7.** Dort steht pauschal „derzeit 15 Minuten“. Im System gibt es zwei Arten von Links an die Adresse des Pressekontakts: + - den **Zugangslink zur Verwaltung** von Mitteilung oder Newsroom: 15 Minuten, stimmt; + - den **Bestätigungslink aus „Mitteilung melden“** (der Pressekontakt öffnet damit die Auswahl seiner Anliegen): **72 Stunden** (`LEGAL_REPORT_LINK_TTL_HOURS`). + + In Fassung 0.4 sollten beide Fristen genannt werden. +2. **Backups, Abschnitt 13.** Dort steht „bis zu vier Wochen“; tatsächlich sind es 14 Tage. Die Korrektur ist im Entwurf für 0.4 bereits enthalten. +3. **Turnstile, Abschnitt 6a.** Der Abschnitt nennt nur das Kontaktformular und die Registrierung, und das stimmt mit dem heutigen Stand überein. Geplant ist, Turnstile auch im Widerrufs-, Kündigungs- und Meldeformular, bei der Rechtsanfrage und bei „Newsroom verwalten“ einzusetzen (Roadmap 4.4). Dann muss 6a mitwachsen. +4. **AGB-Verweise auf den Portalen.** Der Linktext lautet überall „pressekonto.com/…“. Auf presseecho.de und businessportal24.com führt der Link aber auf die gleichnamige Seite des jeweiligen Portals. Der Inhalt ist derselbe; das betrifft nur die Darstellung. +5. **Gleiche Nummer, anderer Inhalt.** Hub und Portale nummerieren ab Abschnitt 7 unterschiedlich: Abschnitt 9 ist auf dem Hub „Zahlungsabwicklung mit Stripe“, auf den Portalen „Medienprivileg“. Die Entwürfe für 0.4 im Anwaltspaket nennen deshalb jeweils die Fassung. + +--- + +## A. Datenschutzerklärung 0.3: Hub (pressekonto.com) + +**Stand: 3. Juli 2026 · Version 0.3.** 5a und 6a wurden seitdem ergänzt, ohne neue Versionsnummer. + +Die Abschnitte 7 bis 9 gibt es nur auf dem Hub: Kundenkonto, Anmeldelink, Stripe. + +### 1. Verantwortlicher + +Verantwortlicher für die Datenverarbeitung auf pressekonto.com ist: + +adametz.media +Inhaber: Kevin Adametz +In der Lake 4 +33739 Bielefeld +E-Mail: info@pressekonto.com + +### 2. Grundsätze und Rechtsgrundlagen + +Wir verarbeiten personenbezogene Daten nur, soweit dies für den Betrieb dieses Angebots, die Erbringung unserer Leistungen, die Bearbeitung von Anfragen oder aufgrund gesetzlicher Pflichten erforderlich ist. + +Die jeweilige Rechtsgrundlage nennen wir in den einzelnen Abschnitten dieser Datenschutzerklärung. Je nach Verarbeitung kommen insbesondere folgende Rechtsgrundlagen in Betracht: + +- Art. 6 Abs. 1 lit. b DSGVO, soweit die Verarbeitung zur Erfüllung eines Vertrags oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist, +- Art. 6 Abs. 1 lit. c DSGVO, soweit wir rechtlich zur Verarbeitung verpflichtet sind, +- Art. 6 Abs. 1 lit. f DSGVO, soweit die Verarbeitung zur Wahrung berechtigter Interessen erforderlich ist, +- Art. 85 DSGVO in Verbindung mit den jeweils anwendbaren medien- und presserechtlichen Sonderregelungen, soweit personenbezogene Daten zu journalistisch-redaktionellen Zwecken verarbeitet werden. + +Eine Weitergabe personenbezogener Daten an Dritte erfolgt nur, wenn sie in dieser Datenschutzerklärung beschrieben ist, wenn sie für die Leistungserbringung erforderlich ist, wenn eine gesetzliche Pflicht besteht oder wenn Sie eingewilligt haben. + +Wir verkaufen keine personenbezogenen Daten und schalten keine personalisierte Werbung. + +Die Übertragung dieser Website erfolgt verschlüsselt über TLS. + +### 3. Hosting und Server-Logs + +Unsere Systeme werden bei der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Deutschland, betrieben. Mit Hetzner besteht ein Vertrag zur Auftragsverarbeitung gemäß Art. 28 DSGVO. + +Beim Aufruf unserer Seiten verarbeitet der Webserver technisch notwendige Verbindungsdaten. Dazu gehören insbesondere: + +- IP-Adresse, +- Zeitpunkt des Aufrufs, +- aufgerufene Seite, +- übertragene Datenmenge, +- Referrer-URL, +- User-Agent, +- technische Statuscodes. + +Die Verarbeitung erfolgt zur Bereitstellung, Sicherheit, Stabilität und Fehleranalyse unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. + +Die Server-Logs werden grundsätzlich nach 14 Tagen gelöscht, sofern kein sicherheitsrelevanter Vorfall oder eine rechtliche Pflicht eine längere Aufbewahrung erforderlich macht. + +### 4. Cookies und technisch notwendige Speicherungen + +Wir verwenden keine Marketing-Cookies und keine Tracking-Cookies. + +Auf pressekonto.com werden ausschließlich technisch notwendige Cookies und vergleichbare Speichertechnologien eingesetzt. Dazu gehören insbesondere Sitzungs-Cookies für den Login, Sicherheits-Token und technisch erforderliche Speicherungen für das Kundenkonto. Diese sind für den Betrieb des Kundenkontos und die Bereitstellung der von Ihnen angeforderten Funktionen erforderlich. Rechtsgrundlagen sind § 25 Abs. 2 Nr. 2 TDDDG und Art. 6 Abs. 1 lit. b DSGVO. Die Cookies und Token werden mit Ende der Sitzung oder nach kurzer Frist gelöscht. + +Da wir keine Marketing- oder Tracking-Cookies einsetzen, ist für diese Website kein Cookie-Banner erforderlich. + +### 5. Webanalyse mit Umami + +Wir nutzen die selbst gehostete Analysesoftware Umami auf eigenen Servern. + +Umami setzt keine Cookies in Ihrem Browser. Es findet kein website- oder geräteübergreifendes Tracking statt. Es werden keine Nutzerprofile erstellt. + +Bei der Erfassung werden IP-Adressen unmittelbar vollständig anonymisiert. Ein Rückschluss auf Ihre Person oder Ihr genaues Gerät ist dadurch ausgeschlossen. + +Verarbeitet werden ausschließlich aggregierte Nutzungsdaten, insbesondere: + +- Seitenaufrufe, +- Referrer, +- Gerätetyp, +- Browser, +- Betriebssystem, +- ungefährer Standort auf Länderebene. + +Die Verarbeitung erfolgt zur Reichweitenmessung, technischen Optimierung und Verbesserung unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Eine Übermittlung der Analysedaten an externe Tracking- oder Werbedienstleister findet nicht statt. + +### 5a. Eigene Nutzungsstatistiken ohne Personenbezug + +Neben Umami führen wir auf unseren eigenen Servern drei einfache Ereignisprotokolle, mit denen wir die Reichweite veröffentlichter Pressemitteilungen belegen und den Weg von einer Benachrichtigung zum Kundenkonto nachvollziehen. Diese Protokolle enthalten keine IP-Adressen, keine Cookies und keine Kennungen, die eine Person oder ein Gerät wiedererkennbar machen. + +- **Aufrufe und Teilen-Klicks je Pressemitteilung.** Gespeichert werden die Meldung, der Zeitpunkt und bei einem Teilen-Klick der gewählte Kanal. Daraus entstehen die Aufrufzahlen und Tagesverläufe, die wir dem einreichenden Unternehmen zeigen. +- **Abrufe durch Such-, KI- und Feed-Dienste.** Ruft ein bekannter Dienst eine Meldung oder einen RSS-Feed ab, speichern wir den Dienst, die gekürzte Programmkennung (User-Agent), den Zeitpunkt und die betroffene Meldung beziehungsweise den Feed. Nennt ein Feed-Dienst in seiner Kennung eine Abonnentenzahl, übernehmen wir diese Zahl. Wer einen Feed abonniert hat, erfahren wir nicht. +- **Schritte vom Hinweis zum Konto.** Klickt ein Empfänger einen Link in einer unserer Benachrichtigungen, nutzt einen Anmeldelink, bearbeitet einen Newsroom, legt ein Konto an oder bucht erstmals, halten wir den Schritt, den Anlass (zum Beispiel „Veröffentlichungsmail") und das betroffene Unternehmen fest. Die Person und ihre E-Mail-Adresse werden dabei nicht gespeichert; die Auswertung zählt Unternehmen, nicht Menschen. + +Die Verarbeitung erfolgt zur Reichweitenmessung gegenüber unseren Kunden, zur Bewertung unserer Benachrichtigungen und zur Verbesserung unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Die Protokolle werden nicht an Dritte weitergegeben und nicht mit anderen Daten zu Nutzerprofilen verbunden. + +### 6. Kontaktaufnahme + +Wenn Sie uns per E-Mail oder über ein Formular kontaktieren, verarbeiten wir die von Ihnen angegebenen Daten zur Bearbeitung Ihrer Anfrage. Dazu können insbesondere gehören: + +- Name, +- E-Mail-Adresse, +- Inhalt Ihrer Nachricht, +- betroffene URL, +- Zeitpunkt der Anfrage, +- technische Metadaten zur Missbrauchsvermeidung und Sicherheit. + +Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO, soweit Ihre Anfrage mit einem Vertrag oder vorvertraglichen Maßnahmen zusammenhängt. In allen anderen Fällen ist Rechtsgrundlage Art. 6 Abs. 1 lit. f DSGVO. Soweit wir gesetzlich zur Bearbeitung oder Dokumentation verpflichtet sind, ist Rechtsgrundlage Art. 6 Abs. 1 lit. c DSGVO. + +Die Daten werden gelöscht, sobald die Anfrage abgeschlossen ist und keine gesetzlichen Aufbewahrungspflichten oder berechtigten Interessen an einer weiteren Speicherung entgegenstehen. + +Anfragen, die unser Spamfilter als unerwünschte Werbung oder automatisierte Eingabe erkennt, werden ohne Weiterleitung an unser Team zurückgehalten, damit wir Fehleinstufungen prüfen können, und spätestens nach 30 Tagen automatisch gelöscht. + +### 6a. Schutz vor automatisierten Anfragen (Cloudflare Turnstile) + +Um unsere Formulare vor automatisierten Eingaben (Spam, Bots) zu schützen, setzen wir im Kontaktformular und bei der Registrierung den Dienst Turnstile ein. Anbieter ist die Cloudflare, Inc., 101 Townsend St., San Francisco, CA 94107, USA. + +Turnstile wird erst geladen, wenn Sie das Kontaktformular öffnen oder die Registrierungsseite aufrufen. Der Dienst prüft anhand technischer Merkmale, ob die Eingabe von einem Menschen stammt; in der Regel ohne dass Sie etwas tun müssen. Dabei werden insbesondere verarbeitet: + +- IP-Adresse, +- Informationen zu Browser und Betriebssystem (z. B. User-Agent, Spracheinstellungen), +- Merkmale des Seitenaufrufs und der Interaktion mit der Prüfung, +- Zeitpunkt der Prüfung. + +Turnstile setzt nach Angaben von Cloudflare keine Cookies zu Werbe- oder Trackingzwecken und nutzt die Daten nicht für personalisierte Werbung. Wir erhalten von Cloudflare nur das Ergebnis der Prüfung. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt darin, Missbrauch unserer Formulare zu verhindern, etwa den massenhaften Versand von Bestätigungs-E-Mails an fremde Adressen. Für den Zugriff auf Informationen in Ihrem Endgerät ist Rechtsgrundlage § 25 Abs. 2 Nr. 2 TDDDG, da die Prüfung für den sicheren Betrieb des von Ihnen genutzten Formulars unbedingt erforderlich ist. + +Cloudflare kann Daten auch in den USA verarbeiten. Cloudflare ist nach dem EU-US Data Privacy Framework zertifiziert; die Übermittlung erfolgt auf Grundlage des Angemessenheitsbeschlusses der Europäischen Kommission (Art. 45 DSGVO). Weitere Informationen finden Sie in den Datenschutzhinweisen von Cloudflare ([cloudflare.com/privacypolicy](https://www.cloudflare.com/privacypolicy/)) und zu Turnstile ([cloudflare.com/turnstile-privacy-policy](https://www.cloudflare.com/turnstile-privacy-policy/)). + +### 7. Kundenkonto und Registrierung auf dem Hub + +Für die Nutzung von pressekonto ist ein Kundenkonto erforderlich. Dabei verarbeiten wir insbesondere: + +- Name, +- E-Mail-Adresse, +- Unternehmensangaben, +- Rechnungsdaten, +- steuerlich erforderliche Angaben, +- Angaben zu Firmenprofilen, +- Buchungsdaten, +- Tarifinformationen, +- Zahlungsstatus, +- eingereichte Pressemitteilungen, +- Entwürfe, +- Kontingente, +- Credits, +- Nutzungs- und Verwaltungsdaten des Kundenkontos. + +Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. + +Unser Angebot richtet sich ausschließlich an Unternehmer. Bei der Buchung bestätigen Sie, dass Sie in Ausübung Ihrer gewerblichen oder selbständigen beruflichen Tätigkeit handeln (§ 14 BGB). Diese Bestätigung protokollieren wir zu Nachweiszwecken. + +Ihre bei Vertragsschluss akzeptierte AGB-Fassung sowie im Veröffentlichungsvorgang abgegebene Erklärungen und Bestätigungen, zum Beispiel der Hinweis auf die dauerhafte Archivierung, protokollieren wir ebenfalls zu Nachweiszwecken. Rechtsgrundlagen sind Art. 6 Abs. 1 lit. c und lit. f DSGVO. + +### 8. Magic-Link: Anmeldung bei pressekonto + +Die Anmeldung bei pressekonto kann passwortlos über einen zeitlich begrenzten Anmeldelink („Magic-Link") erfolgen, den wir an Ihre hinterlegte E-Mail-Adresse senden. + +Verarbeitet werden: + +- E-Mail-Adresse, +- ein kryptographisch gehashtes Token, +- Zeitstempel, +- technische Metadaten zur Sicherheit und Missbrauchsvermeidung. + +Das Token ist nur zeitlich begrenzt gültig und verfällt nach einmaliger Nutzung oder nach Ablauf einer kurzen Gültigkeitsdauer automatisch. Die konkrete Gültigkeitsdauer wird systemseitig festgelegt und beträgt derzeit 15 Minuten. + +Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. + +### 9. Zahlungsabwicklung mit Stripe + +Zahlungen auf pressekonto.com werden über den Zahlungsdienstleister Stripe abgewickelt: + +Stripe Payments Europe, Ltd., 1 Grand Canal Street Lower, Grand Canal Dock, Dublin, Irland. + +Stripe erhält die für die Zahlungsabwicklung erforderlichen Daten, insbesondere: + +- Name, +- E-Mail-Adresse, +- Rechnungsdaten, +- Zahlungsmittel, +- Betrag, +- Zahlungsstatus, +- technische Zahlungsinformationen. + +Ihre vollständigen Zahlungsdaten, zum Beispiel vollständige Kreditkartennummern, werden direkt von Stripe über ein gesichertes Eingabefeld erfasst und verarbeitet. Sie berühren unsere Server zu keinem Zeitpunkt und liegen uns nicht vor. + +Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. + +Stripe verarbeitet personenbezogene Daten in eigener Verantwortung, soweit dies für die Zahlungsabwicklung, Betrugsprävention, Compliance und gesetzliche Pflichten erforderlich ist. Soweit Stripe personenbezogene Daten in Drittländern verarbeitet, erfolgt dies nach Angaben von Stripe auf Grundlage geeigneter Garantien, insbesondere EU-Standardvertragsklauseln und — soweit anwendbar — des EU-U.S. Data Privacy Framework. + +Weitere Informationen finden Sie in den Datenschutzhinweisen von Stripe. + +### 10. Automatisierte Inhaltsprüfung und Qualitätsbewertung + +Eingereichte Pressemitteilungen werden vor der Veröffentlichung automatisiert auf die Einhaltung unserer Veröffentlichungsrichtlinien geprüft und inhaltlich bewertet. + +Dabei können auch personenbezogene Daten verarbeitet werden, die in der Pressemitteilung enthalten sind. Soweit möglich, werden personenbezogene Daten vor der automatisierten Analyse minimiert oder entfernt. API-Anbindungen werden, soweit verfügbar, so konfiguriert, dass die übermittelten Inhalte nicht für Trainingszwecke fremder Modelle verwendet werden. + +Für die automatisierte Analyse können je nach Anfrage, Tätigkeit und Verfügbarkeit unterschiedliche KI- oder Analyse-Anbieter eingesetzt werden. Derzeit kommen insbesondere folgende Anbieter in Betracht: + +- OpenAI, +- Google Gemini, +- Anthropic Claude. + +Verarbeitet werden insbesondere: + +- Inhalt der eingereichten Pressemitteilung, +- minimierte oder anonymisierte Prüffassung, soweit technisch möglich, +- Bewertungsergebnis, +- Scores oder Risikomerkmale, +- Ablehnungskategorien, +- interne Hinweise zur Qualitätsbewertung, +- Ergebnis einer gegebenenfalls durchgeführten menschlichen Überprüfung. + +Führt die Prüfung zur Ablehnung einer Mitteilung, teilen wir Ihnen die Ablehnungskategorie mit. Sie können eine Überprüfung durch einen Menschen verlangen und dabei Ihren Standpunkt darlegen. Die Entscheidung wird dann erneut geprüft. + +Die Prüfergebnisse, Scores, Ablehnungskategorien und Begründungen werden intern der jeweiligen Pressemitteilung zugeordnet und grundsätzlich so lange gespeichert, wie die Pressemitteilung gespeichert oder veröffentlicht bleibt. Dies dient der Nachvollziehbarkeit der Veröffentlichungsentscheidung, der Qualitätssicherung, der Bearbeitung von Rückfragen sowie der Rechtsverteidigung. + +Rechtsgrundlagen sind Art. 6 Abs. 1 lit. b DSGVO und Art. 6 Abs. 1 lit. f DSGVO. Soweit gesetzliche Dokumentationspflichten bestehen oder Meldungen nach dem Digital Services Act betroffen sind, kann zusätzlich Art. 6 Abs. 1 lit. c DSGVO einschlägig sein. + +### 11. Meldeverfahren + +Wenn Sie über unser Meldeverfahren einen Inhalt melden, eine Änderung beantragen oder eigene personenbezogene Daten entfernen lassen möchten, verarbeiten wir die von Ihnen angegebenen Daten zur Bearbeitung der Meldung oder Anfrage. + +Dabei können insbesondere verarbeitet werden: + +- Name, +- E-Mail-Adresse, +- betroffene URL, +- Begründung der Meldung, +- ausgewählte Meldekategorie, +- Nachweise oder ergänzende Angaben, +- Zeitpunkt der Meldung, +- Vorgangsnummer, +- Bearbeitungsstatus, +- Entscheidung und Begründung, +- Kommunikationsverlauf. + +Die Verarbeitung erfolgt zur Bearbeitung Ihrer Meldung, zur Erfüllung gesetzlicher Pflichten, insbesondere nach dem Digital Services Act und der DSGVO, zur Dokumentation der Entscheidung sowie zur Rechtsverteidigung. + +Rechtsgrundlagen sind Art. 6 Abs. 1 lit. c DSGVO und Art. 6 Abs. 1 lit. f DSGVO. Soweit die Meldung mit einem bestehenden Vertrag oder Kundenkonto zusammenhängt, kann zusätzlich Art. 6 Abs. 1 lit. b DSGVO einschlägig sein. + +Meldedaten bewahren wir zur Dokumentation der Bearbeitung und Entscheidung grundsätzlich für drei Jahre nach Abschluss des Vorgangs auf. Eine längere Speicherung erfolgt nur, soweit dies zur Bearbeitung laufender Vorgänge, zur Erfüllung gesetzlicher Pflichten oder zur Rechtsverteidigung erforderlich ist. + +Meldungen und Änderungsanfragen können über die auf den Portalen vorgesehenen Wege ([Inhalte melden](https://pressekonto.com/de/melden)) oder die Melde-Links bei der jeweiligen Pressemitteilung eingereicht werden. + +Für Rückfragen zu bestehenden Meldungen nutzen Sie bitte die Eingangsbestätigung oder kontaktieren Sie uns über info@pressekonto.com. + +### 12. E-Mail-Versand + +Für den Versand transaktionaler E-Mails nutzen wir: + +ALL-INKL.COM - Neue Medien Münnich +Inhaber: René Münnich +Hauptstraße 68 +02742 Friedersdorf +Deutschland + +Transaktionale E-Mails sind insbesondere: + +- Magic-Links, +- Änderungslinks, +- Buchungsbestätigungen, +- Rechnungen oder Rechnungshinweise, +- Eingangsbestätigungen zu Meldungen, +- Benachrichtigungen zu Veröffentlichungen, +- System- und Sicherheitsmitteilungen. + +Dabei werden insbesondere verarbeitet: + +- E-Mail-Adresse, +- Empfängername, soweit vorhanden, +- Inhalt der jeweiligen Nachricht, +- Versandzeitpunkt, +- technische Zustelldaten, +- Statusinformationen zur Zustellung. + +Rechtsgrundlagen sind je nach Zweck der jeweiligen E-Mail Art. 6 Abs. 1 lit. b DSGVO, Art. 6 Abs. 1 lit. c DSGVO und Art. 6 Abs. 1 lit. f DSGVO. + +Mit dem Dienstleister besteht, soweit erforderlich, ein Vertrag zur Auftragsverarbeitung gemäß Art. 28 DSGVO. + +### 13. Speicherdauer, Backups und Aufbewahrungspflichten + +Wir speichern personenbezogene Daten nur so lange, wie es für die in dieser Datenschutzerklärung genannten Zwecke erforderlich ist. + +Es gelten insbesondere folgende Speicherfristen: + +- Server-Logs werden grundsätzlich nach 14 Tagen gelöscht, sofern kein sicherheitsrelevanter Vorfall eine längere Aufbewahrung erforderlich macht. +- Magic-Link-Token verfallen nach einmaliger Nutzung oder nach Ablauf von 15 Minuten. +- Die Ereignisprotokolle zu Aufrufen, Abrufen durch Dienste und Konversionsschritten (Abschnitt 5a) werden nach 395 Tagen gelöscht. +- Meldedaten werden grundsätzlich für drei Jahre nach Abschluss des Vorgangs gespeichert. +- Vertrags-, Buchungs- und Rechnungsdaten unterliegen handels- und steuerrechtlichen Aufbewahrungspflichten und werden nach Ablauf dieser Fristen gelöscht. +- Veröffentlichte Pressemitteilungen werden im Rahmen der Archivfunktion grundsätzlich dauerhaft gespeichert, soweit keine gesetzlichen Ansprüche auf Entfernung, Sperrung oder Änderung bestehen. +- Kontodaten werden nach Kontolöschung entfernt, soweit keine Aufbewahrungspflichten, offenen Vorgänge oder berechtigten Interessen an einer weiteren Speicherung entgegenstehen. + +Gelöschte Daten können in Sicherungskopien noch bis zu vier Wochen enthalten sein. Die Backups werden ausschließlich zur Wiederherstellung der Systeme im Sicherungsfall verwendet und nicht produktiv ausgewertet. + +### 14. Ihre Rechte + +Sie haben gegenüber uns nach Maßgabe der gesetzlichen Voraussetzungen folgende Rechte: + +- Recht auf Auskunft nach Art. 15 DSGVO, +- Recht auf Berichtigung nach Art. 16 DSGVO, +- Recht auf Löschung nach Art. 17 DSGVO, +- Recht auf Einschränkung der Verarbeitung nach Art. 18 DSGVO, +- Recht auf Datenübertragbarkeit nach Art. 20 DSGVO, +- Recht auf Widerspruch gegen Verarbeitungen auf Grundlage berechtigter Interessen nach Art. 21 DSGVO, +- Recht auf jederzeitigen Widerruf einer erteilten Einwilligung nach Art. 7 Abs. 3 DSGVO, ohne dass die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung berührt wird. + +Die Ausübung Ihrer Rechte ist grundsätzlich kostenlos. In den gesetzlich vorgesehenen Ausnahmefällen, insbesondere bei offenkundig unbegründeten oder exzessiven Anträgen, können wir nach Maßgabe von Art. 12 Abs. 5 DSGVO ein angemessenes Entgelt verlangen oder die Bearbeitung ablehnen. + +Wenn wir begründete Zweifel an Ihrer Identität oder Berechtigung haben, können wir zusätzliche Informationen anfordern, die zur Bestätigung Ihrer Identität oder Berechtigung erforderlich sind. + +Zur Ausübung Ihrer Rechte können Sie uns kontaktieren unter: info@pressekonto.com + +Für Inhalte auf den Portalen nutzen Sie bitte vorrangig das Melde- und Änderungsverfahren unter: [pressekonto.com/de/melden](https://pressekonto.com/de/melden) + +### 15. Beschwerderecht + +Sie haben das Recht, sich bei einer Datenschutz-Aufsichtsbehörde zu beschweren. + +Zuständig für uns ist: + +Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen +Kavalleriestraße 2–4 +40213 Düsseldorf +Website: [www.ldi.nrw.de](https://www.ldi.nrw.de) + +--- + +## B. Datenschutzerklärung 0.3: Portale (presseecho.de, businessportal24.com) + +**Stand: 3. Juli 2026 · Version 0.3.** + +Wiedergegeben ist die Fassung von presseecho.de. businessportal24.com ist wortgleich; nur Domain und Portalname sind andere, nämlich in den Abschnitten 1, 4, 9, 11 und 14. + +Nur auf den Portalen gibt es Abschnitt 7 (Änderungslinks), 9 (Medienprivileg) und 10 (Newsroom). Abschnitt 13 hat zusätzlich den Satz „Für veröffentlichte Presseinhalte gelten die Besonderheiten aus Abschnitt 9.“ + +### 1. Verantwortlicher + +Verantwortlicher für die Datenverarbeitung auf presseecho.de ist: + +adametz.media +Inhaber: Kevin Adametz +In der Lake 4 +33739 Bielefeld +E-Mail: info@pressekonto.com + +### 2. Grundsätze und Rechtsgrundlagen + +Wir verarbeiten personenbezogene Daten nur, soweit dies für den Betrieb dieses Angebots, die Erbringung unserer Leistungen, die Bearbeitung von Anfragen oder aufgrund gesetzlicher Pflichten erforderlich ist. + +Die jeweilige Rechtsgrundlage nennen wir in den einzelnen Abschnitten dieser Datenschutzerklärung. Je nach Verarbeitung kommen insbesondere folgende Rechtsgrundlagen in Betracht: + +- Art. 6 Abs. 1 lit. b DSGVO, soweit die Verarbeitung zur Erfüllung eines Vertrags oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist, +- Art. 6 Abs. 1 lit. c DSGVO, soweit wir rechtlich zur Verarbeitung verpflichtet sind, +- Art. 6 Abs. 1 lit. f DSGVO, soweit die Verarbeitung zur Wahrung berechtigter Interessen erforderlich ist, +- Art. 85 DSGVO in Verbindung mit den jeweils anwendbaren medien- und presserechtlichen Sonderregelungen, soweit personenbezogene Daten zu journalistisch-redaktionellen Zwecken verarbeitet werden. + +Eine Weitergabe personenbezogener Daten an Dritte erfolgt nur, wenn sie in dieser Datenschutzerklärung beschrieben ist, wenn sie für die Leistungserbringung erforderlich ist, wenn eine gesetzliche Pflicht besteht oder wenn Sie eingewilligt haben. + +Wir verkaufen keine personenbezogenen Daten und schalten keine personalisierte Werbung. + +Die Übertragung dieser Website erfolgt verschlüsselt über TLS. + +### 3. Hosting und Server-Logs + +Unsere Systeme werden bei der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Deutschland, betrieben. Mit Hetzner besteht ein Vertrag zur Auftragsverarbeitung gemäß Art. 28 DSGVO. + +Beim Aufruf unserer Seiten verarbeitet der Webserver technisch notwendige Verbindungsdaten. Dazu gehören insbesondere: + +- IP-Adresse, +- Zeitpunkt des Aufrufs, +- aufgerufene Seite, +- übertragene Datenmenge, +- Referrer-URL, +- User-Agent, +- technische Statuscodes. + +Die Verarbeitung erfolgt zur Bereitstellung, Sicherheit, Stabilität und Fehleranalyse unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. + +Die Server-Logs werden grundsätzlich nach 14 Tagen gelöscht, sofern kein sicherheitsrelevanter Vorfall oder eine rechtliche Pflicht eine längere Aufbewahrung erforderlich macht. + +### 4. Cookies und technisch notwendige Speicherungen + +Wir verwenden keine Marketing-Cookies und keine Tracking-Cookies. + +Auf presseecho.de setzen wir keine Marketing- oder Tracking-Cookies ein. Soweit technisch notwendige Speicherungen erforderlich sind, dienen sie ausschließlich dem sicheren Betrieb der Website oder der Bereitstellung ausdrücklich angeforderter Funktionen. + +Da wir keine Marketing- oder Tracking-Cookies einsetzen, ist für diese Website kein Cookie-Banner erforderlich. + +### 5. Webanalyse mit Umami + +Wir nutzen die selbst gehostete Analysesoftware Umami auf eigenen Servern. + +Umami setzt keine Cookies in Ihrem Browser. Es findet kein website- oder geräteübergreifendes Tracking statt. Es werden keine Nutzerprofile erstellt. + +Bei der Erfassung werden IP-Adressen unmittelbar vollständig anonymisiert. Ein Rückschluss auf Ihre Person oder Ihr genaues Gerät ist dadurch ausgeschlossen. + +Verarbeitet werden ausschließlich aggregierte Nutzungsdaten, insbesondere: + +- Seitenaufrufe, +- Referrer, +- Gerätetyp, +- Browser, +- Betriebssystem, +- ungefährer Standort auf Länderebene. + +Die Verarbeitung erfolgt zur Reichweitenmessung, technischen Optimierung und Verbesserung unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Eine Übermittlung der Analysedaten an externe Tracking- oder Werbedienstleister findet nicht statt. + +### 5a. Eigene Nutzungsstatistiken ohne Personenbezug + +Neben Umami führen wir auf unseren eigenen Servern drei einfache Ereignisprotokolle, mit denen wir die Reichweite veröffentlichter Pressemitteilungen belegen und den Weg von einer Benachrichtigung zum Kundenkonto nachvollziehen. Diese Protokolle enthalten keine IP-Adressen, keine Cookies und keine Kennungen, die eine Person oder ein Gerät wiedererkennbar machen. + +- **Aufrufe und Teilen-Klicks je Pressemitteilung.** Gespeichert werden die Meldung, der Zeitpunkt und bei einem Teilen-Klick der gewählte Kanal. Daraus entstehen die Aufrufzahlen und Tagesverläufe, die wir dem einreichenden Unternehmen zeigen. +- **Abrufe durch Such-, KI- und Feed-Dienste.** Ruft ein bekannter Dienst eine Meldung oder einen RSS-Feed ab, speichern wir den Dienst, die gekürzte Programmkennung (User-Agent), den Zeitpunkt und die betroffene Meldung beziehungsweise den Feed. Nennt ein Feed-Dienst in seiner Kennung eine Abonnentenzahl, übernehmen wir diese Zahl. Wer einen Feed abonniert hat, erfahren wir nicht. +- **Schritte vom Hinweis zum Konto.** Klickt ein Empfänger einen Link in einer unserer Benachrichtigungen, nutzt einen Anmeldelink, bearbeitet einen Newsroom, legt ein Konto an oder bucht erstmals, halten wir den Schritt, den Anlass (zum Beispiel „Veröffentlichungsmail") und das betroffene Unternehmen fest. Die Person und ihre E-Mail-Adresse werden dabei nicht gespeichert; die Auswertung zählt Unternehmen, nicht Menschen. + +Die Verarbeitung erfolgt zur Reichweitenmessung gegenüber unseren Kunden, zur Bewertung unserer Benachrichtigungen und zur Verbesserung unseres Angebots. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO. Die Protokolle werden nicht an Dritte weitergegeben und nicht mit anderen Daten zu Nutzerprofilen verbunden. + +### 6. Kontaktaufnahme + +Wenn Sie uns per E-Mail oder über ein Formular kontaktieren, verarbeiten wir die von Ihnen angegebenen Daten zur Bearbeitung Ihrer Anfrage. Dazu können insbesondere gehören: + +- Name, +- E-Mail-Adresse, +- Inhalt Ihrer Nachricht, +- betroffene URL, +- Zeitpunkt der Anfrage, +- technische Metadaten zur Missbrauchsvermeidung und Sicherheit. + +Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO, soweit Ihre Anfrage mit einem Vertrag oder vorvertraglichen Maßnahmen zusammenhängt. In allen anderen Fällen ist Rechtsgrundlage Art. 6 Abs. 1 lit. f DSGVO. Soweit wir gesetzlich zur Bearbeitung oder Dokumentation verpflichtet sind, ist Rechtsgrundlage Art. 6 Abs. 1 lit. c DSGVO. + +Die Daten werden gelöscht, sobald die Anfrage abgeschlossen ist und keine gesetzlichen Aufbewahrungspflichten oder berechtigten Interessen an einer weiteren Speicherung entgegenstehen. + +Anfragen, die unser Spamfilter als unerwünschte Werbung oder automatisierte Eingabe erkennt, werden ohne Weiterleitung an unser Team zurückgehalten, damit wir Fehleinstufungen prüfen können, und spätestens nach 30 Tagen automatisch gelöscht. + +### 6a. Schutz vor automatisierten Anfragen (Cloudflare Turnstile) + +Um unsere Formulare vor automatisierten Eingaben (Spam, Bots) zu schützen, setzen wir im Kontaktformular und bei der Registrierung den Dienst Turnstile ein. Anbieter ist die Cloudflare, Inc., 101 Townsend St., San Francisco, CA 94107, USA. + +Turnstile wird erst geladen, wenn Sie das Kontaktformular öffnen oder die Registrierungsseite aufrufen. Der Dienst prüft anhand technischer Merkmale, ob die Eingabe von einem Menschen stammt; in der Regel ohne dass Sie etwas tun müssen. Dabei werden insbesondere verarbeitet: + +- IP-Adresse, +- Informationen zu Browser und Betriebssystem (z. B. User-Agent, Spracheinstellungen), +- Merkmale des Seitenaufrufs und der Interaktion mit der Prüfung, +- Zeitpunkt der Prüfung. + +Turnstile setzt nach Angaben von Cloudflare keine Cookies zu Werbe- oder Trackingzwecken und nutzt die Daten nicht für personalisierte Werbung. Wir erhalten von Cloudflare nur das Ergebnis der Prüfung. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt darin, Missbrauch unserer Formulare zu verhindern, etwa den massenhaften Versand von Bestätigungs-E-Mails an fremde Adressen. Für den Zugriff auf Informationen in Ihrem Endgerät ist Rechtsgrundlage § 25 Abs. 2 Nr. 2 TDDDG, da die Prüfung für den sicheren Betrieb des von Ihnen genutzten Formulars unbedingt erforderlich ist. + +Cloudflare kann Daten auch in den USA verarbeiten. Cloudflare ist nach dem EU-US Data Privacy Framework zertifiziert; die Übermittlung erfolgt auf Grundlage des Angemessenheitsbeschlusses der Europäischen Kommission (Art. 45 DSGVO). Weitere Informationen finden Sie in den Datenschutzhinweisen von Cloudflare ([cloudflare.com/privacypolicy](https://www.cloudflare.com/privacypolicy/)) und zu Turnstile ([cloudflare.com/turnstile-privacy-policy](https://www.cloudflare.com/turnstile-privacy-policy/)). + +### 7. Magic-Link: Änderungslinks für Pressekontakte und berechtigte Personen + +Als in einer Pressemitteilung genannter Pressekontakt, ursprünglicher Auftraggeber, Firmeninhaber oder sonst berechtigte Person können Sie Änderungen über einen zeitlich begrenzten Änderungslink beantragen. Der Link wird an die in der Pressemitteilung oder im Kundenkonto hinterlegte E-Mail-Adresse gesendet. + +Verarbeitet werden: + +- E-Mail-Adresse, +- ein kryptographisch gehashtes Token, +- Zeitstempel, +- betroffene Pressemitteilung, +- beantragte Änderung, +- technische Metadaten zur Sicherheit und Missbrauchsvermeidung. + +Das Token ist nur zeitlich begrenzt gültig und verfällt nach einmaliger Nutzung oder nach Ablauf einer kurzen Gültigkeitsdauer automatisch. Die konkrete Gültigkeitsdauer wird systemseitig festgelegt und beträgt derzeit 15 Minuten. + +Rechtsgrundlagen sind je nach Vorgang Art. 6 Abs. 1 lit. b DSGVO, Art. 6 Abs. 1 lit. c DSGVO und Art. 6 Abs. 1 lit. f DSGVO. Die Verarbeitung dient insbesondere der sicheren Zuordnung berechtigter Änderungsanfragen, der Vertragsdurchführung, der Bearbeitung gesetzlicher Rechte und der Vermeidung von Missbrauch. + +### 8. Automatisierte Inhaltsprüfung und Qualitätsbewertung + +Eingereichte Pressemitteilungen werden vor der Veröffentlichung automatisiert auf die Einhaltung unserer Veröffentlichungsrichtlinien geprüft und inhaltlich bewertet. + +Dabei können auch personenbezogene Daten verarbeitet werden, die in der Pressemitteilung enthalten sind. Soweit möglich, werden personenbezogene Daten vor der automatisierten Analyse minimiert oder entfernt. API-Anbindungen werden, soweit verfügbar, so konfiguriert, dass die übermittelten Inhalte nicht für Trainingszwecke fremder Modelle verwendet werden. + +Für die automatisierte Analyse können je nach Anfrage, Tätigkeit und Verfügbarkeit unterschiedliche KI- oder Analyse-Anbieter eingesetzt werden. Derzeit kommen insbesondere folgende Anbieter in Betracht: + +- OpenAI, +- Google Gemini, +- Anthropic Claude. + +Verarbeitet werden insbesondere: + +- Inhalt der eingereichten Pressemitteilung, +- minimierte oder anonymisierte Prüffassung, soweit technisch möglich, +- Bewertungsergebnis, +- Scores oder Risikomerkmale, +- Ablehnungskategorien, +- interne Hinweise zur Qualitätsbewertung, +- Ergebnis einer gegebenenfalls durchgeführten menschlichen Überprüfung. + +Führt die Prüfung zur Ablehnung einer Mitteilung, teilen wir Ihnen die Ablehnungskategorie mit. Sie können eine Überprüfung durch einen Menschen verlangen und dabei Ihren Standpunkt darlegen. Die Entscheidung wird dann erneut geprüft. + +Die Prüfergebnisse, Scores, Ablehnungskategorien und Begründungen werden intern der jeweiligen Pressemitteilung zugeordnet und grundsätzlich so lange gespeichert, wie die Pressemitteilung gespeichert oder veröffentlicht bleibt. Dies dient der Nachvollziehbarkeit der Veröffentlichungsentscheidung, der Qualitätssicherung, der Bearbeitung von Rückfragen sowie der Rechtsverteidigung. + +Rechtsgrundlagen sind Art. 6 Abs. 1 lit. b DSGVO und Art. 6 Abs. 1 lit. f DSGVO. Soweit gesetzliche Dokumentationspflichten bestehen oder Meldungen nach dem Digital Services Act betroffen sind, kann zusätzlich Art. 6 Abs. 1 lit. c DSGVO einschlägig sein. + +### 9. Veröffentlichte Pressemitteilungen und Medienprivileg + +Die auf presseecho veröffentlichten Pressemitteilungen sind öffentlich zugängliche Presseinhalte und Teil eines dauerhaften Archivs. In Pressemitteilungen können personenbezogene Daten enthalten sein, zum Beispiel: + +- Namen von Ansprechpartnern, +- berufliche Kontaktdaten, +- Zitate, +- Funktionen im Unternehmen, +- Personalien, +- Bildmaterial, +- sonstige Angaben mit Personenbezug. + +Soweit die Verarbeitung zu journalistisch-redaktionellen Zwecken erfolgt, gelten die hierfür vorgesehenen Sonderregeln nach Art. 85 DSGVO in Verbindung mit dem jeweils anwendbaren Medien- und Presserecht. Für den Verantwortlichen mit Sitz in Nordrhein-Westfalen kommen insbesondere § 57 Abs. 1 Medienstaatsvertrag (MStV) sowie die einschlägigen Regelungen des Pressegesetzes für das Land Nordrhein-Westfalen in Betracht. + +Durch die medien- und presserechtlichen Sonderregeln können einzelne Betroffenenrechte eingeschränkt sein, soweit dies zur Wahrung der Meinungs- und Informationsfreiheit, der Pressefreiheit und der Archivfunktion erforderlich ist. Dies bedeutet nicht, dass Betroffenenrechte ausgeschlossen sind. Wir prüfen entsprechende Anfragen im Einzelfall. + +Unabhängig davon können Sie jederzeit die Entfernung, Aktualisierung oder Anonymisierung Ihrer persönlichen Kontaktdaten als natürliche Person beantragen. Auch Meldungen rechtswidriger Inhalte sind jederzeit kostenlos möglich. Die dafür vorgesehenen Wege finden Sie unter: [presseecho.de/de/melden](https://presseecho.de/de/melden). + +Angaben über juristische Personen, zum Beispiel GmbH oder AG, sind grundsätzlich keine personenbezogenen Daten im Sinne der DSGVO. Enthalten Angaben über Unternehmen zugleich Informationen über natürliche Personen, prüfen wir Betroffenenanfragen im Einzelfall. + +Informationen aus öffentlichen Registern, zum Beispiel dem Handelsregister, berücksichtigen wir bei dieser Prüfung entsprechend ihrer gesetzlichen Publizitätsfunktion. + +### 10. Newsroom und Firmenprofile + +Zu jedem veröffentlichenden Unternehmen kann ein öffentliches Firmenprofil („Newsroom") mit den vom Kunden bereitgestellten Angaben und dessen Pressemitteilungen angezeigt werden. + +Dabei können insbesondere verarbeitet und veröffentlicht werden: + +- Unternehmensname, +- Logo, +- Beschreibung, +- Anschrift oder Standortangaben, +- Website, +- Branchenangaben, +- Ansprechpartner, +- berufliche Kontaktdaten, +- veröffentlichte Pressemitteilungen. + +Verantwortlich für die inhaltlichen Angaben ist das jeweilige veröffentlichende Unternehmen. Die Verarbeitung durch uns erfolgt zur Vertragsdurchführung nach Art. 6 Abs. 1 lit. b DSGVO sowie, soweit einschlägig, zu journalistisch-redaktionellen Zwecken nach dem vorstehenden Abschnitt. + +Soweit Firmenprofile personenbezogene Daten enthalten, zum Beispiel Ansprechpartner oder Kontaktdaten, gelten die Hinweise aus dem vorstehenden Abschnitt entsprechend. + +### 11. Meldeverfahren + +Wenn Sie über unser Meldeverfahren einen Inhalt melden, eine Änderung beantragen oder eigene personenbezogene Daten entfernen lassen möchten, verarbeiten wir die von Ihnen angegebenen Daten zur Bearbeitung der Meldung oder Anfrage. + +Dabei können insbesondere verarbeitet werden: + +- Name, +- E-Mail-Adresse, +- betroffene URL, +- Begründung der Meldung, +- ausgewählte Meldekategorie, +- Nachweise oder ergänzende Angaben, +- Zeitpunkt der Meldung, +- Vorgangsnummer, +- Bearbeitungsstatus, +- Entscheidung und Begründung, +- Kommunikationsverlauf. + +Die Verarbeitung erfolgt zur Bearbeitung Ihrer Meldung, zur Erfüllung gesetzlicher Pflichten, insbesondere nach dem Digital Services Act und der DSGVO, zur Dokumentation der Entscheidung sowie zur Rechtsverteidigung. + +Rechtsgrundlagen sind Art. 6 Abs. 1 lit. c DSGVO und Art. 6 Abs. 1 lit. f DSGVO. Soweit die Meldung mit einem bestehenden Vertrag oder Kundenkonto zusammenhängt, kann zusätzlich Art. 6 Abs. 1 lit. b DSGVO einschlägig sein. + +Meldedaten bewahren wir zur Dokumentation der Bearbeitung und Entscheidung grundsätzlich für drei Jahre nach Abschluss des Vorgangs auf. Eine längere Speicherung erfolgt nur, soweit dies zur Bearbeitung laufender Vorgänge, zur Erfüllung gesetzlicher Pflichten oder zur Rechtsverteidigung erforderlich ist. + +Meldungen und Änderungsanfragen können über die auf den Portalen vorgesehenen Wege ([Inhalte melden](https://presseecho.de/de/melden)) oder die Melde-Links bei der jeweiligen Pressemitteilung eingereicht werden. + +Für Rückfragen zu bestehenden Meldungen nutzen Sie bitte die Eingangsbestätigung oder kontaktieren Sie uns über info@pressekonto.com. + +### 12. E-Mail-Versand + +Für den Versand transaktionaler E-Mails nutzen wir: + +ALL-INKL.COM - Neue Medien Münnich +Inhaber: René Münnich +Hauptstraße 68 +02742 Friedersdorf +Deutschland + +Transaktionale E-Mails sind insbesondere: + +- Magic-Links, +- Änderungslinks, +- Buchungsbestätigungen, +- Rechnungen oder Rechnungshinweise, +- Eingangsbestätigungen zu Meldungen, +- Benachrichtigungen zu Veröffentlichungen, +- System- und Sicherheitsmitteilungen. + +Dabei werden insbesondere verarbeitet: + +- E-Mail-Adresse, +- Empfängername, soweit vorhanden, +- Inhalt der jeweiligen Nachricht, +- Versandzeitpunkt, +- technische Zustelldaten, +- Statusinformationen zur Zustellung. + +Rechtsgrundlagen sind je nach Zweck der jeweiligen E-Mail Art. 6 Abs. 1 lit. b DSGVO, Art. 6 Abs. 1 lit. c DSGVO und Art. 6 Abs. 1 lit. f DSGVO. + +Mit dem Dienstleister besteht, soweit erforderlich, ein Vertrag zur Auftragsverarbeitung gemäß Art. 28 DSGVO. + +### 13. Speicherdauer, Backups und Aufbewahrungspflichten + +Wir speichern personenbezogene Daten nur so lange, wie es für die in dieser Datenschutzerklärung genannten Zwecke erforderlich ist. + +Es gelten insbesondere folgende Speicherfristen: + +- Server-Logs werden grundsätzlich nach 14 Tagen gelöscht, sofern kein sicherheitsrelevanter Vorfall eine längere Aufbewahrung erforderlich macht. +- Magic-Link-Token verfallen nach einmaliger Nutzung oder nach Ablauf von 15 Minuten. +- Die Ereignisprotokolle zu Aufrufen, Abrufen durch Dienste und Konversionsschritten (Abschnitt 5a) werden nach 395 Tagen gelöscht. +- Meldedaten werden grundsätzlich für drei Jahre nach Abschluss des Vorgangs gespeichert. +- Vertrags-, Buchungs- und Rechnungsdaten unterliegen handels- und steuerrechtlichen Aufbewahrungspflichten und werden nach Ablauf dieser Fristen gelöscht. +- Veröffentlichte Pressemitteilungen werden im Rahmen der Archivfunktion grundsätzlich dauerhaft gespeichert, soweit keine gesetzlichen Ansprüche auf Entfernung, Sperrung oder Änderung bestehen. +- Kontodaten werden nach Kontolöschung entfernt, soweit keine Aufbewahrungspflichten, offenen Vorgänge oder berechtigten Interessen an einer weiteren Speicherung entgegenstehen. + +Gelöschte Daten können in Sicherungskopien noch bis zu vier Wochen enthalten sein. Die Backups werden ausschließlich zur Wiederherstellung der Systeme im Sicherungsfall verwendet und nicht produktiv ausgewertet. + +### 14. Ihre Rechte + +Sie haben gegenüber uns nach Maßgabe der gesetzlichen Voraussetzungen folgende Rechte: + +- Recht auf Auskunft nach Art. 15 DSGVO, +- Recht auf Berichtigung nach Art. 16 DSGVO, +- Recht auf Löschung nach Art. 17 DSGVO, +- Recht auf Einschränkung der Verarbeitung nach Art. 18 DSGVO, +- Recht auf Datenübertragbarkeit nach Art. 20 DSGVO, +- Recht auf Widerspruch gegen Verarbeitungen auf Grundlage berechtigter Interessen nach Art. 21 DSGVO, +- Recht auf jederzeitigen Widerruf einer erteilten Einwilligung nach Art. 7 Abs. 3 DSGVO, ohne dass die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung berührt wird. + +Für veröffentlichte Presseinhalte gelten die Besonderheiten aus Abschnitt 9. + +Die Ausübung Ihrer Rechte ist grundsätzlich kostenlos. In den gesetzlich vorgesehenen Ausnahmefällen, insbesondere bei offenkundig unbegründeten oder exzessiven Anträgen, können wir nach Maßgabe von Art. 12 Abs. 5 DSGVO ein angemessenes Entgelt verlangen oder die Bearbeitung ablehnen. + +Wenn wir begründete Zweifel an Ihrer Identität oder Berechtigung haben, können wir zusätzliche Informationen anfordern, die zur Bestätigung Ihrer Identität oder Berechtigung erforderlich sind. + +Zur Ausübung Ihrer Rechte können Sie uns kontaktieren unter: info@pressekonto.com + +Für Inhalte auf den Portalen nutzen Sie bitte vorrangig das Melde- und Änderungsverfahren unter: [presseecho.de/de/melden](https://presseecho.de/de/melden) + +### 15. Beschwerderecht + +Sie haben das Recht, sich bei einer Datenschutz-Aufsichtsbehörde zu beschweren. + +Zuständig für uns ist: + +Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen +Kavalleriestraße 2–4 +40213 Düsseldorf +Website: [www.ldi.nrw.de](https://www.ldi.nrw.de) + +--- + +## C. AGB 0.6 (alle Domains) + +**Stand: 3. Juli 2026 · Version 0.6.** Auf allen drei Domains wortgleich; auf den Portalen führen nur die Links auf die eigene Domain (siehe Hinweis 4). + +### § 1 Geltungsbereich und Vertragspartner + +(1) Diese Allgemeinen Geschäftsbedingungen (nachfolgend „AGB") gelten für alle Verträge über die Veröffentlichung von Pressemitteilungen und damit verbundene Leistungen, die über die Plattform **pressekonto** (erreichbar unter [pressekonto.com](https://pressekonto.com)) geschlossen werden. + +(2) Vertragspartner ist: adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld (nachfolgend „Anbieter"). + +(3) Die Veröffentlichung der Pressemitteilungen erfolgt auf den vom Anbieter betriebenen **angeschlossenen Portalen**. Angeschlossene Portale sind derzeit: + +- presseecho.de +- businessportal24.com + +Der Anbieter kann weitere eigene Portale anschließen. Die jeweils aktuelle Liste ist auf [pressekonto.com](https://pressekonto.com/#familie) einsehbar. Der Anschluss weiterer Portale erweitert den Leistungsumfang und stellt keine Änderung dieser AGB dar. + +(4) **Das Angebot richtet sich ausschließlich an Unternehmer** im Sinne des § 14 BGB, juristische Personen des öffentlichen Rechts und öffentlich-rechtliche Sondervermögen. Ein Vertragsschluss mit Verbrauchern (§ 13 BGB) erfolgt nicht. Der Kunde bestätigt bei der Buchung ausdrücklich, dass er in Ausübung seiner gewerblichen oder selbständigen beruflichen Tätigkeit handelt; der Anbieter darf auf diese Bestätigung vertrauen. + +(5) Abweichende Geschäftsbedingungen des Kunden finden keine Anwendung, auch wenn der Anbieter ihrer Geltung nicht ausdrücklich widerspricht. + +### § 2 Begriffsbestimmungen + +- **Pressemitteilung (PM):** Ein vom Kunden eingereichter Beitrag mit presse- bzw. unternehmensbezogenem Nachrichtencharakter. +- **Slot:** Ein Veröffentlichungskontingent innerhalb eines Tarifs. Ein Slot wird nur durch eine tatsächlich erfolgte Veröffentlichung verbraucht. +- **Credit:** Eine vorausbezahlte Verrechnungseinheit für Zusatzleistungen. Die für den Erwerb von Credits und für Zusatzleistungen jeweils geltenden Preise ergeben sich aus der bei Buchung angezeigten Preis- und Leistungsbeschreibung. Alle Preise verstehen sich netto zuzüglich der gesetzlichen Umsatzsteuer. +- **Boost:** Eine zeitlich befristete hervorgehobene Platzierung einer veröffentlichten PM. +- **Inhaltsprüfung:** Die automatisierte Prüfung eingereichter PMs vor Veröffentlichung (siehe § 7). +- **Veröffentlichungsrichtlinien:** Die unter [pressekonto.com/richtlinien](https://pressekonto.com/de/richtlinien) einsehbaren inhaltlichen Anforderungen an PMs. Sie sind Bestandteil dieser AGB. + +### § 3 Registrierung und Vertragsschluss + +(1) Die Nutzung der Plattform setzt die Registrierung eines Kundenkontos auf [pressekonto.com](https://pressekonto.com) voraus. Die Registrierung ist kostenlos. Das Anlegen und Speichern von PM-Entwürfen ist ohne kostenpflichtige Buchung möglich. **Die Einreichung und Veröffentlichung von PMs setzt voraus, dass der Kunde mindestens ein Firmenprofil (Unternehmen) angelegt hat; jede PM wird im Namen eines Unternehmens veröffentlicht.** + +(2) Die Darstellung der Tarife und Leistungen auf der Plattform stellt kein bindendes Angebot dar, sondern eine Aufforderung zur Abgabe eines Angebots. Der Vertrag kommt zustande, indem der Kunde den Buchungsvorgang durch Klick auf die Schaltfläche „zahlungspflichtig bestellen" (oder gleichbedeutend) abschließt und der Anbieter die Buchung per E-Mail bestätigt. + +(3) Der Vertragstext wird vom Anbieter gespeichert. Der Kunde erhält die Vertragsbestimmungen einschließlich dieser AGB mit der Buchungsbestätigung in Textform. Die bei Vertragsschluss gültige AGB-Fassung wird dem Buchungsvorgang dauerhaft zugeordnet und ist für den Kunden im Kundenkonto abrufbar. + +(4) Der Kunde sichert zu, dass die bei Registrierung und Buchung angegebenen Daten zutreffend und vollständig sind, und hält sie aktuell. Dies gilt insbesondere für die Bestätigung seiner Unternehmereigenschaft (§ 1 Abs. 4) und die Angaben zu seinem Unternehmen. + +(5) Die für den Vertragsschluss zur Verfügung stehende Sprache ist ausschließlich Deutsch. + +(6) Informationen zur Verarbeitung personenbezogener Daten finden sich in der Datenschutzerklärung unter [pressekonto.com/datenschutz](https://pressekonto.com/de/datenschutz). + +### § 4 Leistungsumfang: Tarife, Slots und Tageslimits + +(1) Der Anbieter bietet folgende Leistungsmodelle an: + +- **Einzelveröffentlichung** („Einzel"): einmalige Veröffentlichung einer PM ohne Abonnement. +- **Abonnements** („Starter", „Business", „Pro", „Agency"): monatliche Veröffentlichungskontingente (Slots) gemäß der bei Buchung gültigen Leistungsbeschreibung unter [pressekonto.com/preise](https://pressekonto.com/de/preise). + +(2) Slots eines Abonnements gelten für den jeweiligen Abrechnungsmonat. Nicht genutzte Slots verfallen mit Ablauf des Abrechnungsmonats; hierauf wird in der Leistungsbeschreibung deutlich hingewiesen. **Slots stellen kein Geldguthaben dar, sind nicht auszahlbar und können nicht auf spätere Abrechnungsmonate übertragen werden.** + +(3) Ein Slot wird ausschließlich durch eine tatsächlich erfolgte Veröffentlichung verbraucht. **Wird eine PM im Rahmen der Inhaltsprüfung abgelehnt, wird kein Slot verbraucht.** Wird eine PM aufgrund eines technischen Fehlers des Anbieters nicht oder nicht wie vorgesehen veröffentlicht, wird der dafür eingesetzte Slot dem Kundenkonto unverzüglich wieder gutgeschrieben. + +(4) Zur Sicherung der redaktionellen Qualität der angeschlossenen Portale gelten je Tarif tägliche Veröffentlichungshöchstmengen (Tageslimits) gemäß Leistungsbeschreibung. Über das Tageslimit hinaus eingereichte PMs können für den Folgetag eingeplant werden. + +(5) Überschreitet der Kunde sein Monatskontingent, kann er zusätzliche Veröffentlichungen als Zusatzleistung gegen Credits buchen (Extra-PM, § 6). + +### § 5 Credits + +(1) Credits sind vorausbezahlte Verrechnungseinheiten für Zusatzleistungen (§ 6). Der Erwerb erfolgt über das Kundenkonto; die verfügbaren Credit-Pakete und Preise sind unter [pressekonto.com/preise](https://pressekonto.com/de/preise) ausgewiesen. + +(2) **Gültigkeit:** Erworbene Credits sind mindestens drei Jahre ab dem Ende des Kalenderjahres gültig, in dem der Erwerb erfolgte. Vor Ablauf der Gültigkeit informiert der Anbieter den Kunden rechtzeitig per E-Mail an die im Kundenkonto hinterlegte Adresse. + +(3) **Keine Auszahlung:** Eine Rückzahlung oder Barauszahlung erworbener Credits ist ausgeschlossen. Zwingende gesetzliche Ansprüche bleiben unberührt. + +(4) Credits sind an das Kundenkonto gebunden und nicht auf andere Konten übertragbar. + +(5) Bei der Verrechnung werden stets die ältesten Credits zuerst verbraucht (First-in-first-out). + +(6) **Kontolöschung:** Verfügt der Kunde bei einer von ihm veranlassten Löschung seines Kundenkontos noch über ein Credit-Guthaben, wird er im Löschvorgang ausdrücklich auf die Höhe des Guthabens und dessen ersatzlosen Verfall hingewiesen. Die Löschung wird erst nach gesonderter Bestätigung dieses Hinweises ausgeführt. Alternativ kann der Kunde das Konto bis zum Verbrauch oder zum Ablauf der Gültigkeit (Absatz 2) kostenlos fortführen. Gesetzliche Erstattungsansprüche bleiben unberührt. + +### § 6 Zusatzleistungen + +(1) **Extra-PM:** Veröffentlichung einer zusätzlichen PM über das Monatskontingent hinaus. Der Credit-Preis richtet sich nach dem gebuchten Tarif und ist in der Leistungsbeschreibung ausgewiesen. + +(2) **Boost:** Zeitlich befristete hervorgehobene Platzierung einer veröffentlichten PM (Startseite und Kategorieseite des jeweiligen Portals) in den Laufzeitstufen 7, 14 oder 30 Tage. Ein Boost ist nur für PMs buchbar, die die Inhaltsprüfung ohne Beanstandung durchlaufen haben (Status „Grün"). **Geschuldet ist ausschließlich die Platzierung während der gebuchten Laufzeit; eine bestimmte Reichweite, Zugriffszahl oder sonstige Werbewirkung wird nicht geschuldet.** Ist das jeweilige Portal während eines aktiven Boosts aus vom Anbieter zu vertretenden Gründen nicht erreichbar, verlängert sich die gebuchte Boost-Laufzeit um die Dauer der Nichterreichbarkeit. Kurzzeitige Unterbrechungen von weniger als 60 zusammenhängenden Minuten bleiben unberücksichtigt. + +(3) **Veröffentlichungsnachweis (PDF):** Auf Wunsch erstellt der Anbieter einen Nachweis der Veröffentlichung als PDF-Dokument zu dem in der Leistungsbeschreibung ausgewiesenen Credit-Preis. + +(4) Zusatzleistungen werden im Zeitpunkt der Buchung mit dem Credit-Guthaben verrechnet. Reicht das Guthaben nicht aus, ist ein Nachkauf im Buchungsvorgang möglich. + +### § 7 Inhaltsprüfung und Veröffentlichung + +(1) Jede eingereichte PM durchläuft vor Veröffentlichung eine automatisierte Inhaltsprüfung anhand der Veröffentlichungsrichtlinien. Die Prüfung dient dem Schutz der Leser, der Rechtskonformität und der redaktionellen Qualität der angeschlossenen Portale. + +(2) Ergebnis der Prüfung: + +- **Grün / Gelb:** Die PM wird nach Abschluss der Inhaltsprüfung veröffentlicht; ein Slot wird verbraucht. Gelb bedeutet, dass die PM trotz einzelner Hinweise oder Risikomerkmale nach automatisierter Prüfung veröffentlichungsfähig ist; Einzelheiten regeln die Veröffentlichungsrichtlinien. +- **Rot:** Die PM wird nicht veröffentlicht; es wird kein Slot verbraucht. Der Kunde erhält die Ablehnung mit Angabe der Ablehnungskategorie. + +(3) **Ein Anspruch auf Veröffentlichung besteht nicht**, wenn und soweit die PM gegen die Veröffentlichungsrichtlinien, gesetzliche Vorschriften oder Rechte Dritter verstößt. Die Ablehnungsgründe werden in den Veröffentlichungsrichtlinien kategorisiert; bei einer Ablehnung gibt der Anbieter mindestens eine einschlägige Ablehnungskategorie an. + +(4) **Menschliche Überprüfung:** Der Kunde kann gegen eine Ablehnung eine Überprüfung durch einen Menschen verlangen. Der Antrag erfolgt formlos über das Kundenkonto oder per E-Mail an info@pressekonto.com. Der Anbieter teilt das Ergebnis der Überprüfung in der Regel innerhalb von zwei Werktagen mit. Ist eine Prüfung innerhalb dieser Frist nicht möglich, informiert der Anbieter den Kunden über die Verzögerung. + +(5) Eine redaktionelle Bearbeitung eingereichter PMs durch den Anbieter findet nicht statt. Technisch bedingte Anpassungen (Formatierung, Erstellung von Anrisstexten/Teasern, Bildzuschnitte für Vorschaudarstellungen) bleiben vorbehalten und stellen keine inhaltliche Bearbeitung dar. + +(6) Der Zeitpunkt der Veröffentlichung ergibt sich aus dem Abschluss der Inhaltsprüfung; ein bestimmter Veröffentlichungszeitpunkt wird nicht geschuldet, es sei denn, er ist ausdrücklich vereinbart. + +### § 8 Pflichten des Kunden; Verantwortlichkeit für Inhalte + +(1) Der Kunde ist für den Inhalt seiner PMs allein verantwortlich. Er sichert zu, dass + +- er über alle für die Veröffentlichung erforderlichen Rechte an Texten, Bildern und sonstigen Inhalten verfügt, +- die Inhalte keine Rechte Dritter (insbesondere Urheber-, Marken-, Persönlichkeits- und Wettbewerbsrechte) verletzen, +- die Inhalte nicht gegen gesetzliche Vorschriften oder die Veröffentlichungsrichtlinien verstoßen, +- enthaltene Tatsachenbehauptungen zutreffend sind. + +(2) Der Kunde stellt den Anbieter von Ansprüchen Dritter frei, die auf einer schuldhaften Verletzung der Pflichten aus Absatz 1 beruhen, einschließlich der angemessenen Kosten der Rechtsverteidigung. + +(3) Wird der Anbieter wegen eines Kundeninhalts von Dritten oder Behörden in Anspruch genommen oder liegt ein begründeter Hinweis auf Rechtswidrigkeit vor (insbesondere über das Meldeverfahren nach dem Digital Services Act), ist der Anbieter berechtigt, die betroffene PM vorläufig zu depublizieren, bis der Sachverhalt geklärt ist. Der Kunde wird hierüber unverzüglich informiert und erhält Gelegenheit zur Stellungnahme. + +### § 9 Rechteeinräumung + +(1) Der Kunde räumt dem Anbieter an den eingereichten Inhalten das einfache, räumlich unbeschränkte Recht ein, die Inhalte für die Dauer der Veröffentlichung auf den angeschlossenen Portalen öffentlich zugänglich zu machen, zu vervielfältigen und technisch aufzubereiten (Formatierung, Teaser, Vorschaubilder, responsive Darstellungen). + +(2) Soweit der Kunde eine zusätzliche Verbreitung über **Partnerportale** auswählt oder diese ausdrücklich Bestandteil des gebuchten Tarifs ist, räumt der Kunde dem Anbieter das Recht ein, die PM an die in der Leistungsbeschreibung genannten Partner oder Partnerkategorien zur dortigen Veröffentlichung weiterzugeben. Ohne eine solche Auswahl oder Tarifzugehörigkeit erfolgt keine Weitergabe an Dritte. + +(3) Eine inhaltliche Veränderung, Kürzung oder Bearbeitung über Absatz 1 hinaus erfolgt nicht. + +(4) Die Rechteeinräumung nach Absatz 1 bleibt für die Dauer der Archivierung bestehen, auch wenn das Kundenkonto endet (§ 11 Abs. 5). + +### § 10 Preise, Zahlung, Rechnungen + +(1) Es gelten die zum Zeitpunkt der Buchung ausgewiesenen Preise. Alle Preise verstehen sich netto zuzüglich der gesetzlichen Umsatzsteuer. + +(2) Die Zahlung erfolgt über den Zahlungsdienstleister Stripe mit den im Buchungsvorgang angebotenen Zahlungsmitteln. Abonnementgebühren werden zu Beginn des jeweiligen Abrechnungszeitraums fällig und über das hinterlegte Zahlungsmittel eingezogen. + +(3) Rechnungen werden elektronisch erstellt und im Kundenkonto bereitgestellt sowie per E-Mail übermittelt. + +(4) Schlägt ein Einzug fehl, wird der Kunde benachrichtigt und erhält Gelegenheit zur Aktualisierung des Zahlungsmittels. Während eines Zahlungsverzugs kann der Anbieter die Annahme neuer PMs aussetzen; bereits veröffentlichte PMs bleiben online. + +(5) **Preisänderungen laufender Abonnements:** Der Anbieter kann die Preise laufender Abonnements mit Wirkung für die Zukunft anpassen. Eine Preisanpassung kommt insbesondere in Betracht, wenn sich Kosten für Hosting, technische Infrastruktur, Zahlungsabwicklung, gesetzliche oder regulatorische Anforderungen, Portalbetrieb oder sonstige für die Leistungserbringung wesentliche Kostenpositionen nicht nur unerheblich ändern; Kostensenkungen werden dabei ebenso berücksichtigt wie Kostensteigerungen. Die Preisanpassung darf den Umfang der eingetretenen Kostenänderung nicht überschreiten. Preisänderungen werden dem Kunden mindestens sechs Wochen vor dem Wirksamwerden in Textform angekündigt. Dem Kunden steht in diesem Fall ein Sonderkündigungsrecht zum Zeitpunkt des Wirksamwerdens zu; hierauf wird in der Ankündigung ausdrücklich hingewiesen. Für den zum Zeitpunkt der Ankündigung bereits bezahlten Abrechnungszeitraum bleibt der vereinbarte Preis unverändert. Bereits erworbene Credits sind von Preisänderungen nicht betroffen. + +### § 11 Laufzeit, Verlängerung, Kündigung + +(1) Einzelveröffentlichungen und Credit-Käufe begründen kein Dauerschuldverhältnis. + +(2) Abonnements haben eine Laufzeit von einem Monat (monatliche Zahlweise) bzw. zwölf Monaten (jährliche Zahlweise). Das Abonnement verlängert sich jeweils automatisch um die gewählte Laufzeit (einen Monat bzw. zwölf Monate), sofern es nicht vor Ablauf der laufenden Laufzeit gekündigt wird. **Die Kündigung ist jederzeit mit Wirkung zum Ende der laufenden Laufzeit möglich; bei monatlicher Zahlweise also monatlich, bei jährlicher Zahlweise zum Ende des jeweiligen Zwölfmonats-Zeitraums. Der Jahresrabatt („2 Monate gratis") gilt nur bei jährlicher Zahlweise.** + +(3) Die Kündigung ist möglich: + +- jederzeit über die Kündigungsfunktion im Kundenkonto (Selfservice) oder die [öffentliche Kündigungsseite](https://pressekonto.com/de/kuendigung), +- in Textform an info@pressekonto.com. + +Die Angabe von Zugangsdaten oder Passwörtern ist für die Kündigung per Textform nicht erforderlich. Der Anbieter bestätigt dem Kunden den Inhalt der Kündigung, Datum und Uhrzeit ihres Zugangs sowie den Zeitpunkt der Vertragsbeendigung unverzüglich auf elektronischem Wege in Textform. + +(4) Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt. Ein wichtiger Grund für den Anbieter liegt insbesondere vor bei wiederholten oder schwerwiegenden Verstößen gegen § 8. + +(5) Nach Vertragsende bleiben veröffentlichte PMs im Archiv der angeschlossenen Portale öffentlich zugänglich (Archivfunktion). Der Kunde behält über sein Kundenkonto Zugriff auf seine Inhalte und die Änderungsfunktionen; verbleibende Credits behalten ihre Gültigkeit nach § 5 Abs. 2. + +(6) **Datenexport:** Der Kunde kann die von ihm eingereichten Inhalte (Texte und Entwürfe) jederzeit in einem gängigen elektronischen Format erhalten; bis zur Bereitstellung einer Selfservice-Exportfunktion erfolgt die Herausgabe auf Anfrage an info@pressekonto.com. Gesetzliche Ansprüche (insbesondere Art. 20 DSGVO) bleiben unberührt. + +### § 12 Kein Widerrufsrecht (B2B) + +(1) Da sich das Angebot ausschließlich an Unternehmer richtet (§ 1 Abs. 4), besteht kein gesetzliches Widerrufsrecht. + +(2) Bestätigt ein Kunde bei der Buchung wahrheitswidrig, als Unternehmer zu handeln, kann er sich nach Treu und Glauben nicht auf Verbraucherschutzvorschriften berufen. + +### § 13 Depublikation, Änderungen, Meldeverfahren + +(1) Veröffentlichte PMs werden dauerhaft archiviert. **Auf die dauerhafte Archivierung wird der Kunde vor jeder Veröffentlichung im Veröffentlichungsvorgang ausdrücklich hingewiesen.** Eine nachträgliche Entfernung einer veröffentlichten PM aus der öffentlichen Ansicht der angeschlossenen Portale („Depublikation") ist bei rechtmäßigen Inhalten nur als freiwillige Serviceleistung des Anbieters gegen Entgelt möglich. Der jeweils geltende Preis (netto zuzüglich Umsatzsteuer) wird vor Beauftragung angezeigt. Bei einer Depublikation bleibt die ursprüngliche URL mit einem Hinweis auf die Entfernung bestehen („Tombstone"); eine vollständige Löschung der URL erfolgt nicht. Eine Entfernung aus Suchmaschinen-Caches, Archiven Dritter oder bereits erfolgten Weiterveröffentlichungen durch Dritte ist nicht geschuldet. **Gesetzliche Ansprüche des Kunden, insbesondere nach Datenschutzrecht, Persönlichkeitsrecht oder aufgrund rechtswidriger Inhalte, bleiben unberührt.** + +(2) **Unentgeltlich bleiben stets:** die Geltendmachung von Betroffenenrechten nach der DSGVO (insbesondere die Entfernung personenbezogener Kontaktdaten natürlicher Personen), Meldungen rechtswidriger Inhalte nach dem Digital Services Act sowie die Korrektur von Fehlern über das Änderungssystem. Einzelheiten regelt die Seite [Inhalte melden](https://pressekonto.com/de/melden). + +(3) Für nachträgliche Änderungen an veröffentlichten PMs stellt der Anbieter ein Änderungssystem bereit (Korrektur von Tippfehlern, Aktualisierung von Kontaktdaten). Umfang und Verfahren ergeben sich aus der Leistungsbeschreibung. + +### § 14 Gewährleistung und Haftung + +(1) Der Anbieter erbringt die Leistungen mit einer Verfügbarkeit von 98 % im Monatsmittel. Maßgeblich ist die Erreichbarkeit der Plattform (Kundenkonto und Buchungsfunktionen) sowie der angeschlossenen Portale. Kurzzeitige Unterbrechungen von weniger als 60 zusammenhängenden Minuten bleiben bei der Berechnung unberücksichtigt. Wird der Wert in einem Kalendermonat unterschritten, erhält der Kunde auf Antrag eine Gutschrift; diese berechnet sich zeitanteilig nach der Dauer der relevanten Nichterreichbarkeit im betroffenen Kalendermonat und ist auf die für diesen Monat gezahlte Abonnementgebühr begrenzt. Der Antrag ist innerhalb von vier Wochen nach Ablauf des betroffenen Kalendermonats zu stellen. Die Gutschrift wird auf etwaige Schadensersatzansprüche des Kunden wegen derselben Nichterreichbarkeit angerechnet. Ausgenommen von der Berechnung sind angekündigte Wartungsfenster und Störungen außerhalb des Einflussbereichs des Anbieters. + +(2) Der Anbieter haftet unbeschränkt für Vorsatz und grobe Fahrlässigkeit sowie für Schäden aus der Verletzung von Leben, Körper oder Gesundheit. + +(3) Bei einfacher Fahrlässigkeit haftet der Anbieter nur für die Verletzung wesentlicher Vertragspflichten (Kardinalpflichten), begrenzt auf den vertragstypischen, vorhersehbaren Schaden. + +(4) Die Haftung nach dem Produkthaftungsgesetz bleibt unberührt. + +(5) Der Anbieter macht sich die Inhalte der Kunden nicht zu eigen. Für fremde Inhalte gelten die Haftungsregeln des Digital Services Act. + +### § 15 Änderungen dieser AGB + +(1) Der Anbieter kann diese AGB mit Wirkung für die Zukunft ändern, soweit die Änderung erforderlich ist (z. B. Gesetzesänderungen, Rechtsprechung, neue Leistungsbestandteile) und den Kunden nicht unangemessen benachteiligt. + +(2) Änderungen werden dem Kunden mindestens vier Wochen vor Inkrafttreten in Textform mitgeteilt, unter Hervorhebung der geänderten Regelungen. + +(3) **Wesentliche Änderungen** — insbesondere solche, die Leistungsumfang, Preise oder Kündigungsrechte betreffen — bedürfen der ausdrücklichen Zustimmung des Kunden. Stimmt der Kunde nicht zu, wird der Vertrag zu den bisherigen Bedingungen fortgesetzt. Das Recht beider Parteien zur ordentlichen Kündigung bleibt unberührt. + +(4) Für unwesentliche Änderungen (z. B. redaktionelle Klarstellungen oder neue angeschlossene Portale, soweit hierdurch keine zusätzlichen Pflichten des Kunden entstehen) genügt die Mitteilung nach Absatz 2. + +### § 16 Schlussbestimmungen + +(1) Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts. + +(2) Ist der Kunde Kaufmann, juristische Person des öffentlichen Rechts oder öffentlich-rechtliches Sondervermögen, ist Gerichtsstand der Sitz des Anbieters. + +(3) Der Anbieter ist nicht bereit und nicht verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen (§ 36 VSBG). + +**Stand:** 3. Juli 2026 · **Version:** 0.6 +Diese AGB gelten für Buchungen über pressekonto (pressekonto.com) mit Veröffentlichung auf presseecho.de und businessportal24.com. + +--- + +## D. Boost-Platzierung + +### D.1 Preisseite: Angebot + +Quelle: [presseecho.de/de/preise](https://presseecho.de/de/preise). pressekonto.com/de/preise leitet dorthin weiter, businessportal24.com/de/preise ist wortgleich. + +> **Boost-Platzierung** +> Prominente Platzierung Ihrer Meldung — als Startseiten-Boost (Startseite und Branchenseite) oder als günstigerer Kategorie-Boost (nur Branchenseite). + +| Stufe | 7 Tage | 14 Tage | 30 Tage | +|---|---|---|---| +| Startseiten-Boost | 12 Credits | 20 Credits | 35 Credits | +| Kategorie-Boost (nur Branchenseite) | 6 Credits | 10 Credits | 18 Credits | + +### D.2 Preisseite: Note zur Leistungsbeschreibung (Wortlaut) + +> **Boost — was Sie bekommen und was nicht** +> Geschuldet ist die Platzierung während der gebuchten Laufzeit — beim Startseiten-Boost auf Startseite und Kategorieseite, beim Kategorie-Boost auf der Kategorieseite der jeweiligen Rubrik. Die Zahl gleichzeitiger Boosts je Seite ist begrenzt; sind alle Plätze belegt, ist eine neue Buchung erst möglich, sobald ein Platz frei wird — verkauft wird also nur, was auch sichtbar ist. Eine bestimmte Reichweite oder Zugriffszahl versprechen wir nicht — das wäre unseriös. Buchbar nur für Mitteilungen mit Prüfergebnis Grün. Ist das Portal während eines aktiven Boosts aus von uns zu vertretenden Gründen länger als 60 Minuten am Stück nicht erreichbar, verlängert sich die Boost-Laufzeit entsprechend. + +Zum Vergleich: In den AGB steht der Boost in § 6 Abs. 2 (siehe C). Die AGB nennen nur den Startseiten-Boost (Startseite und Kategorieseite). Den Kategorie-Boost, der nur auf der Branchenseite erscheint, erwähnen sie nicht. + +### D.3 Kennzeichnung auf Startseite und Branchenseite + +> **Hinweis 13.10.2026:** Dieser Abschnitt beschreibt den Live-Stand vom 12.10.2026. Die Fassung, die geprüft werden soll („Gebuchte Platzierung“ mit Erklärung), steht in der Versandfassung, Frage 7, und in den Screenshots der Anlage 7. + +- **Label:** **„Top-Platzierung“**, in der englischen Fassung „Featured“. +- **Wo es erscheint:** an jeder Mitteilung, die einen laufenden Boost hat. Den Startseiten-Boost gibt es höchstens 5-mal gleichzeitig, den Kategorie-Boost höchstens 3-mal je Branche. + - **Startseite:** im oberen Bereich mit dem großen Aufmacher und der Liste daneben. Beim Aufmacher steht das Label als Schild auf dem Bild, in der Liste als kleiner Rahmen hinter der Überschrift. + - **Branchenseite:** beim Aufmacher als Schild auf dem Bild, in der Liste der oberen Meldungen als kleiner Rahmen hinter der Überschrift. +- **Darstellung:** Großbuchstaben in kleiner Schrift (rund 10 px). + - Auf dem Bild: weiß auf der Markenfarbe. + - In der Liste: in der Markenfarbe mit dünnem Rahmen. +- **Aufmacher:** Der Aufmacher trägt immer das Schild „Top-Meldung“, ob gebucht oder nicht. Ist er gebucht, steht „Top-Platzierung“ daneben. +- **Was es sonst nicht gibt:** keinen Hinweis wie „Anzeige“ oder „Gesponsert“ und keine Erklärung, was „Top-Platzierung“ bedeutet (weder als Tooltip noch als Link). +- **Screenshot:** Zum Zeitpunkt des Abrufs lief auf keinem Portal ein Boost, das Label war live also nicht zu sehen. Ein Screenshot ginge nur mit einem Test-Boost auf Live. + +**Frage an den Anwalt** (Anwaltspaket, Abschnitt „Boost-Platzierung“): Reicht „Top-Platzierung“ als Kennzeichnung einer bezahlten Platzierung aus, zum Beispiel nach § 5a Abs. 4 UWG oder § 22 MStV? Oder braucht es einen eindeutigen Hinweis wie „Anzeige“ oder „Gesponsert“? diff --git a/dev/rechtliches/anschreiben-anwalt-2026-10-13.md b/dev/rechtliches/anschreiben-anwalt-2026-10-13.md new file mode 100644 index 00000000..f9c6fa78 --- /dev/null +++ b/dev/rechtliches/anschreiben-anwalt-2026-10-13.md @@ -0,0 +1,62 @@ +# Anschreiben zum Anwaltspaket Datenschutz und Rechtstexte + +**An:** [Kanzlei, Name, Anschrift] +**Von:** adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld, info@pressekonto.com +**Datum:** [Versanddatum] +**Betreff:** pressekonto.com, presseecho.de, businessportal24.com: Prüfung der Datenschutzerklärung 0.4, der AGB 0.7 (Bildrechte) und Fragen zu bestehenden Verarbeitungen + +Sehr geehrte [Anrede], + +seit dem Relaunch unserer Presseportale am 20.07.2026 sind Verarbeitungen hinzugekommen, die unsere Datenschutzerklärung noch nicht oder nur pauschal beschreibt. Einige davon laufen bereits. Wir bitten Sie, die beigefügten Textentwürfe zu prüfen und 14 Fragen zu beantworten. Zu jeder Frage nennen wir unseren Standpunkt. Sie können ihn bestätigen oder mit Begründung verwerfen. + +## Worum wir bitten + +1. Prüfung und Freigabe der Textentwürfe für die Datenschutzerklärung 0.4 (Versandfassung, Abschnitt 4). +2. Antworten auf die Fragen 1 bis 14 (Versandfassung, Abschnitt 5). Jede Zeile hat ein Antwortfeld. +3. Prüfung des Pakets Bildrechte: AGB 0.7 mit § 8a und § 9, Bestätigungstext beim Bild-Upload, Zustimmungsgate und Beweisarchiv mit Interessenabwägung. +4. Einordnung von vier Fragen zur Bearbeitung von Lösch- und Änderungsanfragen (Frage 12). +5. Entwurf eines Syndikationsvertrags nach der Gliederung in Anlage 5 (Frage 14). + +**Zeitlicher Vorrang:** Frage 14 (Syndikationsvertrag, vorrangig §§ 2 bis 5) brauchen wir vor einem Partnertermin im Oktober. Danach Fragen 1 bis 3, weil davon die Veröffentlichung der neuen Fassungen abhängt. Die mit „später“ markierten Fragen betreffen Funktionen, die ausgeschaltet sind und es bleiben, bis sie gesondert geprüft sind. + +## Lesereihenfolge + +1. **Versandfassung** (`anwaltspaket-datenschutz-2026-10-12.md`): Sachverhalt, Textentwürfe und Fragen. Sie trennt durchgehend zwischen dem, was heute produktiv läuft, und dem, was beschlossen, aber noch nicht umgesetzt ist. Diese Stellen sind mit *(Ziel)* markiert und werden erst veröffentlicht, wenn sie umgesetzt sind. +2. **Klärungsdokument** (Anlage 4): Begründungen zu unseren Standpunkten. +3. **Weitere Anlagen** nach Bedarf. + +## Anlagen + +| Nr. | Inhalt | Datei | +|---|---|---| +| 1 | Decision-Update Bildrechte und Beweisarchiv vom 22.09.2026, Abschnitte 3, 4, 7, 8 und 12 | `Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md` | +| 2 | Interessenabwägung Beweisarchiv, Fassung 13.10.2026 | `interessenabwaegung-beweisarchiv-2026-10-12.md` | +| 3 | Rechtstexte im Live-Stand: DSE 0.3 (Hub und Portale), AGB 0.6, Boost-Texte | `anlage-rechtstexte-live-2026-10-12.md` | +| 4 | Klärungsdokument mit Begründungen, Erstattungsklausel und Bestätigungsrollen | `klaerung-anwaltspaket-2026-10-12.md` | +| 5 | Gliederung Syndikationsvertrag | Anlage 4, Abschnitt 8 | +| 6 | Kontext zu Lösch- und Änderungsanfragen | `handover_loesch-anfragen.md` | +| 7 | Screenshots und Belege | siehe unten | + +**Anlage 7 im Einzelnen:** + +- Boost-Kennzeichnung (zu Frage 7): `boost-01-startseite-desktop.png`, `boost-02-branchenseite-desktop.png`, `boost-03-startseite-mobil.png`, `boost-04-tooltip.png` +- Bild-Upload und Bildnachweis (zu D1, Fragen 1, 3 und 6): `ui-01-upload-rechtebestaetigung.png`, `ui-02-upload-ki-angabe.png`, `ui-03-bild-nachweiszeile.png`, `ui-04-bild-detailfenster.png` +- Kontosicherheit (zu D3): `ui-05-konto-sicherheit.png` +- Zustimmung zu AGB und Richtlinien (zu Frage 2): `ui-06-zustimmungsgate-dev.png` (Entwicklungsumgebung, auf Live noch ausgeschaltet), `ui-06b-buchung-agb-annahme.png` (Annahme beim Kauf, live) +- KI-Hinweis bei Texten (zu Frage 6): `ui-07-ki-hinweis-text.png` +- Berechtigungen (zu D3): `bn-02-berechtigungen-2026-10-13.md` +- Dienstleisterverträge (zu D2 bis D6 und zur Inhaltsprüfung): `bn-06-vertraege.md` als Übersicht; `avv-hetzner.pdf`, `avv-all-inkl.pdf`, `cloudflare-dpa.pdf`, `cloudflare-dpf-2026-10-13-1.png`, `cloudflare-dpf-2026-10-13-2.png`, `openai-dpa.pdf`, `openai-zdr.pdf`, `openai-endpoints.md`, `stripe-dpa.pdf` +- Relaunch-Mails vom Juli 2026 (zu Abschnitt 6 und Frage „später“ zum Newsletter): `juli-mail-abonnenten.md`, `juli-mail-aktive-konten.md`, `juli-mail-versand.md` + +## Hinweise + +- Die Verträge mit Hetzner, ALL-INKL und OpenAI bestehen seit vor dem Relaunch. Die beigefügten Exemplare sind Neuausfertigungen bzw. Downloads vom 13.10.2026 und tragen deshalb dieses Datum. +- Zero Data Retention ist für unser OpenAI-Konto derzeit nicht beantragbar. Der Entwurf zur automatisierten Inhaltsprüfung beschreibt deshalb die Standardbehandlung der Programmierschnittstelle. +- Alle Angaben zum technischen Ist-Stand beruhen auf einem Abgleich mit dem Programmcode und der Live-Konfiguration vom 12. und 13.10.2026. + +Ihre Antworten tragen Sie bitte direkt in die Antwortspalte von Abschnitt 5 ein; formlos per E-Mail genügt ebenso. Für Rückfragen erreichen Sie mich unter info@pressekonto.com. + +Mit freundlichen Grüßen + +Kevin Adametz +adametz.media diff --git a/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md b/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md new file mode 100644 index 00000000..148b05ac --- /dev/null +++ b/dev/rechtliches/anwaltspaket-datenschutz-2026-10-12.md @@ -0,0 +1,322 @@ +# Anwaltspaket Datenschutz und Rechtstexte — Versandfassung + +**Stand:** 13.10.2026 · ersetzt den Entwurf vom 09.10.2026; berücksichtigt die Codeabgleiche vom 12. und 13.10.2026 (Ist und Ziel getrennt) +**Verantwortlicher / Anbieter:** adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld, info@pressekonto.com +**Angebot:** pressekonto.com (Kundenbereich, „Hub“), presseecho.de und businessportal24.com (Portale) +**Bezug:** Datenschutzerklärung (DSE) 0.3 vom 03.07.2026 mit Ergänzungen 5a (21.09.) und 6a (09.10.); AGB 0.6; Veröffentlichungsrichtlinien 0.2; Release v1.8.0 + +Einordnungen in diesem Dokument sind technische Beschreibungen und Vorschläge des Betreibers, keine Rechtsberatung. Jede Frage nennt unseren Standpunkt („Default“), damit Sie bestätigen oder widersprechen können. Hinter jeder Frage steht ein Antwortfeld. + +--- + +## 1. Anliegen + +Seit dem Relaunch im Juli 2026 sind Verarbeitungen hinzugekommen, die die DSE noch nicht oder nur pauschal beschreibt. Einige laufen produktiv. Wir bitten um: + +1. Prüfung und Freigabe der Textentwürfe für die DSE 0.4 (Abschnitt 4), +2. Antwort auf die Fragen in Abschnitt 5, +3. Prüfung des Pakets Bildrechte (AGB 0.7 mit § 8a und § 9, Bestätigungstext, Zustimmungsgate, Beweisarchiv mit Interessenabwägung) in derselben Sitzung, +4. Antwort auf vier Fragen zur Bearbeitung von Lösch- und Änderungsanfragen (Abschnitt 5, Nr. 12), +5. Entwurf oder Prüfung eines Syndikationsvertrags nach der Gliederung in Anlage 5. + +Drei Verarbeitungen, die im Entwurf vom 09.10. enthalten waren, haben wir aus diesem Paket herausgenommen und als spätere Aktivierungen markiert: Webanalyse im Kundenbereich mit Nutzerkennung, KI-Vorabprüfung von Bildern, Newsletter. Sie sind ausgeschaltet und bleiben es, bis sie eigenständig geprüft sind. Die dazugehörigen Fragen stehen am Ende von Abschnitt 5 als „später“. + +**Aufbau der DSE:** Eine Datei mit zwei Ausprägungen. Auf dem Hub erscheinen zusätzlich Kundenkonto, Anmeldelink und Stripe (Abschnitte 7 bis 9), auf den Portalen stattdessen Änderungslinks, Medienprivileg und Newsroom. Die Nummerierung unterscheidet sich ab Abschnitt 7; die Entwürfe in Abschnitt 4 nennen deshalb die Ausprägung und verweisen auf Abschnittstitel, nicht auf Nummern. Die Live-Texte beider Ausprägungen liegen als Anlage 3 bei. + +--- + +## 2. Übersicht der Verarbeitungen + +„Aktiv“ heißt: läuft produktiv. „Ziel“ heißt: beschlossen, im Code vorhanden oder beauftragt, produktiver Nachweis steht aus; die DSE 0.4 wird erst veröffentlicht, wenn die Zielfristen tatsächlich laufen. + +| Nr. | Verarbeitung | Status | Rechtsgrundlage (Default) | Frist (beschlossen) | +|---|---|---|---|---| +| D1 | Bild-Originale, Rechtebestätigung, Beweisarchiv | aktiv seit 28.09.2026 | Art. 6 Abs. 1 lit. f; Art. 9 Abs. 2 lit. f für sensible Bildinhalte; Art. 17 Abs. 3 lit. e im Einzelfall | Archiv drei Jahre nach Jahresende der Entfernung; Zugriffsprotokoll 395 Tage (Ziel; heute ohne Löschfrist) | +| D2 | Fehlerprotokoll (GlitchTip, selbst gehostet) | aktiv seit 05.10.2026 | lit. f; browserseitig § 25 Abs. 2 Nr. 2 TDDDG | 90 Tage | +| D3 | Anmeldesicherheit | aktiv, zuletzt erweitert 08.10.2026 | lit. b und f | Anmeldeereignisse 90 Tage; letzte Anmelde-IP 90 Tage nach letzter Anmeldung (Ziel) | +| D4 | E-Mail-Zustellung: Rückläufer, Sperrliste, Abmeldung | aktiv seit 15.09.2026 | lit. f; bei Abmeldungen zusätzlich lit. c i. V. m. Art. 21 Abs. 3 | Rohmails 90 Tage (Ziel), Datensätze 395 Tage, Sperrliste zweckgebunden | +| D5 | Aktivitätsverlauf und API-Zugriffsprotokoll | aktiv seit Juli 2026 | lit. f, API zusätzlich lit. b | 90 / 395 Tage je Ereignisart (Ziel), API 90 Tage | +| D6 | Cloudflare Turnstile | aktiv seit 09.10.2026 | lit. f; § 25 Abs. 2 Nr. 2 TDDDG; Art. 45 (DPF) | keine eigene Speicherung | +| D9 | IP-Adressen in Vorgangsdaten | aktiv seit Juli 2026, Frist Ziel | lit. f | IP nach 90 Tagen entfernt; Vorgang nach eigener Frist | +| D7 | Webanalyse im Kundenbereich mit Nutzerkennung | **ausgeschaltet, zurückgestellt** | — | — | +| D8 | KI-Vorabprüfung von Bildern | **ausgeschaltet, zurückgestellt** | — | — | +| D10 | Newsletter an Kontoinhaber | **Versand gesperrt, zurückgestellt** | — | — | + +--- + +## 3. Sachverhalt je Verarbeitung + +### D1 — Bild-Originale, Rechtebestätigung, Beweisarchiv + +Ausführlich in Anlage 1 (Decision-Update Bildrechte, Abschnitte 3 und 4) und Anlage 2 (Interessenabwägung). Gegenüber dem Decision-Update gilt der folgende, mit Code und Abwägung abgeglichene Stand: + +**Rechtebestätigung je Bild-Upload:** Zeitpunkt, bestätigter Wortlaut mit Fassung, AGB-Fassung, Konto bzw. API-Zugang, Firma, Rolle des Erklärenden (Kontoinhaber oder Partner-API; Ziel, heute nur Kanal: Formular, API, Magic-Link), Übermittlungsweg, SHA-256 der Datei, Angaben zu Bildnachweis und KI, mit geheimem Schlüssel gebildeter Prüfwert der IP-Adresse (HMAC), Browserkennung auf 250 Zeichen gekürzt. + +**Archivdatensatz bei Entfernung, Ersetzung oder Änderung eines veröffentlichten Inhalts:** zuletzt veröffentlichter Stand einschließlich der genannten Pressekontakte (Name, E-Mail, Telefon); Einreicher (Konto, Name, E-Mail, Firma); zu Bildern: Originaldatei mit Metadaten, veröffentlichte Fassung mit Nachweis und Kennzeichnung, Herkunftsauswertung, Rechtebestätigung; Zeitpunkte von Veröffentlichung und Entfernung; Grund als Kategorie; bei Änderungen vorheriger und neuer Stand; Bezug zum zugrunde liegenden Melde- oder Löschverfahren. + +**Ist und Ziel beim Archivdatensatz:** Heute schreibt das Archiv aus dem Meldevorgang auch die E-Mail-Adresse des Antragstellers mit, und Firma und Einreicher werden zum Zeitpunkt der Archivierung aus dem Konto gelesen, nicht zum Zeitpunkt der Einreichung. Beschlossenes Ziel: Das Archiv erhält nur die Vorgangsnummer, die Antragstellerdaten bleiben im Meldevorgang (drei Jahre); für neue Einreichungen wird ein unveränderlicher Nachweis der Einreicherdaten zum Einreichungszeitpunkt erzeugt; Altbestand wird als „bei Archivierung erfasst“ gekennzeichnet. Bereits versiegelte Archivpakete mit Antragsteller-E-Mails werden nicht stillschweigend verändert; dafür wird ein Inventar erstellt und eine Migrationsentscheidung getroffen (Frage 3). + +**Wer die Rechte bestätigt:** Es bestätigt, wer vertraglich gebunden ist; der Betreiber bestätigt nie. Hub-Formular und API mit eigenem Konto: der Kontoinhaber. API über Verteiler oder Agentur: der Partner (§ 8a Abs. 1 Satz 2, Syndikationsvertrag). Lädt der Betreiber ein Bild für einen Kunden hoch, wird es erst nach Bestätigung des Kontoinhabers per Magic-Link veröffentlicht. Für syndizierte Meldungen ohne Konto gibt es keinen Betreiber-Upload; ein Bild-Upload im Self-Service setzt ein Kundenkonto voraus, mit dem der Hochladende AGB und Unternehmerbestätigung annimmt und gebunden ist. Kontaktdaten können Pressekontakte weiterhin ohne Konto ändern. Das Bestätigungsprotokoll speichert heute Konto, Tokenkennung und Kanal (Formular, API, Magic-Link); die Rolle des Erklärenden als eigenes Feld ist Ziel. + +**Zugriff:** Originaldateien aktiver Bilder: berechtigte Redaktion. Archivierte Inhalte: Administratoren mit Compliance-Berechtigung. Jeder Abruf archivierter Inhalte und jede Änderung einer Aufbewahrungssperre wird mit Zweck protokolliert (Administrator mit Name und E-Mail-Adresse, Zeitpunkt, Art des Zugriffs, Zweck). Heute ist das Protokoll unveränderlich und wird nicht gelöscht; Ziel: Löschung nach 395 Tagen. + +**Fristen:** Drei Jahre nach Ende des Jahres der Entfernung, für alle Ereignistypen (Begründung je Typ in Anlage 2). Aufbewahrungssperre (Legal Hold) nur mit Pflichtvermerk und Prüfdatum (spätestens 90 Tage); nach Aufhebung kein Neustart der Frist, sondern Löschung zum regulären Zeitpunkt oder ein neues, begründetes Enddatum (Ziel; heute setzt der Code die Frist nach Aufhebung neu). Eine Einschränkung der Verarbeitung nach Art. 18 wird getrennt von der Sperre gespeichert und sperrt den normalen Abruf (Ziel). Nach Löschung bleiben nur Kennung, Objektschlüssel, Ereignisart, Zeitpunkte und Prüfsumme als Löschbeleg (Ziel; heute bleiben auch Akteur, Vermerke und Vorgangsverweise). Sicherungen 14 Tage; nach einer Wiederherstellung werden gelöschte Einträge anhand eines getrennt gesicherten Löschstands erneut entfernt (Verfahren vorhanden, Übung vor Veröffentlichung der 0.4). + +**Nie veröffentlichte Inhalte:** Vom Kunden gelöschte oder ersetzte Bilder und Entwürfe sofort gelöscht. Unbearbeitete Entwürfe 180 Tage nach letzter Änderung vollständig gelöscht (Ziel; heute werden nur die Bilder gelöscht und der Datensatz archiviert). Abgelehnte, nie veröffentlichte Einreichungen: Text und Bilder nach 180 Tagen gelöscht, ein minimaler Ablehnungsnachweis (Status, Zeitpunkt, Kategorie, Konto) drei Jahre nach Jahresende (Ziel). Bearbeitungsstände von Korrekturen 30 Tage. + +### D2 — Fehlerprotokoll (GlitchTip) + +Tritt im Server oder im Browser ein technischer Fehler auf, geht ein Fehlerbericht an eine selbst gehostete GlitchTip-Instanz (errors.adametz.media) auf einem Server der Hetzner Online GmbH im Rechenzentrum Falkenstein. + +- **Inhalt:** Fehlermeldung und Programmstelle, aufgerufene Adresse und Herkunftsseite (Abfrageparameter bis auf eine Freigabeliste entfernt, Token und Signaturen ersetzt), Browser und Betriebssystem, Softwarestand, bei angemeldeten Nutzern nur die interne Nutzer-ID. +- **Nicht in den Bericht aufgenommen:** IP-Adresse, Cookies, Formulareingaben, Inhalte von Anfragen; E-Mail-Adressen in Fehlertexten werden ersetzt. Eine vollständige Freiheit von personenbezogenen Angaben in technischen Freitexten kann nicht garantiert werden; die Bereinigung wird vor 0.4 nachgeschärft (freigegebene Abfrageparameter, keine Objektinhalte als Fehlertext). +- **Browser:** Die Fehlerbibliothek lädt erst beim ersten Fehler, ohne Cookies, ohne Sitzungsverfolgung; der Bericht geht direkt an den Fehlerserver. Dessen Webserver sieht dabei die Verbindungsdaten des Browsers (IP); diese Logs werden wie alle Server-Logs nach 14 Tagen gelöscht. +- **Frist:** 90 Tage (Einstellung der Instanz, wird belegt). + +### D3 — Anmeldesicherheit + +- **Fehlgeschlagene Anmeldungen mit unbekannter Adresse:** Tageszähler je Einstieg und Quelle; Quelle als gekürzter HMAC der IP-Adresse; 90 Tage. +- **Fehlgeschlagene Anmeldungen und Sperren bekannter Konten:** Eintrag im Aktivitätsverlauf mit gekürztem IP-HMAC; 90 Tage (Ziel; heute 395). +- **Erfolgreiche Anmeldungen:** Eintrag mit Anmeldeweg, ohne IP; 90 Tage (Ziel). +- **Begrenzung von Anmeldeversuchen:** Zähler je IP-Adresse (15 Minuten, Sperre ab 20 Versuchen) und je Kombination aus E-Mail-Adresse und IP-Adresse (1 Minute, höchstens 5) in einem kurzlebigen Zwischenspeicher (Redis); Einträge verfallen automatisch. +- **Letzte Anmeldung:** Zeitpunkt und IP-Adresse der letzten Anmeldung am Konto, für den Kontoinhaber auf der Sicherheitsseite sichtbar; bei jeder Anmeldung überschrieben; Löschung 90 Tage nach der letzten Anmeldung (Ziel). +- **Zwei-Faktor-Authentifizierung:** verschlüsseltes Geheimnis und Wiederherstellungscodes am Konto. +- **Passkeys:** öffentlicher Schlüssel, technische Kennungen des Authentifikators, vom Nutzer vergebener Name, Zeitpunkt der letzten Nutzung. +- **Anmeldung mit Google:** Google übermittelt Name, E-Mail-Adresse und Google-Kennung; gespeichert wird die Kennung. Google Ireland Ltd.; Übermittlung an Google LLC (USA) möglich, DPF. +- **Abmeldung anderer Geräte:** nur ein Zeitstempel am Konto. +- **Administratoren:** Bestand laut Datenbank (Stand 07.10.2026): ein aktives Betriebskonto mit Admin-Rolle und Passkey, ein aktives Altkonto mit Admin-Rolle (letzte Anmeldung 2012), ein aktives Altkonto mit Super-Admin-Merker und importierten, nie benutzten API-Schlüsseln, drei gesperrte Altkonten mit Admin-Rolle, keine Editoren. Die Altkonten haben alle Rechte, Schlüssel und Sitzungen verloren und sind gesperrt oder gelöscht. Zweiter Faktor für Admins ist Pflicht. Stand 13.10.2026 nach der Bereinigung: ein Konto mit Zugang zum Admin-Bereich, mit Passkey und Authenticator-App; keine Editoren; Zugänge zu Server und Hosting nur beim Inhaber (Anlage 7, BN-02). + +### D4 — E-Mail-Zustellung + +- **Rückläufer:** Unzustellbarkeitsmeldungen werden aus einem Postfach bei ALL-INKL abgeholt und ausgewertet: Empfängeradresse, Art und Text der Meldung, interne Referenz der auslösenden Mail. Datensätze 395 Tage. Die abgeholten Rohmails bleiben heute in Postfachordnern; Ziel: Löschung nach 90 Tagen in allen Ordnern. +- **Sperrliste:** Adressen, die dauerhaft unzustellbar sind oder sich abgemeldet haben, erhalten keine Benachrichtigungen mehr. Selbst angeforderte Anmeldelinks sind von der Abmeldesperre ausgenommen; Hard-Bounce-Sperren bleiben immer wirksam. Bestätigungslinks aus dem Meldeverfahren sind heute nicht ausgenommen (Ziel: ausdrücklich angeforderte Bestätigungen als eigene, getestete Versandregel zulassen). Entsperrung auf Anfrage. Die Liste ist unbefristet, solange sie ihren Zweck erfüllt. +- **Link-Datensätze:** Anmelde- und Änderungslinks sind 15 Minuten gültig, Meldebestätigungslinks 72 Stunden; die Datensätze (einschließlich IP) werden im täglichen Lauf gelöscht, sobald Verbrauch oder Ablauf mehr als 30 Tage zurückliegen. +- **Abmeldung:** Jede Benachrichtigung enthält einen Abmeldelink (auch Ein-Klick-Abmeldung im Mailprogramm). Empfänger ohne Konto (Pressekontakte) werden als Eintrag in der Sperrliste geführt. + +### D5 — Aktivitätsverlauf und API-Zugriffsprotokoll + +- **Aktivitätsverlauf** (nur Administratoren): Registrierungen, Anmeldungen mit Anmeldeweg, Statuswechsel von Mitteilungen, eingehende Anfragen, Mailversand mit Empfängeradresse und Betreff (auch an Pressekontakte ohne Konto; rund zwei Drittel der Mail-Einträge), Administratorhandlungen. Namen und E-Mail-Adressen im Klartext. Zweck: Nachvollziehbarkeit, Missbrauchserkennung, Support. Fristen je Ereignisart: Anmeldeereignisse 90 Tage, übrige 395 Tage (Ziel; heute 395 einheitlich, Löschlauf seit v1.8 vorhanden). +- **API-Zugriffsprotokoll:** je Anfrage Konto, Kennung des Token-Datensatzes (nicht der Schlüssel), Methode, Pfad, Statuscode, Dauer, IP-Adresse, Programmkennung. Zweck: Betrieb, Missbrauchserkennung, Nutzungsnachweis. 90 Tage (Löschlauf vorhanden). + +### D6 — Cloudflare Turnstile + +Im Kontaktformular und bei der Registrierung; Ausweitung auf Melde-, Widerrufs- und Kündigungsformular geplant. Ergänzend zum Live-Text 6a: Unser Server übermittelt bei der Prüfung die IP-Adresse des Nutzers an Cloudflare (`remoteip`). Ist Cloudflare nicht erreichbar, wird die Eingabe angenommen und intern markiert. Cloudflare-DPA über die Standardbedingungen (mit SCCs); DPF-Zertifizierung von Cloudflare, Inc. am 13.10.2026 geprüft: „Active – Re-certification under Review“, nächste Rezertifizierung fällig 15.09.2027 (Anlage 7). + +### D9 — IP-Adressen in Vorgangsdaten + +Bei Kontaktanfragen, Meldungen, Widerrufen, Kündigungen und Buchungsbestätigungen wird die IP-Adresse des Absenders im Klartext gespeichert, bisher ohne Frist. Zweck: Missbrauchsabwehr und Nachweis des Eingangs. Ziel: IP-Adresse nach 90 Tagen entfernen (eigener Löschlauf inklusive Altbestand, mit dokumentierter Einzelfallverlängerung bei einem konkreten Vorfall); der Vorgang selbst folgt seiner fachlichen Frist. Der DSE-Absatz wird erst veröffentlicht, wenn der Lauf produktiv ist. + +### Zurückgestellt: D7, D8, D10 + +- **D7 Webanalyse im Kundenbereich:** Umami läuft cookielos auf den öffentlichen Seiten. Eine Ausweitung auf den Kundenbereich mit pseudonymer Nutzerkennung ist ausgeschaltet. Aktivierungsbedingungen: Kennung als HMAC, Widerspruchsschalter im Konto, eigener DSE-Absatz. +- **D8 KI-Vorabprüfung von Bildern:** Code vorhanden, Funktion ausgeschaltet. Vorgesehen: Bild verkleinert (1024 px), ohne Metadaten und ohne Kontobezug an OpenAI, Sichtung auf offensichtliche Probleme (Wasserzeichen von Bildagenturen, unzulässige Inhalte, Person erkennbar ja/nein ohne Identifizierung). OpenAI Ireland Ltd. mit DPA; ohne Zero Data Retention (siehe Abschnitt „Automatisierte Inhaltsprüfung“). +- **D10 Newsletter:** Kampagnenmodul vorhanden, Versand technisch gesperrt. Das Modul wurde im Juli 2026 einmalig für die beiden Relaunch-Mails an Bestandskonten genutzt (Abschnitt 6); seitdem ist der Versand gesperrt. Vorgesehen: nur mit ausdrücklicher Einwilligung (Schalter im Konto, Standard aus, Bestätigung per E-Mail, Protokoll mit Textfassung und Zeitpunkt). Kein Rückgriff auf § 7 Abs. 3 UWG für die 66.368 übernommenen Altkonten (über 99 Prozent Gratiskonten, Nachweis einer Belehrung bei Erhebung nicht führbar). + +### Automatisierte Inhaltsprüfung (bestehender Abschnitt 10/8, Korrektur) + +Die DSE nennt OpenAI, Google Gemini und Anthropic Claude. Angebunden ist nur OpenAI; Gemini und Anthropic werden nicht genutzt. Fassung 0.4 nennt nur OpenAI. Das Data Processing Addendum mit OpenAI Ireland Ltd. besteht seit vor dem Go-Live; Anlage 7 enthält eine Neuausfertigung vom 13.10.2026. Zero Data Retention ist für das Konto derzeit nicht beantragbar; OpenAI kündigt sie für neuere Modelle an (Anlage 7). Es gilt daher die Standardbehandlung der API: kein Training mit den Inhalten, Speicherung bis zu 30 Tage zur Missbrauchserkennung. Die Anwendung nutzt `api.openai.com` ohne EU-Datenresidenz (`chat/completions`, `gpt-5.4-mini`); Übermittlungen außerhalb des EWR stützt das DPA auf Standardvertragsklauseln oder einen Angemessenheitsbeschluss (Ziff. 4). Der Textentwurf in Abschnitt 4 ist entsprechend gefasst. + +--- + +## 4. Textentwürfe für die DSE 0.4 + +Stil und Aufbau wie die bestehende DSE. Einordnung: „Hub“ nur auf pressekonto.com, „Portale“ nur auf presseecho.de und businessportal24.com, sonst beide. Platzhalter in eckigen Klammern. Textstellen, die eine noch nicht produktive Frist versprechen, sind mit *(Ziel)* markiert und werden erst mit dem Löschlauf veröffentlicht. + +### 3a. Fehlerprotokoll (beide, neu nach „Hosting und Server-Logs“) + +> Um technische Fehler schnell zu erkennen und zu beheben, übermitteln unsere Server und, nur wenn in Ihrem Browser ein Fehler auftritt, Ihr Browser einen Fehlerbericht an eine von uns selbst betriebene Fehlerdatenbank (GlitchTip) auf einem Server der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, im Rechenzentrum Falkenstein (Deutschland). +> +> Dabei werden insbesondere verarbeitet: +> - Fehlermeldung, betroffene Programmstelle und Zeitpunkt, +> - die aufgerufene Seite und die Herkunftsseite, bereinigt um Zugangs- und Bestätigungscodes, +> - Browser, Betriebssystem und Softwarestand, +> - wenn Sie angemeldet sind, Ihre interne Kundennummer. +> +> IP-Adressen, Cookies, Formulareingaben und Inhalte von Anfragen werden nicht in den Fehlerbericht aufgenommen; E-Mail-Adressen in Fehlertexten werden vor der Übermittlung ersetzt. Technische Freitexte eines Fehlers können im Einzelfall weitere Angaben enthalten; wir werten Fehlerberichte ausschließlich zur Fehlerbehebung aus. Im Browser wird die Fehlerkomponente erst beim Auftreten eines Fehlers geladen und setzt keine Cookies. Übermittelt Ihr Browser einen Bericht, sieht der Fehlerserver wie jeder Webserver die Verbindungsdaten Ihres Browsers; dafür gelten die Fristen aus dem Abschnitt „Hosting und Server-Logs“. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt im sicheren und fehlerfreien Betrieb unseres Angebots. Soweit dabei Informationen aus Ihrem Endgerät ausgelesen werden, ist Rechtsgrundlage § 25 Abs. 2 Nr. 2 TDDDG. Fehlerberichte werden nach 90 Tagen gelöscht. + +### 7a. Anmeldung und Kontosicherheit (Hub, neu nach „Kundenkonto und Registrierung“) + +> Zum Schutz Ihres Kontos verarbeiten wir bei der Anmeldung folgende Daten: +> - Zeitpunkt und IP-Adresse Ihrer letzten Anmeldung; beides sehen Sie auf der Seite „Konto-Sicherheit“, damit Ihnen fremde Anmeldungen auffallen. Die Angabe wird bei jeder Anmeldung überschrieben und 90 Tage nach Ihrer letzten Anmeldung gelöscht *(Ziel)*. +> - Ihre Anmeldungen mit Zeitpunkt und Anmeldeweg (Passwort, Magic-Link, Google, Passkey) sowie fehlgeschlagene Anmeldeversuche und Sperren Ihres Kontos in unserem internen Aktivitätsverlauf. Bei fehlgeschlagenen Versuchen wird die IP-Adresse nur als gekürzter, mit einem geheimen Schlüssel gebildeter Prüfwert gespeichert. Diese Einträge löschen wir nach 90 Tagen *(Ziel)*. +> - Anmeldeversuche mit Adressen, zu denen kein Konto besteht, zählen wir nur als Tagessumme je Quelle (als gekürzter Prüfwert der IP-Adresse), gelöscht nach 90 Tagen. +> - Zur Begrenzung von Anmeldeversuchen zählen wir Fehlversuche je IP-Adresse (15 Minuten) und je Kombination aus E-Mail-Adresse und IP-Adresse (1 Minute) in einem kurzlebigen Zwischenspeicher; die Einträge verfallen danach automatisch. +> +> Wenn Sie die Zwei-Faktor-Authentifizierung einrichten, speichern wir das Geheimnis Ihrer Authenticator-App und Ihre Wiederherstellungscodes verschlüsselt. Wenn Sie einen Passkey anlegen, speichern wir dessen öffentlichen Schlüssel, technische Kennungen des Authentifikators, den von Ihnen vergebenen Namen und den Zeitpunkt der letzten Nutzung; Ihr privater Schlüssel und biometrische Merkmale verlassen Ihr Gerät nicht. Über Hinzufügen und Entfernen eines Passkeys informieren wir Sie per E-Mail. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Bereitstellung eines sicheren Kundenkontos) und Art. 6 Abs. 1 lit. f DSGVO (Schutz vor unbefugten Zugriffen). Zwei-Faktor-Daten und Passkeys löschen wir, wenn Sie sie entfernen, spätestens mit Ihrem Konto. +> +> **Anmeldung mit Google.** Wenn Sie „Mit Google anmelden“ wählen, übermittelt uns Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland, Ihren Namen, Ihre E-Mail-Adresse und eine Google-Kennung; die Kennung speichern wir an Ihrem Konto, um Sie bei der nächsten Anmeldung zuzuordnen. Für die Anmeldung bei Google gilt dessen Datenschutzerklärung. Eine Übermittlung an Google LLC in den USA ist möglich; Google LLC ist unter dem EU-US Data Privacy Framework zertifiziert (Art. 45 DSGVO). Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO. + +### 7b. Aktivitätsverlauf und Programmierschnittstelle (Hub, neu) + +> Für die Nachvollziehbarkeit von Vorgängen, die Missbrauchserkennung und den Support führen wir einen internen Aktivitätsverlauf, auf den nur Administratoren Zugriff haben. Er enthält insbesondere Registrierungen, Statuswechsel von Pressemitteilungen, eingegangene Anfragen, versandte Benachrichtigungen mit Empfängeradresse und Betreff sowie Handlungen von Administratoren. Diese Einträge löschen wir nach 395 Tagen; Anmeldeereignisse nach 90 Tagen (Abschnitt „Anmeldung und Kontosicherheit“). +> +> Wenn Sie unsere Programmierschnittstelle (API) nutzen, protokollieren wir je Anfrage Ihr Konto und die Kennung des verwendeten Zugangsschlüssels (nicht den Schlüssel selbst), die aufgerufene Funktion, das Ergebnis, die Dauer sowie IP-Adresse und Programmkennung. Das Protokoll dient dem Betrieb, der Missbrauchserkennung und dem Nachweis der Nutzung und wird nach 90 Tagen gelöscht. +> +> Rechtsgrundlage ist jeweils Art. 6 Abs. 1 lit. f DSGVO; bei der API-Nutzung zusätzlich Art. 6 Abs. 1 lit. b DSGVO. + +### 12a. Zustellbarkeit und Abmeldung (beide, Ergänzung zu „E-Mail-Versand“) + +> Erhalten wir eine Meldung, dass eine E-Mail nicht zugestellt werden konnte, werten wir sie automatisch aus und speichern die Empfängeradresse, die Art und den Text der Meldung sowie eine interne Referenz der betroffenen E-Mail. Adressen, die dauerhaft nicht erreichbar sind, nehmen wir in eine Sperrliste auf. +> +> Jede Benachrichtigung enthält einen Link zur Abmeldung; Ihr Mailprogramm kann die Abmeldung auch direkt auslösen. Haben Sie kein Kundenkonto, zum Beispiel als in einer Pressemitteilung genannter Pressekontakt, speichern wir Ihre Abmeldung in derselben Sperrliste. An gesperrte Adressen senden wir keine Benachrichtigungen mehr; von Ihnen selbst angeforderte Anmeldelinks bleiben möglich. Eine Entsperrung erfolgt auf Ihre Anfrage an info@pressekonto.com. *(Ziel: „Anmeldelinks und von Ihnen angeforderte Bestätigungslinks“, sobald die Versandregel umgesetzt ist.)* +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt in der zuverlässigen Zustellung und darin, keine unerwünschten oder unzustellbaren E-Mails zu versenden. Bei Abmeldungen ist die Speicherung zudem erforderlich, um Ihren Widerspruch dauerhaft zu beachten (Art. 6 Abs. 1 lit. c in Verbindung mit Art. 21 Abs. 3 DSGVO). Die abgerufenen Zustellmeldungen löschen wir aus dem Postfach nach 90 Tagen *(Ziel)*, die ausgewerteten Datensätze nach 395 Tagen; Einträge der Sperrliste bleiben bestehen, solange sie für diesen Zweck erforderlich sind. + +### 6. Kontaktaufnahme (beide, Ergänzung) *(Ziel)* + +> Zum Schutz vor Missbrauch und zum Nachweis des Eingangs speichern wir bei Kontaktanfragen, Meldungen, Widerrufen, Kündigungen und Buchungsbestätigungen über unsere Formulare die IP-Adresse, von der die Anfrage gesendet wurde, und entfernen sie nach 90 Tagen. Kontaktanfragen löschen wir 180 Tage nach Abschluss; Anfragen mit Vertrags- oder Rechtsbezug speichern wir, solange es zur Bearbeitung und Dokumentation des Vorgangs erforderlich ist (Abschnitt „Speicherdauer“). + +### 6a. Turnstile (beide, drei Ergänzungen) + +> … setzen wir im Kontaktformular, bei der Registrierung und in weiteren Formularen, die Missbrauch auslösen können (zum Beispiel Melde-, Widerrufs- und Kündigungsformular), den Dienst Turnstile ein. … +> +> Bei der Prüfung übermittelt auch unser Server die IP-Adresse, von der das Formular gesendet wurde, an Cloudflare, damit das Ergebnis der Prüfung dieser Anfrage zugeordnet werden kann. Ist der Dienst nicht erreichbar, nehmen wir die Eingabe an und prüfen sie intern auf Missbrauch. + +### 10 (Hub) / 8 (Portale). Automatisierte Inhaltsprüfung (Änderung der Anbieterliste) + +> Für die automatisierte Analyse nutzen wir die Programmierschnittstelle von OpenAI Ireland Ltd., 1st Floor, The Liffey Trust Centre, 117–126 Sheriff Street Upper, Dublin 1, Irland. Mit OpenAI besteht ein Vertrag zur Auftragsverarbeitung. Nach Angaben von OpenAI werden über die Programmierschnittstelle übermittelte Inhalte nicht zum Training von Modellen verwendet und zur Erkennung von Missbrauch bis zu 30 Tage gespeichert. Eine Verarbeitung in den USA ist möglich; sie erfolgt auf Grundlage von EU-Standardvertragsklauseln. Setzen wir künftig weitere Anbieter ein, nennen wir sie hier. + +### 7 (Portale). Änderungslinks (Änderung) + +> … Die konkrete Gültigkeitsdauer wird systemseitig festgelegt und beträgt derzeit 15 Minuten für Zugangslinks zur Verwaltung einer Mitteilung oder eines Newsrooms und 72 Stunden für den Bestätigungslink, den Sie nach einer Meldung über „Mitteilung melden“ erhalten. + +### Bilder in Pressemitteilungen (beide, neu nach „Automatisierte Inhaltsprüfung“) + +> **Bilder in Pressemitteilungen: Originaldateien, Herkunftsprüfung und Rechtebestätigung** +> +> Wer ein Bild zu einer Pressemitteilung hochlädt, bestätigt dabei, zur Veröffentlichung berechtigt zu sein, und macht Angaben zum Bildnachweis und zum Einsatz von KI. Zu jedem veröffentlichten Bild speichern wir: +> +> - die hochgeladene Originaldatei einschließlich der darin enthaltenen Metadaten (zum Beispiel Kameradaten, Urheberangaben, Herkunftsdaten wie Content Credentials), +> - die veröffentlichte Fassung des Bildes mit dem angezeigten Bildnachweis und der angezeigten KI-Kennzeichnung, +> - das Ergebnis unserer automatischen Auswertung der Herkunftsdaten und die daraus von uns gesetzte Kennzeichnung, getrennt von der Angabe des Hochladenden, +> - die Bestätigung des Hochladenden mit Zeitpunkt, der Fassung des bestätigten Textes und der zugrunde liegenden AGB, dem angemeldeten Konto beziehungsweise dem verwendeten API-Zugang, der Firma, für die hochgeladen wurde, einer pseudonymisierten Ableitung der IP-Adresse und der auf 250 Zeichen gekürzten Kennung des verwendeten Browsers. +> +> Die IP-Ableitung wird mit einem geheimen Schlüssel gebildet. Sie ist pseudonymisiert, nicht anonym: Mit dem Schlüssel könnten wir prüfen, ob eine bestimmte Adresse zu ihr passt; ohne den Schlüssel ist das nicht möglich. +> +> Zweck dieser Speicherung ist der Nachweis, welche Datei mit welchen Angaben eingereicht wurde, falls Dritte Rechte an dem Bild geltend machen, sowie die Nachvollziehbarkeit unserer KI-Kennzeichnung. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt in der Nachweisführung und Rechtsverteidigung. Eine dokumentierte Abwägung liegt vor. +> +> Die Originaldatei ist nicht öffentlich abrufbar. Öffentlich ausgeliefert werden ausschließlich verkleinerte Fassungen, aus denen Standortdaten, Geräteseriennummern und sonstige technische Metadaten des Originals entfernt sind. Bildnachweis und KI-Kennzeichnung werden am Bild angezeigt. +> +> Bilder, die hochgeladen, aber nie veröffentlicht werden, löschen wir, wenn Sie sie löschen oder ersetzen, sofort; bleibt ein Entwurf 180 Tage unbearbeitet, löschen wir ihn mit seinen Bildern *(Ziel)*. Wird ein veröffentlichtes Bild entfernt oder ersetzt oder endet die Veröffentlichung der Mitteilung, werden die genannten Daten in unser Beweisarchiv (Abschnitt „Beweisarchiv“) überführt und dort nach den dort genannten Fristen gelöscht. + +### Beweisarchiv nach Entfernung von Inhalten (beide, neu) + +> **Beweisarchiv nach Entfernung von Inhalten** +> +> Wenn wir eine Pressemitteilung oder Teile davon aus dem öffentlichen Angebot entfernen, etwa auf Antrag, im Meldeverfahren, nach einer Datenschutzanfrage oder auf eigene Entscheidung, bleibt sie in allen öffentlich sichtbaren Bereichen unserer Portale entfernt, einschließlich Suche, Feeds und Sitemap. Wir beantragen zusätzlich die Löschung aus den gängigen Suchmaschinen; auf deren Aktualisierung haben wir keinen Einfluss. +> +> Einen auf das Notwendige beschränkten Datensatz zu der entfernten Veröffentlichung bewahren wir in einem getrennten, verschlüsselten Archiv auf: den zuletzt veröffentlichten Stand der Inhalte einschließlich der darin genannten Pressekontakte, die Angaben zum Einreicher (Konto, Name, E-Mail-Adresse, Firma zum Zeitpunkt der Einreichung *(Ziel)*), die zu den Bildern gespeicherten Daten (Abschnitt „Bilder in Pressemitteilungen“), die Zeitpunkte von Veröffentlichung und Entfernung, den Grund der Entfernung als Kategorie, bei Änderungen den vorherigen und den neuen Stand sowie die Vorgangsnummer eines zugrunde liegenden Melde- oder Löschverfahrens *(Ziel; bis zur Umsetzung: „sowie die Angaben des zugrunde liegenden Melde- oder Löschverfahrens einschließlich der Kontaktadresse des Antragstellers“)*. Zweck ist ausschließlich die Wahrung unserer Nachweis- und Verteidigungsinteressen gegenüber Rechteinhabern, Betroffenen und Behörden sowie der Rückgriff gegen den Einreicher. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; soweit ein Bild ausnahmsweise besondere Kategorien personenbezogener Daten erkennen lässt, Art. 9 Abs. 2 lit. f DSGVO. Bei Daten, deren Löschung beantragt wurde, prüfen wir im Einzelfall, ob die weitere Aufbewahrung nach Art. 17 Abs. 3 lit. e DSGVO erforderlich ist, und halten das Ergebnis fest. +> +> Originaldateien aktiver Bilder sind für unsere Redaktion zugänglich; archivierte Inhalte nur für Administratoren mit gesonderter Berechtigung. Jeder Abruf archivierter Inhalte und jede Änderung einer Aufbewahrungssperre wird mit Angabe des Zwecks protokolliert; das Protokoll löschen wir nach 395 Tagen *(Ziel)*. Das Archiv wird für keinen anderen Zweck verwendet und nicht an Dritte weitergegeben, außer zur Rechtsverteidigung an unsere rechtlichen Berater oder auf gesetzlicher Grundlage an Behörden und Gerichte. +> +> Archiveinträge werden drei Jahre nach dem Ende des Jahres, in dem der Inhalt entfernt wurde, automatisch gelöscht. Läuft zu einem Inhalt eine rechtliche Auseinandersetzung, setzen wir eine dokumentierte Aufbewahrungssperre; nach deren Aufhebung wird der Eintrag zum regulären Zeitpunkt gelöscht oder, wenn ein dokumentierter Grund fortbesteht, zu einem festgelegten späteren Zeitpunkt *(Ziel)*. Verlangen Sie die Einschränkung der Verarbeitung, kennzeichnen wir den Eintrag gesondert und beschränken seine Verwendung auf die gesetzlich zulässigen Zwecke *(Ziel)*. Von einem gelöschten Eintrag bleibt nur ein technischer Löschvermerk (Kennung, Objektschlüssel, Ereignisart, Zeitpunkte, Prüfsumme); er verhindert, dass gelöschte Inhalte durch eine Wiederherstellung erneut verfügbar werden, und wird nach der im Abschnitt „Speicherdauer“ genannten Frist gelöscht *(Ziel)*. Sicherungskopien werden innerhalb von 14 Tagen überschrieben; nach einer Wiederherstellung aus einer Sicherung werden bereits gelöschte Einträge anhand eines getrennt gesicherten Löschstands erneut entfernt *(Ziel: getrennter Löschstand und Übung)*. + +### 13. Speicherdauer (beide, Liste der wesentlichen Fristen; Sitzungen, Reset- und API-Tokens sowie Warteschlangen werden vor Veröffentlichung ergänzt) + +> - Server-Logs: 14 Tage. +> - Anmelde- und Änderungslinks: einmalige Nutzung oder 15 Minuten gültig; Bestätigungslinks aus dem Meldeverfahren: 72 Stunden. Die zugehörigen Datensätze werden gelöscht, sobald Verbrauch oder Ablauf mehr als 30 Tage zurückliegen. +> - Ereignisprotokolle (Abschnitt „Eigene Nutzungsstatistiken“): 395 Tage. +> - Fehlerberichte: 90 Tage. +> - Aktivitätsverlauf: Anmelde- und Fehlversuchsereignisse 90 Tage, übrige Einträge 395 Tage; Tagessummen fehlgeschlagener Anmeldungen 90 Tage; API-Zugriffsprotokoll 90 Tage; IP-Adresse der letzten Anmeldung 90 Tage nach der letzten Anmeldung. +> - Zustellmeldungen: 90 Tage im Postfach, 395 Tage als ausgewerteter Datensatz; Sperrliste, solange erforderlich. +> - IP-Adressen aus Formularanfragen und Buchungsbestätigungen: 90 Tage. +> - Kontaktanfragen: 180 Tage nach Abschluss; Anfragen mit Vertrags- oder Rechtsbezug nach der Frist des jeweiligen Vorgangs. +> - Formulardaten zu Widerruf, Kündigung und Buchungsbestätigung: 180 Tage nach Bearbeitung; der Vertragsnachweis selbst nach den gesetzlichen Aufbewahrungsfristen. +> - Entwürfe, die nie veröffentlicht wurden: sofort bei Löschung durch Sie, sonst 180 Tage nach der letzten Änderung samt Bildern. +> - Abgelehnte, nie veröffentlichte Einreichungen: Text und Bilder 180 Tage nach der Ablehnung; ein Ablehnungsnachweis (Status, Zeitpunkt, Kategorie, Konto) drei Jahre nach Ende des Jahres der Ablehnung. +> - Bearbeitungsstände von Korrekturen: 30 Tage. +> - Meldedaten: drei Jahre nach Abschluss des Vorgangs. +> - Beweisarchiv: drei Jahre nach Ende des Jahres der Entfernung; Zugriffsprotokoll 395 Tage; technischer Löschvermerk bis zum späteren von 395 Tagen nach Löschung und 14 Tagen nach Ablauf der letzten rückspielbaren Sicherung. +> - Vertrags-, Buchungs- und Rechnungsdaten: gesetzliche Aufbewahrungsfristen (Buchungsbelege acht Jahre, Handels- und Geschäftsbriefe sechs Jahre). +> - Veröffentlichte Pressemitteilungen: dauerhaft im Archiv, soweit keine Ansprüche auf Entfernung bestehen. +> - Kontodaten: nach Kontolöschung, soweit keine Aufbewahrungspflichten entgegenstehen. +> +> Gelöschte Daten können in Sicherungskopien noch bis zu 14 Tage enthalten sein. Die Backups werden ausschließlich zur Wiederherstellung der Systeme im Sicherungsfall verwendet und nicht produktiv ausgewertet. + +### Versionshinweis (beide, am Ende) + +> **Stand: [Datum] · Version 0.4.** Änderungen gegenüber 0.3: Abschnitt „Eigene Nutzungsstatistiken“ (21.09.2026), Abschnitt „Schutz vor automatisierten Anfragen“ (09.10.2026), neu: Fehlerprotokoll, Anmeldung und Kontosicherheit, Aktivitätsverlauf und API, Zustellbarkeit und Abmeldung, Bilder in Pressemitteilungen, Beweisarchiv; überarbeitet: Kontaktaufnahme, Automatisierte Inhaltsprüfung, Änderungslinks, Speicherdauer. Frühere Fassungen: [Link]. + +--- + +## 5. Fragen an Sie + +Je Frage unser Default. Bitte bestätigen, ändern oder begründet verwerfen. + +| Nr. | Frage | Unser Default | Antwort | +|---|---|---|---| +| 1 | **AGB 0.7:** Freigabe von § 8a (neu), § 9 Abs. 1, 1a, 2, 4 (geändert), § 6 Abs. 2 (Kategorie-Boost, Kennzeichnung), § 8 Abs. 1 (KI-Angabe als Zusicherung), § 10 Abs. 6 (Erstattungen). Hält das Zusammenspiel im B2B nach § 307? Ist der Konflikt § 9 Abs. 1a / Abs. 2 gelöst? Deckt Abs. 1a die Vervielfältigung durch soziale Netzwerke beim Teilen? Genügt „Wahrung der wesentlichen Bildaussage“ gegen § 14 / § 39 UrhG? | Texte in Anlage 1 Abschnitt 3 und Anlage 4 | | +| 2 | **Einbeziehung 0.7:** Zustimmungsgate mit aktivem Klick je Fassung vor jedem neuen Kauf (Einzelveröffentlichung, Credits, neues Abonnement). Bereits bezahlte Leistungen bleiben ohne neue Zustimmung nutzbar: Abonnenten mit laufender Laufzeit und Kunden mit vor 0.7 erworbenen Credits (FIFO) erhalten „Später entscheiden“ und reichen unter 0.6 ein; „Später“ erzeugt keinen Annahmedatensatz. Stimmt ein Abonnent nicht zu, läuft der Vertrag nach § 15 Abs. 3 unter 0.6 weiter, auch bei automatischer Verlängerung; eine Umstellung erfolgt dann nur durch Änderungskündigung (ordentliche Kündigung zum Laufzeitende nach § 11 Abs. 2 mit Angebot eines neuen Vertrags unter 0.7). Der Dialog im Code kennt heute nur Annahme oder Abbruch; „Später entscheiden“ und der Bestandsschutz werden mit Deploy 3 gebaut (Screenshot des heutigen Stands in Anlage 7). Trägt das die bestehende Vertragslage? Ist die Änderungskündigung der richtige Weg, und welche Mitteilung und Frist sind nötig? Gilt die Anerkennung über den Bild-Schalter mit Fassung und Link zusätzlich als wirksame Erklärung? | Ja / Ja / Ja | | +| 3 | **Beweisarchiv:** Pauschale Drei-Jahres-Frist nach Jahresende für alle Ereignistypen (Begründung je Typ in Anlage 2)? Originaldatei mit allen Metadaten speichern? Art. 9 Abs. 2 lit. f als Grundlage für Bilder mit besonderen Kategorien? Aufbewahrungssperre und Einschränkung nach Art. 18 getrennt wie in D1? Umgang mit bereits versiegelten Archivpaketen, die Antragsteller-E-Mails enthalten: minimierte Nachfolgefassung mit Integritätsnachweis oder befristete Übergangsaufbewahrung? Abwägung in Anlage 2 ausreichend? | Ja zu allem; Altbestand: Nachfolgefassung | | +| 4 | **Medienprivileg in der Portal-DSE (Abschnitt 9):** Der Absatz beruft sich mit „soweit“ auf Art. 85 DSGVO und § 57 MStV, während das Portal sonst als Hoster ohne redaktionelle Bearbeitung auftritt. Ist der Absatz in dieser Form unschädlich, oder sollte er auf Archivfunktion und Informationsfreiheit (Art. 17 Abs. 3 lit. a) umgestellt werden? | Behalten, im Einzelfall nie allein darauf stützen | | +| 5 | **Hoster-Status:** Reichen Richtlinien-Formulierung („automatisierte Prüfung“), Verantwortlich-Zeile am Bild und Preisseiten-Wording, auch mit bezahlten Platzierungen und automatisiertem KI-Scoring? Ist der UrhDaG-Vermerk (Anlage 1, 3.9) tragfähig? Der Status als kleiner Diensteanbieter (§ 2 Abs. 3 UrhDaG) wird dabei nur als Reduzierung einzelner Pflichten verstanden, nicht als Freistellung. Ersetzt in 0.7 „redaktionelle Qualität“ (§ 4 Abs. 4, § 7 Abs. 1) durch „Qualität und Lesbarkeit“. Das Impressum der Portale nennt einen „Verantwortlichen für journalistisch-redaktionelle Inhalte (§ 18 Abs. 2 MStV)“: Schadet die Angabe dem Hoster-Status, oder ist sie wegen geplanter eigener Inhalte (Portal-Updates) nötig? | Ja / Ja / Angabe behalten, auf eigene Inhalte beziehen | | +| 6 | **Art. 50 KI-VO:** (a) Geplant (C2PA-Prüfung, noch nicht in Betrieb; heute dienen Metadaten der Datei nur als Vorbelegung, die der Einreicher ändern kann): Wird das Portal durch eine aus geprüften Herkunftsdaten gesetzte, nicht abschwächbare Kennzeichnung zum Mitbetreiber nach Abs. 4? Korrekturweg (§ 8a Abs. 4) ausreichend? (b) Geplant (noch nicht gebaut): Eigene „Portal-Updates“ sollen per KI vorformuliert, vom Betreiber überarbeitet und freigegeben werden; gespeichert würden Entwurf, Endfassung, Diff, Freigebender, Zeitpunkt; die Rubrik nennt die KI-Unterstützung. Entfällt damit die Kennzeichnungspflicht? (c) Alt-API setzte bisher „ohne KI“ im Namen des Kunden; wird auf „keine Angabe“ umgestellt. | Nein / Ja / Ja | | +| 7 | **Boost-Kennzeichnung:** Bezahlte hervorgehobene Platzierung von Kundenmeldungen auf Startseite und Branchenseite. Label „Gebuchte Platzierung“ (en „Booked placement“) am Bild und in Listen, Tooltip „Das Unternehmen hat diesen Platz gebucht. Der Inhalt ist eine Pressemitteilung des Unternehmens.“, Satz auf der Preisseite, Klausel in § 6 Abs. 2. Die Erklärung erscheint am Desktop beim Überfahren, auf Mobil per Tipp auf das Label, und wird von Screenreadern mitgelesen. Die Kopfzeile über dem Aufmacher lautet „Aktuell“ statt bisher „Top-Auswahl“. Screenshots eines Test-Boosts (Startseite, Branchenseite, Mobil, Erklärung) liegen als Anlage 7 bei. Genügt das in der tatsächlichen Darstellung § 5a Abs. 4 UWG, Anhang Nr. 11 UWG und § 22 MStV? | Ja | | +| 8 | **Fehlerprotokoll im Browser:** lit. f plus § 25 Abs. 2 Nr. 2 TDDDG mit dem in 3a beschriebenen minimalen Datensatz, ohne Einwilligung? | Ja | | +| 9 | **Turnstile:** lit. f plus § 25 Abs. 2 Nr. 2 TDDDG; serverseitige IP-Übermittlung; DPF für Cloudflare, Inc. Text 6a mit Ergänzungen freigeben? | Ja | | +| 10 | **Aktivitätsverlauf:** 395 Tage für Mail-Einträge (Empfängeradresse, Betreff) auch zu Pressekontakten ohne Konto verhältnismäßig? Begründung: Nachweis der Benachrichtigung bei späteren Beschwerden. | Ja | | +| 11 | **Sperrliste:** Für Abmeldungen lit. c in Verbindung mit Art. 21 Abs. 3 DSGVO neben lit. f nennen; für Hard Bounces nur lit. f. | Ja | | +| 12 | **Lösch- und Änderungsanfragen** (Kontext in Anlage 6): (a) Grenze zwischen unentgeltlicher Erfüllung nach Art. 17 und entgeltlicher Depublikation: Der Preis trägt, wenn kein Betroffenenrecht einer natürlichen Person betroffen ist und ein kostenfreier Weg dafür besteht; bei eigenen Kunden zusätzlich, weil die Archivierung bei Vertragsschluss offengelegt war (§ 13 Abs. 1); bei übernommenem Altbestand ohne eigenen Vertrag ist die Depublikation rechtmäßiger Inhalte juristischer Personen eine freiwillige Leistung ohne Entfernungsanspruch. Hält § 13 Abs. 1 nach § 307? (b) Früher beworbener „kostenfreier Weg über connektar“, der praktisch nicht funktionierte: Irreführung nach § 5 UWG; Aussage entfernt und dokumentiert (Zeitraum, Entfernung). Verjährung: sechs Monate für Mitbewerber- und Verbandsansprüche, ein Jahr für Verbraucheransprüche nach § 9 Abs. 2, wobei Verbraucher hier nicht Kunden sind; vertragliche Ansprüche von Geschäftskunden gesondert. Keine weitere Maßnahme nötig? (c) Realnamen-Änderung: kostenfrei, wenn die genannte natürliche Person oder ein von ihr bevollmächtigtes Unternehmen es verlangt; Kontaktaktualisierung durch das Unternehmen nach Leistungsbeschreibung; sonstige Edits kostenpflichtig. (d) Art. 19 in der Syndikation: Portal benachrichtigt eigene Empfänger (Art. 17 Abs. 2 für die Öffentlichkeit), Verteiler die seinen; gegenseitige Meldung vertraglich. | Ja zu (a) bis (d) | | +| 13 | **Regresskette:** Gate-Annahme → Upload-Bestätigung (Rolle, Fassung, Konto, Zeitpunkt, IP-HMAC) → Original mit Hash → veröffentlichte Fassung → Archiv mit Hash, täglicher Hash-Export auf getrennten Speicher (Integritätsnachweis, kein qualifizierter Zeitstempel); Partnerbedingungen mit Annahmebeleg. Fehlt ein Glied? | Nein | | +| 14 | **Syndikationsvertrag:** Entwurf nach der Gliederung in Anlage 5, vorrangig § 2 bis § 5 (Rollen, Schnittstelle, Änderungen, Inhalte) vor dem Partnertermin im Oktober. | Entwurf durch Sie | | +| später | **KI-Vorabprüfung von Bildern (D8):** Genügen AVV, die Standardspeicherung der API (bis zu 30 Tage, kein Training), Minimierung (1024 px, keine Metadaten, kein Kontobezug) und eine dokumentierte Schwellwertprüfung zur DSFA, oder ist eine förmliche DSFA nötig? Art. 9 bei „Person erkennbar ja/nein“ ohne Identifizierung? | AVV plus Schwellwertprüfung; kein Art. 9 | | +| später | **Webanalyse im Kundenbereich (D7)** mit HMAC-Kennung und Widerspruch: lit. f ohne Einwilligung? | Ja | | +| später | **Newsletter (D10):** Opt-in mit Bestätigung und Protokoll ohne IP ausreichend; kein § 7 Abs. 3 UWG für Altkonten. | Ja | | + +--- + +## 6. Entscheidungen des Betreibers (Information, keine Fragen) + +| Bereich | Entscheidung | +|---|---| +| Nummerierung der DSE | Zwei Ausprägungen mit unterschiedlichen Nummern ab Abschnitt 7; Querverweise über Titel und stabile Anker | +| Fristen | Wie Abschnitt 2 und 4 (Liste 13); Vorfälle werden einzeln mit Vermerk länger gehalten | +| Letzte Anmelde-IP | Im Klartext sichtbar, überschrieben, 90 Tage nach letzter Anmeldung gelöscht | +| Webanalyse Kundenbereich, KI-Bildprüfung, Newsletter | Bleiben aus; eigene Aktivierungspakete | +| Juli-Mails an Altkonten | Versand über das interne Kampagnenmodul, beide mit Abmeldelink: am 21.07.2026 an 10 Konten mit laufendem Bestandsvertrag und Anmeldung in den letzten 12 Monaten (Bestandsschutz und Relaunch), am 22.07.2026 an 954 Konten mit Anmeldung in den letzten 12 Monaten (Info zum Relaunch). Konten ohne Anmeldung seit über 12 Monaten (rund 58.600) wurden bewusst nicht angeschrieben; die Empfängerfilter wurden dafür gebaut. Texte, Empfängerregel und Zahlen: Anlage 7. | +| Umami | Rohdatenfrist der Instanz 13 Monate | +| Beweisarchiv | Wie D1; Legal Hold ohne Fristneustart; Restdaten minimal; Zugriffsprotokoll 395 Tage; Original unverändert | +| Bildrechte-Bestätigung | Rolle je Einreichungsweg wie in D1; Betreiber bestätigt nie; Betreiber-Upload nur für Meldungen mit Konto; Self-Service-Upload von Bildern nur mit Konto, Kontaktdatenänderung auch ohne | +| Zustimmungsgate | Gate vor jedem neuen Kauf; „Später“ für laufende Abonnements und vor 0.7 gekaufte Credits; keine automatische Umstellung bei Verlängerung; Umstellung nur per Änderungskündigung (Frage 2) | +| Boost | „Gebuchte Platzierung“ mit Tooltip; Aufmacher ohne Buchung bleibt „Top-Meldung“ und wird automatisch bestimmt, keine manuelle Auswahl | +| Erstattungen | Modell: abgelehnte Einzel-PM nach einer kostenfreien Überarbeitung voll erstattet; nicht erbrachte Zusatzleistung als Credits gutgeschrieben; unverbrauchte Credits auf Antrag innerhalb von 14 Tagen nach Kauf erstattet, danach § 5 Abs. 3; Abonnements zum Laufzeitende, keine anteilige Erstattung außer bei Sonderkündigung nach § 10 Abs. 5; Erstattung auf demselben Zahlungsweg | +| Portal-Updates (geplant) | KI-Entwurf, Überarbeitung und Freigabe durch den Inhaber, dokumentiert; Rubrik nennt die KI-Unterstützung und den Verantwortlichen. Noch nicht gebaut. | + +--- + +## 7. Änderungen an den AGB (0.7), Zusammenfassung + +| Stelle | Änderung | Quelle | +|---|---|---| +| § 4 Abs. 4, § 7 Abs. 1 | „redaktionelle Qualität“ → „Qualität und Lesbarkeit“ | Hoster-Status | +| § 6 Abs. 2 | Kategorie-Boost, Slot-Begrenzung, Kennzeichnung als gebuchte Platzierung | Anlage 4, Abschnitt D | +| § 8 Abs. 1 | neuer Spiegelstrich: „seine Angaben zur Erstellung mit KI zutreffend sind; eigene Pflichten des Kunden aus der Verordnung (EU) 2024/1689 bleiben unberührt“ | Frage 6 | +| § 8a | neu, Text in Anlage 1 Abschnitt 3.1; in Abs. 1 Satz 1 ergänzt: „… die Nutzungen und Bearbeitungen nach § 9 einzuräumen“ | Frage 1 | +| § 9 | Abs. 1, 1a, 2, 3, 4 wie Anlage 1 Abschnitt 3.2 | Frage 1 | +| § 10 Abs. 6 | neu: Erstattungen (Wortlaut in Anlage 4, Abschnitt 7) | Abschnitt 6 | +| § 6 Abs. 2 neu, Wortlaut | „Zeitlich befristete hervorgehobene Platzierung einer veröffentlichten PM in den Laufzeitstufen 7, 14 oder 30 Tage. Der Startseiten-Boost umfasst die Startseite und die Kategorieseite des jeweiligen Portals, der Kategorie-Boost nur die Kategorieseite der gewählten Rubrik. Die Zahl gleichzeitiger Boosts je Seite ist begrenzt; die freien Plätze werden vor der Buchung angezeigt. Geboostete PMs werden als gebuchte Platzierung gekennzeichnet. Ein Boost ist nur für PMs buchbar, die die Inhaltsprüfung ohne Beanstandung durchlaufen haben (Status „Grün“). Geschuldet ist ausschließlich die Platzierung während der gebuchten Laufzeit; eine bestimmte Reichweite, Zugriffszahl oder sonstige Werbewirkung wird nicht geschuldet. [Satz zur Nichterreichbarkeit unverändert.]“ | | + +Bestätigungstext im Upload-Formular, Verantwortlich-Zeile und Richtlinien-Texte: Anlage 1, Abschnitte 3.3 bis 3.5. + +--- + +## 8. Reihenfolge nach Ihrer Antwort + +1. Antworten in die Entscheidungsdokumentation übernehmen; abweichende Defaults anpassen. +2. Löschläufe und Zielfristen produktiv setzen und belegen; Restore-Übung. +3. DSE 0.4, AGB 0.7, Richtlinien, Bestätigungstext mit § 8a-Verweis und Zustimmungsgate gemeinsam veröffentlichen (Deploy 3). +4. Interessenabwägung datieren und abzeichnen. + +## Anlagen + +1. Decision-Update Bildrechte und Beweisarchiv vom 22.09.2026 (Abschnitte 3, 4, 7, 8, 12) +2. Interessenabwägung Beweisarchiv, Fassung vom 13.10.2026 +3. Rechtstexte im Live-Stand vom 12.10.2026: DSE 0.3 Hub und Portale, AGB 0.6, Boost (Preisseite, Label) +4. Klärungsdokument vom 12.10.2026 (Begründungen zu allen Defaults, Erstattungsklausel, Bestätigungsrollen) +5. Gliederung Syndikationsvertrag (Anlage 4, Abschnitt 8) +6. Kontext Lösch- und Änderungsanfragen ([`handover_loesch-anfragen.md`](handover_loesch-anfragen.md), Stand 25.08.2026) +7. Screenshots und Belege; Dateiliste im Anschreiben (Bild-Upload und Bildnachweis, KI-Hinweis, Kontosicherheit, Zustimmung zu AGB und Richtlinien, Test-Boost, Berechtigungen, Dienstleisterverträge, Relaunch-Mails vom Juli 2026) diff --git a/dev/rechtliches/handover_loesch-anfragen.md b/dev/rechtliches/handover_loesch-anfragen.md new file mode 100644 index 00000000..d6bab621 --- /dev/null +++ b/dev/rechtliches/handover_loesch-anfragen.md @@ -0,0 +1,126 @@ +# Kontext: Beurteilung von Lösch- und Änderungsanfragen + +*Instruktionsblock für neue Chats. Aufgabe: eingehende Nachrichten zu veröffentlichten Pressemitteilungen rechtlich und inhaltlich einordnen, Kostenfolge bestimmen, Antwort formulieren.* + +*Kopie aus dem Projektwissen „Presseportale“ (Stand 25.08.2026), abgelegt am 13.10.2026 als Anlage 6 zum Anwaltspaket. Die im Decision-Update Bildrechte vom 22.09.2026 (Abschnitt 3.8) vorgesehenen Ergänzungen (Archiveintrag vor jeder Änderung, Archivinhalte in Art.-15-Auskünften, Standardabsatz zum Beweisarchiv in Antwortschreiben) sind hier noch nicht eingearbeitet.* + +--- + +## 1. Ausgangslage + +- Zwei Presseportale: **presseecho.de** (breite/allgemeine Themen) und **businessportal24.com** (Wirtschaft/Unternehmen). Verwaltung über den gemeinsamen Hub **pressekonto.com**. +- Betrieb als Solo-Projekt neben dem Hauptjob → jede Lösung muss ohne dauerhaften Betreuungsaufwand auskommen. +- Grundhaltung **„Anti-Zombie"**: keine versteckten Kosten, keine automatische Verlängerung, keine Mindestlaufzeit, transparente öffentliche Preise, direkter menschlicher Kontakt. Jede Entscheidung wird dagegen geprüft. +- Ein großer Teil der Meldungen kommt über Presseverteiler (v. a. **connektar.de**, teils **openPR**) per API. +- **connektar ist write-once:** Die technische Möglichkeit zur Propagierung von Änderungen/Löschungen besteht, wird aber nicht genutzt. → Das Portal übernimmt **alle** Zustandsänderungen nach Veröffentlichung selbst. Kunden **nicht** mehr auf den „kostenfreien Weg über connektar" verweisen (UWG-Risiko + Anti-Zombie-Widerspruch). +- Kein Anwalt im Team. Rechtliche Aussagen sind Einordnung, keine Rechtsberatung; offene Punkte gehören auf die Anwaltsagenda (§7). + +--- + +## 2. Entscheidungsachse (immer zuerst prüfen) + +Nicht das Datenfeld entscheidet, sondern: + +1. **Wer ist betroffen?** Natürliche Person (DSGVO greift) oder juristische Person (kein Betroffenenrecht)? +2. **Was bleibt nach Anonymisierung übrig?** Ein eigenständig zulässiges, werthaltiges Reststück — oder ein sinnloser Rumpf? + +**Wichtig:** „Personenbezogen" umfasst nicht nur Kontaktfelder, sondern auch Name, Autorenschaft und inhaltliche Aussagen einer identifizierbaren Person. Nur die Kontaktfelder zu leeren erfüllt einen Art.-17-Anspruch **nicht**, wenn der Realname stehen bleibt. + +--- + +## 3. Free/Paid-Matrix + +| Konstellation | Vorgehen | Kosten | +|---|---|---| +| Natürliche Person, PM über/von ihr | Volldepublizierung | **kostenfrei** | +| Natürliche Person, nur Kontaktdaten (Ansprechpartner in Firmen-PM) | Daten entfernen, PM bleibt | **kostenfrei** | +| Natürliche Person, Realname entfernen/pseudonymisieren | Änderung umsetzen | **kostenfrei** | +| Juristische Person, Register-/Firmendaten (§ 9 HGB) | Kontaktdaten nat. Person raus; Firmeneintrag bleibt | Volldepublizierung **optional 35 €** | +| Inhaltliche Änderung ohne Personenbezug (Text umschreiben, Bildtausch) | Edit + neuer Freigabelauf | **kostenpflichtig** | + +**Preis-Überlebensbedingung (kumulativ):** Eine Gebühr trägt nur, wenn (a) **kein** Personenbezug einer natürlichen Person vorliegt **und** (b) ein tatsächlich funktionierender kostenfreier Alternativweg existiert (= Magic-Link-Self-Service, **nicht** connektar). + +**Grundsatz:** DSGVO-Anliegen führen zu **Anonymisierung**, nicht zu Depublizierung. Depublizierung ist der separate, kostenpflichtige Fall. Ausnahme: Wenn nach Anonymisierung nur ein sinnloser Rumpf bleibt (Vanity-/Personen-PM), ist Depublizierung das richtige Mittel — diese Entscheidung trifft ein Admin, nicht der Antragsteller. + +--- + +## 4. Verifikation + +- **Regelweg:** Magic-Link an die **in der Veröffentlichung hinterlegte** Firmen-/Pressekontaktadresse — nie an die im Formular oder in der Mail angegebene. Damit ist nur der echte Kontakt handlungsfähig. +- **Nachweis nur bei begründeten Zweifeln** (Art. 12 Abs. 6), z. B. Absenderadresse ≠ hinterlegte Adresse. **Nie Ausweiskopie verlangen** (Datenminimierung). +- **Fallback „Kanal tot / keine Adresse hinterlegt":** Risiko-Asymmetrie kippt Richtung Umsetzen, wenn kein Missbrauchsmotiv erkennbar ist (eigene Privatdaten einer natürlichen Person). Dann: **Aktenvermerk** (Art. 5 Abs. 2) + **umkehrbare** Depublizierung + Hinweis auf Wiederherstellbarkeit. Kein Verifikationsverfahren, das den Antrag faktisch blockiert. +- **Dringlichkeitsrhetorik** („Notfall", „unverzüglich") ändert die Monatsfrist nicht und darf die Prüfung nicht überspringen. +- **Frist:** Reaktion innerhalb **eines Monats** ab Eingang (Art. 12 Abs. 3), auch bei Ablehnung. Schweigen ist die einzige wirklich riskante Option. + +--- + +## 5. Technische Checkliste bei Umsetzung + +- [ ] Daten aus sichtbarem Text **und** strukturierten Kontaktfeldern entfernen +- [ ] Bilder und Anhänge (Klarname in Cover/PDF/Signatur!) +- [ ] Interne Suche, Feed-/RSS-Ausgaben, Sitemap +- [ ] `noindex` + Entfernung aus dem Suchindex einreichen (Cache-Aktualisierung dauert Tage → im Schreiben erwähnen, kein eigener Einfluss) +- [ ] **Re-Sync-Sperre** — zwingend, sonst holt der nächste Import den alten Stand zurück +- [ ] **Art. 19 DSGVO:** Verteiler informieren; Betroffenen für netzwerkweite Entfernung an den Verteiler verweisen +- [ ] **Kein Credit-Abzug** im DSGVO-Pfad (Art. 12 Abs. 5) — technisch verifizieren +- [ ] **Audit-Log ohne Klartext-Altwerte** (sonst leben die Daten im Log weiter); Alt-Wert nur verschlüsselt + Löschfrist +- [ ] Ersetzung mit **Wortgrenzen** und **Namensvarianten** (Genitiv, „Herr X", „M. X"); Pflicht-Vorschau/Diff; Platzhalter oder Rolle statt Leerstring + +--- + +## 6. Referenzfälle (Muster) + +| Fall | Muster | Entscheidung | +|---|---|---| +| **HWP / Kaymaz** | GmbH, Registerdaten, Vorlagen-Streumail, Frist-Platzhalter leer | Persönliche Kontaktdaten kostenfrei raus; Firmeneintrag bleibt; Volldepublizierung optional 35 € | +| **Huraux** | Natürliche Person, Privatdaten, hinterlegter Kanal tot | Vollstattgabe kostenfrei, ohne formale Verifikation, Aktenvermerk + umkehrbar | +| **Gleue** | Natürliche Person, Kanal intakt | Vollstattgabe kostenfrei, Magic-Link an hinterlegte Adresse | +| **Rambo** | Realname → Pseudonym, connektar verweigert Fremdportal-Änderung | Kostenfrei umsetzen, kein connektar-Verweis | +| **Meet5 / Reinhardt** | Private Telefonnummer in alter PM, wird von LLMs als Kontakt ausgegeben | Nummer sofort kostenfrei entfernen, PM bleibt online; Magic-Link nur als Hinweis für künftige Fälle | + +--- + +## 7. Kommunikationsregeln + +- **Kein Verweis mehr auf connektar** als kostenfreier Änderungs-/Löschweg. +- **Aufsichtsbehörden-Hinweis** („Ihnen steht der Weg zur Aufsichtsbehörde offen") gehört **nicht** in ein Schreiben, das ein kostenfreies Angebot macht — dort wirkt er wie eine Einladung zur Beschwerde. Erst in den **zweiten** Brief, wenn tatsächlich (teilweise) **abgelehnt** wird. Im Angebotsfall neutral schließen. +- **Nicht überversprechen:** Was technisch passiert, ist **De-Identifikation / Schwärzung direkter Identifier**, keine „Anonymisierung" im DSGVO-Vollsinn. +- **Bei Ablehnung sachlich bleiben:** keine absoluten Behauptungen („Datenschutzrechte finden hier keine Anwendung" ist falsch, wenn personenbezogene Daten einer natürlichen Person enthalten sind — dann aufteilen). +- **Konversionschance nutzen:** Bei API-Einreichern, die nicht selbst ändern können, die Direktveröffentlichung als gleichwertige Option nennen — nie als Verkaufsdruck oder Mautstelle. +- **Kein Verkaufsdruck bei abgelehnten Meldungen:** kostenpflichtige Änderung dort nicht anbieten, wenn ein kostenloser Weg über den Verteiler existiert. + +--- + +## 8. Argumentationsreserve (nur juristische Person / Registerdaten) + +Kurzform für den Brief: *„Register- und Firmendaten sind nach § 9 HGB öffentlich einsehbar und betreffen die GmbH als juristische Person, der die genannten Datenschutzrechte nicht zustehen; eine Löschpflicht besteht daher nicht."* + +Vier Säulen, falls nachgehakt wird: +1. **Kein Schutzsubjekt** — DSGVO schützt nur natürliche Personen. +2. **Gesetzlich öffentlich** — § 9 HGB; kein Recht auf Herauslöschen rechtmäßiger Registertatsachen. +3. **Rechtsgrundlage + Ausnahme** — Art. 6 Abs. 1 lit. f (nicht Einwilligung); Art. 17 Abs. 3 lit. a (Informationsfreiheit); bei echter PM zusätzlich Medienprivileg (Art. 85 + LPG). +4. **Widerspruch ≠ Löschung** — Art. 21 löst eine Abwägung aus; „ohne meine Zustimmung" läuft leer, weil Einwilligung nie die Grundlage war. + +**Grenze:** Trägt nur Firmen-/Sachdaten. Bei **Presskit-/Profilseiten** aus Aggregat-/Registerdaten ist Säule 3 schwach → dann auf 1, 2, 4 stützen. Persönliche Kontaktdaten werden trotzdem kostenfrei entfernt. + +--- + +## 9. Offene Anwaltsfragen + +1. Grenze zwischen unentgeltlicher Erfüllung (Art. 17) und entgeltlichem freiwilligem Depublizierungsservice — trägt der Preis, wenn das Reststück eigenständig zulässig wäre? +2. UWG-Bewertung des früher als kostenfrei beworbenen connektar-Wegs. +3. Ab wann ist eine Realnamen-Änderung ein unentgeltliches Betroffenenrecht statt eines kostenpflichtigen Edits? +4. Art.-19-Zuständigkeit in der Syndication: Portal oder Verteiler? + +*Stand 13.10.2026: Die vier Fragen sind im Anwaltspaket (Versandfassung) als Frage 12 (a) bis (d) mit Default enthalten; Begründungen im Klärungsdokument, Abschnitt 4.* + +--- + +## 10. Arbeitsweise in diesem Kontext + +- Antworten auf **Deutsch**, Kundenkommunikation in deutscher Geschäftssprache. +- **Adversarial prüfen:** strukturelle Schwächen und rechtliche Edge Cases von sich aus benennen, nicht erst auf Nachfrage. +- **Trennen:** Geschäftsentscheidungen (selbst entscheidbar) von echten Rechtsfragen (Anwalt). +- Bei Entwürfen: **Platzhalter** setzen statt Fakten zu erfinden (Preise, Links, Daten, Namen). +- **KI-Spuren entfernen** in kundenseitiger Korrespondenz: keine Gedankenstrich-Häufung, keine Dreierfiguren, keine Label-Doppelpunkt-Konstruktionen, keine Nominalisierungsketten. +- Struktur bevorzugt: Tabellen, klare Optionen, Entscheidungslogik statt Fließtext. diff --git a/dev/rechtliches/interessenabwaegung-beweisarchiv-2026-10-12.md b/dev/rechtliches/interessenabwaegung-beweisarchiv-2026-10-12.md new file mode 100644 index 00000000..37ae3b03 --- /dev/null +++ b/dev/rechtliches/interessenabwaegung-beweisarchiv-2026-10-12.md @@ -0,0 +1,122 @@ +# Interessenabwägung nach Art. 6 Abs. 1 lit. f DSGVO + +## Bild-Originale, Rechtebestätigung und Beweisarchiv + +**Verantwortlicher:** adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld, info@pressekonto.com +**Angebot:** pressekonto.com, presseecho.de, businessportal24.com +**Fassung:** 13.10.2026 (ersetzt die Entwürfe vom 09.10. und 12.10.2026) · **in Kraft gesetzt am:** [Datum des Deploy 3] · **nächste Überprüfung:** [Datum, spätestens 12 Monate danach] + +Dieses Dokument hält die Abwägung fest, auf die sich die DSE-Abschnitte „Bilder in Pressemitteilungen“ und „Beweisarchiv“ stützen. Es dient dem Nachweis nach Art. 5 Abs. 2 DSGVO und wird auf Anfrage der Aufsichtsbehörde vorgelegt. Es ist mit dem Code-Stand v1.8.0, dem Codeabgleich vom 12.10.2026 und den Betreiberentscheidungen vom 12. und 13.10.2026 abgeglichen. Punkte, die erst mit einer Umsetzung wahr werden, sind mit *(Ziel)* markiert; die DSE wird erst veröffentlicht, wenn sie umgesetzt sind. + +--- + +## 1. Gegenstand der Verarbeitung + +| Teil | Was | Wann | Wie lange | +|---|---|---|---| +| A | **Originaldatei** eines Bildes mit ihren Metadaten (Kameradaten, Urheberangaben, Herkunftsdaten; möglich auch Standortdaten und Geräteseriennummern), die **veröffentlichte Fassung** mit Bildnachweis und KI-Kennzeichnung, das Ergebnis der automatischen **Herkunftsauswertung** | bei jedem veröffentlichten Bild | solange die Mitteilung mit dem Bild veröffentlicht ist, danach Teil B | +| A | **Rechtebestätigung** des Hochladenden: Zeitpunkt, bestätigter Wortlaut und AGB-Fassung, Konto bzw. API-Zugang, Firma, Rolle des Erklärenden (Kontoinhaber oder Partner-API; *Ziel*, heute nur Kanal: Formular, API, Magic-Link), Übermittlungsweg, Prüfsumme der Datei, Angaben zu Bildnachweis und KI, mit geheimem Schlüssel gebildeter Prüfwert der IP-Adresse (HMAC), Browserkennung auf 250 Zeichen gekürzt | bei jedem Bild-Upload | wie oben | +| B | **Beweisarchiv:** zuletzt veröffentlichter Stand der Mitteilung einschließlich der darin genannten Pressekontakte (Name, E-Mail, Telefon); Einreicher (Konto, Name, E-Mail, Firma; *Ziel:* zum Zeitpunkt der Einreichung festgeschrieben, heute zum Zeitpunkt der Archivierung gelesen); die Daten aus Teil A; Zeitpunkte von Veröffentlichung und Entfernung; Grund als Kategorie; bei Änderungen vorheriger und neuer Stand; Bezug zum zugrunde liegenden Melde- oder Löschverfahren (*Ziel:* nur Vorgangsnummer; *heute:* einschließlich E-Mail-Adresse des Antragstellers; bereits versiegelte Pakete werden inventarisiert und nach anwaltlicher Antwort migriert oder befristet übergangsweise behalten) | wenn eine Mitteilung oder ein Bild aus dem öffentlichen Angebot entfernt, ersetzt oder geändert wird | drei Jahre nach Ende des Jahres der Entfernung; bei dokumentierter Aufbewahrungssperre bis zu deren Aufhebung, danach zum regulären Zeitpunkt oder zu einem neu begründeten Enddatum *(Ziel: Code setzt heute die Frist nach Aufhebung neu)* | +| B | **Restdaten nach Löschung (Löschvermerk):** Kennung, Objektschlüssel ohne Personenbezug, Ereignisart, Gegenstand, Zeitpunkte, Prüfsumme des gelöschten Inhalts, Schemaversion und Sicherungsstatus | mit der Löschung des Archivinhalts | bis zum späteren von 395 Tagen nach Löschung und 14 Tagen nach Ablauf der letzten rückspielbaren Sicherung *(Ziel: heute bleiben auch Akteur, Vermerke und Vorgangsverweise)* | +| B | **Einschränkung der Verarbeitung** (Art. 18): Kennzeichnung am Eintrag mit Grund, Zuständigem und Prüfdatum; normale Verwendung und Export gesperrt | auf Verlangen oder im Streitfall | bis zur dokumentierten Aufhebung *(Ziel: heute nur Aufbewahrungssperre, die lediglich die Löschung verhindert)* | +| B | **Zugriffsprotokoll:** Administrator, Aktion, angegebener Zweck, Zeitpunkt, bei Abruf archivierter Inhalte und bei Änderung einer Aufbewahrungssperre | bei jedem solchen Zugriff | 395 Tage ab Zugriff *(Ziel: heute unbefristet)* | + +**Nicht erfasst:** Bilder, die hochgeladen, aber nie veröffentlicht werden (sofortige Löschung bei Löschung oder Ersetzung durch den Kunden; unbearbeitete Entwürfe nach 180 Tagen), Nutzungs- oder Verhaltensdaten, Zahlungsdaten, sonstige Kontodaten. + +**Betroffene Personen:** Kontoinhaber und ihre Mitarbeiter (Einreicher), in Mitteilungen genannte Pressekontakte, auf Bildern abgebildete Personen, Urheber und Rechteinhaber, Antragsteller im Melde- und Löschverfahren (nur über die Vorgangsnummer verknüpft). + +**Zugriff:** Originaldateien aktiver Bilder: berechtigte Redaktion. Archivierte Inhalte: Administratoren mit Compliance-Berechtigung. Der Betreiber ist Einzelunternehmer; zwei Altkonten mit Administratorrechten werden gelöscht, die Rollen `admin` und `editor` werden danach vollständig geprüft (Betriebsnachweis). + +--- + +## 2. Berechtigtes Interesse + +1. **Nachweis gegenüber Rechteinhabern:** Macht ein Urheber oder Lizenzgeber Ansprüche wegen eines veröffentlichten Bildes geltend (§§ 97 ff. UrhG), muss belegbar sein, welche Datei mit welchen Angaben eingereicht wurde und was der Kunde dazu bestätigt hat. +2. **Nachweis gegenüber abgebildeten Personen** (§§ 22, 23 KUG) und Betroffenen, auch bei Schadensersatzforderungen nach Art. 82 DSGVO. +3. **Rückgriff gegen den Einreicher**, der die Rechte zugesichert hat (AGB § 8 Abs. 2, künftig § 8a Abs. 5). +4. **Nachweis gegenüber Behörden und Gerichten**, insbesondere zu Melde- und Abhilfeverfahren nach dem Digital Services Act und zur KI-Kennzeichnung (Art. 50 KI-VO). +5. **Nachvollziehbarkeit der eigenen KI-Kennzeichnung**, die das Portal aus Herkunftsdaten setzt. + +Diese Interessen sind rechtlich anerkannt (Rechtsdurchsetzung und -verteidigung, Erwägungsgrund 47) und konkret: Bildrechte-Abmahnungen sind bei Presseportalen ein typisches Risiko, und nach einer Entfernung auf Antrag liegt der Inhalt sonst nirgends mehr vor. + +Soweit ein Bild ausnahmsweise besondere Kategorien personenbezogener Daten erkennen lässt (Art. 9), stützt sich die Aufbewahrung zusätzlich auf Art. 9 Abs. 2 lit. f (Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen). Das Portal hat das Bild nicht erhoben, sondern vom Kunden zur Veröffentlichung erhalten; die Aufbewahrung ist nicht öffentlich. + +--- + +## 3. Erforderlichkeit + +| Datum | Warum erforderlich | Geprüfte mildere Mittel | +|---|---|---| +| Originaldatei mit Metadaten | Nur das Original zeigt, welche Urheber- und Herkunftsangaben der Kunde mitgeliefert hat; die öffentlichen Varianten sind verkleinert und ohne Metadaten. Legt ein Anspruchsteller ein abweichendes Bild vor, belegt nur das Original den Inhalt. | Nur Prüfsumme und Metadatenauszug: belegt die Identität einer vorgelegten Datei, nicht deren Inhalt. Entfernen von Standort- und Gerätedaten aus dem gespeicherten Original: verändert die Beweisdatei und entwertet die Prüfsumme; Seriennummern können zudem die Urheberschaft belegen. Verworfen. Standort- und Gerätedaten werden nicht ausgewertet und nie veröffentlicht. | +| Rechtebestätigung mit Wortlaut, Fassung, Konto, Rolle, Zeitpunkt | Belegt, wer in welcher Rolle was wann zugesichert hat; Grundlage des Rückgriffs. Erklärender ist immer ein gebundener Vertragspartner (Kontoinhaber oder Partner); ein Bild-Upload ohne Konto gibt es nicht | keines; ohne diese Angaben ist die Bestätigung nicht nachweisbar | +| IP-Prüfwert und Browserkennung | Zusätzlicher Beleg, dass die Bestätigung aus der Sitzung des Kontos stammt (etwa bei bestrittener Abgabe durch einen Mitarbeiter) | IP im Klartext: verworfen, nur HMAC. Browserkennung: Kürzung auf 250 Zeichen; eine weitere Kürzung bringt keinen Gewinn, da die Kennung nur im Streitfall gelesen wird | +| Archiv: letzter veröffentlichter Stand mit Pressekontakten | Belegt, was öffentlich war, auch nach Löschung auf Antrag; die Kontaktzeile kann Gegenstand der Beanstandung sein | Nur Text ohne Kontaktangaben: verworfen | +| Archiv: Einreicher (Konto, Name, E-Mail, Firma) | Rückgriff setzt voraus, dass der Einreicher auch nach Kontolöschung identifizierbar bleibt | Nur Konto-ID: verworfen, nach Kontolöschung nicht mehr auflösbar. Weitere Kontodaten (Rechnungsdaten, Zahlungsdaten): nicht aufgenommen | +| Archiv: bei Änderungen alter und neuer Stand | Belegt Umfang und Zeitpunkt einer Korrektur | nur der neue Stand: verworfen | +| Archiv: Vorgangsnummer statt Antragstellerdaten *(Ziel)* | Verknüpfung zum Meldevorgang genügt; die Antragstellerdaten liegen dort mit eigener Frist | Antragsteller-E-Mail im Archiv: verworfen (Doppelspeicherung); heute noch enthalten, Altbestand wird gesondert behandelt | +| Zugriffsprotokoll | Erkennung von Fehlgebrauch; Nachweis der Zweckbindung gegenüber Betroffenen und Aufsicht | kürzer als 395 Tage: Beschwerden über Zugriffe kommen verzögert; länger: kein zusätzlicher Nutzen | + +**Frist drei Jahre nach Jahresende, je Ereignistyp:** + +| Ereignis | Warum drei Jahre | +|---|---| +| Veröffentlichtes Bild entfernt oder ersetzt | Urheberrechtliche Ansprüche verjähren regelmäßig in drei Jahren ab Jahresende der Kenntnis (§§ 195, 199 BGB); die Kenntnis des Rechteinhabers liegt typischerweise nahe am Zeitpunkt der Entfernung, weil die Entfernung oft auf seinen Hinweis erfolgt | +| Mitteilung depubliziert (Antrag, Meldeverfahren, eigene Entscheidung, Laufzeitende) | Ansprüche Dritter aus dem Inhalt und Rückgriff gegen den Einreicher, gleiche Verjährung | +| DSGVO-Änderung (Schwärzung, Pseudonymisierung) | Nachweis der Erfüllung eines Betroffenenrechts bei späterer Beschwerde oder Klage nach Art. 82; Verjährung drei Jahre | +| Kennzeichnungskorrektur | Nachweis gegenüber Kunde und Aufsicht, dass und warum eine Kennzeichnung geändert wurde; Beanstandungen nach Art. 50 KI-VO und UWG können nachlaufen | + +Die Frist ist eine betriebliche Regel, die sich an der Regelverjährung orientiert; sie bildet nicht jeden Verjährungsbeginn ab. Für konkret bekannte Ansprüche greift die Aufbewahrungssperre mit dokumentiertem Enddatum. + +--- + +## 4. Abwägung mit den Interessen der Betroffenen + +**Art der Daten:** überwiegend Daten, die zuvor öffentlich waren (Mitteilung, Bild, Pressekontakt) oder geschäftlich vom Kunden selbst angegeben wurden. Original-Metadaten können Standortdaten und Geräteseriennummern enthalten; sie werden nicht veröffentlicht und nicht ausgewertet. Bilder können ausnahmsweise besondere Kategorien erkennen lassen (Abschnitt 2, letzter Absatz). + +**Vernünftige Erwartungen:** Der Hochladende gibt die Bestätigung ausdrücklich ab und wird dabei auf AGB und Datenschutzerklärung hingewiesen. Bei einem Presseportal ist erwartbar, dass Veröffentlichungen und Zusicherungen zu Bildrechten dokumentiert werden. Pressekontakte und abgebildete Personen rechnen nicht mit einer Archivierung nach der Entfernung; die DSE informiert darüber in einem eigenen Abschnitt, und die Archivierung ist nicht öffentlich. + +**Risiken und Gegenmaßnahmen:** + +| Risiko | Maßnahme | +|---|---| +| Sensible Motive bleiben nach Entfernung im Original erhalten | Archivpakete anwendungsseitig verschlüsselt (AES-256, eigener Schlüssel außerhalb der Datenbank); Zugriff nur mit Compliance-Berechtigung und Zweckangabe, keine Auswertung, feste Frist; Grundlage Art. 9 Abs. 2 lit. f. Originaldateien aktiver Bilder liegen außerhalb des öffentlichen Speichers; ihre gesonderte Verschlüsselung ist durch den Code nicht belegt (Betriebsnachweis zur Infrastrukturverschlüsselung offen) | +| Archivierung ohne Kenntnis der Pressekontakte und Abgebildeten | DSE-Abschnitt „Beweisarchiv“; Hinweis in jedem Schreiben zu Löschanträgen („gelöscht“ nie ohne Archivhinweis); Auskunft nach Art. 15 umfasst Archivinhalte | +| Standort- und Gerätedaten im Original | nicht veröffentlicht, nicht ausgewertet, verschlüsselt; öffentliche Fassungen ohne diese Metadaten | +| Fehlgebrauch durch Administratoren | nur zwei Administratorkonten, zweiter Faktor Pflicht, Zweckangabe bei jedem Abruf, Zugriffsprotokoll, Änderungen am Protokoll gesperrt | +| Aufbewahrung über den Zweck hinaus | automatische Löschung mit Löschbeleg; Aufbewahrungssperre nur mit Pflichtvermerk, Prüfdatum (90 Tage) und bekanntem Enddatum; kein Fristneustart; Einschränkung nach Art. 18 getrennt *(Ziel)* | +| Wiederherstellung gelöschter Einträge aus Sicherungen | Sicherungen 14 Tage; getrennt gesicherter Löschstand, Abgleich nach jeder Wiederherstellung; Übung vor Veröffentlichung *(Ziel)* | +| Restdaten mit Personenbezug nach Löschung | Reduktion auf Kennung, Ereignisart, Zeitpunkte, Prüfsumme *(Ziel)* | + +**Auswirkungen auf die Betroffenen:** Die Archivierung verlängert die Verfügbarkeit eines Inhalts, den der Betroffene entfernt haben wollte, und eröffnet damit Offenlegungs- und Missbrauchsrisiken, auch für zuvor nicht öffentliche Metadaten und Kontaktangaben. Das Archiv ist nicht öffentlich und wird nicht ausgewertet; für Antragsteller einer Löschung bleibt der öffentliche Zustand entfernt. Das verbleibende Risiko wird durch die Maßnahmen oben und die feste Frist begrenzt; das Ergebnis in Abschnitt 5 steht unter dem Vorbehalt, dass die mit *(Ziel)* markierten Maßnahmen umgesetzt sind. + +**Betroffenenrechte:** + +- Auskunft (Art. 15) wird erteilt und umfasst Archivinhalte zur Person. +- Löschanträge zu Archiveinträgen werden im Einzelfall geprüft: Welcher Anspruch, wessen, warum noch möglich. Ergebnis und Grundlage (Art. 17 Abs. 3 lit. e oder Löschung) werden am Vorgang vermerkt. Keine pauschale Ablehnung wegen laufender Frist. +- Bei Widerspruch (Art. 21) wird geprüft, ob zwingende schutzwürdige Gründe (Rechtsverteidigung) überwiegen; Ergebnis am Vorgang. +- Einschränkung (Art. 18) wird technisch über die Aufbewahrungssperre mit dem Vermerk „eingeschränkt auf Antrag“ abgebildet. + +**Vermerkvorlage Löschantrag:** + +> Antrag vom [Datum], Vorgang [Nr.]. Betroffen: Archiveintrag [ID], Ereignis [Typ], entfernt am [Datum]. Möglicher Anspruch: [Urheber / abgebildete Person / Betroffener nach Art. 82 / Rückgriff gegen Einreicher], Verjährung voraussichtlich [31.12.20xx]. Ergebnis: Aufbewahrung erforderlich nach Art. 17 Abs. 3 lit. e bis [Datum] / Löschung veranlasst. [Name, Datum] + +--- + +## 5. Ergebnis + +Die Interessen des Verantwortlichen an Nachweis, Rechtsverteidigung und Rückgriff überwiegen. Die Daten sind auf das für diese Zwecke Erforderliche beschränkt, überwiegend zuvor öffentlich, nicht öffentlich zugänglich, verschlüsselt und zugriffsprotokolliert gespeichert und werden nach einer an der Verjährung ausgerichteten Frist automatisch gelöscht. Die Verarbeitung stützt sich auf Art. 6 Abs. 1 lit. f DSGVO, bei besonderen Kategorien zusätzlich auf Art. 9 Abs. 2 lit. f; über Löschanträge wird im Einzelfall nach Art. 17 Abs. 3 lit. e entschieden. + +--- + +## 6. Offene Punkte und Überprüfung + +- [ ] Umsetzung der mit *(Ziel)* markierten Punkte: Vorgangsnummer statt Antragsteller-E-Mail, Einreichungsnachweis zum Einreichungszeitpunkt, Rolle des Erklärenden, Hold-Ende ohne Fristneustart, Einschränkung nach Art. 18, Löschvermerk-Reduktion, Zugriffsprotokoll 395 Tage, getrennter Löschstand, Restore-Übung in vier Szenarien (Datenbank alt, Archivspeicher alt, beide alt, externes Ziel nicht erreichbar). +- [ ] Inventar der bereits versiegelten Archivpakete mit Antragsteller-E-Mails und Migrationsentscheidung nach anwaltlicher Antwort. +- [ ] Betriebsnachweis zur Verschlüsselung der aktiven Originaldateien. +- [ ] Prüfung und Bereinigung alter Deploy- und Migrationssicherungen, damit die 14-Tage-Aussage für alle Kopien gilt. +- [ ] Anwaltliche Prüfung (Anwaltspaket, Frage 3). +- Überprüfung dieses Dokuments: nach der Anwaltsantwort, bei Einführung der C2PA-Signaturprüfung, bei Bildern von API-Partnern, bei Bildern im Newsroom und spätestens nach 12 Monaten. + +--- + +**Abgezeichnet (erst nach Umsetzung der Zielmaßnahmen und anwaltlicher Antwort):** Kevin Adametz, Inhaber adametz.media, Bielefeld, [Datum] diff --git a/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md b/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md new file mode 100644 index 00000000..bd6e7599 --- /dev/null +++ b/dev/rechtliches/klaerung-anwaltspaket-2026-10-12.md @@ -0,0 +1,597 @@ +# Klärung Anwaltspaket: Entscheidungen, Antworten, Textänderungen + +**Stand:** 12.10.2026 · **Gehört zu:** [Versandfassung](anwaltspaket-datenschutz-2026-10-12.md) (Anlage 4), [Interessenabwägung](interessenabwaegung-beweisarchiv-2026-10-12.md), [Decision-Update Bildrechte](../bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md); Vorfassungen und Codeauswertung in [`dev/archive/rechtliches-2026-10/`](../archive/rechtliches-2026-10/) +**Grundlage:** Live-Rechtstexte vom 12.10.2026 (DSE 0.3 Hub und Portale, AGB 0.6, Boost), Antworten auf die neun Rückfragen, Betreiberangaben vom 12.10.2026 (unten), Codeabgleich aus der Auswertung. +**Status:** Entscheidungen vom 12. und 13.10.2026 eingearbeitet (Boost-Label, Refund-Modell B, Gate-Mechanik, Bestätigungsrollen beim Upload); Korrekturen aus `korrekturen-und-umsetzungsauftrag-2026-10-12.md` übernommen. Führende Aufgabenkennungen sind RP-01 bis RP-12 und BN-01 bis BN-09 aus dieser Datei; die U-Nummern in Abschnitt 11 verweisen darauf. Rechtliche Aussagen sind Einordnungen mit Begründung, keine Rechtsberatung. Jede Position ist so formuliert, dass der Anwalt sie bestätigen oder mit einem Satz kippen kann. + +--- + +## 0. Wie dieses Dokument zu lesen ist + +Jede Frage bekommt eine von drei Einstufungen: + +| Einstufung | Bedeutung | +|---|---| +| **G** Geschäftsentscheidung | Du entscheidest. Der Anwalt bekommt sie als Information, nicht als Frage. | +| **R+** Rechtliche Einordnung mit Default | Ich habe eine begründete Position. Der Anwalt bestätigt sie oder widerspricht. Bis dahin wird nach dem Default gebaut. | +| **R** Echte Rechtsfrage | Bleibt offen. Ich nenne meine Lesart und das Risiko, aber die Antwort entscheidet, was gebaut wird. | + +Betreiberangaben vom 12.10.2026, auf denen dieses Dokument aufbaut: + +1. AVV: Hetzner und ALL-INKL liegen vor. Cloudflare (Turnstile) und Stripe sind über deren Standardbedingungen abgedeckt. OpenAI: API über OpenAI Ireland mit DPA. *(Korrektur 13.10.2026: Zero Data Retention ist für das Konto derzeit nicht verfügbar; es gilt die Standardspeicherung von bis zu 30 Tagen. Alle Verträge bestehen seit vor dem Go-Live; die Belege in `nachweise/` sind Neuausfertigungen vom 13.10.2026.)* +2. Die Admin-Konten `@me.com` und `@stern-consulting.eu` sind Altbestände. Einziges aktives Admin-Konto ist das Betriebskonto unter `@pressekonto.com` (Betreiberangabe 13.10.2026). Ablauf der Bereinigung: `nachweise/bn-02-ablauf.md`. +3. Zustimmungsgate (S12): seit 28.09.2026 mit Deploy 1b live, aber ausgeschaltet (`LEGAL_ACCEPTANCE_GATE=false`). Einschalten mit Deploy 3 zusammen mit AGB 0.7. Die Alt-API (`/service/…`, connektar) prüft das Gate nicht. +4. Go-Live-Mails im Juli: nicht an alle. Konten mit laufendem Abonnement erhielten eine Mail zu Bestandsschutz und Relaunch; Konten mit Anmeldung im letzten Jahr eine Info-Mail zum Relaunch; beide mit Abmeldelink. + +--- + +## 1. Was sich gegenüber dem Paket vom 09.10. ändert + +| Bereich | Vorher | Jetzt | +|---|---|---| +| Aktivitätsverlauf | 395 Tage einheitlich | Anmelde- und Fehlversuchsereignisse 90 Tage, übrige Ereignisse 395 Tage, API 90 Tage (E4) | +| Letzte Anmelde-IP | Überschrieben, keine Frist | Zusätzlich Löschung 90 Tage nach letzter Anmeldung (E3) | +| Legal Hold | Frist startet nach Aufhebung neu | Kein Neustart; reguläre Frist bleibt, neue Frist nur mit dokumentiertem Grund (E6) | +| Archiv-Restdaten | Tombstone mit Akteur und Vermerken | Nur Kennungen, Zeitpunkte, Hash; Zugriffsprotokoll 395 Tage (E7) | +| Archivdatensatz | Drei verschiedene Beschreibungen | Ein Datensatz, in DSE, Paket und Abwägung gleich (Abschnitt 4.4) | +| Fehlerprotokoll | Absolute Zusage „keine Namen, IPs, Formularinhalte“ | Enger formuliert, Transportlogs getrennt genannt (F2) | +| KI-Anbieter in DSE 10/8 | OpenAI, Gemini, Anthropic | Nur OpenAI; Standardspeicherung bis 30 Tage, keine Zero Data Retention (Korrektur 13.10.2026) | +| Alt-API KI-Angabe | Setzt „ohne KI“ im Namen des Kunden | `not_declared`, keine Erklärung ohne Erklärenden (A6) | +| Boost-Label | „Top-Platzierung“ | „Gebuchte Platzierung“ mit Erklärung (Abschnitt 6) | +| AGB § 6 Abs. 2 | Kennt nur Startseiten-Boost | Kategorie-Boost und Kennzeichnung ergänzt (A1) | +| Umami Kundenbereich, KI-Bildprüfung, Newsletter | Fragen im Paket | Aus dem Paket herausgenommen, als spätere Aktivierungen mit eigener Checkliste (F6, F9, F7) | +| Portal-DSE Abschnitt 7 | „15 Minuten“ | Zwei Fristen: Zugangslink 15 Minuten, Meldebestätigungslink 72 Stunden; Link-Datensätze 30 Tage nach Verbrauch gelöscht | +| Archivdatensatz Ist/Ziel | „Vorgangsnummer statt Antragsteller-E-Mail“ als Ist | Heute enthält das Archiv die Antragsteller-E-Mail und liest Firma/Einreicher zum Archivierungszeitpunkt; beides wird Ziel, versiegelte Pakete bekommen eine Migrationsentscheidung | +| Gate-Mechanik | „Mit der Verlängerung gilt 0.7“ | Keine Umstellung ohne Zustimmung; Alt-Credits und laufende Abos ohne Gate; Umstellung nur per Änderungskündigung | +| Self-Service-Bilder | Pressekontakt bestätigt „handelnd für Firma“ | Bild-Upload im Self-Service nur mit Konto | +| Legal Hold | nur Löschstopp | Sperre und Einschränkung nach Art. 18 getrennt, Prüfdatum 90 Tage | + +--- + +## 2. Fragen F1 bis F11 + +### F1 Nummerierung je Host · **G** + +**Entscheidung:** Beide Hosts bekommen die Bild-Abschnitte als eigene Abschnitte direkt hinter „Automatisierte Inhaltsprüfung“ (Hub: nach 10, Portale: nach 8). Die Nummern bleiben je Host unterschiedlich; Querverweise im Text nennen den Abschnittstitel, nicht die Nummer, und jeder Abschnitt bekommt einen stabilen Anker (`#bilder`, `#beweisarchiv`, `#fehlerprotokoll`, `#kontosicherheit`). + +**Begründung:** Eine Vereinheitlichung der Nummern würde die bestehenden Hub-Abschnitte 7 bis 9 verschieben, ohne rechtlichen Gewinn. Transparenz verlangt Auffindbarkeit, nicht gleiche Ziffern. + +**Umsetzung:** Anker im Template; „Abschnitt 9b“ in allen Entwürfen durch „Abschnitt Beweisarchiv“ ersetzen. + +### F2 Fehlerprotokoll ohne Einwilligung · **R+** + +**Position:** Serverseitig Art. 6 Abs. 1 lit. f, ohne weitere Voraussetzungen. Browserseitig zusätzlich § 25 Abs. 2 Nr. 2 TDDDG, weil das Fehler-SDK Informationen aus dem Endgerät ausliest (Stack, URL, Browserkennung) und überträgt. Die Ausnahme trägt nur, wenn das Skript erst im Fehlerfall lädt, nichts im Endgerät speichert, keine Sitzung verfolgt und der Datensatz auf das Technische begrenzt ist. Das ist der heutige Stand; er muss so bleiben. + +**Warum nicht einfach „Ja“:** Die Aufsicht legt „Zugriff auf Informationen im Endgerät“ weit aus (EDSA-Leitlinien 2/2023). Die Rechtfertigung hängt an der Minimierung, nicht an der Cookielosigkeit. + +**Textänderung (3a):** Die absolute Zusage wird ersetzt. Neu: + +> IP-Adressen, Cookies, Formulareingaben und Inhalte von Anfragen werden nicht in den Fehlerbericht aufgenommen; E-Mail-Adressen in Fehlertexten werden vor der Übermittlung ersetzt. Technische Freitexte eines Fehlers können im Einzelfall weitere Angaben enthalten; wir werten Fehlerberichte ausschließlich zur Fehlerbehebung aus. Übermittelt Ihr Browser einen Bericht, sieht der Fehlerserver wie jeder Webserver die Verbindungsdaten Ihres Browsers; für diese Verbindungsdaten gelten die Fristen aus Abschnitt 3 (14 Tage). + +**Umsetzung vor 0.4:** Scrubber nach K7 nachschärfen (freigegebene Query-Werte prüfen, keine Objektinhalte als Fehlertext), GlitchTip-Instanz auf 90 Tage Aufbewahrung belegen, Proxy-Logs des Fehlerservers auf 14 Tage. + +### F3 Aktivitätsverlauf · **G**, Verhältnismäßigkeit **R+** + +**Entscheidung (E4):** + +| Ereignisart | Frist | Begründung | +|---|---|---| +| Anmeldungen, Fehlversuche, Sperren bekannter Konten | 90 Tage | Sicherheitszweck ist nach drei Monaten erfüllt; Vorfälle werden einzeln länger gehalten (Vermerk) | +| Tagessummen fehlgeschlagener Anmeldungen (unbekannte Adressen) | 90 Tage | wie oben | +| Registrierungen, Statuswechsel, Anfragen, Administratorhandlungen | 395 Tage | Support, Nachvollziehbarkeit von Vorgängen über ein Jahr plus Monat | +| Mailversand mit Empfänger und Betreff, auch an Nichtkunden | 395 Tage | Nachweis, dass und wann eine Benachrichtigung ging; Beschwerden kommen oft Monate später | +| API-Zugriffsprotokoll | 90 Tage | Betrieb und Abrechnungsnachweis; Rechnungen selbst liegen woanders | + +Zugriff: nach Löschung der zwei Altkonten nur noch `@pressekonto.com` und Betreiber. Keine eigene Berechtigungsstufe nötig, solange es zwei Konten sind. + +**Für den Anwalt:** Die 395 Tage für Mail-Einträge zu Nichtkunden (5.007 von 7.642 Einträgen betreffen Pressekontakte ohne Konto) sind der einzige Punkt, bei dem ich eine Bestätigung will. Mein Argument: Es ist der Nachweis einer Benachrichtigung, die ihrerseits lit. f gestützt ist; ohne Protokoll könnte das Portal auf „Sie haben mich nie informiert“ nichts erwidern. + +**Umsetzung:** `prunable()` je Ereignistyp (U4); Textentwurf 7b wird angepasst (Abschnitt 8). + +### F4 IP-Adresse der letzten Anmeldung · **R+** + +**Position:** Vertretbar unter lit. b und f. Die Anzeige der letzten Anmeldung mit IP ist eine anerkannte Sicherheitsfunktion; eine gekürzte IP wäre für den Kunden nicht wiedererkennbar und damit nutzlos. Ergänzung (E3): Löschung 90 Tage nach der letzten Anmeldung, damit inaktive Konten keine Klartext-IP über Jahre tragen. + +**Text (7a):** „… beides sehen Sie auf der Seite ‚Konto-Sicherheit‘. Die Angabe wird bei jeder Anmeldung überschrieben und 90 Tage nach Ihrer letzten Anmeldung gelöscht.“ + +**Umsetzung:** U1. + +### F5 Sperrliste, Rohmails, Rechtsgrundlage · **R+** + +**Entscheidung (E5):** Rohmails im Rückläufer-Postfach 90 Tage (alle Ordner: `Processed`, `Ignored`, `Unparsed`). Ausgewertete Zustellmeldungen 395 Tage. Sperrliste zweckgebunden ohne feste Frist. + +**Rechtsgrundlage, aufgelöst:** Das Paket war an dieser Stelle unentschieden (D4 nennt lit. c, F5 sagt lit. f genügt). Ich trenne nach Sperrgrund: + +| Sperrgrund | Grundlage | +|---|---| +| Dauerhaft unzustellbar (Hard Bounce) | lit. f: Schutz der Zustellbarkeit und Reputation | +| Abmeldung / Widerspruch | lit. f, zusätzlich lit. c in Verbindung mit Art. 21 Abs. 3 DSGVO und § 7 Abs. 3 Nr. 4 UWG: die Beachtung des Widerspruchs ist eine Pflicht, die ohne die Adresse nicht erfüllbar ist | + +**Zwei Präzisierungen, die die Auswertung gefunden hat:** (1) „keine Mails mehr“ stimmt nicht; selbst angeforderte Anmeldelinks gehen weiterhin. Text: „keine Benachrichtigungen mehr; von Ihnen selbst angeforderte Anmeldelinks bleiben möglich“. Nur der Anmeldelink ist heute von der Abmeldesperre ausgenommen; der Meldebestätigungslink ist eine andere Mailklasse. Erweiterung auf angeforderte Bestätigungen als eigene Versandregel (RP-08). Link-Datensätze werden 30 Tage nach Verbrauch oder Ablauf gelöscht, das gehört in Abschnitt 13. (2) Entsperrung: auf Anfrage an info@pressekonto.com, Hard-Bounce-Sperren zusätzlich bei nachgewiesener Zustellbarkeit. + +**Option, keine Pflicht:** Sperrliste als HMAC der normalisierten Adresse statt Klartext. Abgleich beim Versand über denselben HMAC, Entsperrung über die vom Nutzer genannte Adresse. Datenminimierung ohne Funktionsverlust. Phase 2. + +**Umsetzung:** U5; Text 12a angepasst (Abschnitt 8). + +### F6 Webanalyse im Kundenbereich · **G** + +**Entscheidung:** Bleibt aus (`UMAMI_PORTAL_ENABLED=false`, `UMAMI_IDENTIFY_USERS=false`). Aus dem Paket herausgenommen. Der Satz „Es werden keine Nutzerprofile erstellt“ bleibt richtig. Der Textentwurf „5 Ergänzung Webanalyse im Kundenbereich“ entfällt in 0.4. + +**Falls später gewünscht,** Aktivierungsbedingungen: Nutzer-ID nur als HMAC, nicht `user-`; Widerspruchsschalter im Konto; eigener DSE-Absatz; Rohdatenfrist der Instanz auf 13 Monate. Grundlage dann lit. f mit Widerspruch, keine Einwilligung nötig, solange keine Zusammenführung mit anderen Daten erfolgt. + +**Nebenbefund:** Für die Umami-Instanz auch heute eine Rohdatenfrist einstellen (13 Monate, passend zu 5a). Betriebsaufgabe, kein DSE-Thema. + +### F7 Newsletter und Altkonten · **G**, § 7 Abs. 3 UWG **R+** + +**Entscheidung:** Nur Opt-in. Doppelte Bestätigung per E-Mail. Protokoll je Einwilligung: Zeitpunkt, Adresse, Fassung des Einwilligungstextes, Quelle (Kontoschalter, Formular), Bestätigungszeitpunkt, Widerruf. Keine IP-Adresse; die Bestätigung über den Link ist der Nachweis. `CampaignRecipients` muss auf nachgewiesene Einwilligung umgestellt werden, bevor die Sperre fällt (U-Aufgabe, eigenes Paket). + +**§ 7 Abs. 3 UWG für die Altkonten:** Nein, aus drei Gründen. Die Ausnahme setzt eine Adresse voraus, die im Zusammenhang mit dem Verkauf einer Ware oder Dienstleistung erhoben wurde; über 99 Prozent der 66.368 Altkonten haben nie etwas gekauft. Für die 445 zahlenden Konten müsste bei der Erhebung auf das Widerspruchsrecht hingewiesen worden sein; die alte Datenschutzerklärung liegt nicht vor, der Nachweis ist nicht führbar. Und die Werbung müsste für ähnliche Leistungen sein; ein Relaunch-Newsletter eines neuen Angebots ist das für ein 2012 angelegtes Gratiskonto kaum. + +**Die Juli-Mails sind nach deiner Beschreibung in Ordnung, die Texte müssen das bestätigen:** Mails an Abonnenten zu Bestandsschutz und Relaunch sind Vertragsinformation (lit. b). Die Info-Mail an Konten mit Anmeldung im letzten Jahr ist eine Mitteilung über die Änderung eines Dienstes, den die Empfänger nutzen (Nutzungsverhältnis des Kontos), keine Werbung, solange sie keine Angebote bewarb. Beide hatten Abmeldelinks. Beide Mailtexte mit Versanddatum und Empfängerregel in den Rechtsordner legen; das ist der Nachweis, falls jemand fragt. + +### F8 Turnstile · **R+** + +**Position:** lit. f plus § 25 Abs. 2 Nr. 2 TDDDG trägt für Bot-Schutz an Formularen, die Missbrauch auslösen können (Mailversand an fremde Adressen). Stärker als bei reCAPTCHA, weil Cloudflare für Turnstile keine Werbeprofile bildet. Drittland: Cloudflare, Inc. ist unter dem EU-US DPF zertifiziert; Status vor Versand auf dataprivacyframework.gov prüfen und das Datum notieren. + +**Textänderungen (6a):** + +- Ergänzen: „Bei der Prüfung übermittelt auch unser Server die IP-Adresse, von der das Formular gesendet wurde, an Cloudflare, damit das Ergebnis der Prüfung dieser Anfrage zugeordnet werden kann.“ +- Ergänzen: „Ist der Dienst nicht erreichbar, nehmen wir die Eingabe an und prüfen sie intern auf Missbrauch.“ +- Formularliste erweiterbar formulieren: „im Kontaktformular, bei der Registrierung und in weiteren Formularen, die Missbrauch auslösen können (zum Beispiel Melde-, Widerrufs- und Kündigungsformular)“. Dann muss 6a bei Roadmap 4.4 nicht angefasst werden. + +### F9 KI-Vorabprüfung von Bildern · **G**, Aktivierungsbedingungen **R** + +**Entscheidung:** Bleibt aus. Aus dem Paket herausgenommen. Entwurf „9a Ergänzung KI-Vorabprüfung“ entfällt in 0.4. + +**Was vor einer Aktivierung feststehen muss** (Checkliste, dem Anwalt als spätere Frage): + +| Punkt | Stand | Offen | +|---|---|---| +| Vertragspartner | OpenAI Ireland Ltd. | Bestätigung in den Organisationseinstellungen | +| AVV | Online-DPA von OpenAI | Abschlussdatum notieren | +| Speicherung beim Anbieter | Keine Zero Data Retention (derzeit nicht beantragbar, Stand 13.10.2026); Standardspeicherung bis 30 Tage | Vor Aktivierung erneut prüfen, ob ZDR verfügbar ist und auch für Bildeingaben gilt | +| Drittlandübermittlung | Keine EU-Datenresidenz (`api.openai.com`) | SCC laut DPA Ziff. 4 | +| Art. 9 | Prüfung „Person erkennbar ja/nein“ ist keine biometrische Verarbeitung (kein Template, keine Identifizierung) | Bilder können zufällig besondere Kategorien zeigen; Grundlage dann Art. 9 Abs. 2 lit. f (Rechtsverteidigung) oder lit. e (vom Betroffenen veröffentlicht), Einzelfall | +| DSFA | Keine Pflicht nach DSK-Muss-Liste (keine Bewertung persönlicher Aspekte, keine Überwachung) | Kurze Schwellwertprüfung dokumentieren | +| Art. 22 | Automatische Ablehnung betrifft ein Bild, keine Person; Weg zum Menschen offen | nichts | + +**Frage an den Anwalt:** Genügen AVV, Standardspeicherung von bis zu 30 Tagen, Minimierung und die dokumentierte Schwellwertprüfung, oder will er eine förmliche DSFA? + +### F10 Art. 50 KI-VO für Portal-Updates · **R+** (zusammen mit A6) + +**Rechtslage:** Art. 50 gilt seit dem 2. August 2026. Abs. 4 Satz 2 verpflichtet Betreiber, die KI-generierten Text veröffentlichen, um die Öffentlichkeit über Angelegenheiten von öffentlichem Interesse zu informieren, zur Offenlegung; ausgenommen, wenn der Text einer menschlichen Überprüfung oder redaktionellen Kontrolle unterlag und eine Person die redaktionelle Verantwortung trägt. + +**Position für Portal-Updates:** Produkt-Changelogs sind schon keine „Angelegenheiten von öffentlichem Interesse“. Unabhängig davon greift die Ausnahme, wenn die Überarbeitung belegbar ist. Beides zusammen reicht. + +**Entscheidung, damit es belegbar ist:** Pro Artikel speichern: KI-Entwurf, veröffentlichte Fassung, Diff, Freigebender, Zeitpunkt. In der Rubrik „Pressekonto“ eine feste Zeile: „Artikel dieser Rubrik entstehen mit KI-Unterstützung und werden vor Veröffentlichung von Kevin Adametz geprüft und freigegeben.“ Das ist keine Pflicht, passt aber zu Anti-Zombie und kostet nichts. Modell: `OPENAI_MODEL` wie bei den Prüfungen. + +**Was nicht geht:** Die Ausnahme auf Kundenmeldungen übertragen. Dort ist der Kunde Betreiber im Sinne der KI-VO; das Portal zeigt seine Erklärung an (siehe A6). + +### F11 Versionierung der DSE · **G** + +**Entscheidung:** Fassung 0.4 mit Datum und einem Änderungshinweis am Ende, der die Ergänzungen seit 0.3 auflistet (5a vom 21.09., 6a vom 09.10., die Abschnitte aus 0.4). Jede Fassung bleibt unter einer festen URL abrufbar (`/datenschutz/v0.3`). Eine DSE-Änderung braucht keine Zustimmung; das Gate gilt nur für AGB und Richtlinien. + +--- + +## 3. Anwaltsagenda A1 bis A7 + +### A1 AGB-Konsistenz § 8a und § 9 · **R** + +**Meine Lesart:** Die Texte aus dem Decision-Update halten im B2B nach § 307. + +- § 8a Abs. 5 verweist auf die verschuldensabhängige Freistellung in § 8 Abs. 2. Das ist die sichere Variante; eine verschuldensunabhängige Freistellung in AGB wäre angreifbar. +- § 9 Abs. 1a (Feeds, Open Graph): Die Vervielfältigung durch soziale Netzwerke beim Teilen stützt sich ohnehin auf die stillschweigende Einwilligung dessen, der Inhalte ohne technische Sperre ins Netz stellt (BGH, Vorschaubilder). Abs. 1a macht das ausdrücklich. Der Konflikt mit Abs. 2 ist durch den letzten Satz gelöst. +- „Wahrung der wesentlichen Bildaussage“: Zuschnitte für Vorschauen und ein Nachweisbalken sind Änderungen, die der Urheber nach § 39 Abs. 2 UrhG nach Treu und Glauben nicht versagen kann. Reicht. +- § 9 Abs. 4: Die nichtöffentliche Speicherung zur Beweissicherung nach Ende der Veröffentlichung ist eine Vervielfältigung und braucht die Einräumung. Ist drin. + +**Zwei kleine Ergänzungen für 0.7:** + +1. § 8a Abs. 1 Satz 1: „… einschließlich des Rechts, dem Anbieter die Nutzungen und Bearbeitungen nach § 9 einzuräumen.“ (Der Kunde ist oft nicht der Urheber; seine Lizenz muss Bearbeitungen decken.) +2. § 6 Abs. 2 Boost: Kategorie-Boost aufnehmen und die Kennzeichnung festschreiben. Textvorschlag in Abschnitt 6. + +**Frage an den Anwalt bleibt:** Gesamtfreigabe § 8a, § 9 Abs. 1, 1a, 2, 4 und § 6 Abs. 2 neu. + +### A2 Hoster-Status und UrhDaG · **R** + +**Meine Lesart:** Hoster-Status nach Art. 6 DSA bleibt erhalten. Automatisierte Vorprüfung (Spam, Kategorie, formale Qualität) ist freiwillige Untersuchung nach Art. 7 DSA. Kein Zu-eigen-Machen, solange keine inhaltliche Bearbeitung und keine Darstellung als eigener Inhalt. Die Verantwortlich-Zeile am Bild stützt das. + +**Zwei Dinge, die der Anwalt sehen muss:** + +1. **DSE Abschnitt 9 (Portale) beruft sich auf das Medienprivileg** (Art. 85 DSGVO, § 57 MStV). Das steht in Spannung zu A2: Wer Hoster ohne redaktionelle Bearbeitung ist, hat Mühe, journalistisch-redaktionelle Zwecke zu reklamieren. Die DSE formuliert mit „soweit“, das ist richtig. Meine Empfehlung: Wortlaut behalten, im Einzelfall nie allein auf das Medienprivileg stützen (das Löschanfragen-Handover sagt das in Säule 3 bereits). Frage: Hält der Anwalt den Absatz in dieser Hedge-Form für unschädlich, oder soll er auf „Archivfunktion und Informationsfreiheit, Art. 17 Abs. 3 lit. a“ umgestellt werden? +2. **„Redaktionelle Qualität“** steht in AGB § 4 Abs. 4 und § 7 Abs. 1. In 0.7 durch „Qualität und Lesbarkeit der Portale“ ersetzen (S10). + +**UrhDaG-Vermerk (3.9):** Tragfähig. Nr. 4 ist das entscheidende Merkmal: Pressemitteilungen sind zur freien Weiterverbreitung bestimmt; es gibt keinen Lizenzmarkt, mit dem das Portal um Publikum konkurriert. Der Status als kleiner Diensteanbieter (§ 2 Abs. 3, Umsatz unter 1 Mio. Euro) reduziert nur einzelne Pflichten; er ist keine Freistellung vom UrhDaG und wird nicht als Sicherheitsnetz geführt. + +### A3 Vertretung und Regress · **R+** + +**Position:** Kontoinhaber als Vertragspartner (§ 8a Abs. 1 Satz 2) ist sauber; eine Agentur bindet sich selbst, Vertretungsmachtfragen entfallen. Rückgriff läuft gegen den Kontoinhaber. + +**Wer die Bildrechte bestätigt, je Einreichungsweg (bestätigt 12.10.2026):** Es bestätigt, wer vertraglich gebunden ist. Der Admin bestätigt nie. Gibt es niemanden, der gebunden und erreichbar ist, gibt es kein Bild. + +| Weg | Vertragspartner des Portals | Wer bestätigt | Admin-Upload (E10) | +|---|---|---|---| +| Hub-Formular | Kontoinhaber | Kontoinhaber beim Upload | Bestätigungs-Magic-Link an die Konto-E-Mail | +| API v1 mit eigenem Konto | Kontoinhaber (Token-Inhaber) | per `rights_confirmed` im Namen des Kontos | Link an die Konto-E-Mail | +| API über Verteiler oder Agentur (connektar, openPR) | der Partner, nicht dessen Kunde (§ 8a Abs. 1 Satz 2, Syndikationsvertrag § 2) | Partner per `rights_confirmed` | Kein Admin-Upload. Bilder zu Partnermeldungen nur über die API (S22). Der Pressekontakt ist kein Vertragspartner und hat meist keine Vertretungsmacht. | +| Syndizierte Meldung, Pressekontakt wünscht nachträglich ein Bild | niemand, bis ein Konto angelegt ist | Bild-Upload im Self-Service nur mit Konto (entschieden 13.10.2026): Der Pressekontakt legt ein Konto an, nimmt AGB und Unternehmerbestätigung an und bestätigt dann als Kontoinhaber. Kontaktdaten ändern bleibt ohne Konto möglich. | Kein Admin-Upload. Anscheinsvollmacht wird nicht als Standardannahme eingebaut. | +| Altbestand ohne Konto und ohne Partner | niemand, bis ein Konto angelegt ist | wie vorherige Zeile | wie vorherige Zeile | + +Das Bestätigungsprotokoll speichert heute Konto, Tokenkennung und Kanal (`form`, `api`, `magic_link`); das sind keine rechtlichen Rollen. Ziel (RP-05): zusätzlich die Rolle des Erklärenden (Kontoinhaber oder Partner-API), den Vertragspartner und die angenommenen Dokumentfassungen als unveränderlichen Nachweis zum Einreichungszeitpunkt. + +**API:** `rights_confirmed` plus `confirm_text_version` je Upload, plus Annahme der AGB-Fassung über den Gate-Endpunkt (existiert). Für die Alt-API siehe A6 und Abschnitt 7 (Syndikationsvertrag): dort bindet der Vertrag den Partner. + +**Frage an den Anwalt:** Reicht die Kette Konto, Gate-Annahme, Upload-Bestätigung, Protokoll für den Regress, oder fehlt aus seiner Sicht ein Glied? + +### A4 Beweisarchiv · **R** (Rahmen), Einzelentscheidungen **G** + +Entscheidungen nach E6 bis E8, konkretisiert: + +| Punkt | Entscheidung | +|---|---| +| Standardfrist | Drei Jahre nach Ende des Jahres der Entfernung, für alle Ereignistypen. Begründung je Typ in der Abwägung (4.4). Der Anwalt kann einzelne Typen kürzen. | +| Legal Hold | Kein Neustart. `retain_until` bleibt. Beim Setzen: Anspruch, Datenumfang, Verantwortlicher, Prüfdatum (spätestens 90 Tage), bekanntes Enddatum. Bei Aufhebung zwei Wege: Löschung zum regulären Datum, oder neues Enddatum mit Pflichtvermerk. Codeänderung in `releaseLegalHold()`. | +| Einschränkung (Art. 18) | Getrennt vom Hold: Markierung sperrt normalen Abruf und Export; Ausnahmeverwendung nur mit Berechtigung, Zweck und Grundlage; Aufhebung nur nach Prüfung und Information des Betroffenen. Ein Löschstopp allein bildet Art. 18 nicht ab. | +| Restdaten nach Löschung | `id`, Objektschlüssel (`payload_path` oder stabiler opaker Schlüssel, ohne Namen im Pfad; ohne ihn funktioniert der Restore-Abgleich nicht), `subject_type`, `subject_id` (für Auskünfte nach Art. 15), `event`, `created_at`, `deleted_at`, `payload_hash`, Schemaversion, Sicherungsstatus. Akteur, Grund-Freitext, Hold-Vermerke, Verweise auf Rechtsvorgänge werden mit dem Payload entfernt. Frist: später von 395 Tagen nach Löschung und 14 Tagen nach Ablauf der letzten rückspielbaren Sicherung. | +| Zugriffsprotokoll | 395 Tage ab Zugriff, danach gelöscht. Nicht an die Lebensdauer des Eintrags gekoppelt. | +| Originaldatei | Unverändert, verschlüsselt, mit allen Metadaten. GPS und Seriennummern werden nicht ausgewertet; sie sind Teil der Beweisdatei. Eine Kürzung würde die Datei verändern und den Hash entwerten. Restrisiko dokumentiert. | +| Kontaktdaten | Pressekontakte im zuletzt veröffentlichten Stand: ja (sie waren öffentlich). Einreicher: Konto-ID, Name, E-Mail, Firma zum Zeitpunkt der Einreichung: ja (Rückgriff; das Konto kann später gelöscht sein). Keine weiteren Kontodaten. | +| Antragsteller im Meldeverfahren | Ziel: nicht im Archiv, nur Vorgangsnummer; die E-Mail bleibt im Meldevorgang (DSE 11, drei Jahre). Ist: `legalRequestBlock()` schreibt die E-Mail heute mit, und Firma/Einreicher werden zum Archivierungszeitpunkt gelesen. Neue Einreichungen bekommen einen unveränderlichen Einreichungsnachweis; versiegelte Altpakete werden inventarisiert, Migration (minimierte Nachfolgefassung mit Integritätsnachweis) oder befristete Übergangsaufbewahrung nach Anwaltsantwort (Frage 3). | +| Sensible Bildinhalte | Grundlage für die Aufbewahrung ist Art. 6 Abs. 1 lit. f und, soweit ein Bild besondere Kategorien zeigt, Art. 9 Abs. 2 lit. f (Rechtsverteidigung). Der Kunde hat das Bild veröffentlicht; das Portal bewahrt es nichtöffentlich auf. | +| Art. 17 Abs. 3 lit. e | Keine pauschale Ablehnung „weil Frist läuft“. Je Löschantrag ein kurzer Vermerk: welcher Anspruch, wessen, warum noch möglich. Vorlage in Abschnitt 4. | +| Backups | 14 Tage. Vor 0.4: alte Deploy- und Migrationskopien (Roadmap 1.5) prüfen und bereinigen, sonst stimmt die Zusage nicht. | +| Restore | Der Satz „bereits gelöschte Einträge werden erneut entfernt“ bleibt, aber erst nach Übung und mit unabhängigem Löschstand (RP-04). Verfahren: Löschauftrag mit Objektschlüssel vor der Entfernung, idempotente Übertragung an einen getrennt wiederherstellbaren Speicher mit Bestätigung, dann Löschung inklusive Derivate; bei Ausfall des Ziels Auftrag und Sperre halten und alarmieren; beim Restore Anwendung isoliert, Löschstand importieren, Altobjekte entfernen, dann freigeben. Szenarien: DB alt, Disk alt, beide alt, externes Ziel nicht erreichbar, Löschung zwischen zwei Exporten. | + +**Fragen an den Anwalt:** Pauschale Drei-Jahres-Frist je Typ, Original mit Metadaten, Art. 9 Abs. 2 lit. f als Grundlage für sensible Bildinhalte, Abwägung in der korrigierten Fassung. + +### A5 Einbeziehung AGB 0.7 · **R** („Später“-Pfad entschieden 12.10.2026) + +**Mechanik:** Gate mit aktivem Klick je Dokumentfassung vor jeder Einreichung. Das genügt § 305 Abs. 2 BGB und erst recht § 310 Abs. 1 im B2B. + +**Das Problem, das das Gate allein nicht löst:** § 15 Abs. 3 der AGB sagt, bei Ablehnung wesentlicher Änderungen läuft der Vertrag zu alten Bedingungen weiter. Ein Abonnent, der 0.7 ablehnt, hat dann weiterhin Anspruch auf seine Slots. Blockiert das Gate seine Einreichung, verweigert das Portal eine bezahlte Leistung. Anti-Zombie-Verstoß und Vertragsbruch. + +**Entscheidung (korrigiert 13.10.2026):** Das Gate steht vor jedem neuen Kauf (Einzelveröffentlichung, Credit-Paket, neues Abonnement). Bereits bezahlte Leistungen bleiben ohne neue Zustimmung nutzbar: Abonnenten mit laufender Laufzeit und Konten mit vor 0.7 gekauften Credits bekommen „Später entscheiden“ und reichen unter 0.6 ein (die Bildbestätigung verweist dann auf § 8 und § 9 der 0.6; Rechte und Freistellung sind dort geregelt). „Später“ erzeugt keinen Annahmedatensatz. Welche Credits alt sind, ergibt sich aus dem bestehenden FIFO (§ 5 Abs. 5): Solange Alt-Credits im Bestand sind, kein Gate; der erste Kauf nach 0.7 verlangt die Annahme. Keine eigene Buchhaltung je Kaufcharge. + +**Was nicht geht, und was ich zuerst falsch hatte:** „Mit der Verlängerung gilt 0.7“ wäre eine einseitige Umstellung. Die automatische Verlängerung nach § 11 Abs. 2 setzt denselben Vertrag fort, und § 15 Abs. 3 sagt ausdrücklich, dass der Vertrag ohne Zustimmung zu alten Bedingungen weiterläuft. Der Hebel für Abonnenten, die nicht zustimmen, ist die Änderungskündigung: ordentliche Kündigung zum Laufzeitende mit gleichzeitigem Angebot eines neuen Vertrags unter 0.7. Ob und wann du den ziehst, ist eine Geschäftsentscheidung; die Mechanik prüft der Anwalt (Frage 2). + +**Nebenbefund:** Richtlinien 0.2 gelten seit 22.09. in der Datenbank, das Gate ist aus. Kunden, die seitdem eingereicht haben, haben 0.2 nie angenommen. Beim Einschalten holen sie beide Fassungen nach; das ist so gewollt und unproblematisch, weil die Richtlinien Bestandteil der AGB sind (§ 2) und 0.2 keine neuen Pflichten enthält [vom Betreiber zu bestätigen]. + +**Frage an den Anwalt:** Trägt die Bestandsschutzlösung (Abos, Alt-Credits) die bestehende Vertragslage? Ist die Änderungskündigung der richtige Weg, mit welcher Mitteilung und Frist? Gilt die Anerkennung über den Bild-Schalter zusätzlich als wirksame Erklärung? + +### A6 Art. 50 KI-VO und Kundenmeldungen · **R+** + +**Position:** Das Portal wird durch die eigene Kennzeichnung nicht zum Mitbetreiber. „Betreiber“ nach Art. 3 Nr. 4 ist, wer ein KI-System in eigener Verantwortung verwendet. Das Portal verwendet beim Setzen der Kennzeichnung kein KI-System; es liest signierte Herkunftsdaten und zeigt die Erklärung des Kunden an. Die Pflicht aus Art. 50 Abs. 4 trifft den Kunden. Der Korrekturweg (§ 8a Abs. 4) deckt das Restrisiko einer falschen Kennzeichnung. + +**Der eigentliche Punkt ist die Alt-API.** Sie setzt heute bei Texten „ohne KI“ und speichert das als Erklärung des Kunden. Das ist eine Erklärung, die niemand abgegeben hat. Wer später behauptet, das Portal habe KI-Inhalte wissentlich unmarkiert gelassen, findet hier einen Ansatz. Entscheidung: Alt-API speichert `not_declared`, keine Kennzeichnung, kein Haken „bestätigt“. Mit dem connektar-Termin im Oktober wird `ai_declaration` Pflichtfeld und der Syndikationsvertrag weist die Erklärung dem Partner zu. Bis dahin ist `not_declared` die ehrliche Zwischenlösung. + +**Ergänzung AGB 0.7, § 8 Abs. 1, neuer Spiegelstrich:** „seine Angaben zur Erstellung mit KI zutreffend sind; eigene Pflichten des Kunden aus der Verordnung (EU) 2024/1689 bleiben unberührt.“ (Für Bilder steht das in § 8a Abs. 4; für Texte fehlt es.) + +**Anzeige:** Der Hinweiskasten „Nach Angaben des einreichenden Unternehmens …“ ist richtig formuliert: Stimme des Kunden, nicht des Portals. + +### A7 Gesamtpaket im Regressfall · **R+** + +**Die Kette steht:** Gate-Annahme (Fassung, Zeitpunkt) → Upload-Bestätigung (Textfassung, AGB-Fassung, Konto, Firma, Zeitpunkt, IP-HMAC, UA) → Original mit Hash → veröffentlichte Fassung → Archiv mit Hash. + +**Was ich ergänzen würde:** + +1. **Integritätsnachweis über die Zeit:** Täglicher Export der Payload-Hashes an den externen Speicher aus B4 (derselbe, der den Tombstone-Stand trägt). Dann lässt sich belegen, dass ein Archiveintrag seit Tag X unverändert ist. Aufwand gering, Beweiswert hoch. +2. **API-Nutzungsbedingungen** als eigenes Dokument in `legal_documents`, versioniert, Annahme über den Gate-Endpunkt gespeichert. Heute ist nur die Referenz geplant. +3. **Versicherung:** Eine Medien- oder Vermögensschadenhaftpflicht für Abmahnungen aus Kundeninhalten ist bei Presseportalen üblich. Geschäftsentscheidung, Angebot einholen; keine Rechtsfrage. + +**Frage an den Anwalt:** Fehlt aus seiner Sicht ein Glied? + +--- + +## 4. Die vier Fragen aus dem Löschanfragen-Handover + +### 1. Grenze unentgeltlich (Art. 17) gegen entgeltliche Depublikation · **R+** + +**Position:** Die Grenze ist die Person, nicht das Datenfeld. Übt eine natürliche Person ein Betroffenenrecht aus, ist alles, was zur Erfüllung nötig ist, kostenfrei (Art. 12 Abs. 5): Entfernung oder Pseudonymisierung ihrer Daten, und wenn danach nur ein sinnloser Rumpf bliebe, die ganze Mitteilung. Bleibt ein eigenständig zulässiges Reststück (Firmenmeldung ohne die Person), ist dessen Entfernung keine Erfüllung eines Betroffenenrechts mehr, sondern eine Leistung für das Unternehmen. Dafür darf ein Preis stehen. + +**Der Preis trägt**, wenn kumulativ: (a) kein Betroffenenrecht einer natürlichen Person betroffen ist, (b) ein kostenfreier Weg für das Betroffenenrecht besteht und funktioniert, (c) die Archivierung bei Vertragsschluss offengelegt war (§ 13 Abs. 1, Hinweis vor jeder Veröffentlichung). Alle drei sind heute erfüllt. B2B, keine Verbraucherkontrolle. + +**Frage an den Anwalt:** Bestätigung dieser Linie; Hinweis, falls er § 13 Abs. 1 („dauerhaft archiviert, Entfernung gegen Entgelt“) für § 307-anfällig hält. + +### 2. UWG-Bewertung des früher als kostenfrei beworbenen connektar-Wegs · **R+** + +**Position:** Die Aussage „Änderungen kostenfrei über connektar“ war irreführend (§ 5 Abs. 1 UWG), wenn der Weg praktisch nicht funktionierte. Der Weg existierte technisch, wurde aber nicht genutzt; die Aussage war also im Ergebnis falsch. Folgen: Die Aussage ist entfernt (Datum im Rechtsordner festhalten), kein Verweis mehr in Schreiben, keine proaktive Berichtigung nötig. Verjährung nach § 11 UWG: sechs Monate für Beseitigungs-, Unterlassungs- und Schadensersatzansprüche von Mitbewerbern und Verbänden, ein Jahr für Verbraucheransprüche nach § 9 Abs. 2; Verbraucher sind hier keine Kunden. Vertragliche Ansprüche von Geschäftskunden, die im Vertrauen auf die Aussage gehandelt haben, sind gesondert zu betrachten; bekannt ist kein Fall. Dokumentieren: Wortlaut, Zeitraum, Datum der Entfernung. Risiko: gering. + +### 3. Realnamen-Änderung: Betroffenenrecht oder kostenpflichtiger Edit · **R+** + +**Position:** Der Auslöser entscheidet. + +| Wer verlangt was | Einordnung | Kosten | +|---|---|---| +| Die genannte natürliche Person will ihren Namen raus oder ersetzt, selbst oder durch ein von ihr bevollmächtigtes Unternehmen | Art. 17 / Art. 21 | kostenfrei | +| Ehemaliger Mitarbeiter will seinen Namen aus Firmen-PM | Art. 17 | kostenfrei | +| Das Unternehmen will den Ansprechpartner aktualisieren (Person gewechselt) | Änderungssystem § 13 Abs. 3, „Aktualisierung von Kontaktdaten“ | kostenfrei nach heutiger Leistungsbeschreibung | +| Das Unternehmen will Text, Zitate, Bilder ändern | Inhaltliche Änderung, neuer Freigabelauf | kostenpflichtig | + +Grenzfall: Das Unternehmen will den Namen eines Dritten (etwa eines Kunden im Text) entfernen, ohne dass dieser es verlangt. Das ist ein Edit, kostenpflichtig. Verlangt es der Dritte selbst, kostenfrei. + +### 4. Art. 19 DSGVO in der Syndikation · **R+** + +**Position:** Jeder Verantwortliche benachrichtigt die Empfänger, denen er selbst Daten offengelegt hat. Das Portal hat an die Öffentlichkeit offengelegt; dafür gilt Art. 17 Abs. 2 (angemessene Maßnahmen, etwa Löschantrag bei Suchmaschinen). Partnerportale gibt es derzeit nicht; Feed-Abonnenten sind nicht identifizierbar, Art. 19 läuft dort leer („unmöglich oder unverhältnismäßig“). connektar als Verteiler hat an viele Portale offengelegt; Art. 19 trifft connektar für diese Empfänger. Das Portal ist nicht verpflichtet, flussaufwärts zu melden, sollte es aber vertraglich vereinbaren (Syndikationsvertrag, Abschnitt 7). Dem Betroffenen gegenüber: eigene Entfernung umsetzen, auf den Verteiler für die netzwerkweite Entfernung hinweisen, ohne das als Bedingung zu machen. + +--- + +## 5. Interessenabwägung: Korrekturen und geschlossene Punkte + +Die Abwägung wird in folgenden Punkten geändert; danach ist sie datier- und abzeichenbar. + +| Stelle | Änderung | +|---|---| +| Kopf | Verantwortlicher eintragen: adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld. In Kraft: Datum des Deploy 3. Nächste Prüfung: 12 Monate. | +| 1 Teil B Datensatz | Antragsteller-E-Mail streichen; „Verweis auf den Meldevorgang (Vorgangsnummer)“ | +| 1 Teil B Frist | „bis zu deren Abschluss“ ersetzen durch „bei dokumentierter Aufbewahrungssperre bis zu deren Aufhebung; die reguläre Frist läuft weiter, eine neue Frist nur mit dokumentiertem Grund“ | +| 1 Zugriffsprotokoll | Frist: 395 Tage ab Zugriff | +| 1 neu | Restdaten nach Löschung: Kennungen, Ereignistyp, Zeitpunkte, Hash; Frist: solange rückspielbare Sicherungen existieren plus 14 Tage, mindestens aber 395 Tage für den Löschbeleg | +| 2 | Ergänzen: Art. 9 Abs. 2 lit. f für Bilder mit besonderen Kategorien | +| 3 Browserkennung | Entscheidung: 250 Zeichen bleibt; weitere Kürzung bringt keinen Gewinn, weil die Kennung ohnehin nur im Streitfall gelesen wird. Anwaltsfrage gestrichen. | +| 3 neu | Zeile je Ereignistyp (Bild entfernt, Depublikation, DSGVO-Änderung, Kennzeichnungskorrektur) mit eigener Begründung der drei Jahre | +| 4 Auswirkungen | „gering“ ersetzen durch Risikoliste: sensible Motive im Original, Archivierung ohne Kenntnis der Pressekontakte, Metadaten im Original, interner Fehlgebrauch; daneben die Maßnahme je Risiko | +| 4 Schutzmaßnahmen | Zugriff präzisieren: Originaldateien aktiver Bilder: berechtigte Redaktion; archivierte Inhalte: Compliance-Berechtigung; jeder Abruf archivierter Inhalte und jede Änderung einer Sperre mit Zweck protokolliert. Nicht „jeder Zugriff“. | +| 4 Schutzmaßnahmen | Restore-Zusage mit Verweis auf Übung und externen Löschstand (B4, U7); vor der Übung als „vorgesehen“ formulieren | +| 4 Betroffenenrechte | „werden abgelehnt“ ersetzen durch „werden im Einzelfall geprüft; Vermerk nach Vorlage“ | +| 6 | Offene Punkte 1 und 3 schließen; Punkt 2 (Restore-Übung) bleibt | + +**Vorlage Vermerk Löschantrag gegen Archiveintrag** (für Abschnitt 4, Betroffenenrechte): + +> Antrag vom [Datum], Vorgang [Nr.]. Betroffen: Archiveintrag [ID], Ereignis [Typ], entfernt am [Datum]. Möglicher Anspruch: [Urheber / abgebildete Person / Betroffener nach Art. 82 / Rückgriff gegen Kunde], Verjährung voraussichtlich [31.12.20xx]. Ergebnis: Aufbewahrung erforderlich nach Art. 17 Abs. 3 lit. e bis [Datum] / Löschung veranlasst. [Name, Datum] + +--- + +## 6. Boost-Platzierung · **R+**, Label **G** (entschieden 12.10.2026) + +**Rechtslage:** Eine Pressemitteilung ist erkennbar Unternehmenskommunikation; dafür genügt die Absenderangabe (§ 6 DDG). Nicht erkennbar ist, dass die Platzierung bezahlt wurde. Ein Aufmacher mit „Top-Platzierung“ wirkt wie eine redaktionelle Auswahl. Das berührt § 5a Abs. 4 UWG (kommerzieller Zweck nicht kenntlich), Anhang Nr. 11 UWG (bezahlte Inhalte als redaktionell) und § 22 Abs. 1 MStV (Werbung erkennbar und vom übrigen Inhalt unterscheidbar). Art. 26 DSA (Werbekennzeichnung auf Online-Plattformen) greift wegen der Kleinstunternehmen-Ausnahme in Art. 19 nicht, beschreibt aber den Standard. + +**Position:** „Top-Platzierung“ reicht nicht. „Anzeige“ wäre falsch, weil der Inhalt keine Anzeige ist, sondern eine Pressemitteilung, deren Platz bezahlt wurde. „Booster-Platzierung“ wurde erwogen und verworfen: Der Leser erfährt daraus nicht, dass der Platz gebucht wurde, und das Label wird so beurteilt, wie ein durchschnittlicher Leser es ohne Tooltip versteht. + +**Entscheidung:** + +| Element | Neu | +|---|---| +| Label | „Gebuchte Platzierung“ (en: „Booked placement“), auf Bild und in Listen, gleiche Optik wie heute. „Gebucht“ sagt sachlich, dass die Position gebucht wurde, und passt zur Sprache der Preisseite („buchbar“). | +| Erklärung | Tooltip und `title`: „Das Unternehmen hat diesen Platz gebucht. Der Inhalt ist eine Pressemitteilung des Unternehmens.“ Auf Mobil als Link auf einen Absatz der Seite „So funktioniert das Portal“ | +| Aufmacher ungebucht | „Top-Meldung“ bleibt; Auswahl muss automatisch sein (neueste Grün-Meldung oder Boost), keine manuelle Kuratierung, sonst entsteht redaktionelle Auswahl | +| Preisseite D.2 | Satz ergänzen: „Geboostete Meldungen sind als gebuchte Platzierung gekennzeichnet.“ | +| AGB § 6 Abs. 2 (0.7) | Textvorschlag unten | + +**AGB § 6 Abs. 2 neu:** + +> **(2) Boost:** Zeitlich befristete hervorgehobene Platzierung einer veröffentlichten PM in den Laufzeitstufen 7, 14 oder 30 Tage. Der Startseiten-Boost umfasst die Startseite und die Kategorieseite des jeweiligen Portals, der Kategorie-Boost nur die Kategorieseite der gewählten Rubrik. Die Zahl gleichzeitiger Boosts je Seite ist begrenzt; die freien Plätze werden vor der Buchung angezeigt. Geboostete PMs werden als gebuchte Platzierung gekennzeichnet. Ein Boost ist nur für PMs buchbar, die die Inhaltsprüfung ohne Beanstandung durchlaufen haben (Status „Grün“). Geschuldet ist ausschließlich die Platzierung während der gebuchten Laufzeit; eine bestimmte Reichweite, Zugriffszahl oder sonstige Werbewirkung wird nicht geschuldet. [Satz zur Nichterreichbarkeit unverändert.] + +**Frage an den Anwalt:** Bestätigung, dass „Gebuchte Platzierung“ mit Erklärung genügt. + +--- + +## 7. Refund-Regel · **G** (Modell B entschieden 12.10.2026), Klausel **R+** + +**Rahmen:** B2B, kein Widerrufsrecht (§ 12). Gesetzlich bleibt: Rückzahlung bei Nichtleistung (§ 326 Abs. 4 BGB), Gewährleistung, zwingende Ansprüche. Eine Erstattungsregel in AGB darf das nicht unterschreiten, darf aber darüber hinausgehen. Anti-Zombie verlangt, dass die Regel öffentlich steht und nicht vom Einzelfall abhängt. + +**Drei Modelle:** + +| | A: Gesetz plus Kulanz | B: Klare Regel (Empfehlung) | C: 14 Tage Geld zurück auf alles Unverbrauchte | +|---|---|---|---| +| Einzel-PM abgelehnt | Einzelfall | Eine kostenfreie Überarbeitung; bleibt es bei Rot oder will der Kunde nicht: volle Erstattung | volle Erstattung | +| Technischer Fehler | § 4 Abs. 3 | Slot/Credits zurück, bei Einzel-PM Erstattung | wie B | +| Boost nicht angezeigt | Einzelfall | Laufzeit verlängert (§ 6 Abs. 2); auf Wunsch anteilige Credit-Gutschrift | wie B | +| Bild wegen Rechtsverletzung entfernt | kein Ausschluss (E8) | keine Erstattung der PM, keine Zusatzkosten; Ersatzbild kostenfrei | wie B | +| Depublikation auf Kundenwunsch | – | keine Erstattung | keine Erstattung | +| Unverbrauchte Credits | § 5 Abs. 3: keine Auszahlung | Auf Antrag innerhalb von 14 Tagen nach Kauf: Erstattung des unverbrauchten Teils; danach § 5 Abs. 3 | jederzeit anteilig | +| Abonnement | Kündigung zum Laufzeitende | Kündigung zum Laufzeitende, keine anteilige Erstattung; Ausnahme Sonderkündigung bei Preisänderung (§ 10 Abs. 5): anteilig | 14 Tage nach Erstbuchung voll, wenn kein Slot verbraucht | +| Aufwand | niedrig, aber intransparent | niedrig, selten | mittel | + +**Entscheidung: Modell B.** Begründung: Die Fälle sind selten (seit Go-Live keine Erstattung, 3 Stornos), die Regel ist in zehn Zeilen erklärt, und die 14-Tage-Regel für Credits nimmt dem „keine Auszahlung“ in § 5 Abs. 3 die Härte, ohne das Modell zu öffnen. + +**Zahlungsweg:** Erstattung auf demselben Weg wie die Zahlung (Stripe-Refund, bei Überweisung Rücküberweisung). Für Vorkasse-Kunden wie FMI: statt des manuellen MAN-Pfads Stripe-Rechnung mit Banküberweisung als Zahlungsmethode nutzen; dann laufen Rechnung, Zahlungseingang und Erstattung über einen Weg. Geschäftsentscheidung, aber sie spart dir den Sonderpfad. + +**Klausel (AGB 0.7, § 10 neuer Abs. 6):** + +> **(6) Erstattungen.** Wird eine PM im Rahmen der Inhaltsprüfung abgelehnt und vom Kunden nicht erneut eingereicht oder erneut abgelehnt, erstattet der Anbieter den für diese Einzelveröffentlichung gezahlten Preis; bei Abonnements und Credits wird kein Slot und kein Credit verbraucht. Kann eine Zusatzleistung aus vom Anbieter zu vertretenden Gründen nicht erbracht werden, werden die dafür eingesetzten Credits gutgeschrieben. Erworbene Credits erstattet der Anbieter auf Antrag innerhalb von 14 Tagen nach dem Erwerb, soweit sie noch nicht eingesetzt wurden; danach gilt § 5 Abs. 3. Erstattungen erfolgen auf demselben Zahlungsweg. Gesetzliche Ansprüche bleiben unberührt. + +**Umsetzung:** Admin-Aktion „Erstatten“ mit Status `refunded` (existiert, wird nirgends gesetzt); Doppelerstattung (Geld und Credits) technisch ausschließen, Zahlungsstatus mit Stripe-Webhooks abstimmen; Hilfeseite „Erstattungen“ mit derselben Tabelle. + +--- + +## 8. Syndikationsvertrag: Gliederungsvorschlag + +Standarddokument für connektar, openPR und künftige Partner. Deutsch, Textform genügt. + +| § | Inhalt | Warum | +|---|---|---| +| 1 | Gegenstand: Übermittlung von PM des Partners bzw. seiner Kunden zur Veröffentlichung auf den Portalen; keine Exklusivität, keine Abnahmepflicht | | +| 2 | Rollen: Partner reicht im eigenen Namen ein und ist Vertragspartner für alle Pflichten (Spiegel von § 8a Abs. 1 S. 2); Partner sichert zu, von seinen Kunden zur Einreichung und zur Abgabe der Erklärungen (Rechte, KI) ermächtigt zu sein | A3, A6 | +| 3 | Schnittstelle: API v1; Pflichtfelder `ai_declaration`, `rights_confirmed`, `confirm_text_version`, Bildfelder; Alt-API-Abschaltdatum; Rate-Limits | Alt-API-Lücke | +| 4 | Änderungen und Löschungen: Partner übermittelt Änderungen und Löschungen seiner Kunden unverzüglich über die Schnittstelle; das Portal darf eigene Änderungen vornehmen (DSGVO, Meldeverfahren) und sperrt danach den Re-Sync; Partner akzeptiert das | Write-once | +| 5 | Inhalte: Veröffentlichungsrichtlinien gelten; Rechte an Text und Bild; KI-Angabe ist Erklärung des Kunden, nie Default; keine Veröffentlichungspflicht, automatisierte Prüfung; Ablehnung mit Ablehnungskategorie (§ 7 Abs. 2, Art. 17 DSA) | A2 | +| 6 | Benachrichtigungen: Das Portal informiert Pressekontakte über Veröffentlichung und Ablehnung; Partner stellt sicher, dass seine Kunden darüber informiert sind (Art. 13/14 DSGVO beim Partner) | Akquisekanal absichern | +| 7 | Rechteeinräumung: wie § 9 (einfaches Recht, Feeds, OG, Archiv, Beweissicherung), erteilt durch den Partner für seine Kunden | A1 | +| 8 | Datenschutz: beide eigenständig Verantwortliche, kein AVV, keine gemeinsame Verantwortung; Übermittlung lit. b/f; gegenseitige Benachrichtigung bei Betroffenenanfragen innerhalb von fünf Werktagen; Weiterleitung von Löschbegehren an die Gegenseite; Art. 19 je für eigene Empfänger | Löschanfragen-Frage 4 | +| 9 | Freistellung und Haftung: verschuldensabhängig, Spiegel von § 8 Abs. 2; Haftungsbegrenzung wie § 14 | | +| 10 | Entgelt und Statistik: unentgeltlich gegenseitig oder Konditionen; welche Zahlen das Portal liefert (Aufrufe je PM, 5a) | | +| 11 | Kennzeichnung: Quellenhinweis am Beitrag („über [Partner]“), Umgang mit Doppelveröffentlichung (Canonical) | | +| 12 | Laufzeit und Kündigung: unbefristet, monatlich kündbar; nach Ende bleiben veröffentlichte PM archiviert, Rechteeinräumung bleibt, keine neuen Einreichungen | Anti-Zombie | +| 13 | Vertraulichkeit, Änderungen in Textform, deutsches Recht, Gerichtsstand Bielefeld | | +| Anlagen | API-Spezifikation, Richtlinien in aktueller Fassung, Bildklausel (S23) | | + +**Für den Anwalt:** Entwurf nach dieser Gliederung erstellen oder prüfen lassen; vor dem connektar-Termin im Oktober mindestens § 3, § 4 und § 5 abstimmen. + +--- + +## 9. DSE 0.4: korrigierte Textentwürfe + +Ersetzt Abschnitt 4 des Anwaltspakets. Nur die geänderten Teile; unveränderte Entwürfe (Google-Anmeldung in 7a, 9a erster Teil) bleiben wie im Decision-Update. + +### 3a Fehlerprotokoll + +Wie im Paket, mit dem Absatz aus F2 anstelle von „IP-Adressen, Namen, E-Mail-Adressen, Cookies und Formularinhalte werden nicht übermittelt …“. + +### 7a Anmeldung und Kontosicherheit (Hub) + +> Zum Schutz Ihres Kontos verarbeiten wir bei der Anmeldung folgende Daten: +> - Zeitpunkt und IP-Adresse Ihrer letzten Anmeldung; beides sehen Sie auf der Seite „Konto-Sicherheit“, damit Ihnen fremde Anmeldungen auffallen. Die Angabe wird bei jeder Anmeldung überschrieben und 90 Tage nach Ihrer letzten Anmeldung gelöscht. +> - Ihre Anmeldungen mit Zeitpunkt und Anmeldeweg (Passwort, Magic-Link, Google, Passkey) sowie fehlgeschlagene Anmeldeversuche und Sperren Ihres Kontos in unserem internen Aktivitätsverlauf. Bei fehlgeschlagenen Versuchen wird die IP-Adresse nur als gekürzter, mit einem geheimen Schlüssel gebildeter Prüfwert gespeichert. Diese Einträge löschen wir nach 90 Tagen. +> - Anmeldeversuche mit Adressen, zu denen kein Konto besteht, zählen wir nur als Tagessumme je Quelle (als gekürzter Prüfwert der IP-Adresse), gelöscht nach 90 Tagen. +> - Zur Begrenzung von Anmeldeversuchen zählen wir Fehlversuche je IP-Adresse (15 Minuten) und je Kombination aus E-Mail-Adresse und IP-Adresse (1 Minute) in einem kurzlebigen Zwischenspeicher; die Einträge verfallen danach automatisch. +> +> [Absätze Zwei-Faktor, Passkeys, Google unverändert.] +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO (Bereitstellung eines sicheren Kundenkontos) und Art. 6 Abs. 1 lit. f DSGVO (Schutz vor unbefugten Zugriffen). Zwei-Faktor-Daten und Passkeys löschen wir, wenn Sie sie entfernen, spätestens mit Ihrem Konto. + +### 7b Aktivitätsverlauf und Programmierschnittstelle (Hub) + +> Für die Nachvollziehbarkeit von Vorgängen, die Missbrauchserkennung und den Support führen wir einen internen Aktivitätsverlauf, auf den nur Administratoren Zugriff haben. Er enthält insbesondere Registrierungen, Statuswechsel von Pressemitteilungen, eingegangene Anfragen, versandte Benachrichtigungen mit Empfängeradresse und Betreff sowie Handlungen von Administratoren. Diese Einträge löschen wir nach 395 Tagen; Anmeldeereignisse nach 90 Tagen (Abschnitt Kontosicherheit). +> +> Wenn Sie unsere Programmierschnittstelle (API) nutzen, protokollieren wir je Anfrage Ihr Konto und die Kennung des verwendeten Zugangsschlüssels (nicht den Schlüssel selbst), die aufgerufene Funktion, das Ergebnis, die Dauer sowie IP-Adresse und Programmkennung. Das Protokoll dient dem Betrieb, der Missbrauchserkennung und dem Nachweis der Nutzung und wird nach 90 Tagen gelöscht. +> +> Rechtsgrundlage ist jeweils Art. 6 Abs. 1 lit. f DSGVO; bei der API-Nutzung zusätzlich Art. 6 Abs. 1 lit. b DSGVO. + +### 12a Zustellbarkeit und Abmeldung + +> Erhalten wir eine Meldung, dass eine E-Mail nicht zugestellt werden konnte, werten wir sie automatisch aus und speichern die Empfängeradresse, die Art und den Text der Meldung sowie eine interne Referenz der betroffenen E-Mail. Adressen, die dauerhaft nicht erreichbar sind, nehmen wir in eine Sperrliste auf. +> +> Jede Benachrichtigung enthält einen Link zur Abmeldung; Ihr Mailprogramm kann die Abmeldung auch direkt auslösen. Haben Sie kein Kundenkonto, zum Beispiel als in einer Pressemitteilung genannter Pressekontakt, speichern wir Ihre Abmeldung in derselben Sperrliste. An gesperrte Adressen senden wir keine Benachrichtigungen mehr; von Ihnen selbst angeforderte Anmeldelinks bleiben möglich. Eine Entsperrung erfolgt auf Ihre Anfrage an info@pressekonto.com. +> +> Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; unser berechtigtes Interesse liegt in der zuverlässigen Zustellung und darin, keine unerwünschten oder unzustellbaren E-Mails zu versenden. Bei Abmeldungen ist die Speicherung zudem erforderlich, um Ihren Widerspruch dauerhaft zu beachten (Art. 6 Abs. 1 lit. c in Verbindung mit Art. 21 Abs. 3 DSGVO). Die abgerufenen Zustellmeldungen löschen wir aus dem Postfach nach 90 Tagen, die ausgewerteten Datensätze nach 395 Tagen; Einträge der Sperrliste bleiben bestehen, solange sie für diesen Zweck erforderlich sind. + +### 6 Kontaktaufnahme (Ergänzung) + +> Zum Schutz vor Missbrauch und zum Nachweis des Eingangs speichern wir bei Kontaktanfragen, Meldungen, Widerrufen, Kündigungen und Buchungsbestätigungen über unsere Formulare die IP-Adresse, von der die Anfrage gesendet wurde, und entfernen sie nach 90 Tagen. Die übrigen Angaben speichern wir, solange es zur Bearbeitung und Dokumentation des Vorgangs erforderlich ist (Abschnitt Speicherdauer). + +*Darf erst mit 0.4 erscheinen, wenn der Löschlauf inklusive Altbestand läuft (U1).* + +### 6a Turnstile (Ergänzungen) + +Die drei Sätze aus F8. + +### 10 (Hub) / 8 (Portale) Automatisierte Inhaltsprüfung (Änderung) + +Ersetzt die Anbieterliste: + +> Für die automatisierte Analyse nutzen wir die Programmierschnittstelle von OpenAI Ireland Ltd., 1st Floor, The Liffey Trust Centre, 117–126 Sheriff Street Upper, Dublin 1, Irland. Mit OpenAI besteht ein Vertrag zur Auftragsverarbeitung. Nach Angaben von OpenAI werden über die Programmierschnittstelle übermittelte Inhalte nicht zum Training von Modellen verwendet und zur Erkennung von Missbrauch bis zu 30 Tage gespeichert. Eine Verarbeitung in den USA ist möglich; sie erfolgt auf Grundlage von EU-Standardvertragsklauseln. *(Fassung 13.10.2026, ohne ZDR)* Setzen wir künftig weitere Anbieter ein, nennen wir sie hier. + +### 7 (Portale) Änderungslinks (Änderung) + +> … Die konkrete Gültigkeitsdauer wird systemseitig festgelegt und beträgt derzeit 15 Minuten für Zugangslinks zur Verwaltung einer Mitteilung oder eines Newsrooms und 72 Stunden für den Bestätigungslink, den Sie nach einer Meldung über „Mitteilung melden“ erhalten. + +### 9a Bilder (Änderungen gegenüber Decision-Update) + +- „einer gekürzten Kennung des verwendeten Browsers“ → „der auf 250 Zeichen gekürzten Kennung des verwendeten Browsers“ +- Letzter Absatz: „Bilder, die hochgeladen, aber nie veröffentlicht werden, löschen wir, wenn Sie sie löschen oder ersetzen, sofort; bleibt ein Entwurf 180 Tage unbearbeitet, löschen wir ihn mit seinen Bildern.“ + +### 9b Beweisarchiv (Neufassung der betroffenen Absätze) + +> Einen auf das Notwendige beschränkten Datensatz zu der entfernten Veröffentlichung bewahren wir in einem getrennten, verschlüsselten Archiv auf: den zuletzt veröffentlichten Stand der Inhalte einschließlich der darin genannten Pressekontakte, die Angaben zum Einreicher (Konto, Name, E-Mail-Adresse, Firma zum Zeitpunkt der Einreichung), die zu den Bildern gespeicherten Daten (Abschnitt Bilder), die Zeitpunkte von Veröffentlichung und Entfernung, den Grund der Entfernung als Kategorie, bei Änderungen den vorherigen und den neuen Stand sowie die Vorgangsnummer eines zugrunde liegenden Melde- oder Löschverfahrens. Zweck ist ausschließlich die Wahrung unserer Nachweis- und Verteidigungsinteressen gegenüber Rechteinhabern, Betroffenen und Behörden sowie der Rückgriff gegen den Einreicher. Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO; soweit ein Bild ausnahmsweise besondere Kategorien personenbezogener Daten erkennen lässt, Art. 9 Abs. 2 lit. f DSGVO. Bei Daten, deren Löschung beantragt wurde, prüfen wir im Einzelfall, ob die weitere Aufbewahrung nach Art. 17 Abs. 3 lit. e DSGVO erforderlich ist, und halten das Ergebnis fest. +> +> Originaldateien aktiver Bilder sind für unsere Redaktion zugänglich; archivierte Inhalte nur für Administratoren mit gesonderter Berechtigung. Jeder Abruf archivierter Inhalte und jede Änderung einer Aufbewahrungssperre wird mit Angabe des Zwecks protokolliert; das Protokoll löschen wir nach 395 Tagen. Das Archiv wird für keinen anderen Zweck verwendet und nicht an Dritte weitergegeben, außer zur Rechtsverteidigung an unsere rechtlichen Berater oder auf gesetzlicher Grundlage an Behörden und Gerichte. +> +> Archiveinträge werden drei Jahre nach dem Ende des Jahres, in dem der Inhalt entfernt wurde, automatisch gelöscht. Läuft zu einem Inhalt eine rechtliche Auseinandersetzung, setzen wir eine dokumentierte Aufbewahrungssperre; nach deren Aufhebung wird der Eintrag zum regulären Zeitpunkt gelöscht oder, wenn ein dokumentierter Grund fortbesteht, zu einem festgelegten späteren Zeitpunkt. Verlangen Sie die Einschränkung der Verarbeitung, kennzeichnen wir den Eintrag gesondert und beschränken seine Verwendung auf die gesetzlich zulässigen Zwecke. Von einem gelöschten Eintrag bleibt nur ein technischer Löschvermerk (Kennung, Objektschlüssel, Ereignisart, Zeitpunkte, Prüfsumme), der verhindert, dass gelöschte Inhalte durch eine Wiederherstellung erneut verfügbar werden. Sicherungskopien werden innerhalb von 14 Tagen überschrieben; nach einer Wiederherstellung aus einer Sicherung werden bereits gelöschte Einträge anhand eines getrennt gesicherten Löschstands erneut entfernt. + +### 13 Speicherfristen (Liste für 0.4; Sitzungen, Reset- und API-Tokens, Warteschlangen vor Veröffentlichung ergänzen) + +> - Server-Logs: 14 Tage. +> - Anmelde- und Änderungslinks: einmalige Nutzung oder 15 Minuten gültig; Bestätigungslinks aus dem Meldeverfahren: 72 Stunden. Die zugehörigen Datensätze werden gelöscht, sobald Verbrauch oder Ablauf mehr als 30 Tage zurückliegen. +> - Ereignisprotokolle (Abschnitt 5a): 395 Tage. +> - Fehlerberichte: 90 Tage. +> - Aktivitätsverlauf: Anmelde- und Fehlversuchsereignisse 90 Tage, übrige Einträge 395 Tage; Tagessummen fehlgeschlagener Anmeldungen 90 Tage; API-Zugriffsprotokoll 90 Tage; IP-Adresse der letzten Anmeldung 90 Tage nach der letzten Anmeldung. +> - Zustellmeldungen: 90 Tage im Postfach, 395 Tage als ausgewerteter Datensatz; Sperrliste, solange erforderlich. +> - IP-Adressen aus Formularanfragen und Buchungsbestätigungen: 90 Tage. +> - Kontaktanfragen: 180 Tage nach Abschluss; Anfragen mit Vertrags- oder Rechtsbezug nach der Frist des jeweiligen Vorgangs. +> - Formulardaten zu Widerruf, Kündigung und Buchungsbestätigung: 180 Tage nach Bearbeitung; der Vertragsnachweis selbst nach den gesetzlichen Aufbewahrungsfristen. +> - Entwürfe, die nie veröffentlicht wurden: sofort bei Löschung durch Sie, sonst 180 Tage nach der letzten Änderung samt Bildern. +> - Abgelehnte, nie veröffentlichte Einreichungen: Text und Bilder 180 Tage nach der Ablehnung; ein Ablehnungsnachweis (Status, Zeitpunkt, Kategorie, Konto) drei Jahre nach Ende des Jahres der Ablehnung. +> - Bearbeitungsstände von Korrekturen: 30 Tage. +> - Meldedaten: drei Jahre nach Abschluss des Vorgangs. +> - Beweisarchiv (Abschnitte Bilder, Beweisarchiv): drei Jahre nach Ende des Jahres der Entfernung; Zugriffsprotokoll 395 Tage; technischer Löschvermerk bis zum späteren von 395 Tagen nach Löschung und 14 Tagen nach Ablauf der letzten rückspielbaren Sicherung. +> - Vertrags-, Buchungs- und Rechnungsdaten: gesetzliche Aufbewahrungsfristen (Buchungsbelege acht Jahre, Handels- und Geschäftsbriefe sechs Jahre). +> - Veröffentlichte Pressemitteilungen: dauerhaft im Archiv, soweit keine Ansprüche auf Entfernung bestehen. +> - Kontodaten: nach Kontolöschung, soweit keine Aufbewahrungspflichten entgegenstehen. +> +> Gelöschte Daten können in Sicherungskopien noch bis zu 14 Tage enthalten sein. + +**Gestrichen in 0.4:** Entwurf „5 Webanalyse Kundenbereich“ (F6), Entwurf „9a KI-Vorabprüfung“ (F9). + +--- + +## 10. Anwaltsagenda in Endfassung + +Was dem Anwalt tatsächlich vorgelegt wird, sortiert nach Gewicht. Alles andere bekommt er als Information. + +| Nr. | Frage | Unser Default | Bezug | +|---|---|---|---| +| 1 | AGB 0.7: § 8a, § 9 Abs. 1, 1a, 2, 4, § 6 Abs. 2 neu, § 8 Abs. 1 KI-Spiegelstrich, § 10 Abs. 6 Erstattungen. Freigabe. | Texte wie in Decision-Update 3.1/3.2 und hier Abschnitte 3, 6, 7 | A1, A6, Boost, Refund | +| 2 | Einbeziehung 0.7: Bestandsschutz für laufende Abos und Alt-Credits; Umstellung nur per Änderungskündigung. Trägt das? Richtiger Weg, Mitteilung, Frist? | Ja | A5 | +| 3 | Beweisarchiv: Drei-Jahres-Frist je Ereignistyp, Original mit Metadaten, Art. 9 Abs. 2 lit. f, Hold und Art. 18 getrennt, Migration versiegelter Altpakete mit Antragsteller-E-Mails, korrigierte Abwägung | Wie Abschnitt 3 A4 | A4 | +| 4 | Medienprivileg in DSE 9 (Portale): unschädlich in Hedge-Form oder umstellen auf Art. 17 Abs. 3 lit. a? | Behalten, nie allein darauf stützen | A2 | +| 5 | Hoster-Status mit automatisierter Prüfung und Boost; UrhDaG-Vermerk | Tragfähig | A2 | +| 6 | Art. 50 KI-VO: Portal kein Mitbetreiber; Portal-Updates mit dokumentierter Überarbeitung ohne Kennzeichnung | Ja | A6, F10 | +| 7 | Boost-Label „Gebuchte Platzierung“ mit Erklärung ausreichend? | Ja | Abschnitt 6 | +| 8 | Fehlerprotokoll im Browser: § 25 Abs. 2 Nr. 2 TDDDG mit minimalem Datensatz | Ja | F2 | +| 9 | Turnstile: § 25 Abs. 2 Nr. 2, DPF | Ja | F8 | +| 10 | Aktivitätsverlauf: 395 Tage für Mail-Einträge zu Nichtkunden verhältnismäßig? | Ja | F3 | +| 11 | Sperrliste: lit. c in Verbindung mit Art. 21 Abs. 3 für Abmeldungen | Ja | F5 | +| 12 | Löschanfragen 1 bis 4 | Wie Abschnitt 4 | Handover | +| 13 | Regresskette vollständig? | Mit den drei Ergänzungen aus A7 | A3, A7 | +| 14 | Syndikationsvertrag nach Gliederung Abschnitt 8 entwerfen oder prüfen | Entwurf durch Anwalt | Roadmap 3.5 | +| Später | KI-Bildprüfung: AVV, 30-Tage-Speicherung, Schwellwertprüfung ausreichend oder DSFA? | AVV plus Schwellwertprüfung | F9 | +| Später | Umami Kundenbereich, Newsletter: Aktivierungsbedingungen | Wie F6, F7 | | + +Als Information, keine Frage: F1, F3-Fristen, F4, F6, F7, F11, die Entscheidungen E1 bis E9, die DSE-Entwürfe aus Abschnitt 9. + +--- + +## 11. Was vor dem Versand und vor 0.4 passieren muss + +### Vor dem Versand (Dokumente) + +| Nr. | Aufgabe | +|---|---| +| V1 | Anwaltspaket auf diesen Stand bringen: Abschnitt 2 Fristen, Abschnitt 3 Sachverhalt (Token-Kennung, Zwischenspeicher, Magic-Link-Ausnahme, remoteip, Gate-Status), Abschnitt 4 durch Abschnitt 9 hier ersetzen, Abschnitt 5 Fragen durch Abschnitt 10 hier ersetzen, D7/D8/D10 als spätere Aktivierungen kennzeichnen | +| V2 | Interessenabwägung nach Abschnitt 5 korrigieren, Verantwortlichen eintragen | +| V3 | Anlage Rechtstexte: unverändert beilegen, plus Screenshot Gate (ausgeschaltet, Code vorhanden) | +| V4 | Zwei Mailtexte vom Juli (Abonnenten, aktive Konten) mit Versanddatum in den Rechtsordner | +| V5 | DPF-Status Cloudflare und OpenAI-Organisationseinstellungen (ZDR, Residenz) als Screenshot | + +### Vor DSE 0.4 / AGB 0.7 (Deploy 3) + +| Nr. | Aufgabe | Herkunft | +|---|---|---| +| U1 | IP-Bereinigung Vorgänge und letzte Login-IP, Altbestand | F4, D9 | +| U2 | Entwürfe und Ablehnungen: echte Löschung nach 180 Tagen; Ablehnungsnachweis minimal | E1, E2 | +| U3 | Legal-Hold-Ende ohne Neustart; Einschränkung Art. 18 getrennt; Löschvermerk mit Objektschlüssel minimiert; Zugriffsprotokoll 395 Tage; Vorgangsnummer statt Antragsteller-E-Mail; Inventar versiegelter Altpakete (RP-03, RP-05) | A4 | +| U4 | Aktivitätsverlauf je Ereignistyp | F3 | +| U5 | IMAP-Ordner 90 Tage (alle Ordner inventarisieren); Abmeldesperre: Anmeldelink ausgenommen, angeforderte Bestätigungslinks als eigene Regel (RP-08) | F5 | +| U6 | Scrubber nachschärfen; GlitchTip 90 Tage und Proxy-Logs 14 Tage belegen | F2 | +| U7 | Externer Löschstand mit Löschauftrag je Objekt, Hash-Export, Restore-Übung in fünf Szenarien (RP-04, B-01) | A4, A7 | +| U8 | Alt-API: `not_declared` statt „ohne KI“; bestehende `none`-Werte nur korrigieren, wenn ihre automatische Herkunft sicher feststellbar ist; echte Kundenerklärungen bleiben (RP-09) | A6 | +| U9 | Gate: Bestandsschutz für laufende Abos und Alt-Credits (FIFO); kein Annahmedatensatz bei „Später“; kein automatischer Versionswechsel (RP-06) | A5 | +| U10 | Boost-Label „Gebuchte Platzierung“ und Tooltip; Preisseite-Satz. **Im Code seit 13.10.2026** (Tooltip am Desktop, Tipp auf Mobil, Screenreader-Text; „Top-Auswahl“ → „Aktuell“; Admin-Aktion „Boost beenden“), Deploy offen | Abschnitt 6 | +| U11 | Admin-Upload nur für Meldungen mit Konto, Link an Konto-E-Mail; Self-Service-Bild-Upload nur mit Konto; Rolle und Vertragspartner im Protokoll; Einreichungsnachweis zum Einreichungszeitpunkt (RP-05) | A3 | +| U12 | Erstattungs-Aktion im Admin; Hilfeseite | Abschnitt 7 | +| ~~U13~~ | ~~Altkonten bereinigen~~ — **erledigt 13.10.2026** auf Live: ein Admin-Konto mit Passkey und TOTP, keine Editoren (`nachweise/bn-02-berechtigungen-2026-10-13.md`) | sofort | +| U14 | Alte Backups prüfen und bereinigen (Roadmap 1.5) | A4 | +| U15 | Umami-Rohdatenfrist 13 Monate | F6 | +| U16 | Betriebsnachweise BN-01 bis BN-09 aus der Korrekturdatei liefern (Release und Schalter je Host, Berechtigungen inkl. Editor-Rollen, Backupinventar, externer Löschstand, Instanzfristen, Verträge und DPF-Status, OpenAI-Einstellungen, Juli-Mailtexte mit Versandbeleg, Lauf- und Restore-Protokolle) | alle | +| U17 | Test-Boost auf Live für Screenshots (Startseite, Branchenseite, Mobil), nach Deploy von U10; danach über Admin ▸ Pressemitteilung ▸ „Boost beenden“ | Boost | + +--- + +## 12. Anti-Zombie-Check + +| Regel | Prüfung | +|---|---| +| Keine versteckten Kosten | Erstattungsregel öffentlich; Betroffenenrechte kostenfrei; Boost als gebucht gekennzeichnet | +| Keine automatische Zustimmung | Gate mit Klick; Abonnenten werden nicht blockiert, sondern bekommen „Später“ | +| Transparenz | Fristen in 13 vollständig; Archiv offen benannt; KI-Unterstützung bei Portal-Updates genannt; keine Erklärung im Namen des Kunden (Alt-API) | +| Kein Betreuungsaufwand ohne Nutzen | Alle Fristen laufen automatisch; Erstattungsfälle selten und regelbasiert; Sperrliste verwaltet sich selbst | +| Direkter menschlicher Kontakt | Entsperrung, Löschanträge, Kennzeichnungskorrektur laufen über eine Person | + +--- + +## 13. Wiedervorlage + +- Anwaltsantwort liegt vor: Abschnitt 10 abarbeiten, Defaults bestätigen oder ändern, dann V1/V2 final und Deploy 3. +- connektar-Termin Oktober: `ai_declaration` Pflicht, Syndikationsvertrag § 3 bis § 5, Alt-API-Abschaltdatum. +- Erster Credit-Verfall möglich am 31.12.2029: Erinnerungsmail nach § 5 Abs. 2 bis dahin bauen oder Klausel anpassen. +- Umsatz über 1 Mio. Euro oder redaktionelle Prüfung über Partner: Hoster-Status und UrhDaG neu bewerten. +- D7, D8, D10: eigene Aktivierungspakete mit den Checklisten aus F6, F9, F7. diff --git a/dev/rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md b/dev/rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md new file mode 100644 index 00000000..92c44cda --- /dev/null +++ b/dev/rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md @@ -0,0 +1,368 @@ +# Rechtspaket: Korrekturen, Antworten und Umsetzungsauftrag + +**Stand:** 12.10.2026 · Ergänzung nach Prüfung der überarbeiteten Dokumente und des Codes + +**Verantwortlicher:** adametz.media, Inhaber Kevin Adametz, In der Lake 4, 33739 Bielefeld, info@pressekonto.com. + +**Ziel:** Die fachlichen Widersprüche auflösen und einen ausführbaren Entwicklungsauftrag vorbereiten. Dieses Dokument enthält korrigierte Sachverhalte, Ersatztexte, konkrete Empfehlungen, eine Aufbewahrungsmatrix und Abnahmekriterien. Es dokumentiert keine bereits erfolgte Implementierung oder anwaltliche Freigabe. + +## 1. Ergebnis und Verbindlichkeit + +Die beschlossenen Grundrichtungen bleiben bestehen: bestehende Verarbeitungen transparent beschreiben, Daten begrenzen, Bildrechte nachweisen, das Beweisarchiv absichern und AGB wirksam einbeziehen. Die bisherigen Unterlagen beschreiben an mehreren Stellen bereits die gewünschte Zukunft als Gegenwart. Diese Aussagen werden nachfolgend berichtigt. + +**Arbeitsstand:** Für die technische Vorbereitung liegen jetzt konkrete Vorgaben vor. Die rechtlich abhängigen Teile werden erst nach den Antworten unter Abschnitt 8 endgültig umsetzungsreif. Produktivnachweise werden vor Veröffentlichung benötigt; sie lassen sich nicht aus dem DEV-Container oder einer lokalen Datenbankkopie ableiten. + +| Kennzeichnung | Bedeutung | +|---|---| +| **IST** | Im geprüften Code vorhanden; kein automatischer Nachweis über produktive Konfiguration oder erfolgreiche Ausführung. | +| **BETREIBER** | In den überarbeiteten Unterlagen vom Betreiber mitgeteilt; externer Beleg gegebenenfalls noch offen. | +| **BESCHLOSSEN** | Bereits dokumentierte Geschäftsentscheidung, insbesondere B1/B2 und Entscheidungen im Klärungsdokument. Rechtliche Bedingungen bleiben bestehen. | +| **VORSCHLAG** | Hier ergänzte Empfehlung beziehungsweise technische Arbeitsvorgabe; keine fingierte Betreiber- oder Anwaltsentscheidung. | +| **RECHT OFFEN** | Konkrete Frage mit Umsetzungsauswirkung, die zur anwaltlichen Prüfung bleibt. | +| **BETRIEBSNACHWEIS OFFEN** | Einstellung, Vertrag, Konto-, Versand- oder Laufnachweis außerhalb des geprüften Codes fehlt. | + +Für die nachfolgend ausdrücklich korrigierten Punkte ist dieses Dokument die führende technische Arbeitsgrundlage. Es ersetzt keine bestehenden Verträge. Unveränderte Originalfassungen bleiben als Quellen erhalten. Die Aufgaben erhalten eindeutige Kennungen **RP-01 bis RP-12**; alte U-Kennungen werden nur noch mit Dokumentnamen verwendet. + +### Umfang + +- **BESCHLOSSEN:** Aktive Datenschutzverarbeitungen, DSE, Bildrechte, Beweisarchiv und Zustimmungsgate gehören in das Kernpaket. +- **BESCHLOSSEN:** Hub-Analyse mit Nutzerkennung, KI-Bildprüfung und Newsletter-Kampagnen bleiben ausgeschaltet und erhalten eigene Aktivierungspakete. Das betrifft nicht die bereits laufende KI-Textanalyse oder öffentliche Nutzungsstatistik. +- **BESCHLOSSEN:** Syndikationsvertrag, Refund-Funktion und bezahlte Platzierungen werden als eigene Arbeitspakete geführt. Bereits aktive Verarbeitungen und Rechteketten müssen trotzdem jetzt zutreffend beschrieben und nötigenfalls korrigiert werden. +- **VORSCHLAG:** Neue Portal-Updates mit KI bleiben beim bestehenden Changelog-Paket. Ihre geplante Freigabedokumentation wird aus dem Ist-Sachverhalt des Rechtspakets entfernt. + +## 2. Sachliche Korrekturen mit Ersatztexten + +Die als „Zieltext“ bezeichneten Absätze dürfen erst nach Umsetzung und Abnahme in öffentliche Rechtstexte übernommen werden. Ein zutreffender Zwischenstand für bereits aktive Verarbeitungen soll nicht auf zukünftige Funktionen warten. + +### K1 — Archivinhalt und historische Einreicherdaten + +**IST:** `legalRequestBlock()` schreibt weiterhin `requester_email` in das Beweisarchiv. Beim Archivieren werden aktuelle Beziehungen zu Firma und Benutzer gelesen. Das ist kein sicherer Nachweis des ursprünglichen Einreichungsstands. Quellen: [PressReleaseArchiver](../../app/Services/Archive/PressReleaseArchiver.php), insbesondere `legalRequestBlock()`, `pressReleaseBlock()` und die Archivierungsaufrufe. + +**Ersatz für den technischen Sachverhalt:** + +> Das bestehende Archiv enthält neben Inhalts- und Rechtebelegen derzeit auch Angaben aus dem Meldevorgang einschließlich der Antragsteller-E-Mail. Firma und Einreicherdaten entsprechen den bei der Archivierung verfügbaren Daten. Beschlossenes Ziel ist, Antragstellerkontaktdaten auf den Meldevorgang zu begrenzen und für neue Einreichungen einen unveränderlichen Nachweis der erforderlichen Einreicherdaten zu erzeugen. + +**Umsetzungsvorgabe:** + +- Neue Einreichungen: Zeitpunkt, Konto-/Partnerkennung, Firma, erklärende Person, notwendige Kontaktadresse und jeweils angenommene Dokumentfassungen als Nachweis festhalten. Änderungen am laufenden Konto verändern diesen Nachweis nicht. +- Rechtebestätigungen: eigenen Bestätigungszeitpunkt und Erklärenden speichern; eine spätere Bildbestätigung darf nicht als Erklärung bei der ursprünglichen Texteinreichung erscheinen. +- Altbestand: Herkunft `bei Archivierung erfasst` beziehungsweise `historischer Nachweis vorhanden` kennzeichnen. Keine rückdatierte Rekonstruktion durch heutige Kontodaten. +- Neue Archivpakete: nur Vorgangsnummer statt Antragsteller-E-Mail aufnehmen, soweit die anwaltliche Prüfung den beschlossenen Datenumfang bestätigt. +- Bereits versiegelte Pakete: nicht stillschweigend verändern. Inventar und Migrationsentscheidung erstellen. Entweder nachvollziehbar minimierte Nachfolgefassung mit Integritätsnachweis und kontrollierter Entfernung der alten Fassung oder begründete befristete Übergangsaufbewahrung. Aktive Streitfälle gesondert prüfen. Bis dahin keine Aussage „Antragsteller-E-Mails sind nicht enthalten“. + +**Abnahme:** Änderungen an Konto/Firma beeinflussen einen neuen historischen Nachweis nicht; alte Daten werden korrekt als nachträglich erfasst ausgewiesen; der Umgang mit bestehenden Paketen ist protokolliert. + +### K2 — Löschvermerk, Aufbewahrung und Wiederherstellung + +**IST:** Der Löschvermerk enthält derzeit weitere Metadaten. Export und Wiederherstellungsabgleich benötigen `payload_path`; die beschlossene ausschließliche Feldliste ohne diesen Wert wäre funktionsschädlich. Export und Archiv liegen derzeit auf derselben Disk. Siehe [EvidenceArchive](../../app/Services/Archive/EvidenceArchive.php), `exportTombstones()` und Wiederherstellungsabgleich, sowie [Betriebsrunbook](../betrieb/deploy-runbook.md). + +**Korrigierter Vorschlag für Restfelder:** + +| Feld / Information | Entscheidung für die technische Spezifikation | +|---|---| +| `id` | Lokale technische Referenz; nicht allein als Identität beim Restore verwenden. | +| `payload_path` oder dauerhaft stabiler opaker Objektschlüssel | Erhalten. Muss ein Archivobjekt einschließlich gegebenenfalls alter Fassungen eindeutig identifizieren; darf keine Namen/E-Mails im Pfad enthalten. | +| `event`, `created_at`, `deleted_at`, `payload_hash` | Minimaler Lösch- und Integritätsnachweis; Hash nicht als anonym behandeln. | +| `subject_type`, `subject_id` | Bisher beschlossen; nicht zwingend für den dateibezogenen Restore. Nur behalten, wenn der konkrete Nachweiszweck bestätigt wird, sonst entfernen. | +| Akteur, Klartextgrund, Zusammenfassung, Hold-Freitext, Personen-/Rechtsvorgangsverweise | Nach Wegfall des Inhaltszwecks entfernen; keine indirekte Kopie in Audit-Freitexten anlegen. | +| Schemaversion und Sicherungsstatus | Technisch erforderlich für verlässlichen Import und Überwachung; keine Inhaltsdaten. | + +**Fristvorschlag:** Löschvermerk bis zum späteren der beiden Zeitpunkte aufbewahren: `deleted_at + 395 Tage` oder `Ende der letzten rückspielbaren Kopie + 14 Tage`. Die 395 Tage sind eine vorgeschlagene Nachweisfrist, keine gesetzliche Vorgabe. Fehlt das Ende einer Sicherung, muss die Kopie geklärt werden; daraus wird keine pauschale unbefristete Aufbewahrung aller Restfelder. + +**Konkretes Sicherungsverfahren als Vorschlag:** + +1. Vor Entfernung eines Archivobjekts einen dauerhaften Löschauftrag mit stabilem Objektschlüssel erstellen. Inhalt sofort für gewöhnliche Abrufe sperren. +2. Auftrag idempotent an einen unabhängig wiederherstellbaren Speicher übertragen und dessen Bestätigung festhalten. Täglicher Export dient zusätzlich als vollständiger Kontrollstand, nicht als einziger Schutz. +3. Objekt einschließlich bekannter Derivate löschen, erfolgreiche Löschung bestätigen und Restdaten minimieren. Scheitert ein Schritt, bleibt der Auftrag wiederholbar und wird alarmiert; die Löschung wird nicht als vollständig erledigt ausgewiesen. +4. Fällt das externe Ziel aus, Auftrag und Objektsperre erhalten, sofort alarmieren und die Fristverletzung eskalieren. Kein stilles endloses Zurückstellen von Löschungen; ein dokumentierter Ersatzweg benötigt ebenfalls unabhängig gesicherten Löschstand. +5. Bei Restore Anwendung isoliert lassen, aktuellen externen Löschstand und aktuelle Sperren importieren, Altobjekte entfernen, Integrität prüfen und erst anschließend normale Zugriffe freigeben. Bei unvollständigem Stand keine Freigabe des betroffenen Archivs. + +**Speicheranforderung:** Getrennter Restore-Lebenszyklus, eingeschränkte Schreibrechte, nachvollziehbare Versionen, passende Aufbewahrung und verfügbarer Verifikationsschlüssel. Derselbe Anbieter ist möglich; derselbe gemeinsam zurückgesetzte Datenbestand genügt nicht. Auswahl und Zugang bleiben Betriebsaufgabe. + +Ein Hash-Export unterstützt die Integritätsprüfung. Er ist allein weder manipulationssicherer Zeitstempel noch Garantie gerichtlicher Beweiskraft. Hashhistorie, Löschjournal und Schlüssel brauchen eigene Fristen; ein externer Export darf keine unbegrenzte zusätzliche Datensammlung erzeugen. + +**Zieltext für die DSE:** + +> Nach der Löschung eines Archivobjekts erhalten wir einen begrenzten technischen Löschvermerk, insbesondere Objektkennung, Ereignis, Zeitpunkte und Prüfsumme. Er verhindert, dass gelöschte Inhalte durch eine Wiederherstellung erneut verfügbar werden, und dient dem befristeten Nachweis der Löschung. Der Löschstand wird unabhängig von den wiederherzustellenden Daten gesichert. Seine Aufbewahrung richtet sich nach den noch rückspielbaren Sicherungen und der festgelegten Nachweisfrist. + +Die konkrete Frist aus der freigegebenen Matrix ist im endgültigen Abschnitt „Speicherdauer“ zusätzlich zu nennen. + +### K3 — Legal Hold und Einschränkung der Verarbeitung + +**IST:** Der Hold verhindert die Löschung. Er schränkt das Öffnen oder Exportieren nicht gesondert ein. Ein strukturiertes End-/Prüfdatum fehlt. Bei Aufhebung setzt der Code derzeit eine neue Standardfrist. Quellen: [EvidenceArchive](../../app/Services/Archive/EvidenceArchive.php), `setLegalHold()` / `releaseLegalHold()`, und [ArchiveEntry](../../app/Models/ArchiveEntry.php). + +**BESCHLOSSEN:** Kein automatischer Fristneustart. **VORSCHLAG:** Aufbewahrungssperre und Verarbeitungseinschränkung fachlich getrennt speichern. Art. 18 erlaubt bestimmte weitere Verwendungen, insbesondere zur Rechtsverteidigung; ein bloßer Löschstopp bildet diese Zweckbegrenzung nicht ab. [DSGVO, Art. 18](https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX%3A32016R0679) + +| Zustand / Aktion | Vorgabe | +|---|---| +| Hold setzen | Konkreter Anspruch, erforderlicher Datenumfang, Verantwortlicher, Setzzeitpunkt und Prüfdatum; vorgeschlagen spätestens nach 90 Tagen. Ein bekanntes Enddatum zusätzlich erfassen. | +| Prüfdatum erreicht | Wiedervorlage und Eskalation; keine automatische Löschung eines weiterhin notwendigen Belegs allein wegen einer überfälligen Prüfung. | +| Hold aufheben | Ursprüngliches `retain_until` erhalten. Ist es überschritten, nächster Löschlauf; Verlängerung nur mit konkretem Grund und neuem Enddatum. | +| Einschränkung setzen | Betroffene Objekte markieren; normale Verwendung und Exporte sperren. Zulässige Ausnahmeverwendung nur mit Berechtigung, Zweck und dokumentierter Grundlage. | +| Einschränkung aufheben | Voraussetzung prüfen und notwendige vorherige Information der betroffenen Person berücksichtigen; bloße Hold-Aufhebung darf die Einschränkung nicht entfernen. | + +**Ersatztext für die Interessenabwägung:** + +> Aufbewahrungssperren sichern erforderliche Belege gegen Löschung. Eine Einschränkung der Verarbeitung wird davon getrennt behandelt: Weitere Verwendungen werden auf die im Einzelfall zulässigen Zwecke begrenzt. Beide Zustände erhalten dokumentierte Gründe, Zuständigkeiten und Prüftermine. Diese technische Trennung ist ein Umsetzungsziel. + +**Abnahme:** Überfälliger Eintrag wird nach Hold-Aufhebung ohne Neustart fällig; eingeschränkte Inhalte sind im normalen Abruf gesperrt; freigegebene Ausnahmeverwendungen werden nachvollziehbar protokolliert. + +### K4 — AGB-Gate, Abonnements und bereits bezahlte Leistungen + +**Problem:** „Später entscheiden“ und automatische Umstellung bei Verlängerung widersprechen der Zusage, ohne Zustimmung unter alten Bedingungen fortzuführen. Auch bereits erworbene Credits und Einzelbuchungen dürfen nicht allein wegen des nächsten Einreichungszeitpunkts als unbelastete neue Käufe behandelt werden. + +**VORSCHLAG für einen implementierbaren Ausgangspunkt:** Bestehende Leistungsansprüche bleiben ohne neue Zustimmung unter den ihnen zugeordneten Bedingungen nutzbar. Schweigen und „Später“ erzeugen keinen Annahmedatensatz. Ohne wirksame Änderung gilt die bisherige Vertragsgrundlage auch bei automatischer Verlängerung weiter. Soll das geschäftlich enden, benötigt es einen gesonderten rechtlich geprüften Änderungs-/Beendigungsprozess; dieser wird nicht durch den Gate-Code ersetzt. + +| Fall | Gate und Leistungsbehandlung | +|---|---| +| Neue Bestellung nach wirksamer Einführung | Neue AGB vor Abschluss aktiv annehmen; Fassung und Zeitpunkt sichern. | +| Bestehendes Abo, keine Zustimmung | „Später entscheiden“ und Leistung nach zugeordneteter Altgrundlage; keine automatische Sperre oder fingierte Annahme. | +| Automatische Verlängerung ohne Zustimmung | Keine technische Umschreibung auf 0.7. Altgrundlage fortführen, sofern kein gesondert geprüfter Vertragsprozess greift. | +| Vor Einführung gekaufte Credits / bezahlte Einzelbuchung | Erwerbsgrundlage und zugesagte Leistung respektieren; beim Verbrauch keine ungeprüfte zusätzliche Zustimmung als Zugangshürde. | +| Neue Credits / neue Einzelbuchung | Neue Vertragsgrundlage vor Kauf; Verbrauch mit dieser Zuordnung. | +| Gemischter Creditbestand | Verbrauch je Erwerbslos nachvollziehen; keine globale Kontofassung, die alte Leistungsansprüche überschreibt. | +| Altvertrag unbekannt | Keine pauschale Behauptung „0.6 angenommen“; vorhandene Nachweise prüfen und Übergangsfall markieren. | +| DSE geändert | Information mit Version und Datum; keine Vertragsannahme oder Einwilligung aus bloßer Kenntnisnahme ableiten. | + +Rechtebestätigung, AGB-Annahme und KI-Erklärung bleiben getrennte Erklärungen mit passenden Fassungen. Das Gate muss auf Formularen, API und sonstigen Einreichungswegen dieselben Vertragszuordnungen respektieren. Bereits vorhandene Bestätigungen dürfen nicht rückwirkend ersetzt werden. + +**Anwaltsfrage:** Trägt diese Bestandsschutzlösung die bestehenden AGB und Leistungsansprüche? Falls eine Umstellung ohne Zustimmung gewünscht ist: Welche konkrete rechtliche Grundlage, Mitteilung und Frist sind erforderlich? Bis zur Antwort ist der automatische Versionswechsel kein Implementierungsziel. + +### K5 — Bildrechte: Erklärender und Vertragspartner + +**IST:** Das Protokoll speichert unter anderem Konto, Tokenkennung und Kanal. `form`, `api` und `magic_link` sind keine rechtlichen Rollen. Quelle: [PressReleaseImageUploader](../../app/Services/PressRelease/Images/PressReleaseImageUploader.php), `recordConfirmation()`. + +**VORSCHLAG:** Neue Bildrechte-Erklärungen stets einem nachweisbar gebundenen Vertragspartner zuordnen. Eine Kontaktadresse oder „handelnd für Firma X“ allein genügt nicht als gesicherter Nachweis einer Vertretungsmacht. Anscheinsvollmacht wird nicht als Standardannahme in den Ablauf eingebaut. + +| Weg | Zielprozess | +|---|---| +| Kontoinhaber im Hub | Erklärung durch berechtigte Person des Vertragskontos; Person und Vertragspartner getrennt dokumentieren. | +| Eigene API | Tokenkennung dem Vertragskonto zuordnen; Rollen-/Versionsangabe serverseitig plausibilisieren. | +| Partner-API | Partner als Vertragspartner, erforderliche eigene Rechte und Erklärungsbefugnisse nachweisen; Partnerbedingungen mit Annahmebeleg zuordnen. | +| Admin lädt vorbereitend hoch | Keine Rechtebestätigung im Namen des Kunden. Veröffentlichung erst nach Bestätigung durch berechtigte Person des Vertragskontos. | +| Pressekontakt ohne Konto / Altbestand ohne gebundenen Partner | Bildänderung vorbereiten lassen; vor neuer Veröffentlichung Bestätigung durch gebundenen Partner oder ausdrückliche neue Vertragsbindung mit Berechtigungsprüfung. Kontoregistrierung allein beweist noch keine Vertretungsmacht. | + +Bestehende bezahlte Leistungen dürfen durch die Umstellung nicht ohne geprüfte Übergangsregel entzogen werden. Bis dahin ist ein betreuter Bestätigungsweg vorzusehen. Die Kontaktperson kann weiterhin unentgeltliche Betroffenenrechte geltend machen; dafür ist keine Kontoanlage erforderlich. + +**Nachweisfelder:** Erklärende Person, Vertragspartner, Rolle, Kanal, Konto-/Tokenreferenz soweit vorhanden, Text- und Vertragsfassung, Zeitpunkt, bestehender IP-HMAC, zugehöriger Bildhash und Herkunft der Vertretungs-/Partnerzuordnung. Keine geheimen API-Schlüssel speichern. Nur erforderliche Daten erfassen und mit dem zugehörigen Rechtebeleg befristen. + +**Abnahme:** Jeder neue Veröffentlichungsweg besitzt einen überprüfbaren Vertragspartner-/Erklärungsbezug; der Admin kann keine fremde Erklärung erzeugen; historische unbekannte Rollen bleiben als unbekannt erkennbar. + +### K6 — Mailausnahmen und Link-Aufbewahrung + +**IST:** Nur `MagicLoginLink` ist als selbst angeforderte Mail von der Abmeldesperre ausgenommen. Hard-Bounce-Sperren bleiben wirksam. Der Meldebestätigungslink ist eine andere Mailklasse. Quellen: [GateOutgoingMail](../../app/Listeners/GateOutgoingMail.php), [PressReleaseReportController](../../app/Http/Controllers/Web/PressReleaseReportController.php). + +**Sofort verwendbarer Ersatz für den beschriebenen Ist-Zustand:** + +> Nach einer Abmeldung versenden wir keine entsprechenden Benachrichtigungen mehr. Selbst angeforderte Anmeldelinks sind von dieser Abmeldesperre ausgenommen. Bei dauerhaft unzustellbaren Adressen bleibt der Versand gesperrt. Für eine Klärung oder Entsperrung können Sie uns unter info@pressekonto.com erreichen. + +**VORSCHLAG:** Eine Erweiterung auf ausdrücklich angeforderte Melde-/Änderungsbestätigungen als eigene, getestete Versandregel umsetzen, soweit sie zur Bearbeitung erforderlich ist. Abmeldung, Hard Bounce, Missbrauchssperre und technischer Versandstopp getrennt behandeln. Kein allgemeiner Bypass für Transaktionsmails und keine Umgehung eines Hard Bounce. + +**Korrektur zur Speicherdauer:** Gültigkeit und Speicherung unterscheiden. Der bestehende [Bereinigungsbefehl](../../app/Console/Commands/PurgeMagicLinks.php) löscht Datensätze, wenn Ablauf oder Verbrauch länger als 30 Tage zurückliegt. Das betrifft auch enthaltene IPs und Nutzungsdaten; es gibt keinen Grund, sie zusätzlich bis zur allgemeinen 90-Tage-IP-Frist zu halten. + +> Zugangslinks sind grundsätzlich einmalig und 15 Minuten gültig; Bestätigungslinks aus dem Meldeverfahren 72 Stunden. Zugehörige Linkdatensätze werden im täglichen Bereinigungslauf entfernt, sobald Verbrauch oder Ablauf mehr als 30 Tage zurückliegen. Unabhängig davon geführte Vorgangs- und Versandnachweise folgen ihren eigenen Fristen. + +### K7 — OpenAI und nicht belegte Betriebszusagen + +**BETREIBER:** OpenAI Ireland und eingerichtete Zero Data Retention werden angegeben. **IST:** Ein fehlender `store`-Parameter belegt keine vollständige Unterdrückung sämtlicher anbieterseitiger Speicherung. OpenAI unterscheidet Anwendungszustand, Missbrauchsprotokolle und gesonderte Datenkontrollen; deren Verfügbarkeit hängt auch von Endpunkt und Modell ab. [OpenAI: Data controls](https://developers.openai.com/api/docs/guides/your-data) + +**Antwort:** Die Zusage „OpenAI speichert keine übermittelten Inhalte“ ist erst nach dem konkreten Nachweis vertretbar und gegebenenfalls auf dessen Umfang zu begrenzen. Benötigt werden Projekt/Organisation, tatsächlich eingesetzte Endpunkte und Modelle, bestätigte ZDR-Einstellung einschließlich relevanter Ausnahmen, DPA und aktivierte Speicher-/Verarbeitungsregion. Private Safety Processing und andere Aufbewahrungsvarianten sind nicht ohne Prüfung gleichzusetzen. + +**Text für das Anwaltspaket:** + +> Die aktive Textanalyse nutzt die OpenAI-API. Der Betreiber gibt OpenAI Ireland als Vertragspartner und eingerichtete Zero Data Retention an. Der konkrete Geltungsbereich und die Datenresidenz werden vor Übernahme einer absoluten Speicherzusage durch Organisations-/Projekteinstellungen und Vertragsunterlagen belegt. KI-Bildprüfung bleibt ausgeschaltet. + +Die finale öffentliche Formulierung muss der belegten Konfiguration entsprechen. Fehlender Nachweis aktiviert nicht automatisch einen anderen Datenverarbeitungsmodus. + +**Weitere Korrekturen:** „Nur zwei Administratoren“ erst nach Berechtigungsprüfung einschließlich Editor-Rollen und aktiver Sitzungen; „14 Tage Backups“ erst nach Inventar einschließlich Sonderkopien; „Portal-Updates mit Diff gespeichert“ als zukünftiges Vorhaben. Ein nicht vorhandener Passwort-Reset-Token beweist nicht, dass keine Juli-Mail versandt wurde. Maßgeblich sind Versandbelege und Mailtexte, nicht verbliebene Tokenzahlen. + +### K8 — Rechtliche Kurzschlüsse und Interessenabwägung + +Folgende Aussagen werden als pauschale Schlussfolgerungen zurückgenommen: + +| Bisherige Aussage | Korrigierte Arbeitsposition | +|---|---| +| „Kunden nicht anspruchsberechtigt; sechs Monate“ | Anspruchsgrundlage und Betroffenengruppe unterscheiden. § 9 Abs. 2 UWG kennt Verbraucheransprüche; § 11 sieht dafür ein Jahr vor. Konkrete B2B- und vertragliche Ansprüche separat prüfen. | +| Kleinanbieterstatus als allgemeines UrhDaG-„Sicherheitsnetz“ | § 7 Abs. 5 enthält eine widerlegliche Vermutung zu bestimmten Blockierungspflichten, keine allgemeine Freistellung vom UrhDaG. | +| „Serverseitig lit. f ohne weitere Voraussetzungen“ | Zweck, Erforderlichkeit, Datenumfang und Interessenabwägung bleiben erforderlich. | +| „Cookielos / technisch minimal, deshalb ohne Einwilligung“ | Für Zugriffe auf Endgeräte die Voraussetzungen des § 25 TDDDG gesondert prüfen; Datenminimierung allein ersetzt die Prüfung nicht. | +| „Kein Art. 9, weil keine Identifizierung“ | Keine biometrische Identifizierung schließt andere besondere Datenkategorien nicht aus. Veröffentlichung durch einen Kunden ist nicht automatisch Veröffentlichung durch die betroffene Person. | +| „DSFA nicht erforderlich / Art. 22 betrifft kein Bild“ | Konkrete Risiken, Umfang und Auswirkungen bewerten. Die spätere Bildprüfung benötigt eine dokumentierte Vorprüfung vor Aktivierung. | +| „Anzeige wäre falsch, weil Pressemitteilung“ | Inhaltsart schließt einen kommerziellen Zweck der bezahlten Hervorhebung nicht aus. Kennzeichnung anhand der tatsächlichen Darstellung prüfen. | +| „Archive erweitern die Kenntnis niemandes“ | Archivierung verlängert Verfügbarkeit und eröffnet Missbrauchs-/Offenlegungsrisiken, auch für zuvor nicht öffentliche Metadaten und Kontaktangaben. | + +Rechtsquellen: [§ 9 UWG](https://www.gesetze-im-internet.de/uwg_2004/__9.html), [§ 11 UWG](https://www.gesetze-im-internet.de/uwg_2004/__11.html), [§ 7 UrhDaG](https://www.gesetze-im-internet.de/urhdag/__7.html), [§ 25 TDDDG](https://www.gesetze-im-internet.de/ttdsg/__25.html), [DSGVO](https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX%3A32016R0679). + +**Ergänzende Vorgaben für die Interessenabwägung:** + +- Nicht allein auf Unveröffentlichung oder seltenen Zugriff abstellen. Für jeden Archivierungsanlass Zweck, notwendige Felder und mildere Alternative begründen; insbesondere Originalmetadaten und 250 Zeichen User-Agent nicht automatisch für erforderlich erklären. +- Verschlüsselung präzise beschreiben: Archivpakete werden anwendungsseitig verschlüsselt. Aktive Originaldateien liegen privat; deren separate Verschlüsselung ist durch den Upload-Code nicht belegt. Infrastrukturverschlüsselung benötigt einen eigenen Nachweis. +- Zugriffe unterscheiden: aktive Originale durch berechtigte Redaktion, entfernte Archivpakete über Compliance-Berechtigung. Protokolliert werden Abrufe archivierter Inhalte und Hold-Änderungen; nicht pauschal jede Listenansicht. +- Ergebnis unter Umsetzungsvorbehalt formulieren, bis Schutzmaßnahmen tatsächlich bestehen. Interessenabwägung spätestens vor Wirksamwerden der neuen Verarbeitung datieren und abzeichnen; bereits aktive Verarbeitung jetzt bewerten. Keine rückdatierte Freigabe. + +## 3. Aufbewahrungsmatrix als technische Arbeitsvorgabe + +Alle Fristen sind fachliche Zielwerte, soweit kein belegter Ist-Zustand genannt ist. **B** kennzeichnet übernommene Betreiberentscheidungen, **V** ergänzte Vorschläge. Rechtliche Bestätigung insbesondere für Archiv, Rechtsvorgänge und Nachweisfristen bleibt erforderlich. Verantwortlich für Zweck und Frist ist Kevin Adametz; Umsetzung und Laufüberwachung liegen bei Entwicklung/Betrieb, deren ausführende Zuständigkeit vor Beauftragung einzutragen ist. + +| Daten / Speicherumfang | Fristbeginn und Ziel | Regel / Ausnahme / Nachweis | +|---|---|---| +| Nie veröffentlichte Entwürfe, Text, Medien, Originale, Bestätigungen | **B:** 180 Tage seit letzter inhaltlicher Bearbeitung; bei wirksamer Nutzerlöschung unverzüglich | Tatsächlich löschen, nicht nur Status ändern. Hintergrundupdates verlängern die Frist nicht. Belegte Streitfälle gesondert; unklare Legacy-Veröffentlichung nicht automatisch löschen. | +| Abgelehnte, sicher nie veröffentlichte Einreichungen | **B:** Text/Bilder 180 Tage ab dokumentierter Ablehnung | Neues `rejected_at` oder belastbares Ereignis verwenden; fehlende historische Zeitpunkte nicht erfinden. | +| Minimaler Ablehnungsnachweis | **B:** drei Jahre nach Ende des Ablehnungsjahres | Nur Konto-/Vorgangsbezug, Status, Zeitpunkt, standardisierte Kategorie und gegebenenfalls notwendige Vertragsfassung. Kein abgelehnter Volltext im Freitext. | +| Normale Kontaktanfrage, Anhänge und zugehörige bearbeitungsbezogene Kopien | **V:** 180 Tage ab Abschluss | Im Code bisher nur Spam-Bereinigung. Vertrags-/Rechtsfälle gezielt umklassifizieren; kein pauschales Verlängern aller Kontakte. Offene Fälle monatlich prüfen. | +| Spam-Kontakte | **IST:** 30 Tage ab Eingang (`created_at`) | Bestehende Quarantänefrist; Fehlklassifizierung vor Löschung korrigierbar. | +| Melde-/Rechtsvorgang einschließlich Antragstellerkontakt | **B:** drei Jahre nach dokumentiertem Abschluss, ohne zusätzlichen Jahresendaufschlag | Konkreter fortbestehender Anspruch erhält dokumentierte Ausnahme. IP folgt kürzerer Frist. Archiv erhält nur Vorgangsreferenz nach K1. | +| Kündigung, Widerruf, Buchungsbestätigung | **V:** technisch gespeicherte Rohformulare 180 Tage nach Bearbeitung | Erforderlichen Vertrags-/Geschäftsnachweis separat kategorisieren; gesetzlich aufzubewahrende Unterlagen nicht mit Rohdaten löschen. Zugeordnete Frist vor Bestandslauf bestimmen. | +| Vorgangs-IP / letzte Login-IP | **B:** 90 Tage ab Erhebung beziehungsweise letzter Anmeldung | Kürzere Objektfrist geht vor. Letzten Login-Zeitpunkt nicht unbeabsichtigt mitlöschen; eigenen Zweck bewerten. Konkrete Sicherheitsfälle gesondert befristen. | +| Login- und Fehlversuchsereignisse, Kontosperren aus Anmeldeversuchen, Fehlversuchs-Tagessummen | **B:** 90 Tage ab Ereignis | Typen vollständig zuordnen; unbekannte Typen bei Einführung melden, statt beliebige Standardaufbewahrung zu etablieren. | +| Übrige notwendige Aktivitäts-/Mailereignisse | **B:** 395 Tage ab Ereignis | Empfänger und Betreff auf Zweck prüfen; keine Inhalte/Kontaktdaten zusätzlich in Freitext kopieren. Frist zu Nichtkunden gesondert rechtlich bestätigen. | +| API-Zugriffsprotokoll | **B / IST-Default:** 90 Tage ab Anfrage | Tokenkennung statt Geheimnis; Rechnung/Vertrag nicht durch technisches Zugriffslog ersetzen. | +| Magic-Link-Datensätze einschließlich IPs | **IST:** 30 Tage nach Verbrauch oder Ablauf, sobald eine der Bedingungen erfüllt ist | Täglicher Lauf; 15 Minuten/72 Stunden sind Gültigkeit, nicht Aufbewahrung. Weitere Tokentypen haben eigene Regeln. | +| Korrektur-Snapshots | **B / IST-Default:** 30 Tage ab Erzeugung gemäß `purge_after` | Offene Archivaufträge verhindern heute die Bereinigung. Tägliche Wiederholung, Alarm bei überschrittenem Ziel, begründete Einzelfallverlängerung; keine unsichtbare Daueraufbewahrung. | +| Veröffentlichte Mitteilung und benötigte aktive Bild-/Rechtenachweise | **B:** Dauer der zulässigen Veröffentlichung | Öffentlicher Inhaltsbestand und nichtöffentliche Nachweise unterscheiden; Nutzerkontolöschung entscheidet nicht automatisch über alle Veröffentlichungen. Entfernungsanträge einzeln bearbeiten. | +| Entfernte Beweisarchivpakete | **B:** drei Jahre nach Ende des Entfernungsjahres | Beispielsweise Entfernung 12.10.2026 → Fristende 31.12.2029; Löschung im ersten Lauf danach. K3 zu Hold/Einschränkung; je Ereignistyp rechtlich bestätigen. | +| Archivzugriffsprotokoll | **B:** 395 Tage ab Zugriff | Separate Bereinigung trotz gegenwärtigem Löschschutz des Modells spezifizieren. Nur benötigte Identität/Zweck; begründeten Streitnachweis vor Fristende gezielt übernehmen. | +| Minimierter Löschvermerk, externe Löschjournal-Kopien | **V:** späterer Zeitpunkt nach K2 | Keine unbegrenzten Exportgenerationen. Aktuelle erforderliche Löschkennungen müssen über alle erlaubten Restores hinweg verfügbar bleiben. | +| Bounce-Rohmails einschließlich Kopien in allen erfassten Ordnern | **B:** 90 Tage ab Eingang | `INBOX`, `Processed`, `Ignored`, `Unparsed`, Papierkorb/Archiv und weitere tatsächliche Kopien inventarisieren. IMAP-Löschmarkierung allein ist keine endgültige Entfernung. | +| Ausgewertete Bounce-Daten | **B:** 395 Tage ab Eingang des Rückläufers | Freitext minimieren, Sperrentscheidung getrennt erhalten. | +| Versand-Sperrliste | **B:** solange zur Beachtung der Sperre notwendig | **V:** jährliche Zweckprüfung; Mindestdaten Adresse, Grund, Zeitpunkt, Quelle. Abmeldung nicht durch Fristablauf reaktivieren; HMAC ist optionale spätere Minimierung. | +| Fehlerberichte / Server-, Proxy- und Transportlogs | **B:** 90 Tage ab Fehler / 14 Tage ab Logereignis | GlitchTip-Instanz und alle vorgeschalteten Logs getrennt belegen. App-Scrubber begrenzt nicht automatisch Proxylogs. | +| Eigene Ereignisstatistik / öffentliche Umami-Rohdaten | **B:** 395 Tage ab Ereignis / 13 Kalendermonate ab Erhebung | Aggregationen auf verbleibende Identifizierbarkeit prüfen; Instanzlöschung belegen. Hub-Nutzerkennung bleibt aus. | +| Kontodaten | Nach Kontolöschung, soweit kein konkreter anderer Zweck fortbesteht | Notwendige Vertrags-/Rechtenachweise abtrennen. Keine fortgesetzte allgemeine Kontonutzung für Archivzwecke. | +| Rechnungs-/Buchungsbelege, Geschäftsbriefe, übrige Vertragsnachweise | Je Dokumentklasse gesetzliche beziehungsweise begründete Frist | Vorgesehene 8/6 Jahre nicht auf alle Tabellen pauschal anwenden. Steuerberater/Anwalt bestätigt Klasse und Fristbeginn; Vertragsansprüche gesondert behandeln. | +| Backups einschließlich DB, Archiv, Volumes und Sonderkopien | **B:** höchstens 14 Tage reguläre Rückhaltezeit | Ausnahmen inventarisieren, Frist und Zweck bestimmen oder beseitigen. Keine generelle 14-Tage-Zusage, solange ältere rückspielbare Kopien existieren. | + +**Ausführungsregeln:** + +1. Einheitliche Fachzeitzone `Europe/Berlin` entsprechend `config/app.php`; Zeitstempel eindeutig speichern. Tagesfristen am jeweiligen Fristzeitpunkt, Jahresfristen nach Ablauf des 31.12. fällig. Kalenderjahre/-monate nicht stillschweigend als feste Tageszahl behandeln. +2. Ziel: tägliche Bereinigung fälliger Datensätze, erfolgreiche Ausführung grundsätzlich innerhalb von 24 Stunden nach Fälligkeit. Bestehende wöchentliche Läufe für betroffene neue Zusagen entsprechend anpassen. Fehlgeschlagene Läufe alarmieren und wiederholen. +3. Bereinigung umfasst Dateien, Ableitungen, Such-/Cachekopien und benötigte Versandkopien. Gesetzlich notwendige Nachweise vorher kontrolliert abtrennen; Backups über Rotation und Restore-Sperren behandeln. +4. Altbestand mit ursprünglichem Fristbeginn verarbeiten. Fehlende Daten kennzeichnen und gezielt klären; weder Fristen durch Migration neu starten noch unbekannte Fälle als sicher löschbar ansehen. +5. Bei Umstellung Bestandszählung und Vorschau, Prüfung der Ausnahmen, kleine nachvollziehbare Verarbeitungsschritte und Abschlussbericht ohne unnötige Personendaten vorsehen. +6. Holds gelten objekt-/zweckbezogen. Ein Streit um eine Rechnung verlängert nicht automatisch alle Login- oder Mailprotokolle. +7. Diese Matrix deckt den überprüften Paketumfang ab. Vor einer öffentlichen Bezeichnung als „vollständige Liste“ noch Sessions, Passwort-Reset-Tokens, API-Tokens, Warteschlangen/fehlgeschlagene Jobs und Anbieter-Kopien mit vorhandenen Systemregeln abgleichen; keine identischen Fristen allein wegen ähnlicher Namen annehmen. + +## 4. Antworten auf F1–F11 und A1–A7 + +Die Spalte „Antwort“ enthält die fachliche Arbeitsposition. „Recht offen“ bleibt eine begrenzte Prüfaufgabe und wird nicht durch ein pauschales „Default: Ja“ ersetzt. + +| Frage | Antwort / konkrete Vorgabe | Rest | +|---|---|---| +| F1 Nummerierung | Hostabhängige Nummern beibehalten, stabile Anker und Abschnittstitel für Querverweise. | Technische Umsetzung/Linkprüfung. | +| F2 Fehlerberichte | Feld-Positivliste, keine freien Formular-/Objektinhalte; technische Transportlogs separat. Server- und Browserverarbeitung getrennt begründen. | Recht offen: Notwendigkeit des Endgerätezugriffs; Betriebsnachweis der 90/14 Tage. | +| F3 Aktivität | 90/395 Tage nach Ereignistyp gemäß Matrix; Zugriff nach erforderlicher Aufgabe begrenzen, nicht allein mit „nur zwei Admins“ begründen. | Recht offen: notwendiger Umfang/Frist für Nichtkunden-Maileinträge. | +| F4 letzte Login-IP | 90-Tage-Bereinigung umsetzen; Bedarf einer vollständigen IP begründen. Zeitstempel und IP getrennt behandeln. | Abgleich, was die Sicherheitsseite tatsächlich zeigt; keine behauptete Anzeige übernehmen. | +| F5 Bounce/Sperrliste | 90/395 Tage, zweckgebundene Sperrliste; Ausnahmen wie K6. | Rechtsgrundlage passend zum Sperrgrund; Nachweis der Postfachbereinigung. | +| F6 Hub-Analyse | Ausgeschaltet lassen; keine Nutzerkennung aktivieren. Öffentliche Instanzfrist trotzdem belegen. | Spätere gesonderte Prüfung, keine Vorabzusage „ohne Einwilligung“. | +| F7 Newsletter/Altkonten | Nachgewiesenes Opt-in mit Bestätigung für spätere Kampagnen. Keine automatisierte Übernahme von Altkonten als Einwilligende. | Juli-Mailtexte, Empfängerregel und Versanddatum prüfen; vor Sichtung keine Aussage „in Ordnung“. | +| F8 Turnstile | Tatsächliche Formulare und serverseitige IP-Übermittlung nennen; Ausweitung als Ziel ausweisen. | Notwendigkeit, Ausfallverhalten, Anbieter-/Transfernachweise. | +| F9 KI-Bilder | Bleibt aus. Vor Aktivierung Datenumfang, besondere Kategorien, Folgen für Personen, DSFA-Vorprüfung und Anbieterbedingungen klären. | Eigenes Paket, keine Sperre für sachlich unabhängige Kernarbeiten. | +| F10 Portal-Updates | Geplanter Prozess: menschliche Überprüfung und dokumentierte Freigabe; nicht als vorhandene Funktion beschreiben. | Eigene Kennzeichnung/Art.-50-Prüfung vor Aktivierung. [KI-Verordnung, Art. 50](https://eur-lex.europa.eu/eli/reg/2024/1689/oj/deu) | +| F11 DSE-Versionen | Datierte Fassungen, Änderungshinweis, dauerhafte Altversionen; keine DSE-Zustimmung fingieren. | Veröffentlichung erst passend zum tatsächlichen Stand. | +| A1 Rechteklauseln | Nutzungen, Bearbeitungen, Vorschauen, soziale Netzwerke und Beweisarchiv ausdrücklich konsistent regeln. Keine pauschale Berufung auf stillschweigende Einwilligung für jede Weiterverwendung. | Anwalt prüft konsolidierten Volltext einschließlich Freistellung und Bearbeitungsgrenzen. | +| A2 Hoster/UrhDaG | Tatsächliche Tätigkeiten darstellen; Wortwahl allein entscheidet den Status nicht. Medienprivileg nicht als pauschale Löschabwehr verwenden. | Einordnung aktiver Funktionen und DSE-Absatz; K8. | +| A3 Vertretung | Rollen und Vertragspartner nach K5; Pressekontaktfall nicht mehr als geschlossene Regresskette beschreiben. | Zulässige Bestätigung/Vertragsbindung und Übergangsregel. | +| A4 Archiv | K1–K3 und Matrix anwenden; Original und Metadaten je Anlass begründen, Zugriff präzisieren. | Fristen, sensibler Inhalt und Altbestandsmigration rechtlich prüfen. | +| A5 Einbeziehung | Bestandsschutz einschließlich Verlängerung und Altcredits nach K4; keine automatische Annahme. | Geprüfter Ablauf und passende Vertragsfassungen. | +| A6 KI-Kundenmeldungen | Selbsterklärung des Einreichers erhalten. Alt-API darf ohne Erklärung nicht „ohne KI“ bestätigen. | Technisch `not_declared` mit unbekannter Herkunft; Partnerumstellung und rechtliche Pflichten konkret prüfen. | +| A7 Regressgesamtpaket | Kette pro Veröffentlichung belegbar machen; bloß vorhandene Datenfelder genügen nicht. Keine rückwirkende Ergänzung vermeintlicher Annahmen. | Partnerbedingungen, zeitlicher Integritätsnachweis und vollständige Musterakte. | + +Für die Alt-API gilt zusätzlich: Bestehende `none`-Werte nur dann korrigieren, wenn ihre automatische Herkunft zuverlässig festgestellt werden kann. Echte Kundenerklärungen bleiben erhalten. Unklare Historie kennzeichnen; Abwesenheit einer Angabe nicht als Angabe „ohne KI“ anzeigen. + +## 5. Löschanfragen und zusätzliche Themen + +### Vier Fragen zur Bearbeitung von Lösch-/Änderungsanfragen + +| Frage | Antwort / Empfehlung | +|---|---| +| Kostenfreie Rechte gegen bezahlte Depublikation | Erst feststellen, ob ein Betroffenenrecht geltend gemacht wird und welche Verarbeitung betroffen ist. Ein kostenpflichtiges Produkt ersetzt keinen notwendigen kostenfreien Rechteweg. Die Aussage „alle Voraussetzungen sind heute erfüllt“ entfällt ohne Nachweis, insbesondere für Altverträge. | +| Früher beworbener kostenloser connektar-Weg | Aussage, Zeitraum, Entfernung, tatsächliche Nutzbarkeit und konkrete Beschwerden dokumentieren. Keine pauschale Entwarnung oder Fristannahme; rechtliche Prüfung nach K8. Eine Massenmail zur Berichtigung wird nicht ohne Prüfung vorgeschlagen. | +| Realnamen-/Kontaktänderung | Anspruch und Vertretungsbefugnis prüfen, nicht ausschließlich Absender „Person oder Firma“. Ein bevollmächtigtes Unternehmen kann für eine betroffene Person handeln. Kommerzielle Änderungen ohne Rechtebezug bleiben ein getrenntes Angebot. | +| Empfänger in der Syndikation | Eigene tatsächliche Empfänger und erforderliche Benachrichtigungen ermitteln, Partnerfälle weiterleiten und Erledigung dokumentieren. Externe Kopien nicht als sicher gelöscht ausgeben. Partnerrollen anhand realer Zwecke/Entscheidungen prüfen, nicht vertraglich einfach behaupten. | + +Für Auskunft, Berichtigung, Löschung, Widerspruch und Einschränkung einen gemeinsamen Vorgang mit Eingangsdatum, Identitäts-/Vertretungsprüfung, Entscheidung, betroffenen Systemen, Empfängern und Wiedervorlage verwenden. Arbeitsvorschlag: Kevin Adametz als Verantwortlicher, Vertretung durch eine ausdrücklich benannte berechtigte Person; keine zusätzlichen Personaldokumente ohne konkreten Bedarf sammeln. + +### Boost, Refund und Syndikation + +- **Boost:** „Gebuchte Platzierung“ ist der bestehende Textvorschlag, keine bereits bestätigte rechtssichere Kennzeichnung. Bezahlten Charakter unmittelbar am Inhalt auf Desktop, Mobil, Listen und Teasern erkennbar machen; Tooltip allein genügt als Konzept nicht. Der Anwalt beurteilt echte Ansichten. Bis zur Freigabe keine neue Kennzeichnungszusage als umgesetzt ausweisen. +- **Refund:** Beschlossenes Modell B beibehalten. Tabelle und Klausel angleichen: Erstattung auch dann, wenn der Kunde die angebotene kostenfreie Überarbeitung einer abgelehnten Einzel-PM nicht nutzen möchte; nicht ausschließlich nach einer zweiten endgültigen Ablehnung. Gesetzliche Ansprüche bleiben unberührt. Doppelte Auszahlung/Creditgutschrift verhindern, Zahlungsstatus und Webhooks abstimmen. Wechsel des MAN-Zahlungswegs ist eine separate Geschäfts-/Technikentscheidung. +- **Syndikation:** Zunächst aktuelle Partnergrundlage sichern und falsche KI-Erklärungen beseitigen. Vertragsentwurf soll Erklärungsbefugnis, Rechteumfang, Korrektur-/Löschmeldungen, Re-Sync-Sperren und tatsächliche Datenschutzrollen regeln. „Ablehnung ohne Begründungspflicht“ nicht pauschal zusagen; gesetzliche Informationspflichten gesondert prüfen. +- **API-Nutzungsbedingungen:** Eigenes Dokument nur, wenn es einen zusätzlichen Regelungsbedarf gibt. Für den Nachweis entscheidend ist eine eindeutig zugeordnete, zugängliche und wirksam angenommene Vertragsfassung; nicht die Anzahl der Dokumente. + +## 6. Verbindlich zu liefernde Betriebsnachweise + +Hier bleiben nur Tatsachen offen, die der geprüfte Code nicht beweist. Eigentümer der Nachweisbeschaffung ist Kevin Adametz; Betrieb liefert technische Nachweise. Datierte Einstellungen ohne Geheimnisse/Token ablegen, keine personenbezogenen Kontolisten in frei zugängliche Dokumentation kopieren. + +| Kennung | Nachweis | Abnahmekriterium | +|---|---|---| +| BN-01 | Live-Release, Dokumentfassungen und relevante Feature-Schalter je Host | Hub-Identifizierung, Bildprüfung, Newsletter und Gate sind mit tatsächlichem Zustand dokumentiert; Code-Default genügt nicht. | +| BN-02 | Berechtigungen, aktive Konten, 2FA und Sitzungen | Nur erforderliche Konten/Rollen aktiv; Entzug kontrolliert. Kontolöschung ist nicht Voraussetzung für den Entzug unnötiger Adminrechte. | +| BN-03 | Backupinventar einschließlich DB, Disk, Redis-Persistenz, Deploy-/Migrationskopien | Jede rückspielbare Kopie hat Speicherort, Lebensdauer und Zuständigkeit. Sonderkopien widersprechen nicht mehr einer pauschalen 14-Tage-Zusage. | +| BN-04 | Externes Löschjournal und Schlüsselverwaltung | Unabhängiger Restore, Zugriffsrechte, Aufbewahrung, Fehleralarm und getesteter aktueller Import belegt. | +| BN-05 | GlitchTip, Proxy-/Webserverlogs, Umami und Bounce-Postfach | Einstellungen plus tatsächlicher Bereinigungslauf; 90/14 Tage, 13 Monate und 90-Tage-Postfachregel stimmen mit den Texten überein. | +| BN-06 | Tatsächliche Dienstleisterverträge und Transfergrundlagen | Vertragspartei, einschlägiges Dokument/Datum, Rollen und aktuelle Übermittlungsgrundlage belegt; bei Berufung auf DPF aktueller Status der richtigen Rechtseinheit. | +| BN-07 | OpenAI-Einstellungen | Nachweise nach K7, einschließlich konkreter aktiver Textanalyse; keine bloße Produktankündigung als Kontonachweis. | +| BN-08 | Juli-Mailtexte und Versand | Tatsächlicher Inhalt, Datum, Empfängerauswahl und Versandbeleg; Tokenanzahl nicht als Ersatz. | +| BN-09 | Lauf- und Restore-Protokolle | Produktive Löschläufe und isolierte Restore-Übung erfolgreich; konkrete Fehlerbehandlung nachgewiesen. | + +## 7. Entwicklungsaufgaben und Abnahme + +Alle nachstehenden Aufgaben sind **offen**. Dokumentkorrekturen sind mit dieser Ergänzung vorbereitet, nicht automatisch in öffentliche Texte veröffentlicht. Bestehende Tests sind Ausgangsbasis und ersetzen die Abnahme neuer Funktionen nicht. + +| Aufgabe | Ausführbarer Auftrag | Abnahme / Voraussetzung | Alte Zuordnung | +|---|---|---|---| +| **RP-01 — Dokumentstand** | K1–K8 in Sachverhalt und Interessenabwägung übernehmen; konsolidierte DSE/AGB/Bestätigungstexte mit Änderungsliste erstellen; Ist und Ziel kennzeichnen. | Keine unbewiesene Gegenwartsbehauptung; alle rechtlichen Bedingungen referenziert; alte Unterlagen als historische Quelle erkennbar. | V1–V3 beider Listen | +| **RP-02 — Fristen und Bestandsdaten** | Matrix auf konkrete Tabellen/Felder/Dateispeicher abbilden; Vorgangs-IP, Entwürfe, Ablehnungen, normale Kontakte und fachliche Vorgänge bereinigen. | Keine bloße Statusänderung als Löschung; Grenztage, Altbestand, offene Fälle, Dateien und Wiederholung geprüft. Fristen vor destruktivem Bestandslauf freigegeben. | bisher U1/U2; E1–E3/E9 | +| **RP-03 — Archiv und Einschränkung** | Hold ohne Neustart, gesonderte Einschränkung, strukturierte Prüffrist, minimale Restdaten und 395-Tage-Zugriffslog umsetzen. | K2/K3; Modell-Löschschutz kontrolliert anpassen, Integrität erhalten; notwendige Ausnahmen geprüft. | bisher U3 | +| **RP-04 — Externer Löschstand** | K2 implementieren, Exportversionierung/Fristen und Restore-Sperre ergänzen; Hashnachweis gesondert behandeln. | DB alt, Disk alt, beide alt, fehlendes externes Ziel, falsche Signatur, wiederholter Import und Löschung zwischen zwei Tagesexporten geprüft. BN-03/04 erforderlich. | bisher U7 | +| **RP-05 — Rechtebelege** | Historischen Einreichungsstand und Erklärendenrolle nach K1/K5 sichern; Bestätigung je Weg; Altarchivmigration planen. | Keine erfundene historische Erklärung; partnerlose Fälle und bezahlte Übergangsfälle geregelt; Musterakte vollständig. | Klärung U11; A3/A7 | +| **RP-06 — Vertragsgate** | K4 einschließlich Verlängerung, Altcredits, gemischter Guthabenlose und API umsetzen; Annahmen getrennt von „Später“. | Bereits erworbene Leistungen nutzbar; kein Annahmedatensatz ohne Erklärung; neue Käufe mit passender Fassung; rechtliche Übergangsantwort erforderlich. | Klärung U9; ursprüngliche Liste U8 | +| **RP-07 — Protokolle und Fehlerberichte** | Ereignisse 90/395 Tage, Fehler-Positivliste und freie Textfelder begrenzen. | Namen, E-Mails, Zugangsdaten und Formularwerte in URLs/Fehlerobjekten/Breadcrumbs als Prüffälle; tatsächlich gesendetes Schema prüfen. | bisher U4/U6 | +| **RP-08 — Mail und Links** | Bounce-Ordner vollständig bereinigen, Sperrgründe trennen, definierte angeforderte Bestätigungen zulassen, Linkfrist korrekt dokumentieren. | Abmeldung bleibt wirksam; Hard Bounce bleibt gesperrt; angeforderter berechtigter Vorgang erreichbar, alternativ manueller Weg; 30-Tage-Tokenbereinigung geprüft. | bisher U5 | +| **RP-09 — Legacy-API und Partner** | Automatische falsche KI-Erklärung beseitigen; Altbestand nach Herkunft behandeln; aktuelle Vertrags-/Erklärungszuordnung der Partner prüfen. | Neue unbekannte Angabe nicht als bestätigtes „ohne KI“; echte Erklärungen unverändert; Partnerübergang dokumentiert. | Klärung U8; A6 | +| **RP-10 — Betrieb und Berechtigungen** | BN-01 bis BN-09 liefern; Kontoberechtigungen bereinigen, Backups/Instanzfristen und Alarmwege einrichten. | Echte Nachweise statt Defaultwerte, benannte ausführende Zuständigkeit, offene Anbieterfragen geklärt. | ursprüngliche Liste U9; Klärung U13–U15 | +| **RP-11 — Zusatzpakete** | Boost-Kennzeichnung, Refund B und Syndikationsvertrag getrennt spezifizieren; Ist-Risiken in Kernfreigabe berücksichtigen. | Eigene Abnahme; keine ungeprüfte Erweiterung des Kern-Deploys. Gesetzlich notwendige Korrekturen aktiver Funktionen werden nicht verschoben. | Klärung U10/U12; Syndikation | +| **RP-12 — Texte und Freigabe** | Rechtliche Antworten einarbeiten, Interessenabwägung abzeichnen, passende Textfassungen und Gate-Zuordnungen ausrollen. | Zielmaßnahmen wirksam, Bestandsläufe/Restore nachgewiesen, Host-/Versionsprüfung, Rollback erhält Löschstand und Annahmen. | ursprüngliche Liste U8/U9 | + +**Reihenfolge:** RP-01 und technische Spezifikation parallel zur externen Klärung; danach RP-02 bis RP-10 nach Abhängigkeiten. RP-03 und RP-04 gemeinsam entwerfen, bevor Restfelder entfernt werden. RP-05 und RP-06 anhand freigegebener Rollen/Verträge bauen. RP-11 separat führen. RP-12 schließt das Kernpaket ab. + +**Gezielte Prüffälle für die spätere Implementierung:** Frist unmittelbar davor/danach und Jahreswechsel; derselbe Lauf zweimal; Dateifehler bei Teilverarbeitung; offener Archivauftrag; Hold plus Einschränkung; Kontolöschung nach Einreichung; fehlende historische Vertragsfassung; Abo-Verlängerung ohne Zustimmung; gemischte Credits; Partner-/Pressekontaktfall; Versand bei Abmeldung gegenüber Hard Bounce; Restore mit unvollständigem Löschstand. Die fachlichen Ergebnisse prüfen, nicht bloß interne Methodenaufrufe nachbauen. + +## 8. Verbleibende Entscheidungen — mit vorgeschlagener Antwort + +Diese Liste ersetzt die ungerichtete Frage „Ist alles ausreichend?“. Antworten jeweils mit Datum, Person und Bedingungen dokumentieren. Unabhängige technische Vorbereitung darf währenddessen weiterlaufen. + +| Kennung | Konkrete offene Entscheidung | Empfohlene Ausgangsposition | Wer / Auswirkung | +|---|---|---|---| +| **R-01** | Archiv je Ereignistyp: drei Jahre nach Jahresende, Originalmetadaten, sensible Inhalte, Antragstellerdaten und Altbestandsmigration tragfähig? | Minimaler Umfang nach K1–K3, keine pauschale Verweigerung von Rechten; Besonderheiten je Fall. | Anwalt + Betreiber; bestimmt RP-02/03/05 und DSE. | +| **R-02** | Sind 395 Tage Mail-/Archivzugriffslog und Löschbeleg, 180 Tage abgeschlossene Kontakte und übrige Matrixfristen verhältnismäßig? | Matrix als konkrete Prüfbasis; kürzere Frist verwenden, wenn Nachweiszweck fehlt. | Anwalt + Betreiber; bestimmt endgültige Löschkonfiguration. | +| **R-03** | Tragen Bestandsschutz, Verlängerung und Altcredits nach K4 die bestehende Vertragslage? | Keine automatische Umstellung ohne wirksame Grundlage; bestehende Ansprüche erfüllen. | Anwalt; Voraussetzung RP-06-Freigabe. | +| **R-04** | Welche Bindung/Vertretung genügt bei Partnern und Pressekontakten, und sind konsolidierte Bildrechtsklauseln wirksam? | Gebundener Vertragspartner und überprüfbare Erklärung statt angenommener Anscheinsvollmacht. | Anwalt + Betreiber; Voraussetzung neuer Bildwege. | +| **R-05** | Fehler-SDK/Turnstile ohne Einwilligung im konkret belegten Umfang zulässig? | Nur begründeter notwendiger Umfang; keine pauschale Zusage aus Cookielosigkeit. | Anwalt; bei negativem Ergebnis betroffenen Browserdienst anpassen/deaktivieren, manuelle Kontaktwege erhalten. | +| **R-06** | Hoster-/Medienprivileg, KI-Kennzeichnung, Löschentgelte und frühere connektar-Aussage korrekt behandelt? | Aktive Tätigkeiten und konkrete Texte vorlegen; keine allgemeine Haftungs-/Anspruchsfreiheit behaupten. | Anwalt; bestimmt betroffene Rechtstexte und aktive Prozesse. | +| **B-01** | Welcher unabhängige Speicher, welche Schlüssel-/Alarmzuständigkeit? | Geeignete vorhandene Infrastruktur mit getrenntem Restore und Ereignissicherung nach K2. | Betreiber/Betrieb; Voraussetzung RP-04-Implementierung. | +| **B-02** | Welche produktiven Einstellungen und Verträge gelten tatsächlich? | BN-01 bis BN-08 belegen; Betreiberangabe und technischen Nachweis getrennt halten. | Betreiber/Betrieb; Voraussetzung zutreffender öffentlicher Zusagen. | + +**Zuordnung der 14 Fragen der Versandfassung:** Nr. 1 → R-04/RP-11; Nr. 2 → R-03; Nr. 3 → R-01/R-02; Nr. 4/5 → R-06; Nr. 6 → A6 und separates Portal-Updates-Paket; Nr. 7 → RP-11; Nr. 8/9 → R-05; Nr. 10/11 → R-02 und K6; Nr. 12 → Abschnitt 5/R-06; Nr. 13 → K1/K2/K5; Nr. 14 → RP-11. Die drei späteren Aktivierungen bleiben F6/F7/F9 zugeordnet. Damit verschwindet keine bisherige Frage durch die Konsolidierung. + +**Geschäftliche Zuständigkeit:** Kevin Adametz bleibt für Umfang, Betreiberangaben und Freigabe zuständig. Anwalt sowie ausführende Entwicklungs-/Betriebsverantwortliche sind in der Übergabe namentlich einzutragen; ihre Mitwirkung oder Zustimmung wird hier nicht behauptet. + +## 9. Ab wann kann das Paket als umsetzungsreif gelten? + +- [ ] RP-01 liegt als widerspruchsfreier konsolidierter Entwurf mit dieser Korrekturfassung vor. +- [ ] R-01 bis R-06 sind beantwortet oder betreffen nach dokumentierter Abgrenzung ausschließlich ein späteres Zusatzpaket. +- [ ] B-01 und die für den Entwicklungsauftrag benötigten Teile von B-02 sind geklärt. +- [ ] Matrix ist freigegeben, auf konkrete Speicherorte abgebildet und enthält Regeln für Altbestand und Ausnahmen. +- [ ] RP-02 bis RP-10 haben benannte Zuständigkeiten und die oben festgelegten Abnahmekriterien; neue abweichende Entscheidungen sind eingearbeitet. + +**Dann:** „Kernpaket umsetzungsreif“. Bereits fachlich geklärte Teilaufgaben können vorher beginnen. Die verbleibenden Fragen sind keine Aufforderung, sämtliche Vorarbeiten anzuhalten. + +**Abgeschlossen** ist das Paket erst nach Implementierung, passenden erfolgreichen Tests, nachgewiesenen Lösch-/Restore-Läufen, erfüllten rechtlichen Bedingungen, abgezeichneter Interessenabwägung und Veröffentlichung der zutreffenden Fassungen. Produktive Datums-/Releaseangaben werden erst dann eingetragen. Ein Rollback darf gelöschte Inhalte oder widerrufene Berechtigungen nicht wieder aktivieren. + +## 10. Quellen und Prüfgrenzen + +Interne Grundlage: [Versandfassung](anwaltspaket-datenschutz-2026-10-12.md), [Klärungsdokument](klaerung-anwaltspaket-2026-10-12.md), [Interessenabwägung](interessenabwaegung-beweisarchiv-2026-10-12.md), [Live-Rechtstexte als Anlage](anlage-rechtstexte-live-2026-10-12.md), [ursprüngliche Codeauswertung](../archive/rechtliches-2026-10/auswertung-und-abschlussentscheidungen-2026-10-12.md), [Betreiberentscheidungen in der To-do-Liste](../archive/rechtliches-2026-10/todo-umsetzungsreife-und-abschluss-2026-10.md) und [Rückfragen/Betreiberergänzungen](../archive/rechtliches-2026-10/antworten-rueckfragen-anwaltspaket-2026-10-12.md). + +Die genannten Codebefunde wurden lesend abgeglichen. Diese Bearbeitung ändert Dokumentation und Navigation, keine Anwendung, Produktivkonfiguration oder Daten. Die zuvor dokumentierten 82 Tests mit 559 Assertions beziehen sich auf die frühere Ausgangsprüfung; sie belegen keine der hier neu vorgeschlagenen Funktionen. Für diese Dokumentänderung werden Verweise und Struktur geprüft, keine neuen Anwendungstests behauptet. + +Rechtliche Primärquellen wurden am 12.10.2026 zur Einordnung herangezogen und stehen bei den betreffenden Aussagen. Konkrete Vertragswirksamkeit, Interessenabwägung und externe Betriebszustände bleiben auf den beschriebenen Sachverhalt und die noch zu liefernden Nachweise angewiesen. diff --git a/dev/rechtliches/nachweise/README.md b/dev/rechtliches/nachweise/README.md new file mode 100644 index 00000000..0ee06a84 --- /dev/null +++ b/dev/rechtliches/nachweise/README.md @@ -0,0 +1,49 @@ +# Nachweise zum Anwaltspaket + +**Stand:** 13.10.2026 · Gehört zu [Versandfassung](../anwaltspaket-datenschutz-2026-10-12.md) und [Korrekturen, Abschnitt 6 (BN-01 bis BN-09)](../korrekturen-und-umsetzungsauftrag-2026-10-12.md). + +Regel: keine vollständigen E-Mail-Adressen, Tokens oder Schlüssel in diesem Ordner. Konten nur mit ID und Domain. + +Status: ✅ liegt vor · ◐ aus Code/Daten vorbelegt, auf Live bestätigen · ↻ neu aufnehmen · ☐ offen (Betreiber) + +Screenshots und Verträge (`*.png`, `*.pdf`) sind von Git ausgeschlossen und liegen nur lokal; sie gehen als Dateien mit dem Paket raus. + +## Vor dem Versand + +| Datei | Status | Hinweis | +|---|---|---| +| [`bn-02-berechtigungen-2026-10-13.md`](bn-02-berechtigungen-2026-10-13.md) | ✅ | 1 Admin-Konto mit Passkey und TOTP, keine Editoren; Ablauf in [`bn-02-ablauf.md`](bn-02-ablauf.md) | +| `boost-01-startseite-desktop.png` | ✅ | Aufmacher mit Label. Nur ein Boost aktiv, daher kein Rahmen-Label in der Liste | +| `boost-02-branchenseite-desktop.png` | ✅ | Aufmacher mit Label | +| `boost-03-startseite-mobil.png` | ✅ | v1.9.1: Bildnachweis unten rechts frei lesbar | +| `boost-04-tooltip.png` | ✅ | v1.9.1: Erklärung per Tipp, vollständig im Bild | +| `ui-01-upload-rechtebestaetigung.png` | ✅ | Schalter, Kurztext, vollständiger Wortlaut mit AGB-Fassung | +| `ui-02-upload-ki-angabe.png` | ✅ | KI-Kennzeichnung, „Keine Herkunftsdaten in der Datei gefunden“ | +| `ui-03-bild-nachweiszeile.png` | ✅ | Hub-Ansicht mit Bestätigungsprotokoll („Rechte bestätigt am …, img-confirm-v2, AGB 0.6, form“) | +| `ui-04-bild-detailfenster.png` | ✅ | Portal: Detailfenster und Zeile „Foto: … · KI-generiert“ unter dem Bild | +| `ui-05-konto-sicherheit.png` | ✅ | enthält die eigene IP des Betreibers | +| `ui-06-zustimmungsgate-dev.png` | ✅ | Dialog beim Einreichen mit „Neue Fassung unserer Bedingungen“ (AGB 0.6, Richtlinien 0.2). Dazu `ui-06b-buchung-agb-annahme.png` (✅): AGB-Annahme beim Kauf, passend zu Frage 2 | +| `ui-07-ki-hinweis-text.png` | ✅ | Hinweiskasten über dem Text | +| `avv-hetzner.pdf` | ✅ | Auswertung in [`bn-06-vertraege.md`](bn-06-vertraege.md) | +| `avv-all-inkl.pdf` | ✅ | dito | +| `cloudflare-dpf-2026-10-13-1.png`, `-2.png` | ✅ | Active – Re-certification under Review | +| `cloudflare-dpa.pdf` | ✅ | | +| `openai-dpa.pdf` | ✅ | Neuausfertigung 13.10.2026, DPA besteht seit vor dem Go-Live | +| `openai-zdr.pdf` | ✅ | OpenAI-Artikel: ZDR für das Konto derzeit nicht beantragbar → DSE ohne ZDR-Zusage | +| `openai-residency.png` | – | entfällt: `api.openai.com`, keine EU-Datenresidenz | +| [`bn-06-vertraege.md`](bn-06-vertraege.md) | ✅ | Vertragsübersicht; alle Verträge seit vor dem Go-Live | +| `openai-endpoints.md` | ◐ | aus dem Code; Live-Werte über BN-01 | +| `stripe-dpa.pdf` | ✅ | | +| `avv-fehlt.md` | – | nicht nötig, alle Verträge liegen vor | +| `juli-mail-abonnenten.md` | ✅ | Kampagne #1, 21.07.2026 | +| `juli-mail-aktive-konten.md` | ✅ | Kampagne #2, 22.07.2026 | +| `juli-mail-versand.md` | ✅ | auf Live bestätigt | + +## Vor Deploy 3 (parallel zur Anwaltsprüfung) + +| Datei | Status | Hinweis | +|---|---|---| +| `bn-01-release-und-schalter.md` | ✅ | Schalter wie im Paket beschrieben; doppelte `.env`-Einträge am 13.10.2026 bereinigt | +| `bn-03-backups.md` | ☐ | inkl. Roadmap 1.5 und `redis-cli CONFIG GET save` / `appendonly` | +| `bn-05-instanzfristen.md` | ☐ | GlitchTip 90 Tage, Nginx-Logrotate 14 Tage, Umami 13 Monate, Löschregel Bounce-Postfach | +| BN-04, BN-09 | – | entstehen mit RP-04 | diff --git a/dev/rechtliches/nachweise/bn-01-release-und-schalter.md b/dev/rechtliches/nachweise/bn-01-release-und-schalter.md new file mode 100644 index 00000000..5be33027 --- /dev/null +++ b/dev/rechtliches/nachweise/bn-01-release-und-schalter.md @@ -0,0 +1,82 @@ +# BN-01: Release und Schalter auf Live + +**Erhoben am:** 13.10.2026 · **von:** Betreiber · **Server:** Live (Ploi) + +## Befehle (auf dem Live-Server im App-Verzeichnis) + +```bash +php artisan --version +git describe --tags --always +grep -E '^(APP_ENV|SESSION_DRIVER|CACHE_STORE|UMAMI_ENABLED|UMAMI_PORTAL_ENABLED|UMAMI_IDENTIFY_USERS|LEGAL_ACCEPTANCE_GATE|IMAGE_RIGHTS_V2|IMAGE_PRECHECK|IMAGE_PRECHECK_STAGE|NEWSLETTER_SENDING_ENABLED|AUTH_REQUIRE_STRONG_ADMIN|OPENAI_API_URL|OPENAI_MODEL|CLASSIFICATION_MODEL|CONTENT_SCORE_MODEL|TURNSTILE_FAIL_OPEN|ARCHIVE_RETENTION_YEARS|BOUNCE_RETENTION_DAYS|MONITORING_ACTIVITY_RETENTION_DAYS|MONITORING_API_USAGE_RETENTION_DAYS|MONITORING_FAILED_LOGIN_RETENTION_DAYS|LOG_DAILY_DAYS)=' .env +php artisan tinker --execute 'foreach (["agb","datenschutz","richtlinien"] as $t) { $d = App\Models\LegalDocument::current($t); echo $t.": ".($d->version ?? "-")." ab ".($d->effective_from ?? "-").PHP_EOL; }' +``` + +Die `grep`-Zeile gibt nur Schalter und Fristen aus, keine Schlüssel. Fehlt ein Schlüssel in der Ausgabe, gilt der Code-Standard (Spalte „Standard“). + +## Ergebnis + +| Schlüssel | Bedeutung | Standard im Code | Live | +|---|---|---|---| +| Release-Tag | | | | +| `php artisan --version` | | | | +| `UMAMI_ENABLED` | Umami auf öffentlichen Seiten | false | | +| `UMAMI_PORTAL_ENABLED` | Umami im Kundenbereich (D7) | false | | +| `UMAMI_IDENTIFY_USERS` | Nutzerkennung an Umami (D7) | false | | +| `LEGAL_ACCEPTANCE_GATE` | Zustimmungsgate | false | | +| `IMAGE_RIGHTS_V2` | Bild-Upload mit Rechtebestätigung (D1) | false | | +| `IMAGE_PRECHECK` | KI-Vorabprüfung von Bildern (D8) | false | | +| `NEWSLETTER_SENDING_ENABLED` | Newsletter-Versand (D10) | false | | +| `AUTH_REQUIRE_STRONG_ADMIN` | Zweiter Faktor für Admins | true | | +| `SESSION_DRIVER` / `CACHE_STORE` | Speicher für Sitzungen und Anmeldezähler | database / database | | +| `OPENAI_API_URL` / `OPENAI_MODEL` | Endpunkt und Modell der Textprüfung | api.openai.com / gpt-5.4-mini | | +| `TURNSTILE_FAIL_OPEN` | Eingabe annehmen, wenn Cloudflare nicht erreichbar | true | | +| Fristen (`ARCHIVE_…`, `BOUNCE_…`, `MONITORING_…`, `LOG_DAILY_DAYS`) | | 3 J. / 395 / 395 / 90 / 90 / 14 | | +| AGB / DSE / Richtlinien laut `legal_documents` | aktive Fassungen | 0.6 / 0.3 / 0.2 | | + +**Muss stimmen, damit das Paket zutrifft:** `IMAGE_PRECHECK` aus (das Paket nennt D8 „ausgeschaltet“; in der lokalen Entwicklungsumgebung ist es an), `NEWSLETTER_SENDING_ENABLED` aus, `UMAMI_IDENTIFY_USERS` aus, `LEGAL_ACCEPTANCE_GATE` aus (laut Paket ausgeschaltet bis Deploy 3), `IMAGE_RIGHTS_V2` an (D1 „aktiv seit 28.09.2026“). + +## Ergebnis 13.10.2026 + +**Rohausgabe der `.env`-Zeilen** (vor dem Deploy von v1.9.1, mit Dubletten; `grep` zeigt nicht alle Zeilen, die Laravel lädt): + +``` +Laravel Framework 12.69.3 +v1.9.0 +APP_ENV=production +SESSION_DRIVER=redis +CACHE_STORE=redis +OPENAI_API_URL=https://api.openai.com/v1/chat/completions +OPENAI_MODEL=gpt-5.4-mini +IMAGE_RIGHTS_V2=false +IMAGE_PRECHECK=false +IMAGE_PRECHECK_STAGE=1 +LEGAL_ACCEPTANCE_GATE=false +ARCHIVE_RETENTION_YEARS=3 +NEWSLETTER_SENDING_ENABLED=false +UMAMI_ENABLED=false # Webseiten +UMAMI_PORTAL_ENABLED=false # erst nach DSE-Anpassung +UMAMI_IDENTIFY_USERS=false # erst nach DSE-Anpassung +agb: 0.6 ab 2026-07-03 00:00:00 +datenschutz: 0.3 ab 2026-07-03 00:00:00 +richtlinien: 0.2 ab 2026-09-22 00:00:00 +``` + +Nicht gesetzt und damit Code-Standard: `AUTH_REQUIRE_STRONG_ADMIN` (an), `TURNSTILE_FAIL_OPEN` (an), alle Fristen (395 / 90 / 90 Tage, Logs 14 Tage). + +**Widerspruch zum Verhalten von außen (geprüft 13.10.2026):** + +- `IMAGE_RIGHTS_V2=false`, aber die öffentliche API-Doku (`presseecho.de/de/api`, `pressekonto.com/de/api`) verlangt `rights_confirmed` und `confirm_text_version` (`img-confirm-v2`). Das erscheint nur bei aktivem Schalter. +- `UMAMI_ENABLED=false`, aber presseecho.de und businessportal24.com laden das Umami-Skript von `sys.adametz.media`. + +Die `grep`-Zeilen bilden die tatsächlich geladene Konfiguration also nicht ab, zum Beispiel wegen doppelter Schlüssel, Leerzeichen vor dem Gleichheitszeichen oder eines alten Config-Caches. Maßgeblich ist der geladene Wert: + +```bash +php artisan tinker --execute 'foreach (["app.env","session.driver","cache.default","images.rights_v2","images.precheck.enabled","legal.acceptance_gate","newsletter.sending_enabled","services.umami.enabled","services.umami.portal_enabled","services.umami.identify_users","auth.require_strong_admin_authentication","services.turnstile.fail_open","services.openai.url","services.openai.model"] as $k) { echo $k." = ".var_export(config($k), true).PHP_EOL; }' +grep -n -E "IMAGE_RIGHTS_V2|UMAMI_ENABLED" .env +``` + +**Ursache und Bereinigung (13.10.2026):** `IMAGE_RIGHTS_V2` und `UMAMI_ENABLED` standen doppelt in der `.env`; geladen wurde jeweils der Eintrag mit `true`. Beim Entfernen der Dubletten blieb zunächst `IMAGE_RIGHTS_V2=false` stehen. Nach dem Neuladen der Konfiguration war die Rechtebestätigung auf Live kurz aus; die API-Doku verlangte `rights_confirmed` nicht mehr. Der Schalter wurde wieder auf `true` gesetzt (`config:cache`, `queue:restart`, FPM neu geladen). Danach verlangte die API-Doku die Bestätigung wieder (`grep -c rights_confirmed` = 3). In der Zwischenzeit wurde kein Bild über das alte Formular hochgeladen (`rules_version IS NULL` seit 14:30 = 0). + +**Stand nach Bereinigung (v1.9.1):** jeder Schalter genau einmal in der `.env`. `IMAGE_RIGHTS_V2=true`, `UMAMI_ENABLED=true`; `UMAMI_PORTAL_ENABLED`, `UMAMI_IDENTIFY_USERS`, `IMAGE_PRECHECK`, `LEGAL_ACCEPTANCE_GATE` und `NEWSLETTER_SENDING_ENABLED` sind `false`. `AUTH_REQUIRE_STRONG_ADMIN` und `TURNSTILE_FAIL_OPEN` gelten mit dem Code-Standard `true`. OpenAI: `api.openai.com`, `gpt-5.4-mini`. Fassungen: AGB 0.6, DSE 0.3, Richtlinien 0.2. + +Erwartet laut Paket: `images.rights_v2 = true`, `services.umami.enabled = true`, alle anderen Schalter `false`; `auth.require_strong_admin_authentication` und `services.turnstile.fail_open` `true`. diff --git a/dev/rechtliches/nachweise/bn-02-ablauf.md b/dev/rechtliches/nachweise/bn-02-ablauf.md new file mode 100644 index 00000000..6f456382 --- /dev/null +++ b/dev/rechtliches/nachweise/bn-02-ablauf.md @@ -0,0 +1,92 @@ +# BN-02: Rollenprüfung auf Live, Ablauf + +**Ziel:** eine datierte Liste vorher und nachher. Die Nachher-Liste ist der Nachweis. +**Stand der Planung:** 13.10.2026, Bestand aus der lokalen Kopie der Live-Datenbank vom 07.10.2026. + +## Bestand (Kopie vom 07.10.2026) + +| ID | Domain | Rechte | Status | Daten am Konto | Vorgehen | +|---|---|---|---|---|---| +| 1 | pressekonto.com | `admin`, 1 Passkey, kein TOTP | aktiv | Betriebskonto | bleibt; neue Login-Adresse, Super-Admin-Merker, TOTP als Reserve | +| 18847 | me.com | **Super-Admin-Merker**, Rolle `customer`, 2 importierte API-Schlüssel (nie benutzt) | aktiv, letzte Anmeldung 14.07.2026 | 2 Mitteilungen, 2 Firmen; alter Entwicklerzugang des Betreibers | Merker entziehen, Schlüssel widerrufen, Sitzungen beenden, sperren, Adresse durch Zufallsadresse ersetzen | +| 15258 | stern-consulting.eu | `admin` | aktiv, letzte Anmeldung 2012 | keine | Rolle entziehen, löschen | +| 2 | stern-tours.de | `admin` | gesperrt | 1.762 Mitteilungen | Rolle `admin` → `customer` | +| 3 | googlemail.com | `admin` | gesperrt | 5 Mitteilungen, 7 Firmen | Rolle `admin` → `customer` | +| 13665 | gmx.at | `admin` | gesperrt | 2 Firmen | Rolle `admin` → `customer` | + +**Warum das alte Entwicklerkonto gesperrt statt gelöscht wird:** Beim Löschen eines Kontos werden seine Pressemitteilungen über den Fremdschlüssel mitgelöscht (`press_releases.user_id`, `cascadeOnDelete`), ohne Eintrag im Beweisarchiv. Ein gesperrtes Konto ohne Rechte, Schlüssel und Sitzungen hat keinen Zugang mehr. Löschen erst, wenn über die 2 Mitteilungen entschieden ist. Die Zufallsadresse unter der reservierten Domain `.invalid` gibt die alte Adresse frei, ist nicht erratbar und kann keine Mail empfangen. + +Die drei gesperrten Altkonten (2, 3, 13665) behalten ihre Adresse: Sie gehören zu Firmen mit veröffentlichten Mitteilungen, haben nach dem Rollenwechsel nur Kundenrechte und können sich als gesperrte Konten nicht anmelden. + +## Schritt 1: Vorher-Liste + +```bash +php artisan audit:admins > ~/bn-02-vorher.md +``` + +Ohne `--with-emails` enthält die Datei nur Domains und darf in diesen Ordner. Die Fassung mit vollständigen Adressen bleibt außerhalb des Repositorys. + +## Schritt 2: Betriebskonto vorbereiten + +1. Postfach für die neue Login-Adresse anlegen, mit einer zufälligen Zeichenfolge im lokalen Teil. Sie steht nirgends öffentlich und lässt sich nicht aus Name oder Rolle ableiten. +2. Im Hub unter Profil die E-Mail-Adresse ändern. Die Bestätigung wird zurückgesetzt; bis zum Klick auf den Link in der Bestätigungsmail ist der Admin-Bereich gesperrt (`verified`). +3. Super-Admin-Merker setzen. Das geht nur durch einen Super-Admin oder per Tinker: + + ```bash + php artisan tinker --execute 'App\Models\User::findOrFail(1)->forceFill(["is_super_admin" => true])->save();' + ``` + +4. Unter Konto-Sicherheit zusätzlich TOTP einrichten. Ohne zweiten Weg sperrt ein verlorener Passkey das einzige Admin-Konto aus. + +## Schritt 3: Altkonten bereinigen + +Vorher die IDs mit der Vorher-Liste abgleichen. Die Tabelle oben stammt aus der Kopie vom 07.10.2026. + +```bash +php artisan tinker --execute ' +$revoke = app(App\Services\Auth\SessionRevocation::class); + +$alt = App\Models\User::findOrFail(18847); +$alt->tokens()->delete(); +$alt->forceFill([ + "is_super_admin" => false, + "is_active" => false, + "email" => "gesperrt-".Illuminate\Support\Str::lower(Illuminate\Support\Str::random(24))."@pressekonto.invalid", +])->save(); +$revoke->revokeAllFor($alt); + +$leer = App\Models\User::findOrFail(15258); +$leer->syncRoles([]); +$leer->tokens()->delete(); +$leer->forceDelete(); + +foreach ([2, 3, 13665] as $id) { + App\Models\User::findOrFail($id)->syncRoles(["customer"]); +} +echo "ok\n";' +``` + +## Schritt 4: Nachher-Liste + +```bash +php artisan audit:admins > bn-02-berechtigungen-2026-10-XX.md +``` + +Die Zeile „Stand …: 1 Konto mit Zugang zum Admin-Bereich, davon 1 mit zweitem Faktor …“ geht ins Anwaltspaket (D3). Am Ende der Datei die Zugänge außerhalb der Anwendung eintragen (Ploi, Hetzner-Konsole, SSH). + +## Notfallzugang + +Den Notfallzugang hat der Betreiber über SSH auf dem Live-Server. Sperrt sich das Admin-Konto aus (Passkey verloren, kein TOTP), werden Zweitfaktoren per Tinker zurückgesetzt. Danach wie gewohnt anmelden und den Zweitfaktor unter Konto-Sicherheit neu einrichten: + +```bash +php artisan tinker --execute ' +$u = App\Models\User::findOrFail(1); +$u->passkeys()->delete(); +$u->forceFill(["two_factor_secret" => null, "two_factor_recovery_codes" => null, "two_factor_confirmed_at" => null, "is_active" => true])->save(); +app(App\Services\Auth\SessionRevocation::class)->revokeAllFor($u); +echo "Zweitfaktoren zurückgesetzt\n";' +``` + +Ohne Zugriff auf das Postfach geht ein neues Passwort ebenfalls per Tinker (`$u->forceFill(["password" => "…"])->save();`, wird gehasht). Den Vorgang danach im Aktivitätsverlauf oder hier mit Datum vermerken. + +Für die Nachher-Liste unter „Zugänge außerhalb der Anwendung“: SSH, Ploi und Hetzner-Konsole nur Betreiber [bestätigen oder ergänzen]. diff --git a/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md b/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md new file mode 100644 index 00000000..ad19261f --- /dev/null +++ b/dev/rechtliches/nachweise/bn-02-berechtigungen-2026-10-13.md @@ -0,0 +1,19 @@ +# Berechtigungen, Stand 13.10.2026 12:27 + +**Erhoben auf Live** mit `php artisan audit:admins` (v1.9.0), nach der Bereinigung laut [bn-02-ablauf.md](bn-02-ablauf.md). Eine Vorher-Liste wurde auf Live nicht gezogen; der Ausgangsbestand steht in bn-02-ablauf.md (Kopie der Live-Datenbank vom 07.10.2026): sechs Konten mit Rechten über den Kundenbereich hinaus, davon drei mit Admin-Zugang und eines mit zweitem Faktor. + +**Ausgeführt am 13.10.2026:** Betriebskonto mit Super-Admin-Merker und zusätzlich TOTP; alter Entwicklerzugang gesperrt, ohne Rechte, Schlüssel und Sitzungen, Adresse durch Zufallsadresse ersetzt; Altkonto ohne Daten gelöscht; drei gesperrte Altkonten von `admin` auf `customer`. + +Stand 13.10.2026: 1 Konto mit Zugang zum Admin-Bereich, davon 1 mit zweitem Faktor (TOTP oder Passkey), 1 Super-Admin, 0 Editor-Konten. Gelistet sind 1 Konten mit Rechten über den Kundenbereich hinaus, einschließlich gesperrter und gelöschter. + +| ID | E-Mail | Rollen | Super-Admin | Aktiv | Gelöscht | Admin-Zugang | TOTP | Passkeys | Letzte Anmeldung | API-Tokens | Sitzungen zuletzt widerrufen | +|---|---|---|---|---|---|---|---|---|---|---|---| +| 1 | …@pressekonto.com | admin | ja | ja | nein | ja | ja | 1 | 13.10.2026 12:12 | 0 | – | + +Admin-Zugang = aktiv und Super-Admin oder Rolle `admin`/`editor` (`User::canAccessAdmin()`). Sitzungen liegen in Redis und sind je Konto nicht zählbar; ein Widerruf beendet alle älteren Sitzungen. + +**Zugänge außerhalb der Anwendung** (nur Betreiber): + +- Ploi (darüber SSH) +- Hetzner-Konsole +- SSH-Schlüssel der Entwicklungsrechner (Mac mini Server, Mac Studio) diff --git a/dev/rechtliches/nachweise/bn-06-vertraege.md b/dev/rechtliches/nachweise/bn-06-vertraege.md new file mode 100644 index 00000000..00aff6e4 --- /dev/null +++ b/dev/rechtliches/nachweise/bn-06-vertraege.md @@ -0,0 +1,17 @@ +# BN-06: Dienstleisterverträge und Übermittlungsgrundlagen + +**Stand:** 13.10.2026 · Belege liegen als PDF/PNG in diesem Ordner (nicht im Repository, siehe `.gitignore`). + +**Abschluss:** Alle Verträge wurden vor dem Go-Live am 20.07.2026 geschlossen (Betreiberangabe 13.10.2026). Die Belege sind Neuausfertigungen bzw. Downloads vom 13.10.2026; daher tragen alle dieses Datum. + +| Dienst | Vertragspartner | Dokument | Fassung / Datum im Beleg | Übermittlung in Drittland | Anmerkung | +|---|---|---|---|---|---| +| Hosting, GlitchTip, Umami (Server) | Hetzner Online GmbH, Gunzenhausen | `avv-hetzner.pdf`, AV-Vertrag nach Art. 28 DSGVO, Kundennummer im Beleg | Fassung 1.2 vom 16.02.2026; von Hetzner gezeichnet „Gunzenhausen, den 13.10.2026“ | keine; Verarbeitung nur in EU/EWR (§ 3), Unterauftragnehmer außerhalb der EU nur für Standorte USA/Singapur | Unterschriftsfeld des Auftraggebers leer (Online-Abschluss). **Anlage 1** am 13.10.2026 im Konto erweitert: Personenstamm-, Kommunikations-, Vertragsstamm-, Protokoll- sowie Abrechnungs- und Zahlungsdaten. Betroffene laut Formular nur „Kunden und Interessenten des Auftraggebers“; weitere Gruppen bietet das Formular nicht an. | +| E-Mail (Versand, Rückläufer-Postfach) | ALL-INKL.COM – Neue Medien Münnich, Friedersdorf | `avv-all-inkl.pdf`, Standardvertragsklauseln nach Durchführungsbeschluss (EU) 2021/915 | Stand 25.08.2026; Datum im Beleg 13.10.2026; Kundennummer im Beleg | keine genannt | Unterauftragnehmer Neue Medien Münnich GmbH. | +| Turnstile | Cloudflare, Inc. | `cloudflare-dpa.pdf` (DPA als Teil der Nutzungsbedingungen, Annahme per Klick) | ohne Datum im Beleg | USA: EU-US Data Privacy Framework, Status am 13.10.2026 „Active – Re-certification under Review“, nächste Rezertifizierung fällig 15.09.2027 (`cloudflare-dpf-2026-10-13-1.png`, `-2.png`); zusätzlich SCCs im DPA | — | +| Textprüfung (KI) | OpenAI Ireland Ltd. (Kunde mit Sitz im EWR) | `openai-dpa.pdf`, OpenAI Data Processing Addendum, DocuSign | Neuausfertigung, beidseitig unterzeichnet am 13.10.2026; Organisations-ID im Beleg | Weitergabe an OpenAI-Gesellschaften außerhalb des EWR auf Basis von SCCs oder Angemessenheitsbeschluss (Ziff. 4) | Feld „Title“ beim Kunden mit „Herr“ ausgefüllt statt Funktion. Keine Zero Data Retention: derzeit nicht beantragbar; `openai-zdr.pdf` ist der OpenAI-Artikel vom 19.08.2026 (Update 22.09.2026), der ZDR für neuere Modelle ankündigt. Keine EU-Datenresidenz (`api.openai.com`). | +| Zahlungen | Stripe | `stripe-dpa.pdf`, Data Processing Agreement als Teil des Stripe-Vertrags | „Last updated: September 28, 2026“ | Regelungen im DPA | Stripe ist je nach Verarbeitung Auftragsverarbeiter oder selbst Verantwortlicher; die DSE beschreibt Stripe als eigenständig verantwortlich. | + +## Offen + +- Wiedervorlage: ZDR bei OpenAI erneut prüfen, sobald beantragbar; dann DSE-Abschnitt zur Inhaltsprüfung anpassen. diff --git a/dev/rechtliches/nachweise/juli-mail-abonnenten.md b/dev/rechtliches/nachweise/juli-mail-abonnenten.md new file mode 100644 index 00000000..0966ca75 --- /dev/null +++ b/dev/rechtliches/nachweise/juli-mail-abonnenten.md @@ -0,0 +1,34 @@ +# Juli-Mail an Konten mit Bestandsvertrag (BN-08) + +**Quelle:** Kampagne #1 im internen Newsletter-Modul (Admin ▸ Newsletter), Tabelle `newsletter_campaigns`. Abgelesen am 13.10.2026 aus der lokalen Kopie der Live-Datenbank (letzter Eintrag dort 07.10.2026). Auf Live gegenprüfen, siehe `juli-mail-versand.md`. + +| | | +|---|---| +| Betreff | Ihr Vertrag läuft weiter wie bisher – unser Portal ist neu | +| Angelegt | 21.07.2026, 12:19 | +| Versendet | 21.07.2026, 16:31 (Kampagne abgeschlossen) | +| Versandweg | `App\Mail\NewsletterCampaignMail`, zentrales Mail-Layout, Abmeldelink mit One-Click-Abmeldung (RFC 8058), Abmeldeart „Newsletter“ | + +## Text (wörtlich, Links als Text) + +> Sie haben bei presseecho.de / businessportal24.com einen laufenden Vertrag. Deshalb schreiben wir Sie direkt an: Seit dem 20.07.2026 läuft unser Portal auf einem neuen System. +> +> Für Ihren Vertrag gilt Bestandsschutz. Er läuft unverändert weiter, zum gleichen Preis und im gewohnten jährlichen Rhythmus. Sie müssen nichts tun. +> +> Falls Sie den Vertrag irgendwann nicht mehr brauchen, kündigen Sie ihn zum Ende der laufenden Abrechnungsperiode. Eine Antwort auf diese E-Mail genügt. Sie können auch auf eines der neuen Pakete wechseln, alle Preise stehen offen auf der Website. Müssen Sie aber nicht. Ihr Vertrag bleibt gültig, solange Sie ihn behalten möchten. +> +> Neu ist vor allem das Portal selbst. Wir haben es komplett neu gebaut. Ihre Pressemitteilungen laden schneller, sehen auf dem Handy endlich vernünftig aus, und die Technik dahinter ist so umgestellt, dass Google die Meldungen besser auswerten kann. Das gilt auch für alles, was Sie in der Vergangenheit veröffentlicht haben. Die Meldungen bleiben online und profitieren mit. +> +> Entdecken Sie die neuen Funktionen und Umfang der Presseportale. Weitere Features sind in Entwicklung. +> +> Eine Sache ändert sich im Alltag: Ihr Konto verwalten Sie künftig über pressekonto.com. Dort liegen Zugangsdaten, Firmenprofil und Rechnungen an einer Stelle. Beim nächsten Login [setzen Sie einmalig ein neues Passwort / bekommen Sie einen Anmeldelink per E-Mail]. +> +> Ihre Daten haben wir nach der aktualisierten Datenschutzerklärung übernommen. Sie ist im Portal verlinkt. +> +> Wenn etwas hakt oder unklar ist, antworten Sie einfach auf diese Mail. +> +> Freundliche Grüße +> +> Ihr Team von pressekonto + +**Hinweis:** Der Platzhalter in eckigen Klammern ist so versendet worden. diff --git a/dev/rechtliches/nachweise/juli-mail-aktive-konten.md b/dev/rechtliches/nachweise/juli-mail-aktive-konten.md new file mode 100644 index 00000000..b061f8e6 --- /dev/null +++ b/dev/rechtliches/nachweise/juli-mail-aktive-konten.md @@ -0,0 +1,34 @@ +# Juli-Mail an Konten mit Anmeldung im letzten Jahr (BN-08) + +**Quelle:** Kampagne #2 im internen Newsletter-Modul, Tabelle `newsletter_campaigns`. Abgelesen am 13.10.2026 aus der lokalen Kopie der Live-Datenbank (letzter Eintrag dort 07.10.2026). Auf Live gegenprüfen, siehe `juli-mail-versand.md`. + +| | | +|---|---| +| Betreff | Unser Portal ist neu – Ihr Account ist schon umgezogen | +| Angelegt | 22.07.2026, 10:35 | +| Versendet | 22.07.2026, 10:35 bis 19:34 laut Aktivitätsverlauf; Kampagne abgeschlossen am 23.07.2026, 02:49 | +| Versandweg | `App\Mail\NewsletterCampaignMail`, zentrales Mail-Layout, Abmeldelink mit One-Click-Abmeldung (RFC 8058), Abmeldeart „Newsletter“ | + +## Text (wörtlich, Links als Text) + +> Sie haben sich in den letzten Monaten bei presseecho.de / businessportal24.com angemeldet. Deshalb schreiben wir Sie direkt an: Seit dem 20.07.2026 läuft unser Portal auf einem neuen System. +> +> Das Wichtigste vorab: Ihr Account und Ihre Daten sind übernommen, Ihre veröffentlichten Pressemitteilungen bleiben online. Kosten oder Verpflichtungen entstehen Ihnen dadurch nicht. Es wird nichts automatisch gebucht, und nichts verlängert sich still. Ob und wann Sie wieder veröffentlichen, entscheiden Sie. Alle Preise stehen offen auf der Website. +> +> Neu ist vor allem das Portal selbst. Wir haben es komplett neu gebaut. Pressemitteilungen laden schneller, sehen auf dem Handy endlich vernünftig aus, und die Technik dahinter ist so umgestellt, dass Google die Meldungen besser auswerten kann. Das gilt auch für alles, was Sie in der Vergangenheit veröffentlicht haben. +> +> Eine Sache ändert sich im Alltag: Ihr Konto verwalten Sie künftig über pressekonto.com. Dort liegen Zugangsdaten, Firmenprofil und Rechnungen an einer Stelle, und von dort veröffentlichen Sie auf dem Portal. Beim nächsten Login [setzen Sie einmalig ein neues Passwort / bekommen Sie einen Anmeldelink per E-Mail]. Für Veröffentlichungen brauchen Sie künftig ein hinterlegtes Firmenprofil. Falls Ihres unvollständig ist, weist das System Sie beim Login darauf hin. +> +> Ihre Daten haben wir nach der aktualisierten Datenschutzerklärung übernommen. Sie ist im Portal verlinkt. Sollten Sie Ihren Account nicht mehr benötigen, können Sie ihn jederzeit löschen lassen. +> +> Wenn etwas hakt oder unklar ist, antworten Sie einfach auf diese Mail. +> +> Freundliche Grüße +> +> Ihr Team von pressekonto + +**Hinweis:** Der Platzhalter in eckigen Klammern ist so versendet worden. + +## Nicht versendet + +Kampagne #3 „Ihr Konto bei presseecho.de / businessportal24.com: Systemumzug abgeschlossen“ (an alle Konten, angelegt 22.07.2026) steht bis heute auf Entwurf, mit 0 Empfängern. Die übrigen rund 58.600 aktiven Altkonten (59.602 aktiv abzüglich der rund 965 Empfänger) haben also keine Information zum Umzug bekommen. diff --git a/dev/rechtliches/nachweise/juli-mail-versand.md b/dev/rechtliches/nachweise/juli-mail-versand.md new file mode 100644 index 00000000..31db3c7e --- /dev/null +++ b/dev/rechtliches/nachweise/juli-mail-versand.md @@ -0,0 +1,38 @@ +# Juli-Mails: Empfängerregel und Versandzahlen (BN-08) + +**Stand:** 13.10.2026. Vorbelegt aus der lokalen Kopie der Live-Datenbank und am 13.10.2026 auf Live bestätigt (Befehl unten): Kampagne #1 sent, 10/10/0/0; Kampagne #2 sent, 970/954/5/11, Protokollzeilen 497 versendet und 3 fehlgeschlagen; Kampagne #3 Entwurf ohne Empfänger. + +## Empfängerregel + +Die Regel steht in `app/Services/Newsletter/CampaignRecipients.php`. Sie gilt für beide Mails: aktive Konten mit E-Mail-Adresse, ohne Newsletter-Abmeldung. Dazu kommen je Mail die gespeicherten Filter: + +| Mail | Filter laut Kampagne | In einem Satz | +|---|---|---| +| #1 Bestandsvertrag | `legacy_contract: true`, `login: within`, `login_months: 12` | Konten mit laufendem Bestandsvertrag (Zahlungsvereinbarung „grandfathered“) **und** Anmeldung in den letzten 12 Monaten. | +| #2 Aktive Konten | `login: between 0–12 Monate`, `exclude_campaign_id: 1` | Konten mit Anmeldung in den letzten 12 Monaten, ohne die Empfänger von Mail #1. | + +**Begründung (Betreiber, 13.10.2026):** Die Beschränkung auf Konten mit Anmeldung in den letzten 12 Monaten war Absicht; die Filter wurden dafür gebaut. Konten ohne Anmeldung seit über einem Jahr gelten als nicht mehr genutzt und wurden nicht angeschrieben. Das gilt auch für Bestandsverträge ohne Anmeldung in diesem Zeitraum. + +## Anzahl + +| Mail | Empfänger laut Kampagne | versendet | fehlgeschlagen | übersprungen | Einträge „E-Mail versendet“ im Aktivitätsverlauf | +|---|---|---|---|---|---| +| #1 | 10 | 10 | 0 | 0 | 11 (21.07.2026, 12:20–16:31) | +| #2 | 970 | 954 | 5 | 11 | 955 (22.07.2026, 10:35–19:34) | + +**Auffälligkeiten, auf Live zu klären:** + +- Bei Mail #1 gibt es einen Eintrag mehr im Aktivitätsverlauf als in der Kampagne. Wahrscheinlich eine Testmail um 12:20, vor dem eigentlichen Versand um 16:31. +- Die Einzelprotokoll-Tabelle `newsletter_campaign_recipients` enthält zu Mail #2 nur 500 Zeilen (497 versendet, 3 fehlgeschlagen). Kampagnenzähler und Aktivitätsverlauf nennen dagegen rund 955. + +## Prüfung auf Live + +```bash +php artisan tinker --execute ' +foreach (App\Models\NewsletterCampaign::query()->orderBy("id")->get() as $c) { + echo $c->id." | ".$c->status->value." | ".$c->subject." | total ".$c->recipients_total." | sent ".$c->sent_count." | failed ".$c->failed_count." | skipped ".$c->skipped_count." | ".$c->sent_at.PHP_EOL; + echo " Protokollzeilen: ".json_encode(DB::table("newsletter_campaign_recipients")->where("newsletter_campaign_id", $c->id)->selectRaw("status, count(*) n")->groupBy("status")->pluck("n", "status")).PHP_EOL; +}' +``` + +Gegenprobe im Admin: Berichte ▸ Aktivität, Typ „E-Mail“, Suche nach dem Betreff. diff --git a/dev/rechtliches/nachweise/openai-endpoints.md b/dev/rechtliches/nachweise/openai-endpoints.md new file mode 100644 index 00000000..cf7e0e78 --- /dev/null +++ b/dev/rechtliches/nachweise/openai-endpoints.md @@ -0,0 +1,17 @@ +# OpenAI: Endpunkte und Modelle (BN-07) + +**Stand:** 13.10.2026, aus dem Code (Release v1.8.x). Die Werte auf Live werden mit BN-01 bestätigt (`OPENAI_API_URL`, `OPENAI_MODEL`, `CLASSIFICATION_MODEL`, `CONTENT_SCORE_MODEL`, `IMAGE_PRECHECK`). + +**Kurzfassung:** Die Textprüfung nutzt `POST https://api.openai.com/v1/chat/completions` mit `gpt-5.4-mini`, ohne `store`-Parameter und ohne Organisations- oder Projekt-Header. + +| Zweck | Klasse | Endpunkt | Modell | Status | +|---|---|---|---|---| +| Textprüfung (Rot/Gelb/Grün) | `OpenAiClassificationDriver` | `chat/completions` | `CLASSIFICATION_MODEL`, sonst `OPENAI_MODEL` (Standard `gpt-5.4-mini`) | aktiv | +| Inhaltsbewertung (Content-Score) | `OpenAiContentScoreDriver` | `chat/completions` | `CONTENT_SCORE_MODEL`, sonst `OPENAI_MODEL` | aktiv | +| KI-Vorabprüfung von Bildern (D8) | `OpenAiImagePrecheckDriver` | `chat/completions` (Bild als base64) | `IMAGE_PRECHECK_MODEL`, sonst `OPENAI_MODEL` | nur mit `IMAGE_PRECHECK=true` | + +- Alle Anfragen enthalten nur `model`, `response_format: json_object` und `messages`. Authentifizierung per API-Schlüssel, ohne `OpenAI-Organization`- oder `OpenAI-Project`-Header. Welche Organisation und welches Projekt gelten, bestimmt also der Schlüssel. +- Basis-URL ist `api.openai.com`, nicht `eu.api.openai.com`; es gibt keine EU-Datenresidenz. Die DSE nennt deshalb eine mögliche Verarbeitung in den USA auf Grundlage von Standardvertragsklauseln. +- Keine Zero Data Retention (Stand 13.10.2026, siehe `bn-06-vertraege.md`). +- Andere KI-Anbieter (Gemini, Anthropic) sind nicht angebunden. Sie stehen nur in Kommentaren als „folgt später“. +- Fällt OpenAI aus, prüft die Anwendung regelbasiert weiter (`deterministic`), ohne einen anderen Anbieter. diff --git a/dev/roadmap.md b/dev/roadmap.md index 1c017270..f3f7228f 100644 --- a/dev/roadmap.md +++ b/dev/roadmap.md @@ -1,81 +1,220 @@ -# Roadmap / Offene Punkte +# Roadmap -Stand: 20.07.2026 (Go-Live-Tag). Kurzfristiges zuerst; Details zu erledigten -Phasen im Archiv (`dev/archive/`). +**Stand:** 13.10.2026 · Release **v1.9.1** · Live seit 20.07.2026 (pressekonto.com, presseecho.de, businessportal24.com) -> **Hinweis 29.09.2026:** Die laufende Planung steht in -> `dev/2026-09-01/roadmap-2026.md`, der Entwicklungsstand in -> `dev/2026-09-11-audit/ENTWICKLUNGSPLAN.md` und im jüngsten Umsetzungsaudit. -> Die Punkte unten stammen vom Go-Live-Tag; ihr Stand ist dort nicht -> nachgeführt und wird im Umsetzungsaudit vom 29.09. (Abschnitt 6.4) als „auf -> Live zu bestätigen" geführt. +Diese Datei ist **die einzige laufende Liste offener Punkte**. Sie fasst alle +Pläne, Audits und Protokolle unter `dev/` zusammen (Abgleich gegen Code und +Git am 09.10.2026). Die Einzeldokumente bleiben als Begründung und Historie +erhalten und sind je Punkt verlinkt. Neue offene Punkte kommen hierher, nicht +in die Einzeldokumente; erledigte Punkte werden durchgestrichen und mit Datum +oder Release versehen. -## Nachlauf Go-Live (kurzfristig) +| Aufwand | Bedeutung | +|---|---| +| S | eine Stunde bis ein halber Tag | +| M | ein bis drei Tage | +| L | länger oder abhängig von Dritten | -- [ ] **Go-Live-Mails** an Bestandskunden: erst `php artisan - auth:send-go-live-mails --dry-run` (Anzahl prüfen), dann scharf. - Massenversand läuft über die Queue → Worker-Status vorher grün, - Betriebsüberwachung während des Versands im Blick. -- [ ] **API-Kunden-Mailing** (Connektar & Co.) mit Hinweis auf neue Doku - (`/docs/api/v1`) und Token-Migration — Texte [EXTERN]. -- [x] **Git-Hygiene (R6.5):** erledigt 20.07. — `fix/zeitzone-europe-berlin` - nach `main` gemerged (`7b27ec5`), Release-Tag **v1.0.0**, beides auf - origin. Künftig Feature-Branches von `main`. -- [ ] **Stripe-Test-Artefakte bereinigen:** Test-`stripe_id` am Testuser, - Test-Subscription-Zeilen, STR-Testrechnungen — damit die - Rechnungsnummern-Sequenz sauber ist. -- [ ] **Monitoring scharf:** `MONITORING_ALERT_EMAIL` gesetzt? Cron/Scheduler - + Queue-Worker in Ploi überwacht? -- [ ] **Umami-Snippets** je Domain einbinden (`dev/betrieb/umami.md`). -- [ ] **Connektar-API-Keys rotieren** (mittelfristig — die Legacy-Keys sind - über diverse Test-Kanäle gelaufen; Rotation über `/customer/tokens`). -- [ ] **Alt-System endgültig abschalten**, sobald ein paar Tage stabil: - Webspace und Alt-DBs auf dem KAS stilllegen; vorher letztes Backup der - Alt-DBs und Alt-Uploads sichern. Danach kann auch `dev/migration/` (7 GB - lokales Medien-Staging) auf ein Backup-Medium und vom Arbeitsrechner - runter. **Das KAS-Hosting selbst bleibt** (E-Mail-Postfächer, Stand - 06.10.2026); der SSH-Zugang des Altsystems ist geändert und deaktiviert. +**[EXTERN]** = liegt beim Betreiber, Anwalt, Steuerberater oder Partner, nicht im Code. +**[LIVE]** = einmaliger Nachweis bzw. Handgriff auf dem Server. -## Beobachten (erste Wochen) +--- -- [ ] Betriebsüberwachung täglich: failed_jobs, Worker, Medien-Privatisierung. -- [ ] `storage/logs/laravel.log` auf neue Fehlermuster. -- [ ] Search Console: Indexierung der neuen Domains + 301-Ketten der - Legacy-URLs (www-Redirects, .html-Redirects, presskit→Newsroom). -- [ ] MySQL-Auslastung (die Filesort-Spirale ist behoben; bei neuen - Slow-Queries → Slow-Query-Log). +## 0. Lage -## Nächste Entwicklungen / Optimierungen (Ideen-Backlog) +- **Seit Go-Live erledigt:** Roadmap Nutzergewinnung Block 0–2 und RSS (3.1), + Audit 11.09. mit Blöcken 1–10 (live als v1.1.0), Bildrechte Deploy 1, 1b, 2, + 2b (28.09.), Git-Deploy (v1.1.3), Volt entfernt (v1.2.0), + Rechnungsversand, Betriebsüberwachung Phase 1 und externer Monitor, + Sicherheitsaudit 07.10. S-01 bis S-06 (v1.4.0–v1.6.0), Spamschutz (v1.7.0), + Löschfristen und Wortwahl (v1.8), Boost-Kennzeichnung (v1.9), + Anwaltspaket versandfertig (13.10.). +- **Was offen ist:** die **Antwort des Anwalts** (danach Deploy 3), einige + **Nachweise auf Live**, der Dev-Container (1.3) und der **Wachstumsteil**: + Changelog (6.6), Spitze (6.14), Agenturmodell (6.3), Monitoring Phase 2/3. +- **Wachstum messen:** Abbruchbedingungen für Block 1–3 stehen seit + 13.10.2026 (6.1); vorher müssen die Messfehler im Trichter raus (6.16). -- [x] **Volt entfernen, auf Livewire-4-Single-File-Components umstellen** - — **erledigt 06.10.2026** (Branch `technik/volt-entfernen`). 83 - Komponenten auf `Livewire\Component`, 73 Routen auf - `Route::livewire()`, 88 Testdateien auf `Livewire::test()`/ - `Livewire::actingAs()`; `VoltServiceProvider` gelöscht, - `livewire/volt` entfernt (sonst keine Paketänderung). - `config/livewire.php` auf v4-Schlüssel: `component_layout`, - `component_placeholder`, `component_locations`, `make_command` (SFC - ohne ⚡). Befund dabei: Der alte Schlüssel `layout` war wirkungslos, - Livewire 4 legte seinen Standard `layouts::app` darüber; alle 73 - gerouteten Komponenten setzen ihr Layout aber selbst. CLAUDE.md, - AGENTS.md, `boost.json`, `.cursorrules` und der Skill - `volt-development` angepasst bzw. entfernt (von Hand — - `boost:update` hätte nebenbei alle Skills auf eine neue - Boost-Fassung gehoben, das ist ein eigener Schritt). Suite 2.325 - grün, einer übersprungen; Larastan und Pint ohne Meldung. - **Larastan erfasst die Komponenten weiterhin nicht**: Es analysiert - nur `.php`-Dateien, Single-File-Komponenten sind Blade-Dateien. - Abhilfe wäre die Umwandlung einzelner großer Komponenten in - Klassen-Komponenten (`php artisan livewire:convert`), kein Muss. +### Releases seit Go-Live -- [ ] Frontend-Audit-Reste aus `dev/archive/frontend-audits/ - frontend-optimize-protokoll.md` sichten — P2/P3-Punkte, die bewusst - liegen geblieben sind. -- [ ] Offene [EXTERN]-Entscheidungen aus dem Release-Plan prüfen - (`dev/archive/release/entwicklungsplan-release.md`): Preisfreigabe, - Refund-Policy. -- [ ] Cache-Warmer im Scheduler (Startseite + Top-Kategorien alle 5 Min - vorbauen), falls Kaltaufbauten nach Deploys stören — Option B aus der - Performance-Session vom 20.07.; aktuell nicht nötig. -- [ ] Redis als Cache-/Queue-Store erwägen, wenn die Last wächst - (aktuell `database`-Store, läuft stabil). +| Release | Datum | Inhalt | +|---|---|---| +| v1.0.0 | 21.07. | Go-Live | +| v1.1.0 | 05.10. | Audit-Blöcke 1–10, Betriebsüberwachung Phase 1 (letzter SFTP-Deploy) | +| v1.1.1–v1.1.3 | 06.10. | GlitchTip-Fixes, Git-Deploy live | +| v1.2.0 | 06.10. | Volt entfernt, Livewire-4-Single-File-Components | +| v1.3.0–v1.3.2 | 06.10. | Rechnungsversand, fehlgeschlagene Anmeldungen, Worker-Prüfung im Deploy | +| v1.4.0/v1.4.1 | 07.10. | Sicherheitsaudit S-01–S-06, Passkeys, Zweitfaktor-Pflicht für Admins | +| v1.5.0 | 08.10. | Proxy-Vertrauen, HSTS, API-Zugang endet mit der Buchung | +| v1.6.0/v1.6.1 | 08.10. | Andere Geräte abmelden, IP-Login-Limit, Passwortregeln, CSP im Melde-Modus, Imagick | +| v1.7.0 | 09.10. | Spamschutz mit Cloudflare Turnstile | +| v1.8.0/v1.8.1 | 12.10. | Sicherheitsseite „Geräte und Anmeldungen“, Breadcrumbs ohne Daten, Löschfristen Aktivitätsverlauf/API-Protokoll, Newsletter-API 410, Wortwahl „automatisierte Prüfung“ | +| v1.9.0/v1.9.1 | 13.10. | Boost als „Gebuchte Platzierung“ mit Erklärung, „Aktuell“ statt „Top-Auswahl“, Admin-Aktion „Boost beenden“, `audit:admins` | +| v1.10.0 | 13.10. | Trichter misst Verwaltungsseite, Anforderung und Firma bei der Einlösung; Admin ▸ Reports ▸ Wachstum; Umami-Anbindung (`umami:report`, `growth:report`) | +| v1.11.0 | 13.10. | Newsroom-Seite mit Kasten „Diesen Newsroom verwalten“; Firmenseiten „Firma & Newsroom“ mit Link zum öffentlichen Newsroom | +| v1.12.0 | 14.10. | Veröffentlichungs- und Ablehnungsmail: Anmeldelink an die Adresse der Mail (`/zugang`), ohne Konto und Passwort | +| v1.13.0 | 14.10.2026 | Changelog: Entwürfe beim Deploy, Freigabe im Admin, `pressekonto.com/changelog` mit RSS, „Was ist neu“ im Kundenmenü | +| v1.13.1 | (Deploy offen) | Prüfmail „ein Mensch prüft“ mit Anmeldelink für Empfänger ohne Konto; Changelog im Hub-Header und -Footer verlinkt | + +--- + +## 1. Sofort — Altlasten mit Personenbezug und Zugangsdaten + +| # | Punkt | Quelle | Aufwand | +|---|---|---|---| +| ~~1.1~~ | ~~**Produktiv-SQL-Dumps in der Git-Historie.**~~ **Erledigt 09.10.2026:** aus allen Branches und Tags entfernt (Inhalt unverändert, Hashes neu, Zuordnung in [`commit-map-2026-10-09.txt`](archive/commit-map-2026-10-09.txt)), Force-Push auf `origin` und `NAS`, Server abgeglichen, Speicherbereinigung in Forgejo und auf dem NAS, keine weiteren Klone. Vorgehen für künftige Fälle: [git-deploy.md, Abschnitt G](betrieb/git-deploy.md). | [Release-Plan R6.2](archive/release/entwicklungsplan-release.md) | — | +| ~~1.2~~ | ~~**Schlüssel rotieren**~~ — **Live-Schlüssel bereits rotiert** (OpenAI, Google OAuth, Mail-Zugang, Connektar; Betreiber, bestätigt 09.10.2026). Offen bleiben nur die Entwicklungsschlüssel unter 1.3: Context7 (stand in `.mcp.json`, Git-Historie) und das lokale MySQL-Root-Passwort (Git-Historie). | [optimize 14.07. K2](archive/optimize/optimize-14-07-2026.md), [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md) | — | +| 1.3 | **Dev-Container neu erstellen.** `docker-compose.yml` ist bereinigt, im laufenden Container sind `DB_CONNECTION` … `DB_PASSWORD` aber weiter als Umgebungsvariablen gesetzt — genau die Ursache des Datenverlusts vom 07.10. Danach lokalen `APP_KEY` reparieren (33 statt 44 Zeichen, ungültig) und Cloudflare-Testkeys in die lokale `.env`. Context7-Schlüssel und lokales MySQL-Root-Passwort rotieren (beide in der Git-Historie). | [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md), [Spamschutz](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | S | +| ~~1.4~~ | ~~**Lokale Dateien mit Personenbezug**~~ — **gelöscht 09.10.2026:** `dev/migration/` (7,4 GB), `dev/archive/migration-2026/sql/` (905 MB), `dev/api/`, `dev/newsletter/`, `dev/2026-10/`, `storage/app/private/restore-company-user-auto-2026-10-07.sql`. | [dev/README](README.md) | — | +| 1.5 | **Alte Backups auf dem Server löschen:** `~/deploy-v1.1.0.tgz`, `~/backup-vor-v1.1.0.tgz`, `~/backup-vor-git.tgz`, `~/vor-git/`. | [git-deploy.md](betrieb/git-deploy.md) | S [LIVE] | + +--- + +## 2. Termine und Wiedervorlagen + +| Fällig | Punkt | Quelle | +|---|---|---| +| **ab 15.10.2026** | CSP-Meldungen aus `storage/logs/csp-*.log` auswerten, dann scharf schalten (Report-Only seit v1.6.0). Nonce statt `unsafe-inline`/`unsafe-eval` später (L). | [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md) | +| **ab 16.10.2026** | Spamschutz auswerten: Spam-Filter der Kontakt-Queue, `storage/logs/spam-*.log`, Missbrauch des Fail-open-Wegs → ggf. `TURNSTILE_FAIL_OPEN=false`. Die rund 130 nicht erkannten Altanliegen per Sammelaktion in die Quarantäne. | [Spamschutz](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | +| nächstes Release | `SessionRevocation::legacyCachedMark()` samt Test entfernen; Liste „Aktive Sessions“ reparieren (liest `sessions`-Tabelle, Live speichert in Redis → immer leer). | [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md) | +| Oktober 2026 | connektar: `ai_declaration` wird Pflicht — Stand bei connektar erfragen, Auswirkung auf den Alt-Vertrag prüfen (heute setzt der Legacy-Controller die Bestätigung selbst). | [Roadmap Nutzergewinnung](archive/2026-09-nutzergewinnung/roadmap-2026.md) | +| Ende Oktober | Google News / Publisher Center (2.2): Ergebnis in der Search Console prüfen (4–6 Wochen nach Einrichtung). **Zwischenstand 13.10. (Umami):** Businessportal24 bekam seit 17.09. 431 Besuche von `news.google.com`, Presseecho keine. | [Protokoll Teil 7](archive/2026-09-nutzergewinnung/umsetzung-protokoll.md) | +| frühestens 26.10.2026 | Bildrechte Block I (C2PA) möglich — Bedingung: vier Wochen Deploy 1b ohne Auffälligkeiten **und** Testkorpus echter KI-Dateien. | [Bildrechte-Plan](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | +| ~~offen~~ | ~~IMKIS: Pilot nach dem Treffen am 01.10.~~ — **abgeschlossen 13.10.2026:** keine Zusammenarbeit, beidseitig freundlich beendet; Kontakt bleibt. Ergebnis ist die Spitze ohne Partner (6.14) und eine wiederverwendbare Partnervorlage. | [Decision-Update Spitze ohne Partner](partner/decision-update_spitze-ohne-partner.md) | +| laufend | 1c.5/E8: Kundenansicht des Google-Index (`GSC_CUSTOMER_VISIBLE`) — tägliche Prüfung seit 17.09.; entscheiden, sobald die Verteilung direkt/API belastbar ist. | [Anhang 1](archive/2026-09-nutzergewinnung/roadmap-anhang1-2026.md) | +| Frühjahr 2027 | Basiswert 0.1 neu erheben (Kohorte 28–55 Tage, Vergleich 122 / 314). | [Basiswerte](archive/2026-09-nutzergewinnung/basiswerte-block0.md) | + +--- + +## 3. Rechtstexte und Freigaben — ein Anwaltspaket [EXTERN] + +Mehrere Datenverarbeitungen laufen bereits, ohne dass die Datenschutzerklärung +sie nennt. Das ist der größte offene Block und am besten **ein** Paket an den +Anwalt. **Überarbeiteter Entwurf:** [Anwaltspaket vom 12.10.2026](rechtliches/anwaltspaket-datenschutz-2026-10-12.md). +Vor Versand die [Korrekturen, Antworten und den Umsetzungsauftrag](rechtliches/korrekturen-und-umsetzungsauftrag-2026-10-12.md) +einarbeiten: Ist-/Zielstand, Aufbewahrungsmatrix, Vertragsübergang, Beweisarchiv +und Aufgaben RP-01 bis RP-12. Diese Ergänzung ist die führende technische +Arbeitsgrundlage für die dort berichtigten Punkte, keine rechtliche Freigabe. + +**Arbeitsordner (Stand 13.10.2026):** `dev/rechtliches/` enthält nur noch die +Versandfassung, ihre Anlagen (Interessenabwägung, Live-Rechtstexte, Klärung, +Kontext Löschanfragen) und die Korrekturen mit RP-01 bis RP-12 und BN-01 bis +BN-09. Belege sammelt [`rechtliches/nachweise/`](rechtliches/nachweise/README.md) +mit Checkliste; Vorfassungen, Codeauswertung, To-do-Liste und Rückfragen liegen +in [`archive/rechtliches-2026-10/`](archive/rechtliches-2026-10/). Hub-Analyse +mit Nutzerkennung, KI-Bildprüfung und Newsletter bleiben bis zu ihren eigenen +Aktivierungspaketen ausgeschaltet. + +**Versandfertig seit 13.10.2026:** Anschreiben mit Lesereihenfolge und +Dateiliste ([`rechtliches/anschreiben-anwalt-2026-10-13.md`](rechtliches/anschreiben-anwalt-2026-10-13.md)), +Nachweise vor dem Versand vollständig (BN-01, BN-02, BN-06, BN-07, BN-08, +Screenshots). Live: v1.9.1 mit „Gebuchte Platzierung“. Offen bis Deploy 3: +BN-03 Backups, BN-05 Instanzfristen, danach BN-04/BN-09 mit RP-04. + +| # | Punkt | Quelle | Aufwand | +|---|---|---|---| +| 3.1 | **DSE-Lücken, Verarbeitung läuft bereits:** Bild-Originale, Bestätigungsprotokoll und IP-HMAC (seit Deploy 1b, 28.09.; laut Decision-Update sollte der Minimalabsatz mitgehen), GlitchTip (Server und Browser), fehlgeschlagene Anmeldungen (90 Tage), Rückläufer-Protokoll `email_bounces` (395 Tage, E27), `activity_events`/`api_usage_logs`. | [Decision-Update Bildrechte](bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [Monitoring-Plan](betrieb/monitoring-plan.md), [Entwicklungsplan Audit, Block 9 E](archive/2026-09-audit/ENTWICKLUNGSPLAN.md) | S + Freigabe | +| 3.2 | DSE 6a (Turnstile) ist als Vorschlag live — juristisch freigeben. | [Spamschutz](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | S | +| 3.3 | **Deploy 3 Bildrechte:** AGB v0.7 (§ 8a, § 9), DSE v0.4 (9a, 9b, 13, Template-Variablen), `img-confirm-v3`, `LEGAL_ACCEPTANCE_GATE=true`. Vorher: Interessenabwägung (DU 4.4) als Dokument ablegen, Restore-Übung (5.1) als Beleg für 9b. | [Bildrechte-Plan](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | S (2 Tage nach Antwort) | +| 3.4 | Anwaltsagenda A1–A7 (Screenshots Formular und Nachweiszeile), Art. 50 KI-VO, Syndikationsvertrag als Standarddokument (3.5), Boost-Slot-Note. | [Decision-Update Bildrechte](bildrechte/Decision-Update_Bildrechte_Beweisarchiv_2026-09-22.md), [Changelog O8](changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md) | [EXTERN] | +| 3.5 | AVV mit OpenAI → danach KI-Vorab-Check für Bilder einschalten (`IMAGE_PRECHECK`, Stufe 1, nach einer Woche Stufe 2), Schwellen nachjustieren. | [Bildrechte-Plan K.6](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | S | +| 3.6 | Nach DSE-Freigabe: `UMAMI_PORTAL_ENABLED`, `UMAMI_IDENTIFY_USERS` einschalten. | [Monitoring-Plan](betrieb/monitoring-plan.md) | S | +| ~~3.7~~ | ~~Wortwahl „automatisierte Prüfung“~~ — **erledigt mit v1.8.0/v1.8.1 (12.10.2026); auf Live noch den Tarifvorteil „Starter“ im Admin ▸ Tarife auf „Automatisierte Prüfung & Veröffentlichung inklusive“ ändern:** „Qualitätsgeprüft“/„quality-checked“ entfernt (Startseiten-Meta, CTA, Veröffentlichen-Seite DE/EN), Preisseite „Automatisierte Prüfung jeder Mitteilung vor der Veröffentlichung“, Dashboard „Freigegebene Mitteilungen“. Dabei behoben: „Qualitätsgeprüft seit 2012“ war sachlich falsch → „Im Archiv seit :year“. Wächtertest `AutomatedCheckWordingTest`. Die AGB-Stellen folgen mit v0.7 (3.3). | [Bildrechte-Plan](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | — | +| 3.8 | Geschäftliche Entscheidungen festschreiben: Refund-Policy (heute faktisch Stripe-Dashboard), Steuerberater-Abnahme Rechnungs-PDF/USt, Pro-Tarif nach Streichung des Prüfversprechens, Preisfreigabe R1.4 formal abhaken. | [Release-Plan](archive/release/entwicklungsplan-release.md) | S [EXTERN] | + +--- + +## 4. Nächstes Release (v1.8) — kleine technische Punkte + +| # | Punkt | Quelle | Aufwand | +|---|---|---|---| +| ~~4.1~~ | ~~Sessions~~ — **erledigt für v1.8:** `legacyCachedMark()` entfernt (Test umgedreht: alte Cache-Marke wirkt nicht mehr); Sicherheitsseite zeigt statt der leeren Redis-Liste „Dieses Gerät“ und die letzten fünf Anmeldungen mit Anmeldeweg aus dem Aktivitätsverlauf (ohne IP), Kachel „Anmeldungen in 30 Tagen“. | Sicherheitsplan | — | +| ~~4.2~~ | ~~Löschfristen~~ — **erledigt für v1.8:** `activity_events` 395 Tage, `api_usage_logs` 90 Tage (`config/monitoring.php` → `retention`, `MONITORING_ACTIVITY_RETENTION_DAYS`/`MONITORING_API_USAGE_RETENTION_DAYS`), täglich 04:05 per `model:prune`. Beim ersten Lauf auf Live fällt bei `api_usage_logs` alles vor Mitte Juli weg. | [Monitoring-Plan Phase 3](betrieb/monitoring-plan.md) | — | +| ~~4.3~~ | ~~Newsletter-Abo über die API~~ — **abgeschaltet für v1.8:** `POST api/v1/newsletter/subscribe` antwortet mit 410 (seit Go-Live kein Aufruf, kein Abo); die Spezifikation versprach ein Double-Opt-in, das es nicht gab. Ability nicht mehr für neue Tokens wählbar. Anmeldung mit Double-Opt-in kommt mit 6.4. | [QA-Checkliste](archive/release/qa-checkliste.md) | — | +| 4.4 | Turnstile in die übrigen öffentlichen Formulare: Widerruf, Kündigung, Meldeformular, PM-Meldung, Rechtsanfrage, „Newsroom verwalten“ (B5). | [Spamschutz](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | M | +| 4.5 | Login-Härtung entscheiden: `POST /login` nur auf dem Hub oder Turnstile im Login (IP-Limit seit v1.6.0). | [Monitoring-Plan](betrieb/monitoring-plan.md) | S–M | +| 4.6 | Referer-Redirect ohne Whitelist im Portal- und Firmen-Switcher (N2); `url:http,https` für Backlink- und Pressefach-URLs (N3); CORS explizit (N9). | [optimize 14.07.](archive/optimize/optimize-14-07-2026.md) | S | +| 4.7 | Bildrechte aufräumen: Flag `IMAGE_RIGHTS_V2`, alte `press-release-images-manager`-Komponente und Alt-Tests entfernen. | [Bildrechte-Plan B.3](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | S | +| 4.8 | Strukturierte Daten `ImageObject` mit `creditText`/`copyrightNotice` für Pressebilder (nie eingeplant oder verworfen). | [Bildkennzeichnung 6.3](archive/2026-09-audit/bildkennzeichnung-2026-09-15.md) | S–M | +| ~~4.9~~ | ~~GlitchTip-Breadcrumbs mit Formulardaten~~ — **behoben für v1.8:** Das Sentry-SDK hängt bei Livewire-Anfragen die übertragenen Formularwerte und alle Properties an (auch Passwortfelder), der Scrubber prüfte Breadcrumbs nicht. Jetzt: Livewire-Breadcrumbs aus, `ErrorReportScrubber` entfernt die Daten aller Breadcrumbs und bereinigt die Nachrichten. Bestandsprüfung in GlitchTip (lesend, 09.10.): 96 von 176 Ereignissen mit Livewire-Daten, nur in den Scanner-Einträgen 38/39 und nur `language`, `paginators`, `portal`, `timeframe` — keine Formular- oder Passwortdaten. | Faktenblatt DSE | — | +| 4.10 | **IP-Adressen im Klartext ohne Löschfrist:** `users.last_login_ip`, `contact_messages.requester_ip` (auch Nicht-Spam), `legal_requests.requester_ip`, `withdrawal_requests.requester_ip`, `termination_requests.requester_ip`, `booking_confirmations.ip`, `newsletter_subscriptions.ip_address`. Frist je Tabelle festlegen (z. B. IP nach 90 Tagen leeren, Vorgang bleibt) oder als HMAC speichern wie bei Bildbestätigungen; Kontaktanfragen außerhalb der Quarantäne ebenfalls ohne Frist. Außerdem `email_suppressions` bewusst ohne Frist und IMAP-Ordner `Processed`/`Ignored`/`Unparsed` des Bounce-Postfachs ohne Bereinigung. | Faktenblatt DSE | M | + +--- + +## 5. Betriebsnachweise auf Live [LIVE] + +Einmalig abnehmen und hier abhaken. Vieles davon ist vermutlich erledigt, +aber nirgends belegt. + +| # | Punkt | Quelle | +|---|---|---| +| 5.1 | **Restore-Übung** in isolierter Umgebung (DB alt/Disk neu, Disk alt/DB neu, beide alt), danach Entscheidung über ein externes Ziel für den Tombstone-Export (E16, Storage Box/S3). Voraussetzung für DSE 9b. | [Runbook §9](betrieb/deploy-runbook.md), [Audit 02.10. §5](archive/2026-09-audit/UMSETZUNGSAUDIT-2026-10-02.md) | +| 5.2 | Upload 13–15 MiB über das Formular, PHP- und nginx-Grenzen ≥ 16 MiB, Laufzeit der Bildprüfung mit großem Bild. | [Bildrechte-Plan E.7](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | +| 5.3 | Passkey im echten Browser, Smoke-Test der Admin-Bestätigung; `PASSKEYS_USER_HANDLE_SECRET` in der Live-`.env` (fehlt auch in `.env.example`). | [Sicherheitsplan](sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md) | +| 5.4 | Tastatur/Screenreader: Fokusführung Login-Modal (7.6), Bild-Overlay (D.2). | Entwicklungsplan Audit, Bildrechte-Plan | +| 5.5 | Uptime Kuma: Alarmtest mit falschem Token; zweite Ebene (z. B. UptimeRobot auf `/up`). | [Monitoring-Plan](betrieb/monitoring-plan.md) | +| 5.6 | Bounce-Postfach, `MAIL_RETURN_PATH`, `BOUNCE_IMAP_*` bestätigen; optional DMARC-Report-Postfach. | [Bounce-Konzept](archive/2026-09-nutzergewinnung/bounce-mails-2026-09-15.md) | +| 5.7 | Prod-DB-Benutzer mit minimalen Rechten (N10), offene Punkte aus dem Sicherheitsaudit (Firewall, DB/Redis-Erreichbarkeit, Betriebssystem, Backups). | [Sicherheitsaudit](sicherheit/SICHERHEITSAUDIT-2026-10-07.md) | +| 5.8 | Go-Live-Nachlauf vom 20.07., Stand unbekannt: Go-Live-Mails, API-Kunden-Mailing (`/docs/api/v1`, Token-Migration), Stripe-Test-Artefakte bereinigen, `MONITORING_ALERT_EMAIL`, Permission `api:immediate-publication` für connektar. | [Go-Live-Roadmap](archive/release/roadmap-go-live-2026-07-20.md), [API-Parität](betrieb/api-legacy-paritaet.md) | +| 5.9 | MAN-Rechnungen: blockierte Vereinbarungen ohne Rechnungsadresse sichten, ersetzende MAN-Rechnung aus dem Protokoll vom 21.09. auf „offen“ prüfen, Rechnungsadressen von Bestandskunden nachpflegen. | [Legacy-Rechnungen](archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md) | +| 5.10 | Die 6 Slug-Kollisionen aus der Newsroom-Zusammenführung einzeln ansehen. | [Protokoll Teil 3](archive/2026-09-nutzergewinnung/umsetzung-protokoll.md) | +| 5.11 | GlitchTip: behandelte Einträge auflösen (nur Betreiber), Eintrag 10 „[object Object]“ beobachten. | [GlitchTip](glitch-tip/README.md) | +| 5.12 | Slow-Request-Auswertung mit Live-Daten (Command und Report-Seite existieren). | [Migration 11](archive/migration-2026/11-NOCH-ZU-TUN-OPTIMIERUNGEN.md) | +| ~~5.13~~ | ~~Server-Log-Rotation auf 14 Tage kürzen~~ — **erledigt 09.10.2026** (vorher 52 Tage; DSE Abschnitt 3 und 13 stimmen wieder). Backups rotieren nach 14 Tagen, Server-Monitoring speichert höchstens 14 Tage (Betreiber, 09.10.2026). | [Anwaltspaket](rechtliches/anwaltspaket-datenschutz-2026-10-12.md) | + +--- + +## 6. Produkt und Wachstum + +| # | Punkt | Quelle | Aufwand | +|---|---|---|---| +| ~~6.1~~ | ~~Abbruchbedingungen festlegen~~ — **entschieden 13.10.2026**, Zeitraum bis **17.03.2027**, Zwischenblick **17.12.2026**, danach Audit im Quartal (nachschärfen, wo es hakt — Hebel oder Darstellung). **Block 1:** mindestens 30 Firmen lösen ihren Verwaltungslink ein, mindestens 3 Erstbuchungen kommen über Mail oder Claim, mindestens 10 Klicks aus der Ablehnungsmail (statt „Wiedereinreichung“, bei ~59 Ablehnungen im Quartal nicht messbar) — sonst Block 1 einfrieren. **Block 2:** die Transparenzseiten erreichen im Februar 2027 zusammen mindestens 100 Aufrufe aus der Suche (Umami) — sonst nur 2.1–2.3. **Block 3:** mindestens 25 gemeldete Feed-Abonnenten über alle Feeds — sonst ist RSS kein Verkaufsargument. Ausgangswerte 17.09.–13.10.: 67 Firmen klicken die Veröffentlichungsmail, ~4 Einlösungen, 0 Klicks aus der Ablehnungsmail, 6 Erstbuchungen (ohne Herkunft); Transparenzseiten ~65 Aufrufe, davon 1 aus der Suche; 0 gemeldete Feed-Abonnenten. Organische Konten fallen als Kriterium weg (Registrierung auf dem Hub, keiner Seite zuordenbar). | [Roadmap Nutzergewinnung](archive/2026-09-nutzergewinnung/roadmap-2026.md), [Basiswerte](archive/2026-09-nutzergewinnung/basiswerte-block0.md) | — | +| 6.2 | 2.6 Zuschriften an Portalübersichten (PR-Gateway-Korrektur, höchstens acht Kontakte). | [Anhang 1 §5](archive/2026-09-nutzergewinnung/roadmap-anhang1-2026.md) | [EXTERN], in Arbeit | +| 6.3 | **3.3 Agenturmodell:** mehrere Firmen unter einem Konto, abgeleitet aus den 1.102 Sammeladressen. Danach 3.4 gezielte Ansprache kleiner Agenturen. | Roadmap Nutzergewinnung | L | +| 6.4 | **3.2 Branchen-Digest** mit Double-Opt-in (löst auch 4.3). | Roadmap Nutzergewinnung | M | +| 6.5 | Newsletter-Kampagnenmodul: U05–U07 umsetzen, bevor `NEWSLETTER_SENDING_ENABLED` eingeschaltet wird. | [Entwicklungsplan Audit E9/E23](archive/2026-09-audit/ENTWICKLUNGSPLAN.md) | M | +| 6.6 | **Changelog-Pipeline — Stufen 1–3 live seit v1.13.0 (14.10.2026), Nachtrag gegengelesen und freigegeben:** `changelog:collect` in `deploy.sh` nach `up` (Entwürfe aus `Changelog:`/`Public:`, liest die ganze Commit-Nachricht), Admin ▸ Changelog zum Freigeben, `pressekonto.com/changelog` mit RSS, Kundenmenü „Was ist neu“ mit Neu-Kennzeichen (E11), Nachtrag seit dem Relaunch als Entwurf (`changelog:backfill`, O7 — Datum und Text gegenlesen). **Offen:** Stufen 4/5 (Artikel in der Rubrik „Portal-Updates“, braucht das Bild-Template O6), Monatsrückblick (O3), Opt-in-Rückblick per Mail (O11, E16), Link aus den Reaktivierungsmails (E12), Social-Kanäle (O9/O10). Kein LLM-Schritt: Die `Public:`-Sätze werden beim Commit formuliert, umformuliert wird im Admin. | [Decision-Update Changelog](changelog/Decision-Update_Changelog_Automatisierung_2026-10-04.md) | M (Rest) | +| 6.7 | Betriebsüberwachung **Phase 2** (Validierungsfehler, Schritt-Tracking, Umami-Events, „Problem melden“, Geschäftstrichter) und **Phase 3** (Kennzahlen, Alarme bei ausbleibender Aktivität, Seite „Betrieb & Nutzung“, Morgenmail). Entscheidungen M4–M9 bestätigen. | [Monitoring-Plan](betrieb/monitoring-plan.md) | L | +| 6.8 | Bildrechte: Block I C2PA (ab 26.10.), I.5 XMP in Varianten, Block J Bilder im Newsroom (Kontingent-Entscheidung), I.6 Re-Sync-Sperre erst wenn ein API-Partner Bilder liefert. | [Bildrechte-Plan](bildrechte/bildkennzeichnung-entwicklungsplan-2026-09-21.md) | L | +| 6.9 | API v1: Rückkanal bei Ablehnung (Status-Feld oder Webhook, S6). | [API-Parität](betrieb/api-legacy-paritaet.md) | M–L | +| 6.10 | Legacy-Rechnungen Phase 4: `--send`, Erinnerungs-Task, tägliche Überfällig-Notiz (nach einigen Wochen Handbetrieb). | [Legacy-Rechnungen](archive/legacy-rechnungen/entwicklungsplan-2026-09-16.md) | S | +| 6.11 | Kontakterreichbarkeit Stufe 3 (Veröffentlichungssperre ohne zustellbare Adresse) — bewusst zurückgestellt, nach Beobachtung entscheiden. | [Kontakterreichbarkeit](archive/2026-09-audit/kontakterreichbarkeit-mx-bounces-2026-09-15.md) | M–L | +| 6.12 | Spamschutz-Ideen: Limit je /24-Netz, tägliche Sammelmail, Wegwerf-Domains, KI-Klassifizierung. | [Spamschutz §5](sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md) | je S–M | +| 6.13 | Ausbau aus dem Release-Plan, bewusst vertagt: EN-Übersetzung der Langseiten (FAQ, Hilfe, API, Veröffentlichen), EN-Rechtstexte und öffentliche Versionshistorie, DSA-Queue, Coupons, Regionen-Seiten, Blacklist-Admin, Bulk-Publish/-Reject, In-App-Benachrichtigungen, Hero-Slider, Boost als Zeitraum. | [Release-Plan](archive/release/entwicklungsplan-release.md), [Boost](archive/release/boost-platzierung-offen.md) | je M | +| 6.14 | **Spitze ohne Partner** („beste Pressemitteilungen“): Auszeichnung ab einer festen, öffentlich bekannten Schwelle auf Basis des Scorings, keine Quote, kein Ermessen, nie käuflich; getrennt von „Aktuell“ und von „Gebuchte Platzierung“. Reihenfolge verbindlich: (1) Spitze + Infoseite mit Kriterienkategorien, (2) Werkzeuge als Weg zur Spitze, (3) Zufluss (connektar) schärfer filtern, erst wenn Direktkunden tragen. Offen: Name, Schwellenwert (konservativ, nach Nullmessung justieren), Wortlaut der maschinellen Kurzbegründung, Schwelle je Portal. Nullmessung vor dem Start. | [Decision-Update Spitze ohne Partner](partner/decision-update_spitze-ohne-partner.md), [Konzept Rubrik](partner/konzept_bestepresse-rubrik.md) | L | +| 6.15 | Partnervorlage (Gutscheine, Kontingent gegen Naturalleistung, Provision mit Codes, Interessenkonflikt-Kennzeichnung, Pilot 6 Monate mit Nullmessung) für künftige Partner bereithalten — kein Code, bis ein Partner konkret wird. | [Decision-Update Spitze ohne Partner §6](partner/decision-update_spitze-ohne-partner.md) | [EXTERN] | +| ~~6.16~~ | ~~Messung und Seite „Wachstum“~~ — **live mit v1.10.0 (13.10.2026):** (a) „Magic Link eingelöst“ trägt Firma und Meldung aus dem Token; (b) neue Stufen „Verwaltungsseite geöffnet“ und „Anmeldelink angefordert“ (Leiter mit 7 Stufen); (c) Erstbuchung mit der Herkunft des letzten eingelösten Links; (d) Admin ▸ Reports ▸ Wachstum und `growth:report` mit den Bedingungen aus 6.1; Umami nur lesend über `UMAMI_API_*`, Befehl `umami:report`. Deploy-Notiz: [`archive/betrieb/deploy-v1.10.0.md`](archive/betrieb/deploy-v1.10.0.md). | Abgleich 13.10.2026 | — | +| ~~6.17~~ | ~~Klarheit des Verwaltungszugangs~~ — **erledigt mit v1.11.0/v1.12.0:** Newsroom-Seite mit Kasten statt grauer Zeile; Firmenseiten „Firma & Newsroom“ mit Link zum öffentlichen Newsroom (Backend sagt weiter „Firma“); Veröffentlichungs- und Ablehnungsmail an Empfänger ohne Konto mit Kasten „Etwas ändern oder die Aufrufe sehen?“ und Knopf „Anmeldelink anfordern“ (signierter Link auf `/zugang`, Anmeldelink an genau die Adresse der Mail, Landung auf der Meldung). E4 (15.09.: Verwaltungshinweis nur am Mailende) damit bewusst geändert: Der Kasten ist kein Angebot, sondern der Weg zur eigenen Meldung. Wirkung über die Stufen 2–4 beobachten (`conversion:funnel`, Herkunft Veröffentlichungs-/Ablehnungsmail). Nachgezogen (v1.13.1, 14.10.2026): Die Mail „ein Mensch prüft“ (`PressReleaseHeldForReview`) zeigt API-Empfängern den Kasten „Den Stand der Prüfung sehen?“ mit Anmeldelink (Herkunft `mail_review`). | Betreiber 13.10.2026 | — | +| ~~6.18~~ | ~~Wiedereinreichung abgelehnter API-Meldungen durch Pressekontakte~~ — **entschieden 14.10.2026, umgesetzt mit v1.12.0:** Der Pressekontakt überarbeitet eine abgelehnte API-Meldung über den Anmeldelink selbst und reicht sie kostenlos erneut ein (kein Slot, solange nichts veröffentlicht ist; die Buchungsprüfung läuft weiter gegen den Einlieferer). Die Ablehnungsmail sagt das. Dabei behoben: Das Mail-Routing las die Herkunft aus dem letzten Review-Übergang — nach einer Wiedereinreichung im Kundenbereich wäre das Ergebnis an das Konto des Einlieferers gegangen statt an den Kontakt. | Code-Prüfung 13./14.10.2026 | — | +| 6.19 | **Änderungsregel und Datenschutz.** Heute: kostenlose Korrektur bis 5 % Abweichung je Feld, einmal pro Woche (`legal.correction_max_distance_percent`, `legal.corrections_per_week`); bezahlte Änderung 10 € bis 50 %, einmal je Meldung. Eine Ausnahme für personenbezogene Daten gibt es im Code **nicht** — das Entfernen einer Telefonnummer oder eines Namens zählt wie jede andere Änderung, obwohl DSE/AGB und `handover_loesch-anfragen.md` „Kontaktdaten entfernen ist jederzeit kostenlos“ zusagen; den Weg über `/melden` → Admin (`AnonymizationService`) gibt es. Prüfen: Selbstbedienung „Kontaktdaten entfernen“ ohne Prozentgrenze und Wochenlimit (Telefonnummern, E-Mail, Namen natürlicher Personen), Abgleich mit der Anwaltsantwort zu Frage 12. Wiederkehrendes Problem laut Betreiber. | Betreiber 13.10.2026, [Kontext Löschanfragen](rechtliches/handover_loesch-anfragen.md) | M | + +--- + +## 7. Technische Schuld (bei Gelegenheit) + +| # | Punkt | Quelle | Aufwand | +|---|---|---|---| +| 7.1 | Sitemap ohne Index/Chunking lädt das Archiv mit `->get()` — noch unter 50k, wächst. | [optimize N7](archive/optimize/optimize-14-07-2026.md) | M | +| 7.2 | `orderByDesc('hits')` ohne Index (durch Cache abgemildert; Online-DDL auf `press_releases`). | optimize N8 | S–M | +| 7.3 | Landingpages `web/presseecho` und `web/businessportal24` zusammenführen (M15), toter Code (`test.css`, kaputtes `@source`, leere Domain-Gruppen, N6). | optimize | S | +| 7.4 | `CompanyType` und `companies.type` entfernen (A6, jetzt machbar). | [Agentur-Attribution](archive/agentur-attribution/entwicklungsplan.md) | M | +| 7.5 | Große Komponenten zerlegen: `admin.users.edit` (1.242 Zeilen), Kontakte-Tab in `companies.show`; `UserManagementTest` (1.312 Zeilen) aufteilen. Larastan erfasst Single-File-Components nicht — große Komponenten ggf. per `livewire:convert` in Klassen. | [Migration 11](archive/migration-2026/11-NOCH-ZU-TUN-OPTIMIERUNGEN.md), [Go-Live-Roadmap](archive/release/roadmap-go-live-2026-07-20.md) | M | +| 7.6 | MySQL-/Worker-Integrationstests als zweite CI-Stufe (6.6), `arch()`-Tests, PHPStan-Baseline (143 Einträge). | [Entwicklungsplan Audit](archive/2026-09-audit/ENTWICKLUNGSPLAN.md) | L | +| 7.7 | API-Autorisierung über Policies (M14), Checkout-Guard (N11), Form Requests (N12), Kleinkram (`session()->flash`, `CurrentPortalContext`, E-Mail-Normalisierung). | optimize, [Migration 12](archive/migration-2026/12-NAECHSTE-SCHRITTE.md) | M | +| 7.8 | Mobil-Feinschliff: Pagination- und Modal-Close-Buttons ~36 px (< 44 px), Stat-Strips, Hero 21/9. | [Frontend-Protokoll](archive/frontend-audits/frontend-optimize-protokoll.md) | S | +| 7.9 | Redis als Cache/Queue erst bei Last — **Achtung E18:** die Idempotenz der Ablaufmail setzt die DB-Queue voraus. Cache-Warmer nur bei Bedarf. `ReleaseDetailPageData` cachen, wenn Newsroom-Traffic steigt. | Go-Live-Roadmap, Entwicklungsplan Audit E18 | M | +| 7.10 | `CLASSIFICATION_GREEN_DELAY` (Wartezeit vor KI-Auto-Publish, Default 0) prüfen — deckt die Score-Logik das inzwischen ab? | Release-Plan | S | + +--- + +## 8. Doku-Pflege + +| # | Punkt | Aufwand | +|---|---|---| +| 8.1 | **`betrieb/deploy-runbook.md` überarbeiten** (Stand 09.07.): SFTP-Checkliste, „npm auf dem Server“ und FULLTEXT auf `press_releases` (§3a) sind überholt; `pressekonto.de` statt `.com` (auch Stripe-Webhook-URL); Scheduler-Tabelle ohne `users:prune-bot-registrations`, `monitoring:heartbeat`, `queue:prune-failed`, `model:prune`, `sanctum:prune-expired`; systemd statt Supervisor/Ploi; Chat-Reste und KAS-rsync in §7. Deploy-Ablauf nur noch in `git-deploy.md`. | M | +| 8.2 | `CLAUDE.md` nennt `pressekonto.de` als Live-Domain — live ist `pressekonto.com`. | S | +| 8.3 | Kopfzeilen nachziehen: `monitoring-plan.md` (SFTP, externer Monitor offen), `git-deploy.md`, `glitch-tip/README.md` (Protokoll ohne Einträge 18, 23, 38, 39), Bildrechte-Plan („Deploy offen“, Deploy 1–2b und 1b sind live), Sicherheitsaudit Z. 276. | S | +| 8.4 | `api-legacy-paritaet.md`: S5/S7/Abschnitt 5 schließen, Umami-Snippets am Ende entfernen. | S | +| 8.5 | Changelog-Decision-Update: Antworten aus den rohen `#…`-Zeilen in eine Spalte „Entscheidung“ übertragen. | S | +| 8.6 | `git-deploy-monitoring/` ist ein projektunabhängiger Baukasten und liegt mit jedem Checkout auch auf dem Server — in ein eigenes Repository auslagern. | S | +| 8.7 | Im Archiv liegen ~78 MB getrackte Mockups und Prototypen (`frontend/claude-design/` 57 MB, `frontend/tailwind_v3/` 15 MB, `_old/` 4 MB) — löschen, wenn sie nicht mehr gebraucht werden (verkleinert das Repo erst zusammen mit 1.1). | S | diff --git a/dev/sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md b/dev/sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md new file mode 100644 index 00000000..1783edb4 --- /dev/null +++ b/dev/sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md @@ -0,0 +1,316 @@ +# Entwicklungsplan – Behebung Sicherheitsaudit vom 07.10.2026 + +**Grundlage:** [SICHERHEITSAUDIT-2026-10-07.md](SICHERHEITSAUDIT-2026-10-07.md), Repository-Stand `2215826` + +**Stand:** 08.10.2026 – Phasen 1–3 und Entscheidung 5 (Passkeys, Pflicht-Zweitfaktor für Admins) live seit `v1.4.0` (07.10.2026), Hotfix `v1.4.1`; Abgleich der Firmenrechte ausgeführt (19.607 → 19.316, Wiederholung stabil). API-Zugang an Buchung, Proxy und HSTS live seit `v1.5.0` (08.10.2026); restliche Phase 4 live seit `v1.6.0` (08.10.2026, Abschnitt 6) + +**Wiedervorlage — nicht vergessen:** + +| Wann | Was | Wie | +| --- | --- | --- | +| ~~sofort~~ | ✅ 08.10.2026: Imagick auf Live installiert (`php -m` zeigt `imagick`). Vorher liefen Herkunftsprüfung und KI-Vorab-Check der Bilder ins Leere. | Nach `v1.6.1` in der Betriebsüberwachung, Zeile „PHP-Erweiterung Imagick“, gegenprüfen (zeigt den Stand von PHP-FPM). | +| **ab 15.10.2026** | CSP-Meldungen auswerten (Melde-Modus seit `v1.6.0`). | Auf Live `tail -n 200 storage/logs/csp-*.log`; fehlende Quellen in `App\Support\ContentSecurityPolicy` ergänzen, danach über das Scharfschalten entscheiden (`'unsafe-inline'`/`'unsafe-eval'` bleiben bis zu einer Nonce-Lösung). | +| nächstes Release | Übergangs-Fallback der Sperrmarke entfernen. | `SessionRevocation::legacyCachedMark()` und den Test „a revocation from before v1.6.0 …“ streichen. | +| nächstes Release | Liste und Kennzahl „Aktive Sessions“ auf der Sicherheitsseite lesen die Tabelle `sessions`, Live speichert Sessions in Redis — dort immer leer. | Korrigieren oder entfernen; der Knopf „Andere Geräte abmelden“ ist davon unabhängig. | +| ~~nach Deploy Spamschutz~~ | ✅ 09.10.2026 (`v1.7.0`): Altbestand in die Quarantäne (152), Bot-Konten gelöscht, täglicher Lauf an. **Offen:** Abschnitt 6a der Datenschutzerklärung juristisch freigeben lassen. | [ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md](ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md), Abschnitt 0. | +| **ab 16.10.2026** | Wirkung des Spamschutzes auswerten. | Spam-Filter der Kontakt-Queue, `storage/logs/spam-*.log`, Betriebsüberwachung „Formulare ohne Bot-Prüfung“; Regeln nachschärfen oder lockern. | +| bei Gelegenheit | Außerhalb des Audits: eigene MySQL-Benutzer je Projekt auf `global-mysql`, MySQL-Root-Passwort ändern (steht in der Git-Historie), lokalen `APP_KEY` reparieren. | – | + +**Ausführung:** Befehle direkt im Dev-Container (`php artisan …`, ohne Sail – siehe `.ai/rules/general.md`) + +## 0. Umsetzungsstand (07.10.2026) + +Entscheidungen 1–4 wie empfohlen getroffen. Entscheidung 5 umgesetzt als Passkeys plus Pflicht-Zweitfaktor für Admins (siehe unten), Entscheidung 6 siehe unten. + +| ID | Status | Kern der Änderung | Tests | +| --- | --- | --- | --- | +| S-01 | ✅ umgesetzt | `LegacyInvoicePolicy::view()` verlangt `billing:manage` statt `canAccessAdmin()` | `tests/Feature/Billing/LegacyInvoiceAccessTest.php` | +| S-02 | ✅ umgesetzt | `admin/companies/show`: `authorize('companies:write')` in `attachExistingContact()`, `$id` `#[Locked]`, Zuordnungs-UI nur mit Schreibrecht | `tests/Feature/Admin/EditorPermissionBoundaryTest.php` | +| S-03 | ✅ umgesetzt | `CompanyMembershipObserver` (Contact/Company/User) ruft `syncMembershipsForEmail()` bei Adress-/Zuordnungsänderung, Löschung, Wiederherstellung; inaktive/unverifizierte Konten verlieren Auto-Rechte; Kommando `memberships:resync-auto` | `tests/Feature/Auth/AutoMembershipRevocationTest.php` | +| S-04 | ✅ umgesetzt | `PasswordChanger` (alle Passwortwege, Remember-Token-Rotation, `SessionRevocation::revokeOthersFor()`), Listener `RevokeAccessAfterPasswordReset` (alle Sessions, offene Login-Links), Fortify-Route `PUT /user/password` abgeschaltet | `tests/Feature/Auth/PasswordChangeRevokesSessionsTest.php` | +| S-05 A | ✅ umgesetzt | `SocialAuthService::resolve()`: `email_verified` Pflicht, Login zuerst über `oauth_provider_id`, keine stille Umverknüpfung | `tests/Feature/Auth/GoogleLoginTest.php` | +| S-05 B | ✅ umgesetzt | `SocialAccountLinker`: Erstverknüpfung bestehender Konten außerhalb gmail/`hd` nur per Bestätigungslink, gebunden an die Browser-Session des Google-Logins | `tests/Feature/Auth/GoogleLoginTest.php` | +| S-06 | ✅ umgesetzt | Trait `ConfirmsIdentity` + `SecurityConfirmation` (E-Mail-Code für passwortlose Konten, 15 min Gültigkeit) vor E-Mail-Wechsel, erster 2FA-Einrichtung und Token-Erzeugung; `SecurityChangeNotice` an die (bisherige) Adresse bei Passwort, Reset, E-Mail, 2FA an/aus, Google-Verknüpfung | `tests/Feature/CustomerProfileSecurityTest.php`, `tests/Feature/CustomerPortalTest.php` | + +Komplette Testsuite (inkl. Entscheidung 5): 2403 bestanden, 1 übersprungen. Angepasste Bestandstests: Google-Mocks liefern jetzt `email_verified`; die Tests für 2FA-Einrichtung, Token-Erzeugung und den E-Mail-Wechsel passwortloser Konten senden den neuen Nachweis mit. + +**Entscheidung 6 (07.10.2026): Neue Konten per Google ohne zusätzliche Mail-Bestätigung.** + +- Wird ein neues Konto über Google angelegt, gilt die Bestätigung durch das Google-Konto. Das betrifft auch Adressen ohne gmail oder `hd`. +- Das Konto erhält wie bisher direkt die Auto-Rechte an Firmen mit passender Kontakt- oder Firmenadresse. +- Bewusst in Kauf genommenes Restrisiko: ein privates Google-Konto mit einer Firmenadresse, deren Postfach der Inhaber nicht mehr kontrolliert. +- Dagegen wirkt weiterhin S-03: Entfernt die Firma den Kontakt, enden die Rechte sofort. +- Bestehende Konten bleiben durch Entscheidung 3 geschützt. +- Abgesichert durch den Bestandstest `a new google user is created active, verified and as customer` in `tests/Feature/Auth/GoogleLoginTest.php`. + +**Entscheidung 5 (07.10.2026): Passkeys und Pflicht-Zweitfaktor für Admins.** + +Bestätigt: offizielles npm-Paket `@laravel/passkeys`, Pflicht für Super-Admins und Admins (nicht für Editoren), Authenticator-App bleibt Alternative. + +- **Grundlage:** Fortify-Feature `passkeys` (Fortify 1.40, bindet `laravel/passkeys` 0.2 ein, also eine frühe Version). Neue Tabelle `passkeys`. Das User-Model implementiert `PasskeyUser`. +- **Domain:** Gebunden an die Portal-Domain (`APP_PORTAL_NAME`/`APP_PORTAL_URL`). Nur dort laufen Login und Sicherheitsseite. Für die Kennung lieber ein eigenes `PASSKEYS_USER_HANDLE_SECRET` setzen; ohne Angabe gilt `APP_KEY`, und ein späterer Schlüsselwechsel würde die gespeicherten Passkeys entwerten. +- **Login:** Button „Mit Passkey anmelden“ auf der Login-Seite. Die Benutzerverifizierung (Biometrie/PIN) ist Pflicht, ein Passkey ersetzt damit Passwort und App-Code. Nur aktive, verifizierte Konten (`Passkeys::authorizeLoginUsing`). `PasskeyLoginResponse` protokolliert den Login und leitet rollengerecht weiter. +- **Sicherheitsseite:** Passkeys hinzufügen, ansehen und entfernen. + - Hinzufügen und Entfernen nur mit frischem Nachweis (S-06). Bei der Registrierung prüft `EnsurePasskeyManagementIsConfirmed` den Nachweis zusätzlich an den Fortify-Routen; während einer Impersonation ist beides gesperrt. + - Hinweis-Mail an die Kontoadresse. + - Ein bestätigter Passkey zählt als Nachweis für Sicherheitsänderungen. +- **Admin-Pflicht:** `EnsureStrongAdminAuthentication` an allen Admin-Routen und als persistente Livewire-Middleware. + - Super-Admins und Admins bestätigen die Session einmal per Passkey oder Authenticator-Code auf `admin/anmeldung-bestaetigen`. + - Magic Link, Google oder Passwort allein genügen nicht. + - Ohne zweiten Faktor führt die Seite zur Einrichtung. + - Notfallschalter: `AUTH_REQUIRE_STRONG_ADMIN=false`. In der Testsuite ist die Pflicht aus; ihre eigenen Tests schalten sie ein. +- **Gerät verloren:** Ein Super-Admin setzt Passkeys und App eines anderen Kontos in `admin/users/{id}/edit` zurück („Zweiter Faktor“). Dabei enden alle Sessions des Kontos, und der Inhaber wird per Mail informiert. +- **Tests:** `tests/Feature/Auth/PasskeyAndStrongAdminAuthTest.php`. Die WebAuthn-Zeremonie selbst ist nicht automatisiert getestet; das muss einmal im echten Browser geprüft werden. + +**Release und Deploy (Git-Deploy, siehe `dev/betrieb/git-deploy.md`):** + +Alles zusammen geht als ein Release raus. Vorgeschlagen ist `v1.4.0`: neue Funktion und eine Migration. + +*Release lokal (Abschnitt C):* + +1. `main` muss sauber sein, die volle Suite und Larastan grün. Vorher klären, was mit den unversionierten Ordnern `.ai/` und `dev/2026-10/` passiert (committen oder ignorieren). +2. `npm ci && npm run build`, danach `public/build` mitcommitten. Neu ist der Eintrag `passkeys.js`, außerdem kommt `@laravel/passkeys` in `package.json`/`package-lock.json` dazu. +3. `git tag -a v1.4.0 -m "v1.4.0 — Sicherheitsaudit S-01–S-06, Passkeys, Zweitfaktor-Pflicht für Admins"` und anschließend `git push origin main --follow-tags` sowie `git push NAS main --follow-tags`. + +*Vor dem Deploy auf Live (Abschnitt D):* + +4. **DB-Backup** ziehen, weil die Migration `create_passkeys_table` mitkommt. Die neue Tabelle ist klein; der Fremdschlüssel auf `users` baut `users` nicht um. +5. **`.env` auf Live** vorher ergänzen bzw. prüfen: + - `APP_PORTAL_NAME` und `APP_PORTAL_URL` (mit https): An diese Domain sind die Passkeys gebunden. + - `PASSKEYS_USER_HANDLE_SECRET`: ein eigener Zufallswert, gesetzt **vor** dem ersten Passkey. + - `AUTH_REQUIRE_STRONG_ADMIN` nicht setzen (Standard: an). Es ist nur der Notfallschalter. +6. Zahl der automatischen Firmenrechte festhalten (read-only): + `SELECT COUNT(*) FROM company_user WHERE role='responsible' AND granted_via IN ('auto','auto-upgrade');` + +*Deploy:* + +7. `bash dev/betrieb/deploy.sh v1.4.0 --migrations`. + - Das Skript erledigt Migration, `config:cache` (neue Fortify- und Auth-Einstellungen), `event:cache` (die neuen Listener werden darüber gefunden) und `queue:restart`. + - Zum Schluss prüft es den Worker. Der wird gebraucht, weil Hinweis-Mails, Bestätigungscodes und Google-Verknüpfungslinks über die Queue laufen. + +*Nach dem Deploy:* + +8. Erst `php artisan memberships:resync-auto --dry-run`, danach ohne Option. Zu erwarten sind laut Probelauf mit der Live-Kopie rund 291 von 19.607 Rechten. Seit v1.4.1 rollt das Kommando zurück, wenn mehr als 5 % (mindestens 50) wegfallen würden; dann gilt: nicht mit `--force` erzwingen, sondern die Ursache klären. +9. Die üblichen Prüfungen aus Abschnitt D, Punkt 17. +10. **Smoke-Test der Neuerungen:** + - Als Admin anmelden. Es erscheint „Anmeldung bestätigen“; dort einen Passkey bzw. die App einrichten oder bestätigen. + - Abmelden und „Mit Passkey anmelden“ ausprobieren. + - Unter „Sicherheit“ einen zweiten Passkey anlegen und wieder entfernen. Dabei kommen die Hinweis-Mails an. +11. Einen Eintrag im Protokoll von `dev/betrieb/git-deploy.md` ergänzen. + +*Rollback (Abschnitt E):* `bash dev/betrieb/deploy.sh v1.3.2`. Die Tabelle `passkeys` bleibt dabei stehen; der alte Code nutzt sie nicht. Ein Rollback entfernt auch die Admin-Pflicht. Soll nur die Pflicht weg, reicht der Notfallschalter `AUTH_REQUIRE_STRONG_ADMIN=false` mit anschließendem `php artisan config:cache`. + +**Vorfall 07.10.2026: Abgleich mit v1.4.0 entzieht 19.598 begründete Firmenrechte (behoben in v1.4.1).** + +- **Was passiert ist:** `memberships:resync-auto` meldete auf Live „vorher 19607, nachher 9“. +- **Ursache:** `syncMembershipsForEmail()` entzog in v1.4.0 Konten ohne `email_verified_at` pauschal alle automatischen Rechte. 19.597 der 19.607 Rechte gehören solchen Bestandskonten aus dem Altsystem. Die Tests deckten nur verifizierte Konten ab. +- **Fix v1.4.1:** + - Entzogen wird nur, was keine E-Mail-Grundlage mehr hat, unabhängig vom Kontostatus. Neue Rechte gibt es weiterhin nur für aktive, verifizierte Konten. + - Das Kommando läuft in einer Transaktion, hat `--dry-run` und rollt bei auffällig vielen Entzügen zurück. + - Regressionstests sind ergänzt. + - Probelauf gegen die Live-Kopie: 19.607 → 19.316. +- **Wiederherstellung:** `storage/app/private/restore-company-user-auto-2026-10-07.sql`, erzeugt aus dem Live-Backup vor dem Deploy. Sie spielt nur `INSERT IGNORE` der 19.607 automatischen Rechte ein und darf mehrfach laufen. Lokal in einer zurückgerollten Transaktion geprüft: 19.607 wiederhergestellt, zweiter Lauf 0. + +**Vorfall 07.10.2026: lokale Datenbank geleert (nicht durch diese Umsetzung).** + +- **Was das Binärlog zeigt:** Um 09:44 UTC (`binlog.000009`, Pos. 566161486) wurden alle Tabellen von `pressekonto` auf `global-mysql` gelöscht, durch ein `migrate:fresh` (`RefreshDatabase`) eines frischen Demo-Projekts. In diesem Projekt wurden die Vorlagen aus `dev/git-deploy-monitoring` getestet (Commit `2215826`). +- **Ursache:** `docker-compose.yml` setzte `DB_*` als Container-Umgebungsvariablen. Die haben in Laravel Vorrang vor der `.env`. Die `phpunit.xml` des Demo-Projekts erzwang kein SQLite. +- **Unsere Testsuite war nicht beteiligt:** Nach 09:44 gibt es im Binärlog kein weiteres `DROP` oder `TRUNCATE`. Die Gegenprobe mit gesetzten MySQL-Variablen bleibt auf SQLite. +- **Behoben:** + - `DB_*` aus `docker-compose.yml` entfernt; die Werte stehen identisch in der `.env`. Wirksam erst nach dem Neuerstellen des Containers. + - In `dev/git-deploy-monitoring` steht jetzt „Testdatenbank absichern“ als Pflicht vor `RefreshDatabase`, mit `phpunit.xml`-Zeilen, Guard und Gegenprobe. + - Agenten-Regel in `.ai/rules/general.md` und `CLAUDE.md` ergänzt. +- **Wiederherstellung:** aus einem Backup des Live-Systems (Kevin). Alternativ wäre ein Rückspielen aus dem Binärlog möglich gewesen: Import ab `binlog.000003`, Pos. 380456111, bis zum Löschen. Das Binärlog wird nach 30 Tagen gelöscht. +- **Empfehlung:** auf `global-mysql` eigene MySQL-Benutzer je Projekt statt `root`. + +**Offen geblieben:** + +- **Phase 4 (Härtung):** inzwischen erledigt, Stand in Abschnitt 6. +- Wiedervorlage der Restpunkte: Tabelle oben unter „Stand“. + +## 1. Nachprüfung des Audits + +Alle sechs Befunde wurden am aktuellen Code nachvollzogen. **Keiner ist ein Fehlalarm.** Bei der Gewichtung gibt es aber Unterschiede zum Audit, weil die Frage „wer kann das überhaupt ausnutzen?“ stärker berücksichtigt wird. + +| ID | Audit | Neu bewertet | Wer kann es ausnutzen | Aufwand | Phase | +| --- | --- | --- | --- | --- | --- | +| S-01 | Hoch | **Hoch** | Interne Editoren | ~1 h | 1 | +| S-02 | Hoch | **Hoch** (zusammen mit S-03) | Interne Editoren | ~1 h | 1 | +| S-04 | Hoch | **Hoch** | Jeder mit bestehender Sitzung (z. B. gestohlenes Gerät) | ~3 h | 1 | +| S-03 | Hoch | **Hoch** | Ausgeschiedene Mitarbeiter von Kundenfirmen | ~4 h | 2 | +| S-05 | Hoch | **Mittel** (Teil A schnell, Teil B Entscheidung) | Inhaber eines alten Google-Kontos mit fremder Firmenadresse | A ~2 h, B ~4 h | 2 / 3 | +| S-06 | Mittel | **Mittel** | Jeder mit bestehender Sitzung | ~5 h | 3 | + +### Was sich bei der Nachprüfung gezeigt hat + +- **S-01** – `LegacyInvoicePolicy::view()` gibt allen mit `canAccessAdmin()` frei, also auch Editoren. Die Admin-Route ist zwar durch `can:billing:manage` geschützt, die Kundenroute `/admin/me/legacy-invoices/{id}/pdf` aber nicht. Die IDs sind fortlaufend und lassen sich deshalb durchzählen. Die Policy für neue Rechnungen (`InvoicePolicy`) macht es bereits richtig. +- **S-02** – `attachExistingContact()` in `admin/companies/show` prüft keine Berechtigung. Zusätzlich ist `$id` nicht `#[Locked]`. Ein Editor kann damit Kontakte in beliebige Firmen verschieben. **Zusammen mit S-03 wird daraus eine Rechteausweitung:** Ein Kontakt mit einer Adresse, die der Editor selbst kontrolliert, wird in eine fremde Firma verschoben. Beim nächsten Login vergibt `ContactAccessService::linkMemberships()` automatisch die Rolle `responsible` für diese Firma. + - Gegencheck: Die anderen Admin-Seiten ohne `can:`-Routengruppe (`users/create`, `users/{id}/edit`, `roles/*`, `contacts/index`) prüfen ihre Rechte in der Komponente selbst. **S-02 ist also ein Einzelfall, kein flächiges Muster.** +- **S-03** – `syncMembershipsForEmail()` widerruft veraltete Auto-Rechte korrekt. Aufgerufen wird es aber nur beim Login und bei der Bestätigung einer E-Mail-Änderung. Die Sitzung läuft gleitend (`SESSION_LIFETIME=120` Minuten Inaktivität). **Ein aktiver Nutzer behält die Rechte deshalb praktisch unbegrenzt.** Das typische Szenario: Eine Firma löscht den Pressekontakt einer ausgeschiedenen Mitarbeiterin, und diese arbeitet in ihrer offenen Sitzung weiter in der Firma. Betroffen sind alle Wege, auf denen Kontakte oder Firmenadressen geändert werden: Kunden-Newsroom, Admin-CRM, API und S-02. +- **S-04** – Bestätigt für alle drei Wege: Passwort-Reset, Kunden-Sicherheitsseite und `settings/password` (zusätzlich Fortifys `PUT /user/password`, weil `Features::updatePasswords()` aktiv ist). Der passende Mechanismus existiert schon: `SessionRevocation` mit der Middleware `EnsureSessionIsNotRevoked`, die bereits in der `web`-Gruppe hängt. Er wird nur nicht aufgerufen. Beim angemeldeten Passwortwechsel wird außerdem der `remember_token` nicht rotiert. +- **S-05** – Bestätigt: Die Zuordnung läuft nur über die E-Mail, `email_verified` wird nicht geprüft, und eine abweichende `oauth_provider_id` wird still überschrieben. **Herabgestuft auf Mittel.** Wer das Postfach tatsächlich kontrolliert (z. B. nach einer neu registrierten Domain), kommt ohnehin per Magic Link hinein; Google ist dann kein zusätzlicher Weg. Ein echtes Mehrrisiko besteht nur in einem Fall: Ein privates Google-Konto wurde mit einer Firmenadresse angelegt, und das Firmenpostfach gibt es nicht mehr. Ein typisches Beispiel ist eine ehemalige PR-Mitarbeiterin. +- **S-06** – Bestätigt. Bei Konten ohne Passwort und ohne 2FA prüft `assertSecurityProof()` gar nichts. Wer eine fremde Sitzung hat, kann die Login-Adresse auf ein eigenes Postfach umstellen und das Konto dauerhaft übernehmen. Die Bestätigung geht dabei nur an die neue Adresse. **Die bisherige Adresse erfährt davon nichts:** Es gibt keine Hinweis-Mail, nur `EmailChangeConfirmation` an die neue Adresse. + +### Was weniger dringend ist als es klingt + +- **npm „kritisch“ (`shell-quote`, `source-map-js`)** – Beides sind reine Build-Werkzeuge: `concurrently` für `dev:all` und PostCSS/Tailwind. Sie laufen nur bei `npm ci` / `npm run build` im Deploy und sind aus dem Web nicht erreichbar. Ein schnelles Update lohnt sich trotzdem, ist aber kein Notfall. +- **Proxy-Vertrauen `at: '*'`** – Die Host-Whitelist in `bootstrap/app.php` fängt `X-Forwarded-Host`-Missbrauch bereits ab. Offen ist nur die IP-Fälschung über `X-Forwarded-For`. Die ist harmlos, solange der App-Container ausschließlich über Traefik erreichbar ist. Das muss einmal auf dem Server geprüft werden; Code ist dafür vorerst nicht nötig. +- **CSP, Sanctum-Token-Ablauf, Login-Rate-Limit pro IP** – Sinnvolle Härtung, aber keine akute Lücke (Phase 4). + +## 2. Entscheidungen vorab (Kevin) + +Diese Punkte bestimmen die Umsetzung von Phase 1 bis 3 mit. Empfehlung jeweils fett. + +1. **API-Tokens beim Passwort-Reset (S-04):** automatisch widerrufen oder bestehen lassen? + **Empfehlung: bestehen lassen.** Kunden-Integrationen würden sonst ohne Vorwarnung brechen. Die Erfolgsmeldung und die Hinweis-Mail nennen dafür ausdrücklich „API-Tokens unter Sicherheit prüfen“. Offene Magic Links werden dagegen entwertet. +2. **Angemeldeter Passwortwechsel (S-04):** andere Sitzungen immer beenden oder nur auf Wunsch? + **Empfehlung: immer.** Das ist der erwartbare Standard und spart eine zusätzliche Option in der Oberfläche. +3. **Erstverknüpfung Google mit bestehendem Konto (S-05 Teil B):** + **Empfehlung: Bestätigungslink an die Adresse, außer bei `gmail.com`/`googlemail.com` oder gesetztem `hd`.** In diesen Fällen ist Google selbst für das Postfach zuständig. Eine regelmäßige Neubestätigung bereits verknüpfter Konten wird nicht empfohlen: Der Aufwand steht in keinem Verhältnis, und Firmenrechte entzieht ohnehin S-03. +4. **Fortify-Route `PUT /user/password`:** Sie wird von keiner Oberfläche benutzt. + **Empfehlung: `Features::updatePasswords()` abschalten,** dann gibt es einen Passwortweg weniger. +5. **Pflicht-2FA für Admins/Super-Admins (Phase 4):** ja/nein? + **Empfehlung: ja, zuerst für Super-Admins.** + +## 3. Phase 1 – Sofort (Rollengrenzen und Kontowiederherstellung) + +Kleine, gut eingrenzbare Änderungen. Zusammen ungefähr ein Arbeitstag mit Tests, als ein Deploy. + +### 1.1 S-01 – Legacy-Rechnungen nur mit `billing:manage` + +- `app/Policies/LegacyInvoicePolicy.php`: In `view()` den Aufruf `canAccessAdmin()` durch `$user->can(Permission::BillingManage)` ersetzen, so wie es `InvoicePolicy` bereits tut. Der Eigentümer-Zweig bleibt. +- Weitere Stellen prüfen, die `view`/`downloadPdf` dieser Policy nutzen (z. B. Rechnungsliste in `admin/users/show`). Admins haben `billing:manage`, dort ändert sich also nichts. +- **Tests** (neu `tests/Feature/Billing/LegacyInvoiceAccessTest.php` oder Ergänzung in `tests/Feature/Admin/EditorPermissionBoundaryTest.php`): + - Editor erhält beim fremden PDF über `me.invoices.pdf` den Status 403, über `admin.legacy-invoices.pdf` ebenfalls 403. + - Kunde erhält das eigene PDF mit 200 und ein fremdes mit 403. + - Admin mit `billing:manage` erhält das fremde PDF mit 200 auf beiden Routen. + +### 1.2 S-02 – Kontakt-Zuordnung auf der Firmenanzeige absichern + +- `resources/views/livewire/admin/companies/show.blade.php`: + - `public int $id` mit `#[Locked]` markieren. + - Am Anfang von `attachExistingContact()` den Aufruf `$this->authorize('companies:write')` einfügen. Damit ist auch der Weg über `updatedSelectedExistingContactId()` abgedeckt. + - Das Zuordnungs-UI im Template mit `@can('companies:write')` umschließen; das dient nur der Optik, die eigentliche Sperre ist der Server. +- Nach dem Umhängen wirkt der S-03-Observer aus Phase 2 automatisch. +- **Tests:** Ein Editor ruft `call('attachExistingContact')` auf und setzt `set('selectedExistingContactId', …)`. Beides wird abgewiesen, und `company_id` des Kontakts bleibt unverändert. Ein Admin darf die Aktion weiterhin ausführen. Ein `set('id', …)` wirft eine Exception. + +### 1.3 S-04 – Passwortänderung beendet fremde Sitzungen + +- `app/Services/Auth/SessionRevocation.php` um eine neue Methode `revokeOthersFor(User $user, Session $current)` ergänzen: + - `revokeAllFor($user)` aufrufen. + - Danach die aktuelle Session mit `SESSION_KEY = revokedAt + 1` neu stempeln und `regenerate()` aufrufen. + - Damit bleibt die eigene Sitzung gültig, alle anderen fliegen beim nächsten Request raus. Das gilt auch für Livewire-Requests, weil die Middleware in der `web`-Gruppe hängt. +- Einen zentralen Service für den angemeldeten Passwortwechsel anlegen (z. B. `app/Services/Auth/PasswordChanger.php`). Er setzt den Hash, rotiert `remember_token` und ruft `revokeOthersFor()` auf. + - Verwendet wird er in `customer/security.blade.php` und `settings/password.blade.php` sowie in `UpdateUserPassword`, falls die Fortify-Route bleibt (Entscheidung 4). +- Für den Passwort-Reset einen Listener auf `Illuminate\Auth\Events\PasswordReset` registrieren, analog zu `stampLogin` in `AppServiceProvider`: + - `revokeAllFor($user)` aufrufen; der Reset läuft als Gast, deshalb gibt es keine eigene Sitzung zu erhalten. + - Offene, unbenutzte `MagicLink`-Datensätze des Kontos entwerten. + - Der Listener greift auch beim Go-Live-Reset (`SendGoLiveMails`). +- **Tests** (neu `tests/Feature/Auth/PasswordChangeRevokesSessionsTest.php`): + - Zwei Sitzungen mit eigenem Login-Stempel aufbauen und in der ersten das Passwort ändern. + - Die zweite Sitzung wird auf einer geschützten Seite **und** bei einem Livewire-Update abgemeldet. + - Die erste Sitzung bleibt angemeldet; das Ganze für alle Passwortwege prüfen. + - Nach dem Reset sind beide Sitzungen ungültig und der offene Magic Link ist nicht mehr einlösbar. + - API-Tokens bleiben bestehen, falls Entscheidung 1 so ausfällt. + +**Deploy Phase 1:** keine Migration und kein Nachlauf. + +## 4. Phase 2 – Rechteentzug wirksam machen + +### 2.1 S-03 – Auto-Mitgliedschaften bei jeder Adress- und Zuordnungsänderung neu bewerten + +**Ansatz:** ein Observer statt Aufrufen an jeder einzelnen Stelle. So sind Kunden-Newsroom, Admin-CRM, API, Importer und S-02 auf einmal abgedeckt. + +- Neuer Observer `app/Observers/CompanyMembershipObserver.php`, registriert für `Contact` und `Company` in `AppServiceProvider`. +- **Wann er auslöst:** + - `Contact::updated`, wenn sich `email` oder `company_id` geändert hat. + - `Contact::deleted`. + - `Company::updated`, wenn sich `email` geändert hat. + - `Company::deleted`. +- **Wen er neu bewertet:** + - Alle User mit `company_user.granted_via IN ('auto','auto-upgrade')` für die **alte** Firma. + - Zusätzlich User, deren E-Mail der **alten oder neuen** Adresse entspricht. + - Für jeden davon `ContactAccessService::syncMembershipsForEmail()` aufrufen. +- **Umsetzungsdetails:** + - Den Observer `afterCommit` ausführen und synchron arbeiten lassen. Die Menge ist klein (Benutzer einer Firma), eine Queue-Verzögerung würde den Entzug wieder aufweichen. + - `syncMembershipsForEmail()` bricht bei inaktiven oder unverifizierten Konten früh ab. Für den Entzug ist das unkritisch, weil diese Konten über `canAccessCustomer()` sowieso gesperrt sind. Trotzdem prüfen, ob der Widerruf (`revokeStaleAutomaticGrants`) vor diese Prüfung gezogen werden sollte. + - Manuelle (`manual`) und API-Mitgliedschaften (`api`) bleiben unberührt; das stellt `revokeStaleAutomaticGrants()` bereits sicher. +- **Bulk-Updates über den Query Builder** lösen keine Model-Events aus. Dafür ein neues Kommando `php artisan memberships:resync-auto [--user=]`. Es synchronisiert alle User mit Auto-Mitgliedschaften neu und dient als Reparatur, analog zu `press-releases:reindex-search`. +- **Tests** (neu `tests/Feature/Auth/AutoMembershipRevocationTest.php`): + - Kontakt löschen, Kontakt-E-Mail ändern, Kontakt in eine andere Firma verschieben und Firmen-E-Mail ändern. + - In jedem dieser Fälle sieht der angemeldete User in **derselben** Sitzung die Firma bzw. ihre PMs nicht mehr (403 oder nicht in der Liste). + - Eine manuelle Mitgliedschaft bleibt bestehen. + - Eine `auto-upgrade`-Mitgliedschaft fällt auf `member` zurück. + - Gibt es eine zweite gültige Grundlage, also einen weiteren Kontakt mit derselben Adresse, bleibt das Recht erhalten. + +**Deploy Phase 2:** Nach dem Deploy einmal `php artisan memberships:resync-auto` ausführen. Das bereinigt den Altbestand, also Auto-Rechte, deren Grundlage schon heute fehlt. Vorher die Zahl der betroffenen Pivots per Read-only-Query festhalten. + +### 2.2 S-05 Teil A – Google-Identität fest binden (ohne Produktentscheidung) + +- `GoogleController::callback()`: `email_verified` aus `$googleUser->user` lesen. Ist der Wert nicht `true`, wird der Login abgebrochen. +- `SocialAuthService::resolveUser()`: + 1. Zuerst nach `oauth_provider = google` **und** `oauth_provider_id` suchen. + 2. Erst danach über die E-Mail suchen. + 3. Hat das gefundene Konto bereits eine **andere** Google-ID, wird **nicht** überschrieben. Der Login wird mit einem Hinweis abgewiesen („Bitte per E-Mail-Link anmelden“), das Ereignis wird ohne personenbezogene Details protokolliert. +- Den `hd`-Claim (falls vorhanden) mitgeben, damit Teil B ihn nutzen kann. +- **Tests:** Google-Mock mit `email_verified=false` bzw. ohne den Claim wird abgewiesen. Eine abweichende Provider-ID wird abgewiesen, und die gespeicherte ID bleibt unverändert. Die bekannte Provider-ID meldet an, auch wenn sich die Google-Mail geändert hat. Dabei wird die lokale E-Mail **nicht** automatisch übernommen. + +## 5. Phase 3 – Frischer Identitätsnachweis + +### 3.1 Gemeinsamer Baustein „Sicherheitsbestätigung“ + +Er wird von S-05 Teil B und von S-06 gebraucht, deshalb einmal sauber bauen: + +- **Nachweis je nach Kontoart:** + - Konto mit 2FA: TOTP- oder Recovery-Code (wie heute). + - Konto mit Passwort: Passwort. + - **Konto ohne beides: 6-stelliger Code per Mail an die aktuelle Adresse.** Er gilt 10 Minuten, wird gehasht im Cache gespeichert und ist auf 5 Versuche begrenzt. +- Nach erfolgreichem Nachweis setzt der Baustein `auth.security_confirmed_at` in der Session. Für die nächsten 15 Minuten ist dann keine erneute Abfrage nötig, wie bei Laravels `password.confirm`. +- Umsetzung als Trait bzw. Service, der `assertSecurityProof()` in `customer/security.blade.php` ersetzt. + +### 3.2 S-06 – Einsatz der Sicherheitsbestätigung + +- **Pflicht vor:** + - erstmaliger 2FA-Einrichtung (`enableTwoFactorAuthentication`), + - E-Mail-Wechsel (`updateEmail`), + - Erzeugung eines API-Tokens (`customer/tokens`). +- **Neue Hinweis-Mail an die bisherige Adresse** (z. B. `app/Mail/SecurityChangeNotice.php`) bei: + - bestätigtem E-Mail-Wechsel, + - aktivierter oder deaktivierter 2FA, + - geändertem oder zurückgesetztem Passwort. +- Die Hinweis-Mail enthält Zeitpunkt und Art der Änderung sowie „Waren Sie das nicht? → Passwort zurücksetzen / Support“. Sie enthält keine Codes oder Links mit Anmeldewirkung. +- **Tests:** + - Ohne frische Bestätigung schlagen 2FA-Einrichtung und E-Mail-Wechsel eines passwortlosen Kontos fehl. + - Mit gültigem Mail-Code klappt beides. + - Ein abgelaufener oder falscher Code und der 6. Versuch werden abgewiesen. + - Die Hinweis-Mail geht an die **alte** Adresse. + +### 3.3 S-05 Teil B – Erstverknüpfung bestätigen (nach Entscheidung 3) + +- Existiert ein verifiziertes Konto **ohne** Google-Verknüpfung und ist die Adresse weder `gmail.com`/`googlemail.com` noch mit `hd` versehen, gilt: + - Die Google-ID wird nur **vorgemerkt** (Cache, signierter Link, Gültigkeit 30 Minuten). + - An die Adresse geht ein Link „Google-Konto verknüpfen“. + - Erst nach dem Klick wird `oauth_provider_id` gespeichert und angemeldet. +- **Tests:** externe Adresse ohne `hd` → keine Anmeldung, Mail versendet, nach Klick verknüpft. Bei `gmail.com` oder gesetztem `hd` → direkte Verknüpfung wie bisher. + +## 6. Phase 4 – Härtung (nach Bedarf, einzeln einplanbar) + +| Thema | Maßnahme | Aufwand | +| --- | --- | --- | +| ~~npm-Advisories~~ | ✅ `v1.6.0`: `source-map-js` 1.2.2, `shell-quote` per `overrides` auf ^1.11.0 (1.12.0) — `concurrently` legt 1.9.0 fest, `npm audit fix` stufte nur herab. `npm audit`: 0. | – | +| ~~Proxy~~ | ✅ `v1.5.0`: Live hat keinen Proxy (nginx direkt). `config/trustedproxy.php`: lokal `*` (Traefik), sonst keinem; ein CDN später über `TRUSTED_PROXIES`. | – | +| ~~HSTS~~ | ✅ `v1.5.0`: `SecurityHeaders` setzt `max-age=31536000` in Produktion auf HTTPS (ohne `includeSubDomains`/`preload`). | – | +| ~~Pflicht-2FA Admins~~ | ✅ Umgesetzt als Entscheidung 5 (Passkeys oder App, Super-Admins und Admins), siehe Abschnitt 0. | – | +| ~~Passwortregeln~~ | ✅ `v1.6.0`: mindestens 12 Zeichen für neue und geänderte Passwörter, in Produktion zusätzlich `uncompromised()`. Bestehende Passwörter bleiben gültig. | – | +| ~~Widerruf dauerhaft~~ | ✅ `v1.6.0`: Spalte `users.sessions_revoked_at_ms` (Millisekunden wie der Session-Stempel), Middleware liest sie am geladenen User. Übergangsweise zählt die alte Cache-Marke mit — im Release danach entfernen. Zusätzlich Knopf „Andere Geräte abmelden“ auf der Sicherheitsseite. | – | +| ~~API-Tokens~~ | ✅ `v1.5.0`: optionales Ablaufdatum, Zugang endet mit der Buchung (403), `sanctum:prune-expired` täglich. | – | +| ~~Login-Limit~~ | ✅ `v1.6.0`: `LoginIpThrottle`, 20 Fehlversuche je IP in 15 Minuten über alle Konten; zählt per `Failed`-Event für Livewire-Login und `POST /login`. | – | +| CSP (Stufe 1) | ✅ `v1.6.0`: `Content-Security-Policy-Report-Only` in Produktion, Meldungen über `/csp-report` nach `storage/logs/csp-*.log` (je Meldung höchstens einmal pro Stunde, ohne Query und Tokens). **Offen:** nach einigen Tagen auswerten, Liste ergänzen, dann scharf schalten; `'unsafe-inline'`/`'unsafe-eval'` bleiben bis zu einer Nonce-Lösung. | später | + +## 7. Ablauf und Abnahme + +Die Phasen 1–3 und Entscheidung 5 sind zusammen umgesetzt und gehen als **ein Release per Git-Deploy** raus. Release, Deploy, Nachlauf und Rollback stehen in Abschnitt 0 unter „Release und Deploy“. Die restlichen Punkte aus Phase 4 folgen als eigene Releases nach Kapazität. + +**Vor jedem Release:** volle Suite (`php artisan test --compact --parallel`), Larastan, `vendor/bin/pint --dirty --format agent`. + +**Nach dem Deploy** im Audit-Dokument je Befund den Release-Tag nachtragen. diff --git a/dev/sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md b/dev/sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md new file mode 100644 index 00000000..2ec7f0ee --- /dev/null +++ b/dev/sicherheit/ENTWICKLUNGSPLAN-SPAMSCHUTZ-2026-10-09.md @@ -0,0 +1,198 @@ +# Entwicklungsplan – Spamschutz für öffentliche Formulare + +**Anlass:** Über das Kontakt-Widget kommen täglich Spam-Mails an die Brand-Adressen. Ziel ist, dass Spam gar nicht erst im System landet oder Mails auslöst. + +**Datengrundlage:** lokale Datenbank, Stand 07.10.2026, Zeitraum der letzten 30 Tage. + +**Stand:** 09.10.2026 – Phasen 1 bis 3 live seit `v1.7.0` (09.10.2026), Altbestand und Bot-Konten auf Live aufgeräumt. Offen: juristische Freigabe von Abschnitt 6a der Datenschutzerklärung, Auswertung nach 7 Tagen (ab 16.10.2026). + +## 0. Umsetzungsstand + +| Baustein | Umsetzung | Tests | +| --- | --- | --- | +| B1 Turnstile | `App\Services\Spam\TurnstileVerifier`, Komponente ``, Config `services.turnstile`, CSP um `challenges.cloudflare.com` (script-src, frame-src) ergänzt | `tests/Feature/Web/ContactSpamProtectionTest.php`, `tests/Feature/Auth/RegistrationSpamProtectionTest.php` | +| B2 Inhaltsfilter | `App\Services\Spam\ContactSpamFilter`: fremde Links (Links auf eigene Seiten erlaubt, weil Korrekturwünsche sie nennen), Floskel mit Seitentitel, Zeichensalat, Sperrliste, Absenden unter 3 Sekunden. Nur für Gäste und unbestätigte Konten | wie oben, `tests/Unit/GibberishDetectorTest.php` | +| B3 Quarantäne | Status `ContactMessageStatus::Spam`: keine Mail, nicht im Zähler, kein Verlaufseintrag, Löschung nach 30 Tagen (`model:prune`). Admin: Filter „Spam“, Sammelaktion, „Als Spam markieren“, „Kein Spam“ (holt die Mail einmal nach) | `tests/Feature/Admin/ContactMessagesAdminTest.php` | +| B4 Registrierung | Turnstile und Namensregel (`GibberishDetector::isRandomPersonName`, 0 Fehltreffer unter rund 67.000 Personennamen); Befehl `users:prune-bot-registrations` mit Probelauf, Zeitplan täglich 03:45, aber aus bis `USERS_PRUNE_BOT_REGISTRATIONS=true` | `tests/Feature/Auth/PruneBotRegistrationsTest.php` | +| Altbestand | Befehl `contact-messages:quarantine-spam` mit Probelauf | `tests/Feature/Web/QuarantineContactSpamTest.php` | +| B6 Beobachtung | Log-Kanal `spam` (Grund, Formular, IP-Präfix, nie Inhalte); Betriebsüberwachung: „Spamschutz (Cloudflare Turnstile)“ und „Formulare ohne Bot-Prüfung“ (7 Tage) | `tests/Feature/Admin/SystemHealthTest.php` | +| Datenschutz | Abschnitt 6a „Schutz vor automatisierten Anfragen (Cloudflare Turnstile)“ und Hinweis zur Quarantäne in Abschnitt 6 — **Vorschlag, juristische Freigabe steht aus** | – | + +**Ausfall von Cloudflare (Entscheidung 1, angepasst):** Es wird nie blockiert. Formulare, bei denen Cloudflare nicht erreichbar war, werden angenommen und markiert: +- im Aktivitätsverlauf als Typ „Ohne Bot-Prüfung“; +- in der Kontakt-Queue als Badge „ohne Bot-Prüfung“; +- in der Betriebsüberwachung als Warnung. + +Das gilt in drei Fällen: Siteverify antwortet nicht, Cloudflare lehnt unseren Secret-Key ab, oder das Widget lud im Browser nicht. Den letzten Fall meldet der Browser selbst und könnte deshalb missbraucht werden. Sollte das passieren, schaltet `TURNSTILE_FAIL_OPEN=false` auf Ablehnen um. + +**Messung am Altbestand (lokal, Stand 07.10.):** +- `contact-messages:quarantine-spam` markiert mit den Live-Hostnamen 125 offene Gast-Anfragen. Die echten Korrekturanfragen KT-32, KT-33 und KT-161 bleiben offen. +- Was der Filter nicht erkennt, wird über die Sammelaktion markiert. Das sind vor allem die Preisfragen in wechselnden Sprachen und die Newsletter-Bitten. +- `users:prune-bot-registrations --dry-run` findet 392 Konten. 379 davon haben einen Zufallsnamen, 13 sind echt wirkende, aber seit über 14 Tagen unbestätigte und ungenutzte Konten. + +**Nach dem Deploy auf Live (09.10.2026, `v1.7.0`):** +1. ✅ Turnstile-Widget im Cloudflare-Dashboard mit allen drei Live-Hostnamen, Kontakt-Widget im Browser getestet, Betriebsüberwachung grün. +2. ✅ `contact-messages:quarantine-spam`: 152 Anliegen in die Quarantäne, darunter eine neue Welle „XEvil … löst Captchas“ vom 08./09.10. 130 blieben offen, vor allem Preisfragen in wechselnden Sprachen und Newsletter-Bitten; die kommen per Sammelaktion in die Quarantäne. Die echten Korrekturanfragen KT-32, KT-33 und KT-161 blieben offen. +3. ✅ `users:prune-bot-registrations`: Probelauf geprüft und freigegeben, ausgeführt, täglicher Lauf eingeschaltet (`USERS_PRUNE_BOT_REGISTRATIONS=true`). Die Liste bestätigte das Sign-up-Bombing: Zufallsnamen mit fremden Adressen, darunter Behörden (`state.gov`, `usdoj.gov`) und SMS-Gateways (`vtext.com`, `tmomail.net`). +4. Lokal die Cloudflare-Testkeys in die `.env` eintragen (die echten Keys sind an die Live-Hostnamen gebunden). +5. **Ab 16.10.2026:** Wirkung auswerten — Spam-Filter in der Kontakt-Queue, `storage/logs/spam-*.log`, Betriebsüberwachung „Formulare ohne Bot-Prüfung“. +6. Abschnitt 6a der Datenschutzerklärung juristisch freigeben lassen. + +## 1. Befund + +### Kontakt-Widget (`contact_messages`) + +- 141 Anfragen in 30 Tagen, das sind 2 bis 9 pro Tag auf allen drei Portalen. Jede löst eine Mail aus. +- Davon kommen 5 von angemeldeten Kunden (`user_id` gesetzt). Nach Durchsicht der letzten 70 sind das die einzigen echten. Der Rest ist Spam. +- Es gibt fünf Spam-Familien: + +| Muster | Anzahl (30 T.) | Beispiel | +| --- | --- | --- | +| Link im Text (telegra.ph, tinyurl, ``, SEO-Angebote) | 56 | „2026 Rolls-Royce Phantom for $15,000 https://telegra.ph/…“ | +| Floskel plus Meta-Beschreibung der Seite | 43 | „Ich wünsche weitere Informationen. Bitte kontaktieren Sie mich per E-Mail — aktuelle pressemitteilungen aus der deutschen wirtschaft.“ | +| Preisfrage in wechselnden Sprachen | regelmäßig | „Kaixo, zure prezioa jakin nahi nuen.“ (Name „RobertHix“, „Robertfielt“) | +| Zeichensalat | vereinzelt | Name „NAEWTRER2720160NEYRTHYT“, Text „METRYTRE2720160MAWRERGTRH“ | +| Newsletter-Bitte auf Englisch | vereinzelt | „Hi! I'd like to subscribe to your newsletter.“ | + +- **Herkunft:** wenige Netze. `212.30.36.x` allein bringt 32 Anfragen, `158.173.79.x` 13 und `77.90.185.x` 11. Das Limit pro IP (5 pro Stunde) greift nicht, weil die Absender innerhalb des Netzes die IP wechseln. +- **Vorhandener Schutz:** zwei Honeypot-Felder (`website`, `homepage`), ein Limit pro IP und `throttle:10,1`. Das hält diese Bots nicht auf. Sie füllen die Honeypots offenbar nicht aus und laden die Seite vorher (`page_url` ist immer gesetzt). + +### Registrierung – größer als das Kontaktformular + +- 452 neue Konten in 30 Tagen. 389 davon sind Bot-Konten: Name als Zufallsbuchstaben („ruLrlotwaCoVStmZetSxD“), E-Mail nie bestätigt, keiner Firma zugeordnet. Das sind 6 bis 21 pro Tag. +- Echte Neukunden im selben Zeitraum: 59 (bestätigt). +- **Jedes Bot-Konto löst eine Bestätigungsmail an eine fremde Adresse aus.** Darunter sind SMS-Gateways von US-Mobilfunkanbietern (`tmomail.net`, `vtext.com`). Das ist bekanntes Sign-up-Bombing: + - Die Täter nutzen unseren Mailversand, um Postfächer zu fluten. + - Das schadet unserer Absender-Reputation und damit der Zustellung echter Mails. +- Vorhandener Schutz: nur ein Limit pro IP (10 pro Stunde). + +### Übrige öffentliche Formulare + +Diese Formulare haben einen Honeypot und ein Limit. Spam fällt dort noch nicht auf (z. B. 14 Rechtsanfragen in 30 Tagen). Sie verschicken aber Mails an Adressen, die der Absender angibt: + +- Widerruf +- Kündigung +- Meldeformular +- Rechtsanfrage + +## 2. Bausteine + +### B1 – Cloudflare Turnstile (Kern) + +**Konfiguration** +- Neuer Eintrag `services.turnstile` mit `site_key`, `secret_key` und `enabled`. Grund: Wegen `config:cache` darf `env()` nur in `config/` stehen. +- Die Keys stehen bereits in der `.env`. Es sind echte Keys (`0x…`), keine Testkeys. + +**Serverseitige Prüfung** +- Ein Dienst `TurnstileVerifier` ruft `POST https://challenges.cloudflare.com/turnstile/v0/siteverify` auf. +- Mitgesendet werden `secret`, `response` und `remoteip`. +- Geprüft werden `success`, `hostname` (gegen die drei Portal-Domains) und `action` (pro Formular). +- Timeout 3 Sekunden. +- Ein Token gilt nur einmal und höchstens 300 Sekunden. + +**Blade-Komponente ``** +- Das Skript wird nur dort geladen, wo ein Formular sichtbar ist. +- Im Kontakt-Widget lädt es erst beim Öffnen des Panels (`render=explicit`). Normale Seitenaufrufe stellen so keine Verbindung zu Cloudflare her. +- Modus „Managed“: meist unsichtbar, nur bei Verdacht eine Checkbox. + +**Livewire (Registrierung)** +- Den Container mit `wire:ignore` ausnehmen. +- Ein Callback setzt das Token in ein Property. +- Nach einem Validierungsfehler `turnstile.reset()` aufrufen. Sonst scheitert der zweite Versuch am verbrauchten Token. + +**CSP:** `https://challenges.cloudflare.com` muss in `script-src` und `frame-src` aufgenommen werden (`App\Support\ContentSecurityPolicy`). Das gehört vor das Scharfschalten der CSP und deckt sich mit der Wiedervorlage ab 15.10. + +**Tests und lokale Entwicklung** +- `phpunit.xml` leert die Keys. Die Tests nutzen `Http::fake`. +- Lokal kommen die Cloudflare-Testkeys in die `.env` (`1x…` = besteht immer, `2x…` = scheitert immer). Die echten Keys sind an die Live-Hostnamen gebunden. + +**Cloudflare-Dashboard:** Beim Widget müssen alle Hostnamen eingetragen sein: `pressekonto.com`, `presseecho.de`, `businessportal24.com` sowie weitere Live-Domains aus `config/domains.php`. + +### B2 – Inhaltsfilter fürs Kontaktformular (zweite Linie) + +Diese Regeln gelten nur für **nicht angemeldete** Absender. Kunden bleiben ungefiltert. + +- **Links:** URL, `www.` oder `` kommt in diese Formulare: + - Widerruf + - Kündigung + - Meldeformular + - PM-Meldung (Link anfordern und Anliegen) + - Rechtsanfrage + - Newsroom verwalten +- **Kündigung und Widerruf sind gesetzlich vorgeschrieben** (§ 312k BGB, Widerrufsrecht). Ist Cloudflare nicht erreichbar, werden sie dort **trotzdem angenommen** (fail-open) und nur als „ohne Bot-Prüfung“ im Log vermerkt. + +### B6 – Beobachtung + +- Jede abgewiesene Anfrage wird mit Formular, Grund und IP-Präfix gezählt, ohne Inhalt. Dafür ist ein eigener Log-Kanal `spam` vorgesehen, analog zu `csp`. +- Die Betriebsüberwachung bekommt einen Check: In Produktion sind die Turnstile-Keys gesetzt. +- Nach 7 Tagen wird ausgewertet, wie viel durchkommt und wie viel in der Quarantäne liegt. + +## 3. Reihenfolge + +| Phase | Inhalt | Wirkung | +| --- | --- | --- | +| 1 | B1 + B2 + B3 fürs Kontakt-Widget, CSP-Ergänzung | Die täglichen Spam-Mails hören auf. | +| 2 | B4: Turnstile und Namensregel bei der Registrierung | Keine Bestätigungsmails mehr an fremde Postfächer. | +| 3 | B4: Aufräumbefehl für Bot-Konten (erst Probelauf) | Rund 390 Bot-Konten weg, saubere Kennzahlen. | +| 4 | B5: übrige Formulare | Gleicher Schutz überall. | +| 5 | B6: Auswertung nach 7 Tagen | Schwellen nachschärfen oder lockern. | + +Phasen 1 und 2 passen in ein Release. Es ist **keine Migration** nötig: `contact_messages.status` ist eine String-Spalte (`string(40)`), der Status `spam` ist nur ein neuer Enum-Wert. + +## 4. Entscheidungen (09.10.2026) + +Alle wie empfohlen, mit einer Anpassung bei Nr. 1: Bei nicht erreichbarem Cloudflare wird **überall** durchgelassen und markiert, also auch bei Kontaktformular und Registrierung. Nr. 4: Ein Textvorschlag ist eingebaut. + +1. **Cloudflare nicht erreichbar.** Empfehlung: + - Kontaktformular und Registrierung: fail-closed, mit der Meldung „bitte später erneut“. + - Kündigung und Widerruf: fail-open (siehe B5). +2. **Altbestand im Kontakt-Postfach.** Rund 140 offene Spam-Anfragen der letzten 30 Tage nachträglich als Spam markieren? Empfehlung: ja, per einmaligem Befehl mit Probelauf, nach denselben Regeln wie B2. +3. **Bot-Konten löschen** (B4, Phase 3). Empfehlung: ja, aber erst nach deiner Freigabe der Probelauf-Liste. +4. **Datenschutzerklärung.** Turnstile überträgt die IP und Browsermerkmale an Cloudflare (USA, EU-US Data Privacy Framework). Ein Absatz in `datenschutz.blade.php` ist nötig, Rechtsgrundlage Art. 6 Abs. 1 lit. f DSGVO (Missbrauchsschutz). Den Text sollte jemand juristisch freigeben. +5. **Links von Gästen.** Komplett sperren oder nur ab einem Link in Kombination mit einem weiteren Signal? Empfehlung: Gäste dürfen keine Links senden. Echte Anfragen kamen in der Stichprobe ohne Link oder von angemeldeten Kunden. + +## 5. Weitere Ideen (nicht eingeplant) + +- Ein Limit pro /24-Netz zusätzlich zum Limit pro IP. Das würde `212.30.36.x` direkt bremsen, Turnstile macht das aber weitgehend überflüssig. +- Statt einer Mail pro Anfrage eine tägliche Sammelmail für das Kontakt-Postfach. +- Einwegadressen-Domains wie `notboxletters.com` und `belettersmail.com` als kleine Sperrliste. Sie wechseln aber ständig. +- KI-Klassifizierung der Nachricht. Für diese Mengen ist das überdimensioniert. Sinnvoll erst, wenn nach Turnstile noch nennenswert Spam durchkommt. diff --git a/dev/sicherheit/SICHERHEITSAUDIT-2026-10-07.md b/dev/sicherheit/SICHERHEITSAUDIT-2026-10-07.md new file mode 100644 index 00000000..263bfe78 --- /dev/null +++ b/dev/sicherheit/SICHERHEITSAUDIT-2026-10-07.md @@ -0,0 +1,276 @@ +# Sicherheitsaudit – Login, Sitzungen und Berechtigungen + +**Datum:** 07.10.2026 + +**Geprüfter Repository-Stand:** `2215826f374b` + +**Arbeitsverzeichnis:** `/var/www/html` + +**Auftrag:** ausschließlich Sicherheitsprüfung und Dokumentation; keine Fehlerbehebung. + +## 1. Ergebnis + +Die Anwendung hat bereits wesentliche Schutzmechanismen. Dennoch wurden **sechs konkrete Sicherheitsprobleme im Code** festgestellt: fünf mit hoher und eines mit mittlerer Priorität. Besonders relevant sind der Zugriff von Editoren auf fremde Alt-Rechnungen, eine ungeschützte Kontakt-Schreibaktion, verzögerter Entzug von Firmenrechten, fortbestehende Sitzungen nach Passwortänderungen und die automatische Kontoverknüpfung beim Google-Login. + +Die Befunde sind durch nachvollziehbare Codepfade belegt. **Eine gezielte dynamische Ausnutzung der sechs Befunde wurde nicht durchgeführt.** Nach Klarstellung der Dev-Container-Umgebung wurden die vorhandenen Sicherheitstests und Paketprüfungen direkt ausgeführt; Ergebnisse siehe Abschnitt 6. Zusätzlich wurden zwei npm-Sicherheitsmeldungen für drei betroffene Pakete gefunden. Der Bericht ist keine Bestätigung der Sicherheit des produktiven Gesamtsystems. + +| ID | Priorität | Befund | Nachweisstatus | +| --- | --- | --- | --- | +| S-01 | Hoch | Editor kann fremde Legacy-Rechnungs-PDFs abrufen | Codepfad belegt | +| S-02 | Hoch | Kontaktzuordnung lässt sich ohne `companies:write` ändern | Codepfad belegt | +| S-03 | Hoch | Automatische Firmenrechte bleiben nach Kontaktentfernung bestehen | Codepfad belegt | +| S-04 | Hoch | Passwortreset/-wechsel widerruft bestehende Browser-Sitzungen nicht | Codepfad belegt | +| S-05 | Hoch | Google-Kontoverknüpfung vertraut der E-Mail ohne ausreichende Identitätsprüfung | Fehlende Prüfungen belegt; Angriff erfordert passende Google-Identität | +| S-06 | Mittel | Sensible Kontokonfiguration teilweise ohne erneuten Identitätsnachweis | Codepfad belegt; bestehende Sitzung erforderlich | + +„Hoch“ bezeichnet hier erheblichen unberechtigten Datenzugriff, Schreibzugriff oder fortbestehenden Kontozugriff unter den jeweils genannten Voraussetzungen. Die Einstufung ist keine berechnete CVSS-Bewertung. Es wurde kein voraussetzungsloser anonymer Vollzugriff auf das System nachgewiesen. + +## 2. Umfang und Methode + +Geprüft wurden insbesondere: + +- Passwortlogin über Livewire und Fortify; Registrierung und E-Mail-Verifizierung. +- Passwortreset, Passwortwechsel, Magic Links, Google-OAuth und Zwei-Faktor-Authentifizierung. +- Sitzungsaufbau, Logout, Remember-Cookies und eigener Sitzungswiderruf. +- Admin-/Editor-/Kunden-Grenzen, Policies, Firmenmitgliedschaften und ausgewählte Livewire-Schreibaktionen. +- Rechnungsdownloads, Benutzer-Impersonation und API-Token-Verwaltung. +- API-Authentifizierung, Token-Berechtigungen, Eigentümerfilter und aktive Konten. +- Stichproben zu privaten Medien, Uploadvalidierung, HTML-Bereinigung, CSRF, HTTP-Headern und Proxy-Vertrauen. +- Vorhandene Tests und sicherheitsrelevante Konfiguration. Geheimnisse wurden nicht in diesen Bericht übernommen. + +Die Prüfung kombinierte Quellcodeanalyse, Nachverfolgung von Aufrufern und Schutzschichten sowie Abgleich mit versionsbezogener Laravel-/Livewire-Dokumentation und offizieller Google-Dokumentation. Kommentare zu früheren Audits wurden nicht als Wirksamkeitsnachweis übernommen; entscheidend war der aktuelle Code. + +Laut Laravel-Boost-Paketinventar: PHP 8.4, Laravel 12.69.3, Fortify 1.40.0, Livewire 4.4.7, Sanctum 4.3.3 und Socialite 5.31.0. Dies ist eine Bestandsaufnahme, keine Aussage zur CVE-Freiheit dieser Versionen. + +Nicht durchgeführt wurden Änderungen an Anwendungscode, Konfiguration, Abhängigkeiten oder bestehenden Benutzer-/Berechtigungsdaten; ebenso keine aktiven Angriffe auf Produktivsysteme. Die Tests verwenden eigene SQLite-In-Memory-Daten. Neben diesem Bericht wurde auf ausdrücklichen Benutzerwunsch eine Projektnotiz unter `.ai/rules/general.md` zur direkten Befehlsausführung im Dev-Container angelegt. Bereits vorhandene unversionierte Dateien unter `dev/2026-10/` wurden nicht verändert. + +## 3. Sicherheitsbefunde + +### S-01 – Editor kann fremde Legacy-Rechnungen herunterladen + +**Priorität: Hoch.** Betroffen ist die Vertraulichkeit von Rechnungs- und Kundendaten. + +**Belege:** + +- `routes/customer.php:21` lässt auch aktive, verifizierte Editoren in den Kundenbereich; `:69` registriert `admin/me/legacy-invoices/{legacyInvoice}/pdf`. +- `app/Models/User.php:561` schließt die Rolle `editor` in `canAccessAdmin()` ein. +- `app/Policies/LegacyInvoicePolicy.php:22` erlaubt über `canAccessAdmin()` den Zugriff auf jede Alt-Rechnung, unabhängig von Eigentümer und `billing:manage`. +- `app/Http/Controllers/LegacyInvoicePdfController.php:15` verwendet diese Policy und liefert anschließend die gespeicherte beziehungsweise neu gerenderte PDF. +- Der eigentliche Admin-Rechnungsbereich ist dagegen in `routes/admin.php:95` an `billing:manage` gebunden. Die Editor-Rolle besitzt dieses Recht nach `app/Authorization/Permission.php:98` nicht. + +**Voraussetzung und nachvollziehbarer Prüffall:** Ein aktiver, verifizierter Editor ohne `billing:manage` ruft die Kunden-Downloadroute mit der ID einer fremden Legacy-Rechnung auf. Die Policy gestattet den Abruf. Eine ausgeblendete Rechnungsübersicht verhindert diesen direkten Zugriff nicht. + +**Empfehlung:** Fremde Rechnungen nur mit `billing:manage` freigeben; eigenen Belegzugriff separat erhalten. `app/Policies/InvoicePolicy.php` enthält bereits die entsprechende Unterscheidung für neue Rechnungen. Beide URL-Wege müssen dieselbe fachliche Berechtigung erzwingen. + +**Erforderlicher Regressionstest:** Editor ohne Rechnungsrecht erhält beim fremden Legacy-PDF 403; Eigentümer erhält den eigenen Beleg; berechtigter Billing-Administrator erhält den fremden Beleg. Die Kunden- und Admin-Downloadroute separat prüfen. + +### S-02 – Schreibaktion auf der Firmenanzeige umgeht `companies:write` + +**Priorität: Hoch.** Betroffen sind Datenintegrität und mittelbar Firmenberechtigungen. + +**Belege:** + +- `routes/admin.php:71` macht die Firmenanzeige für Editoren erreichbar. Andere CRM-Schreibrouten werden erst ab `:74` durch `can:companies:write` geschützt. +- `resources/views/livewire/admin/companies/show.blade.php:56` definiert die öffentliche Aktion `attachExistingContact()` ohne Gate-/Policy-Prüfung. +- Die Aktion überschreibt in `:82` die `company_id` des ausgewählten Kontakts. +- Auch das Aktualisieren von `selectedExistingContactId` ruft die Aktion direkt auf (`:23`). Die Ziel-ID `$id` ist eine nicht mit `#[Locked]` gesperrte öffentliche Property (`:13`). + +**Voraussetzung und Prüffall:** Ein Editor ohne `companies:write` öffnet eine Firmenanzeige und löst die Aktion mit einem existierenden Kontakt aus. Die serverseitige Prüfung beschränkt sich auf die Existenz von Firma und Kontakt; das fehlende Schreibrecht wird nicht geprüft. + +**Auswirkung:** Kontakte lassen sich gegen die vorgesehene Rollenbegrenzung zwischen Firmen verschieben. Zusätzlich leitet `app/Services/Auth/ContactAccessService.php:282` aus Kontakt-E-Mail und Firmenzuordnung automatische `responsible`-Mitgliedschaften ab. Ein bereits vorhandener Kontakt mit kontrolliertem Postfach kann deshalb nach der Verschiebung zur Grundlage zusätzlicher Firmenrechte werden. Diese zweite Wirkung setzt einen entsprechenden Kontakt und eine spätere Synchronisierung voraus. + +**Empfehlung:** `companies:write` unmittelbar vor der Mutation erzwingen und den Zugriff auf die beteiligten Datensätze prüfen. Die serverseitige Ziel-ID sperren. Eine reine UI-Beschränkung oder das Sperren der ID allein behebt die fehlende Aktionsautorisierung nicht. + +**Erforderlicher Regressionstest:** Direkter Aktionsaufruf und Property-Update als Editor werden abgewiesen; die bestehende Kontaktzuordnung bleibt unverändert. Berechtigte Administratoren dürfen die Aktion weiterhin ausführen. + +### S-03 – Entfernte Kontakte behalten automatische Firmenrechte + +**Priorität: Hoch.** Betroffen sind Vertraulichkeit und Integrität von Firmendaten und Pressemitteilungen. + +**Belege:** + +- `app/Services/Auth/ContactAccessService.php:123` berechnet automatische Mitgliedschaften neu und entzieht in `:155` veraltete automatische Rechte. +- Reguläre Aufrufstellen sind der Login-Listener `app/Listeners/SyncCompanyMembershipsOnLogin.php:28` und die Bestätigung der eigenen neuen E-Mail in `app/Http/Controllers/Auth/ConfirmEmailChangeController.php:46`. +- Kontaktänderung und -löschung in `resources/views/livewire/customer/press-kits/show.blade.php:263` beziehungsweise `:277` führen diese Bereinigung nicht aus. +- Die registrierten `EmailDomainObserver` und `AdminPerformanceCacheObserver` prüfen Domains beziehungsweise leeren Anzeige-Caches; sie widerrufen keine Mitgliedschaften. +- `app/Models/User.php:601` verwendet die weiterhin gespeicherten Firmenzuordnungen. `app/Policies/CompanyPolicy.php:75` akzeptiert die bestehende `responsible`-Rolle weiter als Schreibberechtigung. + +**Voraussetzung und Prüffall:** Ein Benutzer hat ausschließlich über seine Kontaktadresse automatisch Firmenzugriff erhalten und ist bereits angemeldet. Die Kontaktadresse wird entfernt oder geändert; es gibt keine zweite gültige Zuordnungsgrundlage. Mit derselben Sitzung wird anschließend erneut auf die Firma beziehungsweise deren Pressemitteilungen zugegriffen. + +**Auswirkung:** Der automatische Berechtigungsdatensatz bleibt bestehen und erlaubt weiterhin Zugriff, bis eine erneute Synchronisierung erfolgt. Ein aktiver Benutzer kann seinen nächsten Login hinausschieben; das ist kein verlässlicher Zeitpunkt für einen Rechteentzug. Manuell vergebene Rechte sind davon zu unterscheiden und dürfen nicht pauschal gelöscht werden. + +**Empfehlung:** Bei Änderungen/Löschungen von Kontakt- und Firmen-E-Mail-Adressen sowie Kontaktverschiebungen die betroffenen automatischen Mitgliedschaften serverseitig neu bewerten. Den Entzug unmittelbar wirksam machen oder die aktuelle Berechtigungsgrundlage bei Zugriff prüfen. Manuelle und API-basierte Mitgliedschaften gezielt erhalten. + +**Erforderlicher Regressionstest:** Nach Entfernung der einzigen Zuordnungsgrundlage wird der nächste Zugriff aus derselben bestehenden Sitzung abgewiesen. Varianten für E-Mail-Wechsel und Firmenwechsel ergänzen; manuelle Mitgliedschaften müssen erhalten bleiben. + +### S-04 – Passwortreset und Passwortwechsel lassen bestehende Sitzungen bestehen + +**Priorität: Hoch.** Betroffen ist die Wiederherstellung der Kontosicherheit nach kompromittierten Zugangsdaten oder Sitzungen. + +**Belege:** + +- `resources/views/livewire/auth/reset-password.blade.php:44` setzt das Passwort und rotiert den Remember-Token, widerruft aber keine bestehenden Browser-Sitzungen. +- `resources/views/livewire/customer/security.blade.php:62`, `resources/views/livewire/settings/password.blade.php:22` und `app/Actions/Fortify/UpdateUserPassword.php:22` ändern das Passwort ohne allgemeinen Sitzungswiderruf. +- `app/Services/Auth/SessionRevocation.php:34` bietet bereits einen eigenen Widerrufsmechanismus. Der gefundene Anwendungscode ruft ihn nur im Google-Onboarding eines zuvor unverifizierten Kontos auf (`app/Services/Auth/SocialAuthService.php:65`). +- In `bootstrap/app.php` und den geschützten Web-Routen ist kein allgemeines `auth.session`/`AuthenticateSession` eingerichtet. Auch ein entsprechender eigener `PasswordReset`-Listener wurde nicht gefunden. Der Eintrag in `config/sanctum.php` ersetzt diese Web-Middleware nicht. + +**Voraussetzung und Prüffall:** Zwei Browser sind mit demselben Konto angemeldet. In einem Browser wird das Passwort zurückgesetzt oder geändert. Die bereits authentifizierte Sitzung des zweiten Browsers bleibt durch die untersuchten Schutzschichten gültig. + +**Auswirkung:** Ein Angreifer mit bestehender Sitzung kann nach der Passwortwiederherstellung weiterarbeiten. Die Rotation des Remember-Tokens beim Reset verhindert nicht die Verwendung einer bereits aufgebauten Sitzung. API-Tokens und noch gültige Login-Links werden ebenfalls nicht zentral als Wiederherstellungsmaßnahme behandelt; deren gewünschter Widerruf muss ausdrücklich festgelegt werden. + +**Empfehlung:** Passwortreset mit einem zentralen Widerruf älterer Sitzungen verbinden. Beim angemeldeten Passwortwechsel mindestens andere Sitzungen beenden oder eine ausdrückliche, wirksame Option anbieten. Alle Passwortwege vereinheitlichen. Für einen vollständigen Kontowiederherstellungsprozess zusätzlich Remember-Cookies, API-Tokens und offene Login-Links berücksichtigen. Laravel beschreibt den erforderlichen Zusammenhang von `auth.session` und `logoutOtherDevices()` in der [Authentifizierungsdokumentation](https://laravel.com/docs/12.x/authentication#invalidating-sessions-on-other-devices). + +**Erforderlicher Regressionstest:** Zwei unabhängig aufgebaute Sitzungen verwenden; nach Reset darf die alte Sitzung keine geschützte Seite und keine Livewire-Aktion mehr ausführen. Alle drei Passwortwechselwege prüfen. Gewolltes Verhalten für die aktuelle Sitzung, Remember-Cookies und API-Tokens separat festhalten. + +### S-05 – Google-Login verknüpft Konten ausschließlich anhand der E-Mail + +**Priorität: Hoch.** Eine Kontoverwechslung kann zum Zugriff auf ein bestehendes Konto und dessen Firmenrechte führen. + +**Belege:** + +- `app/Http/Controllers/Auth/GoogleController.php:35` übergibt lediglich Provider, Provider-ID, E-Mail und Name. `email_verified` und `hd` werden nicht geprüft. +- `app/Services/Auth/SocialAuthService.php:36` sucht das lokale Konto ausschließlich anhand der E-Mail. +- Eine vorhandene `oauth_provider_id` wird in `:42` überschrieben, statt als stabile Identitätsbindung geprüft zu werden. +- Neue beziehungsweise zuvor unverifizierte Konten werden anschließend als verifiziert behandelt. +- Der installierte Socialite-Google-Provider stellt `email_verified` in den Rohdaten bereit, erzwingt beim Mapping aber keine entsprechende Anwendungsentscheidung (`vendor/laravel/socialite/src/Two/GoogleProvider.php`, `mapUserToObject()`). + +**Angriffsvoraussetzung:** Der Angreifer benötigt eine von Google gelieferte Identität mit einer E-Mail, die zum lokalen Zielkonto passt, obwohl ihm das zugehörige Postfach nicht mehr gehört oder die erforderliche Verifizierung fehlt. Das ist insbesondere bei externen, später neu vergebenen E-Mail-Adressen relevant. Ein frei erfundener Callback-Parameter reicht nicht aus; Socialite verwendet weiterhin den regulären OAuth-Ablauf. + +**Einordnung:** Google warnt ausdrücklich, dass es für externe E-Mail-Adressen ohne Workspace-Zuordnung (`hd`) keine verlässliche Aussage über den aktuellen Postfachbesitz trifft. Auch `email_verified=true` kann dort auf einer früheren Prüfung beruhen. Die Anwendung muss für solche Verknüpfungen zusätzliche Nachweise verlangen. Siehe [Google: Backend-Authentifizierung](https://developers.google.com/identity/sign-in/web/backend-auth). + +**Auswirkung und Grenze:** Ohne aktivierte 2FA kann eine passende fremde Google-Identität den ersten Loginfaktor ersetzen. Bei bereits bestätigter 2FA wird im geprüften Controller weiterhin die Challenge verlangt; ein pauschaler 2FA-Bypass wurde nicht gefunden. + +**Empfehlung:** Bestehende Verknüpfungen anhand der stabilen Provider-Identität auflösen und abweichende IDs nicht still überschreiben. `email_verified` explizit validieren. Für die erstmalige Verknüpfung mit einem vorhandenen Konto und für nicht autoritative externe Adressen einen aktuellen Nachweis über das lokale Konto beziehungsweise Postfach verlangen. Den Provider-Link erst nach erfolgreicher Prüfung speichern. + +**Erforderlicher Regressionstest:** Fehlendes/falsches `email_verified`, externe Adresse ohne `hd`, bereits anders verknüpfte Provider-ID und wiedervergebene E-Mail als Negativfälle abdecken. Die vorhandenen Google-Tests simulieren überwiegend nur ID/E-Mail/Name und belegen diese Grenzen nicht. + +### S-06 – Sensible Kontokonfiguration ohne frischen Identitätsnachweis + +**Priorität: Mittel.** Voraussetzung ist eine bereits verwendbare Sitzung, etwa nach Session-Diebstahl oder an einem unbeaufsichtigten Gerät. + +**Belege und zwei konkrete Fälle:** + +1. `resources/views/livewire/customer/security.blade.php:138` beginnt die erstmalige 2FA-Einrichtung ohne erneute Passwort-/Postfachbestätigung. `:150` bestätigt lediglich den gerade neu erzeugten Faktor. Die Route in `routes/customer.php:76` verlangt keine frische Authentifizierung. Ein Sitzungsinhaber kann bei bisher fehlender 2FA deshalb seinen eigenen Authenticator registrieren und den echten Nutzer bei künftigen Logins aussperren. +2. `resources/views/livewire/customer/security.blade.php:206` lässt bei Konten ohne Passwort und ohne aktive 2FA `assertSecurityProof()` ohne weiteren Nachweis passieren. Der nachfolgende E-Mail-Wechsel bestätigt nur die neue Adresse. Ein Angreifer mit einer solchen Sitzung kann seine eigene neue Adresse bestätigen und daraus dauerhaften Kontozugriff gewinnen, ohne das bisherige Postfach zu kontrollieren. + +Bei schon aktiver 2FA verlangt der Code für Deaktivierung und Recovery-Code-Neuerzeugung einen zweiten Faktor; diese vorhandene Schutzmaßnahme wird hier nicht als fehlend bewertet. Ebenso handelt es sich nicht um einen belegten CSRF-Angriff: Benötigt wird eine gültige Sitzung mit nutzbarem Anwendungskontext. + +**Empfehlung:** Vor erstmaliger 2FA-Einrichtung und Änderung der Login-Adresse einen zeitnahen Nachweis verlangen. Bei passwortlosen Konten etwa einen separaten kurzlebigen Bestätigungslink an die bisherige Adresse oder einen ausdrücklich dafür vorgesehenen erneuten Google-Login. Ein Code des gerade neu eingerichteten Authenticator ersetzt diesen Nachweis nicht. Sicherheitsänderungen zusätzlich an die bisherige Adresse melden. + +**Erforderlicher Regressionstest:** Eine ältere, vollständig angemeldete Sitzung ohne frischen Nachweis darf weder erstmals 2FA aktivieren noch die Login-Adresse eines passwortlosen Kontos ersetzen. Nach erfolgreicher erneuter Identitätsprüfung müssen legitime Änderungen möglich bleiben. + +## 4. Zusätzliche Risiken und Sicherheitshärtung + +Diese Punkte werden ausdrücklich nicht als weitere dynamisch bestätigte Sicherheitslücken gezählt. + +| Thema | Beobachtung | Verbesserung / noch erforderlicher Nachweis | +| --- | --- | --- | +| Proxy-Vertrauen | `bootstrap/app.php` vertraut allen Proxies einschließlich `X-Forwarded-For` und `X-Forwarded-Host`. | Vertrauenswürdige Proxy-Netze begrenzen oder nachweisen, dass nur der Proxy das Backend erreicht und fremde Forwarded-Header zuverlässig bereinigt. Andernfalls sind IP-basierte Limits und IP-Protokolle manipulierbar. Die reale Produktions-Proxykonfiguration wurde nicht geprüft. | +| Login-Rate-Limit | Livewire-Login und Fortify begrenzen nach Kombination aus E-Mail und IP. | Zusätzliche IP-weite und geeignete kontobezogene Erkennung für Password-Spraying/verteilte Versuche erwägen, ohne einfach provozierbare Kontosperren zu erzeugen. Wirksamkeit am tatsächlichen Proxy prüfen. | +| 2FA für privilegierte Rollen | 2FA ist unterstützt, aber im untersuchten Admin-Gate nicht verpflichtend. | Für Administratoren und besonders Super-Administratoren verpflichtende 2FA und einen geregelten Wiederherstellungsprozess vorsehen. | +| Passwortqualität | Die geprüften Formulare verwenden `Password::defaults()`; eine zentrale Verschärfung wurde nicht gefunden. | Längere Passphrasen, passende Mindestlänge und Prüfung bekannter kompromittierter Passwörter erwägen. Den Schutz nicht nur an Sonderzeichenregeln festmachen. | +| API-Token-Lebensdauer | `config/sanctum.php` setzt `expiration` auf `null`; die Kunden-Token-Erzeugung setzt kein Ablaufdatum. | Ablauf, Rotation und Widerruf bei Sicherheitsvorfällen festlegen. Für Token-Erzeugung einen frischen Identitätsnachweis erwägen. Keine Behauptung, dass jeder bereits gespeicherte Token unbegrenzt gültig ist. | +| Widerruf im Cache | `SessionRevocation` speichert die Widerrufsmarke befristet im Cache. | Verhalten bei Cache-Flush, Ausfall und Eviction prüfen; gegebenenfalls dauerhafte Authentifizierungsversion am Benutzer vorsehen. Ein Cacheverlust sollte entzogene Sitzungen nicht wieder freigeben. | +| HTTP-Header | `SecurityHeaders` setzt mehrere sinnvolle Header, aber keine CSP oder HSTS. | Eine zu Livewire/Alpine passende CSP zunächst beobachtend einführen; HSTS und HTTPS-Zwang am produktiven Einstieg prüfen. Mögliche zusätzliche Proxy-Header sind unbekannt. | +| Cookies und Debug | Die lokale `.env` ist ausdrücklich `local` mit Debug; Secure-Cookie ist in `config/session.php` umgebungsabhängig. | Produktivkonfiguration separat prüfen: Debug aus, Secure/HttpOnly/SameSite passend, enge Cookie-Domain, TLS und sichere Session-Speicherung. Lokale Debugwerte sind kein Beleg für eine Produktionslücke. | +| Sicherheitsereignisse | Login-/Fehlversuchsprotokollierung ist vorhanden; ein vollständiger zentraler Widerrufsprozess wurde nicht gefunden. | Meldungen zu E-Mail-, Passwort- und 2FA-Änderungen, nachvollziehbare Rechteänderungen sowie eine Funktion zum Beenden fremder Sitzungen vorsehen. Tokens und Kennwörter niemals protokollieren. | + +## 5. Vorhandene Schutzmaßnahmen + +Folgende Maßnahmen sind im geprüften Code positiv erkennbar; Umfang und Grenzen der ausgeführten Tests stehen in Abschnitt 6: + +- Passwort-, Magic-Link- und Google-Login berücksichtigen bestätigte 2FA. Unbenutzte Fortify-2FA-Verwaltungsrouten werden gezielt gesperrt. +- Magic Links enthalten zufällige Tokens, speichern deren Hash und prüfen Ablauf sowie Verwendung. Beim Einlösen schützt ein bedingtes Update gegen parallele Wiederverwendung. +- Passwortreset-Anforderungen verwenden eine neutrale Rückmeldung und Limits pro E-Mail sowie IP. +- Die reguläre E-Mail-Änderung verwendet `pending_email` und einen signierten Bestätigungslink; Übernahme und Firmenabgleich erfolgen erst bei Bestätigung. S-06 betrifft den davor fehlenden erneuten Nachweis für bestimmte Konten. +- Admin- und Kunden-Gates berücksichtigen den Aktivstatus. Eigene Panel-Middleware wird für Livewire-Folgeanfragen erneut registriert. +- Die API verlangt Sanctum-Authentifizierung und aktive Konten; geprüfte Controller/Requests verwenden Token-Abilities und Eigentümerfilter. API-Schlüssel aus URL-/Body-Parametern werden nicht als Login akzeptiert. +- Die Token-Oberfläche beschränkt Abilities, bindet Widerruf an den angemeldeten Benutzer und blockiert Token-Verwaltung während Impersonation. +- Impersonation enthält einen Rangschutz für Super-Administratoren und blockiert den Admin-Bereich während der Übernahme. +- Private Pressemedien verlangen Berechtigung oder eine gültige signierte Vorschau-URL. HTML-Inhalte werden über einen Purifier bereinigt; geprüfte Bild-Uploads schließen SVG aus und begrenzen Dateitypen/Größe. +- CSRF ist regulär aktiv. Die ausdrücklich ausgenommenen Abmeldewege verwenden signierte Links. +- Logout invalidiert die Sitzung und erneuert das CSRF-Token. `.env` und `auth.json` sind nicht versioniert und werden durch `.gitignore` ausgeschlossen. Das ist keine vollständige Prüfung der Git-Historie auf Geheimnisse. + +## 6. Verifikation und Einschränkungen + +### Tatsächlich durchgeführt + +- Statische Prüfung der genannten Routen, Komponenten, Services, Policies, Middleware und relevanter installierter Framework-Bestandteile. +- Abgleich vorhandener Tests, insbesondere `tests/Feature/Auth/`, `tests/Feature/SecurityHardeningTest.php` sowie der Schutzlogik in `tests/TestCase.php` und `phpunit.xml`. +- Prüfung des vorgesehenen Testdatenbankschutzes: SQLite `:memory:` und zusätzlicher Guard vor `RefreshDatabase`; kein Testlauf wurde gestartet, der Bestandsdaten verändert hat. +- Laravel-Boost-Paketinventar und Dokumentationssuche; offizieller Google-Dokumentationsabgleich für S-05. +- Kontrolle des Repository-Status vor Erstellung des Berichts. + +### Korrektur zur Ausführungsumgebung + +Die erste Prüfung verwendete entsprechend der ursprünglichen Projektanweisung Sail. Die folgenden Aufrufe endeten mit `Docker or Podman is not running.`: + +```bash +vendor/bin/sail artisan route:list --path=login -vv --no-interaction +vendor/bin/sail artisan test --compact tests/Feature/Auth tests/Feature/SecurityHardeningTest.php tests/Feature/ApiAccessSecurityAndLoggingTest.php +vendor/bin/sail composer audit --locked --no-interaction +vendor/bin/sail npm audit --omit=dev +``` + +Diese Meldung belegt nicht, dass Docker auf dem Host gestoppt ist. Die Arbeitsumgebung befindet sich bereits im Dev-Container; Befehle werden dort direkt ausgeführt. Die Korrektur wurde auf Benutzerwunsch dauerhaft in `.ai/rules/general.md` festgehalten. Tests und Paketprüfungen wurden anschließend ohne Sail erneut gestartet. Die Tests wurden für diesen reinen Audit weder erweitert noch verändert. Die bei den Befunden beschriebenen Regressionstests bleiben Empfehlungen für eine spätere Behebung. + +### Erfolgreiche Testausführung – Nachprüfung vom 07.10.2026 + +**Insgesamt: 189 Tests bestanden, 920 Assertions, keine fehlgeschlagenen Tests in diesen beiden ausgewählten Läufen.** Die gesamte Anwendungstestsuite wurde nicht ausgeführt. + +| Prüfumfang | Ergebnis | Dauer | +| --- | --- | --- | +| Authentifizierung, SecurityHardening, API-Zugriff/-Logging | 118 bestanden, 578 Assertions | 14,45 s | +| Editor-Berechtigungsgrenzen, Impersonation, Kundenprofil/-Sicherheit, Settings, Firmenkontext und PM-Firmenscope | 71 bestanden, 342 Assertions | 28,95 s | + +Ausgeführte Befehle (jeweils Exit-Code 0): + +```bash +php artisan test --compact tests/Feature/Auth tests/Feature/SecurityHardeningTest.php tests/Feature/ApiAccessSecurityAndLoggingTest.php +php artisan test --compact tests/Feature/Admin/EditorPermissionBoundaryTest.php tests/Feature/Admin/UserImpersonationTest.php tests/Feature/CustomerProfileSecurityTest.php tests/Feature/Settings tests/Feature/PressReleaseCompanyScopeTest.php tests/Feature/CustomerCompanyContextTest.php +php artisan route:list --path=login -vv --no-interaction +``` + +Die Routenabfrage bestätigt drei Login-bezogene Routen einschließlich Fortify-POST-Login, Livewire-Loginseite und Magic-Link-Einlösung mit den registrierten Middleware-Ketten. + +**Einordnung:** Bestandene vorhandene Tests widerlegen die sechs Codebefunde nicht. Beispielsweise decken Tests für gesperrte Editor-Verwaltungsseiten nicht automatisch den fremden Legacy-PDF-Abruf über die Kundenroute oder das Umhängen eines Kontakts auf der Firmenanzeige ab. Die in Abschnitt 3 benannten spezifischen Angriffsszenarien wurden nicht als neue Tests implementiert. Die Codebefunde bleiben offen; der Nachtrag belegt die erfolgreiche Ausführung der vorhandenen Schutztests. + +### Paket-Sicherheitsaudits – Nachprüfung vom 07.10.2026 + +`composer audit --locked --no-interaction` wurde erfolgreich ausgeführt (Exit-Code 0): **keine bekannten Security-Advisories für die geprüften gesperrten PHP-Abhängigkeiten gemeldet**. Dies ist eine zeitpunktbezogene Advisory-Abfrage, keine Garantie für Fehlerfreiheit. + +`npm audit --omit=dev` wurde ausgeführt und meldet **3 betroffene Pakete: 2 kritisch, 1 hoch** (Exit-Code 1 wegen der Funde). Dahinter stehen zwei unterschiedliche Advisories; `concurrently` wird wegen seiner betroffenen Abhängigkeit zusätzlich gezählt: + +| Paket im geprüften Bestand | Einstufung laut Audit | Sicherheitsmeldung | Gepatchte Version laut Advisory | +| --- | --- | --- | --- | +| `shell-quote@1.9.0` | Kritisch | Kommandoinjektion in `quote()` bei bestimmten Kombinationen von Kommentar-Token und nicht vertrauenswürdigem String mit Zeilenumbruch; [GHSA-pqg4-j6r4-53mv](https://github.com/advisories/GHSA-pqg4-j6r4-53mv) | `shell-quote` 1.11.0 | +| `concurrently@9.2.4` | Kritisch, transitiv | Verwendet das betroffene `shell-quote`; dieselbe Meldung, keine dritte eigenständige Schwachstelle | Abhängigkeitskette auf eine Version mit korrigiertem `shell-quote` aktualisieren | +| `source-map-js@1.2.1` | Hoch | Blockieren der Event Loop durch präparierte Section-Offsets in indizierten Source Maps; [GHSA-68fv-2mgg-jv7q](https://github.com/advisories/GHSA-68fv-2mgg-jv7q) | `source-map-js` 1.2.2 | + +Die installierten Versionen und Abhängigkeitswege wurden mit `npm ls shell-quote concurrently source-map-js --all` sowie `package-lock.json` abgeglichen. `concurrently` wird laut `package.json` für `dev:all` verwendet; `source-map-js` hängt an der CSS-/Build-Werkzeugkette. Diese Werkzeuge stehen teilweise unter `dependencies` und werden deshalb trotz `--omit=dev` geprüft. **Eine Erreichbarkeit der gefährdeten Funktionen durch anonyme Web-Anfragen wurde nicht nachgewiesen.** Die Paket-Schweregrade dürfen nicht automatisch als bestätigte kritische Loginlücke interpretiert werden. + +Empfehlung: die betroffenen Abhängigkeitsketten gezielt aktualisieren, danach Build und Audit erneut prüfen. Entsprechend dem reinen Audit-Auftrag wurde weder `npm audit fix` noch eine andere Paketänderung ausgeführt. + +### Offen geblieben + +- Dynamische Bestätigung der sechs Befunde in einer isolierten Testumgebung. +- Produktionswerte, tatsächliche Rollen-/Permission-Zuordnung, Altbestand und Zahl betroffener Konten/Rechnungen. +- TLS, Reverse-Proxy-Header, Firewall, Datenbank-/Redis-Erreichbarkeit, Betriebssystem und Backups. +- Vollständige Prüfung der tatsächlichen produktiven Erreichbarkeit der npm-Funde; separat als `devDependencies` deklarierte npm-Pakete waren durch `--omit=dev` nicht Teil dieses Audits. +- Vollständiger Penetrationstest aller Endpunkte und aller möglichen Race Conditions. Die Stichproben zu Uploads, HTML und API begründen keine pauschale Fehlerfreiheit dieser Bereiche. + +## 7. Empfohlene Reihenfolge + +1. **S-01 und S-02 schließen:** konkrete Rollenüberschreitungen an Download und Schreibaktion. +2. **S-03 und S-04 schließen:** Rechteentzug und Kontowiederherstellung müssen auch bei bereits bestehenden Sitzungen greifen. +3. **S-05 schließen:** Google-Identität und Verknüpfung vorhandener Konten verbindlich prüfen. +4. **S-06 schließen:** frische Identitätsnachweise vor dauerhaften Sicherheitsänderungen. +5. Die gezielten Negativtests ergänzen, die gefundenen npm-Abhängigkeiten aktualisieren und die produktiven Proxy-/Cookie-/TLS-Einstellungen verifizieren. + +**Änderungsstatus:** Audit-Dokumentation und ausdrücklich angeforderte Dev-Container-Projektnotiz erstellt/aktualisiert; keine Sicherheitskorrekturen umgesetzt. + +## 8. Nachtrag – Umsetzung vom 07.10.2026 + +S-01 bis S-06 sind im Code behoben und durch Regressionstests abgesichert. Live seit **`v1.4.0`** (07.10.2026), dazu der Hotfix **`v1.4.1`** für den Abgleich der Firmenrechte zu S-03. Die Entscheidungen, Details, Testdateien, Deploy-Schritte und beide Vorfälle stehen in [ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md](ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md), Abschnitt 0; das Deploy-Protokoll steht in `dev/betrieb/git-deploy.md`. + +Ebenfalls in `v1.4.0` aus Abschnitt 4 umgesetzt: die Pflicht für einen zweiten Faktor bei Super-Admins und Admins (Passkey oder Authenticator-App). Offen sind npm-Updates, Proxy, HSTS, Passwortregeln, eine dauerhafte Widerrufsmarke, der Ablauf von API-Tokens, das Login-Limit pro IP und CSP. diff --git a/docker-compose.yml b/docker-compose.yml index 8f5641ca..054843aa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,14 +21,13 @@ services: IGNITION_LOCAL_SITES_PATH: '${PWD}' # --- Anbindung an das Mutterschiff --- - DB_CONNECTION: mysql - DB_HOST: global-mysql - DB_PORT: 3306 - # Hier definieren wir nur die Haupt-Datenbank für .env - # Die anderen beiden richtest du in Laravel ein - DB_DATABASE: pressekonto - DB_USERNAME: root - DB_PASSWORD: password + # Die Datenbank-Zugangsdaten (DB_*) stehen bewusst NUR in der .env, + # nicht hier: Container-Umgebungsvariablen haben in Laravel Vorrang + # vor jeder .env. Jedes andere Laravel-Projekt, das in diesem + # Container läuft (z. B. ein frisches Demo-Projekt), würde sonst + # automatisch auf `pressekonto` zeigen — am 07.10.2026 hat so das + # RefreshDatabase eines Demo-Projekts die lokale Datenbank geleert + # (dev/sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md). MAIL_HOST: global-mailpit MAIL_PORT: 1025 REDIS_HOST: global-redis diff --git a/lang/de/pricing.php b/lang/de/pricing.php index e91d459b..ca33b0e1 100644 --- a/lang/de/pricing.php +++ b/lang/de/pricing.php @@ -38,7 +38,7 @@ return [ 'quota' => ':count Pressemitteilungen / Monat', 'daily_limit' => 'max. :count Veröffentlichungen / Tag', 'no_daily_limit' => 'Ohne Tageslimit', - 'included' => 'Inhaltsprüfung & Veröffentlichung auf beiden Portalen inklusive', + 'included' => 'Automatisierte Prüfung jeder Mitteilung vor der Veröffentlichung & Veröffentlichung auf beiden Portalen inklusive', 'cta' => 'Tarif wählen', 'popular' => 'Beliebt', 'empty' => 'Tarife werden in Kürze veröffentlicht.', @@ -50,7 +50,7 @@ return [ 'single' => [ 'eyebrow' => 'Ohne Abo', 'title' => 'Einzel-Pressemitteilung', - 'description' => 'Genau eine Veröffentlichung inklusive Inhaltsprüfung. Bezahlt wird erst bei Veröffentlichung – abgelehnte Mitteilungen kosten nichts.', + 'description' => 'Genau eine Veröffentlichung inklusive automatisierter Prüfung. Bezahlt wird erst bei Veröffentlichung – abgelehnte Mitteilungen kosten nichts.', 'price_suffix' => 'pro Veröffentlichung', 'net' => 'netto zzgl. USt.', 'cta' => 'Einzeln veröffentlichen', @@ -126,7 +126,7 @@ return [ ], 'boost' => [ 'title' => 'Boost — was Sie bekommen und was nicht', - 'text' => 'Geschuldet ist die Platzierung während der gebuchten Laufzeit — beim Startseiten-Boost auf Startseite und Kategorieseite, beim Kategorie-Boost auf der Kategorieseite der jeweiligen Rubrik. Die Zahl gleichzeitiger Boosts je Seite ist begrenzt; sind alle Plätze belegt, ist eine neue Buchung erst möglich, sobald ein Platz frei wird — verkauft wird also nur, was auch sichtbar ist. Eine bestimmte Reichweite oder Zugriffszahl versprechen wir nicht — das wäre unseriös. Buchbar nur für Mitteilungen mit Prüfergebnis Grün. Ist das Portal während eines aktiven Boosts aus von uns zu vertretenden Gründen länger als 60 Minuten am Stück nicht erreichbar, verlängert sich die Boost-Laufzeit entsprechend.', + 'text' => 'Geschuldet ist die Platzierung während der gebuchten Laufzeit — beim Startseiten-Boost auf Startseite und Kategorieseite, beim Kategorie-Boost auf der Kategorieseite der jeweiligen Rubrik. Geboostete Meldungen sind als gebuchte Platzierung gekennzeichnet. Die Zahl gleichzeitiger Boosts je Seite ist begrenzt; sind alle Plätze belegt, ist eine neue Buchung erst möglich, sobald ein Platz frei wird — verkauft wird also nur, was auch sichtbar ist. Eine bestimmte Reichweite oder Zugriffszahl versprechen wir nicht — das wäre unseriös. Buchbar nur für Mitteilungen mit Prüfergebnis Grün. Ist das Portal während eines aktiven Boosts aus von uns zu vertretenden Gründen länger als 60 Minuten am Stück nicht erreichbar, verlängert sich die Boost-Laufzeit entsprechend.', ], 'partners' => [ 'title' => 'Partnerportale', diff --git a/lang/de/static.php b/lang/de/static.php index 6e78db42..4b9f9294 100644 --- a/lang/de/static.php +++ b/lang/de/static.php @@ -488,16 +488,16 @@ return [ 'publish' => [ 'meta_title' => 'Pressemitteilung veröffentlichen – :brand', - 'meta_description' => 'Pressemitteilungen geprüft veröffentlichen und dauerhaft auffindbar im Archiv. Faire Preise, keine Vertragsbindung – Einreichung über den zentralen Publisher-Bereich.', + 'meta_description' => 'Pressemitteilungen nach automatisierter Prüfung veröffentlichen und dauerhaft auffindbar im Archiv. Faire Preise, keine Vertragsbindung – Einreichung über den zentralen Publisher-Bereich.', 'breadcrumb' => 'Veröffentlichen', - 'quality_since' => 'Qualitätsgeprüft seit :year', + 'quality_since' => 'Im Archiv seit :year', 'help_support' => 'Hilfe & Support', 'pricing' => 'Preise', 'eyebrow' => 'Pressestelle · Veröffentlichen', 'h1_line1' => 'Pressemitteilung veröffentlichen.', - 'h1_line2' => 'Geprüft. Dauerhaft auffindbar.', - 'hero_text' => ':brand ist die Presseplattform für mittelständische Unternehmen, Selbstständige und PR-Agenturen aus Deutschland, Österreich und der Schweiz. Jede Mitteilung wird auf Qualität geprüft und bleibt dauerhaft im Archiv auffindbar.', + 'h1_line2' => 'Automatisiert geprüft. Dauerhaft auffindbar.', + 'hero_text' => ':brand ist die Presseplattform für mittelständische Unternehmen, Selbstständige und PR-Agenturen aus Deutschland, Österreich und der Schweiz. Jede Mitteilung durchläuft vor der Veröffentlichung eine automatisierte Prüfung und bleibt dauerhaft im Archiv auffindbar.', 'hub_eyebrow' => 'Einreichen im Publisher-Bereich', 'hub_heading' => 'Die Einreichung läuft über den zentralen Publisher-Bereich.', diff --git a/lang/de/web.php b/lang/de/web.php index bb8f591b..d8573a04 100644 --- a/lang/de/web.php +++ b/lang/de/web.php @@ -15,7 +15,7 @@ return [ 'meta' => [ 'home_title' => 'Aktuelle Pressemitteilungen aus Wirtschaft & Industrie – :brand', - 'home_description' => 'Pressemitteilungen aus Deutschland, Österreich und der Schweiz. Qualitätsgeprüft. Strukturiert distribuiert.', + 'home_description' => 'Pressemitteilungen aus Deutschland, Österreich und der Schweiz. Automatisiert geprüft. Strukturiert distribuiert.', ], 'shared' => [ @@ -23,7 +23,8 @@ return [ 'read_time' => ':minutes Min. Lesezeit', 'minutes_short' => ':minutes Min.', 'recommendation' => 'Empfehlung', - 'boosted_placement' => 'Top-Platzierung', + 'boosted_placement' => 'Gebuchte Platzierung', + 'boosted_placement_hint' => 'Das Unternehmen hat diesen Platz gebucht. Der Inhalt ist eine Pressemitteilung des Unternehmens.', ], 'countries' => [ @@ -76,7 +77,7 @@ return [ 'hero' => [ 'title' => 'Im Fokus', 'clock_format' => 'dddd, HH:mm [Uhr]', - 'editorial_pick' => 'Top-Auswahl', + 'latest' => 'Aktuell', 'top_story' => 'Top-Meldung', 'sidebar_title' => 'Was sonst zählt', ], @@ -224,6 +225,8 @@ return [ 'validation_message' => 'Bitte geben Sie eine Nachricht ein.', 'validation_message_min' => 'Ihre Nachricht sollte mindestens :min Zeichen lang sein.', 'validation_message_max' => 'Ihre Nachricht darf höchstens :max Zeichen lang sein.', + 'bot_check_failed' => 'Die Sicherheitsprüfung ist fehlgeschlagen. Bitte laden Sie die Seite neu und senden Sie Ihre Nachricht erneut.', + 'bot_check_waiting' => 'Sicherheitsprüfung läuft …', ], 'search' => [ @@ -285,12 +288,9 @@ return [ 'total_hits_sub' => 'über alle Meldungen', 'latest' => 'Aktuellste Meldung', 'empty' => 'Aktuell keine weiteren Meldungen in diesem Newsroom.', - 'manage_hint' => 'Sie vertreten :company? Profil, Logo und Pressekontakte lassen sich kostenlos pflegen.', - 'manage_link' => 'Diesen Newsroom verwalten', + 'manage_eyebrow' => 'Diesen Newsroom verwalten', + 'manage_question' => 'Sie vertreten :company? Beschreibung, Logo und Pressekontakte pflegen Sie kostenlos – und Sie sehen die Aufrufe Ihrer Meldungen.', 'feed_link' => 'RSS-Feed', - 'own_title' => 'Eigenen Newsroom starten', - 'own_text' => 'Bündeln Sie alle Ihre Pressemitteilungen unter einer eigenen Marken-URL – mit Logo, Branchen-Zuordnung und SEO-Vorteil.', - 'own_cta' => 'Newsroom anlegen', ], 'category' => [ @@ -318,7 +318,7 @@ return [ 'related' => 'Verwandte Branchen', 'cta_eyebrow' => 'Für Unternehmen aus :category', 'cta_title' => 'Veröffentlichen Sie Ihre Pressemitteilung gezielt in :category.', - 'cta_text' => 'Reichweite über aktive Newsrooms · Strukturierte Distribution im DACH-Raum · Qualitätsgeprüft.', + 'cta_text' => 'Reichweite über aktive Newsrooms · Strukturierte Distribution im DACH-Raum · Automatisiert geprüft.', 'cta_submit' => 'Pressemitteilung einreichen', 'cta_pricing' => 'Tarife & Branchen-Pakete ansehen', ], diff --git a/lang/en/pricing.php b/lang/en/pricing.php index 60da95ec..df338ad3 100644 --- a/lang/en/pricing.php +++ b/lang/en/pricing.php @@ -35,7 +35,7 @@ return [ 'quota' => ':count press releases / month', 'daily_limit' => 'max. :count publications / day', 'no_daily_limit' => 'No daily limit', - 'included' => 'Content review & publication on both portals included', + 'included' => 'Automated check of every release before publication & publication on both portals included', 'cta' => 'Choose plan', 'popular' => 'Popular', 'empty' => 'Plans will be published shortly.', @@ -46,7 +46,7 @@ return [ 'single' => [ 'eyebrow' => 'No subscription', 'title' => 'Single press release', - 'description' => 'Exactly one publication including content review. You only pay on publication – rejected releases are free.', + 'description' => 'Exactly one publication including an automated check. You only pay on publication – rejected releases are free.', 'price_suffix' => 'per publication', 'net' => 'net, plus VAT.', 'cta' => 'Publish a single release', @@ -119,7 +119,7 @@ return [ ], 'boost' => [ 'title' => 'Boost — what you get and what you do not', - 'text' => 'What is owed is the placement during the booked period — on the homepage and category page for a homepage boost, on the category page of the respective industry for a category boost. The number of simultaneous boosts per page is limited; once all slots are taken, a new booking is only possible when a slot becomes free — we only sell what is actually visible. We do not promise a specific reach or number of hits — that would be dishonest. Bookable only for releases with a green review result. If the portal is unavailable for more than 60 consecutive minutes during an active boost for reasons within our responsibility, the boost period is extended accordingly.', + 'text' => 'What is owed is the placement during the booked period — on the homepage and category page for a homepage boost, on the category page of the respective industry for a category boost. Boosted releases are labelled as a booked placement. The number of simultaneous boosts per page is limited; once all slots are taken, a new booking is only possible when a slot becomes free — we only sell what is actually visible. We do not promise a specific reach or number of hits — that would be dishonest. Bookable only for releases with a green review result. If the portal is unavailable for more than 60 consecutive minutes during an active boost for reasons within our responsibility, the boost period is extended accordingly.', ], 'partners' => [ 'title' => 'Partner portals', diff --git a/lang/en/static.php b/lang/en/static.php index bb0b3f6a..7421a850 100644 --- a/lang/en/static.php +++ b/lang/en/static.php @@ -486,16 +486,16 @@ return [ 'publish' => [ 'meta_title' => 'Publish a press release – :brand', - 'meta_description' => 'Publish quality-checked press releases, permanently discoverable in the archive. Fair prices, no lock-in – submission via the central publisher area.', + 'meta_description' => 'Publish press releases after an automated check, permanently discoverable in the archive. Fair prices, no lock-in – submission via the central publisher area.', 'breadcrumb' => 'Publish', - 'quality_since' => 'Quality-checked since :year', + 'quality_since' => 'In the archive since :year', 'help_support' => 'Help & support', 'pricing' => 'Pricing', 'eyebrow' => 'Press office · Publish', 'h1_line1' => 'Publish a press release.', - 'h1_line2' => 'Reviewed. Permanently discoverable.', - 'hero_text' => ':brand is the press platform for mid-sized companies, self-employed professionals and PR agencies from Germany, Austria and Switzerland. Every release is quality-checked and remains permanently discoverable in the archive.', + 'h1_line2' => 'Automatically checked. Permanently discoverable.', + 'hero_text' => ':brand is the press platform for mid-sized companies, self-employed professionals and PR agencies from Germany, Austria and Switzerland. Every release goes through an automated check before publication and remains permanently discoverable in the archive.', 'hub_eyebrow' => 'Submit via the publisher area', 'hub_heading' => 'Submissions run through the central publisher area.', diff --git a/lang/en/web.php b/lang/en/web.php index 86ea4812..ebf871a6 100644 --- a/lang/en/web.php +++ b/lang/en/web.php @@ -18,7 +18,8 @@ return [ 'read_time' => ':minutes min read', 'minutes_short' => ':minutes min', 'recommendation' => 'Recommended', - 'boosted_placement' => 'Featured', + 'boosted_placement' => 'Booked placement', + 'boosted_placement_hint' => 'The company booked this spot. The content is a press release issued by the company.', ], 'countries' => [ @@ -71,7 +72,7 @@ return [ 'hero' => [ 'title' => 'In Focus', 'clock_format' => 'dddd, HH:mm', - 'editorial_pick' => 'Top selection', + 'latest' => 'Latest', 'top_story' => 'Top story', 'sidebar_title' => 'Also worth noting', ], @@ -219,6 +220,8 @@ return [ 'validation_message' => 'Please enter a message.', 'validation_message_min' => 'Your message should be at least :min characters long.', 'validation_message_max' => 'Your message must not exceed :max characters.', + 'bot_check_failed' => 'The security check failed. Please reload the page and send your message again.', + 'bot_check_waiting' => 'Running security check …', ], 'search' => [ @@ -280,12 +283,9 @@ return [ 'total_hits_sub' => 'across all releases', 'latest' => 'Latest release', 'empty' => 'No further releases in this newsroom at the moment.', - 'manage_hint' => 'You represent :company? Profile, logo and press contacts can be maintained free of charge.', - 'manage_link' => 'Manage this newsroom', + 'manage_eyebrow' => 'Manage this newsroom', + 'manage_question' => 'You represent :company? Maintain the description, logo and press contacts free of charge – and see how often your releases are read.', 'feed_link' => 'RSS feed', - 'own_title' => 'Start your own newsroom', - 'own_text' => 'Bundle all your press releases under your own branded URL – with logo, industry mapping and SEO benefit.', - 'own_cta' => 'Create newsroom', ], 'category' => [ diff --git a/package-lock.json b/package-lock.json index 86906d3f..560288c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "@fontsource/instrument-sans": "^5.0.0", "@fontsource/inter": "^5.0.0", "@fontsource/poppins": "^5.0.0", + "@laravel/passkeys": "^0.4.0", "@sentry/browser": "^11.3.0", "@tailwindcss/vite": "^4.0.7", "alpinejs": "^3.14.9", @@ -522,6 +523,34 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@laravel/passkeys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@laravel/passkeys/-/passkeys-0.4.0.tgz", + "integrity": "sha512-59UHJHZPrIT8f5hFQJUR1EXhazWZTg3DcJefxSfA3aRj6xu40I/lYDveUY4oL2/h/crq9jjptSKykZDDold7aA==", + "license": "MIT", + "dependencies": { + "@simplewebauthn/browser": "^13.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "svelte": "^5.0.0", + "vue": "^3.3.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", @@ -995,6 +1024,12 @@ "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" } }, + "node_modules/@simplewebauthn/browser": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.3.0.tgz", + "integrity": "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==", + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", @@ -2548,9 +2583,9 @@ } }, "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", + "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2560,9 +2595,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" diff --git a/package.json b/package.json index 9bb47cf8..83c0edfa 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@fontsource/instrument-sans": "^5.0.0", "@fontsource/inter": "^5.0.0", "@fontsource/poppins": "^5.0.0", + "@laravel/passkeys": "^0.4.0", "@sentry/browser": "^11.3.0", "@tailwindcss/vite": "^4.0.7", "alpinejs": "^3.14.9", @@ -31,5 +32,8 @@ }, "devDependencies": { "cross-env": "^10.1.0" + }, + "overrides": { + "shell-quote": "^1.11.0" } } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 05d84c67..6c81c810 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -456,6 +456,12 @@ parameters: count: 1 path: app/Listeners/RecordMailActivity.php + - + message: '#^Trait App\\Livewire\\Concerns\\ConfirmsIdentity is used zero times and is not analysed\.$#' + identifier: trait.unused + count: 1 + path: app/Livewire/Concerns/ConfirmsIdentity.php + - message: '#^Trait App\\Livewire\\Concerns\\HandlesAdminPressReleaseActions is used zero times and is not analysed\.$#' identifier: trait.unused diff --git a/phpunit.xml b/phpunit.xml index 21cdf420..bd29d74c 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -27,6 +27,8 @@ + + @@ -41,12 +43,26 @@ + + + + + + + + + + + + + + diff --git a/public/api/v1.yml b/public/api/v1.yml index 195e6c42..f9249130 100644 --- a/public/api/v1.yml +++ b/public/api/v1.yml @@ -13,6 +13,11 @@ info: Token trägt Berechtigungen (Abilities), die den Zugriff auf die Endpunkte steuern. Tokens werden im Publisher-Konto unter „API-Tokens" selbst erstellt und widerrufen (Voraussetzung: aktive Buchung). + Die Buchung wird bei jeder Anfrage geprüft: Endet sie, antwortet die + API mit 403 („API access requires an active subscription or booking."), + bis wieder gebucht ist — die Tokens selbst bleiben erhalten. Optional + lässt sich beim Erstellen ein Ablaufdatum setzen; danach antwortet die + API für diesen Token mit 401. Rate-Limit: 60 Anfragen pro Minute je Token (Header X-RateLimit-Limit / X-RateLimit-Remaining, bei 429 zusätzlich Retry-After). @@ -35,7 +40,7 @@ tags: - name: categories description: "Aktive Rubriken (Ability: press-releases:read)" - name: newsletter - description: "Newsletter-Anmeldungen (Ability: newsletter:subscribe)" + description: "Newsletter-Anmeldung über die API — eingestellt am 09.10.2026" paths: /press-releases: get: @@ -252,24 +257,13 @@ paths: /newsletter/subscribe: post: tags: [newsletter] - summary: Newsletter-Anmeldung anlegen (Double-Opt-in folgt per Mail) - requestBody: - required: true - content: - application/json: - schema: - type: object - required: [portal, email] - properties: - portal: - type: string - enum: [presseecho, businessportal24] - email: { type: string, format: email, maxLength: 190 } - salutation_key: { type: string, maxLength: 20 } - first_name: { type: string, maxLength: 80 } - last_name: { type: string, maxLength: 80 } + deprecated: true + summary: Eingestellt — Newsletter-Anmeldung über die API + description: > + Seit 09.10.2026 abgeschaltet. Die Route antwortet mit 410 und legt + keine Anmeldung an. responses: - "201": { description: "Anmeldung angelegt (unbestätigt)" } + "410": { description: "Endpunkt eingestellt" } components: securitySchemes: bearerToken: diff --git a/public/build/portal/error-reporting-NIyJC3t-.js b/public/build/portal/error-reporting-CmT4J-eI.js similarity index 86% rename from public/build/portal/error-reporting-NIyJC3t-.js rename to public/build/portal/error-reporting-CmT4J-eI.js index 26e988ad..37bd166a 100644 --- a/public/build/portal/error-reporting-NIyJC3t-.js +++ b/public/build/portal/error-reporting-CmT4J-eI.js @@ -1 +1 @@ -const y="modulepreload",A=function(e){return"https://pressekonto.test/build/"+e},h={},_=function(r,t,a){let u=Promise.resolve();if(t&&t.length>0){let o=function(s){return Promise.all(s.map(c=>Promise.resolve(c).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),m=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));u=o(t.map(s=>{if(s=A(s),s in h)return;h[s]=!0;const c=s.endsWith(".css"),f=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${f}`))return;const l=document.createElement("link");if(l.rel=c?"stylesheet":y,c||(l.as="script"),l.crossOrigin="",l.href=s,m&&l.setAttribute("nonce",m),document.head.appendChild(l),c)return new Promise((b,S)=>{l.addEventListener("load",b),l.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${s}`)))})}))}function d(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return u.then(o=>{for(const n of o||[])n.status==="rejected"&&d(n.reason);return r().catch(d)})},i=(()=>{const e=document.querySelector('meta[name="pk-error-reporting"]');try{return e?JSON.parse(e.content):null}catch{return null}})(),k=["src","pr","ref","page","q","tab","edition"],v=new RegExp("(?<=\\/)[A-Za-z0-9_-]{32,}(?=\\/|$)","g"),w=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function p(e){try{const r=new URL(e,window.location.origin);r.pathname=r.pathname.replace(v,"[Filtered]");for(const t of[...r.searchParams.keys()])!k.includes(t)&&!t.startsWith("utm_")&&r.searchParams.set(t,"[Filtered]");return r.hash="",r.toString().replace(w,"[email]")}catch{return"[Filtered]"}}let E=null;function P(){return E??(E=_(()=>import("./error-reporting-sdk-Ca8cRdCE.js"),[]).then(e=>(e.init({dsn:i.dsn,release:i.release||void 0,environment:i.environment,sampleRate:i.sampleRate??1,sendDefaultPii:!1,integrations:r=>r.filter(t=>!["GlobalHandlers","Breadcrumbs","BrowserSession","BrowserApiErrors"].includes(t.name)),ignoreErrors:["ResizeObserver loop","Script error.","AbortError"],denyUrls:[/^chrome-extension:\/\//,/^moz-extension:\/\//,/^safari-(web-)?extension:\/\//],beforeSend(r){var t,a,u,d;(t=r.request)!=null&&t.url&&(r.request.url=p(r.request.url)),(u=(a=r.request)==null?void 0:a.headers)!=null&&u.Referer&&(r.request.headers.Referer=p(r.request.headers.Referer));for(const o of((d=r.exception)==null?void 0:d.values)??[])o.value&&(o.value=o.value.replace(w,"[email]"));return r}}),i.userId&&e.setUser({id:String(i.userId)}),e.setTag("area",i.area),e))),E}function R(e){var a;if(e instanceof Error)return e;const r=((a=e==null?void 0:e.constructor)==null?void 0:a.name)??typeof e;let t;try{t=typeof e=="string"?e:JSON.stringify(e)}catch{t=String(e)}return new Error(`Unbehandelte Ablehnung (${r}): ${String(t??"").slice(0,300)}`)}function g(e){P().then(r=>r.captureException(e)).catch(()=>{})}i!=null&&i.dsn&&(window.addEventListener("error",e=>{e.error&&g(e.error)}),window.addEventListener("unhandledrejection",e=>{g(R(e.reason))})); +const y="modulepreload",A=function(e){return"https://pressekonto.test/build/"+e},h={},_=function(r,t,a){let u=Promise.resolve();if(t&&t.length>0){let o=function(s){return Promise.all(s.map(c=>Promise.resolve(c).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),m=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));u=o(t.map(s=>{if(s=A(s),s in h)return;h[s]=!0;const c=s.endsWith(".css"),f=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${f}`))return;const l=document.createElement("link");if(l.rel=c?"stylesheet":y,c||(l.as="script"),l.crossOrigin="",l.href=s,m&&l.setAttribute("nonce",m),document.head.appendChild(l),c)return new Promise((b,S)=>{l.addEventListener("load",b),l.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${s}`)))})}))}function d(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return u.then(o=>{for(const n of o||[])n.status==="rejected"&&d(n.reason);return r().catch(d)})},i=(()=>{const e=document.querySelector('meta[name="pk-error-reporting"]');try{return e?JSON.parse(e.content):null}catch{return null}})(),k=["src","pr","ref","page","q","tab","edition"],P=new RegExp("(?<=\\/)[A-Za-z0-9_-]{32,}(?=\\/|$)","g"),w=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function p(e){try{const r=new URL(e,window.location.origin);r.pathname=r.pathname.replace(P,"[Filtered]");for(const t of[...r.searchParams.keys()])!k.includes(t)&&!t.startsWith("utm_")&&r.searchParams.set(t,"[Filtered]");return r.hash="",r.toString().replace(w,"[email]")}catch{return"[Filtered]"}}let E=null;function R(){return E??(E=_(()=>import("./error-reporting-sdk-Ca8cRdCE.js"),[]).then(e=>(e.init({dsn:i.dsn,release:i.release||void 0,environment:i.environment,sampleRate:i.sampleRate??1,sendDefaultPii:!1,integrations:r=>r.filter(t=>!["GlobalHandlers","Breadcrumbs","BrowserSession","BrowserApiErrors"].includes(t.name)),ignoreErrors:["ResizeObserver loop","Script error.","AbortError"],denyUrls:[/^chrome-extension:\/\//,/^moz-extension:\/\//,/^safari-(web-)?extension:\/\//],beforeSend(r){var t,a,u,d;(t=r.request)!=null&&t.url&&(r.request.url=p(r.request.url)),(u=(a=r.request)==null?void 0:a.headers)!=null&&u.Referer&&(r.request.headers.Referer=p(r.request.headers.Referer));for(const o of((d=r.exception)==null?void 0:d.values)??[])o.value&&(o.value=o.value.replace(w,"[email]"));return r}}),i.userId&&e.setUser({id:String(i.userId)}),e.setTag("area",i.area),e))),E}function q(e){var a;if(e instanceof Error)return e;const r=((a=e==null?void 0:e.constructor)==null?void 0:a.name)??typeof e;let t;try{t=typeof e=="string"?e:JSON.stringify(e)}catch{t=String(e)}return new Error(`Unbehandelte Ablehnung (${r}): ${String(t??"").slice(0,300)}`)}function g(e){R().then(r=>r.captureException(e)).catch(()=>{})}i!=null&&i.dsn&&(window.addEventListener("error",e=>{e.error&&g(e.error)}),window.addEventListener("unhandledrejection",e=>{var r;((r=e.reason)==null?void 0:r.isFromCancelledTransition)!==!0&&g(q(e.reason))})); diff --git a/public/build/portal/manifest.json b/public/build/portal/manifest.json index b6ceef19..831fea31 100644 --- a/public/build/portal/manifest.json +++ b/public/build/portal/manifest.json @@ -1,6 +1,6 @@ { "resources/css/portal.css": { - "file": "portal-x09-Mi7V.css", + "file": "portal-DRIYW1LW.css", "src": "resources/css/portal.css", "isEntry": true }, @@ -17,7 +17,7 @@ "isDynamicEntry": true }, "resources/js/error-reporting.js": { - "file": "error-reporting-NIyJC3t-.js", + "file": "error-reporting-CmT4J-eI.js", "name": "error-reporting", "src": "resources/js/error-reporting.js", "isEntry": true, @@ -25,6 +25,12 @@ "resources/js/error-reporting-sdk.js" ] }, + "resources/js/passkeys.js": { + "file": "passkeys-DaAq6jVJ.js", + "name": "passkeys", + "src": "resources/js/passkeys.js", + "isEntry": true + }, "resources/js/portal-form-hooks.js": { "file": "portal-form-hooks-DryiGN-B.js", "name": "portal-form-hooks", diff --git a/public/build/portal/passkeys-DaAq6jVJ.js b/public/build/portal/passkeys-DaAq6jVJ.js new file mode 100644 index 00000000..22f117b9 --- /dev/null +++ b/public/build/portal/passkeys-DaAq6jVJ.js @@ -0,0 +1,2 @@ +function d(e){const t=new Uint8Array(e);let n="";for(const o of t)n+=String.fromCharCode(o);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function E(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=(4-t.length%4)%4,r=t.padEnd(t.length+n,"="),o=atob(r),s=new ArrayBuffer(o.length),a=new Uint8Array(s);for(let c=0;ce};function U(e){const{id:t}=e;return{...e,id:E(t),transports:e.transports}}function x(e){return e==="localhost"||/^((xn--[a-z0-9-]+|[a-z0-9]+(-[a-z0-9]+)*)\.)+([a-z]{2,}|xn--[a-z0-9-]+)$/i.test(e)}class i extends Error{constructor({message:t,code:n,cause:r,name:o}){super(t,{cause:r}),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.name=o??r.name,this.code=n}}function j({error:e,options:t}){var r,o,s;const{publicKey:n}=t;if(!n)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new i({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else if(e.name==="ConstraintError"){if(((r=n.authenticatorSelection)==null?void 0:r.requireResidentKey)===!0)return new i({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:e});if(t.mediation==="conditional"&&((o=n.authenticatorSelection)==null?void 0:o.userVerification)==="required")return new i({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:e});if(((s=n.authenticatorSelection)==null?void 0:s.userVerification)==="required")return new i({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:e})}else{if(e.name==="InvalidStateError")return new i({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:e});if(e.name==="NotAllowedError")return new i({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="NotSupportedError")return n.pubKeyCredParams.filter(c=>c.type==="public-key").length===0?new i({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:e}):new i({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:e});if(e.name==="SecurityError"){const a=globalThis.location.hostname;if(x(a)){if(n.rp.id!==a)return new i({message:`The RP ID "${n.rp.id}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new i({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="TypeError"){if(n.user.id.byteLength<1||n.user.id.byteLength>64)return new i({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:e})}else if(e.name==="UnknownError")return new i({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}class G{constructor(){Object.defineProperty(this,"controller",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}createNewAbortSignal(){if(this.controller){const n=new Error("Cancelling existing WebAuthn API call for new one");n.name="AbortError",this.controller.abort(n)}const t=new AbortController;return this.controller=t,t.signal}cancelCeremony(){if(this.controller){const t=new Error("Manually cancelling existing WebAuthn API call");t.name="AbortError",this.controller.abort(t),this.controller=void 0}}}const D=new G,q=["cross-platform","platform"];function L(e){if(e&&!(q.indexOf(e)<0))return e}async function F(e){var g;!e.optionsJSON&&e.challenge&&(console.warn("startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useAutoRegister:n=!1}=e;if(!S())throw new Error("WebAuthn is not supported in this browser");const r={...t,challenge:E(t.challenge),user:{...t.user,id:E(t.user.id)},excludeCredentials:(g=t.excludeCredentials)==null?void 0:g.map(U)},o={};n&&(o.mediation="conditional"),o.publicKey=r,o.signal=D.createNewAbortSignal();let s;try{s=await navigator.credentials.create(o)}catch(l){throw j({error:l,options:o})}if(!s)throw new Error("Registration was not completed");const{id:a,rawId:c,response:u,type:O}=s;let h;typeof u.getTransports=="function"&&(h=u.getTransports());let y;if(typeof u.getPublicKeyAlgorithm=="function")try{y=u.getPublicKeyAlgorithm()}catch(l){T("getPublicKeyAlgorithm()",l)}let m;if(typeof u.getPublicKey=="function")try{const l=u.getPublicKey();l!==null&&(m=d(l))}catch(l){T("getPublicKey()",l)}let w;if(typeof u.getAuthenticatorData=="function")try{w=d(u.getAuthenticatorData())}catch(l){T("getAuthenticatorData()",l)}return{id:a,rawId:d(c),response:{attestationObject:d(u.attestationObject),clientDataJSON:d(u.clientDataJSON),transports:h,publicKeyAlgorithm:y,publicKey:m,authenticatorData:w},type:O,clientExtensionResults:s.getClientExtensionResults(),authenticatorAttachment:L(s.authenticatorAttachment)}}function T(e,t){console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${e}. You should report this error to them. +`,t)}function B(){if(!S())return I.stubThis(new Promise(t=>t(!1)));const e=globalThis.PublicKeyCredential;return(e==null?void 0:e.isConditionalMediationAvailable)===void 0?I.stubThis(new Promise(t=>t(!1))):I.stubThis(e.isConditionalMediationAvailable())}const I={stubThis:e=>e};function $({error:e,options:t}){const{publicKey:n}=t;if(!n)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new i({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else{if(e.name==="NotAllowedError")return new i({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="SecurityError"){const r=globalThis.location.hostname;if(x(r)){if(n.rpId!==r)return new i({message:`The RP ID "${n.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new i({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="UnknownError")return new i({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}async function k(e){var w,g;!e.optionsJSON&&e.challenge&&(console.warn("startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useBrowserAutofill:n=!1,verifyBrowserAutofillInput:r=!0}=e;if(!S())throw new Error("WebAuthn is not supported in this browser");let o;((w=t.allowCredentials)==null?void 0:w.length)!==0&&(o=(g=t.allowCredentials)==null?void 0:g.map(U));const s={...t,challenge:E(t.challenge),allowCredentials:o},a={};if(n){if(!await B())throw Error("Browser does not support WebAuthn autofill");if(document.querySelectorAll("input[autocomplete$='webauthn']").length<1&&r)throw Error('No with "webauthn" as the only or last value in its `autocomplete` attribute was detected');a.mediation="conditional",s.allowCredentials=[]}a.publicKey=s,a.signal=D.createNewAbortSignal();let c;try{c=await navigator.credentials.get(a)}catch(l){throw $({error:l,options:a})}if(!c)throw new Error("Authentication was not completed");const{id:u,rawId:O,response:h,type:y}=c;let m;return h.userHandle&&(m=d(h.userHandle)),{id:u,rawId:d(O),response:{authenticatorData:d(h.authenticatorData),clientDataJSON:d(h.clientDataJSON),signature:d(h.signature),userHandle:m},type:y,clientExtensionResults:c.getClientExtensionResults(),authenticatorAttachment:L(c.authenticatorAttachment)}}class p extends Error{constructor(t){super(t),this.name="PasskeyError"}}class A extends p{constructor(){super("Passkeys are not supported in this browser."),this.name="NotSupportedError"}}class M extends p{constructor(){super("The passkey operation was cancelled."),this.name="UserCancelledError"}}class H extends p{constructor(){super("This device is already registered as a passkey."),this.name="PasskeyExistsError"}}class J extends p{constructor(t){const n=t??"this domain";super(`Passkeys can't be used on ${n}. For local development, use localhost.`),this.name="InvalidDomainError"}}const _=e=>{if(e instanceof p)return e;if(!(e instanceof Error))return new p("An unknown error occurred.");if(Y(e))return new J(X());switch(e.name){case"NotAllowedError":return new M;case"InvalidStateError":return new H;case"NotSupportedError":return new A;default:return new p(e.message)}},Y=e=>z(e)==="ERROR_INVALID_DOMAIN",z=e=>"code"in e&&typeof e.code=="string"?e.code:void 0,X=()=>{var e;return typeof((e=globalThis.location)==null?void 0:e.hostname)=="string"&&globalThis.location.hostname.length>0?globalThis.location.hostname:void 0};let f={};const Q=e=>{var t,n;f={...f,...e,fetch:{...f.fetch,...e.fetch,headers:{...(t=f.fetch)==null?void 0:t.headers,...(n=e.fetch)==null?void 0:n.headers}}}},Z=()=>typeof document>"u"?null:ee()||te(),ee=()=>{const e=document.querySelector('meta[name="csrf-token"]');if(!e)return null;const t=e.getAttribute("content");return t?{header:"X-CSRF-TOKEN",value:t}:null},te=()=>{const e="XSRF-TOKEN=",t=document.cookie.split("; ").find(r=>r.startsWith(e));if(!t)return null;const n=t.slice(e.length);return n?{header:"X-XSRF-TOKEN",value:decodeURIComponent(n)}:null},N=async e=>{var n,r;const t=await fetch(e,{method:"GET",headers:{Accept:"application/json",...(n=f.fetch)==null?void 0:n.headers},credentials:((r=f.fetch)==null?void 0:r.credentials)??"same-origin"});return t.ok||await V(t),t.json()},P=async(e,t)=>{var s,a;const n=Z(),r={"Content-Type":"application/json",Accept:"application/json",...(s=f.fetch)==null?void 0:s.headers};n&&(r[n.header]=n.value);const o=await fetch(e,{method:"POST",headers:r,credentials:((a=f.fetch)==null?void 0:a.credentials)??"same-origin",body:JSON.stringify(t)});return o.ok||await V(o),o.json()},V=async e=>{let t=`Request failed with status ${e.status}`;try{const n=await e.json();n&&typeof n=="object"&&"message"in n&&typeof n.message=="string"&&(t=n.message)}catch{}throw new Error(t)},K=e=>(typeof e=="function"?e():e)??!1,b={registerOptions:"/user/passkeys/options",registerStore:"/user/passkeys",verifyOptions:"/passkeys/login/options",verifySubmit:"/passkeys/login"},R={configure(e){Q(e)},isSupported(){return S()},async isAutofillSupported(){return B()},async register(e){if(!this.isSupported())throw new A;this.cancel();try{const t=v(e,{options:b.registerOptions,submit:b.registerStore}),{options:n}=await N(t.optionsRoute),r=await F({optionsJSON:n}),o={name:e.name,credential:r};return await P(t.submitRoute,o)}catch(t){throw _(t)}},async verify(e={}){if(!this.isSupported())throw new A;this.cancel();try{const t=v(e,{options:b.verifyOptions,submit:b.verifySubmit}),{options:n}=await N(t.optionsRoute),r={credential:await k({optionsJSON:n}),remember:K(e.remember)};return await P(t.submitRoute,r)}catch(t){throw _(t)}},async autofill(e={}){if(!(!this.isSupported()||!await this.isAutofillSupported()))try{const t=v(e,{options:b.verifyOptions,submit:b.verifySubmit}),{options:n}=await N(t.optionsRoute),r={credential:await k({optionsJSON:n,useBrowserAutofill:!0}),remember:K(e.remember)};return await P(t.submitRoute,r)}catch(t){if(t instanceof Error&&["AbortError","NotAllowedError"].includes(t.name))return;throw _(t)}},cancel(){D.cancelCeremony()}},v=(e,t)=>{var n,r;return{optionsRoute:((n=e.routes)==null?void 0:n.options)??t.options,submitRoute:((r=e.routes)==null?void 0:r.submit)??t.submit}},ne={options:"/passkeys/confirm/options",submit:"/passkeys/confirm"};function re(e){return e instanceof M?"Der Vorgang wurde abgebrochen.":e instanceof A?"Dieser Browser unterstützt keine Passkeys.":e instanceof H?"Für dieses Gerät ist bereits ein Passkey hinterlegt.":e instanceof J?"Passkeys funktionieren nur auf der Anmeldeseite von pressekonto.":"Der Passkey konnte nicht geprüft werden. Bitte versuchen Sie es erneut."}async function C(e){try{return{ok:!0,error:null,result:await e()}}catch(t){return{ok:!1,error:re(t),result:null}}}window.PkPasskeys={isSupported:()=>R.isSupported(),login:(e=!1)=>C(()=>R.verify({remember:e})),confirm:()=>C(()=>R.verify({routes:ne})),register:e=>C(()=>R.register({name:e}))}; diff --git a/public/build/portal/portal-DRIYW1LW.css b/public/build/portal/portal-DRIYW1LW.css new file mode 100644 index 00000000..80d5cbb6 --- /dev/null +++ b/public/build/portal/portal-DRIYW1LW.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | 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-border-spacing-x:0;--tw-border-spacing-y:0;--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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-mask-linear:linear-gradient(#fff, #fff);--tw-mask-radial:linear-gradient(#fff, #fff);--tw-mask-conic:linear-gradient(#fff, #fff);--tw-mask-left:linear-gradient(#fff, #fff);--tw-mask-right:linear-gradient(#fff, #fff);--tw-mask-bottom:linear-gradient(#fff, #fff);--tw-mask-top:linear-gradient(#fff, #fff);--tw-mask-right-from-position:0%;--tw-mask-right-to-position:100%;--tw-mask-right-from-color:black;--tw-mask-right-to-color:transparent;--tw-mask-left-from-position:0%;--tw-mask-left-to-position:100%;--tw-mask-left-from-color:black;--tw-mask-left-to-color:transparent;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", Inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:#fbfaf6;--color-zinc-100:#f6f4ef;--color-zinc-200:#e2ddd0;--color-zinc-300:#cfc8b5;--color-zinc-400:#8a918d;--color-zinc-500:#5a6360;--color-zinc-600:#3a413d;--color-zinc-700:#1a1f1c;--color-zinc-800:#243152;--color-zinc-900:#1a2540;--color-zinc-950:#0f1729;--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-accent:var(--color-hub);--color-accent-content:var(--color-hub);--color-accent-foreground:#fff;--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e2ddd0;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1a1f1c;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#efeadc;--color-bg-card-warm-border:#d6cfbb;--color-bg-card-warm-hover:#e6deca;--color-bg-card-warm-rule:#c8bda3;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a2540;--color-topbar2:#243152;--color-topbar-deep:#0f1729;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#b07a3a;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1a1f1c;--color-ink-2:#3a413d;--color-ink-3:#5a6360;--color-ink-4:#8a918d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b2b9c7;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#7b8fbf;--color-ink-on-dark-rule:#2a3550;--color-brand:#1a2540;--color-brand-deep:#0f1729;--color-brand-soft:#e5e9f1;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#c84a1e;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5a6360;--color-card-warm-title:#2a302d;--color-feature-line:#c0c8db;--color-feature-dot:#d8dde9;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047}.dark{--color-accent:var(--color-white);--color-accent-content:var(--color-white);--color-accent-foreground:var(--color-zinc-800)}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}ui-button{display:block}ui-dropdown{display:inline-flex}ui-label{cursor:default;display:inline-block}ui-description,ui-legend,ui-select{display:block}ui-selected-option{display:contents}ui-options:not([popover]),ui-option,ui-option-create,ui-option-empty,ui-empty{cursor:default;display:block}ui-pillbox,ui-file-upload,ui-checkbox-group{display:block}ui-checkbox,ui-switch{-webkit-user-select:none;user-select:none;display:inline-block}ui-radio-group{display:block}ui-radio{-webkit-user-select:none;user-select:none;display:inline-block}ui-date-picker,ui-time-picker,ui-calendar{display:block}ui-calendar-preset,ui-calendar-previous,ui-calendar-next,ui-calender-next{-webkit-user-select:none;user-select:none;display:block}ui-menu[popover]:popover-open{display:block}ui-menu[popover].\:popover-open{display:block}ui-menu-checkbox,ui-menu-radio{cursor:default;display:contents}ui-disclosure{display:block}ui-tab-group,ui-tabs{cursor:default;display:block}ui-resizable,ui-composer,ui-editor,ui-editor-content,ui-progress,ui-carousel,ui-carousel-track,ui-carousel-slide{display:block}ui-tooltip{display:inline-flex}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components{:where([data-flux-timeline]){--flux-timeline-item-gap:calc(var(--spacing) * 4);--flux-timeline-item-offset:0px;--flux-timeline-content-gap:calc(var(--spacing) * 3);--flux-timeline-line-gap:var(--spacing);--flux-timeline-line-width:1px;--flux-timeline-indicator-size:calc(var(--spacing) * 8)}:where([data-flux-timeline-horizontal]){--flux-timeline-content-gap:calc(var(--spacing) * 2)}:where([data-flux-timeline][data-flux-timeline-size=lg]){--flux-timeline-item-gap:calc(var(--spacing) * 8);--flux-timeline-content-gap:calc(var(--spacing) * 4);--flux-timeline-line-gap:0px;--flux-timeline-line-width:2px}:where([data-flux-timeline-size=lg]){--flux-timeline-indicator-size:calc(var(--spacing) * 12)}:where([data-flux-timeline-horizontal][data-flux-timeline-size=lg]),:where([data-flux-timeline-horizontal] [data-flux-timeline-size=lg]){--flux-timeline-item-gap:calc(var(--spacing) * 4);--flux-timeline-content-gap:calc(var(--spacing) * 3)}:where([data-flux-card],[data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-radius:var(--radius-xl);--flux-card-inset-radius:var(--radius-lg);--flux-card-action-height:calc(var(--spacing) * 8);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=xs]){--flux-card-px:calc(var(--spacing) * 4);--flux-card-py:calc(var(--spacing) * 3);--flux-card-inset-radius:var(--radius-md);--flux-card-radius:var(--radius-lg);--flux-card-leading:calc(var(--spacing) * 5);--flux-card-gap:calc(var(--spacing) * 5)}:where([data-flux-card-size=sm]){--flux-card-px:calc(var(--spacing) * 4);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-md);--flux-card-radius:var(--radius-lg);--flux-card-leading:calc(var(--spacing) * 5);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=md]){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-lg);--flux-card-radius:var(--radius-xl);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=lg]){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-xl);--flux-card-radius:var(--radius-2xl);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card],[data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-gutter:0px;--flux-card-hang-y:calc((var(--flux-card-action-height) - var(--flux-card-leading)) / 2);--flux-card-padding:var(--flux-card-px);--flux-card-part-px:0px;--flux-card-part-py:0px;--flux-card-body-padding:0px;--flux-card-body-px:var(--flux-card-body-padding);--flux-card-hang-x:var(--flux-card-hang-y);--flux-card-part-gap:var(--flux-card-gap);--flux-bleed-x:var(--flux-card-padding);--flux-bleed-top:var(--flux-card-padding);--flux-bleed-bottom:var(--flux-card-padding);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-edge:0px;--flux-bleed:var(--flux-bleed-x);--flux-card-body-bleed:var(--flux-card-padding);--flux-card-band-radius:max(0px, calc(var(--flux-card-radius) - var(--flux-card-padding) - 1px))}:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])){--flux-card-padding:var(--flux-card-gutter);--flux-card-part-px:calc(var(--flux-card-px) - var(--flux-card-gutter));--flux-card-part-py:calc(var(--flux-card-py) - var(--flux-card-gutter));--flux-card-part-gap:var(--flux-card-py);--flux-card-body-padding:var(--flux-card-px);--flux-card-hang-x:calc(var(--flux-card-px) - var(--flux-card-py) + var(--flux-card-hang-y));--flux-card-body-bleed:var(--flux-card-body-padding)}:where([data-flux-card][data-flux-card-body-variant=inset]){--flux-card-gutter:var(--spacing);--flux-card-body-px:calc(var(--flux-card-px) - var(--flux-card-gutter) - 1px);--flux-card-body-bleed:var(--flux-card-body-px)}:where([data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-hang-x:0px;--flux-card-part-gap:calc(var(--flux-card-gap) - var(--spacing))}:where([data-flux-card-standalone]:not(:where([data-flux-card] *))[data-flux-card-footer]),:where([data-flux-card-standalone]:not(:where([data-flux-card] *))[data-flux-card-header]:has(>[data-flux-text])){--flux-card-hang-y:0px}:where([data-flux-card]){padding:var(--flux-card-padding);border-radius:var(--flux-card-radius)}:where([data-flux-card-body]){padding:var(--flux-card-body-padding) var(--flux-card-body-px);--flux-bleed-x:var(--flux-card-body-bleed);--flux-bleed-top:var(--flux-card-body-padding);--flux-bleed-bottom:var(--flux-card-body-padding);--flux-bleed-top-radius:0px;--flux-bleed-bottom-radius:0px;--flux-bleed-edge:0px;--flux-bleed:var(--flux-bleed-x);--flux-card-part-px:0px;--flux-card-part-py:0px;--flux-card-part-gap:var(--flux-card-gap);--flux-card-hang-x:var(--flux-card-hang-y);--flux-card-band-radius:0px}:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){border-radius:var(--flux-card-inset-radius);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-inset-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-inset-radius) - 1px));--flux-bleed-edge:1px;background-clip:padding-box;position:relative}:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])):where([data-flux-card-body-variant=flush]>:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])),[data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]))){border-radius:var(--flux-card-radius);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])):before{content:"";border-radius:inherit;pointer-events:none;position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){z-index:1;--flux-card-body-clip-x:0px;--flux-card-body-clip-top:0px;--flux-card-body-clip-bottom:0px;--flux-card-body-clip-top-radius:var(--flux-card-radius);--flux-card-body-clip-bottom-radius:var(--flux-card-radius);margin:-1px}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(.dark,.dark *){--flux-card-body-clip-x:1px;--flux-card-body-clip-top:1px;--flux-card-body-clip-bottom:1px;--flux-card-body-clip-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-card-body-clip-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-card-body-clip-top:-1px;--flux-card-body-clip-top-radius:0px;margin-top:0}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-card-body-clip-bottom:-3px;--flux-card-body-clip-bottom-radius:0px;margin-bottom:0}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):before{clip-path:inset(var(--flux-card-body-clip-top) var(--flux-card-body-clip-x) var(--flux-card-body-clip-bottom) round var(--flux-card-body-clip-top-radius) var(--flux-card-body-clip-top-radius) var(--flux-card-body-clip-bottom-radius) var(--flux-card-body-clip-bottom-radius))}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){--flux-bleed-top:var(--flux-card-padding);--flux-bleed-bottom:var(--flux-card-padding);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-bleed-top:calc(var(--flux-card-gap) - var(--flux-card-py));--flux-bleed-top-radius:0px}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-bleed-bottom:0px;--flux-bleed-bottom-radius:0px}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-bleed-top-radius:0px}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-bleed-bottom-radius:0px}:where([data-flux-card-bleed]){margin-inline:calc((var(--flux-bleed-x) + var(--flux-bleed-edge)) * -1);overflow:hidden}:where([data-flux-table-bleed]){--flux-bleed-edge:0px}:where(:is([data-flux-card],[data-flux-card-body])>:is([data-flux-card-bleed],[data-flux-table-bleed]):first-child){margin-top:calc((var(--flux-bleed-top) + var(--flux-bleed-edge)) * -1);border-start-start-radius:calc(var(--flux-bleed-top-radius) + var(--flux-bleed-edge));border-start-end-radius:calc(var(--flux-bleed-top-radius) + var(--flux-bleed-edge))}:where(:is([data-flux-card],[data-flux-card-body])>:is([data-flux-card-bleed],[data-flux-table-bleed]):last-child){margin-bottom:calc((var(--flux-bleed-bottom) + var(--flux-bleed-edge)) * -1);border-end-end-radius:calc(var(--flux-bleed-bottom-radius) + var(--flux-bleed-edge));border-end-start-radius:calc(var(--flux-bleed-bottom-radius) + var(--flux-bleed-edge))}:where([data-flux-card-header],[data-flux-card-footer]){padding-inline:var(--flux-card-part-px);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;display:grid}:where([data-flux-card-header],[data-flux-card-footer])>:where(*){grid-column-start:2}:where([data-flux-card-header]){padding-block:var(--flux-card-part-py) var(--flux-card-part-gap);border-start-start-radius:var(--flux-card-band-radius);border-start-end-radius:var(--flux-card-band-radius);grid-template-rows:1fr}:where([data-flux-card-header]):where([data-flux-card-standalone]:not(:where([data-flux-card] *))){padding-top:var(--flux-card-hang-y)}:where([data-flux-card-footer]){padding-block:var(--flux-card-part-gap) var(--flux-card-part-py);--flux-card-hang-x:0px;border-end-end-radius:var(--flux-card-band-radius);border-end-start-radius:var(--flux-card-band-radius)}:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])>[data-flux-card-footer]),:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-footer]){--flux-card-hang-x:calc(var(--flux-card-px) - var(--flux-card-py) + var(--flux-card-hang-y))}:where(:is([data-flux-card],[data-flux-card-body],[data-flux-card]>:not([data-flux-card]))>[data-flux-card-footer]:first-child){padding-top:var(--flux-card-part-py)}:where(:is([data-flux-card],[data-flux-card-body],[data-flux-card]>:not([data-flux-card]))>[data-flux-card-header]:last-child){padding-bottom:var(--flux-card-part-py)}:where([data-flux-card-header],[data-flux-card-footer])>:where([data-flux-card-actions]){margin-block:calc(var(--flux-card-hang-y) * -1);margin-inline:calc(var(--spacing) * 4) calc(var(--flux-card-hang-x) * -1);grid-row:1/span 2;grid-column-start:3;align-self:start}:where([data-flux-card-header],[data-flux-card-footer])>:where([data-flux-card-actions]):where(:first-child:not(:only-child)){margin-inline:calc(var(--flux-card-hang-x) * -1) calc(var(--spacing) * 4);grid-column-start:1}:where([data-flux-card-footer])>:where([data-flux-card-actions]){grid-row:1;align-self:center}.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow{letter-spacing:.2em;text-transform:uppercase;color:var(--color-hub);font-size:11px;font-weight:700}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.eyebrow.on-dark{color:var(--color-hub-line)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #b07a3a80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #1a254099;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #1a254080}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}}@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.absolute\!{position:absolute!important}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.end-0{inset-inline-end:calc(var(--spacing) * 0)}.end-\[-2px\]{inset-inline-end:-2px}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[-2px\]{top:-2px}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.right-\[-44px\]{right:-44px}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.bottom-\[-1rem\]{bottom:-1rem}.bottom-\[-3px\]{bottom:-3px}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[-44px\]{left:-44px}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-0{z-index:0}.z-1{z-index:1}.z-10{z-index:10}.z-20{z-index:20}.z-20\!{z-index:20!important}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.m-\[-2px\]{margin:-2px}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-1\.25{margin-inline:calc(var(--spacing) * -1.25)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.-mx-\[\.3125rem\]{margin-inline:-.3125rem}.-mx-\[var\(--flux-bleed\,1\.5rem\)\]{margin-inline:calc(var(--flux-bleed,1.5rem) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-6{margin-inline:calc(var(--spacing) * 6)}.mx-\[-5px\]{margin-inline:-5px}.mx-auto{margin-inline:auto}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-\[calc\(0\.25rem-1px\)\]{margin-block:calc(1px - .25rem)}.-my-\[calc\(0\.25rem-2px\)\]{margin-block:calc(2px - .25rem)}.-my-px{margin-block:-1px}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-1\.25{margin-block:calc(var(--spacing) * 1.25)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.my-\[\.3125rem\]{margin-block:.3125rem}.my-px{margin-block:1px}.-ms-1{margin-inline-start:calc(var(--spacing) * -1)}.-ms-1\.5{margin-inline-start:calc(var(--spacing) * -1.5)}.-ms-2{margin-inline-start:calc(var(--spacing) * -2)}.-ms-2\.5{margin-inline-start:calc(var(--spacing) * -2.5)}.-ms-3{margin-inline-start:calc(var(--spacing) * -3)}.-ms-4{margin-inline-start:calc(var(--spacing) * -4)}.ms-1{margin-inline-start:var(--spacing)}.ms-1\.5{margin-inline-start:calc(var(--spacing) * 1.5)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.ms-5{margin-inline-start:calc(var(--spacing) * 5)}.ms-auto{margin-inline-start:auto}.-me-1{margin-inline-end:calc(var(--spacing) * -1)}.-me-1\.5{margin-inline-end:calc(var(--spacing) * -1.5)}.-me-2{margin-inline-end:calc(var(--spacing) * -2)}.-me-2\.5{margin-inline-end:calc(var(--spacing) * -2.5)}.-me-3{margin-inline-end:calc(var(--spacing) * -3)}.-me-4{margin-inline-end:calc(var(--spacing) * -4)}.-me-\[\.3125rem\]{margin-inline-end:-.3125rem}.-me-\[calc\(var\(--spacing\)\*1\.25\)\]{margin-inline-end:calc(calc(var(--spacing) * 1.25) * -1)}.me-1{margin-inline-end:var(--spacing)}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-3{margin-inline-end:calc(var(--spacing) * 3)}.me-4{margin-inline-end:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}.-mt-2\.5{margin-top:calc(var(--spacing) * -2.5)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-\[\.3125rem\]{margin-top:-.3125rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-0\.25{margin-top:calc(var(--spacing) * .25)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[-5px\]{margin-top:-5px}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mr-auto{margin-right:auto}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.-mb-1\.5{margin-bottom:calc(var(--spacing) * -1.5)}.-mb-2\.5{margin-bottom:calc(var(--spacing) * -2.5)}.-mb-3{margin-bottom:calc(var(--spacing) * -3)}.-mb-\[\.3125rem\]{margin-bottom:-.3125rem}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-0\.25{margin-bottom:calc(var(--spacing) * .25)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[5px\]{margin-bottom:5px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.-ml-px{margin-left:-1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-\[3\/2\]{aspect-ratio:3/2}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1{width:var(--spacing);height:var(--spacing)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-2\/3{width:66.6667%;height:66.6667%}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\!{width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-5\!{width:calc(var(--spacing) * 5)!important;height:calc(var(--spacing) * 5)!important}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-13{width:calc(var(--spacing) * 13);height:calc(var(--spacing) * 13)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[1\.125rem\]{width:1.125rem;height:1.125rem}.size-\[6px\]{width:6px;height:6px}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[calc\(2rem\+2px\)\]{height:calc(2rem + 2px)}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-auto\!{height:auto!important}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[20rem\]{max-height:20rem}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[100vh\]{max-height:100vh}.max-h-\[300px\]{max-height:300px}.max-h-\[calc\(100dvh-1rem\)\]{max-height:calc(100dvh - 1rem)}.max-h-dvh{max-height:100dvh}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[65px\]{min-height:65px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[calc\(100dvh-1rem\)\]{min-height:calc(100dvh - 1rem)}.min-h-\[…\]{min-height:…}.min-h-auto{min-height:auto}.min-h-dvh{min-height:100dvh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-6\!{width:calc(var(--spacing) * 6)!important}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-8\!{width:calc(var(--spacing) * 8)!important}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(2ch\+2px\)\]{width:calc(2ch + 2px)}.w-\[calc\(4ch\+2px\)\]{width:calc(4ch + 2px)}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-\[full\]{width:full}.w-auto{width:auto}.w-auto\!{width:auto!important}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-1\/2{max-width:50%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-full{max-width:100%}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-2{min-width:calc(var(--spacing) * 2)}.min-w-3{min-width:calc(var(--spacing) * 3)}.min-w-4{min-width:calc(var(--spacing) * 4)}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-6{min-width:calc(var(--spacing) * 6)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-12{min-width:calc(var(--spacing) * 12)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[10rem\]{min-width:10rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[100\%\]{min-width:100%}.min-w-\[120px\]{min-width:120px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[360px\]{min-width:360px}.min-w-\[calc\(100\%-1rem\)\]{min-width:calc(100% - 1rem)}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[0\.1875rem\]{--tw-translate-x:.1875rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[0\.9375rem\]{--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-x{resize:horizontal}.resize-y{resize:vertical}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-proximity{--tw-scroll-snap-strictness:proximity}.snap-start{scroll-snap-align:start}.scroll-my-\[\.3125rem\]{scroll-margin-block:.3125rem}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.scroll-px-\[var\(--flux-bleed\,1\.5rem\)\]{scroll-padding-inline:var(--flux-bleed,1.5rem)}.scroll-py-\[\.3125rem\]{scroll-padding-block:.3125rem}.\[scrollbar-width\:none\]{scrollbar-width:none}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_1fr_auto\]{grid-template-columns:auto 1fr 1fr auto}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.grid-rows-\[auto_auto_auto_auto_auto\]{grid-template-rows:auto auto auto auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overscroll-contain{overscroll-behavior:contain}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-y-none{overscroll-behavior-y:none}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[\.3rem\]{border-radius:.3rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[var\(--avatar-radius\)\]{border-radius:var(--avatar-radius)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s-lg{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.rounded-s-md{border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md)}.rounded-s-none\!{border-start-start-radius:0!important;border-end-start-radius:0!important}.rounded-e-lg{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.rounded-e-md{border-start-end-radius:var(--radius-md);border-end-end-radius:var(--radius-md)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-\[calc\(0\.5rem-1px\)\]{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-0\!{border-style:var(--tw-border-style)!important;border-width:0!important}.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-e\!{border-inline-end-style:var(--tw-border-style)!important;border-inline-end-width:1px!important}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.border-b-\[2px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--callout-border\){border-color:var(--callout-border)}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_18\%\,_var\(--color-zinc-200\)\)\]{border-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_18\%\,_var\(--color-zinc-200\)\)\]{border-color:color-mix(in oklab,var(--color-button-border) 18%,var(--color-zinc-200))}}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#1a254059}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1a1f1c33}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-red-500{border-color:var(--color-red-500)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-200\!{border-color:var(--color-zinc-200)!important}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-800\/10{border-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/10{border-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.border-zinc-800\/15{border-color:#24315226}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/15{border-color:color-mix(in oklab,var(--color-zinc-800) 15%,transparent)}}.border-x-zinc-100{border-inline-color:var(--color-zinc-100)}.border-t-transparent{border-top-color:#0000}.border-b-\[color-mix\(in_oklab\,_color-mix\(in_oklab\,_var\(--color-button-border\)_26\%\,_var\(--color-zinc-300\)\)_80\%\,_transparent\)\]{border-bottom-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.border-b-\[color-mix\(in_oklab\,_color-mix\(in_oklab\,_var\(--color-button-border\)_26\%\,_var\(--color-zinc-300\)\)_80\%\,_transparent\)\]{border-bottom-color:color-mix(in oklab,color-mix(in oklab,var(--color-button-border) 26%,var(--color-zinc-300)) 80%,transparent)}}.border-b-zinc-300\/80{border-bottom-color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.border-b-zinc-300\/80{border-bottom-color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\(--callout-background\){background-color:var(--callout-background)}.bg-\(--flux-chart-color\){background-color:var(--flux-chart-color)}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]{background-color:color-mix(in oklab,var(--color-button-soft),transparent 80%)}}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-accent-foreground\)\]{background-color:var(--color-accent-foreground)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-\[var\(--flux-progress-color\)\]{background-color:var(--flux-progress-color)}.bg-accent{background-color:var(--color-accent)}.bg-accent-content{background-color:var(--color-accent-content)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-400\/25{background-color:#fcbb0040}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/25{background-color:color-mix(in oklab,var(--color-amber-400) 25%,transparent)}}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-400\/20{background-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/20{background-color:color-mix(in oklab,var(--color-blue-400) 20%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#1a25400f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-current{background-color:currentColor}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-400\/20{background-color:#00d2ef33}@supports (color:color-mix(in lab,red,red)){.bg-cyan-400\/20{background-color:color-mix(in oklab,var(--color-cyan-400) 20%,transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-200{background-color:var(--color-emerald-200)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-400\/20{background-color:#00d29433}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/20{background-color:color-mix(in oklab,var(--color-emerald-400) 20%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-200{background-color:var(--color-fuchsia-200)}.bg-fuchsia-400\/20{background-color:#ec6cff33}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-400\/20{background-color:color-mix(in oklab,var(--color-fuchsia-400) 20%,transparent)}}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-400\/20{background-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/20{background-color:color-mix(in oklab,var(--color-green-400) 20%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-indigo-400\/20{background-color:#7d87ff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-400\/20{background-color:color-mix(in oklab,var(--color-indigo-400) 20%,transparent)}}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1a1f1cb3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-lime-200{background-color:var(--color-lime-200)}.bg-lime-400\/25{background-color:#9de50040}@supports (color:color-mix(in lab,red,red)){.bg-lime-400\/25{background-color:color-mix(in oklab,var(--color-lime-400) 25%,transparent)}}.bg-lime-500{background-color:var(--color-lime-500)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-orange-200{background-color:var(--color-orange-200)}.bg-orange-400\/20{background-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/20{background-color:color-mix(in oklab,var(--color-orange-400) 20%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-400\/20{background-color:#fb64b633}@supports (color:color-mix(in lab,red,red)){.bg-pink-400\/20{background-color:color-mix(in oklab,var(--color-pink-400) 20%,transparent)}}.bg-pink-500{background-color:var(--color-pink-500)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-400\/20{background-color:#c07eff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-400\/20{background-color:color-mix(in oklab,var(--color-purple-400) 20%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-400\/20{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/20{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-rose-400\/20{background-color:#ff667f33}@supports (color:color-mix(in lab,red,red)){.bg-rose-400\/20{background-color:color-mix(in oklab,var(--color-rose-400) 20%,transparent)}}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-200{background-color:var(--color-sky-200)}.bg-sky-400\/20{background-color:#00bcfe33}@supports (color:color-mix(in lab,red,red)){.bg-sky-400\/20{background-color:color-mix(in oklab,var(--color-sky-400) 20%,transparent)}}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-teal-400\/20{background-color:#00d3bd33}@supports (color:color-mix(in lab,red,red)){.bg-teal-400\/20{background-color:color-mix(in oklab,var(--color-teal-400) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-400\/20{background-color:#a685ff33}@supports (color:color-mix(in lab,red,red)){.bg-violet-400\/20{background-color:color-mix(in oklab,var(--color-violet-400) 20%,transparent)}}.bg-violet-500{background-color:var(--color-violet-500)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-yellow-400\/25{background-color:#fac80040}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/25{background-color:color-mix(in oklab,var(--color-yellow-400) 25%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-400\/15{background-color:#8a918d26}@supports (color:color-mix(in lab,red,red)){.bg-zinc-400\/15{background-color:color-mix(in oklab,var(--color-zinc-400) 15%,transparent)}}.bg-zinc-500{background-color:var(--color-zinc-500)}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-800\/5{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/5{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.bg-zinc-800\/5\!{background-color:#2431520d!important}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/5\!{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)!important}}.bg-zinc-800\/6{background-color:#2431520f}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/6{background-color:color-mix(in oklab,var(--color-zinc-800) 6%,transparent)}}.bg-zinc-800\/10{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/10{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.bg-zinc-800\/15{background-color:#24315226}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/15{background-color:color-mix(in oklab,var(--color-zinc-800) 15%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%2300000040\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%2300000040%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-white{--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-zinc-100{--tw-gradient-from:var(--color-zinc-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-1\%{--tw-gradient-from-position:1%}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-black{--tw-gradient-to:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.mask-r-from-\[max\(calc\(100\%-6rem\)\,var\(--flux-scroll-percentage\)\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:max( calc(100% - 6rem) , var(--flux-scroll-percentage));-webkit-mask-composite:source-in;mask-composite:intersect}.mask-r-from-\[var\(--flux-carousel-fade-right\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:var(--flux-carousel-fade-right);-webkit-mask-composite:source-in;mask-composite:intersect}.mask-l-from-\[var\(--flux-carousel-fade-left\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-left:linear-gradient(to left, var(--tw-mask-left-from-color) var(--tw-mask-left-from-position), var(--tw-mask-left-to-color) var(--tw-mask-left-to-position));--tw-mask-left-from-position:var(--flux-carousel-fade-left);-webkit-mask-composite:source-in;mask-composite:intersect}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-\[length\:16px_16px\]{background-size:16px 16px}.bg-clip-padding{background-clip:padding-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-position-\[right_\.25rem_center\]\!{background-position:right .25rem center!important}.bg-no-repeat{background-repeat:no-repeat}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.stroke-zinc-300{stroke:var(--color-zinc-300)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[\.3125rem\]{padding:.3125rem}.p-\[1px\]{padding:1px}.p-\[5px\]{padding:5px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.p-\[calc\(0\.25rem-1px\)\]{padding:calc(.25rem - 1px)}.p-\[calc\(0\.75rem-1px\)\]{padding:calc(.75rem - 1px)}.px-0{padding-inline:0}.px-0\!{padding-inline:0!important}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-2\.5\!{padding-inline:calc(var(--spacing) * 2.5)!important}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[\.3125rem\]{padding-inline:.3125rem}.px-\[3px\]{padding-inline:3px}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.px-\[var\(--flux-bleed\,1\.5rem\)\]{padding-inline:var(--flux-bleed,1.5rem)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[2px\]{padding-block:2px}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-\[calc\(0\.5rem-1px\)\]{padding-block:calc(.5rem - 1px)}.py-\[calc\(0\.25rem\)\]{padding-block:.25rem}.py-\[calc\(0\.25rem-1px\)\]{padding-block:calc(.25rem - 1px)}.py-\[calc\(0\.25rem-2px\)\]{padding-block:calc(.25rem - 2px)}.py-\[calc\(0\.75rem-3px\)\]{padding-block:calc(.75rem - 3px)}.py-\[calc\(0\.125rem\+1px\)\]{padding-block:calc(.125rem + 1px)}.py-px{padding-block:1px}.ps-1{padding-inline-start:var(--spacing)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-2\.5{padding-inline-start:calc(var(--spacing) * 2.5)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-3\.5{padding-inline-start:calc(var(--spacing) * 3.5)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.ps-9{padding-inline-start:calc(var(--spacing) * 9)}.ps-10{padding-inline-start:calc(var(--spacing) * 10)}.ps-11{padding-inline-start:calc(var(--spacing) * 11)}.ps-\[3px\]{padding-inline-start:3px}.ps-\[5px\]{padding-inline-start:5px}.ps-\[7px\]{padding-inline-start:7px}.ps-\[calc\(0\.5rem-1px\)\]{padding-inline-start:calc(.5rem - 1px)}.ps-\[calc\(0\.25rem\)\]{padding-inline-start:.25rem}.pe-0{padding-inline-end:0}.pe-1{padding-inline-end:var(--spacing)}.pe-1\.5{padding-inline-end:calc(var(--spacing) * 1.5)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-2\.5{padding-inline-end:calc(var(--spacing) * 2.5)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pe-3\.5{padding-inline-end:calc(var(--spacing) * 3.5)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.pe-6{padding-inline-end:calc(var(--spacing) * 6)}.pe-9{padding-inline-end:calc(var(--spacing) * 9)}.pe-10{padding-inline-end:calc(var(--spacing) * 10)}.pe-11{padding-inline-end:calc(var(--spacing) * 11)}.pe-16{padding-inline-end:calc(var(--spacing) * 16)}.pe-23{padding-inline-end:calc(var(--spacing) * 23)}.pe-30{padding-inline-end:calc(var(--spacing) * 30)}.pe-37{padding-inline-end:calc(var(--spacing) * 37)}.pe-44{padding-inline-end:calc(var(--spacing) * 44)}.pe-51{padding-inline-end:calc(var(--spacing) * 51)}.pe-\[\.3125rem\]{padding-inline-end:.3125rem}.pe-\[0px\]{padding-inline-end:0}.pe-\[1\.35rem\]{padding-inline-end:1.35rem}.pe-\[3px\]{padding-inline-end:3px}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[\.3125rem\]{padding-top:.3125rem}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[\.3125rem\]{padding-bottom:.3125rem}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.\[text-align\:inherit\]{text-align:inherit}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.\[text-indent\:inherit\]{text-indent:inherit}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[font-size\:inherit\]{font-size:inherit}.text-\[\.625rem\]{font-size:.625rem}.text-\[\.5625rem\]{font-size:.5625rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-\[1\.125rem\]{--tw-leading:1.125rem;line-height:1.125rem}.leading-\[1\.375rem\]{--tw-leading:1.375rem;line-height:1.375rem}.leading-\[var\(--flux-card-leading\)\]{--tw-leading:var(--flux-card-leading);line-height:var(--flux-card-leading)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.\[line-height\:inherit\]{line-height:inherit}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.text-nowrap{text-wrap:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\(--color-button-strong\){color:var(--color-button-strong)}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color-mix\(in_oklab\,_var\(--color-accent-content\)\,_var\(--color-zinc-500\)_46\%\)\]{color:#37424f}@supports (color:color-mix(in lab,red,red)){.text-\[color-mix\(in_oklab\,_var\(--color-accent-content\)\,_var\(--color-zinc-500\)_46\%\)\]{color:color-mix(in oklab,var(--color-accent-content),var(--color-zinc-500) 46%)}}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--callout-icon\)\]{color:var(--callout-icon)}.text-\[var\(--color-accent-content\)\]{color:var(--color-accent-content)}.text-\[var\(--color-accent-foreground\)\]{color:var(--color-accent-foreground)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-foreground{color:var(--color-accent-foreground)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-black\/25{color:#00000040}@supports (color:color-mix(in lab,red,red)){.text-black\/25{color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-800{color:var(--color-blue-800)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-800{color:var(--color-cyan-800)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-800{color:var(--color-emerald-800)}.text-err{color:var(--color-err)}.text-fuchsia-600{color:var(--color-fuchsia-600)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-fuchsia-800{color:var(--color-fuchsia-800)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-lime-600{color:var(--color-lime-600)}.text-lime-800{color:var(--color-lime-800)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.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-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-sky-600{color:var(--color-sky-600)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-teal-600{color:var(--color-teal-600)}.text-teal-800{color:var(--color-teal-800)}.text-transparent{color:#0000}.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-violet-800{color:var(--color-violet-800)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-200\/50{color:#e2ddd080}@supports (color:color-mix(in lab,red,red)){.text-zinc-200\/50{color:color-mix(in oklab,var(--color-zinc-200) 50%,transparent)}}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-400\!{color:var(--color-zinc-400)!important}.text-zinc-400\/75{color:#8a918dbf}@supports (color:color-mix(in lab,red,red)){.text-zinc-400\/75{color:color-mix(in oklab,var(--color-zinc-400) 75%,transparent)}}.text-zinc-400\/90{color:#8a918de6}@supports (color:color-mix(in lab,red,red)){.text-zinc-400\/90{color:color-mix(in oklab,var(--color-zinc-400) 90%,transparent)}}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-500\/85{color:#5a6360d9}@supports (color:color-mix(in lab,red,red)){.text-zinc-500\/85{color:color-mix(in oklab,var(--color-zinc-500) 85%,transparent)}}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-600\/85{color:#3a413dd9}@supports (color:color-mix(in lab,red,red)){.text-zinc-600\/85{color:color-mix(in oklab,var(--color-zinc-600) 85%,transparent)}}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-700\!{color:var(--color-zinc-700)!important}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-800\!{color:var(--color-zinc-800)!important}.text-zinc-800\/70{color:#243152b3}@supports (color:color-mix(in lab,red,red)){.text-zinc-800\/70{color:color-mix(in oklab,var(--color-zinc-800) 70%,transparent)}}.text-zinc-900{color:var(--color-zinc-900)}.\[text-transform\:inherit\]{text-transform:inherit}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color-mix\(in_oklab\,var\(--color-accent-content\)\,transparent_80\%\)\]{text-decoration-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.decoration-\[color-mix\(in_oklab\,var\(--color-accent-content\)\,transparent_80\%\)\]{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-content),transparent 80%);text-decoration-color:color-mix(in oklab,var(--color-accent-content),transparent 80%)}}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.decoration-zinc-800\/20{text-decoration-color:#24315233}@supports (color:color-mix(in lab,red,red)){.decoration-zinc-800\/20{-webkit-text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.underline-offset-\[6px\]{text-underline-offset:6px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.placeholder-zinc-400::placeholder{color:var(--color-zinc-400)}.placeholder-zinc-500::placeholder{color:var(--color-zinc-500)}.caret-transparent{caret-color:#0000}.accent-\[color\:var\(--color-hub\)\]{accent-color:var(--color-hub)}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,\.15\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#00000026);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0px_1px_2px_0px_rgba\(0\,0\,0\,\.05\)\,0px_2px_4px_0px_rgba\(0\,0\,0\,\.1\)\]{--tw-shadow:0px 1px 2px 0px var(--tw-shadow-color,#0000000d), 0px 2px 4px 0px 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-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,#fff3)}@supports (color:color-mix(in lab,red,red)){.shadow-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,color-mix(in oklab, var(--color-white) 20%, transparent))}}.shadow-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,var(--color-red-500)), inset 0px 2px var(--tw-shadow-color,#ffffff26)}@supports (color:color-mix(in lab,red,red)){.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,var(--color-red-500)), inset 0px 2px var(--tw-shadow-color,color-mix(in oklab, var(--color-white) 15%, transparent))}}.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2,.ring-\[2px\]{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-black\/5{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.ring-black\/5{--tw-ring-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.ring-black\/7{--tw-ring-color:#00000012}@supports (color:color-mix(in lab,red,red)){.ring-black\/7{--tw-ring-color:color-mix(in oklab, var(--color-black) 7%, transparent)}}.ring-black\/15{--tw-ring-color:#00000026}@supports (color:color-mix(in lab,red,red)){.ring-black\/15{--tw-ring-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-white{--tw-ring-color:var(--color-white)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-2{outline-offset:2px}.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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.outline-none\!{--tw-outline-style:none!important;outline-style:none!important}.select-none{-webkit-user-select:none;user-select:none}.\[--avatar-radius\:calc\(infinity\*1px\)\]{--avatar-radius:calc(infinity * 1px)}.\[--avatar-radius\:var\(--radius-lg\)\]{--avatar-radius:var(--radius-lg)}.\[--avatar-radius\:var\(--radius-md\)\]{--avatar-radius:var(--radius-md)}.\[--avatar-radius\:var\(--radius-sm\)\]{--avatar-radius:var(--radius-sm)}.\[--avatar-radius\:var\(--radius-xl\)\]{--avatar-radius:var(--radius-xl)}.\[--callout-background\:var\(--color-amber-50\)\]{--callout-background:var(--color-amber-50)}.\[--callout-background\:var\(--color-blue-50\)\]{--callout-background:var(--color-blue-50)}.\[--callout-background\:var\(--color-cyan-50\)\]{--callout-background:var(--color-cyan-50)}.\[--callout-background\:var\(--color-emerald-50\)\]{--callout-background:var(--color-emerald-50)}.\[--callout-background\:var\(--color-fuchsia-50\)\]{--callout-background:var(--color-fuchsia-50)}.\[--callout-background\:var\(--color-green-50\)\]{--callout-background:var(--color-green-50)}.\[--callout-background\:var\(--color-indigo-50\)\]{--callout-background:var(--color-indigo-50)}.\[--callout-background\:var\(--color-lime-50\)\]{--callout-background:var(--color-lime-50)}.\[--callout-background\:var\(--color-orange-50\)\]{--callout-background:var(--color-orange-50)}.\[--callout-background\:var\(--color-pink-50\)\]{--callout-background:var(--color-pink-50)}.\[--callout-background\:var\(--color-purple-50\)\]{--callout-background:var(--color-purple-50)}.\[--callout-background\:var\(--color-red-50\)\]{--callout-background:var(--color-red-50)}.\[--callout-background\:var\(--color-rose-50\)\]{--callout-background:var(--color-rose-50)}.\[--callout-background\:var\(--color-sky-50\)\]{--callout-background:var(--color-sky-50)}.\[--callout-background\:var\(--color-teal-50\)\]{--callout-background:var(--color-teal-50)}.\[--callout-background\:var\(--color-violet-50\)\]{--callout-background:var(--color-violet-50)}.\[--callout-background\:var\(--color-white\)\]{--callout-background:var(--color-white)}.\[--callout-background\:var\(--color-yellow-50\)\]{--callout-background:var(--color-yellow-50)}.\[--callout-background\:var\(--color-zinc-50\)\]{--callout-background:var(--color-zinc-50)}.\[--callout-border\:var\(--color-amber-400\)\]{--callout-border:var(--color-amber-400)}.\[--callout-border\:var\(--color-blue-200\)\]{--callout-border:var(--color-blue-200)}.\[--callout-border\:var\(--color-cyan-200\)\]{--callout-border:var(--color-cyan-200)}.\[--callout-border\:var\(--color-emerald-200\)\]{--callout-border:var(--color-emerald-200)}.\[--callout-border\:var\(--color-fuchsia-200\)\]{--callout-border:var(--color-fuchsia-200)}.\[--callout-border\:var\(--color-green-300\)\]{--callout-border:var(--color-green-300)}.\[--callout-border\:var\(--color-indigo-200\)\]{--callout-border:var(--color-indigo-200)}.\[--callout-border\:var\(--color-lime-400\)\]{--callout-border:var(--color-lime-400)}.\[--callout-border\:var\(--color-orange-200\)\]{--callout-border:var(--color-orange-200)}.\[--callout-border\:var\(--color-pink-200\)\]{--callout-border:var(--color-pink-200)}.\[--callout-border\:var\(--color-purple-300\)\]{--callout-border:var(--color-purple-300)}.\[--callout-border\:var\(--color-red-200\)\]{--callout-border:var(--color-red-200)}.\[--callout-border\:var\(--color-rose-200\)\]{--callout-border:var(--color-rose-200)}.\[--callout-border\:var\(--color-sky-200\)\]{--callout-border:var(--color-sky-200)}.\[--callout-border\:var\(--color-teal-200\)\]{--callout-border:var(--color-teal-200)}.\[--callout-border\:var\(--color-violet-200\)\]{--callout-border:var(--color-violet-200)}.\[--callout-border\:var\(--color-yellow-400\)\]{--callout-border:var(--color-yellow-400)}.\[--callout-border\:var\(--color-zinc-200\)\]{--callout-border:var(--color-zinc-200)}.\[--callout-heading\:var\(--color-amber-600\)\]{--callout-heading:var(--color-amber-600)}.\[--callout-heading\:var\(--color-blue-600\)\]{--callout-heading:var(--color-blue-600)}.\[--callout-heading\:var\(--color-cyan-600\)\]{--callout-heading:var(--color-cyan-600)}.\[--callout-heading\:var\(--color-emerald-600\)\]{--callout-heading:var(--color-emerald-600)}.\[--callout-heading\:var\(--color-fuchsia-600\)\]{--callout-heading:var(--color-fuchsia-600)}.\[--callout-heading\:var\(--color-green-600\)\]{--callout-heading:var(--color-green-600)}.\[--callout-heading\:var\(--color-indigo-600\)\]{--callout-heading:var(--color-indigo-600)}.\[--callout-heading\:var\(--color-lime-700\)\]{--callout-heading:var(--color-lime-700)}.\[--callout-heading\:var\(--color-orange-600\)\]{--callout-heading:var(--color-orange-600)}.\[--callout-heading\:var\(--color-pink-600\)\]{--callout-heading:var(--color-pink-600)}.\[--callout-heading\:var\(--color-purple-800\)\]{--callout-heading:var(--color-purple-800)}.\[--callout-heading\:var\(--color-red-700\)\]{--callout-heading:var(--color-red-700)}.\[--callout-heading\:var\(--color-rose-600\)\]{--callout-heading:var(--color-rose-600)}.\[--callout-heading\:var\(--color-sky-600\)\]{--callout-heading:var(--color-sky-600)}.\[--callout-heading\:var\(--color-teal-600\)\]{--callout-heading:var(--color-teal-600)}.\[--callout-heading\:var\(--color-violet-600\)\]{--callout-heading:var(--color-violet-600)}.\[--callout-heading\:var\(--color-yellow-600\)\]{--callout-heading:var(--color-yellow-600)}.\[--callout-heading\:var\(--color-zinc-800\)\]{--callout-heading:var(--color-zinc-800)}.\[--callout-icon\:var\(--color-amber-500\)\]{--callout-icon:var(--color-amber-500)}.\[--callout-icon\:var\(--color-blue-500\)\]{--callout-icon:var(--color-blue-500)}.\[--callout-icon\:var\(--color-cyan-500\)\]{--callout-icon:var(--color-cyan-500)}.\[--callout-icon\:var\(--color-emerald-500\)\]{--callout-icon:var(--color-emerald-500)}.\[--callout-icon\:var\(--color-fuchsia-500\)\]{--callout-icon:var(--color-fuchsia-500)}.\[--callout-icon\:var\(--color-green-500\)\]{--callout-icon:var(--color-green-500)}.\[--callout-icon\:var\(--color-indigo-500\)\]{--callout-icon:var(--color-indigo-500)}.\[--callout-icon\:var\(--color-lime-500\)\]{--callout-icon:var(--color-lime-500)}.\[--callout-icon\:var\(--color-orange-500\)\]{--callout-icon:var(--color-orange-500)}.\[--callout-icon\:var\(--color-pink-500\)\]{--callout-icon:var(--color-pink-500)}.\[--callout-icon\:var\(--color-purple-500\)\]{--callout-icon:var(--color-purple-500)}.\[--callout-icon\:var\(--color-red-400\)\]{--callout-icon:var(--color-red-400)}.\[--callout-icon\:var\(--color-rose-500\)\]{--callout-icon:var(--color-rose-500)}.\[--callout-icon\:var\(--color-sky-500\)\]{--callout-icon:var(--color-sky-500)}.\[--callout-icon\:var\(--color-teal-500\)\]{--callout-icon:var(--color-teal-500)}.\[--callout-icon\:var\(--color-violet-500\)\]{--callout-icon:var(--color-violet-500)}.\[--callout-icon\:var\(--color-yellow-500\)\]{--callout-icon:var(--color-yellow-500)}.\[--callout-icon\:var\(--color-zinc-400\)\]{--callout-icon:var(--color-zinc-400)}.\[--callout-text\:var\(--color-amber-600\)\]{--callout-text:var(--color-amber-600)}.\[--callout-text\:var\(--color-blue-600\)\]{--callout-text:var(--color-blue-600)}.\[--callout-text\:var\(--color-cyan-600\)\]{--callout-text:var(--color-cyan-600)}.\[--callout-text\:var\(--color-emerald-600\)\]{--callout-text:var(--color-emerald-600)}.\[--callout-text\:var\(--color-fuchsia-600\)\]{--callout-text:var(--color-fuchsia-600)}.\[--callout-text\:var\(--color-green-600\)\]{--callout-text:var(--color-green-600)}.\[--callout-text\:var\(--color-indigo-600\)\]{--callout-text:var(--color-indigo-600)}.\[--callout-text\:var\(--color-lime-600\)\]{--callout-text:var(--color-lime-600)}.\[--callout-text\:var\(--color-orange-600\)\]{--callout-text:var(--color-orange-600)}.\[--callout-text\:var\(--color-pink-600\)\]{--callout-text:var(--color-pink-600)}.\[--callout-text\:var\(--color-purple-700\)\]{--callout-text:var(--color-purple-700)}.\[--callout-text\:var\(--color-red-700\)\]{--callout-text:var(--color-red-700)}.\[--callout-text\:var\(--color-rose-600\)\]{--callout-text:var(--color-rose-600)}.\[--callout-text\:var\(--color-sky-600\)\]{--callout-text:var(--color-sky-600)}.\[--callout-text\:var\(--color-teal-600\)\]{--callout-text:var(--color-teal-600)}.\[--callout-text\:var\(--color-violet-600\)\]{--callout-text:var(--color-violet-600)}.\[--callout-text\:var\(--color-yellow-700\)\]{--callout-text:var(--color-yellow-700)}.\[--callout-text\:var\(--color-zinc-500\)\]{--callout-text:var(--color-zinc-500)}.\[--color-accent-content\:var\(--color-amber-600\)\]{--color-accent-content:var(--color-amber-600)}.\[--color-accent-content\:var\(--color-blue-600\)\]{--color-accent-content:var(--color-blue-600)}.\[--color-accent-content\:var\(--color-cyan-600\)\]{--color-accent-content:var(--color-cyan-600)}.\[--color-accent-content\:var\(--color-emerald-600\)\]{--color-accent-content:var(--color-emerald-600)}.\[--color-accent-content\:var\(--color-fuchsia-600\)\]{--color-accent-content:var(--color-fuchsia-600)}.\[--color-accent-content\:var\(--color-gray-800\)\]{--color-accent-content:var(--color-gray-800)}.\[--color-accent-content\:var\(--color-green-600\)\]{--color-accent-content:var(--color-green-600)}.\[--color-accent-content\:var\(--color-indigo-600\)\]{--color-accent-content:var(--color-indigo-600)}.\[--color-accent-content\:var\(--color-lime-600\)\]{--color-accent-content:var(--color-lime-600)}.\[--color-accent-content\:var\(--color-mauve-800\)\]{--color-accent-content:var(--color-mauve-800)}.\[--color-accent-content\:var\(--color-mist-800\)\]{--color-accent-content:var(--color-mist-800)}.\[--color-accent-content\:var\(--color-neutral-800\)\]{--color-accent-content:var(--color-neutral-800)}.\[--color-accent-content\:var\(--color-olive-800\)\]{--color-accent-content:var(--color-olive-800)}.\[--color-accent-content\:var\(--color-orange-600\)\]{--color-accent-content:var(--color-orange-600)}.\[--color-accent-content\:var\(--color-pink-600\)\]{--color-accent-content:var(--color-pink-600)}.\[--color-accent-content\:var\(--color-purple-600\)\]{--color-accent-content:var(--color-purple-600)}.\[--color-accent-content\:var\(--color-red-600\)\]{--color-accent-content:var(--color-red-600)}.\[--color-accent-content\:var\(--color-rose-500\)\]{--color-accent-content:var(--color-rose-500)}.\[--color-accent-content\:var\(--color-sky-600\)\]{--color-accent-content:var(--color-sky-600)}.\[--color-accent-content\:var\(--color-slate-800\)\]{--color-accent-content:var(--color-slate-800)}.\[--color-accent-content\:var\(--color-stone-800\)\]{--color-accent-content:var(--color-stone-800)}.\[--color-accent-content\:var\(--color-taupe-800\)\]{--color-accent-content:var(--color-taupe-800)}.\[--color-accent-content\:var\(--color-teal-600\)\]{--color-accent-content:var(--color-teal-600)}.\[--color-accent-content\:var\(--color-violet-600\)\]{--color-accent-content:var(--color-violet-600)}.\[--color-accent-content\:var\(--color-yellow-600\)\]{--color-accent-content:var(--color-yellow-600)}.\[--color-accent-content\:var\(--color-zinc-800\)\]{--color-accent-content:var(--color-zinc-800)}.\[--color-accent-foreground\:var\(--color-amber-950\)\]{--color-accent-foreground:var(--color-amber-950)}.\[--color-accent-foreground\:var\(--color-lime-900\)\]{--color-accent-foreground:var(--color-lime-900)}.\[--color-accent-foreground\:var\(--color-white\)\]{--color-accent-foreground:var(--color-white)}.\[--color-accent-foreground\:var\(--color-yellow-950\)\]{--color-accent-foreground:var(--color-yellow-950)}.\[--color-accent\:var\(--color-amber-400\)\]{--color-accent:var(--color-amber-400)}.\[--color-accent\:var\(--color-blue-500\)\]{--color-accent:var(--color-blue-500)}.\[--color-accent\:var\(--color-cyan-600\)\]{--color-accent:var(--color-cyan-600)}.\[--color-accent\:var\(--color-emerald-600\)\]{--color-accent:var(--color-emerald-600)}.\[--color-accent\:var\(--color-fuchsia-600\)\]{--color-accent:var(--color-fuchsia-600)}.\[--color-accent\:var\(--color-gray-800\)\]{--color-accent:var(--color-gray-800)}.\[--color-accent\:var\(--color-green-600\)\]{--color-accent:var(--color-green-600)}.\[--color-accent\:var\(--color-indigo-500\)\]{--color-accent:var(--color-indigo-500)}.\[--color-accent\:var\(--color-lime-400\)\]{--color-accent:var(--color-lime-400)}.\[--color-accent\:var\(--color-mauve-800\)\]{--color-accent:var(--color-mauve-800)}.\[--color-accent\:var\(--color-mist-800\)\]{--color-accent:var(--color-mist-800)}.\[--color-accent\:var\(--color-neutral-800\)\]{--color-accent:var(--color-neutral-800)}.\[--color-accent\:var\(--color-olive-800\)\]{--color-accent:var(--color-olive-800)}.\[--color-accent\:var\(--color-orange-500\)\]{--color-accent:var(--color-orange-500)}.\[--color-accent\:var\(--color-pink-600\)\]{--color-accent:var(--color-pink-600)}.\[--color-accent\:var\(--color-purple-500\)\]{--color-accent:var(--color-purple-500)}.\[--color-accent\:var\(--color-red-500\)\]{--color-accent:var(--color-red-500)}.\[--color-accent\:var\(--color-rose-500\)\]{--color-accent:var(--color-rose-500)}.\[--color-accent\:var\(--color-sky-600\)\]{--color-accent:var(--color-sky-600)}.\[--color-accent\:var\(--color-slate-800\)\]{--color-accent:var(--color-slate-800)}.\[--color-accent\:var\(--color-stone-800\)\]{--color-accent:var(--color-stone-800)}.\[--color-accent\:var\(--color-taupe-800\)\]{--color-accent:var(--color-taupe-800)}.\[--color-accent\:var\(--color-teal-600\)\]{--color-accent:var(--color-teal-600)}.\[--color-accent\:var\(--color-violet-500\)\]{--color-accent:var(--color-violet-500)}.\[--color-accent\:var\(--color-yellow-400\)\]{--color-accent:var(--color-yellow-400)}.\[--color-accent\:var\(--color-zinc-800\)\]{--color-accent:var(--color-zinc-800)}.\[--color-button-border\:var\(--color-amber-500\)\]{--color-button-border:var(--color-amber-500)}.\[--color-button-border\:var\(--color-blue-500\)\]{--color-button-border:var(--color-blue-500)}.\[--color-button-border\:var\(--color-cyan-500\)\]{--color-button-border:var(--color-cyan-500)}.\[--color-button-border\:var\(--color-emerald-500\)\]{--color-button-border:var(--color-emerald-500)}.\[--color-button-border\:var\(--color-fuchsia-500\)\]{--color-button-border:var(--color-fuchsia-500)}.\[--color-button-border\:var\(--color-green-500\)\]{--color-button-border:var(--color-green-500)}.\[--color-button-border\:var\(--color-indigo-500\)\]{--color-button-border:var(--color-indigo-500)}.\[--color-button-border\:var\(--color-lime-500\)\]{--color-button-border:var(--color-lime-500)}.\[--color-button-border\:var\(--color-orange-500\)\]{--color-button-border:var(--color-orange-500)}.\[--color-button-border\:var\(--color-pink-500\)\]{--color-button-border:var(--color-pink-500)}.\[--color-button-border\:var\(--color-purple-500\)\]{--color-button-border:var(--color-purple-500)}.\[--color-button-border\:var\(--color-red-500\)\]{--color-button-border:var(--color-red-500)}.\[--color-button-border\:var\(--color-rose-500\)\]{--color-button-border:var(--color-rose-500)}.\[--color-button-border\:var\(--color-sky-500\)\]{--color-button-border:var(--color-sky-500)}.\[--color-button-border\:var\(--color-teal-500\)\]{--color-button-border:var(--color-teal-500)}.\[--color-button-border\:var\(--color-violet-500\)\]{--color-button-border:var(--color-violet-500)}.\[--color-button-border\:var\(--color-yellow-500\)\]{--color-button-border:var(--color-yellow-500)}.\[--color-button-deep\:var\(--color-amber-950\)\]{--color-button-deep:var(--color-amber-950)}.\[--color-button-deep\:var\(--color-blue-950\)\]{--color-button-deep:var(--color-blue-950)}.\[--color-button-deep\:var\(--color-cyan-950\)\]{--color-button-deep:var(--color-cyan-950)}.\[--color-button-deep\:var\(--color-emerald-950\)\]{--color-button-deep:var(--color-emerald-950)}.\[--color-button-deep\:var\(--color-fuchsia-950\)\]{--color-button-deep:var(--color-fuchsia-950)}.\[--color-button-deep\:var\(--color-green-950\)\]{--color-button-deep:var(--color-green-950)}.\[--color-button-deep\:var\(--color-indigo-950\)\]{--color-button-deep:var(--color-indigo-950)}.\[--color-button-deep\:var\(--color-lime-950\)\]{--color-button-deep:var(--color-lime-950)}.\[--color-button-deep\:var\(--color-orange-950\)\]{--color-button-deep:var(--color-orange-950)}.\[--color-button-deep\:var\(--color-pink-950\)\]{--color-button-deep:var(--color-pink-950)}.\[--color-button-deep\:var\(--color-purple-950\)\]{--color-button-deep:var(--color-purple-950)}.\[--color-button-deep\:var\(--color-red-950\)\]{--color-button-deep:var(--color-red-950)}.\[--color-button-deep\:var\(--color-rose-950\)\]{--color-button-deep:var(--color-rose-950)}.\[--color-button-deep\:var\(--color-sky-950\)\]{--color-button-deep:var(--color-sky-950)}.\[--color-button-deep\:var\(--color-teal-950\)\]{--color-button-deep:var(--color-teal-950)}.\[--color-button-deep\:var\(--color-violet-950\)\]{--color-button-deep:var(--color-violet-950)}.\[--color-button-deep\:var\(--color-yellow-950\)\]{--color-button-deep:var(--color-yellow-950)}.\[--color-button-muted\:var\(--color-amber-300\)\]{--color-button-muted:var(--color-amber-300)}.\[--color-button-muted\:var\(--color-blue-300\)\]{--color-button-muted:var(--color-blue-300)}.\[--color-button-muted\:var\(--color-cyan-300\)\]{--color-button-muted:var(--color-cyan-300)}.\[--color-button-muted\:var\(--color-emerald-300\)\]{--color-button-muted:var(--color-emerald-300)}.\[--color-button-muted\:var\(--color-fuchsia-300\)\]{--color-button-muted:var(--color-fuchsia-300)}.\[--color-button-muted\:var\(--color-green-300\)\]{--color-button-muted:var(--color-green-300)}.\[--color-button-muted\:var\(--color-indigo-300\)\]{--color-button-muted:var(--color-indigo-300)}.\[--color-button-muted\:var\(--color-lime-300\)\]{--color-button-muted:var(--color-lime-300)}.\[--color-button-muted\:var\(--color-orange-300\)\]{--color-button-muted:var(--color-orange-300)}.\[--color-button-muted\:var\(--color-pink-300\)\]{--color-button-muted:var(--color-pink-300)}.\[--color-button-muted\:var\(--color-purple-300\)\]{--color-button-muted:var(--color-purple-300)}.\[--color-button-muted\:var\(--color-red-300\)\]{--color-button-muted:var(--color-red-300)}.\[--color-button-muted\:var\(--color-rose-300\)\]{--color-button-muted:var(--color-rose-300)}.\[--color-button-muted\:var\(--color-sky-300\)\]{--color-button-muted:var(--color-sky-300)}.\[--color-button-muted\:var\(--color-teal-300\)\]{--color-button-muted:var(--color-teal-300)}.\[--color-button-muted\:var\(--color-violet-300\)\]{--color-button-muted:var(--color-violet-300)}.\[--color-button-muted\:var\(--color-yellow-300\)\]{--color-button-muted:var(--color-yellow-300)}.\[--color-button-soft-foreground\:var\(--color-amber-200\)\]{--color-button-soft-foreground:var(--color-amber-200)}.\[--color-button-soft-foreground\:var\(--color-blue-200\)\]{--color-button-soft-foreground:var(--color-blue-200)}.\[--color-button-soft-foreground\:var\(--color-cyan-200\)\]{--color-button-soft-foreground:var(--color-cyan-200)}.\[--color-button-soft-foreground\:var\(--color-emerald-200\)\]{--color-button-soft-foreground:var(--color-emerald-200)}.\[--color-button-soft-foreground\:var\(--color-fuchsia-200\)\]{--color-button-soft-foreground:var(--color-fuchsia-200)}.\[--color-button-soft-foreground\:var\(--color-green-200\)\]{--color-button-soft-foreground:var(--color-green-200)}.\[--color-button-soft-foreground\:var\(--color-indigo-200\)\]{--color-button-soft-foreground:var(--color-indigo-200)}.\[--color-button-soft-foreground\:var\(--color-lime-200\)\]{--color-button-soft-foreground:var(--color-lime-200)}.\[--color-button-soft-foreground\:var\(--color-orange-200\)\]{--color-button-soft-foreground:var(--color-orange-200)}.\[--color-button-soft-foreground\:var\(--color-pink-200\)\]{--color-button-soft-foreground:var(--color-pink-200)}.\[--color-button-soft-foreground\:var\(--color-purple-200\)\]{--color-button-soft-foreground:var(--color-purple-200)}.\[--color-button-soft-foreground\:var\(--color-red-200\)\]{--color-button-soft-foreground:var(--color-red-200)}.\[--color-button-soft-foreground\:var\(--color-rose-200\)\]{--color-button-soft-foreground:var(--color-rose-200)}.\[--color-button-soft-foreground\:var\(--color-sky-200\)\]{--color-button-soft-foreground:var(--color-sky-200)}.\[--color-button-soft-foreground\:var\(--color-teal-200\)\]{--color-button-soft-foreground:var(--color-teal-200)}.\[--color-button-soft-foreground\:var\(--color-violet-200\)\]{--color-button-soft-foreground:var(--color-violet-200)}.\[--color-button-soft-foreground\:var\(--color-yellow-200\)\]{--color-button-soft-foreground:var(--color-yellow-200)}.\[--color-button-soft\:var\(--color-amber-400\)\]{--color-button-soft:var(--color-amber-400)}.\[--color-button-soft\:var\(--color-blue-400\)\]{--color-button-soft:var(--color-blue-400)}.\[--color-button-soft\:var\(--color-cyan-400\)\]{--color-button-soft:var(--color-cyan-400)}.\[--color-button-soft\:var\(--color-emerald-400\)\]{--color-button-soft:var(--color-emerald-400)}.\[--color-button-soft\:var\(--color-fuchsia-400\)\]{--color-button-soft:var(--color-fuchsia-400)}.\[--color-button-soft\:var\(--color-green-400\)\]{--color-button-soft:var(--color-green-400)}.\[--color-button-soft\:var\(--color-indigo-400\)\]{--color-button-soft:var(--color-indigo-400)}.\[--color-button-soft\:var\(--color-lime-400\)\]{--color-button-soft:var(--color-lime-400)}.\[--color-button-soft\:var\(--color-orange-400\)\]{--color-button-soft:var(--color-orange-400)}.\[--color-button-soft\:var\(--color-pink-400\)\]{--color-button-soft:var(--color-pink-400)}.\[--color-button-soft\:var\(--color-purple-400\)\]{--color-button-soft:var(--color-purple-400)}.\[--color-button-soft\:var\(--color-red-400\)\]{--color-button-soft:var(--color-red-400)}.\[--color-button-soft\:var\(--color-rose-400\)\]{--color-button-soft:var(--color-rose-400)}.\[--color-button-soft\:var\(--color-sky-400\)\]{--color-button-soft:var(--color-sky-400)}.\[--color-button-soft\:var\(--color-teal-400\)\]{--color-button-soft:var(--color-teal-400)}.\[--color-button-soft\:var\(--color-violet-400\)\]{--color-button-soft:var(--color-violet-400)}.\[--color-button-soft\:var\(--color-yellow-400\)\]{--color-button-soft:var(--color-yellow-400)}.\[--color-button-strong\:var\(--color-amber-700\)\]{--color-button-strong:var(--color-amber-700)}.\[--color-button-strong\:var\(--color-blue-700\)\]{--color-button-strong:var(--color-blue-700)}.\[--color-button-strong\:var\(--color-cyan-700\)\]{--color-button-strong:var(--color-cyan-700)}.\[--color-button-strong\:var\(--color-emerald-700\)\]{--color-button-strong:var(--color-emerald-700)}.\[--color-button-strong\:var\(--color-fuchsia-700\)\]{--color-button-strong:var(--color-fuchsia-700)}.\[--color-button-strong\:var\(--color-green-700\)\]{--color-button-strong:var(--color-green-700)}.\[--color-button-strong\:var\(--color-indigo-700\)\]{--color-button-strong:var(--color-indigo-700)}.\[--color-button-strong\:var\(--color-lime-700\)\]{--color-button-strong:var(--color-lime-700)}.\[--color-button-strong\:var\(--color-orange-700\)\]{--color-button-strong:var(--color-orange-700)}.\[--color-button-strong\:var\(--color-pink-700\)\]{--color-button-strong:var(--color-pink-700)}.\[--color-button-strong\:var\(--color-purple-700\)\]{--color-button-strong:var(--color-purple-700)}.\[--color-button-strong\:var\(--color-red-700\)\]{--color-button-strong:var(--color-red-700)}.\[--color-button-strong\:var\(--color-rose-700\)\]{--color-button-strong:var(--color-rose-700)}.\[--color-button-strong\:var\(--color-sky-700\)\]{--color-button-strong:var(--color-sky-700)}.\[--color-button-strong\:var\(--color-teal-700\)\]{--color-button-strong:var(--color-teal-700)}.\[--color-button-strong\:var\(--color-violet-700\)\]{--color-button-strong:var(--color-violet-700)}.\[--color-button-strong\:var\(--color-yellow-700\)\]{--color-button-strong:var(--color-yellow-700)}.\[--color-button-tint\:var\(--color-amber-50\)\]{--color-button-tint:var(--color-amber-50)}.\[--color-button-tint\:var\(--color-blue-50\)\]{--color-button-tint:var(--color-blue-50)}.\[--color-button-tint\:var\(--color-cyan-50\)\]{--color-button-tint:var(--color-cyan-50)}.\[--color-button-tint\:var\(--color-emerald-50\)\]{--color-button-tint:var(--color-emerald-50)}.\[--color-button-tint\:var\(--color-fuchsia-50\)\]{--color-button-tint:var(--color-fuchsia-50)}.\[--color-button-tint\:var\(--color-green-50\)\]{--color-button-tint:var(--color-green-50)}.\[--color-button-tint\:var\(--color-indigo-50\)\]{--color-button-tint:var(--color-indigo-50)}.\[--color-button-tint\:var\(--color-lime-50\)\]{--color-button-tint:var(--color-lime-50)}.\[--color-button-tint\:var\(--color-orange-50\)\]{--color-button-tint:var(--color-orange-50)}.\[--color-button-tint\:var\(--color-pink-50\)\]{--color-button-tint:var(--color-pink-50)}.\[--color-button-tint\:var\(--color-purple-50\)\]{--color-button-tint:var(--color-purple-50)}.\[--color-button-tint\:var\(--color-red-50\)\]{--color-button-tint:var(--color-red-50)}.\[--color-button-tint\:var\(--color-rose-50\)\]{--color-button-tint:var(--color-rose-50)}.\[--color-button-tint\:var\(--color-sky-50\)\]{--color-button-tint:var(--color-sky-50)}.\[--color-button-tint\:var\(--color-teal-50\)\]{--color-button-tint:var(--color-teal-50)}.\[--color-button-tint\:var\(--color-violet-50\)\]{--color-button-tint:var(--color-violet-50)}.\[--color-button-tint\:var\(--color-yellow-50\)\]{--color-button-tint:var(--color-yellow-50)}.\[--flux-carousel-fade-left\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,calc\(100\%-var\(--flux-carousel-scroll-percentage\)\)\)\]{--flux-carousel-fade-left:max(calc(100% - var(--flux-carousel-fade-size)), calc(100% - var(--flux-carousel-scroll-percentage)))}.\[--flux-carousel-fade-right\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,var\(--flux-carousel-scroll-percentage\)\)\]{--flux-carousel-fade-right:max(calc(100% - var(--flux-carousel-fade-size)), var(--flux-carousel-scroll-percentage))}.\[--flux-carousel-fade-size\:4rem\]{--flux-carousel-fade-size:4rem}.\[--flux-carousel-scroll-percentage\:0\%\]{--flux-carousel-scroll-percentage:0%}.\[--flux-flyout-translate\:translateX\(-50px\)\]{--flux-flyout-translate:translateX(-50px)}.\[--flux-flyout-translate\:translateX\(50px\)\]{--flux-flyout-translate:translateX(50px)}.\[--flux-flyout-translate\:translateY\(50px\)\]{--flux-flyout-translate:translateY(50px)}.\[--flux-progress-color\:var\(--color-accent\)\]{--flux-progress-color:var(--color-accent)}.\[--flux-progress-color\:var\(--color-amber-600\)\]{--flux-progress-color:var(--color-amber-600)}.\[--flux-progress-color\:var\(--color-blue-600\)\]{--flux-progress-color:var(--color-blue-600)}.\[--flux-progress-color\:var\(--color-cyan-600\)\]{--flux-progress-color:var(--color-cyan-600)}.\[--flux-progress-color\:var\(--color-emerald-600\)\]{--flux-progress-color:var(--color-emerald-600)}.\[--flux-progress-color\:var\(--color-fuchsia-600\)\]{--flux-progress-color:var(--color-fuchsia-600)}.\[--flux-progress-color\:var\(--color-green-600\)\]{--flux-progress-color:var(--color-green-600)}.\[--flux-progress-color\:var\(--color-indigo-600\)\]{--flux-progress-color:var(--color-indigo-600)}.\[--flux-progress-color\:var\(--color-lime-600\)\]{--flux-progress-color:var(--color-lime-600)}.\[--flux-progress-color\:var\(--color-orange-600\)\]{--flux-progress-color:var(--color-orange-600)}.\[--flux-progress-color\:var\(--color-pink-600\)\]{--flux-progress-color:var(--color-pink-600)}.\[--flux-progress-color\:var\(--color-purple-600\)\]{--flux-progress-color:var(--color-purple-600)}.\[--flux-progress-color\:var\(--color-red-600\)\]{--flux-progress-color:var(--color-red-600)}.\[--flux-progress-color\:var\(--color-rose-600\)\]{--flux-progress-color:var(--color-rose-600)}.\[--flux-progress-color\:var\(--color-sky-600\)\]{--flux-progress-color:var(--color-sky-600)}.\[--flux-progress-color\:var\(--color-teal-600\)\]{--flux-progress-color:var(--color-teal-600)}.\[--flux-progress-color\:var\(--color-violet-600\)\]{--flux-progress-color:var(--color-violet-600)}.\[--flux-progress-color\:var\(--color-yellow-600\)\]{--flux-progress-color:var(--color-yellow-600)}.\[--flux-scroll-percentage\:0\%\]{--flux-scroll-percentage:0%}.\[--haze-border\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_80\%\)\]{--haze-border:#1a254033}@supports (color:color-mix(in lab,red,red)){.\[--haze-border\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_80\%\)\]{--haze-border:color-mix(in oklab, var(--color-accent-content), transparent 80%)}}.\[--haze-light\:color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_98\%\)\]{--haze-light:#1a254005}@supports (color:color-mix(in lab,red,red)){.\[--haze-light\:color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_98\%\)\]{--haze-light:color-mix(in oklab, var(--color-accent), transparent 98%)}}.\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_97\.5\%\)\]{--haze:#1a254006}@supports (color:color-mix(in lab,red,red)){.\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_97\.5\%\)\]{--haze:color-mix(in oklab, var(--color-accent-content), transparent 97.5%)}}.\[--hover-fill\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]{--hover-fill:#1a25401a}@supports (color:color-mix(in lab,red,red)){.\[--hover-fill\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]{--hover-fill:color-mix(in oklab, var(--color-accent-content), transparent 90%)}}.\[grid-area\:aside\]{grid-area:aside}.\[grid-area\:footer\]{grid-area:footer}.\[grid-area\:header\]{grid-area:header}.\[grid-area\:main\]{grid-area:main}.\[grid-area\:sidebar\]{grid-area:sidebar}.\[print-color-adjust\:exact\]{-webkit-print-color-adjust:exact;print-color-adjust:exact}.\[text-shadow\:inherit\]{text-shadow:inherit}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.\[word-spacing\:inherit\]{word-spacing:inherit}.ring-inset{--tw-ring-inset:inset}:is(.\*\:col-start-1>*){grid-column-start:1}:is(.\*\:row-start-1>*){grid-row-start:1}:is(.\*\:h-auto>*){height:auto}:is(.\*\:bg-zinc-200>*){background-color:var(--color-zinc-200)}:is(.\*\:p-1\.5>*){padding:calc(var(--spacing) * 1.5)}:is(.\*\: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))}:is(.\*\*\:ring-white *){--tw-ring-color:var(--color-white)}:is(.\*\:not-first\:-ml-2>*):not(:first-child){margin-left:calc(var(--spacing) * -2)}.not-first-of-type\:mt-1:not(:first-of-type){margin-top:var(--spacing)}.not-in-data-flux-sidebar-collapsed-desktop\:hidden:not(:where([data-flux-sidebar-collapsed-desktop]) *){display:none}.not-in-data-loading\:opacity-0:not(:where([data-loading]) *){opacity:0}.not-in-data-\[ready\]\:hidden:not(:where([data-ready]) *){display:none}.not-in-\[tr\:first-child\]\:border-t:not(:where(:is(tr:first-child)) *){border-top-style:var(--tw-border-style);border-top-width:1px}.not-data-open\:hidden:not([data-open]){display:none}@supports not ((-moz-appearance:none)){.not-\[\@supports\(-moz-appearance\:none\)\]\:hidden{display:none}}.group-last\/breadcrumb\:hidden:is(:where(.group\/breadcrumb):last-child *){display:none}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:bg-zinc-400:is(:where(.group):hover *){background-color:var(--color-zinc-400)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:text-zinc-500:is(:where(.group):hover *){color:var(--color-zinc-500)}.group-hover\:text-zinc-800:is(:where(.group):hover *){color:var(--color-zinc-800)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/accordion-heading\:text-zinc-800:is(:where(.group\/accordion-heading):hover *){color:var(--color-zinc-800)}.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/sortable\:text-zinc-800:is(:where(.group\/sortable):hover *){color:var(--color-zinc-800)}.group-hover\/sortable\:opacity-100:is(:where(.group\/sortable):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-active\/item\:text-zinc-800:is(:where(.group\/item)[data-active] *){color:var(--color-zinc-800)}.group-data-checked\:block:is(:where(.group)[data-checked] *){display:block}.group-data-checked\:hidden:is(:where(.group)[data-checked] *){display:none}.group-data-checked\:translate-x-\[0\.9375rem\]:is(:where(.group)[data-checked] *){--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-checked\:bg-\(--color-accent-foreground\):is(:where(.group)[data-checked] *){background-color:var(--color-accent-foreground)}.group-data-checked\/menu-checkbox\:block:is(:where(.group\/menu-checkbox)[data-checked] *),.group-data-checked\/menu-radio\:block:is(:where(.group\/menu-radio)[data-checked] *){display:block}.group-data-invert\/toast\:border-zinc-700:is(:where(.group\/toast)[data-invert] *){border-color:var(--color-zinc-700)}.group-data-invert\/toast\:bg-white\/10:is(:where(.group\/toast)[data-invert] *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:bg-white\/10:is(:where(.group\/toast)[data-invert] *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.group-data-invert\/toast\:bg-zinc-800:is(:where(.group\/toast)[data-invert] *){background-color:var(--color-zinc-800)}.group-data-invert\/toast\:text-white:is(:where(.group\/toast)[data-invert] *){color:var(--color-white)}.group-data-invert\/toast\:decoration-white\/20:is(:where(.group\/toast)[data-invert] *){text-decoration-color:#fff3}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:decoration-white\/20:is(:where(.group\/toast)[data-invert] *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.group-data-open\/accordion-heading\:block:is(:where(.group\/accordion-heading)[data-open] *){display:block}.group-data-open\/accordion-heading\:hidden:is(:where(.group\/accordion-heading)[data-open] *){display:none}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-selected\:bg-zinc-800:is(:where(.group)[data-selected] *){background-color:var(--color-zinc-800)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.before\:z-10:before{content:var(--tw-content);z-index:10}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.before\:animate-\[flux-shimmer_2s_infinite\]:before{content:var(--tw-content);animation:2s infinite flux-shimmer}.before\:bg-gradient-to-r:before{content:var(--tw-content);--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{content:var(--tw-content);--tw-gradient-via:var(--flux-shimmer-color)}@supports (color:color-mix(in lab,red,red)){.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{--tw-gradient-via:color-mix(in oklab, var(--flux-shimmer-color) 50%, transparent)}}.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:-inset-px:after{content:var(--tw-content);top:-1px;right:-1px;bottom:-1px;left:-1px}.after\:inset-0:after{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.after\:inset-\[3px\]:after{content:var(--tw-content);top:3px;right:3px;bottom:3px;left:3px}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.after\:rounded-\[1px\]:after{content:var(--tw-content);border-radius:1px}.after\:rounded-\[2px\]:after{content:var(--tw-content);border-radius:2px}.after\:rounded-\[calc\(var\(--flux-card-radius\)-1px\)\]:after{content:var(--tw-content);border-radius:calc(var(--flux-card-radius) - 1px)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:rounded-lg:after{content:var(--tw-content);border-radius:var(--radius-lg)}.after\:rounded-md:after{content:var(--tw-content);border-radius:var(--radius-md)}.after\:rounded-sm:after{content:var(--tw-content);border-radius:var(--radius-sm)}.after\:rounded-xl:after{content:var(--tw-content);border-radius:var(--radius-xl)}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:\[mask-image\:linear-gradient\(to_bottom\,black\,transparent\)\]:after{content:var(--tw-content);-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.after\:inset-ring:after,.after\:inset-ring-\[1px\]:after{content:var(--tw-content);--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-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)}.after\:inset-ring-black\/7:after{content:var(--tw-content);--tw-inset-ring-color:#00000012}@supports (color:color-mix(in lab,red,red)){.after\:inset-ring-black\/7:after{--tw-inset-ring-color:color-mix(in oklab, var(--color-black) 7%, transparent)}}.after\:content-\[var\(--flux-file-upload-progress-as-string\)\]:after{--tw-content:var(--flux-file-upload-progress-as-string);content:var(--tw-content)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:sticky:first-child{position:sticky}.first\:left-0:first-child{left:0}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:ps-0:first-child{padding-inline-start:0}.first\:pt-0:first-child{padding-top:0}.first\:after\:pointer-events-none:first-child:after{content:var(--tw-content);pointer-events:none}.first\:after\:absolute:first-child:after{content:var(--tw-content);position:absolute}.first\:after\:inset-y-0:first-child:after{content:var(--tw-content);inset-block:0}.first\:after\:right-0:first-child:after{content:var(--tw-content);right:0}.first\:after\:w-8:first-child:after{content:var(--tw-content);width:calc(var(--spacing) * 8)}.first\:after\:translate-x-full:first-child:after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.last\:sticky:last-child{position:sticky}.last\:right-0:last-child{right:0}.last\:bottom-0:last-child{bottom:0}.last\:z-20:last-child{z-index:20}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pe-0:last-child{padding-inline-end:0}.last\:pe-2:last-child{padding-inline-end:calc(var(--spacing) * 2)}.last\:pb-0:last-child{padding-bottom:0}.last\:after\:pointer-events-none:last-child:after{content:var(--tw-content);pointer-events:none}.last\:after\:absolute:last-child:after{content:var(--tw-content);position:absolute}.last\:after\:inset-y-0:last-child:after{content:var(--tw-content);inset-block:0}.last\:after\:left-0:last-child:after{content:var(--tw-content);left:0}.last\:after\:w-8:last-child:after{content:var(--tw-content);width:calc(var(--spacing) * 8)}.last\:after\:-translate-x-full:last-child:after{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.first-of-type\:rounded-s-lg:first-of-type{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.last-of-type\:rounded-e-lg:last-of-type{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_28\%\,_var\(--color-zinc-200\)\)\]:hover{border-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_28\%\,_var\(--color-zinc-200\)\)\]:hover{border-color:color-mix(in oklab,var(--color-button-border) 28%,var(--color-zinc-200))}}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-\[var\(--haze-border\)\]:hover{border-color:var(--haze-border)}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-200:hover{border-color:var(--color-zinc-200)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-button-border\)_36\%\,_var\(--color-zinc-200\)\)\]:hover{border-bottom-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-button-border\)_36\%\,_var\(--color-zinc-200\)\)\]:hover{border-bottom-color:color-mix(in oklab,var(--color-button-border) 36%,var(--color-zinc-200))}}.hover\:bg-\(--color-button-tint\):hover{background-color:var(--color-button-tint)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#1a2540e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 70%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 80%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)_6\%\,_white\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)_6\%\,_white\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft) 6%,white)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\:bg-zinc-800\/5:hover{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:bg-zinc-800\/10:hover{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/10:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.hover\:bg-zinc-800\/\[4\%\]:hover{background-color:#2431520a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/\[4\%\]:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 4%,transparent)}}.hover\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%231f2937\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:hover{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%231f2937%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.hover\:bg-\[length\:16px_16px\]:hover{background-size:16px 16px}.hover\:text-\(--color-button-strong\):hover{color:var(--color-button-strong)}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-500:hover{color:var(--color-zinc-500)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-800\!:hover{color:var(--color-zinc-800)!important}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-current:hover{text-decoration-color:currentColor}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-data-invert\/toast\:hover\:bg-white\/15:is(:where(.group\/toast)[data-invert] *):hover{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:hover\:bg-white\/15:is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.group-data-invert\/toast\:hover\:bg-white\/20:is(:where(.group\/toast)[data-invert] *):hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:hover\:bg-white\/20:is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.group-data-invert\/toast\:hover\:text-white:is(:where(.group\/toast)[data-invert] *):hover{color:var(--color-white)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}.hover\:after\:bg-\[var\(--haze-light\)\]:hover:after{content:var(--tw-content);background-color:var(--haze-light)}}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:border-zinc-200:focus{border-color:var(--color-zinc-200)}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:text-zinc-800:focus{color:var(--color-zinc-800)}.focus\:opacity-100:focus{opacity:1}.focus\:ring:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-offset-\[revert\]:focus{outline-offset:revert}.focus\:outline-\[revert\]:focus{outline-color:revert}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:active{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:active{background-color:color-mix(in oklab,var(--color-button-soft),transparent 70%)}}.active\:bg-gray-100:active{background-color:var(--color-gray-100)}.active\:text-gray-500:active{color:var(--color-gray-500)}.active\:text-gray-700:active{color:var(--color-gray-700)}.active\:text-gray-800:active{color:var(--color-gray-800)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:border-zinc-200:disabled{border-color:var(--color-zinc-200)}.disabled\:border-b-zinc-200:disabled{border-bottom-color:var(--color-zinc-200)}.disabled\:text-zinc-400:disabled{color:var(--color-zinc-400)}.disabled\:text-zinc-500:disabled{color:var(--color-zinc-500)}.disabled\:placeholder-zinc-400:disabled::placeholder{color:var(--color-zinc-400)}.disabled\:placeholder-zinc-400\/70:disabled::placeholder{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){.disabled\:placeholder-zinc-400\/70:disabled::placeholder{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-75:disabled{opacity:.75}.disabled\:shadow-none:disabled{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.disabled\:shadow-xs\!:disabled{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}:where([data-checked]) .in-data-checked\:text-\(--color-accent-content\){color:var(--color-accent-content)}:where([data-checked]) .in-data-checked\:text-zinc-500{color:var(--color-zinc-500)}:where([data-checked]) .in-data-checked\:text-zinc-800{color:var(--color-zinc-800)}@media(hover:hover){:where([data-checked]) .in-data-checked\:group-hover\:text-zinc-800:is(:where(.group):hover *){color:var(--color-zinc-800)}}:where([data-dragging]) .in-data-dragging\:border-zinc-300{border-color:var(--color-zinc-300)}:where([data-dragging]) .in-data-dragging\:bg-zinc-100{background-color:var(--color-zinc-100)}:where([data-dragging]) .in-data-dragging\:text-zinc-800{color:var(--color-zinc-800)}:where([data-flux-menu]) .in-data-flux-menu\:block{display:block}:where([data-flux-menu]) .in-data-flux-menu\:px-2{padding-inline:calc(var(--spacing) * 2)}:where([data-flux-menu]) .in-data-flux-menu\:text-zinc-400{color:var(--color-zinc-400)}:where([data-flux-menu]) .in-data-flux-menu\:text-zinc-800{color:var(--color-zinc-800)}@media(hover:hover){:where([data-flux-menu]) .in-data-flux-menu\:hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:absolute{position:absolute}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:hidden{display:none}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:w-10{width:calc(var(--spacing) * 10)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:cursor-e-resize{cursor:e-resize}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:justify-center{justify-content:center}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:px-0{padding-inline:0}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:px-3{padding-inline:calc(var(--spacing) * 3)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:opacity-0{opacity:0}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-menu\:w-10:not(:where([data-flux-menu]) *){width:calc(var(--spacing) * 10)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-menu\:justify-center:not(:where([data-flux-menu]) *){justify-content:center}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-sidebar-group-dropdown\:hidden:not(:where([data-flux-sidebar-group-dropdown]) *){display:none}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:absolute){position:absolute}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:opacity-0){opacity:0}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:opacity-100){opacity:1}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:hidden{display:none}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:w-auto\!{width:auto!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:bg-white\!{background-color:var(--color-white)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:px-2\!{padding-inline:calc(var(--spacing) * 2)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:text-zinc-400\!{color:var(--color-zinc-400)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:text-zinc-800\!{color:var(--color-zinc-800)!important}@media(hover:hover){:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:hover\:bg-zinc-50\!:hover{background-color:var(--color-zinc-50)!important}}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:focus\:outline-hidden\!:focus{--tw-outline-style:none!important;outline-style:none!important}@media(forced-colors:active){:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:focus\:outline-hidden\!:focus{outline-offset:2px!important;outline:2px solid #0000!important}}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) :is(:where([data-flux-sidebar-header]) .in-data-flux-sidebar-header\:in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:hidden)),:where([data-flux-sidebar-on-mobile]) .in-data-flux-sidebar-on-mobile\:hidden{display:none}:where([data-flux-sidebar-on-mobile]) .in-data-flux-sidebar-on-mobile\:h-10{height:calc(var(--spacing) * 10)}:where([data-loading]) .in-data-loading\:opacity-0{opacity:0}:where([data-loading]) .in-data-loading\:opacity-100{opacity:1}:where([data-open]) .in-data-open\:bg-zinc-800\/5{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){:where([data-open]) .in-data-open\:bg-zinc-800\/5{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}:where([data-open]) .in-data-open\:text-zinc-800{color:var(--color-zinc-800)}:where([data-scrolled-left]) .in-data-scrolled-left\:last\:after\:inset-shadow-\[-8px_0px_8px_-8px_rgba\(0\,0\,0\,0\.05\)\]:last-child:after{content:var(--tw-content);--tw-inset-shadow:inset -8px 0px 8px -8px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where([data-scrolled-right]) .in-data-scrolled-right\:first\:after\:inset-shadow-\[8px_0px_8px_-8px_rgba\(0\,0\,0\,0\.05\)\]:first-child:after{content:var(--tw-content);--tw-inset-shadow:inset 8px 0px 8px -8px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where([data-at-end]) .in-data-\[at-end\]\:pointer-events-none{pointer-events:none}:where([data-at-end]) .in-data-\[at-end\]\:opacity-0{opacity:0}:where([data-at-start]) .in-data-\[at-start\]\:pointer-events-none{pointer-events:none}:where([data-at-start]) .in-data-\[at-start\]\:opacity-0{opacity:0}:where([data-flux-timeline-size=lg]) .in-data-\[flux-timeline-size\=lg\]\:text-zinc-800{color:var(--color-zinc-800)}:where(.group\/center-align) .in-\[\.group\\\/center-align\]\:justify-center{justify-content:center}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:-ms-8{margin-inline-start:calc(var(--spacing) * -8)}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:-me-2{margin-inline-end:calc(var(--spacing) * -2)}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:flex-row-reverse{flex-direction:row-reverse}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:justify-end{justify-content:flex-end}:where(:is(data-target)) .in-\[data-target\]\:text-start{text-align:start}:where(:is(ui-toast-group)) .in-\[ui-toast-group\]\:w-xs{width:var(--container-xs)}.has-focus-within\:z-10:has(:focus-within){z-index:10}.has-focus-visible\:outline-2:has(:focus-visible){outline-style:var(--tw-outline-style);outline-width:2px}.has-focus-visible\:outline-offset-\[-1px\]:has(:focus-visible){outline-offset:-1px}.has-focus-visible\:outline-\[-webkit-focus-ring-color\]:has(:focus-visible){outline-color:-webkit-focus-ring-color}.has-data-flux-navlist-badge\:not-in-data-flux-sidebar-collapsed-desktop\:pe-1\.5:has([data-flux-navlist-badge]):not(:where([data-flux-sidebar-collapsed-desktop]) *){padding-inline-end:calc(var(--spacing) * 1.5)}.has-data-flux-slider-tick-line\:mt-1:has([data-flux-slider-tick-line]){margin-top:var(--spacing)}.has-data-flux-toast-action\:gap-2:has([data-flux-toast-action]){gap:calc(var(--spacing) * 2)}.has-data-invalid\:border-red-500:has([data-invalid]){border-color:var(--color-red-500)}.has-data-invalid\:outline-red-500\!:has([data-invalid]){outline-color:var(--color-red-500)!important}.has-data-\[circle\=true\]\:rounded-full:has([data-circle=true]){border-radius:3.40282e38px}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\[data-flux-control\]\~\[data-flux-label\]\]\:grid-cols-\[auto_1fr\]:has(:is([data-flux-control]~[data-flux-label])){grid-template-columns:auto 1fr}.has-\[\[data-flux-label\]\~\[data-flux-control\]\]\:grid-cols-\[1fr_auto\]:has(:is([data-flux-label]~[data-flux-control])){grid-template-columns:1fr auto}.has-\[option\.placeholder\:checked\]\:text-zinc-400:has(:is(option.placeholder:checked)){color:var(--color-zinc-400)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:text-accent-foreground[aria-selected=true]{color:var(--color-accent-foreground)}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-active\:bg-red-50[data-active]{background-color:var(--color-red-50)}.data-active\:bg-zinc-50[data-active]{background-color:var(--color-zinc-50)}.data-active\:bg-zinc-100[data-active]{background-color:var(--color-zinc-100)}.data-active\:text-red-600[data-active]{color:var(--color-red-600)}.data-active\:text-zinc-500[data-active]{color:var(--color-zinc-500)}.data-active\:opacity-100[data-active]{opacity:1}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:data-active\:bg-zinc-50\![data-active]{background-color:var(--color-zinc-50)!important}:where([data-flux-slider-tick-position=inside]) .in-data-\[flux-slider-tick-position\=inside\]\:data-active\:text-white\/50[data-active]{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){:where([data-flux-slider-tick-position=inside]) .in-data-\[flux-slider-tick-position\=inside\]\:data-active\:text-white\/50[data-active]{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.data-at-end\:pointer-events-none[data-at-end]{pointer-events:none}.data-at-end\:opacity-50[data-at-end]{opacity:.5}.data-at-start\:pointer-events-none[data-at-start]{pointer-events:none}.data-at-start\:opacity-50[data-at-start]{opacity:.5}.data-checked\:border-0[data-checked]{border-style:var(--tw-border-style);border-width:0}.data-checked\:border-\(--color-accent\)[data-checked]{border-color:var(--color-accent)}.data-checked\:border-zinc-800[data-checked]{border-color:var(--color-zinc-800)}.data-checked\:bg-\(--color-accent\)[data-checked]{background-color:var(--color-accent)}.data-checked\:bg-white[data-checked]{background-color:var(--color-white)}.data-checked\:bg-zinc-50[data-checked]{background-color:var(--color-zinc-50)}.data-checked\:bg-zinc-800[data-checked]{background-color:var(--color-zinc-800)}.data-checked\:text-\(--color-accent-foreground\)[data-checked]{color:var(--color-accent-foreground)}.data-checked\:text-white[data-checked]{color:var(--color-white)}.data-checked\:text-zinc-500[data-checked]{color:var(--color-zinc-500)}.data-checked\:text-zinc-800[data-checked]{color:var(--color-zinc-800)}.data-checked\:shadow-xs[data-checked]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-checked\:after\:bg-\(--haze\)[data-checked]:after{content:var(--tw-content);background-color:var(--haze)}@media(hover:hover){.hover\:data-checked\:border-\(--color-accent\):hover[data-checked]{border-color:var(--color-accent)}.hover\:data-checked\:bg-\(--color-accent\):hover[data-checked]{background-color:var(--color-accent)}.data-checked\:hover\:text-zinc-800[data-checked]:hover{color:var(--color-zinc-800)}.hover\:data-checked\:text-\(--color-accent-foreground\):hover[data-checked]{color:var(--color-accent-foreground)}.hover\:data-checked\:after\:bg-\(--haze\):hover[data-checked]:after{content:var(--tw-content);background-color:var(--haze)}}.data-current\:border[data-current]{border-style:var(--tw-border-style);border-width:1px}.data-current\:border-zinc-200[data-current]{border-color:var(--color-zinc-200)}.data-current\:bg-white[data-current]{background-color:var(--color-white)}.data-current\:bg-zinc-800\/\[4\%\][data-current]{background-color:#2431520a}@supports (color:color-mix(in lab,red,red)){.data-current\:bg-zinc-800\/\[4\%\][data-current]{background-color:color-mix(in oklab,var(--color-zinc-800) 4%,transparent)}}.data-current\:text-\(--color-accent-content\)[data-current]{color:var(--color-accent-content)}.data-current\:text-zinc-800[data-current]{color:var(--color-zinc-800)}.data-current\:shadow-xs[data-current]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-current\:after\:absolute[data-current]:after{content:var(--tw-content);position:absolute}.data-current\:after\:inset-x-0[data-current]:after{content:var(--tw-content);inset-inline:0}.data-current\:after\:-bottom-3[data-current]:after{content:var(--tw-content);bottom:calc(var(--spacing) * -3)}.data-current\:after\:h-\[2px\][data-current]:after{content:var(--tw-content);height:2px}.data-current\:after\:bg-\(--color-accent-content\)[data-current]:after{content:var(--tw-content);background-color:var(--color-accent-content)}.data-current\:after\:bg-zinc-800[data-current]:after{content:var(--tw-content);background-color:var(--color-zinc-800)}@media(hover:hover){.hover\:data-current\:bg-\(--hover-fill\):hover[data-current]{background-color:var(--hover-fill)}.hover\:data-current\:text-\(--color-accent-content\):hover[data-current]{color:var(--color-accent-content)}}.data-end\:rounded-e-lg[data-end],.data-end-preview\:rounded-e-lg[data-end-preview]{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}:is(.\*\*\:data-flux-badge-icon\:me-1 *)[data-flux-badge-icon]{margin-inline-end:var(--spacing)}:is(.\*\*\:data-flux-badge-icon\:me-1\.5 *)[data-flux-badge-icon]{margin-inline-end:calc(var(--spacing) * 1.5)}:is(.\*\*\:data-flux-badge-icon\:me-2 *)[data-flux-badge-icon]{margin-inline-end:calc(var(--spacing) * 2)}:is(.\*\:data-flux-field\:mb-3>*)[data-flux-field]{margin-bottom:calc(var(--spacing) * 3)}:is(.\*\:data-flux-input\:grow>*)[data-flux-input]{flex-grow:1}:is(.\*\:data-flux-label\:mb-3>*)[data-flux-label]{margin-bottom:calc(var(--spacing) * 3)}.data-flux-loading\:pointer-events-none[data-flux-loading]{pointer-events:none}:is(.\*\*\:data-flux-menu-item-icon\:text-zinc-400 *)[data-flux-menu-item-icon]{color:var(--color-zinc-400)}.data-flux-sidebar-collapsed-desktop\:w-14[data-flux-sidebar-collapsed-desktop]{width:calc(var(--spacing) * 14)}.data-flux-sidebar-collapsed-desktop\:cursor-e-resize[data-flux-sidebar-collapsed-desktop]{cursor:e-resize}.data-flux-sidebar-collapsed-desktop\:px-2[data-flux-sidebar-collapsed-desktop]{padding-inline:calc(var(--spacing) * 2)}.data-flux-sidebar-on-mobile\:fixed\![data-flux-sidebar-on-mobile]{position:fixed!important}.data-flux-sidebar-on-mobile\:start-0\![data-flux-sidebar-on-mobile]{inset-inline-start:calc(var(--spacing) * 0)!important}.data-flux-sidebar-on-mobile\:top-0\![data-flux-sidebar-on-mobile]{top:0!important}.data-flux-sidebar-on-mobile\:max-h-dvh\![data-flux-sidebar-on-mobile]{max-height:100dvh!important}.data-flux-sidebar-on-mobile\:min-h-dvh\![data-flux-sidebar-on-mobile]{min-height:100dvh!important}.data-flux-sidebar-on-mobile\:not-data-flux-sidebar-collapsed-mobile\:block[data-flux-sidebar-on-mobile]:not([data-flux-sidebar-collapsed-mobile]){display:block}.data-flux-sidebar-on-mobile\:data-flux-sidebar-collapsed-mobile\:-translate-x-full[data-flux-sidebar-on-mobile][data-flux-sidebar-collapsed-mobile]{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\*\:data-flux-table-sortable\:last\:me-0 *)[data-flux-table-sortable]:last-child{margin-inline-end:0}.data-hidden\:hidden[data-hidden]{display:none}.data-in-range\:bg-zinc-100[data-in-range]{background-color:var(--color-zinc-100)}.data-indeterminate\:border-transparent[data-indeterminate]{border-color:#0000}.data-invalid\:border-s-0[data-invalid]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.data-invalid\:border-red-500[data-invalid]{border-color:var(--color-red-500)}.data-invalid\:text-red-500[data-invalid]{color:var(--color-red-500)}.data-invalid\:shadow-none[data-invalid]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-invalid\:outline-red-500[data-invalid]{outline-color:var(--color-red-500)}.disabled\:data-invalid\:border-red-500:disabled[data-invalid]{border-color:var(--color-red-500)}.data-loading\:pointer-events-none[data-loading]{pointer-events:none}.data-loading\:opacity-50[data-loading]{opacity:.5}.data-match\:text-zinc-800[data-match]{color:var(--color-zinc-800)}:is(.\*\*\:data-navmenu-icon\:text-zinc-400 *)[data-navmenu-icon]{color:var(--color-zinc-400)}.data-open\:block[data-open]{display:block}.data-open\:text-zinc-800[data-open]{color:var(--color-zinc-800)}.data-outside\:opacity-50[data-outside]{opacity:.5}.data-selected\:border-\(--color-accent-content\)[data-selected]{border-color:var(--color-accent-content)}.data-selected\:border-zinc-800[data-selected]{border-color:var(--color-zinc-800)}.data-selected\:bg-\(--color-accent\)[data-selected]{background-color:var(--color-accent)}.data-selected\:bg-white[data-selected]{background-color:var(--color-white)}.data-selected\:bg-zinc-800[data-selected]{background-color:var(--color-zinc-800)}.data-selected\:text-\(--color-accent-content\)[data-selected]{color:var(--color-accent-content)}.data-selected\:text-\(--color-accent-foreground\)[data-selected]{color:var(--color-accent-foreground)}.data-selected\:text-white[data-selected]{color:var(--color-white)}.data-selected\:text-zinc-800[data-selected]{color:var(--color-zinc-800)}.data-selected\:shadow-xs[data-selected]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.hover\:data-selected\:bg-\(--color-accent\):hover[data-selected]{background-color:var(--color-accent)}.hover\:data-selected\:text-\(--color-accent-content\):hover[data-selected]{color:var(--color-accent-content)}.hover\:data-selected\:text-\(--color-accent-foreground\):hover[data-selected]{color:var(--color-accent-foreground)}}.data-start\:rounded-s-lg[data-start]{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.data-unavailable\:line-through[data-unavailable]{text-decoration-line:line-through}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\]\:ring-2[data-selected]{--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)}.data-\[selected\]\:ring-\(--color-accent\)[data-selected]{--tw-ring-color:var(--color-accent)}.data-\[selected\]\:ring-offset-1[data-selected]{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--color-accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\*\:data-\[slot\=avatar\]\:ring-4 *)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + 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)}:is(.\*\*\:data-\[slot\=avatar\]\:data-\[size\=sm\]\:ring-2 *)[data-slot=avatar][data-size=sm],:is(.\*\*\:data-\[slot\=avatar\]\:data-\[size\=xs\]\:ring-2 *)[data-slot=avatar][data-size=xs]{--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)}:is(.\*\*\:data-\[slot\=content\]\:p-2\! *)[data-slot=content]{padding:calc(var(--spacing) * 2)!important}:is(.\*\*\:data-\[slot\=content\]\:text-base\! *)[data-slot=content]{font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}:is(.\*\*\:data-\[slot\=content\]\:text-zinc-700 *)[data-slot=content]{color:var(--color-zinc-700)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:var(--color-accent)}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:64rem){.max-lg\:data-flux-sidebar-cloak\:hidden[data-flux-sidebar-cloak]{display:none}}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media not all and (min-width:40rem){.max-sm\:fixed\!{position:fixed!important}.max-sm\:inset-0\!{top:0!important;right:0!important;bottom:0!important;left:0!important}.max-sm\:hidden{display:none}.max-sm\:max-h-full\!{max-height:100%!important}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-2{top:calc(var(--spacing) * 2)}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:top-full{top:100%}.sm\:right-0{right:0}.sm\:right-3{right:calc(var(--spacing) * 3)}.sm\:bottom-0{bottom:0}.sm\:bottom-2{bottom:calc(var(--spacing) * 2)}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:bottom-auto{bottom:auto}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.sm\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.sm\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.sm\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.sm\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.sm\:size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.sm\:size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.sm\:size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.sm\:size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.sm\:h-8{height:calc(var(--spacing) * 8)}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-6\!{width:calc(var(--spacing) * 6)!important}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[11\.25rem\]{width:11.25rem}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[110px_1fr\]{grid-template-columns:110px 1fr}.sm\:grid-cols-\[160px_160px_1fr\]{grid-template-columns:160px 160px 1fr}.sm\:grid-cols-\[160px_160px_1fr_auto\]{grid-template-columns:160px 160px 1fr auto}.sm\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-2{padding:calc(var(--spacing) * 2)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-10{padding-block:calc(var(--spacing) * 10)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:ps-2{padding-inline-start:calc(var(--spacing) * 2)}.sm\:ps-5{padding-inline-start:calc(var(--spacing) * 5)}.sm\:pe-8{padding-inline-end:calc(var(--spacing) * 8)}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.sm\: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)}.sm\:backdrop\:bg-transparent::backdrop{background-color:#0000}.first\:sm\:pl-0:first-child{padding-left:0}:where(:is(ui-toast-group)) .sm\:in-\[ui-toast-group\]\:w-sm{width:var(--container-sm)}:is(.sm\:\*\*\:data-\[slot\=content\]\:text-sm\! *)[data-slot=content]{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:m-2{margin:calc(var(--spacing) * 2)}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overscroll-contain{overscroll-behavior:contain}.lg\:rounded-xl{border-radius:var(--radius-xl)}.lg\:border{border-style:var(--tw-border-style);border-width:1px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}@container not (min-width:28rem){.\@max-md\:py-2{padding-block:calc(var(--spacing) * 2)}}@container (min-width:28rem){.\@md\:m-\[-2px\]{margin:-2px}.\@md\:flex{display:flex}.\@md\:flex-row-reverse{flex-direction:row-reverse}.\@md\:justify-end{justify-content:flex-end}.\@md\:ps-4{padding-inline-start:calc(var(--spacing) * 4)}.\@md\:pe-4{padding-inline-end:calc(var(--spacing) * 4)}}@container (min-width:40rem){.\@\[40rem\]\:flex{display:flex}.\@\[40rem\]\:hidden{display:none}}.rtl\:right-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:0}.rtl\:right-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(var(--spacing) * 3)}.rtl\:right-\[-44px\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:-44px}.rtl\:right-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:auto}.rtl\:left-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:0}.rtl\:left-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:calc(var(--spacing) * 3)}.rtl\:left-\[-44px\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:-44px}.rtl\:left-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:auto}.rtl\:mr-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:0}.rtl\:mr-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:auto}.rtl\:ml-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:ml-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:auto}.rtl\:block:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:block}.rtl\:hidden:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:none}.rtl\:inline:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:inline}.rtl\:-translate-x-1\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-translate-x-\[0\.1875rem\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -.1875rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:translate-x-1\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-scale-x-100:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x: -100% ;scale:var(--tw-scale-x) var(--tw-scale-y)}.rtl\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.rtl\:flex-row-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.rtl\:mask-r-from-100\%:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:100%;-webkit-mask-composite:source-in;mask-composite:intersect}.rtl\:mask-l-from-\[max\(calc\(100\%-6rem\)\,var\(--flux-scroll-percentage\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-left:linear-gradient(to left, var(--tw-mask-left-from-color) var(--tw-mask-left-from-position), var(--tw-mask-left-to-color) var(--tw-mask-left-to-position));--tw-mask-left-from-position:max( calc(100% - 6rem) , var(--flux-scroll-percentage));-webkit-mask-composite:source-in;mask-composite:intersect}.rtl\:bg-position-\[left_\.25rem_center\]\!:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.25rem!important}.rtl\:text-right:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}.rtl\:\[--flux-carousel-fade-left\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,var\(--flux-carousel-scroll-percentage\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-carousel-fade-left:max(calc(100% - var(--flux-carousel-fade-size)), var(--flux-carousel-scroll-percentage))}.rtl\:\[--flux-carousel-fade-right\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,calc\(100\%-var\(--flux-carousel-scroll-percentage\)\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-carousel-fade-right:max(calc(100% - var(--flux-carousel-fade-size)), calc(100% - var(--flux-carousel-scroll-percentage)))}.rtl\:\[--flux-flyout-translate\:translateX\(-50px\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-flyout-translate:translateX(-50px)}.rtl\:\[--flux-flyout-translate\:translateX\(50px\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-flyout-translate:translateX(50px)}.rtl\:group-data-checked\:-translate-x-\[0\.9375rem\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.group)[data-checked] *){--tw-translate-x: -.9375rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-flux-sidebar-collapsed-desktop]) .rtl\:in-data-flux-sidebar-collapsed-desktop\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *),.rtl\:data-flux-sidebar-collapsed-desktop\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-flux-sidebar-collapsed-desktop]{cursor:w-resize}.data-flux-sidebar-on-mobile\:data-flux-sidebar-collapsed-mobile\:rtl\:translate-x-full[data-flux-sidebar-on-mobile][data-flux-sidebar-collapsed-mobile]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:block:where(.dark,.dark *){display:block}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:translate-x-\[0\.125rem\]:where(.dark,.dark *){--tw-translate-x:.125rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:scale-0:where(.dark,.dark *){--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100:where(.dark,.dark *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90:where(.dark,.dark *){rotate:-90deg}.dark\:rotate-0:where(.dark,.dark *){rotate:0deg}:where(.dark\:divide-white\/15:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border:where(.dark,.dark *){border-style:var(--tw-border-style);border-width:1px}.dark\:border-0:where(.dark,.dark *){border-style:var(--tw-border-style);border-width:0}.dark\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_22\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-color:#333b3e}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_22\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-accent-content) 22%,var(--color-zinc-600))}}.dark\:border-\[var\(--color-primary\)\]\/30:where(.dark,.dark *){border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30:where(.dark,.dark *){border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-gray-600:where(.dark,.dark *){border-color:var(--color-gray-600)}.dark\:border-green-500\/30:where(.dark,.dark *){border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30:where(.dark,.dark *){border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:border-white\/10:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:border-white\/10\!:where(.dark,.dark *){border-color:#ffffff1a!important}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10\!:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)!important}}.dark\:border-white\/15:where(.dark,.dark *){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-white\/20:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:border-zinc-500:where(.dark,.dark *){border-color:var(--color-zinc-500)}.dark\:border-zinc-600:where(.dark,.dark *){border-color:var(--color-zinc-600)}.dark\:border-zinc-700:where(.dark,.dark *){border-color:var(--color-zinc-700)}.dark\:border-zinc-800:where(.dark,.dark *){border-color:var(--color-zinc-800)}.dark\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_30\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-bottom-color:#30393e}@supports (color:color-mix(in lab,red,red)){.dark\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_30\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-bottom-color:color-mix(in oklab,var(--color-accent-content) 30%,var(--color-zinc-600))}}.dark\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *){background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-button-soft),transparent 60%)}}.dark\:bg-\[var\(--color-primary\)\]\/20:where(.dark,.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-400:where(.dark,.dark *){background-color:var(--color-amber-400)}.dark\:bg-amber-400\/40:where(.dark,.dark *){background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.dark\:bg-amber-500:where(.dark,.dark *){background-color:var(--color-amber-500)}.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-blue-400:where(.dark,.dark *){background-color:var(--color-blue-400)}.dark\:bg-blue-400\/40:where(.dark,.dark *){background-color:#54a2ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-400) 40%,transparent)}}.dark\:bg-blue-600:where(.dark,.dark *){background-color:var(--color-blue-600)}.dark\:bg-cyan-400:where(.dark,.dark *){background-color:var(--color-cyan-400)}.dark\:bg-cyan-400\/40:where(.dark,.dark *){background-color:#00d2ef66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-cyan-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-cyan-400) 40%,transparent)}}.dark\:bg-cyan-600:where(.dark,.dark *){background-color:var(--color-cyan-600)}.dark\:bg-emerald-400:where(.dark,.dark *){background-color:var(--color-emerald-400)}.dark\:bg-emerald-400\/40:where(.dark,.dark *){background-color:#00d29466}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-emerald-400) 40%,transparent)}}.dark\:bg-emerald-600:where(.dark,.dark *){background-color:var(--color-emerald-600)}.dark\:bg-fuchsia-400:where(.dark,.dark *){background-color:var(--color-fuchsia-400)}.dark\:bg-fuchsia-400\/40:where(.dark,.dark *){background-color:#ec6cff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-fuchsia-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-fuchsia-400) 40%,transparent)}}.dark\:bg-fuchsia-600:where(.dark,.dark *){background-color:var(--color-fuchsia-600)}.dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\:bg-gray-800:where(.dark,.dark *){background-color:var(--color-gray-800)}.dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--color-gray-900)}.dark\:bg-green-400:where(.dark,.dark *){background-color:var(--color-green-400)}.dark\:bg-green-400\/40:where(.dark,.dark *){background-color:#05df7266}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-400) 40%,transparent)}}.dark\:bg-green-500\/10:where(.dark,.dark *){background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-green-600:where(.dark,.dark *){background-color:var(--color-green-600)}.dark\:bg-indigo-400:where(.dark,.dark *){background-color:var(--color-indigo-400)}.dark\:bg-indigo-400\/40:where(.dark,.dark *){background-color:#7d87ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-400) 40%,transparent)}}.dark\:bg-indigo-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.dark\:bg-indigo-900:where(.dark,.dark *){background-color:var(--color-indigo-900)}.dark\:bg-lime-400:where(.dark,.dark *){background-color:var(--color-lime-400)}.dark\:bg-lime-400\/40:where(.dark,.dark *){background-color:#9de50066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-lime-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-lime-400) 40%,transparent)}}.dark\:bg-lime-600:where(.dark,.dark *){background-color:var(--color-lime-600)}.dark\:bg-neutral-700:where(.dark,.dark *){background-color:var(--color-neutral-700)}.dark\:bg-orange-400:where(.dark,.dark *){background-color:var(--color-orange-400)}.dark\:bg-orange-400\/40:where(.dark,.dark *){background-color:#ff8b1a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-orange-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-orange-400) 40%,transparent)}}.dark\:bg-orange-600:where(.dark,.dark *){background-color:var(--color-orange-600)}.dark\:bg-pink-400:where(.dark,.dark *){background-color:var(--color-pink-400)}.dark\:bg-pink-400\/40:where(.dark,.dark *){background-color:#fb64b666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-pink-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-pink-400) 40%,transparent)}}.dark\:bg-pink-600:where(.dark,.dark *){background-color:var(--color-pink-600)}.dark\:bg-purple-400:where(.dark,.dark *){background-color:var(--color-purple-400)}.dark\:bg-purple-400\/40:where(.dark,.dark *){background-color:#c07eff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-purple-400) 40%,transparent)}}.dark\:bg-purple-600:where(.dark,.dark *){background-color:var(--color-purple-600)}.dark\:bg-red-400:where(.dark,.dark *){background-color:var(--color-red-400)}.dark\:bg-red-400\/40:where(.dark,.dark *){background-color:#ff656866}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-400) 40%,transparent)}}.dark\:bg-red-600:where(.dark,.dark *){background-color:var(--color-red-600)}.dark\:bg-rose-400:where(.dark,.dark *){background-color:var(--color-rose-400)}.dark\:bg-rose-400\/40:where(.dark,.dark *){background-color:#ff667f66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-rose-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-rose-400) 40%,transparent)}}.dark\:bg-rose-600:where(.dark,.dark *){background-color:var(--color-rose-600)}.dark\:bg-sky-400:where(.dark,.dark *){background-color:var(--color-sky-400)}.dark\:bg-sky-400\/40:where(.dark,.dark *){background-color:#00bcfe66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-sky-400) 40%,transparent)}}.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-sky-600:where(.dark,.dark *){background-color:var(--color-sky-600)}.dark\:bg-teal-400:where(.dark,.dark *){background-color:var(--color-teal-400)}.dark\:bg-teal-400\/40:where(.dark,.dark *){background-color:#00d3bd66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-teal-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-teal-400) 40%,transparent)}}.dark\:bg-teal-600:where(.dark,.dark *){background-color:var(--color-teal-600)}.dark\:bg-transparent:where(.dark,.dark *){background-color:#0000}.dark\:bg-violet-400:where(.dark,.dark *){background-color:var(--color-violet-400)}.dark\:bg-violet-400\/40:where(.dark,.dark *){background-color:#a685ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-violet-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-violet-400) 40%,transparent)}}.dark\:bg-violet-600:where(.dark,.dark *){background-color:var(--color-violet-600)}.dark\:bg-white:where(.dark,.dark *){background-color:var(--color-white)}.dark\:bg-white\/5:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/5:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:bg-white\/10:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:bg-white\/10\!:where(.dark,.dark *){background-color:#ffffff1a!important}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10\!:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)!important}}.dark\:bg-white\/20:where(.dark,.dark *){background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:bg-white\/25:where(.dark,.dark *){background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/25:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.dark\:bg-white\/30:where(.dark,.dark *){background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]:where(.dark,.dark *){background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]:where(.dark,.dark *){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-white\/\[6\%\]:where(.dark,.dark *){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[6\%\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-400:where(.dark,.dark *){background-color:var(--color-yellow-400)}.dark\:bg-yellow-400\/40:where(.dark,.dark *){background-color:#fac80066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-400) 40%,transparent)}}.dark\:bg-yellow-900\/30:where(.dark,.dark *){background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-300:where(.dark,.dark *){background-color:var(--color-zinc-300)}.dark\:bg-zinc-400:where(.dark,.dark *){background-color:var(--color-zinc-400)}.dark\:bg-zinc-400\/40:where(.dark,.dark *){background-color:#8a918d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-zinc-400) 40%,transparent)}}.dark\:bg-zinc-600:where(.dark,.dark *){background-color:var(--color-zinc-600)}.dark\:bg-zinc-600\!:where(.dark,.dark *){background-color:var(--color-zinc-600)!important}.dark\:bg-zinc-700:where(.dark,.dark *){background-color:var(--color-zinc-700)}.dark\:bg-zinc-800:where(.dark,.dark *){background-color:var(--color-zinc-800)}.dark\:bg-zinc-900:where(.dark,.dark *){background-color:var(--color-zinc-900)}.dark\:bg-zinc-950:where(.dark,.dark *){background-color:var(--color-zinc-950)}.dark\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%23ffffff75\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:where(.dark,.dark *){background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%23ffffff75%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:bg-\[length\:16px_16px\]:where(.dark,.dark *){background-size:16px 16px}.dark\:bg-clip-border:where(.dark,.dark *){background-clip:border-box}.dark\:text-\(--color-accent-content\):where(.dark,.dark *){color:var(--color-accent-content)}.dark\:text-\(--color-button-muted\):where(.dark,.dark *){color:var(--color-button-muted)}.dark\:text-\(--color-button-soft-foreground\):where(.dark,.dark *){color:var(--color-button-soft-foreground)}.dark\:text-\[color-mix\(in_oklab\,_var\(--color-button-muted\)\,_var\(--color-zinc-400\)_48\%\)\]:where(.dark,.dark *){color:var(--color-button-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:text-\[color-mix\(in_oklab\,_var\(--color-button-muted\)\,_var\(--color-zinc-400\)_48\%\)\]:where(.dark,.dark *){color:color-mix(in oklab,var(--color-button-muted),var(--color-zinc-400) 48%)}}.dark\:text-\[var\(--callout-icon\)\]:where(.dark,.dark *){color:var(--callout-icon)}.dark\:text-amber-100:where(.dark,.dark *){color:var(--color-amber-100)}.dark\:text-amber-200:where(.dark,.dark *){color:var(--color-amber-200)}.dark\:text-amber-300:where(.dark,.dark *){color:var(--color-amber-300)}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-amber-500:where(.dark,.dark *){color:var(--color-amber-500)}.dark\:text-black:where(.dark,.dark *){color:var(--color-black)}.dark\:text-blue-200:where(.dark,.dark *){color:var(--color-blue-200)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-cyan-200:where(.dark,.dark *){color:var(--color-cyan-200)}.dark\:text-cyan-400:where(.dark,.dark *){color:var(--color-cyan-400)}.dark\:text-emerald-200:where(.dark,.dark *){color:var(--color-emerald-200)}.dark\:text-emerald-400:where(.dark,.dark *){color:var(--color-emerald-400)}.dark\:text-fuchsia-200:where(.dark,.dark *){color:var(--color-fuchsia-200)}.dark\:text-fuchsia-400:where(.dark,.dark *){color:var(--color-fuchsia-400)}.dark\:text-gray-200:where(.dark,.dark *){color:var(--color-gray-200)}.dark\:text-gray-300:where(.dark,.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:where(.dark,.dark *){color:var(--color-gray-400)}.dark\:text-gray-600:where(.dark,.dark *){color:var(--color-gray-600)}.dark\:text-green-100:where(.dark,.dark *){color:var(--color-green-100)}.dark\:text-green-200:where(.dark,.dark *){color:var(--color-green-200)}.dark\:text-green-500:where(.dark,.dark *){color:var(--color-green-500)}.dark\:text-indigo-200:where(.dark,.dark *){color:var(--color-indigo-200)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-lime-200:where(.dark,.dark *){color:var(--color-lime-200)}.dark\:text-lime-400:where(.dark,.dark *){color:var(--color-lime-400)}.dark\:text-lime-500:where(.dark,.dark *){color:var(--color-lime-500)}.dark\:text-orange-200:where(.dark,.dark *){color:var(--color-orange-200)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-pink-200:where(.dark,.dark *){color:var(--color-pink-200)}.dark\:text-pink-400:where(.dark,.dark *){color:var(--color-pink-400)}.dark\:text-purple-200:where(.dark,.dark *){color:var(--color-purple-200)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.dark\:text-red-200:where(.dark,.dark *){color:var(--color-red-200)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-rose-200:where(.dark,.dark *){color:var(--color-rose-200)}.dark\:text-rose-400:where(.dark,.dark *){color:var(--color-rose-400)}.dark\:text-sky-100:where(.dark,.dark *){color:var(--color-sky-100)}.dark\:text-sky-200:where(.dark,.dark *){color:var(--color-sky-200)}.dark\:text-sky-400:where(.dark,.dark *){color:var(--color-sky-400)}.dark\:text-teal-200:where(.dark,.dark *){color:var(--color-teal-200)}.dark\:text-teal-400:where(.dark,.dark *){color:var(--color-teal-400)}.dark\:text-violet-200:where(.dark,.dark *){color:var(--color-violet-200)}.dark\:text-violet-400:where(.dark,.dark *){color:var(--color-violet-400)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-white\!:where(.dark,.dark *){color:var(--color-white)!important}.dark\:text-white\/15:where(.dark,.dark *){color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/15:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:text-white\/25:where(.dark,.dark *){color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/25:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.dark\:text-white\/40:where(.dark,.dark *){color:#fff6}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/40:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.dark\:text-white\/50:where(.dark,.dark *){color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/50:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.dark\:text-white\/60:where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:text-white\/70:where(.dark,.dark *){color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.dark\:text-white\/80:where(.dark,.dark *){color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-yellow-200:where(.dark,.dark *){color:var(--color-yellow-200)}.dark\:text-yellow-500:where(.dark,.dark *){color:var(--color-yellow-500)}.dark\:text-zinc-100:where(.dark,.dark *){color:var(--color-zinc-100)}.dark\:text-zinc-200:where(.dark,.dark *){color:var(--color-zinc-200)}.dark\:text-zinc-200\!:where(.dark,.dark *){color:var(--color-zinc-200)!important}.dark\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}.dark\:text-zinc-300\/80:where(.dark,.dark *){color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-300\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.dark\:text-zinc-300\/95:where(.dark,.dark *){color:#cfc8b5f2}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-300\/95:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-300) 95%,transparent)}}.dark\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}.dark\:text-zinc-400\/80:where(.dark,.dark *){color:#8a918dcc}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-400\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-400) 80%,transparent)}}.dark\:text-zinc-500:where(.dark,.dark *){color:var(--color-zinc-500)}.dark\:text-zinc-500\!:where(.dark,.dark *){color:var(--color-zinc-500)!important}.dark\:text-zinc-500\/90:where(.dark,.dark *){color:#5a6360e6}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-500\/90:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-500) 90%,transparent)}}.dark\:text-zinc-600:where(.dark,.dark *){color:var(--color-zinc-600)}.dark\:text-zinc-800:where(.dark,.dark *){color:var(--color-zinc-800)}.dark\:text-zinc-950:where(.dark,.dark *){color:var(--color-zinc-950)}.dark\:decoration-white\/20:where(.dark,.dark *){text-decoration-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:decoration-white\/20:where(.dark,.dark *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:placeholder-white\/60:where(.dark,.dark *)::placeholder{color:#fff9}@supports (color:color-mix(in lab,red,red)){.dark\:placeholder-white\/60:where(.dark,.dark *)::placeholder{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:placeholder-zinc-400:where(.dark,.dark *)::placeholder{color:var(--color-zinc-400)}.dark\:shadow-none:where(.dark,.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:ring-black\/30:where(.dark,.dark *){--tw-ring-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.dark\:ring-black\/30:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:ring-zinc-700:where(.dark,.dark *){--tw-ring-color:var(--color-zinc-700)}.dark\:ring-zinc-900:where(.dark,.dark *){--tw-ring-color:var(--color-zinc-900)}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-amber-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-blue-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d2ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-cyan-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d2941a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-emerald-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ec6cff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-fuchsia-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#05df721a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-green-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#7d87ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-indigo-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#9de5001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-lime-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-orange-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fb64b61a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-pink-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#c07eff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-purple-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff65681a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-red-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff667f1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-rose-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00bcfe1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-sky-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d3bd1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-teal-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#a685ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-violet-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fac8001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-yellow-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-zinc-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#8a918d1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-zinc-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-zinc-400),transparent 90%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fcbb0080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-amber-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-blue-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d2ef80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-cyan-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d29480}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-emerald-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ec6cff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-fuchsia-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#05df7280}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-green-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-indigo-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#9de50080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-lime-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-orange-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fb64b680}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-pink-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#c07eff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-purple-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff656880}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-red-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff667f80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-rose-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-sky-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d3bd80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-teal-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#a685ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-violet-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-white\)\,transparent_95\%\)\]:where(.dark,.dark *){--callout-border:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-white\)\,transparent_95\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-white),transparent 95%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fac80080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-yellow-400),transparent 50%)}}.dark\:\[--callout-heading\:var\(--color-amber-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-amber-200)}.dark\:\[--callout-heading\:var\(--color-blue-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-blue-200)}.dark\:\[--callout-heading\:var\(--color-cyan-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-cyan-200)}.dark\:\[--callout-heading\:var\(--color-emerald-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-emerald-200)}.dark\:\[--callout-heading\:var\(--color-fuchsia-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-fuchsia-200)}.dark\:\[--callout-heading\:var\(--color-green-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-green-200)}.dark\:\[--callout-heading\:var\(--color-indigo-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-indigo-200)}.dark\:\[--callout-heading\:var\(--color-lime-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-lime-200)}.dark\:\[--callout-heading\:var\(--color-orange-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-orange-200)}.dark\:\[--callout-heading\:var\(--color-pink-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-pink-200)}.dark\:\[--callout-heading\:var\(--color-purple-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-purple-200)}.dark\:\[--callout-heading\:var\(--color-red-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-red-200)}.dark\:\[--callout-heading\:var\(--color-rose-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-rose-200)}.dark\:\[--callout-heading\:var\(--color-sky-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-sky-200)}.dark\:\[--callout-heading\:var\(--color-teal-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-teal-200)}.dark\:\[--callout-heading\:var\(--color-violet-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-violet-200)}.dark\:\[--callout-heading\:var\(--color-yellow-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-yellow-200)}.dark\:\[--callout-heading\:var\(--color-zinc-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-zinc-200)}.dark\:\[--callout-icon\:var\(--color-amber-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-amber-400)}.dark\:\[--callout-icon\:var\(--color-blue-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-blue-400)}.dark\:\[--callout-icon\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-cyan-400)}.dark\:\[--callout-icon\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-emerald-400)}.dark\:\[--callout-icon\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-fuchsia-400)}.dark\:\[--callout-icon\:var\(--color-green-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-green-400)}.dark\:\[--callout-icon\:var\(--color-indigo-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-indigo-400)}.dark\:\[--callout-icon\:var\(--color-lime-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-lime-400)}.dark\:\[--callout-icon\:var\(--color-orange-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-orange-400)}.dark\:\[--callout-icon\:var\(--color-pink-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-pink-400)}.dark\:\[--callout-icon\:var\(--color-purple-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-purple-400)}.dark\:\[--callout-icon\:var\(--color-red-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-red-400)}.dark\:\[--callout-icon\:var\(--color-rose-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-rose-400)}.dark\:\[--callout-icon\:var\(--color-sky-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-sky-400)}.dark\:\[--callout-icon\:var\(--color-teal-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-teal-400)}.dark\:\[--callout-icon\:var\(--color-violet-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-violet-400)}.dark\:\[--callout-icon\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-yellow-400)}.dark\:\[--callout-icon\:var\(--color-zinc-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-zinc-400)}.dark\:\[--callout-text\:var\(--color-amber-300\)\]:where(.dark,.dark *){--callout-text:var(--color-amber-300)}.dark\:\[--callout-text\:var\(--color-blue-300\)\]:where(.dark,.dark *){--callout-text:var(--color-blue-300)}.dark\:\[--callout-text\:var\(--color-cyan-300\)\]:where(.dark,.dark *){--callout-text:var(--color-cyan-300)}.dark\:\[--callout-text\:var\(--color-emerald-300\)\]:where(.dark,.dark *){--callout-text:var(--color-emerald-300)}.dark\:\[--callout-text\:var\(--color-fuchsia-300\)\]:where(.dark,.dark *){--callout-text:var(--color-fuchsia-300)}.dark\:\[--callout-text\:var\(--color-green-300\)\]:where(.dark,.dark *){--callout-text:var(--color-green-300)}.dark\:\[--callout-text\:var\(--color-indigo-300\)\]:where(.dark,.dark *){--callout-text:var(--color-indigo-300)}.dark\:\[--callout-text\:var\(--color-lime-300\)\]:where(.dark,.dark *){--callout-text:var(--color-lime-300)}.dark\:\[--callout-text\:var\(--color-orange-300\)\]:where(.dark,.dark *){--callout-text:var(--color-orange-300)}.dark\:\[--callout-text\:var\(--color-pink-300\)\]:where(.dark,.dark *){--callout-text:var(--color-pink-300)}.dark\:\[--callout-text\:var\(--color-purple-300\)\]:where(.dark,.dark *){--callout-text:var(--color-purple-300)}.dark\:\[--callout-text\:var\(--color-red-300\)\]:where(.dark,.dark *){--callout-text:var(--color-red-300)}.dark\:\[--callout-text\:var\(--color-rose-300\)\]:where(.dark,.dark *){--callout-text:var(--color-rose-300)}.dark\:\[--callout-text\:var\(--color-sky-300\)\]:where(.dark,.dark *){--callout-text:var(--color-sky-300)}.dark\:\[--callout-text\:var\(--color-teal-300\)\]:where(.dark,.dark *){--callout-text:var(--color-teal-300)}.dark\:\[--callout-text\:var\(--color-violet-300\)\]:where(.dark,.dark *){--callout-text:var(--color-violet-300)}.dark\:\[--callout-text\:var\(--color-yellow-300\)\]:where(.dark,.dark *){--callout-text:var(--color-yellow-300)}.dark\:\[--callout-text\:var\(--color-zinc-300\)\]:where(.dark,.dark *){--callout-text:var(--color-zinc-300)}.dark\:\[--color-accent-content\:var\(--color-amber-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-amber-400)}.dark\:\[--color-accent-content\:var\(--color-blue-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-blue-400)}.dark\:\[--color-accent-content\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-cyan-400)}.dark\:\[--color-accent-content\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-emerald-400)}.dark\:\[--color-accent-content\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-fuchsia-400)}.dark\:\[--color-accent-content\:var\(--color-green-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-green-400)}.dark\:\[--color-accent-content\:var\(--color-indigo-300\)\]:where(.dark,.dark *){--color-accent-content:var(--color-indigo-300)}.dark\:\[--color-accent-content\:var\(--color-lime-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-lime-400)}.dark\:\[--color-accent-content\:var\(--color-orange-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-orange-400)}.dark\:\[--color-accent-content\:var\(--color-pink-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-pink-400)}.dark\:\[--color-accent-content\:var\(--color-purple-300\)\]:where(.dark,.dark *){--color-accent-content:var(--color-purple-300)}.dark\:\[--color-accent-content\:var\(--color-red-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-red-400)}.dark\:\[--color-accent-content\:var\(--color-rose-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-rose-400)}.dark\:\[--color-accent-content\:var\(--color-sky-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-sky-400)}.dark\:\[--color-accent-content\:var\(--color-teal-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-teal-400)}.dark\:\[--color-accent-content\:var\(--color-violet-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-violet-400)}.dark\:\[--color-accent-content\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent-content:var(--color-white)}.dark\:\[--color-accent-content\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-yellow-400)}.dark\:\[--color-accent-foreground\:var\(--color-amber-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-amber-950)}.dark\:\[--color-accent-foreground\:var\(--color-gray-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-gray-800)}.dark\:\[--color-accent-foreground\:var\(--color-lime-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-lime-950)}.dark\:\[--color-accent-foreground\:var\(--color-mauve-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-mauve-800)}.dark\:\[--color-accent-foreground\:var\(--color-mist-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-mist-800)}.dark\:\[--color-accent-foreground\:var\(--color-neutral-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-neutral-800)}.dark\:\[--color-accent-foreground\:var\(--color-olive-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-olive-800)}.dark\:\[--color-accent-foreground\:var\(--color-orange-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-orange-950)}.dark\:\[--color-accent-foreground\:var\(--color-slate-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-slate-800)}.dark\:\[--color-accent-foreground\:var\(--color-stone-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-stone-800)}.dark\:\[--color-accent-foreground\:var\(--color-taupe-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-taupe-800)}.dark\:\[--color-accent-foreground\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-white)}.dark\:\[--color-accent-foreground\:var\(--color-yellow-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-yellow-950)}.dark\:\[--color-accent-foreground\:var\(--color-zinc-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-zinc-800)}.dark\:\[--color-accent\:var\(--color-amber-400\)\]:where(.dark,.dark *){--color-accent:var(--color-amber-400)}.dark\:\[--color-accent\:var\(--color-blue-500\)\]:where(.dark,.dark *){--color-accent:var(--color-blue-500)}.dark\:\[--color-accent\:var\(--color-cyan-600\)\]:where(.dark,.dark *){--color-accent:var(--color-cyan-600)}.dark\:\[--color-accent\:var\(--color-emerald-600\)\]:where(.dark,.dark *){--color-accent:var(--color-emerald-600)}.dark\:\[--color-accent\:var\(--color-fuchsia-600\)\]:where(.dark,.dark *){--color-accent:var(--color-fuchsia-600)}.dark\:\[--color-accent\:var\(--color-green-600\)\]:where(.dark,.dark *){--color-accent:var(--color-green-600)}.dark\:\[--color-accent\:var\(--color-indigo-500\)\]:where(.dark,.dark *){--color-accent:var(--color-indigo-500)}.dark\:\[--color-accent\:var\(--color-lime-400\)\]:where(.dark,.dark *){--color-accent:var(--color-lime-400)}.dark\:\[--color-accent\:var\(--color-orange-400\)\]:where(.dark,.dark *){--color-accent:var(--color-orange-400)}.dark\:\[--color-accent\:var\(--color-pink-600\)\]:where(.dark,.dark *){--color-accent:var(--color-pink-600)}.dark\:\[--color-accent\:var\(--color-purple-500\)\]:where(.dark,.dark *){--color-accent:var(--color-purple-500)}.dark\:\[--color-accent\:var\(--color-red-500\)\]:where(.dark,.dark *){--color-accent:var(--color-red-500)}.dark\:\[--color-accent\:var\(--color-rose-500\)\]:where(.dark,.dark *){--color-accent:var(--color-rose-500)}.dark\:\[--color-accent\:var\(--color-sky-600\)\]:where(.dark,.dark *){--color-accent:var(--color-sky-600)}.dark\:\[--color-accent\:var\(--color-teal-600\)\]:where(.dark,.dark *){--color-accent:var(--color-teal-600)}.dark\:\[--color-accent\:var\(--color-violet-500\)\]:where(.dark,.dark *){--color-accent:var(--color-violet-500)}.dark\:\[--color-accent\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent:var(--color-white)}.dark\:\[--color-accent\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--color-accent:var(--color-yellow-400)}.dark\:\[--flux-progress-color\:var\(--color-amber-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-amber-400)}.dark\:\[--flux-progress-color\:var\(--color-blue-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-blue-400)}.dark\:\[--flux-progress-color\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-cyan-400)}.dark\:\[--flux-progress-color\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-emerald-400)}.dark\:\[--flux-progress-color\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-fuchsia-400)}.dark\:\[--flux-progress-color\:var\(--color-green-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-green-400)}.dark\:\[--flux-progress-color\:var\(--color-indigo-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-indigo-400)}.dark\:\[--flux-progress-color\:var\(--color-lime-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-lime-400)}.dark\:\[--flux-progress-color\:var\(--color-orange-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-orange-400)}.dark\:\[--flux-progress-color\:var\(--color-pink-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-pink-400)}.dark\:\[--flux-progress-color\:var\(--color-purple-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-purple-400)}.dark\:\[--flux-progress-color\:var\(--color-red-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-red-400)}.dark\:\[--flux-progress-color\:var\(--color-rose-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-rose-400)}.dark\:\[--flux-progress-color\:var\(--color-sky-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-sky-400)}.dark\:\[--flux-progress-color\:var\(--color-teal-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-teal-400)}.dark\:\[--flux-progress-color\:var\(--color-violet-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-violet-400)}.dark\:\[--flux-progress-color\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-yellow-400)}.dark\:\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]:where(.dark,.dark *){--haze:#1a25401a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]:where(.dark,.dark *){--haze:color-mix(in oklab, var(--color-accent-content), transparent 90%)}}:is(.dark\:\*\:bg-zinc-700:where(.dark,.dark *)>*){background-color:var(--color-zinc-700)}:is(.\*\*\:dark\:ring-zinc-900 *):where(.dark,.dark *){--tw-ring-color:var(--color-zinc-900)}@media(hover:hover){.dark\:group-hover\:bg-white\/50:where(.dark,.dark *):is(:where(.group):hover *){background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.dark\:group-hover\:bg-white\/50:where(.dark,.dark *):is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.dark\:group-hover\:text-white:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-white)}.dark\:group-hover\:text-zinc-400:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-zinc-400)}.dark\:group-hover\/accordion-heading\:text-white:where(.dark,.dark *):is(:where(.group\/accordion-heading):hover *),.dark\:group-hover\/sortable\:text-white:where(.dark,.dark *):is(:where(.group\/sortable):hover *){color:var(--color-white)}}.dark\:group-data-active\/item\:text-white:where(.dark,.dark *):is(:where(.group\/item)[data-active] *){color:var(--color-white)}.dark\:group-data-checked\:translate-x-\[0\.9375rem\]:where(.dark,.dark *):is(:where(.group)[data-checked] *){--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:group-data-invert\/toast\:border-zinc-200:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-color:var(--color-zinc-200)}.dark\:group-data-invert\/toast\:border-b-zinc-300\/80:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-bottom-color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:border-b-zinc-300\/80:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-bottom-color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.dark\:group-data-invert\/toast\:bg-white:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:var(--color-white)}.dark\:group-data-invert\/toast\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.dark\:group-data-invert\/toast\:text-zinc-800:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){color:var(--color-zinc-800)}.dark\:group-data-invert\/toast\:decoration-zinc-800\/20:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){text-decoration-color:#24315233}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:decoration-zinc-800\/20:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent)}}.dark\:group-data-selected\:bg-white:where(.dark,.dark *):is(:where(.group)[data-selected] *){background-color:var(--color-white)}.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{content:var(--tw-content);--tw-gradient-via:var(--flux-shimmer-color)}@supports (color:color-mix(in lab,red,red)){.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{--tw-gradient-via:color-mix(in oklab, var(--flux-shimmer-color) 50%, transparent)}}.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:after\:hidden:where(.dark,.dark *):after{content:var(--tw-content);display:none}.dark\:after\:bg-zinc-900:where(.dark,.dark *):after{content:var(--tw-content);background-color:var(--color-zinc-900)}.dark\:after\:inset-ring-white\/10:where(.dark,.dark *):after{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:after\:inset-ring-white\/10:where(.dark,.dark *):after{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}@media(hover:hover){.dark\:hover\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_32\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-color:#30383e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_32\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-color:color-mix(in oklab,var(--color-accent-content) 32%,var(--color-zinc-600))}}.dark\:hover\:border-white\/10:where(.dark,.dark *):hover{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-white\/10:where(.dark,.dark *):hover{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:hover\:border-zinc-500:where(.dark,.dark *):hover{border-color:var(--color-zinc-500)}.dark\:hover\:border-zinc-600:where(.dark,.dark *):hover{border-color:var(--color-zinc-600)}.dark\:hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_40\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-bottom-color:#2d363e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_40\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-bottom-color:color-mix(in oklab,var(--color-accent-content) 40%,var(--color-zinc-600))}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_10\%\,_var\(--color-zinc-700\)\)\]:where(.dark,.dark *):hover{background-color:#1a2020}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_10\%\,_var\(--color-zinc-700\)\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-accent-content) 10%,var(--color-zinc-700))}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-deep\)\,_transparent_28\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-deep)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-deep\)\,_transparent_28\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-deep),transparent 28%)}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 50%)}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 60%)}}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:where(.dark,.dark *):hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:where(.dark,.dark *):hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:where(.dark,.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-900:where(.dark,.dark *):hover{background-color:var(--color-gray-900)}.dark\:hover\:bg-red-400\/20:where(.dark,.dark *):hover{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-400\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.dark\:hover\:bg-red-500:where(.dark,.dark *):hover{background-color:var(--color-red-500)}.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:hover\:bg-white\/15:where(.dark,.dark *):hover{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/15:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:hover\:bg-white\/\[7\%\]:where(.dark,.dark *):hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:bg-zinc-600:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)}.dark\:hover\:bg-zinc-600\/75:where(.dark,.dark *):hover{background-color:#3a413dbf}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-600\/75:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-zinc-600) 75%,transparent)}}.dark\:hover\:bg-zinc-700:where(.dark,.dark *):hover{background-color:var(--color-zinc-700)}.dark\:hover\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%23ffffff\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:where(.dark,.dark *):hover{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%23ffffff%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.dark\:hover\:bg-\[length\:16px_16px\]:where(.dark,.dark *):hover{background-size:16px 16px}.dark\:hover\:text-\(--color-button-muted\):where(.dark,.dark *):hover{color:var(--color-button-muted)}.dark\:hover\:text-gray-200:where(.dark,.dark *):hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:where(.dark,.dark *):hover{color:var(--color-gray-300)}.dark\:hover\:text-red-400:where(.dark,.dark *):hover{color:var(--color-red-400)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}.dark\:hover\:text-white\!:where(.dark,.dark *):hover{color:var(--color-white)!important}.dark\:hover\:text-zinc-100:where(.dark,.dark *):hover{color:var(--color-zinc-100)}.dark\:hover\:text-zinc-200:where(.dark,.dark *):hover{color:var(--color-zinc-200)}.dark\:hover\:text-zinc-300:where(.dark,.dark *):hover{color:var(--color-zinc-300)}.dark\:hover\:ring-white\/20:where(.dark,.dark *):hover{--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:ring-white\/20:where(.dark,.dark *):hover{--tw-ring-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.dark\:hover\:ring-zinc-600:where(.dark,.dark *):hover{--tw-ring-color:var(--color-zinc-600)}.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/10:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/10:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.dark\:group-data-invert\/toast\:hover\:text-zinc-800:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{color:var(--color-zinc-800)}.dark\:hover\:after\:bg-white\/\[4\%\]:where(.dark,.dark *):hover:after{content:var(--tw-content);background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:after\:bg-white\/\[4\%\]:where(.dark,.dark *):hover:after{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}}.dark\:focus\:border-blue-700:where(.dark,.dark *):focus{border-color:var(--color-blue-700)}.dark\:focus\:border-blue-800:where(.dark,.dark *):focus{border-color:var(--color-blue-800)}.dark\:focus\:border-zinc-600:where(.dark,.dark *):focus{border-color:var(--color-zinc-600)}.dark\:focus\:text-white:where(.dark,.dark *):focus{color:var(--color-white)}.dark\:active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):active{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):active{background-color:color-mix(in oklab,var(--color-button-soft),transparent 50%)}}.dark\:active\:bg-gray-700:where(.dark,.dark *):active{background-color:var(--color-gray-700)}.dark\:active\:text-gray-300:where(.dark,.dark *):active{color:var(--color-gray-300)}.dark\:disabled\:border-white\/5:where(.dark,.dark *):disabled{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:border-white\/5:where(.dark,.dark *):disabled{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:disabled\:border-zinc-600:where(.dark,.dark *):disabled{border-color:var(--color-zinc-600)}.dark\:disabled\:bg-white\/\[7\%\]:where(.dark,.dark *):disabled{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[7\%\]:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:disabled\:bg-white\/\[7\%\]\!:where(.dark,.dark *):disabled{background-color:#ffffff12!important}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[7\%\]\!:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)!important}}.dark\:disabled\:bg-white\/\[9\%\]:where(.dark,.dark *):disabled{background-color:#ffffff17}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[9\%\]:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 9%,transparent)}}.dark\:disabled\:text-zinc-400:where(.dark,.dark *):disabled{color:var(--color-zinc-400)}.dark\:disabled\:placeholder-white\/40:where(.dark,.dark *):disabled::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:placeholder-white\/40:where(.dark,.dark *):disabled::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.dark\:disabled\:placeholder-zinc-500:where(.dark,.dark *):disabled::placeholder{color:var(--color-zinc-500)}.dark\:disabled\:opacity-50:where(.dark,.dark *):disabled{opacity:.5}.dark\:disabled\:opacity-75:where(.dark,.dark *):disabled{opacity:.75}.dark\:disabled\:shadow-none\!:where(.dark,.dark *):disabled{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}:where([data-checked]) .dark\:in-data-checked\:text-\(--color-accent-content\):where(.dark,.dark *){color:var(--color-accent-content)}:where([data-checked]) .dark\:in-data-checked\:text-white:where(.dark,.dark *){color:var(--color-white)}:where([data-checked]) .dark\:in-data-checked\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}@media(hover:hover){:where([data-checked]) .dark\:in-data-checked\:group-hover\:text-white:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-white)}}:where([data-dragging]) .dark\:in-data-dragging\:border-white\/20:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){:where([data-dragging]) .dark\:in-data-dragging\:border-white\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}:where([data-dragging]) .dark\:in-data-dragging\:bg-white\/15:where(.dark,.dark *){background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where([data-dragging]) .dark\:in-data-dragging\:bg-white\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where([data-dragging]) .dark\:in-data-dragging\:text-white:where(.dark,.dark *),:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white:where(.dark,.dark *){color:var(--color-white)}:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white\/80:where(.dark,.dark *){color:#fffc}@supports (color:color-mix(in lab,red,red)){:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)}}@media(hover:hover){:where([data-flux-menu]) .dark\:in-data-flux-menu\:hover\:bg-zinc-600:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)}}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:bg-transparent\!:where(.dark,.dark *){background-color:#0000!important}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\!:where(.dark,.dark *){color:var(--color-white)!important}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\/80\!:where(.dark,.dark *){color:#fffc!important}@supports (color:color-mix(in lab,red,red)){:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\/80\!:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)!important}}@media(hover:hover){:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:hover\:bg-zinc-600\!:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)!important}}:where([data-open]) .dark\:in-data-open\:bg-white\/15:where(.dark,.dark *){background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where([data-open]) .dark\:in-data-open\:bg-white\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where([data-open]) .dark\:in-data-open\:text-white:where(.dark,.dark *),:where([data-flux-timeline-size=lg]) .dark\:in-data-\[flux-timeline-size\=lg\]\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:has-\[option\.placeholder\:checked\]\:text-zinc-400:where(.dark,.dark *):has(:is(option.placeholder:checked)){color:var(--color-zinc-400)}.dark\:data-active\:bg-red-400\/20:where(.dark,.dark *)[data-active]{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark\:data-active\:bg-red-400\/20:where(.dark,.dark *)[data-active]{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.dark\:data-active\:bg-zinc-600:where(.dark,.dark *)[data-active]{background-color:var(--color-zinc-600)}.dark\:data-active\:text-red-400:where(.dark,.dark *)[data-active]{color:var(--color-red-400)}.dark\:data-active\:text-white:where(.dark,.dark *)[data-active]{color:var(--color-white)}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:data-active\:bg-zinc-600\!:where(.dark,.dark *)[data-active]{background-color:var(--color-zinc-600)!important}.dark\:data-checked\:border-white:where(.dark,.dark *)[data-checked]{border-color:var(--color-white)}.dark\:data-checked\:bg-white:where(.dark,.dark *)[data-checked]{background-color:var(--color-white)}.dark\:data-checked\:bg-white\/15:where(.dark,.dark *)[data-checked]{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:data-checked\:bg-white\/15:where(.dark,.dark *)[data-checked]{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:data-checked\:bg-white\/20:where(.dark,.dark *)[data-checked]{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:data-checked\:bg-white\/20:where(.dark,.dark *)[data-checked]{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:data-checked\:text-white:where(.dark,.dark *)[data-checked]{color:var(--color-white)}.dark\:data-checked\:text-zinc-400:where(.dark,.dark *)[data-checked]{color:var(--color-zinc-400)}.dark\:data-checked\:text-zinc-800:where(.dark,.dark *)[data-checked]{color:var(--color-zinc-800)}@media(hover:hover){.dark\:data-checked\:hover\:text-white:where(.dark,.dark *)[data-checked]:hover{color:var(--color-white)}}.dark\:data-current\:border-transparent:where(.dark,.dark *)[data-current]{border-color:#0000}.dark\:data-current\:border-white\/10:where(.dark,.dark *)[data-current]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:border-white\/10:where(.dark,.dark *)[data-current]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-current\:bg-white\/10:where(.dark,.dark *)[data-current]{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:bg-white\/10:where(.dark,.dark *)[data-current]{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-current\:bg-white\/\[7\%\]:where(.dark,.dark *)[data-current]{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:bg-white\/\[7\%\]:where(.dark,.dark *)[data-current]{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:data-current\:text-zinc-100:where(.dark,.dark *)[data-current]{color:var(--color-zinc-100)}.dark\:data-current\:after\:bg-white:where(.dark,.dark *)[data-current]:after{content:var(--tw-content);background-color:var(--color-white)}:is(.dark\:\*\*\:data-flux-menu-item-icon\:text-white\/60:where(.dark,.dark *) *)[data-flux-menu-item-icon]{color:#fff9}@supports (color:color-mix(in lab,red,red)){:is(.dark\:\*\*\:data-flux-menu-item-icon\:text-white\/60:where(.dark,.dark *) *)[data-flux-menu-item-icon]{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:data-in-range\:bg-white\/10:where(.dark,.dark *)[data-in-range]{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-in-range\:bg-white\/10:where(.dark,.dark *)[data-in-range]{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-invalid\:border-red-500:where(.dark,.dark *)[data-invalid]{border-color:var(--color-red-500)}.dark\:data-invalid\:text-red-400:where(.dark,.dark *)[data-invalid]{color:var(--color-red-400)}.dark\:disabled\:data-invalid\:border-red-500:where(.dark,.dark *):disabled[data-invalid]{border-color:var(--color-red-500)}.dark\:data-loading\:border-white\/10:where(.dark,.dark *)[data-loading]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-loading\:border-white\/10:where(.dark,.dark *)[data-loading]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-match\:text-white:where(.dark,.dark *)[data-match]{color:var(--color-white)}:is(.dark\:\*\*\:data-navmenu-icon\:text-white\/60:where(.dark,.dark *) *)[data-navmenu-icon]{color:#fff9}@supports (color:color-mix(in lab,red,red)){:is(.dark\:\*\*\:data-navmenu-icon\:text-white\/60:where(.dark,.dark *) *)[data-navmenu-icon]{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:data-open\:text-white:where(.dark,.dark *)[data-open]{color:var(--color-white)}.dark\:data-selected\:border-white:where(.dark,.dark *)[data-selected]{border-color:var(--color-white)}.dark\:data-selected\:bg-white:where(.dark,.dark *)[data-selected]{background-color:var(--color-white)}.dark\:data-selected\:bg-white\/20:where(.dark,.dark *)[data-selected]{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:data-selected\:bg-white\/20:where(.dark,.dark *)[data-selected]{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:data-selected\:text-white:where(.dark,.dark *)[data-selected]{color:var(--color-white)}.dark\:data-selected\:text-zinc-800:where(.dark,.dark *)[data-selected]{color:var(--color-zinc-800)}:is(.dark\:\*\*\:data-\[slot\=content\]\:text-zinc-300:where(.dark,.dark *) *)[data-slot=content]{color:var(--color-zinc-300)}.dark\:rtl\:-translate-x-\[0\.125rem\]:where(.dark,.dark *):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -.125rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:rtl\:group-data-checked\:-translate-x-\[0\.9375rem\]:where(.dark,.dark *):where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.group)[data-checked] *){--tw-translate-x: -.9375rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}@media print{.print\:hidden{display:none}}.flux-card-panel\:border:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:border,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:border){border-style:var(--tw-border-style);border-width:1px}.flux-card-panel\:before\:inset-ring:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:before\:inset-ring,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:before\:inset-ring):before{content:var(--tw-content);--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-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)}.flux-card-divided\:not-last\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:border-b):not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative)):not(:last-child){position:relative}.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent)):not(:last-child){border-color:#0000}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute)):not(:last-child):after{content:var(--tw-content);position:absolute}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\])):not(:last-child):after{content:var(--tw-content);inset-inline:var(--flux-card-part-px)}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px)):not(:last-child):after{content:var(--tw-content);bottom:-1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b)):not(:last-child):after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent)):not(:last-child):where(.dark,.dark *){border-color:#0000}.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring)){--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)}.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\])){clip-path:inset(-1px -1px 0)}.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\])){clip-path:inset(0 -1px -1px)}.flux-card-divided\:flux-after-content\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:border-t):not(:first-child,[data-flux-card-header]+*){border-top-style:var(--tw-border-style);border-top-width:1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative)):not(:first-child,[data-flux-card-header]+*){position:relative}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent)):not(:first-child,[data-flux-card-header]+*){border-color:#0000}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);position:absolute}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\])):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);inset-inline:var(--flux-card-part-px)}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);top:-1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *){border-color:#0000}.\[\&_\.gap-2\]\:gap-1\.5 .gap-2{gap:calc(var(--spacing) * 1.5)}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_\[data-flux-button\]\]\:rounded-lg [data-flux-button]{border-radius:var(--radius-lg)}.\[\&_\[data-flux-cell\]\:first-child\]\:ps-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-cell]:first-child{padding-inline-start:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-cell\]\:last-child\]\:pe-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-cell]:last-child{padding-inline-end:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-column\]\:first-child\]\:ps-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-column]:first-child{padding-inline-start:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-column\]\:last-child\]\:pe-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-column]:last-child{padding-inline-end:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-flag\]\]\:w-4 [data-flux-flag]{width:calc(var(--spacing) * 4)}.\[\&_\[data-flux-input-group\]\]\:w-auto [data-flux-input-group]{width:auto}.\[\&_\[data-slot\=heading\]\]\:text-\(--callout-heading\) [data-slot=heading]{color:var(--callout-heading)}.\[\&_\[data-slot\=text\]\]\:text-\(--callout-text\) [data-slot=text]{color:var(--callout-text)}.\[\&_\[popover\]\]\:whitespace-normal [popover]{white-space:normal}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_button\]\:text-amber-700\! button{color:var(--color-amber-700)!important}.\[\&_button\]\:text-blue-800\! button{color:var(--color-blue-800)!important}.\[\&_button\]\:text-cyan-800\! button{color:var(--color-cyan-800)!important}.\[\&_button\]\:text-emerald-800\! button{color:var(--color-emerald-800)!important}.\[\&_button\]\:text-fuchsia-700\! button{color:var(--color-fuchsia-700)!important}.\[\&_button\]\:text-green-800\! button{color:var(--color-green-800)!important}.\[\&_button\]\:text-indigo-700\! button{color:var(--color-indigo-700)!important}.\[\&_button\]\:text-lime-800\! button{color:var(--color-lime-800)!important}.\[\&_button\]\:text-orange-700\! button{color:var(--color-orange-700)!important}.\[\&_button\]\:text-pink-700\! button{color:var(--color-pink-700)!important}.\[\&_button\]\:text-purple-700\! button{color:var(--color-purple-700)!important}.\[\&_button\]\:text-red-700\! button{color:var(--color-red-700)!important}.\[\&_button\]\:text-rose-700\! button{color:var(--color-rose-700)!important}.\[\&_button\]\:text-sky-800\! button{color:var(--color-sky-800)!important}.\[\&_button\]\:text-teal-800\! button{color:var(--color-teal-800)!important}.\[\&_button\]\:text-violet-700\! button{color:var(--color-violet-700)!important}.\[\&_button\]\:text-yellow-800\! button{color:var(--color-yellow-800)!important}.\[\&_button\]\:text-zinc-700\! button{color:var(--color-zinc-700)!important}.dark\:\[\&_button\]\:text-amber-200\!:where(.dark,.dark *) button{color:var(--color-amber-200)!important}.dark\:\[\&_button\]\:text-blue-200\!:where(.dark,.dark *) button{color:var(--color-blue-200)!important}.dark\:\[\&_button\]\:text-cyan-200\!:where(.dark,.dark *) button{color:var(--color-cyan-200)!important}.dark\:\[\&_button\]\:text-emerald-200\!:where(.dark,.dark *) button{color:var(--color-emerald-200)!important}.dark\:\[\&_button\]\:text-fuchsia-200\!:where(.dark,.dark *) button{color:var(--color-fuchsia-200)!important}.dark\:\[\&_button\]\:text-green-200\!:where(.dark,.dark *) button{color:var(--color-green-200)!important}.dark\:\[\&_button\]\:text-indigo-200\!:where(.dark,.dark *) button{color:var(--color-indigo-200)!important}.dark\:\[\&_button\]\:text-lime-200\!:where(.dark,.dark *) button{color:var(--color-lime-200)!important}.dark\:\[\&_button\]\:text-orange-200\!:where(.dark,.dark *) button{color:var(--color-orange-200)!important}.dark\:\[\&_button\]\:text-pink-200\!:where(.dark,.dark *) button{color:var(--color-pink-200)!important}.dark\:\[\&_button\]\:text-purple-200\!:where(.dark,.dark *) button{color:var(--color-purple-200)!important}.dark\:\[\&_button\]\:text-red-200\!:where(.dark,.dark *) button{color:var(--color-red-200)!important}.dark\:\[\&_button\]\:text-rose-200\!:where(.dark,.dark *) button{color:var(--color-rose-200)!important}.dark\:\[\&_button\]\:text-sky-200\!:where(.dark,.dark *) button{color:var(--color-sky-200)!important}.dark\:\[\&_button\]\:text-teal-200\!:where(.dark,.dark *) button{color:var(--color-teal-200)!important}.dark\:\[\&_button\]\:text-violet-200\!:where(.dark,.dark *) button{color:var(--color-violet-200)!important}.dark\:\[\&_button\]\:text-yellow-200\!:where(.dark,.dark *) button{color:var(--color-yellow-200)!important}.dark\:\[\&_button\]\:text-zinc-200\!:where(.dark,.dark *) button{color:var(--color-zinc-200)!important}.\[\&_dialog\]\:whitespace-normal dialog{white-space:normal}.dark\:\[\&_option\]\:bg-zinc-700:where(.dark,.dark *) option{background-color:var(--color-zinc-700)}.dark\:\[\&_option\]\:text-white:where(.dark,.dark *) option{color:var(--color-white)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\+\&\>\[data-flux-menu-separator-top\]\]\:hidden+.\[\&\+\&\>\[data-flux-menu-separator-top\]\]\:hidden>[data-flux-menu-separator-top],.\[\&\+\&\>\[data-flux-option-group-separator-top\]\]\:hidden+.\[\&\+\&\>\[data-flux-option-group-separator-top\]\]\:hidden>[data-flux-option-group-separator-top]{display:none}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\:first-child\>\[data-flux-menu-separator-top\]\]\:hidden:first-child>[data-flux-menu-separator-top]{display:none}.\[\&\:first-of-type_td\[data-in-range\]\:not\(\[data-selected\]\)\:first-child\]\:rounded-s-none:first-of-type td[data-in-range]:not([data-selected]):first-child{border-start-start-radius:0;border-end-start-radius:0}.\[\&\:first-of-type\>\[data-flux-option-group-separator-top\]\]\:hidden:first-of-type>[data-flux-option-group-separator-top]{display:none}.\[\&\:has\(\+\[data-flux-subheading\]\)\]\:mb-2:has(+[data-flux-subheading]){margin-bottom:calc(var(--spacing) * 2)}.\[\&\:has\(\+\[data-slot\=image\]\)\]\:hidden:has(+[data-slot=image]){display:none}.\[\&\:has\(\+input\:focus\)\]\:text-zinc-800:has(+input:focus){color:var(--color-zinc-800)}.dark\:\[\&\:has\(\+input\:focus\)\]\:text-zinc-400:where(.dark,.dark *):has(+input:focus){color:var(--color-zinc-400)}.\[\&\:has\(\>\:not\(span\)\:first-child\)\]\:ps-3:has(>:not(span):first-child){padding-inline-start:calc(var(--spacing) * 3)}.\[\&\:has\(\>\:not\(span\)\:last-child\)\]\:pe-3:has(>:not(span):last-child){padding-inline-end:calc(var(--spacing) * 3)}.\[\&\:has\(\>\[data-flux-checkbox-group\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:has(>[data-flux-checkbox-group][disabled])>[data-flux-label],.\[\&\:has\(\>\[data-flux-radio-group\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:has(>[data-flux-radio-group][disabled])>[data-flux-label]{opacity:.5}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[data-flux-label-trailing\]\)\]\:flex:has([data-flux-label-trailing]){display:flex}.\[\&\:has\(\[data-slot\=image\]\)\]\:p-\[calc\(0\.5rem-1px\)\]:has([data-slot=image]){padding:calc(.5rem - 1px)}.\[\&\:has\(\[disabled\]\)\]\:shadow-none:has([disabled]){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:\[\&\:has\(\[disabled\]\)\]\:bg-white\/\[7\%\]:where(.dark,.dark *):has([disabled]){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:has\(\[disabled\]\)\]\:bg-white\/\[7\%\]:where(.dark,.dark *):has([disabled]){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-\[var\(--haze-border\)\]:hover [data-flux-checkbox-indicator]{border-color:var(--haze-border)}.dark\:\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-checkbox-indicator]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-checkbox-indicator]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-\[var\(--haze-border\)\]:hover [data-flux-radio-indicator]{border-color:var(--haze-border)}.dark\:\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-radio-indicator]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-radio-indicator]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.\[\&\:hover_\[data-navmenu-icon\]\]\:text-current:hover [data-navmenu-icon]{color:currentColor}.\[\&\:hover\>\*\]\:text-zinc-800:hover>*{color:var(--color-zinc-800)}.dark\:\[\&\:hover\>\*\]\:text-white:where(.dark,.dark *):hover>*{color:var(--color-white)}.\[\:has\(\>_\:not\(template\)\)\]\:mb-2:has(>:not(template)){margin-bottom:calc(var(--spacing) * 2)}@media(hover:hover){.\[\&\:is\(button\)\]\:hover\:bg-amber-400\/40:is(button):hover{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-amber-400\/40:is(button):hover{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-amber-600:is(button):hover{background-color:var(--color-amber-600)}.\[\&\:is\(button\)\]\:hover\:bg-blue-400\/30:is(button):hover{background-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-blue-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-blue-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-blue-600:is(button):hover{background-color:var(--color-blue-600)}.\[\&\:is\(button\)\]\:hover\:bg-cyan-400\/30:is(button):hover{background-color:#00d2ef4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-cyan-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-cyan-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-cyan-600:is(button):hover{background-color:var(--color-cyan-600)}.\[\&\:is\(button\)\]\:hover\:bg-emerald-400\/30:is(button):hover{background-color:#00d2944d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-emerald-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-emerald-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-emerald-600:is(button):hover{background-color:var(--color-emerald-600)}.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-400\/30:is(button):hover{background-color:#ec6cff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-fuchsia-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-600:is(button):hover{background-color:var(--color-fuchsia-600)}.\[\&\:is\(button\)\]\:hover\:bg-green-400\/30:is(button):hover{background-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-green-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-green-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-green-600:is(button):hover{background-color:var(--color-green-600)}.\[\&\:is\(button\)\]\:hover\:bg-indigo-400\/30:is(button):hover{background-color:#7d87ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-indigo-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-indigo-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-indigo-600:is(button):hover{background-color:var(--color-indigo-600)}.\[\&\:is\(button\)\]\:hover\:bg-lime-400\/35:is(button):hover{background-color:#9de50059}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-lime-400\/35:is(button):hover{background-color:color-mix(in oklab,var(--color-lime-400) 35%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-lime-600:is(button):hover{background-color:var(--color-lime-600)}.\[\&\:is\(button\)\]\:hover\:bg-orange-400\/30:is(button):hover{background-color:#ff8b1a4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-orange-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-orange-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-orange-600:is(button):hover{background-color:var(--color-orange-600)}.\[\&\:is\(button\)\]\:hover\:bg-pink-400\/30:is(button):hover{background-color:#fb64b64d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-pink-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-pink-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-pink-600:is(button):hover{background-color:var(--color-pink-600)}.\[\&\:is\(button\)\]\:hover\:bg-purple-400\/30:is(button):hover{background-color:#c07eff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-purple-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-purple-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-purple-600:is(button):hover{background-color:var(--color-purple-600)}.\[\&\:is\(button\)\]\:hover\:bg-red-400\/30:is(button):hover{background-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-red-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-red-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-red-600:is(button):hover{background-color:var(--color-red-600)}.\[\&\:is\(button\)\]\:hover\:bg-rose-400\/30:is(button):hover{background-color:#ff667f4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-rose-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-rose-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-rose-600:is(button):hover{background-color:var(--color-rose-600)}.\[\&\:is\(button\)\]\:hover\:bg-sky-400\/30:is(button):hover{background-color:#00bcfe4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-sky-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-sky-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-sky-600:is(button):hover{background-color:var(--color-sky-600)}.\[\&\:is\(button\)\]\:hover\:bg-teal-400\/30:is(button):hover{background-color:#00d3bd4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-teal-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-teal-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-teal-600:is(button):hover{background-color:var(--color-teal-600)}.\[\&\:is\(button\)\]\:hover\:bg-violet-400\/30:is(button):hover{background-color:#a685ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-violet-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-violet-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-violet-600:is(button):hover{background-color:var(--color-violet-600)}.\[\&\:is\(button\)\]\:hover\:bg-yellow-400\/40:is(button):hover{background-color:#fac80066}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-yellow-400\/40:is(button):hover{background-color:color-mix(in oklab,var(--color-yellow-400) 40%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-yellow-600:is(button):hover{background-color:var(--color-yellow-600)}.\[\&\:is\(button\)\]\:hover\:bg-zinc-400\/25:is(button):hover{background-color:#8a918d40}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-zinc-400\/25:is(button):hover{background-color:color-mix(in oklab,var(--color-zinc-400) 25%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-zinc-700:is(button):hover{background-color:var(--color-zinc-700)}.dark\:\[button\]\:hover\:bg-amber-400:where(.dark,.dark *):is(button):hover{background-color:var(--color-amber-400)}.dark\:\[button\]\:hover\:bg-amber-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fcbb0080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-amber-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-amber-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-blue-400\/50:where(.dark,.dark *):is(button):hover{background-color:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-blue-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-blue-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-blue-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-blue-500)}.dark\:\[button\]\:hover\:bg-cyan-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d2ef80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-cyan-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-cyan-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-cyan-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-cyan-500)}.dark\:\[button\]\:hover\:bg-emerald-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d29480}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-emerald-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-emerald-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-emerald-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-emerald-500)}.dark\:\[button\]\:hover\:bg-fuchsia-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ec6cff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-fuchsia-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-fuchsia-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-fuchsia-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-fuchsia-500)}.dark\:\[button\]\:hover\:bg-green-400\/50:where(.dark,.dark *):is(button):hover{background-color:#05df7280}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-green-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-green-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-green-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-green-500)}.dark\:\[button\]\:hover\:bg-indigo-400\/50:where(.dark,.dark *):is(button):hover{background-color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-indigo-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-indigo-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-indigo-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-indigo-500)}.dark\:\[button\]\:hover\:bg-lime-400\/50:where(.dark,.dark *):is(button):hover{background-color:#9de50080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-lime-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-lime-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-lime-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-lime-500)}.dark\:\[button\]\:hover\:bg-orange-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-orange-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-orange-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-orange-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-orange-500)}.dark\:\[button\]\:hover\:bg-pink-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fb64b680}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-pink-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-pink-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-pink-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-pink-500)}.dark\:\[button\]\:hover\:bg-purple-400\/50:where(.dark,.dark *):is(button):hover{background-color:#c07eff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-purple-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-purple-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-purple-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-purple-500)}.dark\:\[button\]\:hover\:bg-red-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-red-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-red-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-red-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-red-500)}.dark\:\[button\]\:hover\:bg-rose-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff667f80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-rose-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-rose-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-rose-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-rose-500)}.dark\:\[button\]\:hover\:bg-sky-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-sky-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-sky-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-sky-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-sky-500)}.dark\:\[button\]\:hover\:bg-teal-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d3bd80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-teal-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-teal-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-teal-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-teal-500)}.dark\:\[button\]\:hover\:bg-violet-400\/50:where(.dark,.dark *):is(button):hover{background-color:#a685ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-violet-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-violet-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-violet-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-violet-500)}.dark\:\[button\]\:hover\:bg-yellow-300:where(.dark,.dark *):is(button):hover{background-color:var(--color-yellow-300)}.dark\:\[button\]\:hover\:bg-yellow-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fac80080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-yellow-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-yellow-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-zinc-400\/50:where(.dark,.dark *):is(button):hover{background-color:#8a918d80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-zinc-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-zinc-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-zinc-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-zinc-500)}}.\[\&\:last-child\>\[data-flux-menu-separator-bottom\]\]\:hidden:last-child>[data-flux-menu-separator-bottom],.\[\&\:last-child\>\[data-flux-option-group-separator-bottom\]\]\:hidden:last-child>[data-flux-option-group-separator-bottom]{display:none}.\[\&\:last-of-type_td\[data-in-range\]\:not\(\[data-selected\]\)\:last-child\]\:rounded-e-none:last-of-type td[data-in-range]:not([data-selected]):last-child{border-start-end-radius:0;border-end-end-radius:0}.\[\&\:not\(\:empty\)\]\:pb-2:not(:empty){padding-bottom:calc(var(--spacing) * 2)}.\[\&\:not\(\:empty\)\+div\]\:font-normal:not(:empty)+div{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.\[\&\:not\(\:empty\)\+div\]\:text-zinc-500:not(:empty)+div{color:var(--color-zinc-500)}.group-data-invert\/toast\:\[\&\:not\(\:empty\)\+div\]\:text-zinc-300:is(:where(.group\/toast)[data-invert] *):not(:empty)+div,.\[\&\:not\(\:empty\)\+div\]\:dark\:text-zinc-300:not(:empty)+div:where(.dark,.dark *){color:var(--color-zinc-300)}.dark\:group-data-invert\/toast\:\[\&\:not\(\:empty\)\+div\]\:text-zinc-500:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):not(:empty)+div{color:var(--color-zinc-500)}.\[\&\:not\(\:has\(\>_\*\)\)\]\:hidden:not(:has(>*)){display:none}.\[\&\:not\(\:has\(\[data-flux-field\]\)\)\:has\(\[data-flux-control\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:not(:has([data-flux-field])):has([data-flux-control][disabled])>[data-flux-label]{opacity:.5}.\[\&\:not\(\:has\(ui-empty\[data-hidden\]\)\)\]\:hidden:not(:has(ui-empty[data-hidden])),.\[\&\:not\(\:has\(ui-option\:not\(\[data-hidden\]\)\)\)\]\:hidden:not(:has(ui-option:not([data-hidden]))){display:none}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\:popover-open\]\:flex:popover-open{display:flex}.\[\&\:popover-open\]\:flex-col:popover-open{flex-direction:column}.\[\&\>\*\]\:mx-auto>*{margin-inline:auto}.\[\&\>\*\]\:ms-auto>*{margin-inline-start:auto}.\[\&\>\*\:first-child\:not\(\:last-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target],.\[\&\>\*\:first-child\:not\(\:last-child\)\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>[data-flux-group-target],.\[\&\>\*\:first-child\:not\(\:last-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>[data-flux-input]>[data-flux-group-target]{border-start-end-radius:0;border-end-end-radius:0}.\[\&\>\*\:has\(\+\[data-flux-input-group-suffix\]\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>:has(+[data-flux-input-group-suffix])>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\*\:has\(\+\[data-flux-input-group-suffix\]\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>:has(+[data-flux-input-group-suffix])>[data-flux-group-target]:not([data-invalid]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:last-child:not(:first-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:last-child:not(:first-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>[data-flux-input]>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target],.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>[data-flux-group-target],.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>[data-flux-input]>[data-flux-group-target]{border-radius:0}.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:not(:first-child):not(:last-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:not(:first-child):not(:last-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:not\(\[data-flux-label\]\)\+\[data-flux-description\]\]\:mt-3>:not([data-flux-label])+[data-flux-description]{margin-top:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-control\]\~\[data-flux-description\]\]\:col-start-2>[data-flux-control]~[data-flux-description]{grid-column-start:2}.\[\&\>\[data-flux-control\]\~\[data-flux-description\]\]\:row-start-2>[data-flux-control]~[data-flux-description]{grid-row-start:2}.\[\&\>\[data-flux-control\]\~\[data-flux-error\]\]\:col-span-2>[data-flux-control]~[data-flux-error]{grid-column:span 2/span 2}.\[\&\>\[data-flux-control\]\~\[data-flux-error\]\]\:mt-1>[data-flux-control]~[data-flux-error]{margin-top:var(--spacing)}.\[\&\>\[data-flux-description\]\:first-child\:has\(\+\*\)\]\:mb-3>[data-flux-description]:first-child:has(+*){margin-bottom:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-field\]\:has\(\>\[data-flux-description\]\)\]\:mb-4>[data-flux-field]:has(>[data-flux-description]){margin-bottom:calc(var(--spacing) * 4)}.\[\&\>\[data-flux-field\]\:last-child\]\:mb-0\!>[data-flux-field]:last-child{margin-bottom:0!important}.\[\&\>\[data-flux-group-target\]\:first-child\:not\(\:last-child\)\]\:rounded-e-none>[data-flux-group-target]:first-child:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.\[\&\>\[data-flux-group-target\]\:has\(\+\[data-flux-input-group-suffix\]\)\]\:border-e-0>[data-flux-group-target]:has(+[data-flux-input-group-suffix]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\[data-flux-group-target\]\:last-child\:not\(\:first-child\)\]\:rounded-s-none>[data-flux-group-target]:last-child:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\[data-flux-group-target\]\:last-child\:not\(\:first-child\)\]\:border-s-0>[data-flux-group-target]:last-child:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-group-target\]\:not\(\:first-child\)\:not\(\:last-child\)\]\:rounded-none>[data-flux-group-target]:not(:first-child):not(:last-child){border-radius:0}.\[\&\>\[data-flux-group-target\]\:not\(\:first-child\)\:not\(\:last-child\)\]\:border-s-0>[data-flux-group-target]:not(:first-child):not(:last-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-input\]\]\:min-w-0>[data-flux-input]{min-width:0}.\[\&\>\[data-flux-input\]\:has\(\+\[data-flux-input-group-suffix\]\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>[data-flux-input]:has(+[data-flux-input-group-suffix])>[data-flux-group-target]:not([data-invalid]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\[data-flux-input\]\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>[data-flux-input]:last-child:not(:first-child)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\[data-flux-input\]\:not\(\:first-child\)\:not\(\:last-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>[data-flux-input]:not(:first-child):not(:last-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-label\]\+\[data-flux-description\]\]\:mt-0>[data-flux-label]+[data-flux-description]{margin-top:0}.\[\&\>\[data-flux-label\]\+\[data-flux-description\]\]\:mb-3>[data-flux-label]+[data-flux-description]{margin-bottom:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-label\]\:has\(\+\[data-flux-description\]\)\]\:mb-2>[data-flux-label]:has(+[data-flux-description]){margin-bottom:calc(var(--spacing) * 2)}.\[\&\>\[data-flux-label\]\~\[data-flux-control\]\]\:col-start-2>[data-flux-label]~[data-flux-control]{grid-column-start:2}.\[\&\>\[data-flux-label\]\~\[data-flux-control\]\]\:row-start-1>[data-flux-label]~[data-flux-control]{grid-row-start:1}.\[\&\>\[data-flux-legend\]\]\:mb-4>[data-flux-legend],.\[\&\>\[data-flux-legend\]\+\[data-flux-description\]\]\:mb-4>[data-flux-legend]+[data-flux-description]{margin-bottom:calc(var(--spacing) * 4)}.\[\&\>\[data-flux-legend\]\:has\(\+\[data-flux-description\]\)\]\:mb-2>[data-flux-legend]:has(+[data-flux-description]){margin-bottom:calc(var(--spacing) * 2)}@container (min-width:28rem){.\@md\:\[\&\>\[data-slot\=\"content\"\]\:has\(\[data-slot\=\"heading\"\]\)\:has\(\[data-slot\=\"text\"\]\)\+\[data-slot\=\"actions\"\]\]\:p-2>[data-slot=content]:has([data-slot=heading]):has([data-slot=text])+[data-slot=actions]{padding:calc(var(--spacing) * 2)}}.\[\&\>button\]\:hidden>button{display:none}.dark\:\[\&\>option\]\:bg-zinc-700:where(.dark,.dark *)>option{background-color:var(--color-zinc-700)}.dark\:\[\&\>option\]\:text-white:where(.dark,.dark *)>option{color:var(--color-white)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:ms-6>svg{margin-inline-start:calc(var(--spacing) * 6)}.\[\&\>svg\]\:me-2>svg{margin-inline-end:calc(var(--spacing) * 2)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-zinc-400>svg{color:var(--color-zinc-400)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}:where([data-flux-sidebar-on-desktop]) .\[\&\[collapsible\=\"mobile\"\]\]\:in-data-flux-sidebar-on-desktop\:hidden[collapsible=mobile]{display:none}.\[\&\[data-active\]_\[data-flux-menu-item-icon\]\]\:text-current[data-active] [data-flux-menu-item-icon]{color:currentColor}.\[\&\[data-active\]\>svg\]\:text-zinc-800[data-active]>svg{color:var(--color-zinc-800)}.dark\:\[\&\[data-active\]\>svg\]\:text-white:where(.dark,.dark *)[data-active]>svg{color:var(--color-white)}.\[\&\[data-flux-loading\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[data-flux-loading]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[data-flux-loading\]\>\[data-flux-loading-indicator\]\]\:opacity-100[data-flux-loading]>[data-flux-loading-indicator],.\[\&\[data-loading\]_\[data-flux-loading-indicator\]\]\:opacity-100[data-loading] [data-flux-loading-indicator]{opacity:1}.\[\&\[data-loading\]_\[data-flux-toast-action-label\]\]\:opacity-0[data-loading] [data-flux-toast-action-label],.\[\&\[data-loading\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[data-loading]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[data-loading\]\>\[data-flux-loading-indicator\]\]\:opacity-100[data-loading]>[data-flux-loading-indicator]{opacity:1}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){--tw-gradient-position:to left}@supports (background-image:linear-gradient(in lab,red,red)){.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){--tw-gradient-position:to left in oklab}}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){background-image:linear-gradient(var(--tw-gradient-stops))}.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){--tw-gradient-position:to right in oklab}}.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){background-image:linear-gradient(var(--tw-gradient-stops))}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\[data-selected\]\)\]\:bg-none\![data-outside]:has(+[data-in-range][data-selected]){background-image:none!important}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-selected\]\+\[data-selected\]\]\:rounded-s-none[data-selected]+[data-selected]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}.\[\&\[disabled\]\]\:pointer-events-none[disabled]{pointer-events:none}.\[\&\[disabled\]\]\:cursor-default[disabled]{cursor:default}.\[\&\[disabled\]\]\:text-zinc-400[disabled]{color:var(--color-zinc-400)}.\[\&\[disabled\]\]\:opacity-50[disabled]{opacity:.5}.\[\&\[disabled\]\]\:shadow-none[disabled]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:\[\&\[disabled\]\]\:border-white\/10:where(.dark,.dark *)[disabled]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\[disabled\]\]\:border-white\/10:where(.dark,.dark *)[disabled]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:\[\&\[disabled\]\]\:bg-white\/\[7\%\]:where(.dark,.dark *)[disabled]{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\[disabled\]\]\:bg-white\/\[7\%\]:where(.dark,.dark *)[disabled]{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:\[\&\[disabled\]\]\:text-zinc-400:where(.dark,.dark *)[disabled]{color:var(--color-zinc-400)}.dark\:\[\&\[disabled\]\]\:opacity-50:where(.dark,.dark *)[disabled]{opacity:.5}.dark\:\[\&\[disabled\]\]\:opacity-75:where(.dark,.dark *)[disabled]{opacity:.75}.\[\&\[disabled\]_\&\]\:text-zinc-400[disabled] .\[\&\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}.\[\&\[disabled\]_\[data-flux-label\]\]\:opacity-50[disabled] [data-flux-label],.\[\&\[disabled\]_\[data-flux-legend\]\]\:opacity-50[disabled] [data-flux-legend]{opacity:.5}.\[\&\[disabled\]_\[data-slot\=content\]\]\:text-zinc-500[disabled] [data-slot=content]{color:var(--color-zinc-500)}.dark\:\[\&\[disabled\]_\[data-slot\=content\]\]\:text-zinc-400:where(.dark,.dark *)[disabled] [data-slot=content]{color:var(--color-zinc-400)}.\[\&\[disabled\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[disabled]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[disabled\]\>\[data-flux-loading-indicator\]\]\:opacity-100[disabled]>[data-flux-loading-indicator]{opacity:1}.\[\&\[hidden\=until-found\]\]\:pointer-events-none[hidden=until-found]{pointer-events:none}.\[\&\[hidden\=until-found\]\]\:absolute[hidden=until-found]{position:absolute}.\[\&\[hidden\=until-found\]\]\:opacity-0[hidden=until-found]{opacity:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:first-child\,_\[data-flux-button-group\]_\:first-child\>\&\)\]\:border-s-\[1px\]:first-child,[data-flux-button-group] :first-child>.\[\:is\(\[data-flux-button-group\]\>\&\:first-child\,_\[data-flux-button-group\]_\:first-child\>\&\)\]\:border-s-\[1px\]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:last-child,[data-flux-button-group] :last-child>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-\[1px\]:last-child,[data-flux-button-group] :last-child>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-\[1px\]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}:is([data-flux-button-group]>.dark\:\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:where(.dark,.dark *):last-child,[data-flux-button-group] :last-child>.dark\:\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:where(.dark,.dark *)){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[1px\]\!:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[1px\]\!){border-inline-start-style:var(--tw-border-style)!important;border-inline-start-width:1px!important}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]){border-inline-start-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]){border-inline-start-color:color-mix(in srgb,var(--color-accent-foreground),transparent 85%)}}:where(.\[\:where\(\&\)\]\:relative){position:relative}:where(.\[\:where\(\&\)\]\:block){display:block}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:size-8){width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:size-10){width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}:where(.\[\:where\(\&\)\]\:size-12){width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}:where(.\[\:where\(\&\)\]\:size-16){width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}:where(.\[\:where\(\&\)\]\:size-\[var\(--flux-timeline-indicator-size\)\]){width:var(--flux-timeline-indicator-size);height:var(--flux-timeline-indicator-size)}:where(.\[\:where\(\&\)\]\:h-1\.5){height:calc(var(--spacing) * 1.5)}:where(.\[\:where\(\&\)\]\:h-4){height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:h-5){height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:h-6){height:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:max-h-\[14rem\]){max-height:14rem}:where(.\[\:where\(\&\)\]\:max-h-\[20rem\]){max-height:20rem}:where(.\[\:where\(\&\)\]\:min-h-4){min-height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:w-5){width:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:w-6){width:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:w-8){width:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:w-10){width:calc(var(--spacing) * 10)}:where(.\[\:where\(\&\)\]\:w-12){width:calc(var(--spacing) * 12)}:where(.\[\:where\(\&\)\]\:w-64){width:calc(var(--spacing) * 64)}:where(.\[\:where\(\&\)\]\:w-full){width:100%}:where(.\[\:where\(\&\)\]\:max-w-7xl){max-width:var(--container-7xl)}:where(.\[\:where\(\&\)\]\:max-w-xl){max-width:var(--container-xl)}:where(.\[\:where\(\&\)\]\:min-w-6){min-width:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:min-w-48){min-width:calc(var(--spacing) * 48)}:where(.\[\:where\(\&\)\]\:min-w-full){min-width:100%}:where(.\[\:where\(\&\)\]\:min-w-xs){min-width:var(--container-xs)}:where(.\[\:where\(\&\)\]\:gap-4){gap:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:rounded){border-radius:.25rem}:where(.\[\:where\(\&\)\]\:rounded-md){border-radius:var(--radius-md)}:where(.\[\:where\(\&\)\]\:rounded-sm){border-radius:var(--radius-sm)}:where(.\[\:where\(\&\)\]\:border-transparent){border-color:#0000}:where(.\[\:where\(\&\)\]\:border-zinc-900\/7){border-color:#1a254012}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:border-zinc-900\/7){border-color:color-mix(in oklab,var(--color-zinc-900) 7%,transparent)}}:where(.\[\:where\(\&\)\]\:border-zinc-900\/10){border-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:border-zinc-900\/10){border-color:color-mix(in oklab,var(--color-zinc-900) 10%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-transparent){background-color:#0000}:where(.\[\:where\(\&\)\]\:bg-white){background-color:var(--color-white)}:where(.\[\:where\(\&\)\]\:bg-zinc-100){background-color:var(--color-zinc-100)}:where(.\[\:where\(\&\)\]\:bg-zinc-200){background-color:var(--color-zinc-200)}:where(.\[\:where\(\&\)\]\:bg-zinc-400\/20){background-color:#8a918d33}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-400\/20){background-color:color-mix(in oklab,var(--color-zinc-400) 20%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/2){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/2){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/3){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/3){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/4){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/4){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.\[\:where\(\&\)\]\:stroke-white){stroke:var(--color-white)}:where(.\[\:where\(\&\)\]\:p-4){padding:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:px-3){padding-inline:calc(var(--spacing) * 3)}:where(.\[\:where\(\&\)\]\:py-3){padding-block:calc(var(--spacing) * 3)}:where(.\[\:where\(\&\)\]\:pt-8){padding-top:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:text-base){font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}:where(.\[\:where\(\&\)\]\:text-sm){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}:where(.\[\:where\(\&\)\]\:text-xs){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}:where(.\[\:where\(\&\)\]\:font-medium){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}:where(.\[\:where\(\&\)\]\:font-normal){--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}:where(.\[\:where\(\&\)\]\:text-zinc-300){color:var(--color-zinc-300)}:where(.\[\:where\(\&\)\]\:text-zinc-400){color:var(--color-zinc-400)}:where(.\[\:where\(\&\)\]\:text-zinc-500){color:var(--color-zinc-500)}:where(.\[\:where\(\&\)\]\:text-zinc-800){color:var(--color-zinc-800)}:where(.\[\:where\(\&\)\]\:shadow-xs){--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.\[\:where\(\&\)\]\:\[--flux-shimmer-color\:white\]){--flux-shimmer-color:white}:where(.\[\:where\(\&\)\]\:after\:inset-ring-white\/25):after{content:var(--tw-content);--tw-inset-ring-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:after\:inset-ring-white\/25):after{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}@media(min-width:40rem){:where(.sm\:\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.sm\:\[\:where\(\&\)\]\:h-3){height:calc(var(--spacing) * 3)}}@media(min-width:48rem){:where(.md\:\[\:where\(\&\)\]\:min-w-\[25rem\]){min-width:25rem}}@media(min-width:64rem){:where(.lg\:\[\:where\(\&\)\]\:border-zinc-200){border-color:var(--color-zinc-200)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/7:where(.dark,.dark *)){border-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/7:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/10:where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/10:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/12:where(.dark,.dark *)){border-color:#ffffff1f}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/12:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 12%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/15:where(.dark,.dark *)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/15:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:bg-zinc-600):where(.dark,.dark *){background-color:var(--color-zinc-600)}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/5:where(.dark,.dark *)){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/5:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/6:where(.dark,.dark *)){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/6:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/7:where(.dark,.dark *)){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/7:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/10:where(.dark,.dark *)){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/10:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-zinc-800:where(.dark,.dark *)){background-color:var(--color-zinc-800)}:where(.dark\:\[\:where\(\&\)\]\:stroke-zinc-900:where(.dark,.dark *)){stroke:var(--color-zinc-900)}:where(.\[\:where\(\&\)\]\:dark\:text-white):where(.dark,.dark *){color:var(--color-white)}:where(.\[\:where\(\&\)\]\:dark\:text-white\/50):where(.dark,.dark *){color:#ffffff80}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/50):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 50%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-white\/60):where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/60):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-white\/70):where(.dark,.dark *){color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/70):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 70%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-zinc-300):where(.dark,.dark *){color:var(--color-zinc-300)}:where(.dark\:\[\:where\(\&\)\]\:text-white\/40:where(.dark,.dark *)){color:#fff6}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:text-white\/40:where(.dark,.dark *)){color:color-mix(in oklab,var(--color-white) 40%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:text-zinc-100:where(.dark,.dark *)){color:var(--color-zinc-100)}:where(.dark\:\[\:where\(\&\)\]\:text-zinc-300:where(.dark,.dark *)){color:var(--color-zinc-300)}:where(.dark\:\[\:where\(\&\)\]\:shadow-none:where(.dark,.dark *)){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.dark\:\[\:where\(\&\)\]\:\[--flux-shimmer-color\:var\(--color-zinc-900\)\]:where(.dark,.dark *)){--flux-shimmer-color:var(--color-zinc-900)}@media(min-width:64rem){:where(.dark\:lg\:\[\:where\(\&\)\]\:border-zinc-700:where(.dark,.dark *)){border-color:var(--color-zinc-700)}}:where(.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8)):before{content:var(--tw-content);--tw-inset-ring-color:#1a254014}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-zinc-900) 8%, transparent)}}:where(.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs)):before{content:var(--tw-content);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200)):before{content:var(--tw-content);--tw-inset-ring-color:var(--color-zinc-200)}:where(.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10):has(>[data-flux-card-bleed])):before{content:var(--tw-content);--tw-inset-ring-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10):has(>[data-flux-card-bleed])):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-zinc-900) 10%, transparent)}}:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none):where(.dark,.dark *)):before{content:var(--tw-content);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *):has(>[data-flux-card-bleed])):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *):has(>[data-flux-card-bleed])):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent)){border-color:#0000}:where(.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:last-child)){border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:last-child)){border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:last-child):where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:last-child):where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:last-child)):after{content:var(--tw-content);border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:last-child)):after{border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:last-child):where(.dark,.dark *)):after{content:var(--tw-content);border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:last-child):where(.dark,.dark *)):after{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]))):before{content:var(--tw-content);--tw-inset-shadow:inset 0 1.5px 2.5px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-shadow:inset 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8)):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 8%, transparent)}}:where(.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50))){background-color:var(--color-zinc-50)}:where(.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=default]>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=default]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=default]>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=default]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card][data-flux-card-variant=outline]>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card][data-flux-card-variant=outline]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card][data-flux-card-variant=outline]>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card][data-flux-card-variant=outline]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}:where(.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs))){--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10)):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white))){background-color:var(--color-white)}:where(.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}:where(.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:#0003}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}:where(.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:#0003}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}:where(.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:#00000059}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}:where(.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:#00000059}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2))){--tw-ring-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2))){--tw-ring-color:color-mix(in oklab, var(--color-zinc-900) 2%, transparent)}}:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15)):where(.dark,.dark *)){--tw-ring-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15)):where(.dark,.dark *)){--tw-ring-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:first-child,[data-flux-card-header]+*)){border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:first-child,[data-flux-card-header]+*)){border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:first-child,[data-flux-card-header]+*)):after{content:var(--tw-content);border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:first-child,[data-flux-card-header]+*)):after{border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)):after{content:var(--tw-content);border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)):after{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where([data-flux-card-heading-size=base]+.\[\:where\(\[data-flux-card-heading-size\=base\]\+\&\)\]\:mt-1){margin-top:var(--spacing)}:where([data-flux-card-heading-size=lg]+.\[\:where\(\[data-flux-card-heading-size\=lg\]\+\&\)\]\:mt-2){margin-top:calc(var(--spacing) * 2)}@supports ((-moz-appearance:none)){.\[\@supports\(-moz-appearance\:none\)\]\:hidden{display:none}.\[\@supports\(-moz-appearance\:none\)\]\:pe-3{padding-inline-end:calc(var(--spacing) * 3)}}[data-color]>.\[\[data-color\]\>\&\]\:text-inherit{color:inherit}[data-color]>.\[\[data-color\]\>\&\]\:decoration-current\/20{text-decoration-color:currentColor}@supports (color:color-mix(in lab,red,red)){[data-color]>.\[\[data-color\]\>\&\]\:decoration-current\/20{-webkit-text-decoration-color:color-mix(in oklab,currentcolor 20%,transparent);text-decoration-color:color-mix(in oklab,currentcolor 20%,transparent)}}@media(hover:hover){[data-color]>.\[\[data-color\]\>\&\]\:hover\:decoration-current:hover{text-decoration-color:currentColor}}[data-color]>.dark\:\[\[data-color\]\>\&\]\:decoration-current\/50:where(.dark,.dark *){text-decoration-color:currentColor}@supports (color:color-mix(in lab,red,red)){[data-color]>.dark\:\[\[data-color\]\>\&\]\:decoration-current\/50:where(.dark,.dark *){-webkit-text-decoration-color:color-mix(in oklab,currentcolor 50%,transparent);text-decoration-color:color-mix(in oklab,currentcolor 50%,transparent)}}[data-copyable-copied]>.\[\[data-copyable-copied\]\>\&\]\:block{display:block}[data-copyable-copied]>.\[\[data-copyable-copied\]\>\&\]\:hidden{display:none}[data-date-variant=danger] .\[\[data-date-variant\=\'danger\'\]_\&\]\:text-rose-500{color:var(--color-rose-500)}[data-date-variant=danger] .dark\:\[\[data-date-variant\=\'danger\'\]_\&\]\:text-rose-400:where(.dark,.dark *){color:var(--color-rose-400)}[data-date-variant=success] .\[\[data-date-variant\=\'success\'\]_\&\]\:text-lime-600{color:var(--color-lime-600)}[data-date-variant=success] .dark\:\[\[data-date-variant\=\'success\'\]_\&\]\:text-lime-400:where(.dark,.dark *){color:var(--color-lime-400)}[data-date-variant=warning] .\[\[data-date-variant\=\'warning\'\]_\&\]\:text-yellow-600{color:var(--color-yellow-600)}[data-date-variant=warning] .dark\:\[\[data-date-variant\=\'warning\'\]_\&\]\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-red-600{border-color:var(--color-red-600)}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-zinc-200\/80{border-color:#e2ddd0cc}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-zinc-200\/80{border-color:color-mix(in oklab,var(--color-zinc-200) 80%,transparent)}}[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-red-900\/25:where(.dark,.dark *){border-color:#82181a40}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-red-900\/25:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-900) 25%,transparent)}}[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-zinc-900\/50:where(.dark,.dark *){border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-zinc-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-zinc-900) 50%,transparent)}}[data-flux-color-picker-button]:hover .\[\[data-flux-color-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-color-picker-button]:hover .dark\:\[\[data-flux-color-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-command-input]:has(input:placeholder-shown) .\[\[data-flux-command-input\]\:has\(input\:placeholder-shown\)_\&\]\:hidden{display:none}[data-flux-container] .\[\[data-flux-container\]_\&\]\:px-0{padding-inline:0}[data-flux-date-picker-button]:has([data-flux-date-picker-placeholder]) .\[\[data-flux-date-picker-button\]\:has\(\[data-flux-date-picker-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-date-picker-button]:hover .\[\[data-flux-date-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-date-picker-button]:hover .dark\:\[\[data-flux-date-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-date-picker][disabled] .\[\[data-flux-date-picker\]\[disabled\]_\&\]\:hidden{display:none}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-white\/10:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-white\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}[data-flux-file-upload-trigger]:hover .\[\[data-flux-file-upload-trigger\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-file-upload-trigger]:hover .dark\:\[\[data-flux-file-upload-trigger\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:flex{display:flex}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:flex-1{flex:1}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:items-center{align-items:center}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:items-stretch{align-items:stretch}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:gap-0{gap:0}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-y{border-block-style:var(--tw-border-style);border-block-width:1px}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:bg-white{background-color:var(--color-white)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:px-4{padding-inline:calc(var(--spacing) * 4)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:border-zinc-600:where(.dark,.dark *){border-color:var(--color-zinc-600)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:bg-zinc-700:where(.dark,.dark *){background-color:var(--color-zinc-700)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}[data-flux-input]:has(input:placeholder-shown) .\[\[data-flux-input\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-input]:has(input[disabled]) .\[\[data-flux-input\]\:has\(input\[disabled\]\)_\&\]\:hidden{display:none}[data-flux-input]:hover .\[\[data-flux-input\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-input]:hover .dark\:\[\[data-flux-input\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-loading]>.\[\[data-flux-loading\]\>\&\]\:block{display:block}[data-flux-menu-item-icon]:hover .\[\[data-flux-menu-item-icon\]\:hover_\&\]\:text-current,[data-flux-menu-item]:hover .\[\[data-flux-menu-item\]\:hover_\&\]\:text-current{color:currentColor}[data-flux-menu]:has(>[data-flux-menu-item-has-icon]) .\[\[data-flux-menu\]\:has\(\>\[data-flux-menu-item-has-icon\]\)_\&\]\:block{display:block}[data-flux-phone-ready] .\[\[data-flux-phone-ready\]_\&\]\:flex{display:flex}[data-flux-phone-ready] .\[\[data-flux-phone-ready\]_\&\]\:hidden{display:none}[data-flux-pillbox-search]:has([data-flux-loading]) .\[\[data-flux-pillbox-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-0{opacity:0}[data-flux-pillbox-search]:has([data-flux-loading]) .\[\[data-flux-pillbox-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-100{opacity:1}[data-flux-pillbox-search]:has(input:placeholder-shown) .\[\[data-flux-pillbox-search\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-pillbox-trigger]:has([data-flux-pillbox-placeholder]) .\[\[data-flux-pillbox-trigger\]\:has\(\[data-flux-pillbox-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-pillbox-trigger]:hover .\[\[data-flux-pillbox-trigger\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-pillbox-trigger]:hover .dark\:\[\[data-flux-pillbox-trigger\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-pillbox][disabled]:has([data-selected]) .\[\[data-flux-pillbox\]\[disabled\]\:has\(\[data-selected\]\)_\&\]\:hidden,[data-flux-select-button]:has([data-flux-select-placeholder]) .\[\[data-flux-select-button\]\:has\(\[data-flux-select-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-select-button]:hover .\[\[data-flux-select-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-select-button]:hover .dark\:\[\[data-flux-select-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-select-search]:has([data-flux-loading]) .\[\[data-flux-select-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-0{opacity:0}[data-flux-select-search]:has([data-flux-loading]) .\[\[data-flux-select-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-100{opacity:1}[data-flux-select-search]:has(input:placeholder-shown) .\[\[data-flux-select-search\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-select]:has([disabled][data-selected]) .\[\[data-flux-select\]\:has\(\[disabled\]\[data-selected\]\)_\&\]\:hidden,[data-flux-select][disabled]:has([data-selected]) .\[\[data-flux-select\]\[disabled\]\:has\(\[data-selected\]\)_\&\]\:hidden{display:none}[data-flux-sidebar-group-dropdown]>button:hover .\[\[data-flux-sidebar-group-dropdown\]\>button\:hover_\&\]\:text-current,[data-flux-sidebar-group-dropdown]>button:hover :is(:where([data-flux-menu]) .in-data-flux-menu\:\[\[data-flux-sidebar-group-dropdown\]\>button\:hover_\&\]\:text-current){color:currentColor}[data-flux-sidebar-item]:hover .\[\[data-flux-sidebar-item\]\:hover_\&\]\:text-current\!,[data-flux-sidebar-item][data-active] .\[\[data-flux-sidebar-item\]\[data-active\]_\&\]\:text-current\!{color:currentColor!important}[data-flux-subheading]+.\[\[data-flux-subheading\]\+\&\]\:mt-2{margin-top:calc(var(--spacing) * 2)}[data-flux-tab][data-selected] .\[\[data-flux-tab\]\[data-selected\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-tab][data-selected] .dark\:\[\[data-flux-tab\]\[data-selected\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-time-picker-button]:has([data-flux-time-picker-placeholder]) .\[\[data-flux-time-picker-button\]\:has\(\[data-flux-time-picker-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-time-picker-button]:hover .\[\[data-flux-time-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-time-picker-button]:hover .dark\:\[\[data-flux-time-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-time-picker]:has([disabled]) .\[\[data-flux-time-picker\]\:has\(\[disabled\]\)_\&\]\:hidden{display:none}[data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:bg-accent{background-color:var(--color-accent)}[data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:text-accent-foreground{color:var(--color-accent-foreground)}:is([data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:\*\:bg-accent>*),:is([data-flux-timeline-status=complete]+[data-flux-timeline-item] .\[\[data-flux-timeline-status\=complete\]\+\[data-flux-timeline-item\]_\&\]\:\*\:bg-accent>*){background-color:var(--color-accent)}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:border-2{border-style:var(--tw-border-style);border-width:2px}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:border-accent{border-color:var(--color-accent)}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:bg-transparent{background-color:#0000}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-timeline-status=current] .dark\:\[\[data-flux-timeline-status\=current\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-2{border-style:var(--tw-border-style);border-width:2px}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-zinc-100{border-color:var(--color-zinc-100)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:bg-transparent{background-color:#0000}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:opacity-75{opacity:.75}[data-flux-timeline-status=incomplete] .dark\:\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-zinc-700:where(.dark,.dark *){border-color:var(--color-zinc-700)}[data-flux-timeline-status=incomplete] .dark\:\[\[data-flux-timeline-status\=incomplete\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}:is([data-flux-timeline][data-flux-timeline-size=lg] .\[\[data-flux-timeline\]\[data-flux-timeline-size\=lg\]_\&\]\:\*\:bg-zinc-100>*){background-color:var(--color-zinc-100)}[data-flux-toast-dialog][data-variant=danger] .\[\[data-flux-toast-dialog\]\[data-variant\=danger\]_\&\]\:block,[data-flux-toast-dialog][data-variant=info] .\[\[data-flux-toast-dialog\]\[data-variant\=info\]_\&\]\:block,[data-flux-toast-dialog][data-variant=success] .\[\[data-flux-toast-dialog\]\[data-variant\=success\]_\&\]\:block,[data-flux-toast-dialog][data-variant=warning] .\[\[data-flux-toast-dialog\]\[data-variant\=warning\]_\&\]\:block{display:block}[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{--tw-gradient-position:to right in oklab}}[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{background-image:linear-gradient(var(--tw-gradient-stops))}[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{--tw-gradient-position:to left}@supports (background-image:linear-gradient(in lab,red,red)){[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{--tw-gradient-position:to left in oklab}}[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{background-image:linear-gradient(var(--tw-gradient-stops))}[data-month]:first-of-type .\[\[data-month\]\:first-of-type_\&\]\:opacity-0{opacity:0}[data-nav-footer] .\[\[data-nav-footer\]_\&\]\:hidden{display:none}[data-nav-sidebar] [data-nav-footer] .\[\[data-nav-sidebar\]_\[data-nav-footer\]_\&\]\:block{display:block}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-viewable-open]>.\[\[data-viewable-open\]\>\&\]\:block{display:block}[data-viewable-open]>.\[\[data-viewable-open\]\>\&\]\:hidden{display:none}[disabled] .\[\[disabled\]_\&\]\:pointer-events-none{pointer-events:none}[disabled] .\[\[disabled\]_\&\]\:hidden{display:none}[disabled] .\[\[disabled\]_\&\]\:text-zinc-200\!{color:var(--color-zinc-200)!important}[disabled] .\[\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}[disabled] .\[\[disabled\]_\&\]\:text-zinc-400\/70{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){[disabled] .\[\[disabled\]_\&\]\:text-zinc-400\/70{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}[disabled] .\[\[disabled\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}[disabled] .\[\[disabled\]_\&\]\:placeholder-zinc-400\/70::placeholder{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){[disabled] .\[\[disabled\]_\&\]\:placeholder-zinc-400\/70::placeholder{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}[disabled] .\[\[disabled\]_\&\]\:opacity-50{opacity:.5}[disabled] .\[\[disabled\]_\&\]\:opacity-75{opacity:.75}[disabled] .dark\:\[\[disabled\]_\&\]\:text-white\/40\!:where(.dark,.dark *){color:#fff6!important}@supports (color:color-mix(in lab,red,red)){[disabled] .dark\:\[\[disabled\]_\&\]\:text-white\/40\!:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 40%,transparent)!important}}[disabled] .dark\:\[\[disabled\]_\&\]\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}[disabled] .dark\:\[\[disabled\]_\&\]\:text-zinc-500:where(.dark,.dark *),[disabled] .dark\:\[\[disabled\]_\&\]\:placeholder-zinc-500:where(.dark,.dark *)::placeholder{color:var(--color-zinc-500)}[disabled]:hover .\[\[disabled\]\:hover_\&\]\:text-zinc-400{color:var(--color-zinc-400)}[disabled]:hover .dark\:\[\[disabled\]\:hover_\&\]\:text-white\/60:where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){[disabled]:hover .dark\:\[\[disabled\]\:hover_\&\]\:text-white\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}[inline] .\[\[inline\]_\&\]\:col-span-1{grid-column:span 1/span 1}[inline] .\[\[inline\]_\&\]\:col-span-2{grid-column:span 2/span 2}[inline] .\[\[inline\]_\&\]\:col-start-1{grid-column-start:1}[inline] .\[\[inline\]_\&\]\:col-start-2{grid-column-start:2}[inline] .\[\[inline\]_\&\]\:row-start-1{grid-row-start:1}[readonly] .\[\[readonly\]_\&\]\:pointer-events-none{pointer-events:none}[readonly] .\[\[readonly\]_\&\]\:cursor-default{cursor:default}[readonly] .\[\[readonly\]_\&\]\:bg-transparent{background-color:#0000}[snap=mandatory] .\[\[snap\=\"mandatory\"\]_\&\]\:snap-always{scroll-snap-stop:always}td[data-selected] .\[td\[data-selected\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}td[data-selected] .\[td\[data-selected\]_\&\]\:bg-white{background-color:var(--color-white)}td[data-selected] .\[td\[data-selected\]_\&\]\:text-\[var\(--color-accent-foreground\)\]{color:var(--color-accent-foreground)}td[data-selected] .dark\:\[td\[data-selected\]_\&\]\:bg-zinc-800:where(.dark,.dark *){background-color:var(--color-zinc-800)}td[data-selected] .\[td\[data-selected\]_\&\[disabled\]\]\:opacity-50[disabled]{opacity:.5}td[data-selected]+td[data-selected] .\[td\[data-selected\]\+td\[data-selected\]_\&\]\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}td[data-selected]:has(+td[data-selected]) .\[td\[data-selected\]\:has\(\+td\[data-selected\]\)_\&\]\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}td[data-today] .\[td\[data-today\]_\&\]\:flex{display:flex}td[disabled] .\[td\[disabled\]_\&\]\:pointer-events-none{pointer-events:none}td[disabled] .\[td\[disabled\]_\&\]\:cursor-default{cursor:default}td[disabled] .\[td\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:border-transparent{border-color:#0000}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-checkbox[data-checked] .hover\:\[ui-checkbox\[data-checked\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-checkbox[data-checked] .focus\:\[ui-checkbox\[data-checked\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-checkbox[data-checked] .dark\:\[ui-checkbox\[data-checked\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-checkbox[data-checked]:not([data-indeterminate]) .\[ui-checkbox\[data-checked\]\:not\(\[data-indeterminate\]\)_\&\>svg\:first-child\]\:block>svg:first-child{display:block}ui-checkbox[data-checked][disabled] .\[ui-checkbox\[data-checked\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:border-transparent{border-color:#0000}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-checkbox[data-indeterminate] .hover\:\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-checkbox[data-indeterminate] .focus\:\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\>svg\:last-child\]\:block>svg:last-child{display:block}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-checkbox[disabled] .dark\:\[ui-checkbox\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-checkbox[disabled] .dark\:\[ui-checkbox\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-checkbox[disabled][data-checked] .\[ui-checkbox\[disabled\]\[data-checked\]_\&\]\:border-transparent,ui-checkbox[disabled][data-indeterminate] .\[ui-checkbox\[disabled\]\[data-indeterminate\]_\&\]\:border-transparent{border-color:#0000}ui-color-picker:not([value]) .\[ui-color-picker\:not\(\[value\]\)_\&\]\:hidden,ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:hidden{display:none}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:cursor-default{cursor:default}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:border-b-zinc-200{border-bottom-color:var(--color-zinc-200)}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:shadow-none\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:bg-white\/\[7\%\]:where(.dark,.dark *){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:bg-white\/\[7\%\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}ui-color-picker[value] .\[ui-color-picker\[value\]_\&\]\:hidden{display:none}ui-date-picker-trigger:hover:not(:has(input:hover)) .\[ui-date-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-date-picker-trigger:hover:not(:has(input:hover)) .dark\:\[ui-date-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-date-picker[data-empty] .\[ui-date-picker\[data-empty\]_\&\]\:hidden,ui-date-picker[disabled] .\[ui-date-picker\[disabled\]_\&\]\:hidden{display:none}ui-dropdown>.\[ui-dropdown\>\&\]\:w-full{width:100%}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:block{display:block}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:border-transparent{border-color:#0000}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}@media(hover:hover){ui-option[data-selected] .hover\:\[ui-option\[data-selected\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-option[data-selected] .focus\:\[ui-option\[data-selected\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\>div\]\:block>div,ui-option[data-selected] .\[ui-option\[data-selected\]_\&\>svg\:first-child\]\:block>svg:first-child{display:block}ui-option[data-selected][disabled] .\[ui-option\[data-selected\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-option[disabled] .\[ui-option\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-option[disabled] .\[ui-option\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-option[disabled] .dark\:\[ui-option\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-option[disabled] .dark\:\[ui-option\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-option[disabled] :is(ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:\[ui-option\[disabled\]_\&\]\:border-transparent){border-color:#0000}ui-phone[data-invalid] .\[ui-phone\[data-invalid\]_\&\]\:border-red-500\!{border-color:var(--color-red-500)!important}ui-phone[data-invalid] .\[ui-phone\[data-invalid\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:border-transparent{border-color:#0000}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-radio[data-checked] .hover\:\[ui-radio\[data-checked\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-radio[data-checked] .focus\:\[ui-radio\[data-checked\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-radio[data-checked] .dark\:\[ui-radio\[data-checked\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\>div\]\:block>div{display:block}ui-radio[data-checked][disabled] .\[ui-radio\[data-checked\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-radio[disabled] .dark\:\[ui-radio\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-radio[disabled] .dark\:\[ui-radio\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-radio[disabled] :is(ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:\[ui-radio\[disabled\]_\&\]\:border-transparent){border-color:#0000}ui-selected .\[ui-selected_\&\]\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}ui-selected .\[ui-selected_\&\]\:hidden{display:none}ui-selected .\[ui-selected_\&\]\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}ui-selected .\[ui-selected_\&\]\:items-center{align-items:center}ui-selected .\[ui-selected_\&\]\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}ui-selected .\[ui-selected_\&\]\:text-inherit{color:inherit}ui-time-picker-options>[data-selected] .\[ui-time-picker-options\>\[data-selected\]_\&\]\:block{display:block}ui-time-picker-trigger:hover:not(:has(input:hover)) .\[ui-time-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-time-picker-trigger:hover:not(:has(input:hover)) .dark\:\[ui-time-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-time-picker:has([disabled]) .\[ui-time-picker\:has\(\[disabled\]\)_\&\]\:hidden,ui-time-picker[data-empty] .\[ui-time-picker\[data-empty\]_\&\]\:hidden{display:none}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}}@keyframes flux-shimmer{0%{transform:translate(0)}to{transform:translate(200%)}}:has(>[data-flux-main]){grid-template:"header header header""sidebar main aside"1fr"sidebar footer aside"/min-content minmax(0,1fr) min-content;grid-area:body;display:grid}:has(>[data-flux-sidebar]+[data-flux-header]){grid-template-areas:"sidebar header header""sidebar main aside""sidebar footer aside"}@media(min-width:64rem){:has(>[data-flux-main][data-flux-main-inset]){grid-template-rows:auto minmax(0,1fr) auto;height:100dvh}}[data-flux-modal]>dialog,[data-flux-modal]>dialog::backdrop{opacity:0;transition:all 75ms allow-discrete}[data-flux-modal]>dialog:not([open]){display:none}[data-flux-modal]>dialog{transform:scale(.95)}[data-flux-modal]>dialog[data-flux-flyout]{transform:scale(1) var(--flux-flyout-translate,var(--fx-flyout-translate,translateX(50px)))}[data-flux-modal]>dialog[open],[data-flux-modal]>dialog[open]::backdrop{opacity:1;transition:all .15s allow-discrete;transform:translate(0)scale(1)}@starting-style{[data-flux-modal]>dialog[open],[data-flux-modal]>dialog[open]::backdrop{opacity:0}[data-flux-modal]>dialog[open]{transform:scale(.95)}[data-flux-modal]>dialog[open][data-flux-flyout]{transform:scale(1) var(--flux-flyout-translate,var(--fx-flyout-translate,translateX(50px)))}}[data-flux-modal]>dialog::backdrop{background-color:#0000001a}[data-flux-modal]>dialog[data-flux-modal-overflow]{background:0 0;width:100%;max-width:none;height:100%;max-height:none;margin:0;overflow-y:auto;transform:none}[data-flux-modal-content]{transition:transform 75ms allow-discrete;transform:scale(.95)}dialog[open] [data-flux-modal-content]{transition:transform .15s allow-discrete;transform:scale(1)}@starting-style{dialog[open] [data-flux-modal-content]{transform:scale(.95)}}select[data-flux-select-native]{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23d4d4d4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23d4d4d4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-inline-end:2.5rem}[dir=rtl] select[data-flux-select-native]{background-position:.5rem}select[data-flux-select-native]:hover:not(:disabled){background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%2327272a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%2327272a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}.dark select[data-flux-select-native]{background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23A1A1AA' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23A1A1AA' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}.dark select[data-flux-select-native]:hover:not(:disabled){background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}ui-toast{background-color:#0000;max-width:24rem;margin:1.5rem;overflow:visible}ui-toast[position*=top]{margin-bottom:auto}ui-toast[position*=bottom]{margin-top:auto}ui-toast[position*=left],ui-toast[position*=start]{margin-inline-end:auto}ui-toast[position*=center]{margin-left:auto;margin-right:auto}ui-toast[position*=right],ui-toast[position*=end]{margin-inline-start:auto}ui-toast [data-flux-toast-dialog]{opacity:0;transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete;transform:translate(0)}ui-toast [data-flux-toast-dialog].showing{opacity:1;transition:opacity .2s allow-discrete,transform .2s allow-discrete,height .2s allow-discrete;transform:translate(0)}@starting-style{ui-toast [data-flux-toast-dialog]{opacity:0;transform:translate(0)}ui-toast[position*=top]>[data-flux-toast-dialog]{transform:translateY(-.5rem)}ui-toast[position*=top][position*=left]>[data-flux-toast-dialog]{transform:translate(-.5rem)}ui-toast[position*=top][position*=right]>[data-flux-toast-dialog],[dir=rtl] ui-toast[position*=top][position*=left]>[data-flux-toast-dialog]{transform:translate(.5rem)}[dir=rtl] ui-toast[position*=top][position*=right]>[data-flux-toast-dialog]{transform:translate(-.5rem)}ui-toast[position*=bottom]>[data-flux-toast-dialog]{transform:translateY(.5rem)}}ui-toast-group{background-color:#0000;width:24rem;margin:1.5rem;display:flex;overflow:visible}ui-toast-group[position*=top]{margin-bottom:auto}ui-toast-group[position*=bottom]{margin-top:auto}ui-toast-group[position*=left],ui-toast-group[position*=start]{justify-content:flex-start;margin-inline-end:auto}ui-toast-group[position*=center]{justify-content:center;margin-left:auto;margin-right:auto}ui-toast-group[position*=right],ui-toast-group[position*=end]{justify-content:flex-end;margin-inline-start:auto}ui-toast-group [data-flux-toast-dialog]{transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete;position:absolute;transform:translate(0)}[position*=top] :is(ui-toast-group [data-flux-toast-dialog]){padding-bottom:.75rem;top:0}[position*=bottom] :is(ui-toast-group [data-flux-toast-dialog]){padding-top:.75rem;bottom:0}ui-toast-group [data-flux-toast-dialog]>*{transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete}.flux-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.flux-no-scrollbar::-webkit-scrollbar{display:none}.has-focus-visible\:outline-default:has(:focus-visible){outline:auto highlight;outline-color:-webkit-focus-ring-color}[data-flux-timeline]{grid-template-columns:var(--flux-timeline-item-offset) auto var(--flux-timeline-content-gap) 1fr;display:grid}[data-flux-timeline] [data-flux-timeline-item]{grid-template-columns:subgrid;grid-column:2/-1;grid-template-rows:auto 1fr auto 1fr auto;display:grid}[data-flux-timeline] [data-flux-timeline-item]:has([data-flux-timeline-block]){grid-column:1/-1}[data-flux-timeline] [data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading],[data-flux-timeline] [data-flux-timeline-item]:not(:last-child) [data-flux-timeline-gap-trailing]{min-height:calc(var(--flux-timeline-item-gap)/2)}[data-flux-timeline] [data-flux-timeline-item]:first-child [data-flux-timeline-line-leading],[data-flux-timeline] [data-flux-timeline-item]:last-child [data-flux-timeline-line-trailing]{opacity:0}[data-flux-timeline] [data-flux-timeline-indicator]{grid-area:3/1;justify-self:center}[data-flux-timeline] [data-flux-timeline-content]{grid-area:2/3/5;align-self:center;min-width:0}[data-flux-timeline] [data-flux-timeline-line-leading]{grid-area:1/1/3}[data-flux-timeline] [data-flux-timeline-line-trailing]{grid-area:4/1/-1}[data-flux-timeline] [data-flux-timeline-gap-leading]{grid-area:1/3}[data-flux-timeline] [data-flux-timeline-gap-trailing]{grid-area:5/3}[data-flux-timeline][data-flux-timeline-horizontal]{grid-template-columns:initial;grid-template-rows:auto var(--flux-timeline-content-gap) 1fr}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]{grid-template-rows:subgrid;grid-row:1/-1;grid-column:initial;grid-template-columns:auto 1fr auto 1fr auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading],[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:not(:last-child) [data-flux-timeline-gap-trailing]{min-width:calc(var(--flux-timeline-item-gap)/2)}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-indicator]{justify-self:initial;grid-area:1/3;align-self:center}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-content]{justify-self:center;align-self:initial;grid-area:3/2/auto/5}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-line-leading]{grid-area:1/1/auto/3;justify-self:stretch}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-line-trailing]{grid-area:1/4/auto/-1;justify-self:stretch}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-gap-leading]{grid-area:3/1}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-gap-trailing]{grid-area:3/5}[data-flux-timeline][data-flux-timeline-horizontal=inline]{grid-template-rows:auto}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-item]{grid-template-columns:auto auto auto auto 1fr}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-content]{padding-left:var(--flux-timeline-content-gap);padding-right:var(--flux-timeline-content-gap);grid-area:1/4}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-line-leading]{grid-area:1/1/auto/3}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-line-trailing]{grid-area:1/5}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-gap-leading]{grid-area:1/1}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-gap-trailing]{grid-area:1/5}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading],[data-flux-timeline-item] [data-flux-timeline-line-trailing]{flex-direction:column;align-items:center;display:flex}:is([data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading],[data-flux-timeline-item] [data-flux-timeline-line-trailing]) *{width:var(--flux-timeline-line-width);height:calc(100% - var(--flux-timeline-line-gap))}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading]{justify-content:start}[data-flux-timeline-item] [data-flux-timeline-line-trailing]{justify-content:end}[data-flux-timeline-horizontal] [data-flux-timeline-item] :is([data-flux-timeline-line-leading],[data-flux-timeline-line-trailing]){justify-content:center;align-items:initial}[data-flux-timeline-horizontal] [data-flux-timeline-item] :is([data-flux-timeline-line-leading],[data-flux-timeline-line-trailing]) *{height:var(--flux-timeline-line-width);width:calc(100% - var(--flux-timeline-line-gap))}[data-flux-timeline-horizontal] [data-flux-timeline-item] [data-flux-timeline-line-leading]{align-items:start}[data-flux-timeline-horizontal] [data-flux-timeline-item] [data-flux-timeline-line-trailing]{align-items:end}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=start] [data-flux-timeline-item]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=start] [data-flux-timeline-content]{align-self:start}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=start]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=start] [data-flux-timeline-content]{align-self:start}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=end] [data-flux-timeline-item]{grid-template-rows:auto 1fr auto auto auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=end] [data-flux-timeline-content]{align-self:end}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=end]{grid-template-rows:auto 1fr auto auto auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=end] [data-flux-timeline-content]{align-self:end}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-item]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-content]{grid-row:3/5;align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-indicator]{align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline] [data-flux-timeline-content]{grid-row:3/5;align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline] [data-flux-timeline-indicator]{align-self:baseline}:is([data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=start],[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=baseline]) [data-flux-timeline-item]{grid-template-columns:auto auto auto 1fr auto}:is([data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=start],[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=baseline]) [data-flux-timeline-content]{justify-self:start}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:is([data-flux-timeline-align=start],[data-flux-timeline-align=baseline]){grid-template-columns:auto auto auto 1fr auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:is([data-flux-timeline-align=start],[data-flux-timeline-align=baseline]) [data-flux-timeline-content]{justify-self:start}[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=end] [data-flux-timeline-item]{grid-template-columns:auto 1fr auto auto auto}[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=end] [data-flux-timeline-content]{justify-self:end}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item][data-flux-timeline-align=end]{grid-template-columns:auto 1fr auto auto auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item][data-flux-timeline-align=end] [data-flux-timeline-content]{justify-self:end}[data-flux-timeline]:has([data-flux-timeline-block]){--flux-timeline-item-offset:calc(var(--spacing) * 3)}[data-flux-timeline-item] [data-flux-timeline-block]{grid-template-columns:subgrid;grid-area:2/1/5/-1;display:grid}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]{grid-template-columns:subgrid;grid-column:1/-1;display:grid}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]>:first-child{grid-column:2;justify-self:center}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]>:nth-child(2){grid-column:4}[data-flux-timeline-item] [data-flux-timeline-block]>:not([data-flux-timeline-subgrid]){grid-column:1/-1}[data-flux-timeline-item] [data-flux-timeline-line-leading]:has(~[data-flux-timeline-block]){grid-area:1/2/2}[data-flux-timeline-item] [data-flux-timeline-line-leading]:has(~[data-flux-timeline-block]) *{height:100%!important}[data-flux-timeline-item] [data-flux-timeline-block]~[data-flux-timeline-line-trailing]{grid-area:5/2/-1}[data-flux-timeline-item] [data-flux-timeline-block]~[data-flux-timeline-line-trailing] *{height:100%!important}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading]:has(~[data-flux-timeline-block]),[data-flux-timeline-item]:not(:last-child) [data-flux-timeline-block]~[data-flux-timeline-gap-trailing]{height:var(--flux-timeline-item-gap)}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}[data-flux-field]:not(ui-radio,ui-checkbox){gap:calc(var(--spacing) * 2);display:grid}[data-flux-label]{--tw-leading:var(--leading-tight)!important;line-height:var(--leading-tight)!important;margin-bottom:0!important}[data-flux-sidebar]{background:var(--color-bg-elev);border-color:var(--color-bg-rule)}[data-flux-navlist] [data-flux-navlist-group-heading],[data-flux-navlist] [data-flux-group-heading]{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-4);padding-bottom:6px;font-size:10px;font-weight:700}[data-flux-navlist-item]{color:var(--color-ink-2);border-radius:var(--radius-sm);font-size:13px;font-weight:500;transition:background .12s,color .12s}[data-flux-navlist-item]:hover{background:var(--color-bg);color:var(--color-hub)}.dark [data-flux-navlist-item]:hover{background:var(--color-hub-soft);color:var(--color-hub)}[data-flux-navlist-item]:active,[data-flux-navlist-item]:focus{background:var(--color-hub-soft);color:var(--color-hub);outline:none}[data-flux-navlist-item]{-webkit-tap-highlight-color:transparent}[data-flux-navlist-item]:focus-visible{outline:2px solid var(--color-hub);outline-offset:-2px}[data-flux-navlist-item][data-current=true],[data-flux-navlist-item][aria-current=page],[data-flux-navlist-item].active{background:var(--color-hub-soft);color:var(--color-hub);font-weight:600;position:relative}[data-flux-navlist-item][data-current=true]:before,[data-flux-navlist-item][aria-current=page]:before,[data-flux-navlist-item].active:before{content:"";background:var(--color-hub);border-radius:0 2px 2px 0;width:2px;position:absolute;top:6px;bottom:6px;left:-1px}[data-flux-button].hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:var(--color-hub-2)!important}[data-flux-button].bg-\[var\(--color-accent\)\]{border-color:var(--color-hub-2);box-shadow:inset 0 1px #ffffff2e,0 1px 2px #1a254040,0 2px 6px -2px #1a25402e}[data-flux-button].bg-\[var\(--color-accent\)\]:hover{box-shadow:inset 0 1px #ffffff26,0 2px 4px #1a254059,0 3px 10px -2px #1a254040}.dark [data-flux-button].bg-\[var\(--color-accent\)\]{border-color:var(--color-hub);box-shadow:inset 0 1px #ffffff1f,0 1px 2px #00000080,0 2px 6px -2px #0006}.dark [data-flux-button].bg-\[var\(--color-accent\)\]:hover{box-shadow:inset 0 1px #ffffff1a,0 2px 4px #0009,0 3px 10px -2px #00000080}[data-flux-card]{background:var(--color-bg-card);border-color:var(--color-bg-rule)}[data-flux-heading]{color:var(--color-ink)}input:focus[data-flux-control],textarea:focus[data-flux-control],select:focus[data-flux-control]{--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);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-color:var(--color-hub);--tw-ring-offset-color:var(--color-bg-elev);border-color:var(--color-hub)!important}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-mask-linear{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-radial{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-conic{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-left{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-right{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-bottom{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-top{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-right-from-position{syntax:"*";inherits:false;initial-value:0%}@property --tw-mask-right-to-position{syntax:"*";inherits:false;initial-value:100%}@property --tw-mask-right-from-color{syntax:"*";inherits:false;initial-value:black}@property --tw-mask-right-to-color{syntax:"*";inherits:false;initial-value:transparent}@property --tw-mask-left-from-position{syntax:"*";inherits:false;initial-value:0%}@property --tw-mask-left-to-position{syntax:"*";inherits:false;initial-value:100%}@property --tw-mask-left-from-color{syntax:"*";inherits:false;initial-value:black}@property --tw-mask-left-to-color{syntax:"*";inherits:false;initial-value:transparent}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/portal/portal-x09-Mi7V.css b/public/build/portal/portal-x09-Mi7V.css deleted file mode 100644 index bf4eaf6d..00000000 --- a/public/build/portal/portal-x09-Mi7V.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.3 | 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-border-spacing-x:0;--tw-border-spacing-y:0;--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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-mask-linear:linear-gradient(#fff, #fff);--tw-mask-radial:linear-gradient(#fff, #fff);--tw-mask-conic:linear-gradient(#fff, #fff);--tw-mask-left:linear-gradient(#fff, #fff);--tw-mask-right:linear-gradient(#fff, #fff);--tw-mask-bottom:linear-gradient(#fff, #fff);--tw-mask-top:linear-gradient(#fff, #fff);--tw-mask-right-from-position:0%;--tw-mask-right-to-position:100%;--tw-mask-right-from-color:black;--tw-mask-right-to-color:transparent;--tw-mask-left-from-position:0%;--tw-mask-left-to-position:100%;--tw-mask-left-from-color:black;--tw-mask-left-to-color:transparent;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", Inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:#fbfaf6;--color-zinc-100:#f6f4ef;--color-zinc-200:#e2ddd0;--color-zinc-300:#cfc8b5;--color-zinc-400:#8a918d;--color-zinc-500:#5a6360;--color-zinc-600:#3a413d;--color-zinc-700:#1a1f1c;--color-zinc-800:#243152;--color-zinc-900:#1a2540;--color-zinc-950:#0f1729;--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-accent:var(--color-hub);--color-accent-content:var(--color-hub);--color-accent-foreground:#fff;--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e2ddd0;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1a1f1c;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#efeadc;--color-bg-card-warm-border:#d6cfbb;--color-bg-card-warm-hover:#e6deca;--color-bg-card-warm-rule:#c8bda3;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a2540;--color-topbar2:#243152;--color-topbar-deep:#0f1729;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#b07a3a;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1a1f1c;--color-ink-2:#3a413d;--color-ink-3:#5a6360;--color-ink-4:#8a918d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b2b9c7;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#7b8fbf;--color-ink-on-dark-rule:#2a3550;--color-brand:#1a2540;--color-brand-deep:#0f1729;--color-brand-soft:#e5e9f1;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#c84a1e;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5a6360;--color-card-warm-title:#2a302d;--color-feature-line:#c0c8db;--color-feature-dot:#d8dde9;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047}.dark{--color-accent:var(--color-white);--color-accent-content:var(--color-white);--color-accent-foreground:var(--color-zinc-800)}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}ui-button{display:block}ui-dropdown{display:inline-flex}ui-label{cursor:default;display:inline-block}ui-description,ui-legend,ui-select{display:block}ui-selected-option{display:contents}ui-options:not([popover]),ui-option,ui-option-create,ui-option-empty,ui-empty{cursor:default;display:block}ui-pillbox,ui-file-upload,ui-checkbox-group{display:block}ui-checkbox,ui-switch{-webkit-user-select:none;user-select:none;display:inline-block}ui-radio-group{display:block}ui-radio{-webkit-user-select:none;user-select:none;display:inline-block}ui-date-picker,ui-time-picker,ui-calendar{display:block}ui-calendar-preset,ui-calendar-previous,ui-calendar-next,ui-calender-next{-webkit-user-select:none;user-select:none;display:block}ui-menu[popover]:popover-open{display:block}ui-menu[popover].\:popover-open{display:block}ui-menu-checkbox,ui-menu-radio{cursor:default;display:contents}ui-disclosure{display:block}ui-tab-group,ui-tabs{cursor:default;display:block}ui-resizable,ui-composer,ui-editor,ui-editor-content,ui-progress,ui-carousel,ui-carousel-track,ui-carousel-slide{display:block}ui-tooltip{display:inline-flex}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components{:where([data-flux-timeline]){--flux-timeline-item-gap:calc(var(--spacing) * 4);--flux-timeline-item-offset:0px;--flux-timeline-content-gap:calc(var(--spacing) * 3);--flux-timeline-line-gap:var(--spacing);--flux-timeline-line-width:1px;--flux-timeline-indicator-size:calc(var(--spacing) * 8)}:where([data-flux-timeline-horizontal]){--flux-timeline-content-gap:calc(var(--spacing) * 2)}:where([data-flux-timeline][data-flux-timeline-size=lg]){--flux-timeline-item-gap:calc(var(--spacing) * 8);--flux-timeline-content-gap:calc(var(--spacing) * 4);--flux-timeline-line-gap:0px;--flux-timeline-line-width:2px}:where([data-flux-timeline-size=lg]){--flux-timeline-indicator-size:calc(var(--spacing) * 12)}:where([data-flux-timeline-horizontal][data-flux-timeline-size=lg]),:where([data-flux-timeline-horizontal] [data-flux-timeline-size=lg]){--flux-timeline-item-gap:calc(var(--spacing) * 4);--flux-timeline-content-gap:calc(var(--spacing) * 3)}:where([data-flux-card],[data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-radius:var(--radius-xl);--flux-card-inset-radius:var(--radius-lg);--flux-card-action-height:calc(var(--spacing) * 8);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=xs]){--flux-card-px:calc(var(--spacing) * 4);--flux-card-py:calc(var(--spacing) * 3);--flux-card-inset-radius:var(--radius-md);--flux-card-radius:var(--radius-lg);--flux-card-leading:calc(var(--spacing) * 5);--flux-card-gap:calc(var(--spacing) * 5)}:where([data-flux-card-size=sm]){--flux-card-px:calc(var(--spacing) * 4);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-md);--flux-card-radius:var(--radius-lg);--flux-card-leading:calc(var(--spacing) * 5);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=md]){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-lg);--flux-card-radius:var(--radius-xl);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card-size=lg]){--flux-card-px:calc(var(--spacing) * 6);--flux-card-py:calc(var(--spacing) * 4);--flux-card-inset-radius:var(--radius-xl);--flux-card-radius:var(--radius-2xl);--flux-card-leading:calc(var(--spacing) * 6);--flux-card-gap:calc(var(--spacing) * 6)}:where([data-flux-card],[data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-gutter:0px;--flux-card-hang-y:calc((var(--flux-card-action-height) - var(--flux-card-leading)) / 2);--flux-card-padding:var(--flux-card-px);--flux-card-part-px:0px;--flux-card-part-py:0px;--flux-card-body-padding:0px;--flux-card-body-px:var(--flux-card-body-padding);--flux-card-hang-x:var(--flux-card-hang-y);--flux-card-part-gap:var(--flux-card-gap);--flux-bleed-x:var(--flux-card-padding);--flux-bleed-top:var(--flux-card-padding);--flux-bleed-bottom:var(--flux-card-padding);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-edge:0px;--flux-bleed:var(--flux-bleed-x);--flux-card-body-bleed:var(--flux-card-padding);--flux-card-band-radius:max(0px, calc(var(--flux-card-radius) - var(--flux-card-padding) - 1px))}:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])){--flux-card-padding:var(--flux-card-gutter);--flux-card-part-px:calc(var(--flux-card-px) - var(--flux-card-gutter));--flux-card-part-py:calc(var(--flux-card-py) - var(--flux-card-gutter));--flux-card-part-gap:var(--flux-card-py);--flux-card-body-padding:var(--flux-card-px);--flux-card-hang-x:calc(var(--flux-card-px) - var(--flux-card-py) + var(--flux-card-hang-y));--flux-card-body-bleed:var(--flux-card-body-padding)}:where([data-flux-card][data-flux-card-body-variant=inset]){--flux-card-gutter:var(--spacing);--flux-card-body-px:calc(var(--flux-card-px) - var(--flux-card-gutter) - 1px);--flux-card-body-bleed:var(--flux-card-body-px)}:where([data-flux-card-standalone]:not(:where([data-flux-card] *))){--flux-card-hang-x:0px;--flux-card-part-gap:calc(var(--flux-card-gap) - var(--spacing))}:where([data-flux-card-standalone]:not(:where([data-flux-card] *))[data-flux-card-footer]),:where([data-flux-card-standalone]:not(:where([data-flux-card] *))[data-flux-card-header]:has(>[data-flux-text])){--flux-card-hang-y:0px}:where([data-flux-card]){padding:var(--flux-card-padding);border-radius:var(--flux-card-radius)}:where([data-flux-card-body]){padding:var(--flux-card-body-padding) var(--flux-card-body-px);--flux-bleed-x:var(--flux-card-body-bleed);--flux-bleed-top:var(--flux-card-body-padding);--flux-bleed-bottom:var(--flux-card-body-padding);--flux-bleed-top-radius:0px;--flux-bleed-bottom-radius:0px;--flux-bleed-edge:0px;--flux-bleed:var(--flux-bleed-x);--flux-card-part-px:0px;--flux-card-part-py:0px;--flux-card-part-gap:var(--flux-card-gap);--flux-card-hang-x:var(--flux-card-hang-y);--flux-card-band-radius:0px}:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){border-radius:var(--flux-card-inset-radius);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-inset-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-inset-radius) - 1px));--flux-bleed-edge:1px;background-clip:padding-box;position:relative}:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])):where([data-flux-card-body-variant=flush]>:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])),[data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]))){border-radius:var(--flux-card-radius);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:is(:where([data-flux-card][data-flux-card-body-variant=inset]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]),:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body])):before{content:"";border-radius:inherit;pointer-events:none;position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){z-index:1;--flux-card-body-clip-x:0px;--flux-card-body-clip-top:0px;--flux-card-body-clip-bottom:0px;--flux-card-body-clip-top-radius:var(--flux-card-radius);--flux-card-body-clip-bottom-radius:var(--flux-card-radius);margin:-1px}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(.dark,.dark *){--flux-card-body-clip-x:1px;--flux-card-body-clip-top:1px;--flux-card-body-clip-bottom:1px;--flux-card-body-clip-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-card-body-clip-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-card-body-clip-top:-1px;--flux-card-body-clip-top-radius:0px;margin-top:0}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-card-body-clip-bottom:-3px;--flux-card-body-clip-bottom-radius:0px;margin-bottom:0}:where([data-flux-card][data-flux-card-body-variant=flush]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):before{clip-path:inset(var(--flux-card-body-clip-top) var(--flux-card-body-clip-x) var(--flux-card-body-clip-bottom) round var(--flux-card-body-clip-top-radius) var(--flux-card-body-clip-top-radius) var(--flux-card-body-clip-bottom-radius) var(--flux-card-body-clip-bottom-radius))}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){--flux-bleed-top:var(--flux-card-padding);--flux-bleed-bottom:var(--flux-card-padding);--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-bleed-top:calc(var(--flux-card-gap) - var(--flux-card-py));--flux-bleed-top-radius:0px}:where([data-flux-card][data-flux-card-body-variant=seamless]>[data-flux-card-body],[data-flux-card][data-flux-card-body-variant=seamless]>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-bleed-bottom:0px;--flux-bleed-bottom-radius:0px}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]){--flux-bleed-top-radius:max(0px, calc(var(--flux-card-radius) - 1px));--flux-bleed-bottom-radius:max(0px, calc(var(--flux-card-radius) - 1px))}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where([data-flux-card-header]~*){--flux-bleed-top-radius:0px}:where([data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>[data-flux-card-body],[data-flux-card]:is([data-flux-card-body-variant=divided],[data-flux-card-body-variant=separated])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-body]):where(:has(~[data-flux-card-footer])){--flux-bleed-bottom-radius:0px}:where([data-flux-card-bleed]){margin-inline:calc((var(--flux-bleed-x) + var(--flux-bleed-edge)) * -1);overflow:hidden}:where([data-flux-table-bleed]){--flux-bleed-edge:0px}:where(:is([data-flux-card],[data-flux-card-body])>:is([data-flux-card-bleed],[data-flux-table-bleed]):first-child){margin-top:calc((var(--flux-bleed-top) + var(--flux-bleed-edge)) * -1);border-start-start-radius:calc(var(--flux-bleed-top-radius) + var(--flux-bleed-edge));border-start-end-radius:calc(var(--flux-bleed-top-radius) + var(--flux-bleed-edge))}:where(:is([data-flux-card],[data-flux-card-body])>:is([data-flux-card-bleed],[data-flux-table-bleed]):last-child){margin-bottom:calc((var(--flux-bleed-bottom) + var(--flux-bleed-edge)) * -1);border-end-end-radius:calc(var(--flux-bleed-bottom-radius) + var(--flux-bleed-edge));border-end-start-radius:calc(var(--flux-bleed-bottom-radius) + var(--flux-bleed-edge))}:where([data-flux-card-header],[data-flux-card-footer]){padding-inline:var(--flux-card-part-px);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;display:grid}:where([data-flux-card-header],[data-flux-card-footer])>:where(*){grid-column-start:2}:where([data-flux-card-header]){padding-block:var(--flux-card-part-py) var(--flux-card-part-gap);border-start-start-radius:var(--flux-card-band-radius);border-start-end-radius:var(--flux-card-band-radius);grid-template-rows:1fr}:where([data-flux-card-header]):where([data-flux-card-standalone]:not(:where([data-flux-card] *))){padding-top:var(--flux-card-hang-y)}:where([data-flux-card-footer]){padding-block:var(--flux-card-part-gap) var(--flux-card-part-py);--flux-card-hang-x:0px;border-end-end-radius:var(--flux-card-band-radius);border-end-start-radius:var(--flux-card-band-radius)}:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])>[data-flux-card-footer]),:where([data-flux-card][data-flux-card-body-variant]:not([data-flux-card-body-variant=seamless])>:not([data-flux-card],[data-flux-card-body])>[data-flux-card-footer]){--flux-card-hang-x:calc(var(--flux-card-px) - var(--flux-card-py) + var(--flux-card-hang-y))}:where(:is([data-flux-card],[data-flux-card-body],[data-flux-card]>:not([data-flux-card]))>[data-flux-card-footer]:first-child){padding-top:var(--flux-card-part-py)}:where(:is([data-flux-card],[data-flux-card-body],[data-flux-card]>:not([data-flux-card]))>[data-flux-card-header]:last-child){padding-bottom:var(--flux-card-part-py)}:where([data-flux-card-header],[data-flux-card-footer])>:where([data-flux-card-actions]){margin-block:calc(var(--flux-card-hang-y) * -1);margin-inline:calc(var(--spacing) * 4) calc(var(--flux-card-hang-x) * -1);grid-row:1/span 2;grid-column-start:3;align-self:start}:where([data-flux-card-header],[data-flux-card-footer])>:where([data-flux-card-actions]):where(:first-child:not(:only-child)){margin-inline:calc(var(--flux-card-hang-x) * -1) calc(var(--spacing) * 4);grid-column-start:1}:where([data-flux-card-footer])>:where([data-flux-card-actions]){grid-row:1;align-self:center}.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow{letter-spacing:.2em;text-transform:uppercase;color:var(--color-hub);font-size:11px;font-weight:700}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.eyebrow.on-dark{color:var(--color-hub-line)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #b07a3a80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #1a254099;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #1a254080}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}}@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.absolute\!{position:absolute!important}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.end-0{inset-inline-end:calc(var(--spacing) * 0)}.end-\[-2px\]{inset-inline-end:-2px}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[-2px\]{top:-2px}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.right-\[-44px\]{right:-44px}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.bottom-\[-1rem\]{bottom:-1rem}.bottom-\[-3px\]{bottom:-3px}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[-44px\]{left:-44px}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-0{z-index:0}.z-1{z-index:1}.z-10{z-index:10}.z-20{z-index:20}.z-20\!{z-index:20!important}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.m-\[-2px\]{margin:-2px}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-1\.25{margin-inline:calc(var(--spacing) * -1.25)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.-mx-\[\.3125rem\]{margin-inline:-.3125rem}.-mx-\[var\(--flux-bleed\,1\.5rem\)\]{margin-inline:calc(var(--flux-bleed,1.5rem) * -1)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-6{margin-inline:calc(var(--spacing) * 6)}.mx-\[-5px\]{margin-inline:-5px}.mx-auto{margin-inline:auto}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-\[calc\(0\.25rem-1px\)\]{margin-block:calc(1px - .25rem)}.-my-\[calc\(0\.25rem-2px\)\]{margin-block:calc(2px - .25rem)}.-my-px{margin-block:-1px}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-1\.25{margin-block:calc(var(--spacing) * 1.25)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.my-\[\.3125rem\]{margin-block:.3125rem}.my-px{margin-block:1px}.-ms-1{margin-inline-start:calc(var(--spacing) * -1)}.-ms-1\.5{margin-inline-start:calc(var(--spacing) * -1.5)}.-ms-2{margin-inline-start:calc(var(--spacing) * -2)}.-ms-2\.5{margin-inline-start:calc(var(--spacing) * -2.5)}.-ms-3{margin-inline-start:calc(var(--spacing) * -3)}.-ms-4{margin-inline-start:calc(var(--spacing) * -4)}.ms-1{margin-inline-start:var(--spacing)}.ms-1\.5{margin-inline-start:calc(var(--spacing) * 1.5)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.ms-5{margin-inline-start:calc(var(--spacing) * 5)}.ms-auto{margin-inline-start:auto}.-me-1{margin-inline-end:calc(var(--spacing) * -1)}.-me-1\.5{margin-inline-end:calc(var(--spacing) * -1.5)}.-me-2{margin-inline-end:calc(var(--spacing) * -2)}.-me-2\.5{margin-inline-end:calc(var(--spacing) * -2.5)}.-me-3{margin-inline-end:calc(var(--spacing) * -3)}.-me-4{margin-inline-end:calc(var(--spacing) * -4)}.-me-\[\.3125rem\]{margin-inline-end:-.3125rem}.-me-\[calc\(var\(--spacing\)\*1\.25\)\]{margin-inline-end:calc(calc(var(--spacing) * 1.25) * -1)}.me-1{margin-inline-end:var(--spacing)}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-3{margin-inline-end:calc(var(--spacing) * 3)}.me-4{margin-inline-end:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}.-mt-2\.5{margin-top:calc(var(--spacing) * -2.5)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-\[\.3125rem\]{margin-top:-.3125rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-0\.25{margin-top:calc(var(--spacing) * .25)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[-5px\]{margin-top:-5px}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mr-auto{margin-right:auto}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.-mb-1\.5{margin-bottom:calc(var(--spacing) * -1.5)}.-mb-2\.5{margin-bottom:calc(var(--spacing) * -2.5)}.-mb-3{margin-bottom:calc(var(--spacing) * -3)}.-mb-\[\.3125rem\]{margin-bottom:-.3125rem}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-0\.25{margin-bottom:calc(var(--spacing) * .25)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[5px\]{margin-bottom:5px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.-ml-px{margin-left:-1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.field-sizing-content{field-sizing:content}.aspect-\[3\/2\]{aspect-ratio:3/2}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1{width:var(--spacing);height:var(--spacing)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-2\/3{width:66.6667%;height:66.6667%}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-4\!{width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-5\!{width:calc(var(--spacing) * 5)!important;height:calc(var(--spacing) * 5)!important}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-13{width:calc(var(--spacing) * 13);height:calc(var(--spacing) * 13)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[1\.125rem\]{width:1.125rem;height:1.125rem}.size-\[6px\]{width:6px;height:6px}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[calc\(2rem\+2px\)\]{height:calc(2rem + 2px)}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-auto\!{height:auto!important}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[20rem\]{max-height:20rem}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[100vh\]{max-height:100vh}.max-h-\[300px\]{max-height:300px}.max-h-\[calc\(100dvh-1rem\)\]{max-height:calc(100dvh - 1rem)}.max-h-dvh{max-height:100dvh}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[calc\(100dvh-1rem\)\]{min-height:calc(100dvh - 1rem)}.min-h-\[…\]{min-height:…}.min-h-auto{min-height:auto}.min-h-dvh{min-height:100dvh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-6\!{width:calc(var(--spacing) * 6)!important}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-8\!{width:calc(var(--spacing) * 8)!important}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(2ch\+2px\)\]{width:calc(2ch + 2px)}.w-\[calc\(4ch\+2px\)\]{width:calc(4ch + 2px)}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-\[full\]{width:full}.w-auto{width:auto}.w-auto\!{width:auto!important}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-1\/2{max-width:50%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-full{max-width:100%}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-2{min-width:calc(var(--spacing) * 2)}.min-w-3{min-width:calc(var(--spacing) * 3)}.min-w-4{min-width:calc(var(--spacing) * 4)}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-6{min-width:calc(var(--spacing) * 6)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-12{min-width:calc(var(--spacing) * 12)}.min-w-72{min-width:calc(var(--spacing) * 72)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[10rem\]{min-width:10rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[100\%\]{min-width:100%}.min-w-\[120px\]{min-width:120px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[360px\]{min-width:360px}.min-w-\[calc\(100\%-1rem\)\]{min-width:calc(100% - 1rem)}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:0px;--tw-border-spacing-y:0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[0\.1875rem\]{--tw-translate-x:.1875rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[0\.9375rem\]{--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-x{resize:horizontal}.resize-y{resize:vertical}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-proximity{--tw-scroll-snap-strictness:proximity}.snap-start{scroll-snap-align:start}.scroll-my-\[\.3125rem\]{scroll-margin-block:.3125rem}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.scroll-px-\[var\(--flux-bleed\,1\.5rem\)\]{scroll-padding-inline:var(--flux-bleed,1.5rem)}.scroll-py-\[\.3125rem\]{scroll-padding-block:.3125rem}.\[scrollbar-width\:none\]{scrollbar-width:none}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_1fr_auto\]{grid-template-columns:auto 1fr 1fr auto}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.grid-rows-\[auto_auto_auto_auto_auto\]{grid-template-rows:auto auto auto auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overscroll-contain{overscroll-behavior:contain}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-y-none{overscroll-behavior-y:none}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[\.3rem\]{border-radius:.3rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[var\(--avatar-radius\)\]{border-radius:var(--avatar-radius)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s-lg{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.rounded-s-md{border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md)}.rounded-s-none\!{border-start-start-radius:0!important;border-end-start-radius:0!important}.rounded-e-lg{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.rounded-e-md{border-start-end-radius:var(--radius-md);border-end-end-radius:var(--radius-md)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-\[calc\(0\.5rem-1px\)\]{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-0\!{border-style:var(--tw-border-style)!important;border-width:0!important}.border-1{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-e\!{border-inline-end-style:var(--tw-border-style)!important;border-inline-end-width:1px!important}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.border-b-\[2px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--callout-border\){border-color:var(--callout-border)}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_18\%\,_var\(--color-zinc-200\)\)\]{border-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_18\%\,_var\(--color-zinc-200\)\)\]{border-color:color-mix(in oklab,var(--color-button-border) 18%,var(--color-zinc-200))}}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#1a254059}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1a1f1c33}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-red-500{border-color:var(--color-red-500)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-200\!{border-color:var(--color-zinc-200)!important}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-800\/10{border-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/10{border-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.border-zinc-800\/15{border-color:#24315226}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/15{border-color:color-mix(in oklab,var(--color-zinc-800) 15%,transparent)}}.border-x-zinc-100{border-inline-color:var(--color-zinc-100)}.border-t-transparent{border-top-color:#0000}.border-b-\[color-mix\(in_oklab\,_color-mix\(in_oklab\,_var\(--color-button-border\)_26\%\,_var\(--color-zinc-300\)\)_80\%\,_transparent\)\]{border-bottom-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.border-b-\[color-mix\(in_oklab\,_color-mix\(in_oklab\,_var\(--color-button-border\)_26\%\,_var\(--color-zinc-300\)\)_80\%\,_transparent\)\]{border-bottom-color:color-mix(in oklab,color-mix(in oklab,var(--color-button-border) 26%,var(--color-zinc-300)) 80%,transparent)}}.border-b-zinc-300\/80{border-bottom-color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.border-b-zinc-300\/80{border-bottom-color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\(--callout-background\){background-color:var(--callout-background)}.bg-\(--flux-chart-color\){background-color:var(--flux-chart-color)}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]{background-color:color-mix(in oklab,var(--color-button-soft),transparent 80%)}}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-accent-foreground\)\]{background-color:var(--color-accent-foreground)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-\[var\(--flux-progress-color\)\]{background-color:var(--flux-progress-color)}.bg-accent{background-color:var(--color-accent)}.bg-accent-content{background-color:var(--color-accent-content)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-400\/25{background-color:#fcbb0040}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/25{background-color:color-mix(in oklab,var(--color-amber-400) 25%,transparent)}}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-400\/20{background-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/20{background-color:color-mix(in oklab,var(--color-blue-400) 20%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#1a25400f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-current{background-color:currentColor}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-400\/20{background-color:#00d2ef33}@supports (color:color-mix(in lab,red,red)){.bg-cyan-400\/20{background-color:color-mix(in oklab,var(--color-cyan-400) 20%,transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-200{background-color:var(--color-emerald-200)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-400\/20{background-color:#00d29433}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/20{background-color:color-mix(in oklab,var(--color-emerald-400) 20%,transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-200{background-color:var(--color-fuchsia-200)}.bg-fuchsia-400\/20{background-color:#ec6cff33}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-400\/20{background-color:color-mix(in oklab,var(--color-fuchsia-400) 20%,transparent)}}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-400\/20{background-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/20{background-color:color-mix(in oklab,var(--color-green-400) 20%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-indigo-400\/20{background-color:#7d87ff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-400\/20{background-color:color-mix(in oklab,var(--color-indigo-400) 20%,transparent)}}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1a1f1cb3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-lime-200{background-color:var(--color-lime-200)}.bg-lime-400\/25{background-color:#9de50040}@supports (color:color-mix(in lab,red,red)){.bg-lime-400\/25{background-color:color-mix(in oklab,var(--color-lime-400) 25%,transparent)}}.bg-lime-500{background-color:var(--color-lime-500)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-orange-200{background-color:var(--color-orange-200)}.bg-orange-400\/20{background-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/20{background-color:color-mix(in oklab,var(--color-orange-400) 20%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-400\/20{background-color:#fb64b633}@supports (color:color-mix(in lab,red,red)){.bg-pink-400\/20{background-color:color-mix(in oklab,var(--color-pink-400) 20%,transparent)}}.bg-pink-500{background-color:var(--color-pink-500)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-400\/20{background-color:#c07eff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-400\/20{background-color:color-mix(in oklab,var(--color-purple-400) 20%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-400\/20{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/20{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-rose-400\/20{background-color:#ff667f33}@supports (color:color-mix(in lab,red,red)){.bg-rose-400\/20{background-color:color-mix(in oklab,var(--color-rose-400) 20%,transparent)}}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-200{background-color:var(--color-sky-200)}.bg-sky-400\/20{background-color:#00bcfe33}@supports (color:color-mix(in lab,red,red)){.bg-sky-400\/20{background-color:color-mix(in oklab,var(--color-sky-400) 20%,transparent)}}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-teal-400\/20{background-color:#00d3bd33}@supports (color:color-mix(in lab,red,red)){.bg-teal-400\/20{background-color:color-mix(in oklab,var(--color-teal-400) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-400\/20{background-color:#a685ff33}@supports (color:color-mix(in lab,red,red)){.bg-violet-400\/20{background-color:color-mix(in oklab,var(--color-violet-400) 20%,transparent)}}.bg-violet-500{background-color:var(--color-violet-500)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-yellow-400\/25{background-color:#fac80040}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/25{background-color:color-mix(in oklab,var(--color-yellow-400) 25%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-400\/15{background-color:#8a918d26}@supports (color:color-mix(in lab,red,red)){.bg-zinc-400\/15{background-color:color-mix(in oklab,var(--color-zinc-400) 15%,transparent)}}.bg-zinc-500{background-color:var(--color-zinc-500)}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-800\/5{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/5{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.bg-zinc-800\/5\!{background-color:#2431520d!important}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/5\!{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)!important}}.bg-zinc-800\/6{background-color:#2431520f}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/6{background-color:color-mix(in oklab,var(--color-zinc-800) 6%,transparent)}}.bg-zinc-800\/10{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/10{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.bg-zinc-800\/15{background-color:#24315226}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/15{background-color:color-mix(in oklab,var(--color-zinc-800) 15%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%2300000040\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%2300000040%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-white{--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-zinc-100{--tw-gradient-from:var(--color-zinc-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-1\%{--tw-gradient-from-position:1%}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-black{--tw-gradient-to:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.mask-r-from-\[max\(calc\(100\%-6rem\)\,var\(--flux-scroll-percentage\)\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:max( calc(100% - 6rem) , var(--flux-scroll-percentage));-webkit-mask-composite:source-in;mask-composite:intersect}.mask-r-from-\[var\(--flux-carousel-fade-right\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:var(--flux-carousel-fade-right);-webkit-mask-composite:source-in;mask-composite:intersect}.mask-l-from-\[var\(--flux-carousel-fade-left\)\]{-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-left:linear-gradient(to left, var(--tw-mask-left-from-color) var(--tw-mask-left-from-position), var(--tw-mask-left-to-color) var(--tw-mask-left-to-position));--tw-mask-left-from-position:var(--flux-carousel-fade-left);-webkit-mask-composite:source-in;mask-composite:intersect}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-\[length\:16px_16px\]{background-size:16px 16px}.bg-clip-padding{background-clip:padding-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-position-\[right_\.25rem_center\]\!{background-position:right .25rem center!important}.bg-no-repeat{background-repeat:no-repeat}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.stroke-zinc-300{stroke:var(--color-zinc-300)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[\.3125rem\]{padding:.3125rem}.p-\[1px\]{padding:1px}.p-\[5px\]{padding:5px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.p-\[calc\(0\.25rem-1px\)\]{padding:calc(.25rem - 1px)}.p-\[calc\(0\.75rem-1px\)\]{padding:calc(.75rem - 1px)}.px-0{padding-inline:0}.px-0\!{padding-inline:0!important}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-2\.5\!{padding-inline:calc(var(--spacing) * 2.5)!important}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[\.3125rem\]{padding-inline:.3125rem}.px-\[3px\]{padding-inline:3px}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.px-\[var\(--flux-bleed\,1\.5rem\)\]{padding-inline:var(--flux-bleed,1.5rem)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[2px\]{padding-block:2px}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-\[calc\(0\.5rem-1px\)\]{padding-block:calc(.5rem - 1px)}.py-\[calc\(0\.25rem\)\]{padding-block:.25rem}.py-\[calc\(0\.25rem-1px\)\]{padding-block:calc(.25rem - 1px)}.py-\[calc\(0\.25rem-2px\)\]{padding-block:calc(.25rem - 2px)}.py-\[calc\(0\.75rem-3px\)\]{padding-block:calc(.75rem - 3px)}.py-\[calc\(0\.125rem\+1px\)\]{padding-block:calc(.125rem + 1px)}.py-px{padding-block:1px}.ps-1{padding-inline-start:var(--spacing)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-2\.5{padding-inline-start:calc(var(--spacing) * 2.5)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-3\.5{padding-inline-start:calc(var(--spacing) * 3.5)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.ps-9{padding-inline-start:calc(var(--spacing) * 9)}.ps-10{padding-inline-start:calc(var(--spacing) * 10)}.ps-11{padding-inline-start:calc(var(--spacing) * 11)}.ps-\[3px\]{padding-inline-start:3px}.ps-\[5px\]{padding-inline-start:5px}.ps-\[7px\]{padding-inline-start:7px}.ps-\[calc\(0\.5rem-1px\)\]{padding-inline-start:calc(.5rem - 1px)}.ps-\[calc\(0\.25rem\)\]{padding-inline-start:.25rem}.pe-0{padding-inline-end:0}.pe-1{padding-inline-end:var(--spacing)}.pe-1\.5{padding-inline-end:calc(var(--spacing) * 1.5)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-2\.5{padding-inline-end:calc(var(--spacing) * 2.5)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pe-3\.5{padding-inline-end:calc(var(--spacing) * 3.5)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.pe-6{padding-inline-end:calc(var(--spacing) * 6)}.pe-9{padding-inline-end:calc(var(--spacing) * 9)}.pe-10{padding-inline-end:calc(var(--spacing) * 10)}.pe-11{padding-inline-end:calc(var(--spacing) * 11)}.pe-16{padding-inline-end:calc(var(--spacing) * 16)}.pe-23{padding-inline-end:calc(var(--spacing) * 23)}.pe-30{padding-inline-end:calc(var(--spacing) * 30)}.pe-37{padding-inline-end:calc(var(--spacing) * 37)}.pe-44{padding-inline-end:calc(var(--spacing) * 44)}.pe-51{padding-inline-end:calc(var(--spacing) * 51)}.pe-\[\.3125rem\]{padding-inline-end:.3125rem}.pe-\[0px\]{padding-inline-end:0}.pe-\[1\.35rem\]{padding-inline-end:1.35rem}.pe-\[3px\]{padding-inline-end:3px}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[\.3125rem\]{padding-top:.3125rem}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[\.3125rem\]{padding-bottom:.3125rem}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.\[text-align\:inherit\]{text-align:inherit}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.\[text-indent\:inherit\]{text-indent:inherit}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[font-size\:inherit\]{font-size:inherit}.text-\[\.625rem\]{font-size:.625rem}.text-\[\.5625rem\]{font-size:.5625rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-\[1\.125rem\]{--tw-leading:1.125rem;line-height:1.125rem}.leading-\[1\.375rem\]{--tw-leading:1.375rem;line-height:1.375rem}.leading-\[var\(--flux-card-leading\)\]{--tw-leading:var(--flux-card-leading);line-height:var(--flux-card-leading)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.\[line-height\:inherit\]{line-height:inherit}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.text-nowrap{text-wrap:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\(--color-button-strong\){color:var(--color-button-strong)}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color-mix\(in_oklab\,_var\(--color-accent-content\)\,_var\(--color-zinc-500\)_46\%\)\]{color:#37424f}@supports (color:color-mix(in lab,red,red)){.text-\[color-mix\(in_oklab\,_var\(--color-accent-content\)\,_var\(--color-zinc-500\)_46\%\)\]{color:color-mix(in oklab,var(--color-accent-content),var(--color-zinc-500) 46%)}}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--callout-icon\)\]{color:var(--callout-icon)}.text-\[var\(--color-accent-content\)\]{color:var(--color-accent-content)}.text-\[var\(--color-accent-foreground\)\]{color:var(--color-accent-foreground)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-foreground{color:var(--color-accent-foreground)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-black\/25{color:#00000040}@supports (color:color-mix(in lab,red,red)){.text-black\/25{color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-800{color:var(--color-blue-800)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-800{color:var(--color-cyan-800)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-800{color:var(--color-emerald-800)}.text-err{color:var(--color-err)}.text-fuchsia-600{color:var(--color-fuchsia-600)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-fuchsia-800{color:var(--color-fuchsia-800)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-lime-600{color:var(--color-lime-600)}.text-lime-800{color:var(--color-lime-800)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.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-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-sky-600{color:var(--color-sky-600)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-teal-600{color:var(--color-teal-600)}.text-teal-800{color:var(--color-teal-800)}.text-transparent{color:#0000}.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-violet-800{color:var(--color-violet-800)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-200\/50{color:#e2ddd080}@supports (color:color-mix(in lab,red,red)){.text-zinc-200\/50{color:color-mix(in oklab,var(--color-zinc-200) 50%,transparent)}}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-400\!{color:var(--color-zinc-400)!important}.text-zinc-400\/75{color:#8a918dbf}@supports (color:color-mix(in lab,red,red)){.text-zinc-400\/75{color:color-mix(in oklab,var(--color-zinc-400) 75%,transparent)}}.text-zinc-400\/90{color:#8a918de6}@supports (color:color-mix(in lab,red,red)){.text-zinc-400\/90{color:color-mix(in oklab,var(--color-zinc-400) 90%,transparent)}}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-500\/85{color:#5a6360d9}@supports (color:color-mix(in lab,red,red)){.text-zinc-500\/85{color:color-mix(in oklab,var(--color-zinc-500) 85%,transparent)}}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-600\/85{color:#3a413dd9}@supports (color:color-mix(in lab,red,red)){.text-zinc-600\/85{color:color-mix(in oklab,var(--color-zinc-600) 85%,transparent)}}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-700\!{color:var(--color-zinc-700)!important}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-800\!{color:var(--color-zinc-800)!important}.text-zinc-800\/70{color:#243152b3}@supports (color:color-mix(in lab,red,red)){.text-zinc-800\/70{color:color-mix(in oklab,var(--color-zinc-800) 70%,transparent)}}.text-zinc-900{color:var(--color-zinc-900)}.\[text-transform\:inherit\]{text-transform:inherit}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color-mix\(in_oklab\,var\(--color-accent-content\)\,transparent_80\%\)\]{text-decoration-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.decoration-\[color-mix\(in_oklab\,var\(--color-accent-content\)\,transparent_80\%\)\]{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-content),transparent 80%);text-decoration-color:color-mix(in oklab,var(--color-accent-content),transparent 80%)}}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.decoration-zinc-800\/20{text-decoration-color:#24315233}@supports (color:color-mix(in lab,red,red)){.decoration-zinc-800\/20{-webkit-text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.underline-offset-\[6px\]{text-underline-offset:6px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.placeholder-zinc-400::placeholder{color:var(--color-zinc-400)}.placeholder-zinc-500::placeholder{color:var(--color-zinc-500)}.caret-transparent{caret-color:#0000}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,\.15\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#00000026);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0px_1px_2px_0px_rgba\(0\,0\,0\,\.05\)\,0px_2px_4px_0px_rgba\(0\,0\,0\,\.1\)\]{--tw-shadow:0px 1px 2px 0px var(--tw-shadow-color,#0000000d), 0px 2px 4px 0px 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-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,#fff3)}@supports (color:color-mix(in lab,red,red)){.shadow-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,color-mix(in oklab, var(--color-white) 20%, transparent))}}.shadow-\[inset_0px_1px_--theme\(--color-white\/\.2\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,var(--color-red-500)), inset 0px 2px var(--tw-shadow-color,#ffffff26)}@supports (color:color-mix(in lab,red,red)){.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{--tw-shadow:inset 0px 1px var(--tw-shadow-color,var(--color-red-500)), inset 0px 2px var(--tw-shadow-color,color-mix(in oklab, var(--color-white) 15%, transparent))}}.shadow-\[inset_0px_1px_var\(--color-red-500\)\,inset_0px_2px_--theme\(--color-white\/\.15\)\]{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.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)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2,.ring-\[2px\]{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-black\/5{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.ring-black\/5{--tw-ring-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.ring-black\/7{--tw-ring-color:#00000012}@supports (color:color-mix(in lab,red,red)){.ring-black\/7{--tw-ring-color:color-mix(in oklab, var(--color-black) 7%, transparent)}}.ring-black\/15{--tw-ring-color:#00000026}@supports (color:color-mix(in lab,red,red)){.ring-black\/15{--tw-ring-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-white{--tw-ring-color:var(--color-white)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-2{outline-offset:2px}.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,)}.invert{--tw-invert:invert(100%);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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.outline-none\!{--tw-outline-style:none!important;outline-style:none!important}.select-none{-webkit-user-select:none;user-select:none}.\[--avatar-radius\:calc\(infinity\*1px\)\]{--avatar-radius:calc(infinity * 1px)}.\[--avatar-radius\:var\(--radius-lg\)\]{--avatar-radius:var(--radius-lg)}.\[--avatar-radius\:var\(--radius-md\)\]{--avatar-radius:var(--radius-md)}.\[--avatar-radius\:var\(--radius-sm\)\]{--avatar-radius:var(--radius-sm)}.\[--avatar-radius\:var\(--radius-xl\)\]{--avatar-radius:var(--radius-xl)}.\[--callout-background\:var\(--color-amber-50\)\]{--callout-background:var(--color-amber-50)}.\[--callout-background\:var\(--color-blue-50\)\]{--callout-background:var(--color-blue-50)}.\[--callout-background\:var\(--color-cyan-50\)\]{--callout-background:var(--color-cyan-50)}.\[--callout-background\:var\(--color-emerald-50\)\]{--callout-background:var(--color-emerald-50)}.\[--callout-background\:var\(--color-fuchsia-50\)\]{--callout-background:var(--color-fuchsia-50)}.\[--callout-background\:var\(--color-green-50\)\]{--callout-background:var(--color-green-50)}.\[--callout-background\:var\(--color-indigo-50\)\]{--callout-background:var(--color-indigo-50)}.\[--callout-background\:var\(--color-lime-50\)\]{--callout-background:var(--color-lime-50)}.\[--callout-background\:var\(--color-orange-50\)\]{--callout-background:var(--color-orange-50)}.\[--callout-background\:var\(--color-pink-50\)\]{--callout-background:var(--color-pink-50)}.\[--callout-background\:var\(--color-purple-50\)\]{--callout-background:var(--color-purple-50)}.\[--callout-background\:var\(--color-red-50\)\]{--callout-background:var(--color-red-50)}.\[--callout-background\:var\(--color-rose-50\)\]{--callout-background:var(--color-rose-50)}.\[--callout-background\:var\(--color-sky-50\)\]{--callout-background:var(--color-sky-50)}.\[--callout-background\:var\(--color-teal-50\)\]{--callout-background:var(--color-teal-50)}.\[--callout-background\:var\(--color-violet-50\)\]{--callout-background:var(--color-violet-50)}.\[--callout-background\:var\(--color-white\)\]{--callout-background:var(--color-white)}.\[--callout-background\:var\(--color-yellow-50\)\]{--callout-background:var(--color-yellow-50)}.\[--callout-background\:var\(--color-zinc-50\)\]{--callout-background:var(--color-zinc-50)}.\[--callout-border\:var\(--color-amber-400\)\]{--callout-border:var(--color-amber-400)}.\[--callout-border\:var\(--color-blue-200\)\]{--callout-border:var(--color-blue-200)}.\[--callout-border\:var\(--color-cyan-200\)\]{--callout-border:var(--color-cyan-200)}.\[--callout-border\:var\(--color-emerald-200\)\]{--callout-border:var(--color-emerald-200)}.\[--callout-border\:var\(--color-fuchsia-200\)\]{--callout-border:var(--color-fuchsia-200)}.\[--callout-border\:var\(--color-green-300\)\]{--callout-border:var(--color-green-300)}.\[--callout-border\:var\(--color-indigo-200\)\]{--callout-border:var(--color-indigo-200)}.\[--callout-border\:var\(--color-lime-400\)\]{--callout-border:var(--color-lime-400)}.\[--callout-border\:var\(--color-orange-200\)\]{--callout-border:var(--color-orange-200)}.\[--callout-border\:var\(--color-pink-200\)\]{--callout-border:var(--color-pink-200)}.\[--callout-border\:var\(--color-purple-300\)\]{--callout-border:var(--color-purple-300)}.\[--callout-border\:var\(--color-red-200\)\]{--callout-border:var(--color-red-200)}.\[--callout-border\:var\(--color-rose-200\)\]{--callout-border:var(--color-rose-200)}.\[--callout-border\:var\(--color-sky-200\)\]{--callout-border:var(--color-sky-200)}.\[--callout-border\:var\(--color-teal-200\)\]{--callout-border:var(--color-teal-200)}.\[--callout-border\:var\(--color-violet-200\)\]{--callout-border:var(--color-violet-200)}.\[--callout-border\:var\(--color-yellow-400\)\]{--callout-border:var(--color-yellow-400)}.\[--callout-border\:var\(--color-zinc-200\)\]{--callout-border:var(--color-zinc-200)}.\[--callout-heading\:var\(--color-amber-600\)\]{--callout-heading:var(--color-amber-600)}.\[--callout-heading\:var\(--color-blue-600\)\]{--callout-heading:var(--color-blue-600)}.\[--callout-heading\:var\(--color-cyan-600\)\]{--callout-heading:var(--color-cyan-600)}.\[--callout-heading\:var\(--color-emerald-600\)\]{--callout-heading:var(--color-emerald-600)}.\[--callout-heading\:var\(--color-fuchsia-600\)\]{--callout-heading:var(--color-fuchsia-600)}.\[--callout-heading\:var\(--color-green-600\)\]{--callout-heading:var(--color-green-600)}.\[--callout-heading\:var\(--color-indigo-600\)\]{--callout-heading:var(--color-indigo-600)}.\[--callout-heading\:var\(--color-lime-700\)\]{--callout-heading:var(--color-lime-700)}.\[--callout-heading\:var\(--color-orange-600\)\]{--callout-heading:var(--color-orange-600)}.\[--callout-heading\:var\(--color-pink-600\)\]{--callout-heading:var(--color-pink-600)}.\[--callout-heading\:var\(--color-purple-800\)\]{--callout-heading:var(--color-purple-800)}.\[--callout-heading\:var\(--color-red-700\)\]{--callout-heading:var(--color-red-700)}.\[--callout-heading\:var\(--color-rose-600\)\]{--callout-heading:var(--color-rose-600)}.\[--callout-heading\:var\(--color-sky-600\)\]{--callout-heading:var(--color-sky-600)}.\[--callout-heading\:var\(--color-teal-600\)\]{--callout-heading:var(--color-teal-600)}.\[--callout-heading\:var\(--color-violet-600\)\]{--callout-heading:var(--color-violet-600)}.\[--callout-heading\:var\(--color-yellow-600\)\]{--callout-heading:var(--color-yellow-600)}.\[--callout-heading\:var\(--color-zinc-800\)\]{--callout-heading:var(--color-zinc-800)}.\[--callout-icon\:var\(--color-amber-500\)\]{--callout-icon:var(--color-amber-500)}.\[--callout-icon\:var\(--color-blue-500\)\]{--callout-icon:var(--color-blue-500)}.\[--callout-icon\:var\(--color-cyan-500\)\]{--callout-icon:var(--color-cyan-500)}.\[--callout-icon\:var\(--color-emerald-500\)\]{--callout-icon:var(--color-emerald-500)}.\[--callout-icon\:var\(--color-fuchsia-500\)\]{--callout-icon:var(--color-fuchsia-500)}.\[--callout-icon\:var\(--color-green-500\)\]{--callout-icon:var(--color-green-500)}.\[--callout-icon\:var\(--color-indigo-500\)\]{--callout-icon:var(--color-indigo-500)}.\[--callout-icon\:var\(--color-lime-500\)\]{--callout-icon:var(--color-lime-500)}.\[--callout-icon\:var\(--color-orange-500\)\]{--callout-icon:var(--color-orange-500)}.\[--callout-icon\:var\(--color-pink-500\)\]{--callout-icon:var(--color-pink-500)}.\[--callout-icon\:var\(--color-purple-500\)\]{--callout-icon:var(--color-purple-500)}.\[--callout-icon\:var\(--color-red-400\)\]{--callout-icon:var(--color-red-400)}.\[--callout-icon\:var\(--color-rose-500\)\]{--callout-icon:var(--color-rose-500)}.\[--callout-icon\:var\(--color-sky-500\)\]{--callout-icon:var(--color-sky-500)}.\[--callout-icon\:var\(--color-teal-500\)\]{--callout-icon:var(--color-teal-500)}.\[--callout-icon\:var\(--color-violet-500\)\]{--callout-icon:var(--color-violet-500)}.\[--callout-icon\:var\(--color-yellow-500\)\]{--callout-icon:var(--color-yellow-500)}.\[--callout-icon\:var\(--color-zinc-400\)\]{--callout-icon:var(--color-zinc-400)}.\[--callout-text\:var\(--color-amber-600\)\]{--callout-text:var(--color-amber-600)}.\[--callout-text\:var\(--color-blue-600\)\]{--callout-text:var(--color-blue-600)}.\[--callout-text\:var\(--color-cyan-600\)\]{--callout-text:var(--color-cyan-600)}.\[--callout-text\:var\(--color-emerald-600\)\]{--callout-text:var(--color-emerald-600)}.\[--callout-text\:var\(--color-fuchsia-600\)\]{--callout-text:var(--color-fuchsia-600)}.\[--callout-text\:var\(--color-green-600\)\]{--callout-text:var(--color-green-600)}.\[--callout-text\:var\(--color-indigo-600\)\]{--callout-text:var(--color-indigo-600)}.\[--callout-text\:var\(--color-lime-600\)\]{--callout-text:var(--color-lime-600)}.\[--callout-text\:var\(--color-orange-600\)\]{--callout-text:var(--color-orange-600)}.\[--callout-text\:var\(--color-pink-600\)\]{--callout-text:var(--color-pink-600)}.\[--callout-text\:var\(--color-purple-700\)\]{--callout-text:var(--color-purple-700)}.\[--callout-text\:var\(--color-red-700\)\]{--callout-text:var(--color-red-700)}.\[--callout-text\:var\(--color-rose-600\)\]{--callout-text:var(--color-rose-600)}.\[--callout-text\:var\(--color-sky-600\)\]{--callout-text:var(--color-sky-600)}.\[--callout-text\:var\(--color-teal-600\)\]{--callout-text:var(--color-teal-600)}.\[--callout-text\:var\(--color-violet-600\)\]{--callout-text:var(--color-violet-600)}.\[--callout-text\:var\(--color-yellow-700\)\]{--callout-text:var(--color-yellow-700)}.\[--callout-text\:var\(--color-zinc-500\)\]{--callout-text:var(--color-zinc-500)}.\[--color-accent-content\:var\(--color-amber-600\)\]{--color-accent-content:var(--color-amber-600)}.\[--color-accent-content\:var\(--color-blue-600\)\]{--color-accent-content:var(--color-blue-600)}.\[--color-accent-content\:var\(--color-cyan-600\)\]{--color-accent-content:var(--color-cyan-600)}.\[--color-accent-content\:var\(--color-emerald-600\)\]{--color-accent-content:var(--color-emerald-600)}.\[--color-accent-content\:var\(--color-fuchsia-600\)\]{--color-accent-content:var(--color-fuchsia-600)}.\[--color-accent-content\:var\(--color-gray-800\)\]{--color-accent-content:var(--color-gray-800)}.\[--color-accent-content\:var\(--color-green-600\)\]{--color-accent-content:var(--color-green-600)}.\[--color-accent-content\:var\(--color-indigo-600\)\]{--color-accent-content:var(--color-indigo-600)}.\[--color-accent-content\:var\(--color-lime-600\)\]{--color-accent-content:var(--color-lime-600)}.\[--color-accent-content\:var\(--color-mauve-800\)\]{--color-accent-content:var(--color-mauve-800)}.\[--color-accent-content\:var\(--color-mist-800\)\]{--color-accent-content:var(--color-mist-800)}.\[--color-accent-content\:var\(--color-neutral-800\)\]{--color-accent-content:var(--color-neutral-800)}.\[--color-accent-content\:var\(--color-olive-800\)\]{--color-accent-content:var(--color-olive-800)}.\[--color-accent-content\:var\(--color-orange-600\)\]{--color-accent-content:var(--color-orange-600)}.\[--color-accent-content\:var\(--color-pink-600\)\]{--color-accent-content:var(--color-pink-600)}.\[--color-accent-content\:var\(--color-purple-600\)\]{--color-accent-content:var(--color-purple-600)}.\[--color-accent-content\:var\(--color-red-600\)\]{--color-accent-content:var(--color-red-600)}.\[--color-accent-content\:var\(--color-rose-500\)\]{--color-accent-content:var(--color-rose-500)}.\[--color-accent-content\:var\(--color-sky-600\)\]{--color-accent-content:var(--color-sky-600)}.\[--color-accent-content\:var\(--color-slate-800\)\]{--color-accent-content:var(--color-slate-800)}.\[--color-accent-content\:var\(--color-stone-800\)\]{--color-accent-content:var(--color-stone-800)}.\[--color-accent-content\:var\(--color-taupe-800\)\]{--color-accent-content:var(--color-taupe-800)}.\[--color-accent-content\:var\(--color-teal-600\)\]{--color-accent-content:var(--color-teal-600)}.\[--color-accent-content\:var\(--color-violet-600\)\]{--color-accent-content:var(--color-violet-600)}.\[--color-accent-content\:var\(--color-yellow-600\)\]{--color-accent-content:var(--color-yellow-600)}.\[--color-accent-content\:var\(--color-zinc-800\)\]{--color-accent-content:var(--color-zinc-800)}.\[--color-accent-foreground\:var\(--color-amber-950\)\]{--color-accent-foreground:var(--color-amber-950)}.\[--color-accent-foreground\:var\(--color-lime-900\)\]{--color-accent-foreground:var(--color-lime-900)}.\[--color-accent-foreground\:var\(--color-white\)\]{--color-accent-foreground:var(--color-white)}.\[--color-accent-foreground\:var\(--color-yellow-950\)\]{--color-accent-foreground:var(--color-yellow-950)}.\[--color-accent\:var\(--color-amber-400\)\]{--color-accent:var(--color-amber-400)}.\[--color-accent\:var\(--color-blue-500\)\]{--color-accent:var(--color-blue-500)}.\[--color-accent\:var\(--color-cyan-600\)\]{--color-accent:var(--color-cyan-600)}.\[--color-accent\:var\(--color-emerald-600\)\]{--color-accent:var(--color-emerald-600)}.\[--color-accent\:var\(--color-fuchsia-600\)\]{--color-accent:var(--color-fuchsia-600)}.\[--color-accent\:var\(--color-gray-800\)\]{--color-accent:var(--color-gray-800)}.\[--color-accent\:var\(--color-green-600\)\]{--color-accent:var(--color-green-600)}.\[--color-accent\:var\(--color-indigo-500\)\]{--color-accent:var(--color-indigo-500)}.\[--color-accent\:var\(--color-lime-400\)\]{--color-accent:var(--color-lime-400)}.\[--color-accent\:var\(--color-mauve-800\)\]{--color-accent:var(--color-mauve-800)}.\[--color-accent\:var\(--color-mist-800\)\]{--color-accent:var(--color-mist-800)}.\[--color-accent\:var\(--color-neutral-800\)\]{--color-accent:var(--color-neutral-800)}.\[--color-accent\:var\(--color-olive-800\)\]{--color-accent:var(--color-olive-800)}.\[--color-accent\:var\(--color-orange-500\)\]{--color-accent:var(--color-orange-500)}.\[--color-accent\:var\(--color-pink-600\)\]{--color-accent:var(--color-pink-600)}.\[--color-accent\:var\(--color-purple-500\)\]{--color-accent:var(--color-purple-500)}.\[--color-accent\:var\(--color-red-500\)\]{--color-accent:var(--color-red-500)}.\[--color-accent\:var\(--color-rose-500\)\]{--color-accent:var(--color-rose-500)}.\[--color-accent\:var\(--color-sky-600\)\]{--color-accent:var(--color-sky-600)}.\[--color-accent\:var\(--color-slate-800\)\]{--color-accent:var(--color-slate-800)}.\[--color-accent\:var\(--color-stone-800\)\]{--color-accent:var(--color-stone-800)}.\[--color-accent\:var\(--color-taupe-800\)\]{--color-accent:var(--color-taupe-800)}.\[--color-accent\:var\(--color-teal-600\)\]{--color-accent:var(--color-teal-600)}.\[--color-accent\:var\(--color-violet-500\)\]{--color-accent:var(--color-violet-500)}.\[--color-accent\:var\(--color-yellow-400\)\]{--color-accent:var(--color-yellow-400)}.\[--color-accent\:var\(--color-zinc-800\)\]{--color-accent:var(--color-zinc-800)}.\[--color-button-border\:var\(--color-amber-500\)\]{--color-button-border:var(--color-amber-500)}.\[--color-button-border\:var\(--color-blue-500\)\]{--color-button-border:var(--color-blue-500)}.\[--color-button-border\:var\(--color-cyan-500\)\]{--color-button-border:var(--color-cyan-500)}.\[--color-button-border\:var\(--color-emerald-500\)\]{--color-button-border:var(--color-emerald-500)}.\[--color-button-border\:var\(--color-fuchsia-500\)\]{--color-button-border:var(--color-fuchsia-500)}.\[--color-button-border\:var\(--color-green-500\)\]{--color-button-border:var(--color-green-500)}.\[--color-button-border\:var\(--color-indigo-500\)\]{--color-button-border:var(--color-indigo-500)}.\[--color-button-border\:var\(--color-lime-500\)\]{--color-button-border:var(--color-lime-500)}.\[--color-button-border\:var\(--color-orange-500\)\]{--color-button-border:var(--color-orange-500)}.\[--color-button-border\:var\(--color-pink-500\)\]{--color-button-border:var(--color-pink-500)}.\[--color-button-border\:var\(--color-purple-500\)\]{--color-button-border:var(--color-purple-500)}.\[--color-button-border\:var\(--color-red-500\)\]{--color-button-border:var(--color-red-500)}.\[--color-button-border\:var\(--color-rose-500\)\]{--color-button-border:var(--color-rose-500)}.\[--color-button-border\:var\(--color-sky-500\)\]{--color-button-border:var(--color-sky-500)}.\[--color-button-border\:var\(--color-teal-500\)\]{--color-button-border:var(--color-teal-500)}.\[--color-button-border\:var\(--color-violet-500\)\]{--color-button-border:var(--color-violet-500)}.\[--color-button-border\:var\(--color-yellow-500\)\]{--color-button-border:var(--color-yellow-500)}.\[--color-button-deep\:var\(--color-amber-950\)\]{--color-button-deep:var(--color-amber-950)}.\[--color-button-deep\:var\(--color-blue-950\)\]{--color-button-deep:var(--color-blue-950)}.\[--color-button-deep\:var\(--color-cyan-950\)\]{--color-button-deep:var(--color-cyan-950)}.\[--color-button-deep\:var\(--color-emerald-950\)\]{--color-button-deep:var(--color-emerald-950)}.\[--color-button-deep\:var\(--color-fuchsia-950\)\]{--color-button-deep:var(--color-fuchsia-950)}.\[--color-button-deep\:var\(--color-green-950\)\]{--color-button-deep:var(--color-green-950)}.\[--color-button-deep\:var\(--color-indigo-950\)\]{--color-button-deep:var(--color-indigo-950)}.\[--color-button-deep\:var\(--color-lime-950\)\]{--color-button-deep:var(--color-lime-950)}.\[--color-button-deep\:var\(--color-orange-950\)\]{--color-button-deep:var(--color-orange-950)}.\[--color-button-deep\:var\(--color-pink-950\)\]{--color-button-deep:var(--color-pink-950)}.\[--color-button-deep\:var\(--color-purple-950\)\]{--color-button-deep:var(--color-purple-950)}.\[--color-button-deep\:var\(--color-red-950\)\]{--color-button-deep:var(--color-red-950)}.\[--color-button-deep\:var\(--color-rose-950\)\]{--color-button-deep:var(--color-rose-950)}.\[--color-button-deep\:var\(--color-sky-950\)\]{--color-button-deep:var(--color-sky-950)}.\[--color-button-deep\:var\(--color-teal-950\)\]{--color-button-deep:var(--color-teal-950)}.\[--color-button-deep\:var\(--color-violet-950\)\]{--color-button-deep:var(--color-violet-950)}.\[--color-button-deep\:var\(--color-yellow-950\)\]{--color-button-deep:var(--color-yellow-950)}.\[--color-button-muted\:var\(--color-amber-300\)\]{--color-button-muted:var(--color-amber-300)}.\[--color-button-muted\:var\(--color-blue-300\)\]{--color-button-muted:var(--color-blue-300)}.\[--color-button-muted\:var\(--color-cyan-300\)\]{--color-button-muted:var(--color-cyan-300)}.\[--color-button-muted\:var\(--color-emerald-300\)\]{--color-button-muted:var(--color-emerald-300)}.\[--color-button-muted\:var\(--color-fuchsia-300\)\]{--color-button-muted:var(--color-fuchsia-300)}.\[--color-button-muted\:var\(--color-green-300\)\]{--color-button-muted:var(--color-green-300)}.\[--color-button-muted\:var\(--color-indigo-300\)\]{--color-button-muted:var(--color-indigo-300)}.\[--color-button-muted\:var\(--color-lime-300\)\]{--color-button-muted:var(--color-lime-300)}.\[--color-button-muted\:var\(--color-orange-300\)\]{--color-button-muted:var(--color-orange-300)}.\[--color-button-muted\:var\(--color-pink-300\)\]{--color-button-muted:var(--color-pink-300)}.\[--color-button-muted\:var\(--color-purple-300\)\]{--color-button-muted:var(--color-purple-300)}.\[--color-button-muted\:var\(--color-red-300\)\]{--color-button-muted:var(--color-red-300)}.\[--color-button-muted\:var\(--color-rose-300\)\]{--color-button-muted:var(--color-rose-300)}.\[--color-button-muted\:var\(--color-sky-300\)\]{--color-button-muted:var(--color-sky-300)}.\[--color-button-muted\:var\(--color-teal-300\)\]{--color-button-muted:var(--color-teal-300)}.\[--color-button-muted\:var\(--color-violet-300\)\]{--color-button-muted:var(--color-violet-300)}.\[--color-button-muted\:var\(--color-yellow-300\)\]{--color-button-muted:var(--color-yellow-300)}.\[--color-button-soft-foreground\:var\(--color-amber-200\)\]{--color-button-soft-foreground:var(--color-amber-200)}.\[--color-button-soft-foreground\:var\(--color-blue-200\)\]{--color-button-soft-foreground:var(--color-blue-200)}.\[--color-button-soft-foreground\:var\(--color-cyan-200\)\]{--color-button-soft-foreground:var(--color-cyan-200)}.\[--color-button-soft-foreground\:var\(--color-emerald-200\)\]{--color-button-soft-foreground:var(--color-emerald-200)}.\[--color-button-soft-foreground\:var\(--color-fuchsia-200\)\]{--color-button-soft-foreground:var(--color-fuchsia-200)}.\[--color-button-soft-foreground\:var\(--color-green-200\)\]{--color-button-soft-foreground:var(--color-green-200)}.\[--color-button-soft-foreground\:var\(--color-indigo-200\)\]{--color-button-soft-foreground:var(--color-indigo-200)}.\[--color-button-soft-foreground\:var\(--color-lime-200\)\]{--color-button-soft-foreground:var(--color-lime-200)}.\[--color-button-soft-foreground\:var\(--color-orange-200\)\]{--color-button-soft-foreground:var(--color-orange-200)}.\[--color-button-soft-foreground\:var\(--color-pink-200\)\]{--color-button-soft-foreground:var(--color-pink-200)}.\[--color-button-soft-foreground\:var\(--color-purple-200\)\]{--color-button-soft-foreground:var(--color-purple-200)}.\[--color-button-soft-foreground\:var\(--color-red-200\)\]{--color-button-soft-foreground:var(--color-red-200)}.\[--color-button-soft-foreground\:var\(--color-rose-200\)\]{--color-button-soft-foreground:var(--color-rose-200)}.\[--color-button-soft-foreground\:var\(--color-sky-200\)\]{--color-button-soft-foreground:var(--color-sky-200)}.\[--color-button-soft-foreground\:var\(--color-teal-200\)\]{--color-button-soft-foreground:var(--color-teal-200)}.\[--color-button-soft-foreground\:var\(--color-violet-200\)\]{--color-button-soft-foreground:var(--color-violet-200)}.\[--color-button-soft-foreground\:var\(--color-yellow-200\)\]{--color-button-soft-foreground:var(--color-yellow-200)}.\[--color-button-soft\:var\(--color-amber-400\)\]{--color-button-soft:var(--color-amber-400)}.\[--color-button-soft\:var\(--color-blue-400\)\]{--color-button-soft:var(--color-blue-400)}.\[--color-button-soft\:var\(--color-cyan-400\)\]{--color-button-soft:var(--color-cyan-400)}.\[--color-button-soft\:var\(--color-emerald-400\)\]{--color-button-soft:var(--color-emerald-400)}.\[--color-button-soft\:var\(--color-fuchsia-400\)\]{--color-button-soft:var(--color-fuchsia-400)}.\[--color-button-soft\:var\(--color-green-400\)\]{--color-button-soft:var(--color-green-400)}.\[--color-button-soft\:var\(--color-indigo-400\)\]{--color-button-soft:var(--color-indigo-400)}.\[--color-button-soft\:var\(--color-lime-400\)\]{--color-button-soft:var(--color-lime-400)}.\[--color-button-soft\:var\(--color-orange-400\)\]{--color-button-soft:var(--color-orange-400)}.\[--color-button-soft\:var\(--color-pink-400\)\]{--color-button-soft:var(--color-pink-400)}.\[--color-button-soft\:var\(--color-purple-400\)\]{--color-button-soft:var(--color-purple-400)}.\[--color-button-soft\:var\(--color-red-400\)\]{--color-button-soft:var(--color-red-400)}.\[--color-button-soft\:var\(--color-rose-400\)\]{--color-button-soft:var(--color-rose-400)}.\[--color-button-soft\:var\(--color-sky-400\)\]{--color-button-soft:var(--color-sky-400)}.\[--color-button-soft\:var\(--color-teal-400\)\]{--color-button-soft:var(--color-teal-400)}.\[--color-button-soft\:var\(--color-violet-400\)\]{--color-button-soft:var(--color-violet-400)}.\[--color-button-soft\:var\(--color-yellow-400\)\]{--color-button-soft:var(--color-yellow-400)}.\[--color-button-strong\:var\(--color-amber-700\)\]{--color-button-strong:var(--color-amber-700)}.\[--color-button-strong\:var\(--color-blue-700\)\]{--color-button-strong:var(--color-blue-700)}.\[--color-button-strong\:var\(--color-cyan-700\)\]{--color-button-strong:var(--color-cyan-700)}.\[--color-button-strong\:var\(--color-emerald-700\)\]{--color-button-strong:var(--color-emerald-700)}.\[--color-button-strong\:var\(--color-fuchsia-700\)\]{--color-button-strong:var(--color-fuchsia-700)}.\[--color-button-strong\:var\(--color-green-700\)\]{--color-button-strong:var(--color-green-700)}.\[--color-button-strong\:var\(--color-indigo-700\)\]{--color-button-strong:var(--color-indigo-700)}.\[--color-button-strong\:var\(--color-lime-700\)\]{--color-button-strong:var(--color-lime-700)}.\[--color-button-strong\:var\(--color-orange-700\)\]{--color-button-strong:var(--color-orange-700)}.\[--color-button-strong\:var\(--color-pink-700\)\]{--color-button-strong:var(--color-pink-700)}.\[--color-button-strong\:var\(--color-purple-700\)\]{--color-button-strong:var(--color-purple-700)}.\[--color-button-strong\:var\(--color-red-700\)\]{--color-button-strong:var(--color-red-700)}.\[--color-button-strong\:var\(--color-rose-700\)\]{--color-button-strong:var(--color-rose-700)}.\[--color-button-strong\:var\(--color-sky-700\)\]{--color-button-strong:var(--color-sky-700)}.\[--color-button-strong\:var\(--color-teal-700\)\]{--color-button-strong:var(--color-teal-700)}.\[--color-button-strong\:var\(--color-violet-700\)\]{--color-button-strong:var(--color-violet-700)}.\[--color-button-strong\:var\(--color-yellow-700\)\]{--color-button-strong:var(--color-yellow-700)}.\[--color-button-tint\:var\(--color-amber-50\)\]{--color-button-tint:var(--color-amber-50)}.\[--color-button-tint\:var\(--color-blue-50\)\]{--color-button-tint:var(--color-blue-50)}.\[--color-button-tint\:var\(--color-cyan-50\)\]{--color-button-tint:var(--color-cyan-50)}.\[--color-button-tint\:var\(--color-emerald-50\)\]{--color-button-tint:var(--color-emerald-50)}.\[--color-button-tint\:var\(--color-fuchsia-50\)\]{--color-button-tint:var(--color-fuchsia-50)}.\[--color-button-tint\:var\(--color-green-50\)\]{--color-button-tint:var(--color-green-50)}.\[--color-button-tint\:var\(--color-indigo-50\)\]{--color-button-tint:var(--color-indigo-50)}.\[--color-button-tint\:var\(--color-lime-50\)\]{--color-button-tint:var(--color-lime-50)}.\[--color-button-tint\:var\(--color-orange-50\)\]{--color-button-tint:var(--color-orange-50)}.\[--color-button-tint\:var\(--color-pink-50\)\]{--color-button-tint:var(--color-pink-50)}.\[--color-button-tint\:var\(--color-purple-50\)\]{--color-button-tint:var(--color-purple-50)}.\[--color-button-tint\:var\(--color-red-50\)\]{--color-button-tint:var(--color-red-50)}.\[--color-button-tint\:var\(--color-rose-50\)\]{--color-button-tint:var(--color-rose-50)}.\[--color-button-tint\:var\(--color-sky-50\)\]{--color-button-tint:var(--color-sky-50)}.\[--color-button-tint\:var\(--color-teal-50\)\]{--color-button-tint:var(--color-teal-50)}.\[--color-button-tint\:var\(--color-violet-50\)\]{--color-button-tint:var(--color-violet-50)}.\[--color-button-tint\:var\(--color-yellow-50\)\]{--color-button-tint:var(--color-yellow-50)}.\[--flux-carousel-fade-left\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,calc\(100\%-var\(--flux-carousel-scroll-percentage\)\)\)\]{--flux-carousel-fade-left:max(calc(100% - var(--flux-carousel-fade-size)), calc(100% - var(--flux-carousel-scroll-percentage)))}.\[--flux-carousel-fade-right\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,var\(--flux-carousel-scroll-percentage\)\)\]{--flux-carousel-fade-right:max(calc(100% - var(--flux-carousel-fade-size)), var(--flux-carousel-scroll-percentage))}.\[--flux-carousel-fade-size\:4rem\]{--flux-carousel-fade-size:4rem}.\[--flux-carousel-scroll-percentage\:0\%\]{--flux-carousel-scroll-percentage:0%}.\[--flux-flyout-translate\:translateX\(-50px\)\]{--flux-flyout-translate:translateX(-50px)}.\[--flux-flyout-translate\:translateX\(50px\)\]{--flux-flyout-translate:translateX(50px)}.\[--flux-flyout-translate\:translateY\(50px\)\]{--flux-flyout-translate:translateY(50px)}.\[--flux-progress-color\:var\(--color-accent\)\]{--flux-progress-color:var(--color-accent)}.\[--flux-progress-color\:var\(--color-amber-600\)\]{--flux-progress-color:var(--color-amber-600)}.\[--flux-progress-color\:var\(--color-blue-600\)\]{--flux-progress-color:var(--color-blue-600)}.\[--flux-progress-color\:var\(--color-cyan-600\)\]{--flux-progress-color:var(--color-cyan-600)}.\[--flux-progress-color\:var\(--color-emerald-600\)\]{--flux-progress-color:var(--color-emerald-600)}.\[--flux-progress-color\:var\(--color-fuchsia-600\)\]{--flux-progress-color:var(--color-fuchsia-600)}.\[--flux-progress-color\:var\(--color-green-600\)\]{--flux-progress-color:var(--color-green-600)}.\[--flux-progress-color\:var\(--color-indigo-600\)\]{--flux-progress-color:var(--color-indigo-600)}.\[--flux-progress-color\:var\(--color-lime-600\)\]{--flux-progress-color:var(--color-lime-600)}.\[--flux-progress-color\:var\(--color-orange-600\)\]{--flux-progress-color:var(--color-orange-600)}.\[--flux-progress-color\:var\(--color-pink-600\)\]{--flux-progress-color:var(--color-pink-600)}.\[--flux-progress-color\:var\(--color-purple-600\)\]{--flux-progress-color:var(--color-purple-600)}.\[--flux-progress-color\:var\(--color-red-600\)\]{--flux-progress-color:var(--color-red-600)}.\[--flux-progress-color\:var\(--color-rose-600\)\]{--flux-progress-color:var(--color-rose-600)}.\[--flux-progress-color\:var\(--color-sky-600\)\]{--flux-progress-color:var(--color-sky-600)}.\[--flux-progress-color\:var\(--color-teal-600\)\]{--flux-progress-color:var(--color-teal-600)}.\[--flux-progress-color\:var\(--color-violet-600\)\]{--flux-progress-color:var(--color-violet-600)}.\[--flux-progress-color\:var\(--color-yellow-600\)\]{--flux-progress-color:var(--color-yellow-600)}.\[--flux-scroll-percentage\:0\%\]{--flux-scroll-percentage:0%}.\[--haze-border\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_80\%\)\]{--haze-border:#1a254033}@supports (color:color-mix(in lab,red,red)){.\[--haze-border\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_80\%\)\]{--haze-border:color-mix(in oklab, var(--color-accent-content), transparent 80%)}}.\[--haze-light\:color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_98\%\)\]{--haze-light:#1a254005}@supports (color:color-mix(in lab,red,red)){.\[--haze-light\:color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_98\%\)\]{--haze-light:color-mix(in oklab, var(--color-accent), transparent 98%)}}.\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_97\.5\%\)\]{--haze:#1a254006}@supports (color:color-mix(in lab,red,red)){.\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_97\.5\%\)\]{--haze:color-mix(in oklab, var(--color-accent-content), transparent 97.5%)}}.\[--hover-fill\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]{--hover-fill:#1a25401a}@supports (color:color-mix(in lab,red,red)){.\[--hover-fill\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]{--hover-fill:color-mix(in oklab, var(--color-accent-content), transparent 90%)}}.\[grid-area\:aside\]{grid-area:aside}.\[grid-area\:footer\]{grid-area:footer}.\[grid-area\:header\]{grid-area:header}.\[grid-area\:main\]{grid-area:main}.\[grid-area\:sidebar\]{grid-area:sidebar}.\[print-color-adjust\:exact\]{-webkit-print-color-adjust:exact;print-color-adjust:exact}.\[text-shadow\:inherit\]{text-shadow:inherit}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.\[word-spacing\:inherit\]{word-spacing:inherit}.ring-inset{--tw-ring-inset:inset}:is(.\*\:col-start-1>*){grid-column-start:1}:is(.\*\:row-start-1>*){grid-row-start:1}:is(.\*\:h-auto>*){height:auto}:is(.\*\:bg-zinc-200>*){background-color:var(--color-zinc-200)}:is(.\*\:p-1\.5>*){padding:calc(var(--spacing) * 1.5)}:is(.\*\: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))}:is(.\*\*\:ring-white *){--tw-ring-color:var(--color-white)}:is(.\*\:not-first\:-ml-2>*):not(:first-child){margin-left:calc(var(--spacing) * -2)}.not-first-of-type\:mt-1:not(:first-of-type){margin-top:var(--spacing)}.not-in-data-flux-sidebar-collapsed-desktop\:hidden:not(:where([data-flux-sidebar-collapsed-desktop]) *){display:none}.not-in-data-loading\:opacity-0:not(:where([data-loading]) *){opacity:0}.not-in-data-\[ready\]\:hidden:not(:where([data-ready]) *){display:none}.not-in-\[tr\:first-child\]\:border-t:not(:where(:is(tr:first-child)) *){border-top-style:var(--tw-border-style);border-top-width:1px}.not-data-open\:hidden:not([data-open]){display:none}@supports not ((-moz-appearance:none)){.not-\[\@supports\(-moz-appearance\:none\)\]\:hidden{display:none}}.group-last\/breadcrumb\:hidden:is(:where(.group\/breadcrumb):last-child *){display:none}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:bg-zinc-400:is(:where(.group):hover *){background-color:var(--color-zinc-400)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:text-zinc-500:is(:where(.group):hover *){color:var(--color-zinc-500)}.group-hover\:text-zinc-800:is(:where(.group):hover *){color:var(--color-zinc-800)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/accordion-heading\:text-zinc-800:is(:where(.group\/accordion-heading):hover *){color:var(--color-zinc-800)}.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/sortable\:text-zinc-800:is(:where(.group\/sortable):hover *){color:var(--color-zinc-800)}.group-hover\/sortable\:opacity-100:is(:where(.group\/sortable):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-active\/item\:text-zinc-800:is(:where(.group\/item)[data-active] *){color:var(--color-zinc-800)}.group-data-checked\:block:is(:where(.group)[data-checked] *){display:block}.group-data-checked\:hidden:is(:where(.group)[data-checked] *){display:none}.group-data-checked\:translate-x-\[0\.9375rem\]:is(:where(.group)[data-checked] *){--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-checked\:bg-\(--color-accent-foreground\):is(:where(.group)[data-checked] *){background-color:var(--color-accent-foreground)}.group-data-checked\/menu-checkbox\:block:is(:where(.group\/menu-checkbox)[data-checked] *),.group-data-checked\/menu-radio\:block:is(:where(.group\/menu-radio)[data-checked] *){display:block}.group-data-invert\/toast\:border-zinc-700:is(:where(.group\/toast)[data-invert] *){border-color:var(--color-zinc-700)}.group-data-invert\/toast\:bg-white\/10:is(:where(.group\/toast)[data-invert] *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:bg-white\/10:is(:where(.group\/toast)[data-invert] *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.group-data-invert\/toast\:bg-zinc-800:is(:where(.group\/toast)[data-invert] *){background-color:var(--color-zinc-800)}.group-data-invert\/toast\:text-white:is(:where(.group\/toast)[data-invert] *){color:var(--color-white)}.group-data-invert\/toast\:decoration-white\/20:is(:where(.group\/toast)[data-invert] *){text-decoration-color:#fff3}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:decoration-white\/20:is(:where(.group\/toast)[data-invert] *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.group-data-open\/accordion-heading\:block:is(:where(.group\/accordion-heading)[data-open] *){display:block}.group-data-open\/accordion-heading\:hidden:is(:where(.group\/accordion-heading)[data-open] *){display:none}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-selected\:bg-zinc-800:is(:where(.group)[data-selected] *){background-color:var(--color-zinc-800)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.before\:z-10:before{content:var(--tw-content);z-index:10}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.before\:animate-\[flux-shimmer_2s_infinite\]:before{content:var(--tw-content);animation:2s infinite flux-shimmer}.before\:bg-gradient-to-r:before{content:var(--tw-content);--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{content:var(--tw-content);--tw-gradient-via:var(--flux-shimmer-color)}@supports (color:color-mix(in lab,red,red)){.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{--tw-gradient-via:color-mix(in oklab, var(--flux-shimmer-color) 50%, transparent)}}.before\:via-\[var\(--flux-shimmer-color\)\]\/50:before{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:-inset-px:after{content:var(--tw-content);top:-1px;right:-1px;bottom:-1px;left:-1px}.after\:inset-0:after{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.after\:inset-\[3px\]:after{content:var(--tw-content);top:3px;right:3px;bottom:3px;left:3px}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.after\:rounded-\[1px\]:after{content:var(--tw-content);border-radius:1px}.after\:rounded-\[2px\]:after{content:var(--tw-content);border-radius:2px}.after\:rounded-\[calc\(var\(--flux-card-radius\)-1px\)\]:after{content:var(--tw-content);border-radius:calc(var(--flux-card-radius) - 1px)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:rounded-lg:after{content:var(--tw-content);border-radius:var(--radius-lg)}.after\:rounded-md:after{content:var(--tw-content);border-radius:var(--radius-md)}.after\:rounded-sm:after{content:var(--tw-content);border-radius:var(--radius-sm)}.after\:rounded-xl:after{content:var(--tw-content);border-radius:var(--radius-xl)}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:\[mask-image\:linear-gradient\(to_bottom\,black\,transparent\)\]:after{content:var(--tw-content);-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.after\:inset-ring:after,.after\:inset-ring-\[1px\]:after{content:var(--tw-content);--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-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)}.after\:inset-ring-black\/7:after{content:var(--tw-content);--tw-inset-ring-color:#00000012}@supports (color:color-mix(in lab,red,red)){.after\:inset-ring-black\/7:after{--tw-inset-ring-color:color-mix(in oklab, var(--color-black) 7%, transparent)}}.after\:content-\[var\(--flux-file-upload-progress-as-string\)\]:after{--tw-content:var(--flux-file-upload-progress-as-string);content:var(--tw-content)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:sticky:first-child{position:sticky}.first\:left-0:first-child{left:0}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:ps-0:first-child{padding-inline-start:0}.first\:pt-0:first-child{padding-top:0}.first\:after\:pointer-events-none:first-child:after{content:var(--tw-content);pointer-events:none}.first\:after\:absolute:first-child:after{content:var(--tw-content);position:absolute}.first\:after\:inset-y-0:first-child:after{content:var(--tw-content);inset-block:0}.first\:after\:right-0:first-child:after{content:var(--tw-content);right:0}.first\:after\:w-8:first-child:after{content:var(--tw-content);width:calc(var(--spacing) * 8)}.first\:after\:translate-x-full:first-child:after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.last\:sticky:last-child{position:sticky}.last\:right-0:last-child{right:0}.last\:bottom-0:last-child{bottom:0}.last\:z-20:last-child{z-index:20}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pe-0:last-child{padding-inline-end:0}.last\:pe-2:last-child{padding-inline-end:calc(var(--spacing) * 2)}.last\:pb-0:last-child{padding-bottom:0}.last\:after\:pointer-events-none:last-child:after{content:var(--tw-content);pointer-events:none}.last\:after\:absolute:last-child:after{content:var(--tw-content);position:absolute}.last\:after\:inset-y-0:last-child:after{content:var(--tw-content);inset-block:0}.last\:after\:left-0:last-child:after{content:var(--tw-content);left:0}.last\:after\:w-8:last-child:after{content:var(--tw-content);width:calc(var(--spacing) * 8)}.last\:after\:-translate-x-full:last-child:after{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.first-of-type\:rounded-s-lg:first-of-type{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.last-of-type\:rounded-e-lg:last-of-type{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_28\%\,_var\(--color-zinc-200\)\)\]:hover{border-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color-mix\(in_oklab\,_var\(--color-button-border\)_28\%\,_var\(--color-zinc-200\)\)\]:hover{border-color:color-mix(in oklab,var(--color-button-border) 28%,var(--color-zinc-200))}}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-\[var\(--haze-border\)\]:hover{border-color:var(--haze-border)}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-200:hover{border-color:var(--color-zinc-200)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-button-border\)_36\%\,_var\(--color-zinc-200\)\)\]:hover{border-bottom-color:var(--color-button-border)}@supports (color:color-mix(in lab,red,red)){.hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-button-border\)_36\%\,_var\(--color-zinc-200\)\)\]:hover{border-bottom-color:color-mix(in oklab,var(--color-button-border) 36%,var(--color-zinc-200))}}.hover\:bg-\(--color-button-tint\):hover{background-color:var(--color-button-tint)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#1a2540e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 70%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_80\%\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 80%)}}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)_6\%\,_white\)\]:hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)_6\%\,_white\)\]:hover{background-color:color-mix(in oklab,var(--color-button-soft) 6%,white)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\:bg-zinc-800\/5:hover{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:bg-zinc-800\/10:hover{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/10:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.hover\:bg-zinc-800\/\[4\%\]:hover{background-color:#2431520a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/\[4\%\]:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 4%,transparent)}}.hover\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%231f2937\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:hover{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%231f2937%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.hover\:bg-\[length\:16px_16px\]:hover{background-size:16px 16px}.hover\:text-\(--color-button-strong\):hover{color:var(--color-button-strong)}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-500:hover{color:var(--color-zinc-500)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-800\!:hover{color:var(--color-zinc-800)!important}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-current:hover{text-decoration-color:currentColor}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-data-invert\/toast\:hover\:bg-white\/15:is(:where(.group\/toast)[data-invert] *):hover{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:hover\:bg-white\/15:is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.group-data-invert\/toast\:hover\:bg-white\/20:is(:where(.group\/toast)[data-invert] *):hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.group-data-invert\/toast\:hover\:bg-white\/20:is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.group-data-invert\/toast\:hover\:text-white:is(:where(.group\/toast)[data-invert] *):hover{color:var(--color-white)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}.hover\:after\:bg-\[var\(--haze-light\)\]:hover:after{content:var(--tw-content);background-color:var(--haze-light)}}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:border-zinc-200:focus{border-color:var(--color-zinc-200)}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:text-zinc-800:focus{color:var(--color-zinc-800)}.focus\:opacity-100:focus{opacity:1}.focus\:ring:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-offset-\[revert\]:focus{outline-offset:revert}.focus\:outline-\[revert\]:focus{outline-color:revert}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:active{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_70\%\)\]:active{background-color:color-mix(in oklab,var(--color-button-soft),transparent 70%)}}.active\:bg-gray-100:active{background-color:var(--color-gray-100)}.active\:text-gray-500:active{color:var(--color-gray-500)}.active\:text-gray-700:active{color:var(--color-gray-700)}.active\:text-gray-800:active{color:var(--color-gray-800)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:border-zinc-200:disabled{border-color:var(--color-zinc-200)}.disabled\:border-b-zinc-200:disabled{border-bottom-color:var(--color-zinc-200)}.disabled\:text-zinc-400:disabled{color:var(--color-zinc-400)}.disabled\:text-zinc-500:disabled{color:var(--color-zinc-500)}.disabled\:placeholder-zinc-400:disabled::placeholder{color:var(--color-zinc-400)}.disabled\:placeholder-zinc-400\/70:disabled::placeholder{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){.disabled\:placeholder-zinc-400\/70:disabled::placeholder{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-75:disabled{opacity:.75}.disabled\:shadow-none:disabled{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.disabled\:shadow-xs\!:disabled{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}:where([data-checked]) .in-data-checked\:text-\(--color-accent-content\){color:var(--color-accent-content)}:where([data-checked]) .in-data-checked\:text-zinc-500{color:var(--color-zinc-500)}:where([data-checked]) .in-data-checked\:text-zinc-800{color:var(--color-zinc-800)}@media(hover:hover){:where([data-checked]) .in-data-checked\:group-hover\:text-zinc-800:is(:where(.group):hover *){color:var(--color-zinc-800)}}:where([data-dragging]) .in-data-dragging\:border-zinc-300{border-color:var(--color-zinc-300)}:where([data-dragging]) .in-data-dragging\:bg-zinc-100{background-color:var(--color-zinc-100)}:where([data-dragging]) .in-data-dragging\:text-zinc-800{color:var(--color-zinc-800)}:where([data-flux-menu]) .in-data-flux-menu\:block{display:block}:where([data-flux-menu]) .in-data-flux-menu\:px-2{padding-inline:calc(var(--spacing) * 2)}:where([data-flux-menu]) .in-data-flux-menu\:text-zinc-400{color:var(--color-zinc-400)}:where([data-flux-menu]) .in-data-flux-menu\:text-zinc-800{color:var(--color-zinc-800)}@media(hover:hover){:where([data-flux-menu]) .in-data-flux-menu\:hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:absolute{position:absolute}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:hidden{display:none}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:w-10{width:calc(var(--spacing) * 10)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:cursor-e-resize{cursor:e-resize}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:justify-center{justify-content:center}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:px-0{padding-inline:0}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:px-3{padding-inline:calc(var(--spacing) * 3)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:opacity-0{opacity:0}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-menu\:w-10:not(:where([data-flux-menu]) *){width:calc(var(--spacing) * 10)}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-menu\:justify-center:not(:where([data-flux-menu]) *){justify-content:center}:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:not-in-data-flux-sidebar-group-dropdown\:hidden:not(:where([data-flux-sidebar-group-dropdown]) *){display:none}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:absolute){position:absolute}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:opacity-0){opacity:0}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) .in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:opacity-100){opacity:1}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:hidden{display:none}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:w-auto\!{width:auto!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:bg-white\!{background-color:var(--color-white)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:px-2\!{padding-inline:calc(var(--spacing) * 2)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:text-zinc-400\!{color:var(--color-zinc-400)!important}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:text-zinc-800\!{color:var(--color-zinc-800)!important}@media(hover:hover){:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:hover\:bg-zinc-50\!:hover{background-color:var(--color-zinc-50)!important}}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:focus\:outline-hidden\!:focus{--tw-outline-style:none!important;outline-style:none!important}@media(forced-colors:active){:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:focus\:outline-hidden\!:focus{outline-offset:2px!important;outline:2px solid #0000!important}}:where([data-flux-sidebar-active]) :is(:where([data-flux-sidebar-collapsed-desktop]) :is(:where([data-flux-sidebar-header]) .in-data-flux-sidebar-header\:in-data-flux-sidebar-collapsed-desktop\:in-data-flux-sidebar-active\:hidden)),:where([data-flux-sidebar-on-mobile]) .in-data-flux-sidebar-on-mobile\:hidden{display:none}:where([data-flux-sidebar-on-mobile]) .in-data-flux-sidebar-on-mobile\:h-10{height:calc(var(--spacing) * 10)}:where([data-loading]) .in-data-loading\:opacity-0{opacity:0}:where([data-loading]) .in-data-loading\:opacity-100{opacity:1}:where([data-open]) .in-data-open\:bg-zinc-800\/5{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){:where([data-open]) .in-data-open\:bg-zinc-800\/5{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}:where([data-open]) .in-data-open\:text-zinc-800{color:var(--color-zinc-800)}:where([data-scrolled-left]) .in-data-scrolled-left\:last\:after\:inset-shadow-\[-8px_0px_8px_-8px_rgba\(0\,0\,0\,0\.05\)\]:last-child:after{content:var(--tw-content);--tw-inset-shadow:inset -8px 0px 8px -8px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where([data-scrolled-right]) .in-data-scrolled-right\:first\:after\:inset-shadow-\[8px_0px_8px_-8px_rgba\(0\,0\,0\,0\.05\)\]:first-child:after{content:var(--tw-content);--tw-inset-shadow:inset 8px 0px 8px -8px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where([data-at-end]) .in-data-\[at-end\]\:pointer-events-none{pointer-events:none}:where([data-at-end]) .in-data-\[at-end\]\:opacity-0{opacity:0}:where([data-at-start]) .in-data-\[at-start\]\:pointer-events-none{pointer-events:none}:where([data-at-start]) .in-data-\[at-start\]\:opacity-0{opacity:0}:where([data-flux-timeline-size=lg]) .in-data-\[flux-timeline-size\=lg\]\:text-zinc-800{color:var(--color-zinc-800)}:where(.group\/center-align) .in-\[\.group\\\/center-align\]\:justify-center{justify-content:center}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:-ms-8{margin-inline-start:calc(var(--spacing) * -8)}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:-me-2{margin-inline-end:calc(var(--spacing) * -2)}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:flex-row-reverse{flex-direction:row-reverse}:where(.group\/end-align) .in-\[\.group\\\/end-align\]\:justify-end{justify-content:flex-end}:where(:is(data-target)) .in-\[data-target\]\:text-start{text-align:start}:where(:is(ui-toast-group)) .in-\[ui-toast-group\]\:w-xs{width:var(--container-xs)}.has-focus-within\:z-10:has(:focus-within){z-index:10}.has-focus-visible\:outline-2:has(:focus-visible){outline-style:var(--tw-outline-style);outline-width:2px}.has-focus-visible\:outline-offset-\[-1px\]:has(:focus-visible){outline-offset:-1px}.has-focus-visible\:outline-\[-webkit-focus-ring-color\]:has(:focus-visible){outline-color:-webkit-focus-ring-color}.has-data-flux-navlist-badge\:not-in-data-flux-sidebar-collapsed-desktop\:pe-1\.5:has([data-flux-navlist-badge]):not(:where([data-flux-sidebar-collapsed-desktop]) *){padding-inline-end:calc(var(--spacing) * 1.5)}.has-data-flux-slider-tick-line\:mt-1:has([data-flux-slider-tick-line]){margin-top:var(--spacing)}.has-data-flux-toast-action\:gap-2:has([data-flux-toast-action]){gap:calc(var(--spacing) * 2)}.has-data-invalid\:border-red-500:has([data-invalid]){border-color:var(--color-red-500)}.has-data-invalid\:outline-red-500\!:has([data-invalid]){outline-color:var(--color-red-500)!important}.has-data-\[circle\=true\]\:rounded-full:has([data-circle=true]){border-radius:3.40282e38px}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\[data-flux-control\]\~\[data-flux-label\]\]\:grid-cols-\[auto_1fr\]:has(:is([data-flux-control]~[data-flux-label])){grid-template-columns:auto 1fr}.has-\[\[data-flux-label\]\~\[data-flux-control\]\]\:grid-cols-\[1fr_auto\]:has(:is([data-flux-label]~[data-flux-control])){grid-template-columns:1fr auto}.has-\[option\.placeholder\:checked\]\:text-zinc-400:has(:is(option.placeholder:checked)){color:var(--color-zinc-400)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:text-accent-foreground[aria-selected=true]{color:var(--color-accent-foreground)}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-active\:bg-red-50[data-active]{background-color:var(--color-red-50)}.data-active\:bg-zinc-50[data-active]{background-color:var(--color-zinc-50)}.data-active\:bg-zinc-100[data-active]{background-color:var(--color-zinc-100)}.data-active\:text-red-600[data-active]{color:var(--color-red-600)}.data-active\:text-zinc-500[data-active]{color:var(--color-zinc-500)}.data-active\:opacity-100[data-active]{opacity:1}:where([data-flux-sidebar-group-dropdown]) .in-data-flux-sidebar-group-dropdown\:data-active\:bg-zinc-50\![data-active]{background-color:var(--color-zinc-50)!important}:where([data-flux-slider-tick-position=inside]) .in-data-\[flux-slider-tick-position\=inside\]\:data-active\:text-white\/50[data-active]{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){:where([data-flux-slider-tick-position=inside]) .in-data-\[flux-slider-tick-position\=inside\]\:data-active\:text-white\/50[data-active]{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.data-at-end\:pointer-events-none[data-at-end]{pointer-events:none}.data-at-end\:opacity-50[data-at-end]{opacity:.5}.data-at-start\:pointer-events-none[data-at-start]{pointer-events:none}.data-at-start\:opacity-50[data-at-start]{opacity:.5}.data-checked\:border-0[data-checked]{border-style:var(--tw-border-style);border-width:0}.data-checked\:border-\(--color-accent\)[data-checked]{border-color:var(--color-accent)}.data-checked\:border-zinc-800[data-checked]{border-color:var(--color-zinc-800)}.data-checked\:bg-\(--color-accent\)[data-checked]{background-color:var(--color-accent)}.data-checked\:bg-white[data-checked]{background-color:var(--color-white)}.data-checked\:bg-zinc-50[data-checked]{background-color:var(--color-zinc-50)}.data-checked\:bg-zinc-800[data-checked]{background-color:var(--color-zinc-800)}.data-checked\:text-\(--color-accent-foreground\)[data-checked]{color:var(--color-accent-foreground)}.data-checked\:text-white[data-checked]{color:var(--color-white)}.data-checked\:text-zinc-500[data-checked]{color:var(--color-zinc-500)}.data-checked\:text-zinc-800[data-checked]{color:var(--color-zinc-800)}.data-checked\:shadow-xs[data-checked]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-checked\:after\:bg-\(--haze\)[data-checked]:after{content:var(--tw-content);background-color:var(--haze)}@media(hover:hover){.hover\:data-checked\:border-\(--color-accent\):hover[data-checked]{border-color:var(--color-accent)}.hover\:data-checked\:bg-\(--color-accent\):hover[data-checked]{background-color:var(--color-accent)}.data-checked\:hover\:text-zinc-800[data-checked]:hover{color:var(--color-zinc-800)}.hover\:data-checked\:text-\(--color-accent-foreground\):hover[data-checked]{color:var(--color-accent-foreground)}.hover\:data-checked\:after\:bg-\(--haze\):hover[data-checked]:after{content:var(--tw-content);background-color:var(--haze)}}.data-current\:border[data-current]{border-style:var(--tw-border-style);border-width:1px}.data-current\:border-zinc-200[data-current]{border-color:var(--color-zinc-200)}.data-current\:bg-white[data-current]{background-color:var(--color-white)}.data-current\:bg-zinc-800\/\[4\%\][data-current]{background-color:#2431520a}@supports (color:color-mix(in lab,red,red)){.data-current\:bg-zinc-800\/\[4\%\][data-current]{background-color:color-mix(in oklab,var(--color-zinc-800) 4%,transparent)}}.data-current\:text-\(--color-accent-content\)[data-current]{color:var(--color-accent-content)}.data-current\:text-zinc-800[data-current]{color:var(--color-zinc-800)}.data-current\:shadow-xs[data-current]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-current\:after\:absolute[data-current]:after{content:var(--tw-content);position:absolute}.data-current\:after\:inset-x-0[data-current]:after{content:var(--tw-content);inset-inline:0}.data-current\:after\:-bottom-3[data-current]:after{content:var(--tw-content);bottom:calc(var(--spacing) * -3)}.data-current\:after\:h-\[2px\][data-current]:after{content:var(--tw-content);height:2px}.data-current\:after\:bg-\(--color-accent-content\)[data-current]:after{content:var(--tw-content);background-color:var(--color-accent-content)}.data-current\:after\:bg-zinc-800[data-current]:after{content:var(--tw-content);background-color:var(--color-zinc-800)}@media(hover:hover){.hover\:data-current\:bg-\(--hover-fill\):hover[data-current]{background-color:var(--hover-fill)}.hover\:data-current\:text-\(--color-accent-content\):hover[data-current]{color:var(--color-accent-content)}}.data-end\:rounded-e-lg[data-end],.data-end-preview\:rounded-e-lg[data-end-preview]{border-start-end-radius:var(--radius-lg);border-end-end-radius:var(--radius-lg)}:is(.\*\*\:data-flux-badge-icon\:me-1 *)[data-flux-badge-icon]{margin-inline-end:var(--spacing)}:is(.\*\*\:data-flux-badge-icon\:me-1\.5 *)[data-flux-badge-icon]{margin-inline-end:calc(var(--spacing) * 1.5)}:is(.\*\*\:data-flux-badge-icon\:me-2 *)[data-flux-badge-icon]{margin-inline-end:calc(var(--spacing) * 2)}:is(.\*\:data-flux-field\:mb-3>*)[data-flux-field]{margin-bottom:calc(var(--spacing) * 3)}:is(.\*\:data-flux-input\:grow>*)[data-flux-input]{flex-grow:1}:is(.\*\:data-flux-label\:mb-3>*)[data-flux-label]{margin-bottom:calc(var(--spacing) * 3)}.data-flux-loading\:pointer-events-none[data-flux-loading]{pointer-events:none}:is(.\*\*\:data-flux-menu-item-icon\:text-zinc-400 *)[data-flux-menu-item-icon]{color:var(--color-zinc-400)}.data-flux-sidebar-collapsed-desktop\:w-14[data-flux-sidebar-collapsed-desktop]{width:calc(var(--spacing) * 14)}.data-flux-sidebar-collapsed-desktop\:cursor-e-resize[data-flux-sidebar-collapsed-desktop]{cursor:e-resize}.data-flux-sidebar-collapsed-desktop\:px-2[data-flux-sidebar-collapsed-desktop]{padding-inline:calc(var(--spacing) * 2)}.data-flux-sidebar-on-mobile\:fixed\![data-flux-sidebar-on-mobile]{position:fixed!important}.data-flux-sidebar-on-mobile\:start-0\![data-flux-sidebar-on-mobile]{inset-inline-start:calc(var(--spacing) * 0)!important}.data-flux-sidebar-on-mobile\:top-0\![data-flux-sidebar-on-mobile]{top:0!important}.data-flux-sidebar-on-mobile\:max-h-dvh\![data-flux-sidebar-on-mobile]{max-height:100dvh!important}.data-flux-sidebar-on-mobile\:min-h-dvh\![data-flux-sidebar-on-mobile]{min-height:100dvh!important}.data-flux-sidebar-on-mobile\:not-data-flux-sidebar-collapsed-mobile\:block[data-flux-sidebar-on-mobile]:not([data-flux-sidebar-collapsed-mobile]){display:block}.data-flux-sidebar-on-mobile\:data-flux-sidebar-collapsed-mobile\:-translate-x-full[data-flux-sidebar-on-mobile][data-flux-sidebar-collapsed-mobile]{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\*\:data-flux-table-sortable\:last\:me-0 *)[data-flux-table-sortable]:last-child{margin-inline-end:0}.data-hidden\:hidden[data-hidden]{display:none}.data-in-range\:bg-zinc-100[data-in-range]{background-color:var(--color-zinc-100)}.data-indeterminate\:border-transparent[data-indeterminate]{border-color:#0000}.data-invalid\:border-s-0[data-invalid]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.data-invalid\:border-red-500[data-invalid]{border-color:var(--color-red-500)}.data-invalid\:text-red-500[data-invalid]{color:var(--color-red-500)}.data-invalid\:shadow-none[data-invalid]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-invalid\:outline-red-500[data-invalid]{outline-color:var(--color-red-500)}.disabled\:data-invalid\:border-red-500:disabled[data-invalid]{border-color:var(--color-red-500)}.data-loading\:pointer-events-none[data-loading]{pointer-events:none}.data-loading\:opacity-50[data-loading]{opacity:.5}.data-match\:text-zinc-800[data-match]{color:var(--color-zinc-800)}:is(.\*\*\:data-navmenu-icon\:text-zinc-400 *)[data-navmenu-icon]{color:var(--color-zinc-400)}.data-open\:block[data-open]{display:block}.data-open\:text-zinc-800[data-open]{color:var(--color-zinc-800)}.data-outside\:opacity-50[data-outside]{opacity:.5}.data-selected\:border-\(--color-accent-content\)[data-selected]{border-color:var(--color-accent-content)}.data-selected\:border-zinc-800[data-selected]{border-color:var(--color-zinc-800)}.data-selected\:bg-\(--color-accent\)[data-selected]{background-color:var(--color-accent)}.data-selected\:bg-white[data-selected]{background-color:var(--color-white)}.data-selected\:bg-zinc-800[data-selected]{background-color:var(--color-zinc-800)}.data-selected\:text-\(--color-accent-content\)[data-selected]{color:var(--color-accent-content)}.data-selected\:text-\(--color-accent-foreground\)[data-selected]{color:var(--color-accent-foreground)}.data-selected\:text-white[data-selected]{color:var(--color-white)}.data-selected\:text-zinc-800[data-selected]{color:var(--color-zinc-800)}.data-selected\:shadow-xs[data-selected]{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.hover\:data-selected\:bg-\(--color-accent\):hover[data-selected]{background-color:var(--color-accent)}.hover\:data-selected\:text-\(--color-accent-content\):hover[data-selected]{color:var(--color-accent-content)}.hover\:data-selected\:text-\(--color-accent-foreground\):hover[data-selected]{color:var(--color-accent-foreground)}}.data-start\:rounded-s-lg[data-start]{border-start-start-radius:var(--radius-lg);border-end-start-radius:var(--radius-lg)}.data-unavailable\:line-through[data-unavailable]{text-decoration-line:line-through}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\]\:ring-2[data-selected]{--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)}.data-\[selected\]\:ring-\(--color-accent\)[data-selected]{--tw-ring-color:var(--color-accent)}.data-\[selected\]\:ring-offset-1[data-selected]{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:var(--color-accent-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\*\:data-\[slot\=avatar\]\:ring-4 *)[data-slot=avatar]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + 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)}:is(.\*\*\:data-\[slot\=avatar\]\:data-\[size\=sm\]\:ring-2 *)[data-slot=avatar][data-size=sm],:is(.\*\*\:data-\[slot\=avatar\]\:data-\[size\=xs\]\:ring-2 *)[data-slot=avatar][data-size=xs]{--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)}:is(.\*\*\:data-\[slot\=content\]\:p-2\! *)[data-slot=content]{padding:calc(var(--spacing) * 2)!important}:is(.\*\*\:data-\[slot\=content\]\:text-base\! *)[data-slot=content]{font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}:is(.\*\*\:data-\[slot\=content\]\:text-zinc-700 *)[data-slot=content]{color:var(--color-zinc-700)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:var(--color-accent)}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:var(--color-accent-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:64rem){.max-lg\:data-flux-sidebar-cloak\:hidden[data-flux-sidebar-cloak]{display:none}}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media not all and (min-width:40rem){.max-sm\:fixed\!{position:fixed!important}.max-sm\:inset-0\!{top:0!important;right:0!important;bottom:0!important;left:0!important}.max-sm\:hidden{display:none}.max-sm\:max-h-full\!{max-height:100%!important}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-2{top:calc(var(--spacing) * 2)}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:right-0{right:0}.sm\:right-3{right:calc(var(--spacing) * 3)}.sm\:bottom-0{bottom:0}.sm\:bottom-2{bottom:calc(var(--spacing) * 2)}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.sm\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.sm\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.sm\:size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.sm\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.sm\:size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.sm\:size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.sm\:size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.sm\:size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.sm\:h-8{height:calc(var(--spacing) * 8)}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-6\!{width:calc(var(--spacing) * 6)!important}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[11\.25rem\]{width:11.25rem}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-2{padding:calc(var(--spacing) * 2)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-10{padding-block:calc(var(--spacing) * 10)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:ps-2{padding-inline-start:calc(var(--spacing) * 2)}.sm\:ps-5{padding-inline-start:calc(var(--spacing) * 5)}.sm\:pe-8{padding-inline-end:calc(var(--spacing) * 8)}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.sm\: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)}.sm\:backdrop\:bg-transparent::backdrop{background-color:#0000}.first\:sm\:pl-0:first-child{padding-left:0}:where(:is(ui-toast-group)) .sm\:in-\[ui-toast-group\]\:w-sm{width:var(--container-sm)}:is(.sm\:\*\*\:data-\[slot\=content\]\:text-sm\! *)[data-slot=content]{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:m-2{margin:calc(var(--spacing) * 2)}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overscroll-contain{overscroll-behavior:contain}.lg\:rounded-xl{border-radius:var(--radius-xl)}.lg\:border{border-style:var(--tw-border-style);border-width:1px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}@container not (min-width:28rem){.\@max-md\:py-2{padding-block:calc(var(--spacing) * 2)}}@container (min-width:28rem){.\@md\:m-\[-2px\]{margin:-2px}.\@md\:flex{display:flex}.\@md\:flex-row-reverse{flex-direction:row-reverse}.\@md\:justify-end{justify-content:flex-end}.\@md\:ps-4{padding-inline-start:calc(var(--spacing) * 4)}.\@md\:pe-4{padding-inline-end:calc(var(--spacing) * 4)}}@container (min-width:40rem){.\@\[40rem\]\:flex{display:flex}.\@\[40rem\]\:hidden{display:none}}.rtl\:right-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:0}.rtl\:right-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:calc(var(--spacing) * 3)}.rtl\:right-\[-44px\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:-44px}.rtl\:right-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:auto}.rtl\:left-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:0}.rtl\:left-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:calc(var(--spacing) * 3)}.rtl\:left-\[-44px\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:-44px}.rtl\:left-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:auto}.rtl\:mr-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:0}.rtl\:mr-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:auto}.rtl\:ml-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:0}.rtl\:ml-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:auto}.rtl\:block:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:block}.rtl\:hidden:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:none}.rtl\:inline:where(:dir(rtl),[dir=rtl],[dir=rtl] *){display:inline}.rtl\:-translate-x-1\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-translate-x-\[0\.1875rem\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -.1875rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:translate-x-1\/2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: 50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rtl\:-scale-x-100:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x: -100% ;scale:var(--tw-scale-x) var(--tw-scale-y)}.rtl\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.rtl\:flex-row-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *){flex-direction:row-reverse}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.rtl\:mask-r-from-100\%:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-right:linear-gradient(to right, var(--tw-mask-right-from-color) var(--tw-mask-right-from-position), var(--tw-mask-right-to-color) var(--tw-mask-right-to-position));--tw-mask-right-from-position:100%;-webkit-mask-composite:source-in;mask-composite:intersect}.rtl\:mask-l-from-\[max\(calc\(100\%-6rem\)\,var\(--flux-scroll-percentage\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){-webkit-mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);mask-image:var(--tw-mask-linear),var(--tw-mask-radial),var(--tw-mask-conic);--tw-mask-linear:var(--tw-mask-left), var(--tw-mask-right), var(--tw-mask-bottom), var(--tw-mask-top);--tw-mask-left:linear-gradient(to left, var(--tw-mask-left-from-color) var(--tw-mask-left-from-position), var(--tw-mask-left-to-color) var(--tw-mask-left-to-position));--tw-mask-left-from-position:max( calc(100% - 6rem) , var(--flux-scroll-percentage));-webkit-mask-composite:source-in;mask-composite:intersect}.rtl\:bg-position-\[left_\.25rem_center\]\!:where(:dir(rtl),[dir=rtl],[dir=rtl] *){background-position:.25rem!important}.rtl\:text-right:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}.rtl\:\[--flux-carousel-fade-left\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,var\(--flux-carousel-scroll-percentage\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-carousel-fade-left:max(calc(100% - var(--flux-carousel-fade-size)), var(--flux-carousel-scroll-percentage))}.rtl\:\[--flux-carousel-fade-right\:max\(calc\(100\%-var\(--flux-carousel-fade-size\)\)\,calc\(100\%-var\(--flux-carousel-scroll-percentage\)\)\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-carousel-fade-right:max(calc(100% - var(--flux-carousel-fade-size)), calc(100% - var(--flux-carousel-scroll-percentage)))}.rtl\:\[--flux-flyout-translate\:translateX\(-50px\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-flyout-translate:translateX(-50px)}.rtl\:\[--flux-flyout-translate\:translateX\(50px\)\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--flux-flyout-translate:translateX(50px)}.rtl\:group-data-checked\:-translate-x-\[0\.9375rem\]:where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.group)[data-checked] *){--tw-translate-x: -.9375rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}:where([data-flux-sidebar-collapsed-desktop]) .rtl\:in-data-flux-sidebar-collapsed-desktop\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *),.rtl\:data-flux-sidebar-collapsed-desktop\:cursor-w-resize:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-flux-sidebar-collapsed-desktop]{cursor:w-resize}.data-flux-sidebar-on-mobile\:data-flux-sidebar-collapsed-mobile\:rtl\:translate-x-full[data-flux-sidebar-on-mobile][data-flux-sidebar-collapsed-mobile]:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:block:where(.dark,.dark *){display:block}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:translate-x-\[0\.125rem\]:where(.dark,.dark *){--tw-translate-x:.125rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:scale-0:where(.dark,.dark *){--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100:where(.dark,.dark *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90:where(.dark,.dark *){rotate:-90deg}.dark\:rotate-0:where(.dark,.dark *){rotate:0deg}:where(.dark\:divide-white\/15:where(.dark,.dark *)>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15:where(.dark,.dark *)>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border:where(.dark,.dark *){border-style:var(--tw-border-style);border-width:1px}.dark\:border-0:where(.dark,.dark *){border-style:var(--tw-border-style);border-width:0}.dark\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_22\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-color:#333b3e}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_22\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-accent-content) 22%,var(--color-zinc-600))}}.dark\:border-\[var\(--color-primary\)\]\/30:where(.dark,.dark *){border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30:where(.dark,.dark *){border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-gray-600:where(.dark,.dark *){border-color:var(--color-gray-600)}.dark\:border-green-500\/30:where(.dark,.dark *){border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30:where(.dark,.dark *){border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:border-white\/10:where(.dark,.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:border-white\/10\!:where(.dark,.dark *){border-color:#ffffff1a!important}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10\!:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)!important}}.dark\:border-white\/15:where(.dark,.dark *){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-white\/20:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:border-zinc-500:where(.dark,.dark *){border-color:var(--color-zinc-500)}.dark\:border-zinc-600:where(.dark,.dark *){border-color:var(--color-zinc-600)}.dark\:border-zinc-700:where(.dark,.dark *){border-color:var(--color-zinc-700)}.dark\:border-zinc-800:where(.dark,.dark *){border-color:var(--color-zinc-800)}.dark\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_30\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-bottom-color:#30393e}@supports (color:color-mix(in lab,red,red)){.dark\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_30\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *){border-bottom-color:color-mix(in oklab,var(--color-accent-content) 30%,var(--color-zinc-600))}}.dark\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *){background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-button-soft),transparent 60%)}}.dark\:bg-\[var\(--color-primary\)\]\/20:where(.dark,.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-400:where(.dark,.dark *){background-color:var(--color-amber-400)}.dark\:bg-amber-400\/40:where(.dark,.dark *){background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.dark\:bg-amber-500:where(.dark,.dark *){background-color:var(--color-amber-500)}.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-blue-400:where(.dark,.dark *){background-color:var(--color-blue-400)}.dark\:bg-blue-400\/40:where(.dark,.dark *){background-color:#54a2ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-400) 40%,transparent)}}.dark\:bg-blue-600:where(.dark,.dark *){background-color:var(--color-blue-600)}.dark\:bg-cyan-400:where(.dark,.dark *){background-color:var(--color-cyan-400)}.dark\:bg-cyan-400\/40:where(.dark,.dark *){background-color:#00d2ef66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-cyan-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-cyan-400) 40%,transparent)}}.dark\:bg-cyan-600:where(.dark,.dark *){background-color:var(--color-cyan-600)}.dark\:bg-emerald-400:where(.dark,.dark *){background-color:var(--color-emerald-400)}.dark\:bg-emerald-400\/40:where(.dark,.dark *){background-color:#00d29466}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-emerald-400) 40%,transparent)}}.dark\:bg-emerald-600:where(.dark,.dark *){background-color:var(--color-emerald-600)}.dark\:bg-fuchsia-400:where(.dark,.dark *){background-color:var(--color-fuchsia-400)}.dark\:bg-fuchsia-400\/40:where(.dark,.dark *){background-color:#ec6cff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-fuchsia-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-fuchsia-400) 40%,transparent)}}.dark\:bg-fuchsia-600:where(.dark,.dark *){background-color:var(--color-fuchsia-600)}.dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\:bg-gray-800:where(.dark,.dark *){background-color:var(--color-gray-800)}.dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--color-gray-900)}.dark\:bg-green-400:where(.dark,.dark *){background-color:var(--color-green-400)}.dark\:bg-green-400\/40:where(.dark,.dark *){background-color:#05df7266}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-400) 40%,transparent)}}.dark\:bg-green-500\/10:where(.dark,.dark *){background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-green-600:where(.dark,.dark *){background-color:var(--color-green-600)}.dark\:bg-indigo-400:where(.dark,.dark *){background-color:var(--color-indigo-400)}.dark\:bg-indigo-400\/40:where(.dark,.dark *){background-color:#7d87ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-indigo-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-indigo-400) 40%,transparent)}}.dark\:bg-indigo-600:where(.dark,.dark *){background-color:var(--color-indigo-600)}.dark\:bg-indigo-900:where(.dark,.dark *){background-color:var(--color-indigo-900)}.dark\:bg-lime-400:where(.dark,.dark *){background-color:var(--color-lime-400)}.dark\:bg-lime-400\/40:where(.dark,.dark *){background-color:#9de50066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-lime-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-lime-400) 40%,transparent)}}.dark\:bg-lime-600:where(.dark,.dark *){background-color:var(--color-lime-600)}.dark\:bg-neutral-700:where(.dark,.dark *){background-color:var(--color-neutral-700)}.dark\:bg-orange-400:where(.dark,.dark *){background-color:var(--color-orange-400)}.dark\:bg-orange-400\/40:where(.dark,.dark *){background-color:#ff8b1a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-orange-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-orange-400) 40%,transparent)}}.dark\:bg-orange-600:where(.dark,.dark *){background-color:var(--color-orange-600)}.dark\:bg-pink-400:where(.dark,.dark *){background-color:var(--color-pink-400)}.dark\:bg-pink-400\/40:where(.dark,.dark *){background-color:#fb64b666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-pink-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-pink-400) 40%,transparent)}}.dark\:bg-pink-600:where(.dark,.dark *){background-color:var(--color-pink-600)}.dark\:bg-purple-400:where(.dark,.dark *){background-color:var(--color-purple-400)}.dark\:bg-purple-400\/40:where(.dark,.dark *){background-color:#c07eff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-purple-400) 40%,transparent)}}.dark\:bg-purple-600:where(.dark,.dark *){background-color:var(--color-purple-600)}.dark\:bg-red-400:where(.dark,.dark *){background-color:var(--color-red-400)}.dark\:bg-red-400\/40:where(.dark,.dark *){background-color:#ff656866}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-400) 40%,transparent)}}.dark\:bg-red-600:where(.dark,.dark *){background-color:var(--color-red-600)}.dark\:bg-rose-400:where(.dark,.dark *){background-color:var(--color-rose-400)}.dark\:bg-rose-400\/40:where(.dark,.dark *){background-color:#ff667f66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-rose-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-rose-400) 40%,transparent)}}.dark\:bg-rose-600:where(.dark,.dark *){background-color:var(--color-rose-600)}.dark\:bg-sky-400:where(.dark,.dark *){background-color:var(--color-sky-400)}.dark\:bg-sky-400\/40:where(.dark,.dark *){background-color:#00bcfe66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-sky-400) 40%,transparent)}}.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-sky-600:where(.dark,.dark *){background-color:var(--color-sky-600)}.dark\:bg-teal-400:where(.dark,.dark *){background-color:var(--color-teal-400)}.dark\:bg-teal-400\/40:where(.dark,.dark *){background-color:#00d3bd66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-teal-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-teal-400) 40%,transparent)}}.dark\:bg-teal-600:where(.dark,.dark *){background-color:var(--color-teal-600)}.dark\:bg-transparent:where(.dark,.dark *){background-color:#0000}.dark\:bg-violet-400:where(.dark,.dark *){background-color:var(--color-violet-400)}.dark\:bg-violet-400\/40:where(.dark,.dark *){background-color:#a685ff66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-violet-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-violet-400) 40%,transparent)}}.dark\:bg-violet-600:where(.dark,.dark *){background-color:var(--color-violet-600)}.dark\:bg-white:where(.dark,.dark *){background-color:var(--color-white)}.dark\:bg-white\/5:where(.dark,.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/5:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:bg-white\/10:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:bg-white\/10\!:where(.dark,.dark *){background-color:#ffffff1a!important}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10\!:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)!important}}.dark\:bg-white\/20:where(.dark,.dark *){background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:bg-white\/25:where(.dark,.dark *){background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/25:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.dark\:bg-white\/30:where(.dark,.dark *){background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]:where(.dark,.dark *){background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]:where(.dark,.dark *){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-white\/\[6\%\]:where(.dark,.dark *){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[6\%\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-400:where(.dark,.dark *){background-color:var(--color-yellow-400)}.dark\:bg-yellow-400\/40:where(.dark,.dark *){background-color:#fac80066}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-400) 40%,transparent)}}.dark\:bg-yellow-900\/30:where(.dark,.dark *){background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-300:where(.dark,.dark *){background-color:var(--color-zinc-300)}.dark\:bg-zinc-400:where(.dark,.dark *){background-color:var(--color-zinc-400)}.dark\:bg-zinc-400\/40:where(.dark,.dark *){background-color:#8a918d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-400\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-zinc-400) 40%,transparent)}}.dark\:bg-zinc-600:where(.dark,.dark *){background-color:var(--color-zinc-600)}.dark\:bg-zinc-600\!:where(.dark,.dark *){background-color:var(--color-zinc-600)!important}.dark\:bg-zinc-700:where(.dark,.dark *){background-color:var(--color-zinc-700)}.dark\:bg-zinc-800:where(.dark,.dark *){background-color:var(--color-zinc-800)}.dark\:bg-zinc-900:where(.dark,.dark *){background-color:var(--color-zinc-900)}.dark\:bg-zinc-950:where(.dark,.dark *){background-color:var(--color-zinc-950)}.dark\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%23ffffff75\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:where(.dark,.dark *){background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%23ffffff75%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:from-white\/10:where(.dark,.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:bg-\[length\:16px_16px\]:where(.dark,.dark *){background-size:16px 16px}.dark\:bg-clip-border:where(.dark,.dark *){background-clip:border-box}.dark\:text-\(--color-accent-content\):where(.dark,.dark *){color:var(--color-accent-content)}.dark\:text-\(--color-button-muted\):where(.dark,.dark *){color:var(--color-button-muted)}.dark\:text-\(--color-button-soft-foreground\):where(.dark,.dark *){color:var(--color-button-soft-foreground)}.dark\:text-\[color-mix\(in_oklab\,_var\(--color-button-muted\)\,_var\(--color-zinc-400\)_48\%\)\]:where(.dark,.dark *){color:var(--color-button-muted)}@supports (color:color-mix(in lab,red,red)){.dark\:text-\[color-mix\(in_oklab\,_var\(--color-button-muted\)\,_var\(--color-zinc-400\)_48\%\)\]:where(.dark,.dark *){color:color-mix(in oklab,var(--color-button-muted),var(--color-zinc-400) 48%)}}.dark\:text-\[var\(--callout-icon\)\]:where(.dark,.dark *){color:var(--callout-icon)}.dark\:text-amber-100:where(.dark,.dark *){color:var(--color-amber-100)}.dark\:text-amber-200:where(.dark,.dark *){color:var(--color-amber-200)}.dark\:text-amber-300:where(.dark,.dark *){color:var(--color-amber-300)}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-amber-500:where(.dark,.dark *){color:var(--color-amber-500)}.dark\:text-black:where(.dark,.dark *){color:var(--color-black)}.dark\:text-blue-200:where(.dark,.dark *){color:var(--color-blue-200)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-cyan-200:where(.dark,.dark *){color:var(--color-cyan-200)}.dark\:text-cyan-400:where(.dark,.dark *){color:var(--color-cyan-400)}.dark\:text-emerald-200:where(.dark,.dark *){color:var(--color-emerald-200)}.dark\:text-emerald-400:where(.dark,.dark *){color:var(--color-emerald-400)}.dark\:text-fuchsia-200:where(.dark,.dark *){color:var(--color-fuchsia-200)}.dark\:text-fuchsia-400:where(.dark,.dark *){color:var(--color-fuchsia-400)}.dark\:text-gray-200:where(.dark,.dark *){color:var(--color-gray-200)}.dark\:text-gray-300:where(.dark,.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:where(.dark,.dark *){color:var(--color-gray-400)}.dark\:text-gray-600:where(.dark,.dark *){color:var(--color-gray-600)}.dark\:text-green-100:where(.dark,.dark *){color:var(--color-green-100)}.dark\:text-green-200:where(.dark,.dark *){color:var(--color-green-200)}.dark\:text-green-500:where(.dark,.dark *){color:var(--color-green-500)}.dark\:text-indigo-200:where(.dark,.dark *){color:var(--color-indigo-200)}.dark\:text-indigo-400:where(.dark,.dark *){color:var(--color-indigo-400)}.dark\:text-lime-200:where(.dark,.dark *){color:var(--color-lime-200)}.dark\:text-lime-400:where(.dark,.dark *){color:var(--color-lime-400)}.dark\:text-lime-500:where(.dark,.dark *){color:var(--color-lime-500)}.dark\:text-orange-200:where(.dark,.dark *){color:var(--color-orange-200)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-pink-200:where(.dark,.dark *){color:var(--color-pink-200)}.dark\:text-pink-400:where(.dark,.dark *){color:var(--color-pink-400)}.dark\:text-purple-200:where(.dark,.dark *){color:var(--color-purple-200)}.dark\:text-purple-400:where(.dark,.dark *){color:var(--color-purple-400)}.dark\:text-red-200:where(.dark,.dark *){color:var(--color-red-200)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-rose-200:where(.dark,.dark *){color:var(--color-rose-200)}.dark\:text-rose-400:where(.dark,.dark *){color:var(--color-rose-400)}.dark\:text-sky-100:where(.dark,.dark *){color:var(--color-sky-100)}.dark\:text-sky-200:where(.dark,.dark *){color:var(--color-sky-200)}.dark\:text-sky-400:where(.dark,.dark *){color:var(--color-sky-400)}.dark\:text-teal-200:where(.dark,.dark *){color:var(--color-teal-200)}.dark\:text-teal-400:where(.dark,.dark *){color:var(--color-teal-400)}.dark\:text-violet-200:where(.dark,.dark *){color:var(--color-violet-200)}.dark\:text-violet-400:where(.dark,.dark *){color:var(--color-violet-400)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-white\!:where(.dark,.dark *){color:var(--color-white)!important}.dark\:text-white\/15:where(.dark,.dark *){color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/15:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:text-white\/25:where(.dark,.dark *){color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/25:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.dark\:text-white\/40:where(.dark,.dark *){color:#fff6}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/40:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.dark\:text-white\/50:where(.dark,.dark *){color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/50:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.dark\:text-white\/60:where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:text-white\/70:where(.dark,.dark *){color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.dark\:text-white\/80:where(.dark,.dark *){color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-yellow-200:where(.dark,.dark *){color:var(--color-yellow-200)}.dark\:text-yellow-500:where(.dark,.dark *){color:var(--color-yellow-500)}.dark\:text-zinc-100:where(.dark,.dark *){color:var(--color-zinc-100)}.dark\:text-zinc-200:where(.dark,.dark *){color:var(--color-zinc-200)}.dark\:text-zinc-200\!:where(.dark,.dark *){color:var(--color-zinc-200)!important}.dark\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}.dark\:text-zinc-300\/80:where(.dark,.dark *){color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-300\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.dark\:text-zinc-300\/95:where(.dark,.dark *){color:#cfc8b5f2}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-300\/95:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-300) 95%,transparent)}}.dark\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}.dark\:text-zinc-400\/80:where(.dark,.dark *){color:#8a918dcc}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-400\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-400) 80%,transparent)}}.dark\:text-zinc-500:where(.dark,.dark *){color:var(--color-zinc-500)}.dark\:text-zinc-500\!:where(.dark,.dark *){color:var(--color-zinc-500)!important}.dark\:text-zinc-500\/90:where(.dark,.dark *){color:#5a6360e6}@supports (color:color-mix(in lab,red,red)){.dark\:text-zinc-500\/90:where(.dark,.dark *){color:color-mix(in oklab,var(--color-zinc-500) 90%,transparent)}}.dark\:text-zinc-600:where(.dark,.dark *){color:var(--color-zinc-600)}.dark\:text-zinc-800:where(.dark,.dark *){color:var(--color-zinc-800)}.dark\:text-zinc-950:where(.dark,.dark *){color:var(--color-zinc-950)}.dark\:decoration-white\/20:where(.dark,.dark *){text-decoration-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:decoration-white\/20:where(.dark,.dark *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:placeholder-white\/60:where(.dark,.dark *)::placeholder{color:#fff9}@supports (color:color-mix(in lab,red,red)){.dark\:placeholder-white\/60:where(.dark,.dark *)::placeholder{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:placeholder-zinc-400:where(.dark,.dark *)::placeholder{color:var(--color-zinc-400)}.dark\:shadow-none:where(.dark,.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:ring-black\/30:where(.dark,.dark *){--tw-ring-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.dark\:ring-black\/30:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:ring-white\/10:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:ring-zinc-700:where(.dark,.dark *){--tw-ring-color:var(--color-zinc-700)}.dark\:ring-zinc-900:where(.dark,.dark *){--tw-ring-color:var(--color-zinc-900)}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-amber-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-blue-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d2ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-cyan-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d2941a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-emerald-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ec6cff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-fuchsia-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#05df721a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-green-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#7d87ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-indigo-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#9de5001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-lime-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-orange-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fb64b61a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-pink-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#c07eff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-purple-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff65681a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-red-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#ff667f1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-rose-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00bcfe1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-sky-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#00d3bd1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-teal-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#a685ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-violet-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#fac8001a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-yellow-400),transparent 90%)}}.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-zinc-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:#8a918d1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-background\:color-mix\(in_oklab\,var\(--color-zinc-400\)\,transparent_90\%\)\]:where(.dark,.dark *){--callout-background:color-mix(in oklab,var(--color-zinc-400),transparent 90%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fcbb0080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-amber-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-amber-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-blue-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-blue-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d2ef80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-cyan-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-cyan-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d29480}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-emerald-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-emerald-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ec6cff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-fuchsia-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-fuchsia-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#05df7280}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-green-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-green-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-indigo-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-indigo-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#9de50080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-lime-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-lime-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-orange-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-orange-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fb64b680}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-pink-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-pink-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#c07eff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-purple-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-purple-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff656880}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-red-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-red-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#ff667f80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-rose-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-rose-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-sky-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-sky-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#00d3bd80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-teal-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-teal-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#a685ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-violet-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-violet-400),transparent 50%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-white\)\,transparent_95\%\)\]:where(.dark,.dark *){--callout-border:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-white\)\,transparent_95\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-white),transparent 95%)}}.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:#fac80080}@supports (color:color-mix(in lab,red,red)){.dark\:\[--callout-border\:color-mix\(in_oklab\,var\(--color-yellow-400\)\,transparent_50\%\)\]:where(.dark,.dark *){--callout-border:color-mix(in oklab,var(--color-yellow-400),transparent 50%)}}.dark\:\[--callout-heading\:var\(--color-amber-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-amber-200)}.dark\:\[--callout-heading\:var\(--color-blue-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-blue-200)}.dark\:\[--callout-heading\:var\(--color-cyan-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-cyan-200)}.dark\:\[--callout-heading\:var\(--color-emerald-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-emerald-200)}.dark\:\[--callout-heading\:var\(--color-fuchsia-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-fuchsia-200)}.dark\:\[--callout-heading\:var\(--color-green-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-green-200)}.dark\:\[--callout-heading\:var\(--color-indigo-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-indigo-200)}.dark\:\[--callout-heading\:var\(--color-lime-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-lime-200)}.dark\:\[--callout-heading\:var\(--color-orange-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-orange-200)}.dark\:\[--callout-heading\:var\(--color-pink-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-pink-200)}.dark\:\[--callout-heading\:var\(--color-purple-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-purple-200)}.dark\:\[--callout-heading\:var\(--color-red-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-red-200)}.dark\:\[--callout-heading\:var\(--color-rose-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-rose-200)}.dark\:\[--callout-heading\:var\(--color-sky-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-sky-200)}.dark\:\[--callout-heading\:var\(--color-teal-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-teal-200)}.dark\:\[--callout-heading\:var\(--color-violet-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-violet-200)}.dark\:\[--callout-heading\:var\(--color-yellow-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-yellow-200)}.dark\:\[--callout-heading\:var\(--color-zinc-200\)\]:where(.dark,.dark *){--callout-heading:var(--color-zinc-200)}.dark\:\[--callout-icon\:var\(--color-amber-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-amber-400)}.dark\:\[--callout-icon\:var\(--color-blue-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-blue-400)}.dark\:\[--callout-icon\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-cyan-400)}.dark\:\[--callout-icon\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-emerald-400)}.dark\:\[--callout-icon\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-fuchsia-400)}.dark\:\[--callout-icon\:var\(--color-green-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-green-400)}.dark\:\[--callout-icon\:var\(--color-indigo-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-indigo-400)}.dark\:\[--callout-icon\:var\(--color-lime-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-lime-400)}.dark\:\[--callout-icon\:var\(--color-orange-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-orange-400)}.dark\:\[--callout-icon\:var\(--color-pink-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-pink-400)}.dark\:\[--callout-icon\:var\(--color-purple-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-purple-400)}.dark\:\[--callout-icon\:var\(--color-red-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-red-400)}.dark\:\[--callout-icon\:var\(--color-rose-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-rose-400)}.dark\:\[--callout-icon\:var\(--color-sky-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-sky-400)}.dark\:\[--callout-icon\:var\(--color-teal-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-teal-400)}.dark\:\[--callout-icon\:var\(--color-violet-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-violet-400)}.dark\:\[--callout-icon\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-yellow-400)}.dark\:\[--callout-icon\:var\(--color-zinc-400\)\]:where(.dark,.dark *){--callout-icon:var(--color-zinc-400)}.dark\:\[--callout-text\:var\(--color-amber-300\)\]:where(.dark,.dark *){--callout-text:var(--color-amber-300)}.dark\:\[--callout-text\:var\(--color-blue-300\)\]:where(.dark,.dark *){--callout-text:var(--color-blue-300)}.dark\:\[--callout-text\:var\(--color-cyan-300\)\]:where(.dark,.dark *){--callout-text:var(--color-cyan-300)}.dark\:\[--callout-text\:var\(--color-emerald-300\)\]:where(.dark,.dark *){--callout-text:var(--color-emerald-300)}.dark\:\[--callout-text\:var\(--color-fuchsia-300\)\]:where(.dark,.dark *){--callout-text:var(--color-fuchsia-300)}.dark\:\[--callout-text\:var\(--color-green-300\)\]:where(.dark,.dark *){--callout-text:var(--color-green-300)}.dark\:\[--callout-text\:var\(--color-indigo-300\)\]:where(.dark,.dark *){--callout-text:var(--color-indigo-300)}.dark\:\[--callout-text\:var\(--color-lime-300\)\]:where(.dark,.dark *){--callout-text:var(--color-lime-300)}.dark\:\[--callout-text\:var\(--color-orange-300\)\]:where(.dark,.dark *){--callout-text:var(--color-orange-300)}.dark\:\[--callout-text\:var\(--color-pink-300\)\]:where(.dark,.dark *){--callout-text:var(--color-pink-300)}.dark\:\[--callout-text\:var\(--color-purple-300\)\]:where(.dark,.dark *){--callout-text:var(--color-purple-300)}.dark\:\[--callout-text\:var\(--color-red-300\)\]:where(.dark,.dark *){--callout-text:var(--color-red-300)}.dark\:\[--callout-text\:var\(--color-rose-300\)\]:where(.dark,.dark *){--callout-text:var(--color-rose-300)}.dark\:\[--callout-text\:var\(--color-sky-300\)\]:where(.dark,.dark *){--callout-text:var(--color-sky-300)}.dark\:\[--callout-text\:var\(--color-teal-300\)\]:where(.dark,.dark *){--callout-text:var(--color-teal-300)}.dark\:\[--callout-text\:var\(--color-violet-300\)\]:where(.dark,.dark *){--callout-text:var(--color-violet-300)}.dark\:\[--callout-text\:var\(--color-yellow-300\)\]:where(.dark,.dark *){--callout-text:var(--color-yellow-300)}.dark\:\[--callout-text\:var\(--color-zinc-300\)\]:where(.dark,.dark *){--callout-text:var(--color-zinc-300)}.dark\:\[--color-accent-content\:var\(--color-amber-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-amber-400)}.dark\:\[--color-accent-content\:var\(--color-blue-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-blue-400)}.dark\:\[--color-accent-content\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-cyan-400)}.dark\:\[--color-accent-content\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-emerald-400)}.dark\:\[--color-accent-content\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-fuchsia-400)}.dark\:\[--color-accent-content\:var\(--color-green-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-green-400)}.dark\:\[--color-accent-content\:var\(--color-indigo-300\)\]:where(.dark,.dark *){--color-accent-content:var(--color-indigo-300)}.dark\:\[--color-accent-content\:var\(--color-lime-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-lime-400)}.dark\:\[--color-accent-content\:var\(--color-orange-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-orange-400)}.dark\:\[--color-accent-content\:var\(--color-pink-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-pink-400)}.dark\:\[--color-accent-content\:var\(--color-purple-300\)\]:where(.dark,.dark *){--color-accent-content:var(--color-purple-300)}.dark\:\[--color-accent-content\:var\(--color-red-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-red-400)}.dark\:\[--color-accent-content\:var\(--color-rose-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-rose-400)}.dark\:\[--color-accent-content\:var\(--color-sky-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-sky-400)}.dark\:\[--color-accent-content\:var\(--color-teal-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-teal-400)}.dark\:\[--color-accent-content\:var\(--color-violet-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-violet-400)}.dark\:\[--color-accent-content\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent-content:var(--color-white)}.dark\:\[--color-accent-content\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--color-accent-content:var(--color-yellow-400)}.dark\:\[--color-accent-foreground\:var\(--color-amber-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-amber-950)}.dark\:\[--color-accent-foreground\:var\(--color-gray-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-gray-800)}.dark\:\[--color-accent-foreground\:var\(--color-lime-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-lime-950)}.dark\:\[--color-accent-foreground\:var\(--color-mauve-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-mauve-800)}.dark\:\[--color-accent-foreground\:var\(--color-mist-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-mist-800)}.dark\:\[--color-accent-foreground\:var\(--color-neutral-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-neutral-800)}.dark\:\[--color-accent-foreground\:var\(--color-olive-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-olive-800)}.dark\:\[--color-accent-foreground\:var\(--color-orange-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-orange-950)}.dark\:\[--color-accent-foreground\:var\(--color-slate-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-slate-800)}.dark\:\[--color-accent-foreground\:var\(--color-stone-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-stone-800)}.dark\:\[--color-accent-foreground\:var\(--color-taupe-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-taupe-800)}.dark\:\[--color-accent-foreground\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-white)}.dark\:\[--color-accent-foreground\:var\(--color-yellow-950\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-yellow-950)}.dark\:\[--color-accent-foreground\:var\(--color-zinc-800\)\]:where(.dark,.dark *){--color-accent-foreground:var(--color-zinc-800)}.dark\:\[--color-accent\:var\(--color-amber-400\)\]:where(.dark,.dark *){--color-accent:var(--color-amber-400)}.dark\:\[--color-accent\:var\(--color-blue-500\)\]:where(.dark,.dark *){--color-accent:var(--color-blue-500)}.dark\:\[--color-accent\:var\(--color-cyan-600\)\]:where(.dark,.dark *){--color-accent:var(--color-cyan-600)}.dark\:\[--color-accent\:var\(--color-emerald-600\)\]:where(.dark,.dark *){--color-accent:var(--color-emerald-600)}.dark\:\[--color-accent\:var\(--color-fuchsia-600\)\]:where(.dark,.dark *){--color-accent:var(--color-fuchsia-600)}.dark\:\[--color-accent\:var\(--color-green-600\)\]:where(.dark,.dark *){--color-accent:var(--color-green-600)}.dark\:\[--color-accent\:var\(--color-indigo-500\)\]:where(.dark,.dark *){--color-accent:var(--color-indigo-500)}.dark\:\[--color-accent\:var\(--color-lime-400\)\]:where(.dark,.dark *){--color-accent:var(--color-lime-400)}.dark\:\[--color-accent\:var\(--color-orange-400\)\]:where(.dark,.dark *){--color-accent:var(--color-orange-400)}.dark\:\[--color-accent\:var\(--color-pink-600\)\]:where(.dark,.dark *){--color-accent:var(--color-pink-600)}.dark\:\[--color-accent\:var\(--color-purple-500\)\]:where(.dark,.dark *){--color-accent:var(--color-purple-500)}.dark\:\[--color-accent\:var\(--color-red-500\)\]:where(.dark,.dark *){--color-accent:var(--color-red-500)}.dark\:\[--color-accent\:var\(--color-rose-500\)\]:where(.dark,.dark *){--color-accent:var(--color-rose-500)}.dark\:\[--color-accent\:var\(--color-sky-600\)\]:where(.dark,.dark *){--color-accent:var(--color-sky-600)}.dark\:\[--color-accent\:var\(--color-teal-600\)\]:where(.dark,.dark *){--color-accent:var(--color-teal-600)}.dark\:\[--color-accent\:var\(--color-violet-500\)\]:where(.dark,.dark *){--color-accent:var(--color-violet-500)}.dark\:\[--color-accent\:var\(--color-white\)\]:where(.dark,.dark *){--color-accent:var(--color-white)}.dark\:\[--color-accent\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--color-accent:var(--color-yellow-400)}.dark\:\[--flux-progress-color\:var\(--color-amber-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-amber-400)}.dark\:\[--flux-progress-color\:var\(--color-blue-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-blue-400)}.dark\:\[--flux-progress-color\:var\(--color-cyan-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-cyan-400)}.dark\:\[--flux-progress-color\:var\(--color-emerald-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-emerald-400)}.dark\:\[--flux-progress-color\:var\(--color-fuchsia-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-fuchsia-400)}.dark\:\[--flux-progress-color\:var\(--color-green-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-green-400)}.dark\:\[--flux-progress-color\:var\(--color-indigo-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-indigo-400)}.dark\:\[--flux-progress-color\:var\(--color-lime-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-lime-400)}.dark\:\[--flux-progress-color\:var\(--color-orange-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-orange-400)}.dark\:\[--flux-progress-color\:var\(--color-pink-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-pink-400)}.dark\:\[--flux-progress-color\:var\(--color-purple-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-purple-400)}.dark\:\[--flux-progress-color\:var\(--color-red-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-red-400)}.dark\:\[--flux-progress-color\:var\(--color-rose-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-rose-400)}.dark\:\[--flux-progress-color\:var\(--color-sky-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-sky-400)}.dark\:\[--flux-progress-color\:var\(--color-teal-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-teal-400)}.dark\:\[--flux-progress-color\:var\(--color-violet-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-violet-400)}.dark\:\[--flux-progress-color\:var\(--color-yellow-400\)\]:where(.dark,.dark *){--flux-progress-color:var(--color-yellow-400)}.dark\:\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]:where(.dark,.dark *){--haze:#1a25401a}@supports (color:color-mix(in lab,red,red)){.dark\:\[--haze\:color-mix\(in_oklab\,_var\(--color-accent-content\)\,_transparent_90\%\)\]:where(.dark,.dark *){--haze:color-mix(in oklab, var(--color-accent-content), transparent 90%)}}:is(.dark\:\*\:bg-zinc-700:where(.dark,.dark *)>*){background-color:var(--color-zinc-700)}:is(.\*\*\:dark\:ring-zinc-900 *):where(.dark,.dark *){--tw-ring-color:var(--color-zinc-900)}@media(hover:hover){.dark\:group-hover\:bg-white\/50:where(.dark,.dark *):is(:where(.group):hover *){background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.dark\:group-hover\:bg-white\/50:where(.dark,.dark *):is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.dark\:group-hover\:text-white:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-white)}.dark\:group-hover\:text-zinc-400:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-zinc-400)}.dark\:group-hover\/accordion-heading\:text-white:where(.dark,.dark *):is(:where(.group\/accordion-heading):hover *),.dark\:group-hover\/sortable\:text-white:where(.dark,.dark *):is(:where(.group\/sortable):hover *){color:var(--color-white)}}.dark\:group-data-active\/item\:text-white:where(.dark,.dark *):is(:where(.group\/item)[data-active] *){color:var(--color-white)}.dark\:group-data-checked\:translate-x-\[0\.9375rem\]:where(.dark,.dark *):is(:where(.group)[data-checked] *){--tw-translate-x:.9375rem;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:group-data-invert\/toast\:border-zinc-200:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-color:var(--color-zinc-200)}.dark\:group-data-invert\/toast\:border-b-zinc-300\/80:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-bottom-color:#cfc8b5cc}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:border-b-zinc-300\/80:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){border-bottom-color:color-mix(in oklab,var(--color-zinc-300) 80%,transparent)}}.dark\:group-data-invert\/toast\:bg-white:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:var(--color-white)}.dark\:group-data-invert\/toast\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.dark\:group-data-invert\/toast\:text-zinc-800:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){color:var(--color-zinc-800)}.dark\:group-data-invert\/toast\:decoration-zinc-800\/20:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){text-decoration-color:#24315233}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:decoration-zinc-800\/20:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *){-webkit-text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent);text-decoration-color:color-mix(in oklab,var(--color-zinc-800) 20%,transparent)}}.dark\:group-data-selected\:bg-white:where(.dark,.dark *):is(:where(.group)[data-selected] *){background-color:var(--color-white)}.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{content:var(--tw-content);--tw-gradient-via:var(--flux-shimmer-color)}@supports (color:color-mix(in lab,red,red)){.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{--tw-gradient-via:color-mix(in oklab, var(--flux-shimmer-color) 50%, transparent)}}.dark\:before\:via-\[var\(--flux-shimmer-color\)\]\/50:where(.dark,.dark *):before{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:after\:hidden:where(.dark,.dark *):after{content:var(--tw-content);display:none}.dark\:after\:bg-zinc-900:where(.dark,.dark *):after{content:var(--tw-content);background-color:var(--color-zinc-900)}.dark\:after\:inset-ring-white\/10:where(.dark,.dark *):after{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:after\:inset-ring-white\/10:where(.dark,.dark *):after{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}@media(hover:hover){.dark\:hover\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_32\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-color:#30383e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_32\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-color:color-mix(in oklab,var(--color-accent-content) 32%,var(--color-zinc-600))}}.dark\:hover\:border-white\/10:where(.dark,.dark *):hover{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-white\/10:where(.dark,.dark *):hover{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:hover\:border-zinc-500:where(.dark,.dark *):hover{border-color:var(--color-zinc-500)}.dark\:hover\:border-zinc-600:where(.dark,.dark *):hover{border-color:var(--color-zinc-600)}.dark\:hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_40\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-bottom-color:#2d363e}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:border-b-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_40\%\,_var\(--color-zinc-600\)\)\]:where(.dark,.dark *):hover{border-bottom-color:color-mix(in oklab,var(--color-accent-content) 40%,var(--color-zinc-600))}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_10\%\,_var\(--color-zinc-700\)\)\]:where(.dark,.dark *):hover{background-color:#1a2020}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent-content\)_10\%\,_var\(--color-zinc-700\)\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-accent-content) 10%,var(--color-zinc-700))}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-deep\)\,_transparent_28\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-deep)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-deep\)\,_transparent_28\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-deep),transparent 28%)}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 50%)}}.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *):hover{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_60\%\)\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-button-soft),transparent 60%)}}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:where(.dark,.dark *):hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:where(.dark,.dark *):hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:where(.dark,.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-900:where(.dark,.dark *):hover{background-color:var(--color-gray-900)}.dark\:hover\:bg-red-400\/20:where(.dark,.dark *):hover{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-400\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.dark\:hover\:bg-red-500:where(.dark,.dark *):hover{background-color:var(--color-red-500)}.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:hover\:bg-white\/15:where(.dark,.dark *):hover{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/15:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:hover\:bg-white\/\[7\%\]:where(.dark,.dark *):hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:bg-zinc-600:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)}.dark\:hover\:bg-zinc-600\/75:where(.dark,.dark *):hover{background-color:#3a413dbf}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-zinc-600\/75:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-zinc-600) 75%,transparent)}}.dark\:hover\:bg-zinc-700:where(.dark,.dark *):hover{background-color:var(--color-zinc-700)}.dark\:hover\:bg-\[url\(\'data\:image\/svg\+xml\,\%3Csvg\%20xmlns\=\%22http\:\/\/www\.w3\.org\/2000\/svg\%22\%20viewBox\=\%220\%200\%2016\%2016\%22\%20fill\=\%22\%23ffffff\%22\%20class\=\%22size-4\%22\%3E\%3Cpath\%20fill-rule\=\%22evenodd\%22\%20d\=\%22M4\.22\%206\.22a\.75\.75\%200\%200\%201\%201\.06\%200L8\%208\.94l2\.72-2\.72a\.75\.75\%200\%201\%201\%201\.06\%201\.06l-3\.25\%203\.25a\.75\.75\%200\%200\%201-1\.06\%200L4\.22\%207\.28a\.75\.75\%200\%200\%201\%200-1\.06Z\%22\%20clip-rule\=\%22evenodd\%22\/\%3E\%3C\/svg\%3E\'\)\]:where(.dark,.dark *):hover{background-image:url(data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%2016%2016%22%20fill=%22%23ffffff%22%20class=%22size-4%22%3E%3Cpath%20fill-rule=%22evenodd%22%20d=%22M4.22%206.22a.75.75%200%200%201%201.06%200L8%208.94l2.72-2.72a.75.75%200%201%201%201.06%201.06l-3.25%203.25a.75.75%200%200%201-1.06%200L4.22%207.28a.75.75%200%200%201%200-1.06Z%22%20clip-rule=%22evenodd%22/%3E%3C/svg%3E)}.dark\:hover\:bg-\[length\:16px_16px\]:where(.dark,.dark *):hover{background-size:16px 16px}.dark\:hover\:text-\(--color-button-muted\):where(.dark,.dark *):hover{color:var(--color-button-muted)}.dark\:hover\:text-gray-200:where(.dark,.dark *):hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:where(.dark,.dark *):hover{color:var(--color-gray-300)}.dark\:hover\:text-red-400:where(.dark,.dark *):hover{color:var(--color-red-400)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}.dark\:hover\:text-white\!:where(.dark,.dark *):hover{color:var(--color-white)!important}.dark\:hover\:text-zinc-100:where(.dark,.dark *):hover{color:var(--color-zinc-100)}.dark\:hover\:text-zinc-200:where(.dark,.dark *):hover{color:var(--color-zinc-200)}.dark\:hover\:text-zinc-300:where(.dark,.dark *):hover{color:var(--color-zinc-300)}.dark\:hover\:ring-white\/20:where(.dark,.dark *):hover{--tw-ring-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:ring-white\/20:where(.dark,.dark *):hover{--tw-ring-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.dark\:hover\:ring-zinc-600:where(.dark,.dark *):hover{--tw-ring-color:var(--color-zinc-600)}.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:#2431520d}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/5:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/10:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:#2431521a}@supports (color:color-mix(in lab,red,red)){.dark\:group-data-invert\/toast\:hover\:bg-zinc-800\/10:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{background-color:color-mix(in oklab,var(--color-zinc-800) 10%,transparent)}}.dark\:group-data-invert\/toast\:hover\:text-zinc-800:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):hover{color:var(--color-zinc-800)}.dark\:hover\:after\:bg-white\/\[4\%\]:where(.dark,.dark *):hover:after{content:var(--tw-content);background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:after\:bg-white\/\[4\%\]:where(.dark,.dark *):hover:after{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}}.dark\:focus\:border-blue-700:where(.dark,.dark *):focus{border-color:var(--color-blue-700)}.dark\:focus\:border-blue-800:where(.dark,.dark *):focus{border-color:var(--color-blue-800)}.dark\:focus\:border-zinc-600:where(.dark,.dark *):focus{border-color:var(--color-zinc-600)}.dark\:focus\:text-white:where(.dark,.dark *):focus{color:var(--color-white)}.dark\:active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):active{background-color:var(--color-button-soft)}@supports (color:color-mix(in lab,red,red)){.dark\:active\:bg-\[color-mix\(in_oklab\,_var\(--color-button-soft\)\,_transparent_50\%\)\]:where(.dark,.dark *):active{background-color:color-mix(in oklab,var(--color-button-soft),transparent 50%)}}.dark\:active\:bg-gray-700:where(.dark,.dark *):active{background-color:var(--color-gray-700)}.dark\:active\:text-gray-300:where(.dark,.dark *):active{color:var(--color-gray-300)}.dark\:disabled\:border-white\/5:where(.dark,.dark *):disabled{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:border-white\/5:where(.dark,.dark *):disabled{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.dark\:disabled\:border-zinc-600:where(.dark,.dark *):disabled{border-color:var(--color-zinc-600)}.dark\:disabled\:bg-white\/\[7\%\]:where(.dark,.dark *):disabled{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[7\%\]:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:disabled\:bg-white\/\[7\%\]\!:where(.dark,.dark *):disabled{background-color:#ffffff12!important}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[7\%\]\!:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)!important}}.dark\:disabled\:bg-white\/\[9\%\]:where(.dark,.dark *):disabled{background-color:#ffffff17}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-white\/\[9\%\]:where(.dark,.dark *):disabled{background-color:color-mix(in oklab,var(--color-white) 9%,transparent)}}.dark\:disabled\:text-zinc-400:where(.dark,.dark *):disabled{color:var(--color-zinc-400)}.dark\:disabled\:placeholder-white\/40:where(.dark,.dark *):disabled::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:placeholder-white\/40:where(.dark,.dark *):disabled::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.dark\:disabled\:placeholder-zinc-500:where(.dark,.dark *):disabled::placeholder{color:var(--color-zinc-500)}.dark\:disabled\:opacity-50:where(.dark,.dark *):disabled{opacity:.5}.dark\:disabled\:opacity-75:where(.dark,.dark *):disabled{opacity:.75}.dark\:disabled\:shadow-none\!:where(.dark,.dark *):disabled{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}:where([data-checked]) .dark\:in-data-checked\:text-\(--color-accent-content\):where(.dark,.dark *){color:var(--color-accent-content)}:where([data-checked]) .dark\:in-data-checked\:text-white:where(.dark,.dark *){color:var(--color-white)}:where([data-checked]) .dark\:in-data-checked\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}@media(hover:hover){:where([data-checked]) .dark\:in-data-checked\:group-hover\:text-white:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-white)}}:where([data-dragging]) .dark\:in-data-dragging\:border-white\/20:where(.dark,.dark *){border-color:#fff3}@supports (color:color-mix(in lab,red,red)){:where([data-dragging]) .dark\:in-data-dragging\:border-white\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}:where([data-dragging]) .dark\:in-data-dragging\:bg-white\/15:where(.dark,.dark *){background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where([data-dragging]) .dark\:in-data-dragging\:bg-white\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where([data-dragging]) .dark\:in-data-dragging\:text-white:where(.dark,.dark *),:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white:where(.dark,.dark *){color:var(--color-white)}:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white\/80:where(.dark,.dark *){color:#fffc}@supports (color:color-mix(in lab,red,red)){:where([data-flux-menu]) .in-data-flux-menu\:dark\:text-white\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)}}@media(hover:hover){:where([data-flux-menu]) .dark\:in-data-flux-menu\:hover\:bg-zinc-600:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)}}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:bg-transparent\!:where(.dark,.dark *){background-color:#0000!important}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\!:where(.dark,.dark *){color:var(--color-white)!important}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\/80\!:where(.dark,.dark *){color:#fffc!important}@supports (color:color-mix(in lab,red,red)){:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:text-white\/80\!:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 80%,transparent)!important}}@media(hover:hover){:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:hover\:bg-zinc-600\!:where(.dark,.dark *):hover{background-color:var(--color-zinc-600)!important}}:where([data-open]) .dark\:in-data-open\:bg-white\/15:where(.dark,.dark *){background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where([data-open]) .dark\:in-data-open\:bg-white\/15:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where([data-open]) .dark\:in-data-open\:text-white:where(.dark,.dark *),:where([data-flux-timeline-size=lg]) .dark\:in-data-\[flux-timeline-size\=lg\]\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:has-\[option\.placeholder\:checked\]\:text-zinc-400:where(.dark,.dark *):has(:is(option.placeholder:checked)){color:var(--color-zinc-400)}.dark\:data-active\:bg-red-400\/20:where(.dark,.dark *)[data-active]{background-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.dark\:data-active\:bg-red-400\/20:where(.dark,.dark *)[data-active]{background-color:color-mix(in oklab,var(--color-red-400) 20%,transparent)}}.dark\:data-active\:bg-zinc-600:where(.dark,.dark *)[data-active]{background-color:var(--color-zinc-600)}.dark\:data-active\:text-red-400:where(.dark,.dark *)[data-active]{color:var(--color-red-400)}.dark\:data-active\:text-white:where(.dark,.dark *)[data-active]{color:var(--color-white)}:where([data-flux-sidebar-group-dropdown]) .dark\:in-data-flux-sidebar-group-dropdown\:data-active\:bg-zinc-600\!:where(.dark,.dark *)[data-active]{background-color:var(--color-zinc-600)!important}.dark\:data-checked\:border-white:where(.dark,.dark *)[data-checked]{border-color:var(--color-white)}.dark\:data-checked\:bg-white:where(.dark,.dark *)[data-checked]{background-color:var(--color-white)}.dark\:data-checked\:bg-white\/15:where(.dark,.dark *)[data-checked]{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:data-checked\:bg-white\/15:where(.dark,.dark *)[data-checked]{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:data-checked\:bg-white\/20:where(.dark,.dark *)[data-checked]{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:data-checked\:bg-white\/20:where(.dark,.dark *)[data-checked]{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:data-checked\:text-white:where(.dark,.dark *)[data-checked]{color:var(--color-white)}.dark\:data-checked\:text-zinc-400:where(.dark,.dark *)[data-checked]{color:var(--color-zinc-400)}.dark\:data-checked\:text-zinc-800:where(.dark,.dark *)[data-checked]{color:var(--color-zinc-800)}@media(hover:hover){.dark\:data-checked\:hover\:text-white:where(.dark,.dark *)[data-checked]:hover{color:var(--color-white)}}.dark\:data-current\:border-transparent:where(.dark,.dark *)[data-current]{border-color:#0000}.dark\:data-current\:border-white\/10:where(.dark,.dark *)[data-current]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:border-white\/10:where(.dark,.dark *)[data-current]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-current\:bg-white\/10:where(.dark,.dark *)[data-current]{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:bg-white\/10:where(.dark,.dark *)[data-current]{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-current\:bg-white\/\[7\%\]:where(.dark,.dark *)[data-current]{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:data-current\:bg-white\/\[7\%\]:where(.dark,.dark *)[data-current]{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:data-current\:text-zinc-100:where(.dark,.dark *)[data-current]{color:var(--color-zinc-100)}.dark\:data-current\:after\:bg-white:where(.dark,.dark *)[data-current]:after{content:var(--tw-content);background-color:var(--color-white)}:is(.dark\:\*\*\:data-flux-menu-item-icon\:text-white\/60:where(.dark,.dark *) *)[data-flux-menu-item-icon]{color:#fff9}@supports (color:color-mix(in lab,red,red)){:is(.dark\:\*\*\:data-flux-menu-item-icon\:text-white\/60:where(.dark,.dark *) *)[data-flux-menu-item-icon]{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:data-in-range\:bg-white\/10:where(.dark,.dark *)[data-in-range]{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-in-range\:bg-white\/10:where(.dark,.dark *)[data-in-range]{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-invalid\:border-red-500:where(.dark,.dark *)[data-invalid]{border-color:var(--color-red-500)}.dark\:data-invalid\:text-red-400:where(.dark,.dark *)[data-invalid]{color:var(--color-red-400)}.dark\:disabled\:data-invalid\:border-red-500:where(.dark,.dark *):disabled[data-invalid]{border-color:var(--color-red-500)}.dark\:data-loading\:border-white\/10:where(.dark,.dark *)[data-loading]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:data-loading\:border-white\/10:where(.dark,.dark *)[data-loading]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:data-match\:text-white:where(.dark,.dark *)[data-match]{color:var(--color-white)}:is(.dark\:\*\*\:data-navmenu-icon\:text-white\/60:where(.dark,.dark *) *)[data-navmenu-icon]{color:#fff9}@supports (color:color-mix(in lab,red,red)){:is(.dark\:\*\*\:data-navmenu-icon\:text-white\/60:where(.dark,.dark *) *)[data-navmenu-icon]{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.dark\:data-open\:text-white:where(.dark,.dark *)[data-open]{color:var(--color-white)}.dark\:data-selected\:border-white:where(.dark,.dark *)[data-selected]{border-color:var(--color-white)}.dark\:data-selected\:bg-white:where(.dark,.dark *)[data-selected]{background-color:var(--color-white)}.dark\:data-selected\:bg-white\/20:where(.dark,.dark *)[data-selected]{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.dark\:data-selected\:bg-white\/20:where(.dark,.dark *)[data-selected]{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.dark\:data-selected\:text-white:where(.dark,.dark *)[data-selected]{color:var(--color-white)}.dark\:data-selected\:text-zinc-800:where(.dark,.dark *)[data-selected]{color:var(--color-zinc-800)}:is(.dark\:\*\*\:data-\[slot\=content\]\:text-zinc-300:where(.dark,.dark *) *)[data-slot=content]{color:var(--color-zinc-300)}.dark\:rtl\:-translate-x-\[0\.125rem\]:where(.dark,.dark *):where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-translate-x: -.125rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}.dark\:rtl\:group-data-checked\:-translate-x-\[0\.9375rem\]:where(.dark,.dark *):where(:dir(rtl),[dir=rtl],[dir=rtl] *):is(:where(.group)[data-checked] *){--tw-translate-x: -.9375rem ;translate:var(--tw-translate-x) var(--tw-translate-y)}@media print{.print\:hidden{display:none}}.flux-card-panel\:border:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:border,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:border){border-style:var(--tw-border-style);border-width:1px}.flux-card-panel\:before\:inset-ring:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:before\:inset-ring,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:before\:inset-ring):before{content:var(--tw-content);--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-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)}.flux-card-divided\:not-last\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:border-b):not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:relative)):not(:last-child){position:relative}.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:border-transparent)):not(:last-child){border-color:#0000}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:absolute)):not(:last-child):after{content:var(--tw-content);position:absolute}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:inset-x-\[var\(--flux-card-part-px\)\])):not(:last-child):after{content:var(--tw-content);inset-inline:var(--flux-card-part-px)}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:-bottom-px)):not(:last-child):after{content:var(--tw-content);bottom:-1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:after\:border-b)):not(:last-child):after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:border-transparent)):not(:last-child):where(.dark,.dark *){border-color:#0000}.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:ring,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:ring)){--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)}.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(-1px_-1px_0_-1px\)\])){clip-path:inset(-1px -1px 0)}.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\]:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\],[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[clip-path\:inset\(0_-1px_-1px_-1px\)\])){clip-path:inset(0 -1px -1px)}.flux-card-divided\:flux-after-content\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:border-t):not(:first-child,[data-flux-card-header]+*){border-top-style:var(--tw-border-style);border-top-width:1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:relative)):not(:first-child,[data-flux-card-header]+*){position:relative}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:border-transparent)):not(:first-child,[data-flux-card-header]+*){border-color:#0000}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:absolute)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);position:absolute}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\]:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\],[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:inset-x-\[var\(--flux-card-part-px\)\])):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);inset-inline:var(--flux-card-part-px)}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:-top-px)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);top:-1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:after\:border-t)):not(:first-child,[data-flux-card-header]+*):after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:1px}.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:border-transparent)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *){border-color:#0000}.\[\&_\.gap-2\]\:gap-1\.5 .gap-2{gap:calc(var(--spacing) * 1.5)}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_\[data-flux-button\]\]\:rounded-lg [data-flux-button]{border-radius:var(--radius-lg)}.\[\&_\[data-flux-cell\]\:first-child\]\:ps-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-cell]:first-child{padding-inline-start:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-cell\]\:last-child\]\:pe-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-cell]:last-child{padding-inline-end:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-column\]\:first-child\]\:ps-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-column]:first-child{padding-inline-start:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-column\]\:last-child\]\:pe-\[var\(--flux-bleed\,1\.5rem\)\] [data-flux-column]:last-child{padding-inline-end:var(--flux-bleed,1.5rem)}.\[\&_\[data-flux-flag\]\]\:w-4 [data-flux-flag]{width:calc(var(--spacing) * 4)}.\[\&_\[data-flux-input-group\]\]\:w-auto [data-flux-input-group]{width:auto}.\[\&_\[data-slot\=heading\]\]\:text-\(--callout-heading\) [data-slot=heading]{color:var(--callout-heading)}.\[\&_\[data-slot\=text\]\]\:text-\(--callout-text\) [data-slot=text]{color:var(--callout-text)}.\[\&_\[popover\]\]\:whitespace-normal [popover]{white-space:normal}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_button\]\:text-amber-700\! button{color:var(--color-amber-700)!important}.\[\&_button\]\:text-blue-800\! button{color:var(--color-blue-800)!important}.\[\&_button\]\:text-cyan-800\! button{color:var(--color-cyan-800)!important}.\[\&_button\]\:text-emerald-800\! button{color:var(--color-emerald-800)!important}.\[\&_button\]\:text-fuchsia-700\! button{color:var(--color-fuchsia-700)!important}.\[\&_button\]\:text-green-800\! button{color:var(--color-green-800)!important}.\[\&_button\]\:text-indigo-700\! button{color:var(--color-indigo-700)!important}.\[\&_button\]\:text-lime-800\! button{color:var(--color-lime-800)!important}.\[\&_button\]\:text-orange-700\! button{color:var(--color-orange-700)!important}.\[\&_button\]\:text-pink-700\! button{color:var(--color-pink-700)!important}.\[\&_button\]\:text-purple-700\! button{color:var(--color-purple-700)!important}.\[\&_button\]\:text-red-700\! button{color:var(--color-red-700)!important}.\[\&_button\]\:text-rose-700\! button{color:var(--color-rose-700)!important}.\[\&_button\]\:text-sky-800\! button{color:var(--color-sky-800)!important}.\[\&_button\]\:text-teal-800\! button{color:var(--color-teal-800)!important}.\[\&_button\]\:text-violet-700\! button{color:var(--color-violet-700)!important}.\[\&_button\]\:text-yellow-800\! button{color:var(--color-yellow-800)!important}.\[\&_button\]\:text-zinc-700\! button{color:var(--color-zinc-700)!important}.dark\:\[\&_button\]\:text-amber-200\!:where(.dark,.dark *) button{color:var(--color-amber-200)!important}.dark\:\[\&_button\]\:text-blue-200\!:where(.dark,.dark *) button{color:var(--color-blue-200)!important}.dark\:\[\&_button\]\:text-cyan-200\!:where(.dark,.dark *) button{color:var(--color-cyan-200)!important}.dark\:\[\&_button\]\:text-emerald-200\!:where(.dark,.dark *) button{color:var(--color-emerald-200)!important}.dark\:\[\&_button\]\:text-fuchsia-200\!:where(.dark,.dark *) button{color:var(--color-fuchsia-200)!important}.dark\:\[\&_button\]\:text-green-200\!:where(.dark,.dark *) button{color:var(--color-green-200)!important}.dark\:\[\&_button\]\:text-indigo-200\!:where(.dark,.dark *) button{color:var(--color-indigo-200)!important}.dark\:\[\&_button\]\:text-lime-200\!:where(.dark,.dark *) button{color:var(--color-lime-200)!important}.dark\:\[\&_button\]\:text-orange-200\!:where(.dark,.dark *) button{color:var(--color-orange-200)!important}.dark\:\[\&_button\]\:text-pink-200\!:where(.dark,.dark *) button{color:var(--color-pink-200)!important}.dark\:\[\&_button\]\:text-purple-200\!:where(.dark,.dark *) button{color:var(--color-purple-200)!important}.dark\:\[\&_button\]\:text-red-200\!:where(.dark,.dark *) button{color:var(--color-red-200)!important}.dark\:\[\&_button\]\:text-rose-200\!:where(.dark,.dark *) button{color:var(--color-rose-200)!important}.dark\:\[\&_button\]\:text-sky-200\!:where(.dark,.dark *) button{color:var(--color-sky-200)!important}.dark\:\[\&_button\]\:text-teal-200\!:where(.dark,.dark *) button{color:var(--color-teal-200)!important}.dark\:\[\&_button\]\:text-violet-200\!:where(.dark,.dark *) button{color:var(--color-violet-200)!important}.dark\:\[\&_button\]\:text-yellow-200\!:where(.dark,.dark *) button{color:var(--color-yellow-200)!important}.dark\:\[\&_button\]\:text-zinc-200\!:where(.dark,.dark *) button{color:var(--color-zinc-200)!important}.\[\&_dialog\]\:whitespace-normal dialog{white-space:normal}.dark\:\[\&_option\]\:bg-zinc-700:where(.dark,.dark *) option{background-color:var(--color-zinc-700)}.dark\:\[\&_option\]\:text-white:where(.dark,.dark *) option{color:var(--color-white)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\+\&\>\[data-flux-menu-separator-top\]\]\:hidden+.\[\&\+\&\>\[data-flux-menu-separator-top\]\]\:hidden>[data-flux-menu-separator-top],.\[\&\+\&\>\[data-flux-option-group-separator-top\]\]\:hidden+.\[\&\+\&\>\[data-flux-option-group-separator-top\]\]\:hidden>[data-flux-option-group-separator-top]{display:none}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none}.\[\&\:first-child\>\[data-flux-menu-separator-top\]\]\:hidden:first-child>[data-flux-menu-separator-top]{display:none}.\[\&\:first-of-type_td\[data-in-range\]\:not\(\[data-selected\]\)\:first-child\]\:rounded-s-none:first-of-type td[data-in-range]:not([data-selected]):first-child{border-start-start-radius:0;border-end-start-radius:0}.\[\&\:first-of-type\>\[data-flux-option-group-separator-top\]\]\:hidden:first-of-type>[data-flux-option-group-separator-top]{display:none}.\[\&\:has\(\+\[data-flux-subheading\]\)\]\:mb-2:has(+[data-flux-subheading]){margin-bottom:calc(var(--spacing) * 2)}.\[\&\:has\(\+\[data-slot\=image\]\)\]\:hidden:has(+[data-slot=image]){display:none}.\[\&\:has\(\+input\:focus\)\]\:text-zinc-800:has(+input:focus){color:var(--color-zinc-800)}.dark\:\[\&\:has\(\+input\:focus\)\]\:text-zinc-400:where(.dark,.dark *):has(+input:focus){color:var(--color-zinc-400)}.\[\&\:has\(\>\:not\(span\)\:first-child\)\]\:ps-3:has(>:not(span):first-child){padding-inline-start:calc(var(--spacing) * 3)}.\[\&\:has\(\>\:not\(span\)\:last-child\)\]\:pe-3:has(>:not(span):last-child){padding-inline-end:calc(var(--spacing) * 3)}.\[\&\:has\(\>\[data-flux-checkbox-group\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:has(>[data-flux-checkbox-group][disabled])>[data-flux-label],.\[\&\:has\(\>\[data-flux-radio-group\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:has(>[data-flux-radio-group][disabled])>[data-flux-label]{opacity:.5}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[data-flux-label-trailing\]\)\]\:flex:has([data-flux-label-trailing]){display:flex}.\[\&\:has\(\[data-slot\=image\]\)\]\:p-\[calc\(0\.5rem-1px\)\]:has([data-slot=image]){padding:calc(.5rem - 1px)}.\[\&\:has\(\[disabled\]\)\]\:shadow-none:has([disabled]){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:\[\&\:has\(\[disabled\]\)\]\:bg-white\/\[7\%\]:where(.dark,.dark *):has([disabled]){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:has\(\[disabled\]\)\]\:bg-white\/\[7\%\]:where(.dark,.dark *):has([disabled]){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-\[var\(--haze-border\)\]:hover [data-flux-checkbox-indicator]{border-color:var(--haze-border)}.dark\:\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-checkbox-indicator]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:hover_\[data-flux-checkbox-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-checkbox-indicator]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-\[var\(--haze-border\)\]:hover [data-flux-radio-indicator]{border-color:var(--haze-border)}.dark\:\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-radio-indicator]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\:hover_\[data-flux-radio-indicator\]\]\:border-white\/10:where(.dark,.dark *):hover [data-flux-radio-indicator]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.\[\&\:hover_\[data-navmenu-icon\]\]\:text-current:hover [data-navmenu-icon]{color:currentColor}.\[\&\:hover\>\*\]\:text-zinc-800:hover>*{color:var(--color-zinc-800)}.dark\:\[\&\:hover\>\*\]\:text-white:where(.dark,.dark *):hover>*{color:var(--color-white)}.\[\:has\(\>_\:not\(template\)\)\]\:mb-2:has(>:not(template)){margin-bottom:calc(var(--spacing) * 2)}@media(hover:hover){.\[\&\:is\(button\)\]\:hover\:bg-amber-400\/40:is(button):hover{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-amber-400\/40:is(button):hover{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-amber-600:is(button):hover{background-color:var(--color-amber-600)}.\[\&\:is\(button\)\]\:hover\:bg-blue-400\/30:is(button):hover{background-color:#54a2ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-blue-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-blue-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-blue-600:is(button):hover{background-color:var(--color-blue-600)}.\[\&\:is\(button\)\]\:hover\:bg-cyan-400\/30:is(button):hover{background-color:#00d2ef4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-cyan-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-cyan-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-cyan-600:is(button):hover{background-color:var(--color-cyan-600)}.\[\&\:is\(button\)\]\:hover\:bg-emerald-400\/30:is(button):hover{background-color:#00d2944d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-emerald-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-emerald-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-emerald-600:is(button):hover{background-color:var(--color-emerald-600)}.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-400\/30:is(button):hover{background-color:#ec6cff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-fuchsia-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-fuchsia-600:is(button):hover{background-color:var(--color-fuchsia-600)}.\[\&\:is\(button\)\]\:hover\:bg-green-400\/30:is(button):hover{background-color:#05df724d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-green-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-green-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-green-600:is(button):hover{background-color:var(--color-green-600)}.\[\&\:is\(button\)\]\:hover\:bg-indigo-400\/30:is(button):hover{background-color:#7d87ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-indigo-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-indigo-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-indigo-600:is(button):hover{background-color:var(--color-indigo-600)}.\[\&\:is\(button\)\]\:hover\:bg-lime-400\/35:is(button):hover{background-color:#9de50059}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-lime-400\/35:is(button):hover{background-color:color-mix(in oklab,var(--color-lime-400) 35%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-lime-600:is(button):hover{background-color:var(--color-lime-600)}.\[\&\:is\(button\)\]\:hover\:bg-orange-400\/30:is(button):hover{background-color:#ff8b1a4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-orange-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-orange-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-orange-600:is(button):hover{background-color:var(--color-orange-600)}.\[\&\:is\(button\)\]\:hover\:bg-pink-400\/30:is(button):hover{background-color:#fb64b64d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-pink-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-pink-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-pink-600:is(button):hover{background-color:var(--color-pink-600)}.\[\&\:is\(button\)\]\:hover\:bg-purple-400\/30:is(button):hover{background-color:#c07eff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-purple-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-purple-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-purple-600:is(button):hover{background-color:var(--color-purple-600)}.\[\&\:is\(button\)\]\:hover\:bg-red-400\/30:is(button):hover{background-color:#ff65684d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-red-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-red-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-red-600:is(button):hover{background-color:var(--color-red-600)}.\[\&\:is\(button\)\]\:hover\:bg-rose-400\/30:is(button):hover{background-color:#ff667f4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-rose-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-rose-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-rose-600:is(button):hover{background-color:var(--color-rose-600)}.\[\&\:is\(button\)\]\:hover\:bg-sky-400\/30:is(button):hover{background-color:#00bcfe4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-sky-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-sky-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-sky-600:is(button):hover{background-color:var(--color-sky-600)}.\[\&\:is\(button\)\]\:hover\:bg-teal-400\/30:is(button):hover{background-color:#00d3bd4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-teal-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-teal-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-teal-600:is(button):hover{background-color:var(--color-teal-600)}.\[\&\:is\(button\)\]\:hover\:bg-violet-400\/30:is(button):hover{background-color:#a685ff4d}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-violet-400\/30:is(button):hover{background-color:color-mix(in oklab,var(--color-violet-400) 30%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-violet-600:is(button):hover{background-color:var(--color-violet-600)}.\[\&\:is\(button\)\]\:hover\:bg-yellow-400\/40:is(button):hover{background-color:#fac80066}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-yellow-400\/40:is(button):hover{background-color:color-mix(in oklab,var(--color-yellow-400) 40%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-yellow-600:is(button):hover{background-color:var(--color-yellow-600)}.\[\&\:is\(button\)\]\:hover\:bg-zinc-400\/25:is(button):hover{background-color:#8a918d40}@supports (color:color-mix(in lab,red,red)){.\[\&\:is\(button\)\]\:hover\:bg-zinc-400\/25:is(button):hover{background-color:color-mix(in oklab,var(--color-zinc-400) 25%,transparent)}}.\[\&\:is\(button\)\]\:hover\:bg-zinc-700:is(button):hover{background-color:var(--color-zinc-700)}.dark\:\[button\]\:hover\:bg-amber-400:where(.dark,.dark *):is(button):hover{background-color:var(--color-amber-400)}.dark\:\[button\]\:hover\:bg-amber-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fcbb0080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-amber-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-amber-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-blue-400\/50:where(.dark,.dark *):is(button):hover{background-color:#54a2ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-blue-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-blue-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-blue-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-blue-500)}.dark\:\[button\]\:hover\:bg-cyan-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d2ef80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-cyan-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-cyan-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-cyan-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-cyan-500)}.dark\:\[button\]\:hover\:bg-emerald-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d29480}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-emerald-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-emerald-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-emerald-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-emerald-500)}.dark\:\[button\]\:hover\:bg-fuchsia-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ec6cff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-fuchsia-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-fuchsia-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-fuchsia-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-fuchsia-500)}.dark\:\[button\]\:hover\:bg-green-400\/50:where(.dark,.dark *):is(button):hover{background-color:#05df7280}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-green-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-green-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-green-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-green-500)}.dark\:\[button\]\:hover\:bg-indigo-400\/50:where(.dark,.dark *):is(button):hover{background-color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-indigo-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-indigo-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-indigo-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-indigo-500)}.dark\:\[button\]\:hover\:bg-lime-400\/50:where(.dark,.dark *):is(button):hover{background-color:#9de50080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-lime-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-lime-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-lime-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-lime-500)}.dark\:\[button\]\:hover\:bg-orange-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-orange-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-orange-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-orange-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-orange-500)}.dark\:\[button\]\:hover\:bg-pink-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fb64b680}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-pink-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-pink-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-pink-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-pink-500)}.dark\:\[button\]\:hover\:bg-purple-400\/50:where(.dark,.dark *):is(button):hover{background-color:#c07eff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-purple-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-purple-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-purple-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-purple-500)}.dark\:\[button\]\:hover\:bg-red-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-red-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-red-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-red-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-red-500)}.dark\:\[button\]\:hover\:bg-rose-400\/50:where(.dark,.dark *):is(button):hover{background-color:#ff667f80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-rose-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-rose-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-rose-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-rose-500)}.dark\:\[button\]\:hover\:bg-sky-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-sky-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-sky-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-sky-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-sky-500)}.dark\:\[button\]\:hover\:bg-teal-400\/50:where(.dark,.dark *):is(button):hover{background-color:#00d3bd80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-teal-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-teal-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-teal-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-teal-500)}.dark\:\[button\]\:hover\:bg-violet-400\/50:where(.dark,.dark *):is(button):hover{background-color:#a685ff80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-violet-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-violet-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-violet-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-violet-500)}.dark\:\[button\]\:hover\:bg-yellow-300:where(.dark,.dark *):is(button):hover{background-color:var(--color-yellow-300)}.dark\:\[button\]\:hover\:bg-yellow-400\/50:where(.dark,.dark *):is(button):hover{background-color:#fac80080}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-yellow-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-yellow-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-zinc-400\/50:where(.dark,.dark *):is(button):hover{background-color:#8a918d80}@supports (color:color-mix(in lab,red,red)){.dark\:\[button\]\:hover\:bg-zinc-400\/50:where(.dark,.dark *):is(button):hover{background-color:color-mix(in oklab,var(--color-zinc-400) 50%,transparent)}}.dark\:\[button\]\:hover\:bg-zinc-500:where(.dark,.dark *):is(button):hover{background-color:var(--color-zinc-500)}}.\[\&\:last-child\>\[data-flux-menu-separator-bottom\]\]\:hidden:last-child>[data-flux-menu-separator-bottom],.\[\&\:last-child\>\[data-flux-option-group-separator-bottom\]\]\:hidden:last-child>[data-flux-option-group-separator-bottom]{display:none}.\[\&\:last-of-type_td\[data-in-range\]\:not\(\[data-selected\]\)\:last-child\]\:rounded-e-none:last-of-type td[data-in-range]:not([data-selected]):last-child{border-start-end-radius:0;border-end-end-radius:0}.\[\&\:not\(\:empty\)\]\:pb-2:not(:empty){padding-bottom:calc(var(--spacing) * 2)}.\[\&\:not\(\:empty\)\+div\]\:font-normal:not(:empty)+div{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.\[\&\:not\(\:empty\)\+div\]\:text-zinc-500:not(:empty)+div{color:var(--color-zinc-500)}.group-data-invert\/toast\:\[\&\:not\(\:empty\)\+div\]\:text-zinc-300:is(:where(.group\/toast)[data-invert] *):not(:empty)+div,.\[\&\:not\(\:empty\)\+div\]\:dark\:text-zinc-300:not(:empty)+div:where(.dark,.dark *){color:var(--color-zinc-300)}.dark\:group-data-invert\/toast\:\[\&\:not\(\:empty\)\+div\]\:text-zinc-500:where(.dark,.dark *):is(:where(.group\/toast)[data-invert] *):not(:empty)+div{color:var(--color-zinc-500)}.\[\&\:not\(\:has\(\>_\*\)\)\]\:hidden:not(:has(>*)){display:none}.\[\&\:not\(\:has\(\[data-flux-field\]\)\)\:has\(\[data-flux-control\]\[disabled\]\)\>\[data-flux-label\]\]\:opacity-50:not(:has([data-flux-field])):has([data-flux-control][disabled])>[data-flux-label]{opacity:.5}.\[\&\:not\(\:has\(ui-empty\[data-hidden\]\)\)\]\:hidden:not(:has(ui-empty[data-hidden])),.\[\&\:not\(\:has\(ui-option\:not\(\[data-hidden\]\)\)\)\]\:hidden:not(:has(ui-option:not([data-hidden]))){display:none}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\:popover-open\]\:flex:popover-open{display:flex}.\[\&\:popover-open\]\:flex-col:popover-open{flex-direction:column}.\[\&\>\*\]\:mx-auto>*{margin-inline:auto}.\[\&\>\*\]\:ms-auto>*{margin-inline-start:auto}.\[\&\>\*\:first-child\:not\(\:last-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target],.\[\&\>\*\:first-child\:not\(\:last-child\)\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>[data-flux-group-target],.\[\&\>\*\:first-child\:not\(\:last-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-e-none>:first-child:not(:last-child)>[data-flux-input]>[data-flux-group-target]{border-start-end-radius:0;border-end-end-radius:0}.\[\&\>\*\:has\(\+\[data-flux-input-group-suffix\]\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>:has(+[data-flux-input-group-suffix])>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\*\:has\(\+\[data-flux-input-group-suffix\]\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>:has(+[data-flux-input-group-suffix])>[data-flux-group-target]:not([data-invalid]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:last-child:not(:first-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:last-child:not(:first-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:last-child\:not\(\:first-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-s-none>:last-child:not(:first-child)>[data-flux-input]>[data-flux-group-target]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target],.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>[data-flux-group-target],.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\:not\(\:only-child\)\>\[data-flux-input\]\>\[data-flux-group-target\]\]\:rounded-none>:not(:first-child):not(:last-child):not(:only-child)>[data-flux-input]>[data-flux-group-target]{border-radius:0}.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\>\:is\(\[data-flux-tooltip\]\,ui-time-picker-trigger\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:not(:first-child):not(:last-child)>:is([data-flux-tooltip],ui-time-picker-trigger)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\*\:not\(\:first-child\)\:not\(\:last-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>:not(:first-child):not(:last-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\*\:not\(\[data-flux-label\]\)\+\[data-flux-description\]\]\:mt-3>:not([data-flux-label])+[data-flux-description]{margin-top:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-control\]\~\[data-flux-description\]\]\:col-start-2>[data-flux-control]~[data-flux-description]{grid-column-start:2}.\[\&\>\[data-flux-control\]\~\[data-flux-description\]\]\:row-start-2>[data-flux-control]~[data-flux-description]{grid-row-start:2}.\[\&\>\[data-flux-control\]\~\[data-flux-error\]\]\:col-span-2>[data-flux-control]~[data-flux-error]{grid-column:span 2/span 2}.\[\&\>\[data-flux-control\]\~\[data-flux-error\]\]\:mt-1>[data-flux-control]~[data-flux-error]{margin-top:var(--spacing)}.\[\&\>\[data-flux-description\]\:first-child\:has\(\+\*\)\]\:mb-3>[data-flux-description]:first-child:has(+*){margin-bottom:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-field\]\:has\(\>\[data-flux-description\]\)\]\:mb-4>[data-flux-field]:has(>[data-flux-description]){margin-bottom:calc(var(--spacing) * 4)}.\[\&\>\[data-flux-field\]\:last-child\]\:mb-0\!>[data-flux-field]:last-child{margin-bottom:0!important}.\[\&\>\[data-flux-group-target\]\:first-child\:not\(\:last-child\)\]\:rounded-e-none>[data-flux-group-target]:first-child:not(:last-child){border-start-end-radius:0;border-end-end-radius:0}.\[\&\>\[data-flux-group-target\]\:has\(\+\[data-flux-input-group-suffix\]\)\]\:border-e-0>[data-flux-group-target]:has(+[data-flux-input-group-suffix]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\[data-flux-group-target\]\:last-child\:not\(\:first-child\)\]\:rounded-s-none>[data-flux-group-target]:last-child:not(:first-child){border-start-start-radius:0;border-end-start-radius:0}.\[\&\>\[data-flux-group-target\]\:last-child\:not\(\:first-child\)\]\:border-s-0>[data-flux-group-target]:last-child:not(:first-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-group-target\]\:not\(\:first-child\)\:not\(\:last-child\)\]\:rounded-none>[data-flux-group-target]:not(:first-child):not(:last-child){border-radius:0}.\[\&\>\[data-flux-group-target\]\:not\(\:first-child\)\:not\(\:last-child\)\]\:border-s-0>[data-flux-group-target]:not(:first-child):not(:last-child){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-input\]\]\:min-w-0>[data-flux-input]{min-width:0}.\[\&\>\[data-flux-input\]\:has\(\+\[data-flux-input-group-suffix\]\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-e-0>[data-flux-input]:has(+[data-flux-input-group-suffix])>[data-flux-group-target]:not([data-invalid]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.\[\&\>\[data-flux-input\]\:last-child\:not\(\:first-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>[data-flux-input]:last-child:not(:first-child)>[data-flux-group-target]:not([data-invalid]),.\[\&\>\[data-flux-input\]\:not\(\:first-child\)\:not\(\:last-child\)\>\[data-flux-group-target\]\:not\(\[data-invalid\]\)\]\:border-s-0>[data-flux-input]:not(:first-child):not(:last-child)>[data-flux-group-target]:not([data-invalid]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.\[\&\>\[data-flux-label\]\+\[data-flux-description\]\]\:mt-0>[data-flux-label]+[data-flux-description]{margin-top:0}.\[\&\>\[data-flux-label\]\+\[data-flux-description\]\]\:mb-3>[data-flux-label]+[data-flux-description]{margin-bottom:calc(var(--spacing) * 3)}.\[\&\>\[data-flux-label\]\:has\(\+\[data-flux-description\]\)\]\:mb-2>[data-flux-label]:has(+[data-flux-description]){margin-bottom:calc(var(--spacing) * 2)}.\[\&\>\[data-flux-label\]\~\[data-flux-control\]\]\:col-start-2>[data-flux-label]~[data-flux-control]{grid-column-start:2}.\[\&\>\[data-flux-label\]\~\[data-flux-control\]\]\:row-start-1>[data-flux-label]~[data-flux-control]{grid-row-start:1}.\[\&\>\[data-flux-legend\]\]\:mb-4>[data-flux-legend],.\[\&\>\[data-flux-legend\]\+\[data-flux-description\]\]\:mb-4>[data-flux-legend]+[data-flux-description]{margin-bottom:calc(var(--spacing) * 4)}.\[\&\>\[data-flux-legend\]\:has\(\+\[data-flux-description\]\)\]\:mb-2>[data-flux-legend]:has(+[data-flux-description]){margin-bottom:calc(var(--spacing) * 2)}@container (min-width:28rem){.\@md\:\[\&\>\[data-slot\=\"content\"\]\:has\(\[data-slot\=\"heading\"\]\)\:has\(\[data-slot\=\"text\"\]\)\+\[data-slot\=\"actions\"\]\]\:p-2>[data-slot=content]:has([data-slot=heading]):has([data-slot=text])+[data-slot=actions]{padding:calc(var(--spacing) * 2)}}.\[\&\>button\]\:hidden>button{display:none}.dark\:\[\&\>option\]\:bg-zinc-700:where(.dark,.dark *)>option{background-color:var(--color-zinc-700)}.dark\:\[\&\>option\]\:text-white:where(.dark,.dark *)>option{color:var(--color-white)}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:ms-6>svg{margin-inline-start:calc(var(--spacing) * 6)}.\[\&\>svg\]\:me-2>svg{margin-inline-end:calc(var(--spacing) * 2)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-zinc-400>svg{color:var(--color-zinc-400)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}:where([data-flux-sidebar-on-desktop]) .\[\&\[collapsible\=\"mobile\"\]\]\:in-data-flux-sidebar-on-desktop\:hidden[collapsible=mobile]{display:none}.\[\&\[data-active\]_\[data-flux-menu-item-icon\]\]\:text-current[data-active] [data-flux-menu-item-icon]{color:currentColor}.\[\&\[data-active\]\>svg\]\:text-zinc-800[data-active]>svg{color:var(--color-zinc-800)}.dark\:\[\&\[data-active\]\>svg\]\:text-white:where(.dark,.dark *)[data-active]>svg{color:var(--color-white)}.\[\&\[data-flux-loading\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[data-flux-loading]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[data-flux-loading\]\>\[data-flux-loading-indicator\]\]\:opacity-100[data-flux-loading]>[data-flux-loading-indicator],.\[\&\[data-loading\]_\[data-flux-loading-indicator\]\]\:opacity-100[data-loading] [data-flux-loading-indicator]{opacity:1}.\[\&\[data-loading\]_\[data-flux-toast-action-label\]\]\:opacity-0[data-loading] [data-flux-toast-action-label],.\[\&\[data-loading\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[data-loading]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[data-loading\]\>\[data-flux-loading-indicator\]\]\:opacity-100[data-loading]>[data-flux-loading-indicator]{opacity:1}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){--tw-gradient-position:to left}@supports (background-image:linear-gradient(in lab,red,red)){.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){--tw-gradient-position:to left in oklab}}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-l[data-outside]:has(+[data-in-range]){background-image:linear-gradient(var(--tw-gradient-stops))}.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){--tw-gradient-position:to right in oklab}}.rtl\:\[\&\[data-outside\]\:has\(\+\[data-in-range\]\)\]\:bg-linear-to-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]:has(+[data-in-range]){background-image:linear-gradient(var(--tw-gradient-stops))}.\[\&\[data-outside\]\:has\(\+\[data-in-range\]\[data-selected\]\)\]\:bg-none\![data-outside]:has(+[data-in-range][data-selected]){background-image:none!important}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-selected\]\+\[data-selected\]\]\:rounded-s-none[data-selected]+[data-selected]{border-start-start-radius:0;border-end-start-radius:0}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}.\[\&\[disabled\]\]\:pointer-events-none[disabled]{pointer-events:none}.\[\&\[disabled\]\]\:cursor-default[disabled]{cursor:default}.\[\&\[disabled\]\]\:text-zinc-400[disabled]{color:var(--color-zinc-400)}.\[\&\[disabled\]\]\:opacity-50[disabled]{opacity:.5}.\[\&\[disabled\]\]\:shadow-none[disabled]{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:\[\&\[disabled\]\]\:border-white\/10:where(.dark,.dark *)[disabled]{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\[disabled\]\]\:border-white\/10:where(.dark,.dark *)[disabled]{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:\[\&\[disabled\]\]\:bg-white\/\[7\%\]:where(.dark,.dark *)[disabled]{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:\[\&\[disabled\]\]\:bg-white\/\[7\%\]:where(.dark,.dark *)[disabled]{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:\[\&\[disabled\]\]\:text-zinc-400:where(.dark,.dark *)[disabled]{color:var(--color-zinc-400)}.dark\:\[\&\[disabled\]\]\:opacity-50:where(.dark,.dark *)[disabled]{opacity:.5}.dark\:\[\&\[disabled\]\]\:opacity-75:where(.dark,.dark *)[disabled]{opacity:.75}.\[\&\[disabled\]_\&\]\:text-zinc-400[disabled] .\[\&\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}.\[\&\[disabled\]_\[data-flux-label\]\]\:opacity-50[disabled] [data-flux-label],.\[\&\[disabled\]_\[data-flux-legend\]\]\:opacity-50[disabled] [data-flux-legend]{opacity:.5}.\[\&\[disabled\]_\[data-slot\=content\]\]\:text-zinc-500[disabled] [data-slot=content]{color:var(--color-zinc-500)}.dark\:\[\&\[disabled\]_\[data-slot\=content\]\]\:text-zinc-400:where(.dark,.dark *)[disabled] [data-slot=content]{color:var(--color-zinc-400)}.\[\&\[disabled\]\>\:not\(\[data-flux-loading-indicator\]\)\]\:opacity-0[disabled]>:not([data-flux-loading-indicator]){opacity:0}.\[\&\[disabled\]\>\[data-flux-loading-indicator\]\]\:opacity-100[disabled]>[data-flux-loading-indicator]{opacity:1}.\[\&\[hidden\=until-found\]\]\:pointer-events-none[hidden=until-found]{pointer-events:none}.\[\&\[hidden\=until-found\]\]\:absolute[hidden=until-found]{position:absolute}.\[\&\[hidden\=until-found\]\]\:opacity-0[hidden=until-found]{opacity:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:first-child\,_\[data-flux-button-group\]_\:first-child\>\&\)\]\:border-s-\[1px\]:first-child,[data-flux-button-group] :first-child>.\[\:is\(\[data-flux-button-group\]\>\&\:first-child\,_\[data-flux-button-group\]_\:first-child\>\&\)\]\:border-s-\[1px\]){border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:last-child,[data-flux-button-group] :last-child>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-\[1px\]:last-child,[data-flux-button-group] :last-child>.\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-\[1px\]){border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}:is([data-flux-button-group]>.dark\:\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:where(.dark,.dark *):last-child,[data-flux-button-group] :last-child>.dark\:\[\:is\(\[data-flux-button-group\]\>\&\:last-child\,_\[data-flux-button-group\]_\:last-child\>\&\)\]\:border-e-0:where(.dark,.dark *)){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[1px\]\!:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[1px\]\!){border-inline-start-style:var(--tw-border-style)!important;border-inline-start-width:1px!important}:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]){border-inline-start-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:is([data-flux-button-group]>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]:not(:first-child),[data-flux-button-group] :not(:first-child)>.\[\:is\(\[data-flux-button-group\]\>\&\:not\(\:first-child\)\,_\[data-flux-button-group\]_\:not\(\:first-child\)\>\&\)\]\:border-s-\[color-mix\(in_srgb\,var\(--color-accent-foreground\)\,transparent_85\%\)\]){border-inline-start-color:color-mix(in srgb,var(--color-accent-foreground),transparent 85%)}}:where(.\[\:where\(\&\)\]\:relative){position:relative}:where(.\[\:where\(\&\)\]\:block){display:block}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:size-8){width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:size-10){width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}:where(.\[\:where\(\&\)\]\:size-12){width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}:where(.\[\:where\(\&\)\]\:size-16){width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}:where(.\[\:where\(\&\)\]\:size-\[var\(--flux-timeline-indicator-size\)\]){width:var(--flux-timeline-indicator-size);height:var(--flux-timeline-indicator-size)}:where(.\[\:where\(\&\)\]\:h-1\.5){height:calc(var(--spacing) * 1.5)}:where(.\[\:where\(\&\)\]\:h-4){height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:h-5){height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:h-6){height:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:max-h-\[14rem\]){max-height:14rem}:where(.\[\:where\(\&\)\]\:max-h-\[20rem\]){max-height:20rem}:where(.\[\:where\(\&\)\]\:min-h-4){min-height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:w-5){width:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:w-6){width:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:w-8){width:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:w-10){width:calc(var(--spacing) * 10)}:where(.\[\:where\(\&\)\]\:w-12){width:calc(var(--spacing) * 12)}:where(.\[\:where\(\&\)\]\:w-64){width:calc(var(--spacing) * 64)}:where(.\[\:where\(\&\)\]\:w-full){width:100%}:where(.\[\:where\(\&\)\]\:max-w-7xl){max-width:var(--container-7xl)}:where(.\[\:where\(\&\)\]\:max-w-xl){max-width:var(--container-xl)}:where(.\[\:where\(\&\)\]\:min-w-6){min-width:calc(var(--spacing) * 6)}:where(.\[\:where\(\&\)\]\:min-w-48){min-width:calc(var(--spacing) * 48)}:where(.\[\:where\(\&\)\]\:min-w-full){min-width:100%}:where(.\[\:where\(\&\)\]\:min-w-xs){min-width:var(--container-xs)}:where(.\[\:where\(\&\)\]\:gap-4){gap:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:rounded){border-radius:.25rem}:where(.\[\:where\(\&\)\]\:rounded-md){border-radius:var(--radius-md)}:where(.\[\:where\(\&\)\]\:rounded-sm){border-radius:var(--radius-sm)}:where(.\[\:where\(\&\)\]\:border-transparent){border-color:#0000}:where(.\[\:where\(\&\)\]\:border-zinc-900\/7){border-color:#1a254012}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:border-zinc-900\/7){border-color:color-mix(in oklab,var(--color-zinc-900) 7%,transparent)}}:where(.\[\:where\(\&\)\]\:border-zinc-900\/10){border-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:border-zinc-900\/10){border-color:color-mix(in oklab,var(--color-zinc-900) 10%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-transparent){background-color:#0000}:where(.\[\:where\(\&\)\]\:bg-white){background-color:var(--color-white)}:where(.\[\:where\(\&\)\]\:bg-zinc-100){background-color:var(--color-zinc-100)}:where(.\[\:where\(\&\)\]\:bg-zinc-200){background-color:var(--color-zinc-200)}:where(.\[\:where\(\&\)\]\:bg-zinc-400\/20){background-color:#8a918d33}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-400\/20){background-color:color-mix(in oklab,var(--color-zinc-400) 20%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/2){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/2){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/3){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/3){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.\[\:where\(\&\)\]\:bg-zinc-900\/4){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:bg-zinc-900\/4){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.\[\:where\(\&\)\]\:stroke-white){stroke:var(--color-white)}:where(.\[\:where\(\&\)\]\:p-4){padding:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:px-3){padding-inline:calc(var(--spacing) * 3)}:where(.\[\:where\(\&\)\]\:py-3){padding-block:calc(var(--spacing) * 3)}:where(.\[\:where\(\&\)\]\:pt-8){padding-top:calc(var(--spacing) * 8)}:where(.\[\:where\(\&\)\]\:text-base){font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}:where(.\[\:where\(\&\)\]\:text-sm){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}:where(.\[\:where\(\&\)\]\:text-xs){font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}:where(.\[\:where\(\&\)\]\:font-medium){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}:where(.\[\:where\(\&\)\]\:font-normal){--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}:where(.\[\:where\(\&\)\]\:text-zinc-300){color:var(--color-zinc-300)}:where(.\[\:where\(\&\)\]\:text-zinc-400){color:var(--color-zinc-400)}:where(.\[\:where\(\&\)\]\:text-zinc-500){color:var(--color-zinc-500)}:where(.\[\:where\(\&\)\]\:text-zinc-800){color:var(--color-zinc-800)}:where(.\[\:where\(\&\)\]\:shadow-xs){--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.\[\:where\(\&\)\]\:\[--flux-shimmer-color\:white\]){--flux-shimmer-color:white}:where(.\[\:where\(\&\)\]\:after\:inset-ring-white\/25):after{content:var(--tw-content);--tw-inset-ring-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:after\:inset-ring-white\/25):after{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}@media(min-width:40rem){:where(.sm\:\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.sm\:\[\:where\(\&\)\]\:h-3){height:calc(var(--spacing) * 3)}}@media(min-width:48rem){:where(.md\:\[\:where\(\&\)\]\:min-w-\[25rem\]){min-width:25rem}}@media(min-width:64rem){:where(.lg\:\[\:where\(\&\)\]\:border-zinc-200){border-color:var(--color-zinc-200)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/7:where(.dark,.dark *)){border-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/7:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/10:where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/10:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/12:where(.dark,.dark *)){border-color:#ffffff1f}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/12:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 12%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:border-white\/15:where(.dark,.dark *)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:border-white\/15:where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:bg-zinc-600):where(.dark,.dark *){background-color:var(--color-zinc-600)}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/5:where(.dark,.dark *)){background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/5:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/6:where(.dark,.dark *)){background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/6:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/7:where(.dark,.dark *)){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/7:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-white\/10:where(.dark,.dark *)){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:bg-white\/10:where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:bg-zinc-800:where(.dark,.dark *)){background-color:var(--color-zinc-800)}:where(.dark\:\[\:where\(\&\)\]\:stroke-zinc-900:where(.dark,.dark *)){stroke:var(--color-zinc-900)}:where(.\[\:where\(\&\)\]\:dark\:text-white):where(.dark,.dark *){color:var(--color-white)}:where(.\[\:where\(\&\)\]\:dark\:text-white\/50):where(.dark,.dark *){color:#ffffff80}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/50):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 50%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-white\/60):where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/60):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-white\/70):where(.dark,.dark *){color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){:where(.\[\:where\(\&\)\]\:dark\:text-white\/70):where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 70%,transparent)}}:where(.\[\:where\(\&\)\]\:dark\:text-zinc-300):where(.dark,.dark *){color:var(--color-zinc-300)}:where(.dark\:\[\:where\(\&\)\]\:text-white\/40:where(.dark,.dark *)){color:#fff6}@supports (color:color-mix(in lab,red,red)){:where(.dark\:\[\:where\(\&\)\]\:text-white\/40:where(.dark,.dark *)){color:color-mix(in oklab,var(--color-white) 40%,transparent)}}:where(.dark\:\[\:where\(\&\)\]\:text-zinc-100:where(.dark,.dark *)){color:var(--color-zinc-100)}:where(.dark\:\[\:where\(\&\)\]\:text-zinc-300:where(.dark,.dark *)){color:var(--color-zinc-300)}:where(.dark\:\[\:where\(\&\)\]\:shadow-none:where(.dark,.dark *)){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.dark\:\[\:where\(\&\)\]\:\[--flux-shimmer-color\:var\(--color-zinc-900\)\]:where(.dark,.dark *)){--flux-shimmer-color:var(--color-zinc-900)}@media(min-width:64rem){:where(.dark\:lg\:\[\:where\(\&\)\]\:border-zinc-700:where(.dark,.dark *)){border-color:var(--color-zinc-700)}}:where(.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8)):before{content:var(--tw-content);--tw-inset-ring-color:#1a254014}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/8)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-zinc-900) 8%, transparent)}}:where(.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:\[\:where\(\&\)\]\:before\:shadow-xs)):before{content:var(--tw-content);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-200)):before{content:var(--tw-content);--tw-inset-ring-color:var(--color-zinc-200)}:where(.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10):has(>[data-flux-card-bleed])):before{content:var(--tw-content);--tw-inset-ring-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-zinc-900\/10):has(>[data-flux-card-bleed])):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-zinc-900) 10%, transparent)}}:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:shadow-none):where(.dark,.dark *)):before{content:var(--tw-content);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *):has(>[data-flux-card-bleed])):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=flush]>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=flush]>:not([data-flux-card],[data-flux-card-body])>.flux-card-flush\:dark\:has-\[\>\[data-flux-card-bleed\]\]\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where(.dark,.dark *):has(>[data-flux-card-bleed])):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:\[\:where\(\&\)\]\:border-transparent)){border-color:#0000}:where(.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:last-child)){border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:last-child)){border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:last-child):where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:not-last\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:last-child):where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:last-child)):after{content:var(--tw-content);border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:last-child)):after{border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:last-child):where(.dark,.dark *)):after{content:var(--tw-content);border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:not-last\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:last-child):where(.dark,.dark *)):after{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\],[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:\[\:where\(\&\)\]\:before\:inset-shadow-\[0_1\.5px_2\.5px_rgb\(0_0_0\/0\.05\)\]))):before{content:var(--tw-content);--tw-inset-shadow:inset 0 1.5px 2.5px var(--tw-inset-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-shadow-none)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-shadow:inset 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-well\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/8)):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 8%, transparent)}}:where(.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50):where([data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50),[data-flux-card]:is([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-well\:\[\:where\(\&\)\]\:bg-zinc-50))){background-color:var(--color-zinc-50)}:where(.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=default]>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=default]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=default]>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=default]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-white\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card][data-flux-card-variant=outline]>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card][data-flux-card-variant=outline]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card][data-flux-card-variant=outline]>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card][data-flux-card-variant=outline]>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-outline\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}:where(.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:\[\:where\(\&\)\]\:shadow-xs))){--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:where(.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10)):where(.dark,.dark *)):before{content:var(--tw-content);--tw-inset-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10:where([data-flux-card][data-flux-card-body-variant=inset]>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10,[data-flux-card][data-flux-card-body-variant=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-inset\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:before\:inset-ring-white\/10)):where(.dark,.dark *)):before{--tw-inset-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:\[\:where\(\&\)\]\:bg-white))){background-color:var(--color-white)}:where(.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4):where([data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4),[data-flux-card]:not([data-flux-card-variant=default],[data-flux-card-variant=outline])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4:where([data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4,[data-flux-card]:is([data-flux-card-body-variant=inset],[data-flux-card-body-variant=flush])>:not([data-flux-card],[data-flux-card-body])>.flux-card-panel\:flux-card-raised\:dark\:\[\:where\(\&\)\]\:bg-white\/4)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}:where(.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:#0003}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}:where(.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:\[\:where\(\&\)\]\:bg-zinc-900\/4))){background-color:color-mix(in oklab,var(--color-zinc-900) 4%,transparent)}}:where(.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:#0003}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20):where([data-flux-card][data-flux-card-variant=muted]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20),[data-flux-card][data-flux-card-variant=muted]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-muted\:dark\:\[\:where\(\&\)\]\:bg-black\/20)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}:where(.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:#00000059}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}:where(.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:#00000059}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35):where([data-flux-card][data-flux-card-variant=soft]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35),[data-flux-card][data-flux-card-variant=soft]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-soft\:dark\:\[\:where\(\&\)\]\:bg-black\/35)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2))){--tw-ring-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:\[\:where\(\&\)\]\:ring-zinc-900\/2))){--tw-ring-color:color-mix(in oklab, var(--color-zinc-900) 2%, transparent)}}:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15)):where(.dark,.dark *)){--tw-ring-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15):where([data-flux-card][data-flux-card-variant=filled]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15),[data-flux-card][data-flux-card-variant=filled]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-filled\:dark\:\[\:where\(\&\)\]\:ring-black\/15)):where(.dark,.dark *)){--tw-ring-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:#1a254005}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/2))){background-color:color-mix(in oklab,var(--color-zinc-900) 2%,transparent)}}:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:#1a254008}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:\[\:where\(\&\)\]\:bg-zinc-900\/3))){background-color:color-mix(in oklab,var(--color-zinc-900) 3%,transparent)}}:where(.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:#00000026}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15):where([data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15),[data-flux-card]:not([data-flux-card-variant=muted],[data-flux-card-variant=soft],[data-flux-card-variant=filled])>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15:where([data-flux-card][data-flux-card-body-variant=separated]>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15,[data-flux-card][data-flux-card-body-variant=separated]>:not([data-flux-card],[data-flux-card-body])>.flux-card-separated\:flux-card-standard\:dark\:\[\:where\(\&\)\]\:bg-black\/15)):where(.dark,.dark *)){background-color:color-mix(in oklab,var(--color-black) 15%,transparent)}}:where(.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:first-child,[data-flux-card-header]+*)){border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:\[\:where\(\&\)\]\:border-zinc-900\/5):not(:first-child,[data-flux-card-header]+*)){border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-after-content\:dark\:\[\:where\(\&\)\]\:border-white\/10):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:first-child,[data-flux-card-header]+*)):after{content:var(--tw-content);border-color:#1a25400d}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:\[\:where\(\&\)\]\:after\:border-zinc-900\/5)):not(:first-child,[data-flux-card-header]+*)):after{border-color:color-mix(in oklab,var(--color-zinc-900) 5%,transparent)}}:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)):after{content:var(--tw-content);border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10):where([data-flux-card][data-flux-card-divider=inset]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10),[data-flux-card][data-flux-card-divider=inset]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10:where([data-flux-card][data-flux-card-body-variant=divided]>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10,[data-flux-card][data-flux-card-body-variant=divided]>:not([data-flux-card],[data-flux-card-body])>.flux-card-divided\:flux-card-divider-inset\:flux-after-content\:dark\:\[\:where\(\&\)\]\:after\:border-white\/10)):not(:first-child,[data-flux-card-header]+*):where(.dark,.dark *)):after{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}:where([data-flux-card-heading-size=base]+.\[\:where\(\[data-flux-card-heading-size\=base\]\+\&\)\]\:mt-1){margin-top:var(--spacing)}:where([data-flux-card-heading-size=lg]+.\[\:where\(\[data-flux-card-heading-size\=lg\]\+\&\)\]\:mt-2){margin-top:calc(var(--spacing) * 2)}@supports ((-moz-appearance:none)){.\[\@supports\(-moz-appearance\:none\)\]\:hidden{display:none}.\[\@supports\(-moz-appearance\:none\)\]\:pe-3{padding-inline-end:calc(var(--spacing) * 3)}}[data-color]>.\[\[data-color\]\>\&\]\:text-inherit{color:inherit}[data-color]>.\[\[data-color\]\>\&\]\:decoration-current\/20{text-decoration-color:currentColor}@supports (color:color-mix(in lab,red,red)){[data-color]>.\[\[data-color\]\>\&\]\:decoration-current\/20{-webkit-text-decoration-color:color-mix(in oklab,currentcolor 20%,transparent);text-decoration-color:color-mix(in oklab,currentcolor 20%,transparent)}}@media(hover:hover){[data-color]>.\[\[data-color\]\>\&\]\:hover\:decoration-current:hover{text-decoration-color:currentColor}}[data-color]>.dark\:\[\[data-color\]\>\&\]\:decoration-current\/50:where(.dark,.dark *){text-decoration-color:currentColor}@supports (color:color-mix(in lab,red,red)){[data-color]>.dark\:\[\[data-color\]\>\&\]\:decoration-current\/50:where(.dark,.dark *){-webkit-text-decoration-color:color-mix(in oklab,currentcolor 50%,transparent);text-decoration-color:color-mix(in oklab,currentcolor 50%,transparent)}}[data-copyable-copied]>.\[\[data-copyable-copied\]\>\&\]\:block{display:block}[data-copyable-copied]>.\[\[data-copyable-copied\]\>\&\]\:hidden{display:none}[data-date-variant=danger] .\[\[data-date-variant\=\'danger\'\]_\&\]\:text-rose-500{color:var(--color-rose-500)}[data-date-variant=danger] .dark\:\[\[data-date-variant\=\'danger\'\]_\&\]\:text-rose-400:where(.dark,.dark *){color:var(--color-rose-400)}[data-date-variant=success] .\[\[data-date-variant\=\'success\'\]_\&\]\:text-lime-600{color:var(--color-lime-600)}[data-date-variant=success] .dark\:\[\[data-date-variant\=\'success\'\]_\&\]\:text-lime-400:where(.dark,.dark *){color:var(--color-lime-400)}[data-date-variant=warning] .\[\[data-date-variant\=\'warning\'\]_\&\]\:text-yellow-600{color:var(--color-yellow-600)}[data-date-variant=warning] .dark\:\[\[data-date-variant\=\'warning\'\]_\&\]\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-red-600{border-color:var(--color-red-600)}[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-zinc-200\/80{border-color:#e2ddd0cc}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .\[\[data-flux-button-group\]_\&\]\:border-zinc-200\/80{border-color:color-mix(in oklab,var(--color-zinc-200) 80%,transparent)}}[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-red-900\/25:where(.dark,.dark *){border-color:#82181a40}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-red-900\/25:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-900) 25%,transparent)}}[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-zinc-900\/50:where(.dark,.dark *){border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){[data-flux-button-group] .dark\:\[\[data-flux-button-group\]_\&\]\:border-zinc-900\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-zinc-900) 50%,transparent)}}[data-flux-color-picker-button]:hover .\[\[data-flux-color-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-color-picker-button]:hover .dark\:\[\[data-flux-color-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-command-input]:has(input:placeholder-shown) .\[\[data-flux-command-input\]\:has\(input\:placeholder-shown\)_\&\]\:hidden{display:none}[data-flux-container] .\[\[data-flux-container\]_\&\]\:px-0{padding-inline:0}[data-flux-date-picker-button]:has([data-flux-date-picker-placeholder]) .\[\[data-flux-date-picker-button\]\:has\(\[data-flux-date-picker-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-date-picker-button]:hover .\[\[data-flux-date-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-date-picker-button]:hover .dark\:\[\[data-flux-date-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-date-picker][disabled] .\[\[data-flux-date-picker\]\[disabled\]_\&\]\:hidden{display:none}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-white\/10:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){[data-flux-editor-link]:not(:has(input:placeholder-shown)) .dark\:\[\[data-flux-editor-link\]\:not\(\:has\(input\:placeholder-shown\)\)_\&\:hover\]\:bg-white\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}[data-flux-file-upload-trigger]:hover .\[\[data-flux-file-upload-trigger\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-file-upload-trigger]:hover .dark\:\[\[data-flux-file-upload-trigger\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:flex{display:flex}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:flex-1{flex:1}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:items-center{align-items:center}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:items-stretch{align-items:stretch}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:gap-0{gap:0}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-y{border-block-style:var(--tw-border-style);border-block-width:1px}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:bg-white{background-color:var(--color-white)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:px-4{padding-inline:calc(var(--spacing) * 4)}[data-flux-input-group] .\[\[data-flux-input-group\]_\&\]\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:border-zinc-600:where(.dark,.dark *){border-color:var(--color-zinc-600)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:bg-zinc-700:where(.dark,.dark *){background-color:var(--color-zinc-700)}[data-flux-input-group] .dark\:\[\[data-flux-input-group\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}[data-flux-input]:has(input:placeholder-shown) .\[\[data-flux-input\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-input]:has(input[disabled]) .\[\[data-flux-input\]\:has\(input\[disabled\]\)_\&\]\:hidden{display:none}[data-flux-input]:hover .\[\[data-flux-input\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-input]:hover .dark\:\[\[data-flux-input\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-loading]>.\[\[data-flux-loading\]\>\&\]\:block{display:block}[data-flux-menu-item-icon]:hover .\[\[data-flux-menu-item-icon\]\:hover_\&\]\:text-current,[data-flux-menu-item]:hover .\[\[data-flux-menu-item\]\:hover_\&\]\:text-current{color:currentColor}[data-flux-menu]:has(>[data-flux-menu-item-has-icon]) .\[\[data-flux-menu\]\:has\(\>\[data-flux-menu-item-has-icon\]\)_\&\]\:block{display:block}[data-flux-phone-ready] .\[\[data-flux-phone-ready\]_\&\]\:flex{display:flex}[data-flux-phone-ready] .\[\[data-flux-phone-ready\]_\&\]\:hidden{display:none}[data-flux-pillbox-search]:has([data-flux-loading]) .\[\[data-flux-pillbox-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-0{opacity:0}[data-flux-pillbox-search]:has([data-flux-loading]) .\[\[data-flux-pillbox-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-100{opacity:1}[data-flux-pillbox-search]:has(input:placeholder-shown) .\[\[data-flux-pillbox-search\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-pillbox-trigger]:has([data-flux-pillbox-placeholder]) .\[\[data-flux-pillbox-trigger\]\:has\(\[data-flux-pillbox-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-pillbox-trigger]:hover .\[\[data-flux-pillbox-trigger\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-pillbox-trigger]:hover .dark\:\[\[data-flux-pillbox-trigger\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-pillbox][disabled]:has([data-selected]) .\[\[data-flux-pillbox\]\[disabled\]\:has\(\[data-selected\]\)_\&\]\:hidden,[data-flux-select-button]:has([data-flux-select-placeholder]) .\[\[data-flux-select-button\]\:has\(\[data-flux-select-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-select-button]:hover .\[\[data-flux-select-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-select-button]:hover .dark\:\[\[data-flux-select-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-select-search]:has([data-flux-loading]) .\[\[data-flux-select-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-0{opacity:0}[data-flux-select-search]:has([data-flux-loading]) .\[\[data-flux-select-search\]\:has\(\[data-flux-loading\]\)_\&\]\:opacity-100{opacity:1}[data-flux-select-search]:has(input:placeholder-shown) .\[\[data-flux-select-search\]\:has\(input\:placeholder-shown\)_\&\]\:hidden,[data-flux-select]:has([disabled][data-selected]) .\[\[data-flux-select\]\:has\(\[disabled\]\[data-selected\]\)_\&\]\:hidden,[data-flux-select][disabled]:has([data-selected]) .\[\[data-flux-select\]\[disabled\]\:has\(\[data-selected\]\)_\&\]\:hidden{display:none}[data-flux-sidebar-group-dropdown]>button:hover .\[\[data-flux-sidebar-group-dropdown\]\>button\:hover_\&\]\:text-current,[data-flux-sidebar-group-dropdown]>button:hover :is(:where([data-flux-menu]) .in-data-flux-menu\:\[\[data-flux-sidebar-group-dropdown\]\>button\:hover_\&\]\:text-current){color:currentColor}[data-flux-sidebar-item]:hover .\[\[data-flux-sidebar-item\]\:hover_\&\]\:text-current\!,[data-flux-sidebar-item][data-active] .\[\[data-flux-sidebar-item\]\[data-active\]_\&\]\:text-current\!{color:currentColor!important}[data-flux-subheading]+.\[\[data-flux-subheading\]\+\&\]\:mt-2{margin-top:calc(var(--spacing) * 2)}[data-flux-tab][data-selected] .\[\[data-flux-tab\]\[data-selected\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-tab][data-selected] .dark\:\[\[data-flux-tab\]\[data-selected\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-time-picker-button]:has([data-flux-time-picker-placeholder]) .\[\[data-flux-time-picker-button\]\:has\(\[data-flux-time-picker-placeholder\]\)_\&\]\:hidden{display:none}[data-flux-time-picker-button]:hover .\[\[data-flux-time-picker-button\]\:hover_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-time-picker-button]:hover .dark\:\[\[data-flux-time-picker-button\]\:hover_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}[data-flux-time-picker]:has([disabled]) .\[\[data-flux-time-picker\]\:has\(\[disabled\]\)_\&\]\:hidden{display:none}[data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:bg-accent{background-color:var(--color-accent)}[data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:text-accent-foreground{color:var(--color-accent-foreground)}:is([data-flux-timeline-status=complete] .\[\[data-flux-timeline-status\=complete\]_\&\]\:\*\:bg-accent>*),:is([data-flux-timeline-status=complete]+[data-flux-timeline-item] .\[\[data-flux-timeline-status\=complete\]\+\[data-flux-timeline-item\]_\&\]\:\*\:bg-accent>*){background-color:var(--color-accent)}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:border-2{border-style:var(--tw-border-style);border-width:2px}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:border-accent{border-color:var(--color-accent)}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:bg-transparent{background-color:#0000}[data-flux-timeline-status=current] .\[\[data-flux-timeline-status\=current\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}[data-flux-timeline-status=current] .dark\:\[\[data-flux-timeline-status\=current\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-2{border-style:var(--tw-border-style);border-width:2px}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-zinc-100{border-color:var(--color-zinc-100)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:bg-transparent{background-color:#0000}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}[data-flux-timeline-status=incomplete] .\[\[data-flux-timeline-status\=incomplete\]_\&\]\:opacity-75{opacity:.75}[data-flux-timeline-status=incomplete] .dark\:\[\[data-flux-timeline-status\=incomplete\]_\&\]\:border-zinc-700:where(.dark,.dark *){border-color:var(--color-zinc-700)}[data-flux-timeline-status=incomplete] .dark\:\[\[data-flux-timeline-status\=incomplete\]_\&\]\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}:is([data-flux-timeline][data-flux-timeline-size=lg] .\[\[data-flux-timeline\]\[data-flux-timeline-size\=lg\]_\&\]\:\*\:bg-zinc-100>*){background-color:var(--color-zinc-100)}[data-flux-toast-dialog][data-variant=danger] .\[\[data-flux-toast-dialog\]\[data-variant\=danger\]_\&\]\:block,[data-flux-toast-dialog][data-variant=info] .\[\[data-flux-toast-dialog\]\[data-variant\=info\]_\&\]\:block,[data-flux-toast-dialog][data-variant=success] .\[\[data-flux-toast-dialog\]\[data-variant\=success\]_\&\]\:block,[data-flux-toast-dialog][data-variant=warning] .\[\[data-flux-toast-dialog\]\[data-variant\=warning\]_\&\]\:block{display:block}[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab,red,red)){[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{--tw-gradient-position:to right in oklab}}[data-in-range]:not([data-selected]):not([data-end-preview])+.\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-r[data-outside]{background-image:linear-gradient(var(--tw-gradient-stops))}[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{--tw-gradient-position:to left}@supports (background-image:linear-gradient(in lab,red,red)){[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{--tw-gradient-position:to left in oklab}}[data-in-range]:not([data-selected]):not([data-end-preview])+.rtl\:\[\[data-in-range\]\:not\(\[data-selected\]\)\:not\(\[data-end-preview\]\)\+\&\[data-outside\]\]\:bg-linear-to-l:where(:dir(rtl),[dir=rtl],[dir=rtl] *)[data-outside]{background-image:linear-gradient(var(--tw-gradient-stops))}[data-month]:first-of-type .\[\[data-month\]\:first-of-type_\&\]\:opacity-0{opacity:0}[data-nav-footer] .\[\[data-nav-footer\]_\&\]\:hidden{display:none}[data-nav-sidebar] [data-nav-footer] .\[\[data-nav-sidebar\]_\[data-nav-footer\]_\&\]\:block{display:block}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-viewable-open]>.\[\[data-viewable-open\]\>\&\]\:block{display:block}[data-viewable-open]>.\[\[data-viewable-open\]\>\&\]\:hidden{display:none}[disabled] .\[\[disabled\]_\&\]\:pointer-events-none{pointer-events:none}[disabled] .\[\[disabled\]_\&\]\:hidden{display:none}[disabled] .\[\[disabled\]_\&\]\:text-zinc-200\!{color:var(--color-zinc-200)!important}[disabled] .\[\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}[disabled] .\[\[disabled\]_\&\]\:text-zinc-400\/70{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){[disabled] .\[\[disabled\]_\&\]\:text-zinc-400\/70{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}[disabled] .\[\[disabled\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}[disabled] .\[\[disabled\]_\&\]\:placeholder-zinc-400\/70::placeholder{color:#8a918db3}@supports (color:color-mix(in lab,red,red)){[disabled] .\[\[disabled\]_\&\]\:placeholder-zinc-400\/70::placeholder{color:color-mix(in oklab,var(--color-zinc-400) 70%,transparent)}}[disabled] .\[\[disabled\]_\&\]\:opacity-50{opacity:.5}[disabled] .\[\[disabled\]_\&\]\:opacity-75{opacity:.75}[disabled] .dark\:\[\[disabled\]_\&\]\:text-white\/40\!:where(.dark,.dark *){color:#fff6!important}@supports (color:color-mix(in lab,red,red)){[disabled] .dark\:\[\[disabled\]_\&\]\:text-white\/40\!:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 40%,transparent)!important}}[disabled] .dark\:\[\[disabled\]_\&\]\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}[disabled] .dark\:\[\[disabled\]_\&\]\:text-zinc-500:where(.dark,.dark *),[disabled] .dark\:\[\[disabled\]_\&\]\:placeholder-zinc-500:where(.dark,.dark *)::placeholder{color:var(--color-zinc-500)}[disabled]:hover .\[\[disabled\]\:hover_\&\]\:text-zinc-400{color:var(--color-zinc-400)}[disabled]:hover .dark\:\[\[disabled\]\:hover_\&\]\:text-white\/60:where(.dark,.dark *){color:#fff9}@supports (color:color-mix(in lab,red,red)){[disabled]:hover .dark\:\[\[disabled\]\:hover_\&\]\:text-white\/60:where(.dark,.dark *){color:color-mix(in oklab,var(--color-white) 60%,transparent)}}[inline] .\[\[inline\]_\&\]\:col-span-1{grid-column:span 1/span 1}[inline] .\[\[inline\]_\&\]\:col-span-2{grid-column:span 2/span 2}[inline] .\[\[inline\]_\&\]\:col-start-1{grid-column-start:1}[inline] .\[\[inline\]_\&\]\:col-start-2{grid-column-start:2}[inline] .\[\[inline\]_\&\]\:row-start-1{grid-row-start:1}[readonly] .\[\[readonly\]_\&\]\:pointer-events-none{pointer-events:none}[readonly] .\[\[readonly\]_\&\]\:cursor-default{cursor:default}[readonly] .\[\[readonly\]_\&\]\:bg-transparent{background-color:#0000}[snap=mandatory] .\[\[snap\=\"mandatory\"\]_\&\]\:snap-always{scroll-snap-stop:always}td[data-selected] .\[td\[data-selected\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}td[data-selected] .\[td\[data-selected\]_\&\]\:bg-white{background-color:var(--color-white)}td[data-selected] .\[td\[data-selected\]_\&\]\:text-\[var\(--color-accent-foreground\)\]{color:var(--color-accent-foreground)}td[data-selected] .dark\:\[td\[data-selected\]_\&\]\:bg-zinc-800:where(.dark,.dark *){background-color:var(--color-zinc-800)}td[data-selected] .\[td\[data-selected\]_\&\[disabled\]\]\:opacity-50[disabled]{opacity:.5}td[data-selected]+td[data-selected] .\[td\[data-selected\]\+td\[data-selected\]_\&\]\:rounded-s-none{border-start-start-radius:0;border-end-start-radius:0}td[data-selected]:has(+td[data-selected]) .\[td\[data-selected\]\:has\(\+td\[data-selected\]\)_\&\]\:rounded-e-none{border-start-end-radius:0;border-end-end-radius:0}td[data-today] .\[td\[data-today\]_\&\]\:flex{display:flex}td[disabled] .\[td\[disabled\]_\&\]\:pointer-events-none{pointer-events:none}td[disabled] .\[td\[disabled\]_\&\]\:cursor-default{cursor:default}td[disabled] .\[td\[disabled\]_\&\]\:text-zinc-400{color:var(--color-zinc-400)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:border-transparent{border-color:#0000}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-checkbox[data-checked] .\[ui-checkbox\[data-checked\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-checkbox[data-checked] .hover\:\[ui-checkbox\[data-checked\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-checkbox[data-checked] .focus\:\[ui-checkbox\[data-checked\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-checkbox[data-checked] .dark\:\[ui-checkbox\[data-checked\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-checkbox[data-checked]:not([data-indeterminate]) .\[ui-checkbox\[data-checked\]\:not\(\[data-indeterminate\]\)_\&\>svg\:first-child\]\:block>svg:first-child{display:block}ui-checkbox[data-checked][disabled] .\[ui-checkbox\[data-checked\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:border-transparent{border-color:#0000}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-checkbox[data-indeterminate] .hover\:\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-checkbox[data-indeterminate] .focus\:\[ui-checkbox\[data-indeterminate\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-checkbox[data-indeterminate] .\[ui-checkbox\[data-indeterminate\]_\&\>svg\:last-child\]\:block>svg:last-child{display:block}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-checkbox[disabled] .\[ui-checkbox\[disabled\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-checkbox[disabled] .dark\:\[ui-checkbox\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-checkbox[disabled] .dark\:\[ui-checkbox\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-checkbox[disabled][data-checked] .\[ui-checkbox\[disabled\]\[data-checked\]_\&\]\:border-transparent,ui-checkbox[disabled][data-indeterminate] .\[ui-checkbox\[disabled\]\[data-indeterminate\]_\&\]\:border-transparent{border-color:#0000}ui-color-picker:not([value]) .\[ui-color-picker\:not\(\[value\]\)_\&\]\:hidden,ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:hidden{display:none}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:cursor-default{cursor:default}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:border-b-zinc-200{border-bottom-color:var(--color-zinc-200)}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:text-zinc-500{color:var(--color-zinc-500)}ui-color-picker[disabled] .\[ui-color-picker\[disabled\]_\&\]\:shadow-none\!{--tw-shadow:0 0 #0000!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:bg-white\/\[7\%\]:where(.dark,.dark *){background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:bg-white\/\[7\%\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}ui-color-picker[disabled] .dark\:\[ui-color-picker\[disabled\]_\&\]\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}ui-color-picker[value] .\[ui-color-picker\[value\]_\&\]\:hidden{display:none}ui-date-picker-trigger:hover:not(:has(input:hover)) .\[ui-date-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-date-picker-trigger:hover:not(:has(input:hover)) .dark\:\[ui-date-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-date-picker[data-empty] .\[ui-date-picker\[data-empty\]_\&\]\:hidden,ui-date-picker[disabled] .\[ui-date-picker\[disabled\]_\&\]\:hidden{display:none}ui-dropdown>.\[ui-dropdown\>\&\]\:w-full{width:100%}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:block{display:block}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:border-transparent{border-color:#0000}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}@media(hover:hover){ui-option[data-selected] .hover\:\[ui-option\[data-selected\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-option[data-selected] .focus\:\[ui-option\[data-selected\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-option[data-selected] .\[ui-option\[data-selected\]_\&\>div\]\:block>div,ui-option[data-selected] .\[ui-option\[data-selected\]_\&\>svg\:first-child\]\:block>svg:first-child{display:block}ui-option[data-selected][disabled] .\[ui-option\[data-selected\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-option[disabled] .\[ui-option\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-option[disabled] .\[ui-option\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-option[disabled] .dark\:\[ui-option\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-option[disabled] .dark\:\[ui-option\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-option[disabled] :is(ui-option[data-selected] .\[ui-option\[data-selected\]_\&\]\:\[ui-option\[disabled\]_\&\]\:border-transparent){border-color:#0000}ui-phone[data-invalid] .\[ui-phone\[data-invalid\]_\&\]\:border-red-500\!{border-color:var(--color-red-500)!important}ui-phone[data-invalid] .\[ui-phone\[data-invalid\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:border-transparent{border-color:#0000}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){ui-radio[data-checked] .hover\:\[ui-radio\[data-checked\]_\&\]\:bg-\(--color-accent\):hover{background-color:var(--color-accent)}}ui-radio[data-checked] .focus\:\[ui-radio\[data-checked\]_\&\]\:bg-\(--color-accent\):focus{background-color:var(--color-accent)}ui-radio[data-checked] .dark\:\[ui-radio\[data-checked\]_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\>div\]\:block>div{display:block}ui-radio[data-checked][disabled] .\[ui-radio\[data-checked\]\[disabled\]_\&\]\:opacity-50{opacity:.5}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:border-zinc-200{border-color:var(--color-zinc-200)}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:opacity-75{opacity:.75}ui-radio[disabled] .\[ui-radio\[disabled\]_\&\]\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}ui-radio[disabled] .dark\:\[ui-radio\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){ui-radio[disabled] .dark\:\[ui-radio\[disabled\]_\&\]\:border-white\/5:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}ui-radio[disabled] :is(ui-radio[data-checked] .\[ui-radio\[data-checked\]_\&\]\:\[ui-radio\[disabled\]_\&\]\:border-transparent){border-color:#0000}ui-selected .\[ui-selected_\&\]\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}ui-selected .\[ui-selected_\&\]\:hidden{display:none}ui-selected .\[ui-selected_\&\]\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}ui-selected .\[ui-selected_\&\]\:items-center{align-items:center}ui-selected .\[ui-selected_\&\]\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}ui-selected .\[ui-selected_\&\]\:text-inherit{color:inherit}ui-time-picker-options>[data-selected] .\[ui-time-picker-options\>\[data-selected\]_\&\]\:block{display:block}ui-time-picker-trigger:hover:not(:has(input:hover)) .\[ui-time-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-zinc-800{color:var(--color-zinc-800)}ui-time-picker-trigger:hover:not(:has(input:hover)) .dark\:\[ui-time-picker-trigger\:hover\:not\(\:has\(input\:hover\)\)_\&\]\:text-white:where(.dark,.dark *){color:var(--color-white)}ui-time-picker:has([disabled]) .\[ui-time-picker\:has\(\[disabled\]\)_\&\]\:hidden,ui-time-picker[data-empty] .\[ui-time-picker\[data-empty\]_\&\]\:hidden{display:none}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}}@keyframes flux-shimmer{0%{transform:translate(0)}to{transform:translate(200%)}}:has(>[data-flux-main]){grid-template:"header header header""sidebar main aside"1fr"sidebar footer aside"/min-content minmax(0,1fr) min-content;grid-area:body;display:grid}:has(>[data-flux-sidebar]+[data-flux-header]){grid-template-areas:"sidebar header header""sidebar main aside""sidebar footer aside"}@media(min-width:64rem){:has(>[data-flux-main][data-flux-main-inset]){grid-template-rows:auto minmax(0,1fr) auto;height:100dvh}}[data-flux-modal]>dialog,[data-flux-modal]>dialog::backdrop{opacity:0;transition:all 75ms allow-discrete}[data-flux-modal]>dialog:not([open]){display:none}[data-flux-modal]>dialog{transform:scale(.95)}[data-flux-modal]>dialog[data-flux-flyout]{transform:scale(1) var(--flux-flyout-translate,var(--fx-flyout-translate,translateX(50px)))}[data-flux-modal]>dialog[open],[data-flux-modal]>dialog[open]::backdrop{opacity:1;transition:all .15s allow-discrete;transform:translate(0)scale(1)}@starting-style{[data-flux-modal]>dialog[open],[data-flux-modal]>dialog[open]::backdrop{opacity:0}[data-flux-modal]>dialog[open]{transform:scale(.95)}[data-flux-modal]>dialog[open][data-flux-flyout]{transform:scale(1) var(--flux-flyout-translate,var(--fx-flyout-translate,translateX(50px)))}}[data-flux-modal]>dialog::backdrop{background-color:#0000001a}[data-flux-modal]>dialog[data-flux-modal-overflow]{background:0 0;width:100%;max-width:none;height:100%;max-height:none;margin:0;overflow-y:auto;transform:none}[data-flux-modal-content]{transition:transform 75ms allow-discrete;transform:scale(.95)}dialog[open] [data-flux-modal-content]{transition:transform .15s allow-discrete;transform:scale(1)}@starting-style{dialog[open] [data-flux-modal-content]{transform:scale(.95)}}select[data-flux-select-native]{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23d4d4d4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23d4d4d4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-inline-end:2.5rem}[dir=rtl] select[data-flux-select-native]{background-position:.5rem}select[data-flux-select-native]:hover:not(:disabled){background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%2327272a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%2327272a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}.dark select[data-flux-select-native]{background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23A1A1AA' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23A1A1AA' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}.dark select[data-flux-select-native]:hover:not(:disabled){background-image:url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M8 9L12 5L16 9' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M16 15L12 19L8 15' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e")}ui-toast{background-color:#0000;max-width:24rem;margin:1.5rem;overflow:visible}ui-toast[position*=top]{margin-bottom:auto}ui-toast[position*=bottom]{margin-top:auto}ui-toast[position*=left],ui-toast[position*=start]{margin-inline-end:auto}ui-toast[position*=center]{margin-left:auto;margin-right:auto}ui-toast[position*=right],ui-toast[position*=end]{margin-inline-start:auto}ui-toast [data-flux-toast-dialog]{opacity:0;transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete;transform:translate(0)}ui-toast [data-flux-toast-dialog].showing{opacity:1;transition:opacity .2s allow-discrete,transform .2s allow-discrete,height .2s allow-discrete;transform:translate(0)}@starting-style{ui-toast [data-flux-toast-dialog]{opacity:0;transform:translate(0)}ui-toast[position*=top]>[data-flux-toast-dialog]{transform:translateY(-.5rem)}ui-toast[position*=top][position*=left]>[data-flux-toast-dialog]{transform:translate(-.5rem)}ui-toast[position*=top][position*=right]>[data-flux-toast-dialog],[dir=rtl] ui-toast[position*=top][position*=left]>[data-flux-toast-dialog]{transform:translate(.5rem)}[dir=rtl] ui-toast[position*=top][position*=right]>[data-flux-toast-dialog]{transform:translate(-.5rem)}ui-toast[position*=bottom]>[data-flux-toast-dialog]{transform:translateY(.5rem)}}ui-toast-group{background-color:#0000;width:24rem;margin:1.5rem;display:flex;overflow:visible}ui-toast-group[position*=top]{margin-bottom:auto}ui-toast-group[position*=bottom]{margin-top:auto}ui-toast-group[position*=left],ui-toast-group[position*=start]{justify-content:flex-start;margin-inline-end:auto}ui-toast-group[position*=center]{justify-content:center;margin-left:auto;margin-right:auto}ui-toast-group[position*=right],ui-toast-group[position*=end]{justify-content:flex-end;margin-inline-start:auto}ui-toast-group [data-flux-toast-dialog]{transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete;position:absolute;transform:translate(0)}[position*=top] :is(ui-toast-group [data-flux-toast-dialog]){padding-bottom:.75rem;top:0}[position*=bottom] :is(ui-toast-group [data-flux-toast-dialog]){padding-top:.75rem;bottom:0}ui-toast-group [data-flux-toast-dialog]>*{transition:opacity .35s allow-discrete,transform .35s allow-discrete,height .35s allow-discrete}.flux-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.flux-no-scrollbar::-webkit-scrollbar{display:none}.has-focus-visible\:outline-default:has(:focus-visible){outline:auto highlight;outline-color:-webkit-focus-ring-color}[data-flux-timeline]{grid-template-columns:var(--flux-timeline-item-offset) auto var(--flux-timeline-content-gap) 1fr;display:grid}[data-flux-timeline] [data-flux-timeline-item]{grid-template-columns:subgrid;grid-column:2/-1;grid-template-rows:auto 1fr auto 1fr auto;display:grid}[data-flux-timeline] [data-flux-timeline-item]:has([data-flux-timeline-block]){grid-column:1/-1}[data-flux-timeline] [data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading],[data-flux-timeline] [data-flux-timeline-item]:not(:last-child) [data-flux-timeline-gap-trailing]{min-height:calc(var(--flux-timeline-item-gap)/2)}[data-flux-timeline] [data-flux-timeline-item]:first-child [data-flux-timeline-line-leading],[data-flux-timeline] [data-flux-timeline-item]:last-child [data-flux-timeline-line-trailing]{opacity:0}[data-flux-timeline] [data-flux-timeline-indicator]{grid-area:3/1;justify-self:center}[data-flux-timeline] [data-flux-timeline-content]{grid-area:2/3/5;align-self:center;min-width:0}[data-flux-timeline] [data-flux-timeline-line-leading]{grid-area:1/1/3}[data-flux-timeline] [data-flux-timeline-line-trailing]{grid-area:4/1/-1}[data-flux-timeline] [data-flux-timeline-gap-leading]{grid-area:1/3}[data-flux-timeline] [data-flux-timeline-gap-trailing]{grid-area:5/3}[data-flux-timeline][data-flux-timeline-horizontal]{grid-template-columns:initial;grid-template-rows:auto var(--flux-timeline-content-gap) 1fr}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]{grid-template-rows:subgrid;grid-row:1/-1;grid-column:initial;grid-template-columns:auto 1fr auto 1fr auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading],[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:not(:last-child) [data-flux-timeline-gap-trailing]{min-width:calc(var(--flux-timeline-item-gap)/2)}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-indicator]{justify-self:initial;grid-area:1/3;align-self:center}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-content]{justify-self:center;align-self:initial;grid-area:3/2/auto/5}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-line-leading]{grid-area:1/1/auto/3;justify-self:stretch}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-line-trailing]{grid-area:1/4/auto/-1;justify-self:stretch}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-gap-leading]{grid-area:3/1}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-gap-trailing]{grid-area:3/5}[data-flux-timeline][data-flux-timeline-horizontal=inline]{grid-template-rows:auto}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-item]{grid-template-columns:auto auto auto auto 1fr}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-content]{padding-left:var(--flux-timeline-content-gap);padding-right:var(--flux-timeline-content-gap);grid-area:1/4}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-line-leading]{grid-area:1/1/auto/3}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-line-trailing]{grid-area:1/5}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-gap-leading]{grid-area:1/1}[data-flux-timeline][data-flux-timeline-horizontal=inline] [data-flux-timeline-gap-trailing]{grid-area:1/5}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading],[data-flux-timeline-item] [data-flux-timeline-line-trailing]{flex-direction:column;align-items:center;display:flex}:is([data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading],[data-flux-timeline-item] [data-flux-timeline-line-trailing]) *{width:var(--flux-timeline-line-width);height:calc(100% - var(--flux-timeline-line-gap))}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-line-leading]{justify-content:start}[data-flux-timeline-item] [data-flux-timeline-line-trailing]{justify-content:end}[data-flux-timeline-horizontal] [data-flux-timeline-item] :is([data-flux-timeline-line-leading],[data-flux-timeline-line-trailing]){justify-content:center;align-items:initial}[data-flux-timeline-horizontal] [data-flux-timeline-item] :is([data-flux-timeline-line-leading],[data-flux-timeline-line-trailing]) *{height:var(--flux-timeline-line-width);width:calc(100% - var(--flux-timeline-line-gap))}[data-flux-timeline-horizontal] [data-flux-timeline-item] [data-flux-timeline-line-leading]{align-items:start}[data-flux-timeline-horizontal] [data-flux-timeline-item] [data-flux-timeline-line-trailing]{align-items:end}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=start] [data-flux-timeline-item]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=start] [data-flux-timeline-content]{align-self:start}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=start]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=start] [data-flux-timeline-content]{align-self:start}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=end] [data-flux-timeline-item]{grid-template-rows:auto 1fr auto auto auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=end] [data-flux-timeline-content]{align-self:end}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=end]{grid-template-rows:auto 1fr auto auto auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=end] [data-flux-timeline-content]{align-self:end}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-item]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-content]{grid-row:3/5;align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal])[data-flux-timeline-align=baseline] [data-flux-timeline-indicator]{align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline]{grid-template-rows:auto auto auto 1fr auto}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline] [data-flux-timeline-content]{grid-row:3/5;align-self:baseline}[data-flux-timeline]:not([data-flux-timeline-horizontal]) [data-flux-timeline-item][data-flux-timeline-align=baseline] [data-flux-timeline-indicator]{align-self:baseline}:is([data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=start],[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=baseline]) [data-flux-timeline-item]{grid-template-columns:auto auto auto 1fr auto}:is([data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=start],[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=baseline]) [data-flux-timeline-content]{justify-self:start}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:is([data-flux-timeline-align=start],[data-flux-timeline-align=baseline]){grid-template-columns:auto auto auto 1fr auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item]:is([data-flux-timeline-align=start],[data-flux-timeline-align=baseline]) [data-flux-timeline-content]{justify-self:start}[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=end] [data-flux-timeline-item]{grid-template-columns:auto 1fr auto auto auto}[data-flux-timeline][data-flux-timeline-horizontal][data-flux-timeline-align=end] [data-flux-timeline-content]{justify-self:end}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item][data-flux-timeline-align=end]{grid-template-columns:auto 1fr auto auto auto}[data-flux-timeline][data-flux-timeline-horizontal] [data-flux-timeline-item][data-flux-timeline-align=end] [data-flux-timeline-content]{justify-self:end}[data-flux-timeline]:has([data-flux-timeline-block]){--flux-timeline-item-offset:calc(var(--spacing) * 3)}[data-flux-timeline-item] [data-flux-timeline-block]{grid-template-columns:subgrid;grid-area:2/1/5/-1;display:grid}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]{grid-template-columns:subgrid;grid-column:1/-1;display:grid}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]>:first-child{grid-column:2;justify-self:center}[data-flux-timeline-item] [data-flux-timeline-block] [data-flux-timeline-subgrid]>:nth-child(2){grid-column:4}[data-flux-timeline-item] [data-flux-timeline-block]>:not([data-flux-timeline-subgrid]){grid-column:1/-1}[data-flux-timeline-item] [data-flux-timeline-line-leading]:has(~[data-flux-timeline-block]){grid-area:1/2/2}[data-flux-timeline-item] [data-flux-timeline-line-leading]:has(~[data-flux-timeline-block]) *{height:100%!important}[data-flux-timeline-item] [data-flux-timeline-block]~[data-flux-timeline-line-trailing]{grid-area:5/2/-1}[data-flux-timeline-item] [data-flux-timeline-block]~[data-flux-timeline-line-trailing] *{height:100%!important}[data-flux-timeline-item]:not(:first-child) [data-flux-timeline-gap-leading]:has(~[data-flux-timeline-block]),[data-flux-timeline-item]:not(:last-child) [data-flux-timeline-block]~[data-flux-timeline-gap-trailing]{height:var(--flux-timeline-item-gap)}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}[data-flux-field]:not(ui-radio,ui-checkbox){gap:calc(var(--spacing) * 2);display:grid}[data-flux-label]{--tw-leading:var(--leading-tight)!important;line-height:var(--leading-tight)!important;margin-bottom:0!important}[data-flux-sidebar]{background:var(--color-bg-elev);border-color:var(--color-bg-rule)}[data-flux-navlist] [data-flux-navlist-group-heading],[data-flux-navlist] [data-flux-group-heading]{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-4);padding-bottom:6px;font-size:10px;font-weight:700}[data-flux-navlist-item]{color:var(--color-ink-2);border-radius:var(--radius-sm);font-size:13px;font-weight:500;transition:background .12s,color .12s}[data-flux-navlist-item]:hover{background:var(--color-bg);color:var(--color-hub)}.dark [data-flux-navlist-item]:hover{background:var(--color-hub-soft);color:var(--color-hub)}[data-flux-navlist-item]:active,[data-flux-navlist-item]:focus{background:var(--color-hub-soft);color:var(--color-hub);outline:none}[data-flux-navlist-item]{-webkit-tap-highlight-color:transparent}[data-flux-navlist-item]:focus-visible{outline:2px solid var(--color-hub);outline-offset:-2px}[data-flux-navlist-item][data-current=true],[data-flux-navlist-item][aria-current=page],[data-flux-navlist-item].active{background:var(--color-hub-soft);color:var(--color-hub);font-weight:600;position:relative}[data-flux-navlist-item][data-current=true]:before,[data-flux-navlist-item][aria-current=page]:before,[data-flux-navlist-item].active:before{content:"";background:var(--color-hub);border-radius:0 2px 2px 0;width:2px;position:absolute;top:6px;bottom:6px;left:-1px}[data-flux-button].hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:var(--color-hub-2)!important}[data-flux-button].bg-\[var\(--color-accent\)\]{border-color:var(--color-hub-2);box-shadow:inset 0 1px #ffffff2e,0 1px 2px #1a254040,0 2px 6px -2px #1a25402e}[data-flux-button].bg-\[var\(--color-accent\)\]:hover{box-shadow:inset 0 1px #ffffff26,0 2px 4px #1a254059,0 3px 10px -2px #1a254040}.dark [data-flux-button].bg-\[var\(--color-accent\)\]{border-color:var(--color-hub);box-shadow:inset 0 1px #ffffff1f,0 1px 2px #00000080,0 2px 6px -2px #0006}.dark [data-flux-button].bg-\[var\(--color-accent\)\]:hover{box-shadow:inset 0 1px #ffffff1a,0 2px 4px #0009,0 3px 10px -2px #00000080}[data-flux-card]{background:var(--color-bg-card);border-color:var(--color-bg-rule)}[data-flux-heading]{color:var(--color-ink)}input:focus[data-flux-control],textarea:focus[data-flux-control],select:focus[data-flux-control]{--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);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-color:var(--color-hub);--tw-ring-offset-color:var(--color-bg-elev);border-color:var(--color-hub)!important}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-mask-linear{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-radial{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-conic{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-left{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-right{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-bottom{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-top{syntax:"*";inherits:false;initial-value:linear-gradient(#fff,#fff)}@property --tw-mask-right-from-position{syntax:"*";inherits:false;initial-value:0%}@property --tw-mask-right-to-position{syntax:"*";inherits:false;initial-value:100%}@property --tw-mask-right-from-color{syntax:"*";inherits:false;initial-value:black}@property --tw-mask-right-to-color{syntax:"*";inherits:false;initial-value:transparent}@property --tw-mask-left-from-position{syntax:"*";inherits:false;initial-value:0%}@property --tw-mask-left-to-position{syntax:"*";inherits:false;initial-value:100%}@property --tw-mask-left-from-color{syntax:"*";inherits:false;initial-value:black}@property --tw-mask-left-to-color{syntax:"*";inherits:false;initial-value:transparent}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/error-reporting-NIyJC3t-.js b/public/build/web/error-reporting-CmT4J-eI.js similarity index 86% rename from public/build/web/error-reporting-NIyJC3t-.js rename to public/build/web/error-reporting-CmT4J-eI.js index 26e988ad..37bd166a 100644 --- a/public/build/web/error-reporting-NIyJC3t-.js +++ b/public/build/web/error-reporting-CmT4J-eI.js @@ -1 +1 @@ -const y="modulepreload",A=function(e){return"https://pressekonto.test/build/"+e},h={},_=function(r,t,a){let u=Promise.resolve();if(t&&t.length>0){let o=function(s){return Promise.all(s.map(c=>Promise.resolve(c).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),m=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));u=o(t.map(s=>{if(s=A(s),s in h)return;h[s]=!0;const c=s.endsWith(".css"),f=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${f}`))return;const l=document.createElement("link");if(l.rel=c?"stylesheet":y,c||(l.as="script"),l.crossOrigin="",l.href=s,m&&l.setAttribute("nonce",m),document.head.appendChild(l),c)return new Promise((b,S)=>{l.addEventListener("load",b),l.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${s}`)))})}))}function d(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return u.then(o=>{for(const n of o||[])n.status==="rejected"&&d(n.reason);return r().catch(d)})},i=(()=>{const e=document.querySelector('meta[name="pk-error-reporting"]');try{return e?JSON.parse(e.content):null}catch{return null}})(),k=["src","pr","ref","page","q","tab","edition"],v=new RegExp("(?<=\\/)[A-Za-z0-9_-]{32,}(?=\\/|$)","g"),w=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function p(e){try{const r=new URL(e,window.location.origin);r.pathname=r.pathname.replace(v,"[Filtered]");for(const t of[...r.searchParams.keys()])!k.includes(t)&&!t.startsWith("utm_")&&r.searchParams.set(t,"[Filtered]");return r.hash="",r.toString().replace(w,"[email]")}catch{return"[Filtered]"}}let E=null;function P(){return E??(E=_(()=>import("./error-reporting-sdk-Ca8cRdCE.js"),[]).then(e=>(e.init({dsn:i.dsn,release:i.release||void 0,environment:i.environment,sampleRate:i.sampleRate??1,sendDefaultPii:!1,integrations:r=>r.filter(t=>!["GlobalHandlers","Breadcrumbs","BrowserSession","BrowserApiErrors"].includes(t.name)),ignoreErrors:["ResizeObserver loop","Script error.","AbortError"],denyUrls:[/^chrome-extension:\/\//,/^moz-extension:\/\//,/^safari-(web-)?extension:\/\//],beforeSend(r){var t,a,u,d;(t=r.request)!=null&&t.url&&(r.request.url=p(r.request.url)),(u=(a=r.request)==null?void 0:a.headers)!=null&&u.Referer&&(r.request.headers.Referer=p(r.request.headers.Referer));for(const o of((d=r.exception)==null?void 0:d.values)??[])o.value&&(o.value=o.value.replace(w,"[email]"));return r}}),i.userId&&e.setUser({id:String(i.userId)}),e.setTag("area",i.area),e))),E}function R(e){var a;if(e instanceof Error)return e;const r=((a=e==null?void 0:e.constructor)==null?void 0:a.name)??typeof e;let t;try{t=typeof e=="string"?e:JSON.stringify(e)}catch{t=String(e)}return new Error(`Unbehandelte Ablehnung (${r}): ${String(t??"").slice(0,300)}`)}function g(e){P().then(r=>r.captureException(e)).catch(()=>{})}i!=null&&i.dsn&&(window.addEventListener("error",e=>{e.error&&g(e.error)}),window.addEventListener("unhandledrejection",e=>{g(R(e.reason))})); +const y="modulepreload",A=function(e){return"https://pressekonto.test/build/"+e},h={},_=function(r,t,a){let u=Promise.resolve();if(t&&t.length>0){let o=function(s){return Promise.all(s.map(c=>Promise.resolve(c).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),m=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));u=o(t.map(s=>{if(s=A(s),s in h)return;h[s]=!0;const c=s.endsWith(".css"),f=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${f}`))return;const l=document.createElement("link");if(l.rel=c?"stylesheet":y,c||(l.as="script"),l.crossOrigin="",l.href=s,m&&l.setAttribute("nonce",m),document.head.appendChild(l),c)return new Promise((b,S)=>{l.addEventListener("load",b),l.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${s}`)))})}))}function d(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return u.then(o=>{for(const n of o||[])n.status==="rejected"&&d(n.reason);return r().catch(d)})},i=(()=>{const e=document.querySelector('meta[name="pk-error-reporting"]');try{return e?JSON.parse(e.content):null}catch{return null}})(),k=["src","pr","ref","page","q","tab","edition"],P=new RegExp("(?<=\\/)[A-Za-z0-9_-]{32,}(?=\\/|$)","g"),w=/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;function p(e){try{const r=new URL(e,window.location.origin);r.pathname=r.pathname.replace(P,"[Filtered]");for(const t of[...r.searchParams.keys()])!k.includes(t)&&!t.startsWith("utm_")&&r.searchParams.set(t,"[Filtered]");return r.hash="",r.toString().replace(w,"[email]")}catch{return"[Filtered]"}}let E=null;function R(){return E??(E=_(()=>import("./error-reporting-sdk-Ca8cRdCE.js"),[]).then(e=>(e.init({dsn:i.dsn,release:i.release||void 0,environment:i.environment,sampleRate:i.sampleRate??1,sendDefaultPii:!1,integrations:r=>r.filter(t=>!["GlobalHandlers","Breadcrumbs","BrowserSession","BrowserApiErrors"].includes(t.name)),ignoreErrors:["ResizeObserver loop","Script error.","AbortError"],denyUrls:[/^chrome-extension:\/\//,/^moz-extension:\/\//,/^safari-(web-)?extension:\/\//],beforeSend(r){var t,a,u,d;(t=r.request)!=null&&t.url&&(r.request.url=p(r.request.url)),(u=(a=r.request)==null?void 0:a.headers)!=null&&u.Referer&&(r.request.headers.Referer=p(r.request.headers.Referer));for(const o of((d=r.exception)==null?void 0:d.values)??[])o.value&&(o.value=o.value.replace(w,"[email]"));return r}}),i.userId&&e.setUser({id:String(i.userId)}),e.setTag("area",i.area),e))),E}function q(e){var a;if(e instanceof Error)return e;const r=((a=e==null?void 0:e.constructor)==null?void 0:a.name)??typeof e;let t;try{t=typeof e=="string"?e:JSON.stringify(e)}catch{t=String(e)}return new Error(`Unbehandelte Ablehnung (${r}): ${String(t??"").slice(0,300)}`)}function g(e){R().then(r=>r.captureException(e)).catch(()=>{})}i!=null&&i.dsn&&(window.addEventListener("error",e=>{e.error&&g(e.error)}),window.addEventListener("unhandledrejection",e=>{var r;((r=e.reason)==null?void 0:r.isFromCancelledTransition)!==!0&&g(q(e.reason))})); diff --git a/public/build/web/manifest.json b/public/build/web/manifest.json index 3f9881eb..6ac575f1 100644 --- a/public/build/web/manifest.json +++ b/public/build/web/manifest.json @@ -1,16 +1,16 @@ { "resources/css/web/theme-businessportal24.css": { - "file": "theme-businessportal24-CDRq7Rn6.css", + "file": "theme-businessportal24-BB3tnrPQ.css", "src": "resources/css/web/theme-businessportal24.css", "isEntry": true }, "resources/css/web/theme-presseecho.css": { - "file": "theme-presseecho-hPNcGgVd.css", + "file": "theme-presseecho-Bt5lIQm5.css", "src": "resources/css/web/theme-presseecho.css", "isEntry": true }, "resources/css/web/theme-pressekonto.css": { - "file": "theme-pressekonto-BNifjlS-.css", + "file": "theme-pressekonto-DLmUsiSS.css", "src": "resources/css/web/theme-pressekonto.css", "isEntry": true }, @@ -27,7 +27,7 @@ "isDynamicEntry": true }, "resources/js/error-reporting.js": { - "file": "error-reporting-NIyJC3t-.js", + "file": "error-reporting-CmT4J-eI.js", "name": "error-reporting", "src": "resources/js/error-reporting.js", "isEntry": true, diff --git a/public/build/web/theme-businessportal24-BB3tnrPQ.css b/public/build/web/theme-businessportal24-BB3tnrPQ.css new file mode 100644 index 00000000..6f489b81 --- /dev/null +++ b/public/build/web/theme-businessportal24-BB3tnrPQ.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", "Söhne", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e5e0d5;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1c1a17;--color-bg-dark:#14202e;--color-bg-card:#fff;--color-bg-card-warm:#f1ece2;--color-bg-card-warm-border:#d9cdb6;--color-bg-card-warm-hover:#ece5d5;--color-bg-card-warm-rule:#c8bda8;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a1f26;--color-topbar2:#232a33;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#ff8b6f;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1c1a17;--color-ink-2:#3d3935;--color-ink-3:#6e6862;--color-ink-4:#9a958d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b8b3aa;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#8a847b;--color-ink-on-dark-rule:#2a2723;--color-brand:#c84a1e;--color-brand-deep:#a23814;--color-brand-soft:#f4e5dd;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#e03a1a;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#6e6862;--color-card-warm-title:#3a332b;--color-feature-line:#a8c8a8;--color-feature-dot:#c4dcc4;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e8e4da}h1,h2,h3,h4{font-family:var(--font-serif);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#ff8b6f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #ff8b6f80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.12em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:600}.eyebrow.muted{color:var(--color-ink-3)}.eyebrow.on-dark{color:var(--color-accent-warm)}.bp-cat{letter-spacing:.14em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:700}.bp-tag{letter-spacing:.08em;text-transform:uppercase;background:var(--color-brand);color:#fff;border-radius:2px;align-items:center;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.bg-feature-grad{background-image:linear-gradient(135deg,#2a3a2a,#1a2a1a)}.bg-hero-grad{background-image:linear-gradient(135deg,#2a3a4a,#1a1f26)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[65px\]{min-height:65px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1c1a1733}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#c84a1e33}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#c84a1e40}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#c84a1e4d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#c84a1e66}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1c1a174d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#c84a1e0a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#c84a1e0f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1c1a17b3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#c84a1e66}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-\[color\:var\(--color-hub\)\]{accent-color:var(--color-hub)}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1c1a174d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#c84a1e80}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-2{top:calc(var(--spacing) * 2)}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:top-full{top:100%}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:bottom-auto{bottom:auto}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[110px_1fr\]{grid-template-columns:110px 1fr}.sm\:grid-cols-\[160px_160px_1fr\]{grid-template-columns:160px 160px 1fr}.sm\:grid-cols-\[160px_160px_1fr_auto\]{grid-template-columns:160px 160px 1fr auto}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}@keyframes bp-pulse{0%,to{opacity:1}50%{opacity:.3}}.pulse-dot{animation:1.6s ease-in-out infinite bp-pulse}@keyframes bp-ticker-marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.ticker-marquee-track{width:max-content;animation:bp-ticker-marquee var(--bp-ticker-duration,42s) linear infinite;will-change:transform;gap:1.5rem;display:flex}.ticker-marquee-track:hover{animation-play-state:paused}@media(prefers-reduced-motion:reduce){.ticker-marquee-track{animation:none}}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:39 27% 95%;--foreground:24 8% 10%;--card:39 27% 95%;--card-foreground:24 8% 10%;--popover:0 0% 100%;--popover-foreground:24 8% 10%;--primary:13 74% 45%;--primary-foreground:0 0% 100%;--primary-50:13 70% 96%;--primary-100:13 70% 92%;--primary-200:13 70% 85%;--primary-300:13 70% 75%;--primary-400:13 70% 65%;--primary-500:13 74% 55%;--primary-600:13 74% 45%;--primary-700:13 74% 38%;--primary-800:13 74% 30%;--primary-900:13 74% 25%;--primary-950:13 74% 18%;--secondary:21 84% 62%;--secondary-foreground:24 8% 10%;--muted:36 25% 90%;--muted-foreground:30 6% 40%;--accent:13 74% 45%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:39 24% 86%;--input:39 24% 86%;--ring:13 74% 45%;--radius:2px;--shadow-card:0 1px 2px 0 #0000000a;--shadow-card-hover:0 4px 12px -2px #00000014}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/theme-businessportal24-CDRq7Rn6.css b/public/build/web/theme-businessportal24-CDRq7Rn6.css deleted file mode 100644 index e728d646..00000000 --- a/public/build/web/theme-businessportal24-CDRq7Rn6.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", "Söhne", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e5e0d5;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1c1a17;--color-bg-dark:#14202e;--color-bg-card:#fff;--color-bg-card-warm:#f1ece2;--color-bg-card-warm-border:#d9cdb6;--color-bg-card-warm-hover:#ece5d5;--color-bg-card-warm-rule:#c8bda8;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a1f26;--color-topbar2:#232a33;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#ff8b6f;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1c1a17;--color-ink-2:#3d3935;--color-ink-3:#6e6862;--color-ink-4:#9a958d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b8b3aa;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#8a847b;--color-ink-on-dark-rule:#2a2723;--color-brand:#c84a1e;--color-brand-deep:#a23814;--color-brand-soft:#f4e5dd;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#e03a1a;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#6e6862;--color-card-warm-title:#3a332b;--color-feature-line:#a8c8a8;--color-feature-dot:#c4dcc4;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e8e4da}h1,h2,h3,h4{font-family:var(--font-serif);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#ff8b6f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #ff8b6f80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.12em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:600}.eyebrow.muted{color:var(--color-ink-3)}.eyebrow.on-dark{color:var(--color-accent-warm)}.bp-cat{letter-spacing:.14em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:700}.bp-tag{letter-spacing:.08em;text-transform:uppercase;background:var(--color-brand);color:#fff;border-radius:2px;align-items:center;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.bg-feature-grad{background-image:linear-gradient(135deg,#2a3a2a,#1a2a1a)}.bg-hero-grad{background-image:linear-gradient(135deg,#2a3a4a,#1a1f26)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1c1a1733}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#c84a1e33}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#c84a1e40}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#c84a1e4d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#c84a1e66}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1c1a174d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#c84a1e0a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#c84a1e0f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1c1a17b3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1c1a1766}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#c84a1e66}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1c1a174d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#c84a1e80}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}@keyframes bp-pulse{0%,to{opacity:1}50%{opacity:.3}}.pulse-dot{animation:1.6s ease-in-out infinite bp-pulse}@keyframes bp-ticker-marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.ticker-marquee-track{width:max-content;animation:bp-ticker-marquee var(--bp-ticker-duration,42s) linear infinite;will-change:transform;gap:1.5rem;display:flex}.ticker-marquee-track:hover{animation-play-state:paused}@media(prefers-reduced-motion:reduce){.ticker-marquee-track{animation:none}}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:39 27% 95%;--foreground:24 8% 10%;--card:39 27% 95%;--card-foreground:24 8% 10%;--popover:0 0% 100%;--popover-foreground:24 8% 10%;--primary:13 74% 45%;--primary-foreground:0 0% 100%;--primary-50:13 70% 96%;--primary-100:13 70% 92%;--primary-200:13 70% 85%;--primary-300:13 70% 75%;--primary-400:13 70% 65%;--primary-500:13 74% 55%;--primary-600:13 74% 45%;--primary-700:13 74% 38%;--primary-800:13 74% 30%;--primary-900:13 74% 25%;--primary-950:13 74% 18%;--secondary:21 84% 62%;--secondary-foreground:24 8% 10%;--muted:36 25% 90%;--muted-foreground:30 6% 40%;--accent:13 74% 45%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:39 24% 86%;--input:39 24% 86%;--ring:13 74% 45%;--radius:2px;--shadow-card:0 1px 2px 0 #0000000a;--shadow-card-hover:0 4px 12px -2px #00000014}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/theme-presseecho-Bt5lIQm5.css b/public/build/web/theme-presseecho-Bt5lIQm5.css new file mode 100644 index 00000000..e35cdda5 --- /dev/null +++ b/public/build/web/theme-presseecho-Bt5lIQm5.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", "Söhne", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f2f4ed;--color-bg-elev:#fafbf7;--color-bg-rule:#dde2d3;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1b2417;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#ecefe3;--color-bg-card-warm-border:#c7cfb6;--color-bg-card-warm-hover:#dde3cc;--color-bg-card-warm-rule:#b7c0a2;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#112d20;--color-topbar2:#081b13;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#e8a95f;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1b2417;--color-ink-2:#324132;--color-ink-3:#6a7766;--color-ink-4:#98a294;--color-ink-on-dark:#f0f4eb;--color-ink-on-dark-2:#b1b9ab;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#859485;--color-ink-on-dark-rule:#28332b;--color-brand:#345636;--color-brand-deep:#243c25;--color-brand-soft:#dbe7d3;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#e03a1a;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5f6a52;--color-card-warm-title:#2e3826;--color-feature-line:#a8c8a8;--color-feature-dot:#c4dcc4;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e6e8de}h1,h2,h3,h4{font-family:var(--font-serif);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#e8a95f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #e8a95f80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f1ecdd;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.12em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:600}.eyebrow.muted{color:var(--color-ink-3)}.eyebrow.on-dark{color:var(--color-accent-warm)}.bp-cat{letter-spacing:.14em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:700}.bp-tag{letter-spacing:.08em;text-transform:uppercase;background:var(--color-brand);color:#fff;border-radius:2px;align-items:center;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.bg-feature-grad{background-image:linear-gradient(135deg,#2c4733,#15281c)}.bg-hero-grad{background-image:linear-gradient(135deg,#2c4733,#1a2a1f)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[65px\]{min-height:65px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1b241733}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#34563633}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#34563640}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#3456364d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#34563666}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1b24174d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#3456360a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#3456360f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1b2417b3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#34563666}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-\[color\:var\(--color-hub\)\]{accent-color:var(--color-hub)}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1b24174d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#34563680}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fafbf799}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-2{top:calc(var(--spacing) * 2)}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:top-full{top:100%}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:bottom-auto{bottom:auto}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[110px_1fr\]{grid-template-columns:110px 1fr}.sm\:grid-cols-\[160px_160px_1fr\]{grid-template-columns:160px 160px 1fr}.sm\:grid-cols-\[160px_160px_1fr_auto\]{grid-template-columns:160px 160px 1fr auto}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}@keyframes bp-pulse{0%,to{opacity:1}50%{opacity:.3}}.pulse-dot{animation:1.6s ease-in-out infinite bp-pulse}@keyframes bp-ticker-marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.ticker-marquee-track{width:max-content;animation:bp-ticker-marquee var(--bp-ticker-duration,42s) linear infinite;will-change:transform;gap:1.5rem;display:flex}.ticker-marquee-track:hover{animation-play-state:paused}@media(prefers-reduced-motion:reduce){.ticker-marquee-track{animation:none}}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:87 22% 94%;--foreground:90 28% 12%;--card:87 22% 94%;--card-foreground:90 28% 12%;--popover:0 0% 100%;--popover-foreground:90 28% 12%;--primary:124 24% 27%;--primary-foreground:0 0% 100%;--primary-50:124 24% 96%;--primary-100:124 24% 92%;--primary-200:124 24% 85%;--primary-300:124 24% 75%;--primary-400:124 24% 65%;--primary-500:124 24% 55%;--primary-600:124 24% 48%;--primary-700:124 24% 40%;--primary-800:124 24% 32%;--primary-900:124 24% 25%;--primary-950:124 24% 18%;--secondary:130 15% 49%;--secondary-foreground:90 28% 12%;--muted:90 10% 90%;--muted-foreground:90 8% 38%;--accent:124 24% 27%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:90 16% 84%;--input:90 16% 84%;--ring:124 24% 27%;--radius:2px;--shadow-card:0 1px 2px 0 #0000000a;--shadow-card-hover:0 4px 12px -2px #00000014}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/theme-presseecho-hPNcGgVd.css b/public/build/web/theme-presseecho-hPNcGgVd.css deleted file mode 100644 index 7f3a9ff3..00000000 --- a/public/build/web/theme-presseecho-hPNcGgVd.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", "Söhne", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f2f4ed;--color-bg-elev:#fafbf7;--color-bg-rule:#dde2d3;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1b2417;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#ecefe3;--color-bg-card-warm-border:#c7cfb6;--color-bg-card-warm-hover:#dde3cc;--color-bg-card-warm-rule:#b7c0a2;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#112d20;--color-topbar2:#081b13;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#e8a95f;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1b2417;--color-ink-2:#324132;--color-ink-3:#6a7766;--color-ink-4:#98a294;--color-ink-on-dark:#f0f4eb;--color-ink-on-dark-2:#b1b9ab;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#859485;--color-ink-on-dark-rule:#28332b;--color-brand:#345636;--color-brand-deep:#243c25;--color-brand-soft:#dbe7d3;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#e03a1a;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5f6a52;--color-card-warm-title:#2e3826;--color-feature-line:#a8c8a8;--color-feature-dot:#c4dcc4;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e6e8de}h1,h2,h3,h4{font-family:var(--font-serif);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:10px;font-size:10.5px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:30px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#e8a95f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #e8a95f80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f1ecdd;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.12em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:600}.eyebrow.muted{color:var(--color-ink-3)}.eyebrow.on-dark{color:var(--color-accent-warm)}.bp-cat{letter-spacing:.14em;text-transform:uppercase;color:var(--color-brand);font-size:11px;font-weight:700}.bp-tag{letter-spacing:.08em;text-transform:uppercase;background:var(--color-brand);color:#fff;border-radius:2px;align-items:center;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.bg-feature-grad{background-image:linear-gradient(135deg,#2c4733,#15281c)}.bg-hero-grad{background-image:linear-gradient(135deg,#2c4733,#1a2a1f)}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1b241733}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#34563633}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#34563640}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#3456364d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#34563666}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1b24174d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#3456360a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#3456360f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1b2417b3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1b241766}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#34563666}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1b24174d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#34563680}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fafbf799}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}@keyframes bp-pulse{0%,to{opacity:1}50%{opacity:.3}}.pulse-dot{animation:1.6s ease-in-out infinite bp-pulse}@keyframes bp-ticker-marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.ticker-marquee-track{width:max-content;animation:bp-ticker-marquee var(--bp-ticker-duration,42s) linear infinite;will-change:transform;gap:1.5rem;display:flex}.ticker-marquee-track:hover{animation-play-state:paused}@media(prefers-reduced-motion:reduce){.ticker-marquee-track{animation:none}}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:87 22% 94%;--foreground:90 28% 12%;--card:87 22% 94%;--card-foreground:90 28% 12%;--popover:0 0% 100%;--popover-foreground:90 28% 12%;--primary:124 24% 27%;--primary-foreground:0 0% 100%;--primary-50:124 24% 96%;--primary-100:124 24% 92%;--primary-200:124 24% 85%;--primary-300:124 24% 75%;--primary-400:124 24% 65%;--primary-500:124 24% 55%;--primary-600:124 24% 48%;--primary-700:124 24% 40%;--primary-800:124 24% 32%;--primary-900:124 24% 25%;--primary-950:124 24% 18%;--secondary:130 15% 49%;--secondary-foreground:90 28% 12%;--muted:90 10% 90%;--muted-foreground:90 8% 38%;--accent:124 24% 27%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:90 16% 84%;--input:90 16% 84%;--ring:124 24% 27%;--radius:2px;--shadow-card:0 1px 2px 0 #0000000a;--shadow-card-hover:0 4px 12px -2px #00000014}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/theme-pressekonto-BNifjlS-.css b/public/build/web/theme-pressekonto-BNifjlS-.css deleted file mode 100644 index c05fcf41..00000000 --- a/public/build/web/theme-pressekonto-BNifjlS-.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e2ddd0;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1a1f1c;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#efeadc;--color-bg-card-warm-border:#d6cfbb;--color-bg-card-warm-hover:#e6deca;--color-bg-card-warm-rule:#c8bda3;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a2540;--color-topbar2:#243152;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#b07a3a;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1a1f1c;--color-ink-2:#3a413d;--color-ink-3:#5a6360;--color-ink-4:#8a918d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b2b9c7;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#7b8fbf;--color-ink-on-dark-rule:#2a3550;--color-brand:#1a2540;--color-brand-deep:#0f1729;--color-brand-soft:#e5e9f1;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#c84a1e;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5a6360;--color-card-warm-title:#2a302d;--color-feature-line:#c0c8db;--color-feature-dot:#d8dde9;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e8e4da}h1,h2,h3,h4{font-family:var(--font-sans);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #b07a3a80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.2em;text-transform:uppercase;color:var(--color-hub);font-size:11px;font-weight:700}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:12px;font-size:11px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:42px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule-hub{background:var(--color-hub);border:0;height:2px;margin:0}.hero-grid{background-image:linear-gradient(90deg,#1a25400a 1px,#0000 1px),linear-gradient(#1a25400a 1px,#0000 1px);background-position:-1px -1px;background-size:48px 48px}.bg-hub-grad{background-image:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%)}.bg-hub-grad-2{background-image:linear-gradient(180deg,var(--color-hub) 0%,var(--color-topbar-deep) 100%)}.bg-accent-grad{background-image:linear-gradient(135deg,var(--color-accent) 0%,var(--color-accent-deep) 100%)}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.ribbon-recommend{background:var(--color-hub);color:#fff;letter-spacing:.18em;text-transform:uppercase;text-align:center;padding:8px 0;font-size:10.5px;font-weight:700;position:absolute;top:-1px;left:-1px;right:-1px}details>summary{cursor:pointer;list-style:none}details>summary::-webkit-details-marker{display:none}details[open] .faq-chev{transform:rotate(180deg)}.faq-chev{transition:transform .2s}.auth-grid{pointer-events:none;background-image:linear-gradient(90deg,#1a25400b 1px,#0000 1px),linear-gradient(#1a25400b 1px,#0000 1px);background-size:56px 56px;position:absolute;top:0;right:0;bottom:0;left:0}.from-banner{border:1px solid var(--color-bg-rule);border-left:2px solid var(--color-hub);color:var(--color-ink-2);background:#fff;border-radius:4px;padding:8px 14px;font-size:12px}.auth-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:8px;padding:34px 36px 32px;box-shadow:0 1px #1a1f1c08,0 20px 50px -32px #1a254047}.eyebrow-hub{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);font-size:10.5px;font-weight:700}.link-hub{color:var(--color-hub);text-underline-offset:3px;font-weight:600;text-decoration:none}.link-hub:hover{text-decoration:underline}.field-label{color:var(--color-ink);margin-bottom:6px;font-size:12.5px;font-weight:600;display:block}.field-input{border:1px solid var(--color-bg-rule);width:100%;color:var(--color-ink);background:#fff;border-radius:6px;outline:none;padding:11px 13px;font-family:inherit;font-size:14px;transition:border-color .15s,box-shadow .15s,background .15s}.field-input::placeholder{color:var(--color-ink-4)}.field-input:hover{border-color:#cfc8b5}.field-input:focus{border-color:var(--color-hub);box-shadow:0 0 0 3px #1a25401a}.field-input[aria-invalid=true],.field-input.is-invalid{border-color:var(--color-loss)}.field-pw-wrap{position:relative}.field-affix{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-radius:3px;padding:4px 6px;font-family:inherit;font-size:11.5px;font-weight:600;position:absolute;top:50%;right:10px;transform:translateY(-50%)}.field-affix:hover{color:var(--color-hub);background:var(--color-bg)}.auth-check{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;background:#fff;border:1.5px solid #cfc8b5;border-radius:3px;flex-shrink:0;width:16px;height:16px;margin:0;transition:border-color .12s,background .12s;position:relative}.auth-check:hover{border-color:var(--color-hub)}.auth-check:checked{background:var(--color-hub);border-color:var(--color-hub)}.auth-check:checked:before{content:"";border:1.8px solid #fff;border-width:0 1.8px 1.8px 0;width:5px;height:9px;position:absolute;top:1px;left:4px;transform:rotate(42deg)}.auth-btn-primary{background:var(--color-hub);color:#fff;cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:8px;width:100%;padding:11px 16px;font-family:inherit;font-size:14px;font-weight:600;transition:background-color .15s;display:inline-flex}.auth-btn-primary:hover{background:var(--color-hub-2)}.auth-btn-primary:disabled{opacity:.6;cursor:not-allowed}.auth-btn-outline{width:100%;color:var(--color-ink);border:1px solid var(--color-bg-rule);cursor:pointer;background:#fff;border-radius:6px;justify-content:center;align-items:center;gap:8px;padding:10px 16px;font-family:inherit;font-size:13px;font-weight:600;transition:background-color .15s,border-color .15s;display:inline-flex}.auth-btn-outline:hover{background:var(--color-bg-elev);border-color:#cfc8b5}.field-error{color:var(--color-loss);margin-top:6px;font-size:12px;line-height:1.4}.field-status{color:#2e5b32;background:#f1f6ef;border:1px solid #c8dec0;border-radius:4px;padding:10px 14px;font-size:12.5px;line-height:1.5}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1a1f1c33}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#1a25400f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1a1f1cb3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:40 30% 95%;--foreground:144 8% 11%;--card:0 0% 100%;--card-foreground:144 8% 11%;--popover:0 0% 100%;--popover-foreground:144 8% 11%;--primary:222 43% 18%;--primary-foreground:0 0% 100%;--primary-50:222 43% 96%;--primary-100:222 43% 92%;--primary-200:222 43% 85%;--primary-300:222 43% 75%;--primary-400:222 43% 60%;--primary-500:222 43% 45%;--primary-600:222 43% 36%;--primary-700:222 43% 28%;--primary-800:222 43% 22%;--primary-900:222 43% 18%;--primary-950:222 43% 12%;--secondary:224 30% 30%;--secondary-foreground:0 0% 100%;--muted:40 18% 90%;--muted-foreground:144 6% 38%;--accent:31 51% 46%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:38 23% 85%;--input:38 23% 85%;--ring:222 43% 18%;--radius:4px;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/public/build/web/theme-pressekonto-DLmUsiSS.css b/public/build/web/theme-pressekonto-DLmUsiSS.css new file mode 100644 index 00000000..17c55f8f --- /dev/null +++ b/public/build/web/theme-pressekonto-DLmUsiSS.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter Tight", Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-serif:"Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, 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-300:oklch(80.8% .114 19.571);--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-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--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-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-800:oklch(27.9% .041 260.031);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-neutral-950:oklch(14.5% 0 none);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-950:oklch(14.7% .004 49.25);--color-mauve-800:oklch(26.3% .024 320.12);--color-olive-800:oklch(28.6% .016 107.4);--color-mist-800:oklch(27.5% .011 216.9);--color-taupe-800:oklch(26.8% .011 36.5);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:3px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--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);--color-bg:#f6f4ef;--color-bg-elev:#fbfaf6;--color-bg-rule:#e2ddd0;--color-bg-rule-2:#ede7d7;--color-bg-rule-strong:#1a1f1c;--color-bg-dark:#15201a;--color-bg-card:#fff;--color-bg-card-warm:#efeadc;--color-bg-card-warm-border:#d6cfbb;--color-bg-card-warm-hover:#e6deca;--color-bg-card-warm-rule:#c8bda3;--color-hub:#1a2540;--color-hub-2:#243152;--color-hub-3:#2e3d66;--color-hub-soft:#e5e9f1;--color-hub-soft-2:#cfd6e4;--color-hub-line:#7b8fbf;--color-topbar:#1a2540;--color-topbar2:#243152;--color-topbar-deep:#0f1729;--color-accent:#b07a3a;--color-accent-deep:#8a5e27;--color-accent-soft:#f1e6d3;--color-accent-warm:#b07a3a;--color-panel-dark:#0f1729;--color-panel-dark-2:#1a2540;--color-ink:#1a1f1c;--color-ink-2:#3a413d;--color-ink-3:#5a6360;--color-ink-4:#8a918d;--color-ink-on-dark:#f6f4ef;--color-ink-on-dark-2:#b2b9c7;--color-ink-on-dark-3:#7b8fbf;--color-ink-on-dark-muted:#7b8fbf;--color-ink-on-dark-rule:#2a3550;--color-brand:#1a2540;--color-brand-deep:#0f1729;--color-brand-soft:#e5e9f1;--color-ok:#2e8540;--color-ok-soft:#e2f1e5;--color-warn:#a87a1f;--color-warn-soft:#f6eac8;--color-err:#a8331f;--color-err-soft:#f4dad2;--color-live:#c84a1e;--color-gain:#2e8540;--color-gain-deep:#1f5e2e;--color-loss:#c8341e;--color-card-warm-cat:#5a6360;--color-card-warm-title:#2a302d;--color-feature-line:#c0c8db;--color-feature-dot:#d8dde9;--color-bridge-presseecho:#1f4d3a;--color-bridge-businessportal:#c84a1e;--container-layout:1280px;--shadow-soft:0 1px 0 #1a1f1c08;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f;--shadow-auth:0 1px 0 #1a1f1c08, 0 20px 50px -32px #1a254047;--color-warn-bg:#fff8e1;--color-warn-border:#e8c77a;--color-warn-ink:#7a5a0f;--color-warn-ink-deep:#3d2f0f;--color-verify-bg:#e8f4ec;--color-verify-border:#1b8e3a;--color-verify-ink:#0f5e26}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;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:where(:not(iframe)){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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-zinc-200,currentColor)}::file-selector-button{border-color:var(--color-zinc-200,currentColor)}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}@media(min-width:48rem){h1{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}@media(min-width:48rem){h2{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}@media(min-width:48rem){h3{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media(min-width:48rem){h4{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}@media(min-width:48rem){h5{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){h6{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}a{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));--tw-duration:.2s;transition-duration:.2s}:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}html,body{margin:0;padding:0}body{color:var(--color-ink);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-feature-settings:"ss01","cv11";background-color:#e8e4da}h1,h2,h3,h4{font-family:var(--font-sans);color:inherit;letter-spacing:-.01em}.font-mono{font-family:var(--font-mono);font-feature-settings:"tnum"}}@layer components{.panel{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-warm{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);border-radius:6px}.panel-dark{background:var(--color-panel-dark-2);border:1px solid var(--color-panel-dark);color:var(--color-ink-on-dark);border-radius:6px}.panel-head{border-bottom:1px solid var(--color-bg-rule);justify-content:space-between;align-items:center;gap:12px;padding:14px 20px;display:flex}.panel-dark .panel-head{border-bottom-color:#ffffff1a}.page-header{align-items:end;gap:20px;display:grid}@media(min-width:1024px){.page-header{grid-template-columns:1fr auto;gap:32px}}.page-header>.flex{flex-wrap:wrap}.pr-content{color:var(--color-ink);font-size:14.5px;line-height:1.7}.pr-content p{margin:0 0 1em}.pr-content p:last-child{margin-bottom:0}.pr-content h2,.pr-content h3,.pr-content h4{color:var(--color-ink);letter-spacing:-.2px;margin:1.6em 0 .6em;font-weight:700;line-height:1.3}.pr-content h2{font-size:19px}.pr-content h3{font-size:16.5px}.pr-content h4{font-size:15px}.pr-content h2:first-child,.pr-content h3:first-child,.pr-content h4:first-child{margin-top:0}.pr-content ul,.pr-content ol{margin:0 0 1em;padding-inline-start:1.4em}.pr-content ul{list-style:outside}.pr-content ol{list-style:decimal}.pr-content li{margin:.3em 0}.pr-content a{color:var(--color-hub);text-underline-offset:2px;text-decoration:underline}.pr-content strong,.pr-content b{color:var(--color-ink);font-weight:700}.pr-content blockquote{border-left:3px solid var(--color-hub-soft-2);color:var(--color-ink-2);margin:1em 0;padding:.2em 0 .2em 1em;font-style:italic}.pr-content hr{border:0;border-top:1px solid var(--color-bg-rule);margin:1.5em 0}.stat-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;padding:18px 20px;transition:border-color .12s,box-shadow .12s;position:relative}.stat-card .stat-strip{background:var(--color-hub-soft-2);border-radius:6px 0 0 6px;width:3px;position:absolute;top:0;bottom:0;left:0}.stat-card.is-primary .stat-strip{background:var(--color-hub)}.stat-card.is-ok .stat-strip{background:var(--color-ok)}.stat-card.is-warn .stat-strip{background:var(--color-warn)}.stat-card.is-muted .stat-strip{background:var(--color-ink-4)}.stat-label{letter-spacing:.16em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:700}.stat-card.is-primary .stat-label{color:var(--color-hub)}.stat-card.is-ok .stat-label{color:var(--color-ok)}.stat-card.is-warn .stat-label{color:var(--color-warn)}.stat-card.is-muted .stat-label{color:var(--color-ink-4)}.stat-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.5px;overflow-wrap:anywhere;margin-top:14px;font-size:36px;font-weight:600;line-height:1.05}@media(max-width:480px){.stat-num{font-size:26px}}.stat-card.is-ok .stat-num{color:var(--color-ok)}.stat-card.is-warn .stat-num{color:var(--color-warn)}.stat-card.is-muted .stat-num{color:var(--color-ink-3)}.stat-meta{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-3);font-size:10.5px;font-weight:600}.stat-trend{color:var(--color-ink-3);align-items:center;gap:8px;margin-top:12px;font-size:11.5px;display:flex}.hint-card{background:var(--color-bg-card-warm);border:1px solid var(--color-bg-rule);border-left:3px solid var(--color-accent-warm);border-radius:5px;grid-template-columns:auto 1fr;align-items:start;gap:14px;padding:16px 18px;display:grid}.hint-card .hint-ico{background:var(--color-accent-soft);width:36px;height:36px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.hint-card .hint-bar{background:var(--color-bg-rule-2);border-radius:999px;width:100%;height:4px;margin-top:8px;overflow:hidden}.hint-card .hint-bar>span{background:var(--color-accent-warm);border-radius:999px;height:100%;display:block}.hint-card .hint-action{color:var(--color-accent-deep);text-underline-offset:3px;align-items:center;gap:4px;margin-top:8px;font-size:11.5px;font-weight:600;text-decoration:none;display:inline-flex}.hint-card .hint-action:hover{-webkit-text-decoration:underline oklab(51.8288% .0322685 .0849697/.4);text-decoration:underline oklab(51.8288% .0322685 .0849697/.4)}@supports (color:color-mix(in lab,red,red)){.hint-card .hint-action:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%);text-decoration-color:color-mix(in oklab,var(--color-accent-deep),transparent 60%)}}.badge{letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:10.5px;font-weight:700;display:inline-flex}.badge.warn{background:var(--color-warn-soft);color:var(--color-accent-deep)}.badge.ok{background:var(--color-ok-soft);color:var(--color-gain-deep)}.badge.hub{background:var(--color-hub-soft);color:var(--color-hub)}.badge.err{background:var(--color-err-soft);color:var(--color-loss)}.badge.muted{background:var(--color-bg-rule-2);color:var(--color-ink-3)}.badge.dot:before{content:"";background:currentColor;border-radius:999px;width:6px;height:6px}.bridge-row{font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.dot-pe{background:var(--color-bridge-presseecho);border-radius:999px;width:6px;height:6px}.dot-bp{background:var(--color-bridge-businessportal);border-radius:999px;width:6px;height:6px}.counter-strip{flex-wrap:wrap;align-items:center;gap:14px;padding:6px 0;display:inline-flex}.counter-strip .seg{color:var(--color-ink-2);align-items:baseline;gap:6px;font-size:12.5px;display:inline-flex}.counter-strip .seg b{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);letter-spacing:-.2px;font-size:13.5px;font-weight:600}.counter-strip .seg.is-ok b{color:var(--color-gain-deep)}.counter-strip .seg.is-warn b{color:var(--color-accent-deep)}.counter-strip .seg.is-err b{color:var(--color-loss)}.counter-strip .seg.is-muted b{color:var(--color-ink-3)}.counter-strip .sep{background:var(--color-bg-rule);width:1px;height:11px}.view-tabs{border-bottom:1px solid var(--color-bg-rule);align-items:center;gap:4px;display:flex}.view-tab{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:8px;margin-bottom:-1px;padding:7px 12px 9px;font-size:12.5px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex}.view-tab:hover{color:var(--color-hub)}.view-tab.is-active{color:var(--color-hub);border-bottom-color:var(--color-hub);font-weight:600}.view-tab .cnt{font-family:var(--font-mono);color:var(--color-ink-3);background:var(--color-bg-rule-2);letter-spacing:.04em;border-radius:999px;padding:1px 6px;font-size:10.5px;font-weight:600}.view-tab.is-active .cnt{background:var(--color-hub);color:var(--color-ink-on-dark)}.filter-chip{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);color:var(--color-hub);white-space:nowrap;cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:6px 12px 6px 14px;font-size:12.5px;font-weight:500;transition:border-color .15s,background .15s;display:inline-flex}.filter-chip:hover{border-color:var(--color-hub);background:var(--color-bg-elev)}.filter-chip.is-active{background:var(--color-hub);color:var(--color-ink-on-dark);border-color:var(--color-hub)}.filter-chip.is-active:hover{background:var(--color-hub-2)}.filter-chip .caret{opacity:.55}.search-wrap{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;flex:240px;align-items:center;gap:7px;padding:6px 12px;transition:border-color .15s;display:flex}.search-wrap:focus-within{border-color:var(--color-hub)}.search-wrap .ico{color:var(--color-ink-3);flex-shrink:0}.search-wrap input{min-width:0;color:var(--color-ink);background:0 0;border:0;outline:none;flex:1;padding:0;font-size:12.5px}.search-wrap input::placeholder{color:var(--color-ink-3)}.active-chip{background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);border-radius:999px;align-items:center;gap:7px;padding:4px 6px 4px 11px;font-size:11.5px;font-weight:500;display:inline-flex}.active-chip strong{color:var(--color-hub);font-weight:600}.active-chip .x{width:16px;height:16px;color:var(--color-ink-3);background:var(--color-bg-rule-2);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;transition:background .12s,color .12s;display:inline-flex}.active-chip .x:hover{background:var(--color-hub);color:var(--color-ink-on-dark)}.portal-pill{letter-spacing:.06em;background:var(--color-bg-elev);border:1px solid var(--color-bg-rule);color:var(--color-ink-2);white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:3px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.portal-pill .pdot{border-radius:999px;width:6px;height:6px}.portal-pill.pe .pdot{background:var(--color-bridge-presseecho)}.portal-pill.bp .pdot{background:var(--color-bridge-businessportal)}.inline-action{color:var(--color-hub);cursor:pointer;background:0 0;border:1px dashed #0000;border-radius:3px;align-items:center;gap:4px;margin-left:4px;padding:3px 6px;font-size:11px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.inline-action:hover{background:var(--color-hub-soft);border-color:var(--color-hub-soft-2)}.inline-action.warn{color:var(--color-accent-deep)}.inline-action.warn:hover{background:var(--color-warn-soft);border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.inline-action.warn:hover{border-color:color-mix(in oklab,var(--color-warn),transparent 60%)}}.inline-action.err{color:var(--color-loss)}.inline-action.err:hover{background:var(--color-err-soft);border-color:#a8331f66}@supports (color:color-mix(in lab,red,red)){.inline-action.err:hover{border-color:color-mix(in oklab,var(--color-err),transparent 60%)}}.is-row-warn:hover,tr.is-row-warn:hover td{background:#fbf5e4!important}@supports (color:color-mix(in lab,red,red)){.is-row-warn:hover,tr.is-row-warn:hover td{background:color-mix(in oklab,var(--color-warn-soft),var(--color-bg-card) 50%)!important}}.is-row-err:hover,tr.is-row-err:hover td{background:#faece8!important}@supports (color:color-mix(in lab,red,red)){.is-row-err:hover,tr.is-row-err:hover td{background:color-mix(in oklab,var(--color-err-soft),var(--color-bg-card) 50%)!important}}.empty-stage{text-align:center;flex-direction:column;align-items:center;padding:64px 24px;display:flex}.empty-stage .empty-ico{background:var(--color-hub-soft);border:1px solid var(--color-hub-soft-2);width:64px;height:64px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:20px;display:flex}.empty-stage .empty-ico.warm{background:var(--color-accent-soft);border-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.warm{border-color:color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.empty-stage .empty-ico.warm{color:var(--color-accent-deep)}.empty-stage .empty-ico.err{background:var(--color-err-soft);border-color:#a8331f80}@supports (color:color-mix(in lab,red,red)){.empty-stage .empty-ico.err{border-color:color-mix(in oklab,var(--color-err),transparent 50%)}}.empty-stage .empty-ico.err{color:var(--color-loss)}.empty-stage .empty-title{color:var(--color-ink);letter-spacing:-.2px;margin:0;font-size:17px;font-weight:600}.empty-stage .empty-sub{color:var(--color-ink-3);max-width:440px;margin:8px 0 0;font-size:13px;line-height:1.55}.seg-toggle{background:var(--color-bg-card);border:1px solid var(--color-hub-soft-2);border-radius:4px;gap:0;padding:2px;display:inline-flex}.seg-toggle button{color:var(--color-ink-3);cursor:pointer;border-radius:3px;align-items:center;gap:6px;padding:5px 11px;font-size:12px;font-weight:600;transition:background .12s,color .12s;display:inline-flex}.seg-toggle button:hover{color:var(--color-hub)}.seg-toggle button.is-active{background:var(--color-hub);color:#fff}.seg-toggle button svg{opacity:.7}.seg-toggle button.is-active svg{opacity:1}.firm-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:6px;flex-direction:column;gap:14px;min-height:266px;padding:18px;transition:border-color .15s;display:flex}.firm-card:hover{border-color:var(--color-hub-line)}.firm-card.is-self{border-color:var(--color-bg-rule);box-shadow:none}.firm-card .logo{width:56px;height:56px;font-family:var(--font-mono);letter-spacing:-.5px;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;font-weight:700;display:flex;overflow:hidden}.firm-card .logo img{object-fit:cover;width:100%;height:100%}.firm-card .name{letter-spacing:-.3px;color:var(--color-ink);margin:0;font-size:16px;font-weight:700;line-height:1.2}.firm-card .meta-line{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.firm-card .kpis{border-top:1px solid var(--color-bg-rule-2);grid-template-columns:repeat(3,1fr);gap:0;margin-top:auto;padding-top:11px;display:grid}.firm-card .kpi{border-right:1px solid var(--color-bg-rule-2);flex-direction:column;gap:2px;padding:0 4px;display:flex}.firm-card .kpi:last-child{border-right:0}.firm-card .kpi .k{font-family:var(--font-mono);color:var(--color-ink);font-variant-numeric:tabular-nums;letter-spacing:-.3px;font-size:15.5px;font-weight:600;line-height:1.1}.firm-card .kpi .l{letter-spacing:.14em;text-transform:uppercase;color:var(--color-ink-4);font-size:10px;font-weight:700}.role-pill{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-3);letter-spacing:.04em;border-radius:99px;align-items:center;gap:5px;padding:2px 8px 2px 7px;font-size:10.5px;font-weight:600;display:inline-flex}.role-pill:before{content:"";background:var(--color-accent-warm);border-radius:99px;width:5px;height:5px}.role-pill.admin{color:var(--color-hub)}.role-pill.admin:before{background:var(--color-hub)}.mini-logo{width:30px;height:30px;font-family:var(--font-mono);letter-spacing:-.3px;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex;overflow:hidden}.mini-logo img{object-fit:cover;width:100%;height:100%}.lg-brew{color:var(--color-accent-soft);background:linear-gradient(135deg,#3a4d2f,#1f2e1a)}.lg-mv{background:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%);color:#fff}.lg-soft{background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px solid #b07a3a80}@supports (color:color-mix(in lab,red,red)){.lg-soft{border:1px solid color-mix(in oklab,var(--color-accent-warm),transparent 50%)}}.lg-warm{background:linear-gradient(135deg,var(--color-accent-warm) 0%,var(--color-accent-deep) 100%);color:#fff}.lg-blank{background:repeating-linear-gradient(135deg,var(--color-bg-elev) 0 6px,var(--color-bg-rule-2) 6px 12px);color:var(--color-ink-4);border:1px dashed var(--color-hub-soft-2)}.card-action{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);color:var(--color-hub);white-space:nowrap;border-radius:4px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:border-color .12s,background .12s;display:inline-flex}.card-action:hover{border-color:var(--color-hub);background:var(--color-bg)}.card-action.primary{background:var(--color-hub);color:#fff;border-color:var(--color-hub)}.card-action.primary:hover{background:var(--color-hub-2)}.menu-trigger{width:30px;height:30px;color:var(--color-ink-3);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.menu-trigger:hover{background:var(--color-bg);border-color:var(--color-hub-soft-2);color:var(--color-hub)}.page-btn{border:1px solid var(--color-hub-soft-2);background:var(--color-bg-card);min-width:30px;height:30px;color:var(--color-ink-2);font-size:12px;font-weight:600;font-family:var(--font-mono);font-variant-numeric:tabular-nums;border-radius:4px;justify-content:center;align-items:center;padding:0 9px;transition:border-color .12s,background .12s,color .12s;display:inline-flex}.page-btn:hover{border-color:var(--color-hub);color:var(--color-hub)}.page-btn.is-current{background:var(--color-hub);border-color:var(--color-hub);color:#fff}.page-btn.is-disabled{color:var(--color-ink-4);border-color:var(--color-bg-rule-2);background:var(--color-bg-elev);cursor:default}.page-btn.is-disabled:hover{color:var(--color-ink-4);border-color:var(--color-bg-rule-2)}table.list{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}table.list thead th{text-align:left;letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);background:var(--color-bg-elev);border-bottom:1px solid var(--color-bg-rule);white-space:nowrap;padding:11px 14px;font-size:10px;font-weight:700}table.list thead th:first-child{padding-left:18px}table.list thead th:last-child{padding-right:18px}table.list tbody td{border-bottom:1px solid var(--color-bg-rule-2);vertical-align:middle;padding:14px}table.list tbody td:first-child{padding-left:18px}table.list tbody td:last-child{padding-right:18px}table.list tbody tr:last-child td{border-bottom:0}table.list tbody tr{transition:background .1s}table.list tbody tr:hover{background:var(--color-bg-elev)}.row-title{color:var(--color-ink);letter-spacing:-.1px;align-items:center;gap:9px;font-size:13.5px;font-weight:600;line-height:1.35;display:inline-flex}.row-title:hover{color:var(--color-hub)}.row-sub{color:var(--color-ink-3);margin-top:3px;font-size:11.5px;line-height:1.4}.row-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-ink);font-size:13px;font-weight:600}.row-num .sub{font-family:var(--font-sans,"Inter Tight", sans-serif);color:var(--color-ink-4);letter-spacing:.02em;margin-left:4px;font-size:11px;font-weight:400}.add-tile{border:1.5px dashed var(--color-hub-soft-2);background:var(--color-bg-elev);text-align:center;cursor:pointer;min-height:266px;color:var(--color-ink-2);border-radius:6px;flex-direction:column;justify-content:center;align-items:center;padding:24px;transition:border-color .15s,background .15s,color .15s;display:flex}.add-tile:hover{border-color:var(--color-hub);background:var(--color-bg-card);color:var(--color-hub);border-style:solid}.add-tile .ico{background:var(--color-hub-soft);width:48px;height:48px;color:var(--color-hub);border-radius:6px;justify-content:center;align-items:center;margin-bottom:14px;display:flex}.add-tile:hover .ico{background:var(--color-hub);color:#fff}.add-tile .lbl{font-size:14px;font-weight:600}.add-tile .sub{color:var(--color-ink-3);max-width:200px;margin-top:6px;font-size:11.5px;line-height:1.5}.pr-editor-shell{container:pr-editor/inline-size}.pr-editor-layout{grid-template-columns:minmax(0,1fr)}@container pr-editor (min-width:960px){.pr-editor-layout{grid-template-columns:minmax(0,1fr) 360px}.pr-editor-side{position:sticky;top:1rem}}.pr-form-label{letter-spacing:.18em;text-transform:uppercase;color:var(--color-ink-3);align-items:center;gap:8px;margin-bottom:8px;font-size:10.5px;font-weight:700;display:flex}.pr-form-label .req{color:var(--color-err);letter-spacing:0;font-weight:700}.pr-form-help{color:var(--color-ink-4);margin-top:6px;font-size:11.5px;line-height:1.5}.pr-form-help.warn{color:var(--color-warn)}.pr-meter{font-family:var(--font-mono,ui-monospace, monospace);color:var(--color-ink-3);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:10.5px;display:inline-flex}.pr-meter .bar{background:var(--color-bg-rule-2);border-radius:99px;width:60px;height:4px;position:relative;overflow:hidden}.pr-meter .bar i{background:var(--color-hub);border-radius:99px;position:absolute;inset:0 auto 0 0}.pr-meter.good .bar i{background:var(--color-ok)}.pr-meter.warn .bar i{background:var(--color-warn)}.pr-meter.err .bar i{background:var(--color-err)}.pr-bald-badge{letter-spacing:.14em;text-transform:uppercase;background:var(--color-accent-soft);color:var(--color-accent-deep);border:1px dashed #b07a3a99;border-radius:99px;align-items:center;gap:5px;padding:2px 8px;font-size:9.5px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pr-bald-badge{border:1px dashed color-mix(in srgb,var(--color-accent) 60%,transparent)}}.pr-bald-badge:before{content:"";background:var(--color-accent);border-radius:99px;width:4px;height:4px}.pr-ai-hint{background:#f3ecde;align-items:center;gap:9px;padding:8px 11px;display:flex}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{background:color-mix(in srgb,var(--color-accent-soft) 60%,var(--color-bg))}}.pr-ai-hint{border:1px dashed #b07a3a80}@supports (color:color-mix(in lab,red,red)){.pr-ai-hint{border:1px dashed color-mix(in srgb,var(--color-accent) 50%,transparent)}}.pr-ai-hint{color:var(--color-accent-deep);border-radius:4px;font-size:11.5px;line-height:1.45}.pr-ai-hint .ico{background:var(--color-accent-soft);width:22px;height:22px;color:var(--color-accent-deep);border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;display:flex}.pr-check-row{align-items:flex-start;gap:10px;padding:7px 0;font-size:12.5px;display:flex}.pr-check-row .ic{border-radius:99px;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;margin-top:1px;display:inline-flex}.pr-check-row.ok .ic{background:var(--color-ok-soft);color:var(--color-ok)}.pr-check-row.warn .ic{background:var(--color-warn-soft);color:var(--color-warn)}.pr-check-row.err .ic{background:var(--color-err-soft);color:var(--color-err)}.pr-check-row .lbl{color:var(--color-ink);flex:1;line-height:1.4}.pr-check-row .lbl .sub{color:var(--color-ink-3);margin-top:1px;font-size:11px;display:block}.pr-error-summary{background:var(--color-err-soft);border:1px solid #a8331f73}@supports (color:color-mix(in lab,red,red)){.pr-error-summary{border:1px solid color-mix(in srgb,var(--color-err) 45%,transparent)}}.pr-error-summary{border-radius:4px;margin-bottom:14px;padding:12px 14px}.pr-error-summary .head{color:var(--color-err);align-items:center;gap:7px;font-size:12.5px;font-weight:600;display:flex}.pr-error-summary ul{gap:5px;margin:8px 0 0;padding:0;list-style:none;display:grid}.pr-error-summary li button{text-align:left;width:100%;color:var(--color-err);cursor:pointer;text-underline-offset:3px;background:0 0;border:0;padding:0;font-size:12px;line-height:1.45;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;display:block}.pr-error-summary li button:hover{text-decoration-style:solid}.panel.is-invalid{border-color:var(--color-err);box-shadow:0 0 0 1px var(--color-err) inset}.panel.is-invalid>.panel-head{border-bottom-color:#a8331f59}@supports (color:color-mix(in lab,red,red)){.panel.is-invalid>.panel-head{border-bottom-color:color-mix(in srgb,var(--color-err) 35%,transparent)}}.panel.is-invalid>.panel-head{background:var(--color-err-soft)}.pr-boiler{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);font-family:var(--font-serif,Georgia, serif);color:var(--color-ink-2);border-radius:5px;padding:14px 16px;font-size:13.5px;line-height:1.6}.pr-tag-chip{background:var(--color-hub-soft);color:var(--color-hub);border-radius:3px;align-items:center;gap:5px;padding:3px 4px 3px 9px;font-size:11.5px;font-weight:500;display:inline-flex}.pr-tag-chip .x{width:16px;height:16px;color:var(--color-hub);cursor:pointer;border-radius:2px;justify-content:center;align-items:center;transition:background .12s;display:inline-flex}.pr-tag-chip .x:hover{background:var(--color-hub-soft-2)}.pr-tag-suggest{background:var(--color-bg-elev);border:1px dashed var(--color-hub-soft-2);color:var(--color-ink-2);cursor:pointer;border-radius:3px;padding:3px 9px;font-size:11.5px;font-weight:500;transition:border-color .12s,background .12s,color .12s}.pr-tag-suggest:hover{border-style:solid;border-color:var(--color-hub);background:var(--color-hub-soft);color:var(--color-hub)}.pr-pub-opt{border:1px solid var(--color-bg-rule);background:var(--color-bg-elev);cursor:pointer;border-radius:4px;align-items:flex-start;gap:10px;padding:8px 12px;transition:border-color .12s,background .12s;display:flex}.pr-pub-opt:hover{border-color:var(--color-hub)}.pr-pub-opt.is-checked{border-color:var(--color-hub);background:var(--color-hub-soft);box-shadow:inset 0 0 0 1px var(--color-hub)}.pr-pub-opt.is-disabled{opacity:.7;cursor:not-allowed}.pr-pub-opt .dot-out{border:2px solid var(--color-ink-4);border-radius:99px;flex-shrink:0;width:14px;height:14px;margin-top:2px;position:relative}.pr-pub-opt.is-checked .dot-out{border-color:var(--color-hub);background:var(--color-hub)}.pr-pub-opt.is-checked .dot-out:after{content:"";background:#fff;border-radius:99px;position:absolute;top:3px;right:3px;bottom:3px;left:3px}.pm-body>p{font-family:var(--font-serif);color:var(--color-ink);text-wrap:pretty;margin:0 0 18px;font-size:17px;line-height:1.65}.pm-body>h2{font-family:var(--font-serif);letter-spacing:-.3px;color:var(--color-ink);margin:32px 0 14px;font-size:22px;font-weight:600;line-height:1.25}.pm-body>h3{font-family:var(--font-serif);color:var(--color-ink);margin:26px 0 10px;font-size:18px;font-weight:600;line-height:1.3}.pm-body>ul,.pm-body>ol{font-family:var(--font-serif);color:var(--color-ink);margin:0 0 18px;padding-left:1.4em;font-size:17px;line-height:1.65}.pm-body>ul{list-style:outside}.pm-body>ol{list-style:decimal}.pm-body li{margin-bottom:6px}.pm-body blockquote{border-left:3px solid var(--color-brand);margin:28px 0;padding-left:24px}.pm-body blockquote p{font-family:var(--font-serif);letter-spacing:-.2px;color:var(--color-ink);text-wrap:balance;margin:0 0 12px;font-size:21px;font-style:italic;font-weight:500;line-height:1.4}.pm-body a{color:var(--color-brand);text-underline-offset:2px;text-decoration:underline}.pm-body strong{font-weight:600}.pm-body>table{border-collapse:collapse;width:100%;color:var(--color-ink);margin:0 0 18px;font-size:14.5px;line-height:1.5}.pm-body>table th,.pm-body>table td{border-bottom:1px solid var(--color-bg-rule);text-align:left;vertical-align:top;padding:10px 12px 10px 0}.pm-body>table thead th{font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--color-ink-3);border-bottom:1px solid var(--color-bg-rule-strong);font-size:10.5px;font-weight:600}.pm-body>table tbody th{font-weight:600}.btn{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus-visible{--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);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn-primary{border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);--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);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;justify-content:center;align-items:center;transition-duration:.3s;display:inline-flex}@media(hover:hover){.btn-primary:hover{--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)}}.btn-primary{background-image:linear-gradient(to right,hsl(var(--primary)),hsl(var(--secondary)))}.btn-primary:hover{background-image:linear-gradient(to right,hsl(var(--primary) / .9),hsl(var(--secondary) / .9))}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-300);background-color:var(--color-white);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-zinc-700);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-50)}}@media(prefers-color-scheme:dark){.btn-secondary{border-color:var(--color-zinc-700);background-color:var(--color-zinc-800);color:var(--color-zinc-300)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-zinc-700)}}}.card{border-radius:var(--radius-xl);border-style:var(--tw-border-style);background-color:var(--color-white);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-width:1px;transition-duration:.3s}@media(prefers-color-scheme:dark){.card{background-color:var(--color-zinc-900)}}.card{border-color:hsl(var(--border));box-shadow:var(--shadow-card)}.dark .card{border-color:hsl(var(--border) / .1);box-shadow:var(--shadow-card)}.card:hover{box-shadow:var(--shadow-card-hover)}@media(hover:hover){.card-hover:hover{scale:1.02}}.card-hover:hover{border-color:hsl(var(--primary) / .3)}.shadow-card{box-shadow:var(--shadow-card)}.shadow-card-hover{box-shadow:var(--shadow-card-hover)}.badge{align-items:center;gap:var(--spacing);padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:3.40282e38px;transition-duration:.2s;display:inline-flex}.badge-primary{border-style:var(--tw-border-style);background-color:hsl(var(--primary) / .1);color:hsl(var(--primary));border-width:1px;border-color:hsl(var(--primary) / .2)}.badge-secondary{border-style:var(--tw-border-style);color:var(--color-zinc-700);border-width:1px}@media(prefers-color-scheme:dark){.badge-secondary{color:var(--color-zinc-300)}}.badge-secondary{background-color:hsl(var(--secondary) / .1);border-color:hsl(var(--secondary) / .2)}.input-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-zinc-900);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-width:1px;transition-duration:.2s}@media(prefers-color-scheme:dark){.input-primary{background-color:var(--color-zinc-900);color:var(--color-zinc-100)}}.input-primary{border-color:hsl(var(--input))}.input-primary:focus{--tw-outline-style:none;--tw-ring-color:hsl(var(--primary));box-shadow:0 0 0 2px var(--tw-ring-color);border-color:#0000;outline-style:none}.container-custom{width:100%}@media(min-width:40rem){.container-custom{max-width:40rem}}@media(min-width:48rem){.container-custom{max-width:48rem}}@media(min-width:64rem){.container-custom{max-width:64rem}}@media(min-width:80rem){.container-custom{max-width:80rem}}@media(min-width:96rem){.container-custom{max-width:96rem}}.container-custom{padding-inline:calc(var(--spacing) * 4);margin-inline:auto}@media(min-width:40rem){.container-custom{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.container-custom{padding-inline:calc(var(--spacing) * 8)}}.section{padding-block:calc(var(--spacing) * 12)}@media(min-width:48rem){.section{padding-block:calc(var(--spacing) * 16)}}@media(min-width:64rem){.section{padding-block:calc(var(--spacing) * 20)}}.section-header{margin-bottom:calc(var(--spacing) * 8)}.section-title{margin-bottom:calc(var(--spacing) * 2);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);color:var(--color-zinc-900)}@media(min-width:48rem){.section-title{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(prefers-color-scheme:dark){.section-title{color:var(--color-zinc-100)}}.section-subtitle{color:var(--color-zinc-600)}@media(prefers-color-scheme:dark){.section-subtitle{color:var(--color-zinc-400)}}.eyebrow{letter-spacing:.2em;text-transform:uppercase;color:var(--color-hub);font-size:11px;font-weight:700}.eyebrow.muted{color:var(--color-ink-3);letter-spacing:.16em;font-size:10.5px;font-weight:600}.eyebrow.accent{color:var(--color-accent-deep)}.eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);align-items:center;gap:12px;font-size:11px;font-weight:700;display:inline-flex}.section-eyebrow:after{content:"";background:var(--color-hub);opacity:.45;width:42px;height:1px;display:block}.section-eyebrow.on-dark{color:var(--color-hub-line)}.section-eyebrow.on-dark:after{background:var(--color-hub-line);opacity:.55}.rule{background:var(--color-bg-rule);border:0;height:1px;margin:0}.rule-strong{background:var(--color-bg-rule-strong);border:0;height:1px;margin:0}.rule-hub{background:var(--color-hub);border:0;height:2px;margin:0}.hero-grid{background-image:linear-gradient(90deg,#1a25400a 1px,#0000 1px),linear-gradient(#1a25400a 1px,#0000 1px);background-position:-1px -1px;background-size:48px 48px}.bg-hub-grad{background-image:linear-gradient(135deg,var(--color-hub) 0%,var(--color-hub-2) 100%)}.bg-hub-grad-2{background-image:linear-gradient(180deg,var(--color-hub) 0%,var(--color-topbar-deep) 100%)}.bg-accent-grad{background-image:linear-gradient(135deg,var(--color-accent) 0%,var(--color-accent-deep) 100%)}.bg-topbar-grad{background-image:linear-gradient(135deg,var(--color-topbar) 0%,var(--color-topbar2) 100%)}.ribbon-recommend{background:var(--color-hub);color:#fff;letter-spacing:.18em;text-transform:uppercase;text-align:center;padding:8px 0;font-size:10.5px;font-weight:700;position:absolute;top:-1px;left:-1px;right:-1px}details>summary{cursor:pointer;list-style:none}details>summary::-webkit-details-marker{display:none}details[open] .faq-chev{transform:rotate(180deg)}.faq-chev{transition:transform .2s}.auth-grid{pointer-events:none;background-image:linear-gradient(90deg,#1a25400b 1px,#0000 1px),linear-gradient(#1a25400b 1px,#0000 1px);background-size:56px 56px;position:absolute;top:0;right:0;bottom:0;left:0}.from-banner{border:1px solid var(--color-bg-rule);border-left:2px solid var(--color-hub);color:var(--color-ink-2);background:#fff;border-radius:4px;padding:8px 14px;font-size:12px}.auth-card{background:var(--color-bg-card);border:1px solid var(--color-bg-rule);border-radius:8px;padding:34px 36px 32px;box-shadow:0 1px #1a1f1c08,0 20px 50px -32px #1a254047}.eyebrow-hub{letter-spacing:.22em;text-transform:uppercase;color:var(--color-hub);font-size:10.5px;font-weight:700}.link-hub{color:var(--color-hub);text-underline-offset:3px;font-weight:600;text-decoration:none}.link-hub:hover{text-decoration:underline}.field-label{color:var(--color-ink);margin-bottom:6px;font-size:12.5px;font-weight:600;display:block}.field-input{border:1px solid var(--color-bg-rule);width:100%;color:var(--color-ink);background:#fff;border-radius:6px;outline:none;padding:11px 13px;font-family:inherit;font-size:14px;transition:border-color .15s,box-shadow .15s,background .15s}.field-input::placeholder{color:var(--color-ink-4)}.field-input:hover{border-color:#cfc8b5}.field-input:focus{border-color:var(--color-hub);box-shadow:0 0 0 3px #1a25401a}.field-input[aria-invalid=true],.field-input.is-invalid{border-color:var(--color-loss)}.field-pw-wrap{position:relative}.field-affix{color:var(--color-ink-3);cursor:pointer;background:0 0;border:0;border-radius:3px;padding:4px 6px;font-family:inherit;font-size:11.5px;font-weight:600;position:absolute;top:50%;right:10px;transform:translateY(-50%)}.field-affix:hover{color:var(--color-hub);background:var(--color-bg)}.auth-check{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;background:#fff;border:1.5px solid #cfc8b5;border-radius:3px;flex-shrink:0;width:16px;height:16px;margin:0;transition:border-color .12s,background .12s;position:relative}.auth-check:hover{border-color:var(--color-hub)}.auth-check:checked{background:var(--color-hub);border-color:var(--color-hub)}.auth-check:checked:before{content:"";border:1.8px solid #fff;border-width:0 1.8px 1.8px 0;width:5px;height:9px;position:absolute;top:1px;left:4px;transform:rotate(42deg)}.auth-btn-primary{background:var(--color-hub);color:#fff;cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:8px;width:100%;padding:11px 16px;font-family:inherit;font-size:14px;font-weight:600;transition:background-color .15s;display:inline-flex}.auth-btn-primary:hover{background:var(--color-hub-2)}.auth-btn-primary:disabled{opacity:.6;cursor:not-allowed}.auth-btn-outline{width:100%;color:var(--color-ink);border:1px solid var(--color-bg-rule);cursor:pointer;background:#fff;border-radius:6px;justify-content:center;align-items:center;gap:8px;padding:10px 16px;font-family:inherit;font-size:13px;font-weight:600;transition:background-color .15s,border-color .15s;display:inline-flex}.auth-btn-outline:hover{background:var(--color-bg-elev);border-color:#cfc8b5}.field-error{color:var(--color-loss);margin-top:6px;font-size:12px;line-height:1.4}.field-status{color:#2e5b32;background:#f1f6ef;border:1px solid #c8dec0;border-radius:4px;padding:10px 14px;font-size:12.5px;line-height:1.5}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-\[3px\]{inset-block:3px}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.-top-3{top:calc(var(--spacing) * -3)}.-top-6{top:calc(var(--spacing) * -6)}.-top-10{top:calc(var(--spacing) * -10)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-16{top:calc(var(--spacing) * 16)}.top-\[1px\]{top:1px}.top-\[5px\]{top:5px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-3{right:calc(var(--spacing) * -3)}.-right-6{right:calc(var(--spacing) * -6)}.-right-10{right:calc(var(--spacing) * -10)}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-3{bottom:calc(var(--spacing) * -3)}.-bottom-8{bottom:calc(var(--spacing) * -8)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-8{left:calc(var(--spacing) * -8)}.-left-12{left:calc(var(--spacing) * -12)}.-left-\[26px\]{left:-26px}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-6{left:calc(var(--spacing) * 6)}.left-\[50\%\]{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.z-\[100\]{z-index:100}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing) * 2)}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-7{margin-block:calc(var(--spacing) * 7)}.my-8{margin-block:calc(var(--spacing) * 8)}.ms-1{margin-inline-start:var(--spacing)}.ms-4{margin-inline-start:calc(var(--spacing) * 4)}.me-5{margin-inline-end:calc(var(--spacing) * 5)}.\!-mt-2{margin-top:calc(var(--spacing) * -2)!important}.\!-mt-4{margin-top:calc(var(--spacing) * -4)!important}.\!mt-0{margin-top:0!important}.\!mt-2\.5{margin-top:calc(var(--spacing) * 2.5)!important}.\!mt-3{margin-top:calc(var(--spacing) * 3)!important}.\!mt-5{margin-top:calc(var(--spacing) * 5)!important}.\!mt-\[3px\]{margin-top:3px!important}.\!mt-\[18px\]{margin-top:18px!important}.\!mt-\[22px\]{margin-top:22px!important}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-4\.5{margin-top:calc(var(--spacing) * 4.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-5\.5{margin-top:calc(var(--spacing) * 5.5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-\[3px\]{margin-top:3px}.mt-\[18px\]{margin-top:18px}.mt-\[22px\]{margin-top:22px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-4{margin-right:calc(var(--spacing) * 4)}.\!mb-0{margin-bottom:0!important}.\!mb-\[14px\]{margin-bottom:14px!important}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.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-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-9{margin-bottom:calc(var(--spacing) * 9)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-\[2px\]{margin-bottom:2px}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.\!ml-7{margin-left:calc(var(--spacing) * 7)!important}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-\[42px\]{margin-left:42px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.list-item{display:list-item}.table{display:table}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[1280\/580\]{aspect-ratio:1280/580}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\!{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[11px\]{width:11px;height:11px}.size-\[12px\]{width:12px;height:12px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[16px\]{width:16px;height:16px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-80{height:calc(var(--spacing) * 80)}.h-\[1px\]{height:1px}.h-\[3px\]{height:3px}.h-\[6px\]{height:6px}.h-\[7px\]{height:7px}.h-\[14px\]{height:14px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[42px\]{height:42px}.h-\[88px\]{height:88px}.h-\[104px\]{height:104px}.h-\[120px\]{height:120px}.h-\[140px\]{height:140px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-9{max-height:calc(var(--spacing) * 9)}.max-h-16{max-height:calc(var(--spacing) * 16)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[62vh\]{max-height:62vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-\[16px\]{min-height:16px}.min-h-\[22px\]{min-height:22px}.min-h-\[34px\]{min-height:34px}.min-h-\[58px\]{min-height:58px}.min-h-\[65px\]{min-height:65px}.min-h-\[80px\]{min-height:80px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[…\]{min-height:…}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:0}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.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-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.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-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1px\]{width:1px}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[42px\]{width:42px}.w-\[46px\]{width:46px}.w-\[80px\]{width:80px}.w-\[88px\]{width:88px}.w-\[90px\]{width:90px}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[268px\]{width:268px}.w-\[320px\]{width:320px}.w-\[calc\(100vw-40px\)\]{width:calc(100vw - 40px)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-9{max-width:calc(var(--spacing) * 9)}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-36{max-width:calc(var(--spacing) * 36)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[24rem\]{max-width:24rem}.max-w-\[55vw\]{max-width:55vw}.max-w-\[70\%\]{max-width:70%}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[460px\]{max-width:460px}.max-w-\[500px\]{max-width:500px}.max-w-\[520px\]{max-width:520px}.max-w-\[540px\]{max-width:540px}.max-w-\[560px\]{max-width:560px}.max-w-\[580px\]{max-width:580px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[700px\]{max-width:700px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[820px\]{max-width:820px}.max-w-\[880px\]{max-width:880px}.max-w-\[900px\]{max-width:900px}.max-w-\[920px\]{max-width:920px}.max-w-\[980px\]{max-width:980px}.max-w-\[1280px\]{max-width:1280px}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-\[min\(92vw\,280px\)\]{max-width:min(92vw,280px)}.max-w-layout{max-width:var(--container-layout)}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[220px\]{min-width:220px}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[grid-template-columns\:minmax\(0\,max-content\)\]{grid-template-columns:minmax(0,max-content)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[1fr\,360px\]{grid-template-columns:1fr,360px}.grid-cols-\[44px_1fr\]{grid-template-columns:44px 1fr}.grid-cols-\[44px_1fr_24px\]{grid-template-columns:44px 1fr 24px}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-items-end{justify-items:end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-9{gap:calc(var(--spacing) * 9)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[18px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(18px * var(--tw-space-y-reverse));margin-block-end:calc(18px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-7{column-gap:calc(var(--spacing) * 7)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-\[18px\]{column-gap:18px}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-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-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-amber-400>:not(:last-child)){border-color:var(--color-amber-400)}:where(.divide-bg-rule>:not(:last-child)){border-color:var(--color-bg-rule)}:where(.divide-black\/10>:not(:last-child)){border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){:where(.divide-black\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.self-center{align-self:center}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[2px\]{border-top-left-radius:2px;border-top-right-radius:2px}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-\[3px\]{border-top-style:var(--tw-border-style);border-top-width:3px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-\[1\.5px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:1.5px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2A2723\]{border-color:#2a2723}.border-\[\#E1C883\]{border-color:#e1c883}.border-\[--color-border\]{border-color:--color-border}.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:#a87a1f73}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-warn\)_45\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-warn) 45%,transparent)}}.border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.border-\[color\:var\(--color-err\)\]{border-color:var(--color-err)}.border-\[color\:var\(--color-err\)\]\/30{border-color:#a8331f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-err\)\]\/30{border-color:color-mix(in oklab,var(--color-err) 30%,transparent)}}.border-\[color\:var\(--color-hub\)\]{border-color:var(--color-hub)}.border-\[color\:var\(--color-hub-soft-2\)\]{border-color:var(--color-hub-soft-2)}.border-\[color\:var\(--color-line\)\]{border-color:var(--color-line)}.border-\[color\:var\(--color-ok\)\]{border-color:var(--color-ok)}.border-\[color\:var\(--color-ok\)\]\/30{border-color:#2e85404d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-ok\)\]\/30{border-color:color-mix(in oklab,var(--color-ok) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]{border-color:var(--color-warn)}.border-\[color\:var\(--color-warn\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-\[color\:var\(--color-warn\)\]\/40{border-color:#a87a1f66}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\)\]\/40{border-color:color-mix(in oklab,var(--color-warn) 40%,transparent)}}.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-\[color\:var\(--color-warn\,\#dc2626\)\]\/30{border-color:color-mix(in oklab,var(--color-warn,#dc2626) 30%,transparent)}}.border-\[var\(--color-primary\)\]\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-primary\)\]\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-accent{border-color:var(--color-accent)}.border-accent\/30{border-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/35{border-color:#b07a3a59}@supports (color:color-mix(in lab,red,red)){.border-accent\/35{border-color:color-mix(in oklab,var(--color-accent) 35%,transparent)}}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-bg{border-color:var(--color-bg)}.border-bg-card-warm-border{border-color:var(--color-bg-card-warm-border)}.border-bg-rule{border-color:var(--color-bg-rule)}.border-bg-rule-strong{border-color:var(--color-bg-rule-strong)}.border-bg-rule-strong\/20{border-color:#1a1f1c33}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/20{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 20%,transparent)}}.border-bg-rule-strong\/40{border-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.border-bg-rule-strong\/40{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.border-black{border-color:var(--color-black)}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/40{border-color:#0006}@supports (color:color-mix(in lab,red,red)){.border-black\/40{border-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.border-black\/50{border-color:#00000080}@supports (color:color-mix(in lab,red,red)){.border-black\/50{border-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.border-brand{border-color:var(--color-brand)}.border-brand\/20{border-color:#1a254033}@supports (color:color-mix(in lab,red,red)){.border-brand\/20{border-color:color-mix(in oklab,var(--color-brand) 20%,transparent)}}.border-brand\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-brand\/25{border-color:color-mix(in oklab,var(--color-brand) 25%,transparent)}}.border-brand\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-brand\/30{border-color:color-mix(in oklab,var(--color-brand) 30%,transparent)}}.border-brand\/40{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.border-brand\/40{border-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.border-green-200{border-color:var(--color-green-200)}.border-hub{border-color:var(--color-hub)}.border-hub-soft-2{border-color:var(--color-hub-soft-2)}.border-hub\/25{border-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.border-hub\/25{border-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.border-hub\/30{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.border-hub\/30{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-ink-4{border-color:var(--color-ink-4)}.border-ink-on-dark-rule{border-color:var(--color-ink-on-dark-rule)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-verify-border{border-color:var(--color-verify-border)}.border-warn-border{border-color:var(--color-warn-border)}.border-warn\/30{border-color:#a87a1f4d}@supports (color:color-mix(in lab,red,red)){.border-warn\/30{border-color:color-mix(in oklab,var(--color-warn) 30%,transparent)}}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.border-white\/35{border-color:#ffffff59}@supports (color:color-mix(in lab,red,red)){.border-white\/35{border-color:color-mix(in oklab,var(--color-white) 35%,transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.border-white\/50{border-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.border-white\/50{border-color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.border-white\/60{border-color:#fff9}@supports (color:color-mix(in lab,red,red)){.border-white\/60{border-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.border-white\/\[0\.18\]{border-color:#ffffff2e}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.18\]{border-color:color-mix(in oklab,var(--color-white) 18%,transparent)}}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-t-transparent{border-top-color:#0000}.border-l-\[color\:var\(--color-err\)\]{border-left-color:var(--color-err)}.border-l-brand{border-left-color:var(--color-brand)}.border-l-transparent{border-left-color:#0000}.bg-\[\#2A2723\]{background-color:#2a2723}.bg-\[\#16140f\]{background-color:#16140f}.bg-\[\#E7F2EA\]{background-color:#e7f2ea}.bg-\[\#EEE9F7\]{background-color:#eee9f7}.bg-\[\#F7E5E5\]{background-color:#f7e5e5}.bg-\[\#F7EBDD\]{background-color:#f7ebdd}.bg-\[\#FF8B6F\]{background-color:#ff8b6f}.bg-\[--color-bg\]{background-color:--color-bg}.bg-\[color\:var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[color\:var\(--color-bg-card\)\]{background-color:var(--color-bg-card)}.bg-\[color\:var\(--color-bg-elev\)\]{background-color:var(--color-bg-elev)}.bg-\[color\:var\(--color-bg-rule\)\]{background-color:var(--color-bg-rule)}.bg-\[color\:var\(--color-bg-rule-2\)\]{background-color:var(--color-bg-rule-2)}.bg-\[color\:var\(--color-bg-soft\)\]{background-color:var(--color-bg-soft)}.bg-\[color\:var\(--color-bg-subtle\)\]{background-color:var(--color-bg-subtle)}.bg-\[color\:var\(--color-err\)\]{background-color:var(--color-err)}.bg-\[color\:var\(--color-err-soft\)\]{background-color:var(--color-err-soft)}.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:#f4dad24d}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-err-soft\)\]\/30{background-color:color-mix(in oklab,var(--color-err-soft) 30%,transparent)}}.bg-\[color\:var\(--color-hub\)\]{background-color:var(--color-hub)}.bg-\[color\:var\(--color-hub-soft\)\]{background-color:var(--color-hub-soft)}.bg-\[color\:var\(--color-ink-3\)\]{background-color:var(--color-ink-3)}.bg-\[color\:var\(--color-ink-4\)\]{background-color:var(--color-ink-4)}.bg-\[color\:var\(--color-line\)\]{background-color:var(--color-line)}.bg-\[color\:var\(--color-ok\)\]{background-color:var(--color-ok)}.bg-\[color\:var\(--color-ok\)\]\/60{background-color:#2e854099}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:var\(--color-ok\)\]\/60{background-color:color-mix(in oklab,var(--color-ok) 60%,transparent)}}.bg-\[color\:var\(--color-ok-soft\)\]{background-color:var(--color-ok-soft)}.bg-\[color\:var\(--color-panel-dark-2\)\]{background-color:var(--color-panel-dark-2)}.bg-\[color\:var\(--color-warn-soft\)\]{background-color:var(--color-warn-soft)}.bg-\[color\:var\(--color-warn-soft\,\#fef2f2\)\]{background-color:var(--color-warn-soft,#fef2f2)}.bg-\[color\:var\(--color-warn-soft\,transparent\)\]{background-color:var(--color-warn-soft,transparent)}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-primary\)\]\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-primary\)\]\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent-deep{background-color:var(--color-accent-deep)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-accent-soft\/40{background-color:#f1e6d366}@supports (color:color-mix(in lab,red,red)){.bg-accent-soft\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-accent-warm{background-color:var(--color-accent-warm)}.bg-accent\/25{background-color:#b07a3a40}@supports (color:color-mix(in lab,red,red)){.bg-accent\/25{background-color:color-mix(in oklab,var(--color-accent) 25%,transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400\/40{background-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/40{background-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg-card{background-color:var(--color-bg-card)}.bg-bg-card-warm{background-color:var(--color-bg-card-warm)}.bg-bg-card-warm-rule{background-color:var(--color-bg-card-warm-rule)}.bg-bg-dark{background-color:var(--color-bg-dark)}.bg-bg-elev{background-color:var(--color-bg-elev)}.bg-bg-rule{background-color:var(--color-bg-rule)}.bg-bg-rule-2{background-color:var(--color-bg-rule-2)}.bg-bg-rule-strong{background-color:var(--color-bg-rule-strong)}.bg-bg-rule-strong\/30{background-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/30{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.bg-bg-rule-strong\/40{background-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.bg-bg-rule-strong\/40{background-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/25{background-color:#00000040}@supports (color:color-mix(in lab,red,red)){.bg-black\/25{background-color:color-mix(in oklab,var(--color-black) 25%,transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab,red,red)){.bg-black\/35{background-color:color-mix(in oklab,var(--color-black) 35%,transparent)}}.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-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-black\/\[0\.02\]{background-color:#00000005}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-black) 2%,transparent)}}.bg-black\/\[0\.04\]{background-color:#0000000a}@supports (color:color-mix(in lab,red,red)){.bg-black\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-black) 4%,transparent)}}.bg-brand{background-color:var(--color-brand)}.bg-brand-soft{background-color:var(--color-brand-soft)}.bg-brand\/\[0\.04\]{background-color:#1a25400a}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-brand) 4%,transparent)}}.bg-brand\/\[0\.06\]{background-color:#1a25400f}@supports (color:color-mix(in lab,red,red)){.bg-brand\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-brand) 6%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-gain{background-color:var(--color-gain)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-hub{background-color:var(--color-hub)}.bg-hub-2{background-color:var(--color-hub-2)}.bg-hub-3{background-color:var(--color-hub-3)}.bg-hub-soft{background-color:var(--color-hub-soft)}.bg-hub-soft\/40{background-color:#e5e9f166}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/40{background-color:color-mix(in oklab,var(--color-hub-soft) 40%,transparent)}}.bg-hub-soft\/50{background-color:#e5e9f180}@supports (color:color-mix(in lab,red,red)){.bg-hub-soft\/50{background-color:color-mix(in oklab,var(--color-hub-soft) 50%,transparent)}}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-ink{background-color:var(--color-ink)}.bg-ink-4{background-color:var(--color-ink-4)}.bg-ink-on-dark-rule{background-color:var(--color-ink-on-dark-rule)}.bg-ink\/70{background-color:#1a1f1cb3}@supports (color:color-mix(in lab,red,red)){.bg-ink\/70{background-color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-ok{background-color:var(--color-ok)}.bg-red-50{background-color:var(--color-red-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-verify-bg{background-color:var(--color-verify-bg)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-warn-soft{background-color:var(--color-warn-soft)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/15{background-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.bg-white\/25{background-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.bg-white\/25{background-color:color-mix(in oklab,var(--color-white) 25%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.bg-white\/60{background-color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-white\/95{background-color:color-mix(in oklab,var(--color-white) 95%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[var\(--color-primary\)\]{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.from-blue-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.from-gray-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-500\/10{--tw-gradient-from:#00c7581a}@supports (color:color-mix(in lab,red,red)){.from-green-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.from-green-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:#625fff1a}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-lime-500\/10{--tw-gradient-from:#80cd001a}@supports (color:color-mix(in lab,red,red)){.from-lime-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-lime-500) 10%, transparent)}}.from-lime-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/10{--tw-gradient-from:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.from-orange-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.from-orange-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-pink-500\/10{--tw-gradient-from:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.from-pink-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.from-pink-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-500\/10{--tw-gradient-from:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.from-purple-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.from-purple-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/10{--tw-gradient-from:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.from-red-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.from-red-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-500\/10{--tw-gradient-from:#00baa71a}@supports (color:color-mix(in lab,red,red)){.from-teal-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.from-teal-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-500\/10{--tw-gradient-from:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.from-violet-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.from-violet-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.from-yellow-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[var\(--color-secondary\)\]{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-600\/10{--tw-gradient-to:#155dfc1a}@supports (color:color-mix(in lab,red,red)){.to-blue-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-blue-600) 10%, transparent)}}.to-blue-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/10{--tw-gradient-to:#0092b51a}@supports (color:color-mix(in lab,red,red)){.to-cyan-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 10%, transparent)}}.to-cyan-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-600\/10{--tw-gradient-to:#4a55651a}@supports (color:color-mix(in lab,red,red)){.to-gray-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-gray-600) 10%, transparent)}}.to-gray-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-600\/10{--tw-gradient-to:#00a5441a}@supports (color:color-mix(in lab,red,red)){.to-green-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-green-600) 10%, transparent)}}.to-green-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-600\/10{--tw-gradient-to:#4f39f61a}@supports (color:color-mix(in lab,red,red)){.to-indigo-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 10%, transparent)}}.to-indigo-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-lime-600\/10{--tw-gradient-to:#62a4001a}@supports (color:color-mix(in lab,red,red)){.to-lime-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-lime-600) 10%, transparent)}}.to-lime-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/10{--tw-gradient-to:#f051001a}@supports (color:color-mix(in lab,red,red)){.to-orange-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 10%, transparent)}}.to-orange-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-pink-600\/10{--tw-gradient-to:#e300761a}@supports (color:color-mix(in lab,red,red)){.to-pink-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-pink-600) 10%, transparent)}}.to-pink-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-600\/10{--tw-gradient-to:#9810fa1a}@supports (color:color-mix(in lab,red,red)){.to-purple-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 10%, transparent)}}.to-purple-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/10{--tw-gradient-to:#e400141a}@supports (color:color-mix(in lab,red,red)){.to-red-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.to-red-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-600\/10{--tw-gradient-to:#0095881a}@supports (color:color-mix(in lab,red,red)){.to-teal-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-teal-600) 10%, transparent)}}.to-teal-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-600\/10{--tw-gradient-to:#7f22fe1a}@supports (color:color-mix(in lab,red,red)){.to-violet-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-violet-600) 10%, transparent)}}.to-violet-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/10{--tw-gradient-to:#cd89001a}@supports (color:color-mix(in lab,red,red)){.to-yellow-600\/10{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 10%, transparent)}}.to-yellow-600\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.box-decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.box-decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.fill-\[color\:var\(--color-bg-rule\)\]{fill:var(--color-bg-rule)}.fill-\[color\:var\(--color-hub\)\]{fill:var(--color-hub)}.fill-current{fill:currentColor}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.p-9{padding:calc(var(--spacing) * 9)}.p-10{padding:calc(var(--spacing) * 10)}.p-12{padding:calc(var(--spacing) * 12)}.p-\[1px\]{padding:1px}.p-\[18px\]{padding:18px}.p-\[22px\]{padding:22px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-9{padding-inline:calc(var(--spacing) * 9)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-14{padding-inline:calc(var(--spacing) * 14)}.px-\[13px\]{padding-inline:13px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-5{padding-block:calc(var(--spacing) * 5)}.py-5\.5{padding-block:calc(var(--spacing) * 5.5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.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-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[3px\]{padding-block:3px}.py-\[9px\]{padding-block:9px}.py-\[10px\]{padding-block:10px}.py-\[11px\]{padding-block:11px}.py-\[18px\]{padding-block:18px}.py-\[20px\]{padding-block:20px}.py-\[22px\]{padding-block:22px}.py-px{padding-block:1px}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.ps-7{padding-inline-start:calc(var(--spacing) * 7)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.\!pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-9{padding-top:calc(var(--spacing) * 9)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[18px\]{padding-top:18px}.pt-\[34px\]{padding-top:34px}.pt-\[60px\]{padding-top:60px}.pt-\[64px\]{padding-top:64px}.pt-\[70px\]{padding-top:70px}.pt-\[110px\]{padding-top:110px}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-\[72px\]{padding-right:72px}.\!pb-0{padding-bottom:0!important}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-\[18px\]{padding-bottom:18px}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pb-\[72px\]{padding-bottom:72px}.pb-px{padding-bottom:1px}.pl-0{padding-left:0}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-12{padding-left:calc(var(--spacing) * 12)}.pl-\[60px\]{padding-left:60px}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.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-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[21px\]{font-size:21px}.text-\[22px\]{font-size:22px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[30px\]{font-size:30px}.text-\[32px\]{font-size:32px}.text-\[34px\]{font-size:34px}.text-\[36px\]{font-size:36px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[42px\]{font-size:42px}.text-\[48px\]{font-size:48px}.text-\[56px\]{font-size:56px}.text-\[58px\]{font-size:58px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.02\]{--tw-leading:1.02;line-height:1.02}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.7\]{--tw-leading:1.7;line-height:1.7}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-\[1\.12\]{--tw-leading:1.12;line-height:1.12}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.18\]{--tw-leading:1.18;line-height:1.18}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.leading-\[1\.28\]{--tw-leading:1.28;line-height:1.28}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.1px\]{--tw-tracking:-.1px;letter-spacing:-.1px}.tracking-\[-0\.2px\]{--tw-tracking:-.2px;letter-spacing:-.2px}.tracking-\[-0\.3px\]{--tw-tracking:-.3px;letter-spacing:-.3px}.tracking-\[-0\.4px\]{--tw-tracking:-.4px;letter-spacing:-.4px}.tracking-\[-0\.5px\]{--tw-tracking:-.5px;letter-spacing:-.5px}.tracking-\[-0\.6px\]{--tw-tracking:-.6px;letter-spacing:-.6px}.tracking-\[-0\.7px\]{--tw-tracking:-.7px;letter-spacing:-.7px}.tracking-\[-0\.8px\]{--tw-tracking:-.8px;letter-spacing:-.8px}.tracking-\[-0\.9px\]{--tw-tracking:-.9px;letter-spacing:-.9px}.tracking-\[-1\.2px\]{--tw-tracking:-1.2px;letter-spacing:-1.2px}.tracking-\[-1\.5px\]{--tw-tracking:-1.5px;letter-spacing:-1.5px}.tracking-\[-1px\]{--tw-tracking:-1px;letter-spacing:-1px}.tracking-\[\.10em\],.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.6px\]{--tw-tracking:.6px;letter-spacing:.6px}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.10em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.20em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.overflow-ellipsis,.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-\[\#1F6B3F\]{color:#1f6b3f}.text-\[\#5BC07A\]{color:#5bc07a}.text-\[\#6B4FA1\]{color:#6b4fa1}.text-\[\#6E6862\]{color:#6e6862}.text-\[\#8A4B12\]{color:#8a4b12}.text-\[\#8A847B\]{color:#8a847b}.text-\[\#9ad1a5\]{color:#9ad1a5}.text-\[\#A13030\]{color:#a13030}.text-\[\#FF8B6F\]{color:#ff8b6f}.text-\[color\:var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[color\:var\(--color-bg-rule\)\]{color:var(--color-bg-rule)}.text-\[color\:var\(--color-brand\)\]{color:var(--color-brand)}.text-\[color\:var\(--color-err\)\]{color:var(--color-err)}.text-\[color\:var\(--color-err\,\#b91c1c\)\]{color:var(--color-err,#b91c1c)}.text-\[color\:var\(--color-gain-deep\)\]{color:var(--color-gain-deep)}.text-\[color\:var\(--color-hub\)\]{color:var(--color-hub)}.text-\[color\:var\(--color-ink\)\]{color:var(--color-ink)}.text-\[color\:var\(--color-ink-2\)\]{color:var(--color-ink-2)}.text-\[color\:var\(--color-ink-3\)\]{color:var(--color-ink-3)}.text-\[color\:var\(--color-ink-4\)\]{color:var(--color-ink-4)}.text-\[color\:var\(--color-ink-on-dark\)\]{color:var(--color-ink-on-dark)}.text-\[color\:var\(--color-ink-on-dark-2\)\]{color:var(--color-ink-on-dark-2)}.text-\[color\:var\(--color-ink-on-dark-3\)\]{color:var(--color-ink-on-dark-3)}.text-\[color\:var\(--color-loss\)\]{color:var(--color-loss)}.text-\[color\:var\(--color-ok\)\]{color:var(--color-ok)}.text-\[color\:var\(--color-text-muted\)\]{color:var(--color-text-muted)}.text-\[color\:var\(--color-warn\)\]{color:var(--color-warn)}.text-\[color\:var\(--color-warn\,\#b91c1c\)\]{color:var(--color-warn,#b91c1c)}.text-\[color\:var\(--color-warn\,\#b45309\)\]{color:var(--color-warn,#b45309)}.text-\[var\(--color-primary\)\]{color:var(--color-primary)}.text-\[var\(--color-white\)\]\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-\[var\(--color-white\)\]\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-accent{color:var(--color-accent)}.text-accent-deep{color:var(--color-accent-deep)}.text-accent-soft{color:var(--color-accent-soft)}.text-accent-warm{color:var(--color-accent-warm)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-bg{color:var(--color-bg)}.text-black{color:var(--color-black)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-brand{color:var(--color-brand)}.text-brand-soft{color:var(--color-brand-soft)}.text-card-warm-cat{color:var(--color-card-warm-cat)}.text-card-warm-title{color:var(--color-card-warm-title)}.text-current{color:currentColor}.text-cyan-500{color:var(--color-cyan-500)}.text-err{color:var(--color-err)}.text-gain{color:var(--color-gain)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-hub{color:var(--color-hub)}.text-hub-3{color:var(--color-hub-3)}.text-hub-line{color:var(--color-hub-line)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-ink-4{color:var(--color-ink-4)}.text-ink-on-dark{color:var(--color-ink-on-dark)}.text-ink-on-dark-2{color:var(--color-ink-on-dark-2)}.text-ink-on-dark-3{color:var(--color-ink-on-dark-3)}.text-ink-on-dark-muted{color:var(--color-ink-on-dark-muted)}.text-lime-500{color:var(--color-lime-500)}.text-loss{color:var(--color-loss)}.text-ok{color:var(--color-ok)}.text-orange-500{color:var(--color-orange-500)}.text-pink-500{color:var(--color-pink-500)}.text-purple-500{color:var(--color-purple-500)}.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-red-900{color:var(--color-red-900)}.text-sky-900{color:var(--color-sky-900)}.text-teal-500{color:var(--color-teal-500)}.text-transparent{color:#0000}.text-verify-border{color:var(--color-verify-border)}.text-verify-ink{color:var(--color-verify-ink)}.text-violet-500{color:var(--color-violet-500)}.text-warn{color:var(--color-warn)}.text-warn-ink{color:var(--color-warn-ink)}.text-warn-ink-deep{color:var(--color-warn-ink-deep)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.text-white\/45{color:#ffffff73}@supports (color:color-mix(in lab,red,red)){.text-white\/45{color:color-mix(in oklab,var(--color-white) 45%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/55{color:#ffffff8c}@supports (color:color-mix(in lab,red,red)){.text-white\/55{color:color-mix(in oklab,var(--color-white) 55%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white) 60%,transparent)}}.text-white\/65{color:#ffffffa6}@supports (color:color-mix(in lab,red,red)){.text-white\/65{color:color-mix(in oklab,var(--color-white) 65%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.text-white\/75{color:#ffffffbf}@supports (color:color-mix(in lab,red,red)){.text-white\/75{color:color-mix(in oklab,var(--color-white) 75%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.text-white\/85{color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[\#1C1A17\]\/40{text-decoration-color:#1c1a1766}.decoration-\[color\:var\(--color-accent-deep\)\]\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-accent-deep\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-\[color\:var\(--color-hub\)\]\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-\[color\:var\(--color-hub\)\]\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.decoration-accent-deep\/40{text-decoration-color:#8a5e2766}@supports (color:color-mix(in lab,red,red)){.decoration-accent-deep\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent-deep) 40%,transparent)}}.decoration-accent\/40{text-decoration-color:#b07a3a66}@supports (color:color-mix(in lab,red,red)){.decoration-accent\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.decoration-bg-rule-strong\/40{text-decoration-color:#1a1f1c66}@supports (color:color-mix(in lab,red,red)){.decoration-bg-rule-strong\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-bg-rule-strong) 40%,transparent)}}.decoration-brand\/40{text-decoration-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.decoration-brand\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-brand) 40%,transparent)}}.decoration-hub\/25{text-decoration-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/25{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 25%,transparent)}}.decoration-hub\/30{text-decoration-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.decoration-hub\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.decoration-white\/30{text-decoration-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.decoration-white\/30{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.decoration-white\/40{text-decoration-color:#fff6}@supports (color:color-mix(in lab,red,red)){.decoration-white\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.underline-offset-\[3px\]{text-underline-offset:3px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/40::placeholder{color:#fff6}@supports (color:color-mix(in lab,red,red)){.placeholder-white\/40::placeholder{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.accent-\[color\:var\(--color-hub\)\]{accent-color:var(--color-hub)}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.opacity-\[0\.06\]{opacity:.06}.opacity-\[0\.07\]{opacity:.07}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--color-hub-soft\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--color-hub-soft));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#1a25400f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-card-hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);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-md{--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)}.shadow-none{--tw-shadow:0 0 #0000;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{--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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-2{--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)}.shadow-hub\/10{--tw-shadow-color:#1a25401a}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-hub\/30{--tw-shadow-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.shadow-hub\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-hub) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-\[color\:var\(--color-hub\)\]{--tw-ring-color:var(--color-hub)}.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-hub\)\]\/30{--tw-ring-color:color-mix(in oklab, var(--color-hub) 30%, transparent)}}.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:#2e854040}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:var\(--color-ok\)\]\/25{--tw-ring-color:color-mix(in oklab, var(--color-ok) 25%, transparent)}}.ring-accent\/30{--tw-ring-color:#b07a3a4d}@supports (color:color-mix(in lab,red,red)){.ring-accent\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.ring-black{--tw-ring-color:var(--color-black)}.ring-brand{--tw-ring-color:var(--color-brand)}.ring-white\/50{--tw-ring-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.ring-white\/50{--tw-ring-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.sepia{--tw-sepia:sepia(100%);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,)}.filter{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,)}.filter\!{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,)!important}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-\[border-color\,box-shadow\,background\]{transition-property:border-color,box-shadow,background;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-280{--tw-duration:.28s;transition-duration:.28s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[wire\:model\=\"\'\+a\+\'\"\]{wire:model="'+a+'"}.\[wire\:model\]{wire:model}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media(hover:hover){.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\:bg-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *),.group-hover\:bg-hub:is(:where(.group):hover *){background-color:var(--color-hub)}.group-hover\:text-\[color\:var\(--color-hub\)\]:is(:where(.group):hover *){color:var(--color-hub)}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-brand:is(:where(.group):hover *){color:var(--color-brand)}.group-hover\:text-ink:is(:where(.group):hover *){color:var(--color-ink)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:underline:is(:where(.group):hover *){text-decoration-line:underline}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}.group-hover\/ticker\:text-brand:is(:where(.group\/ticker):hover *){color:var(--color-brand)}.group-hover\/ticker\:underline:is(:where(.group\/ticker):hover *){text-decoration-line:underline}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-open\/disclosure-button\:block:is(:where(.group\/disclosure-button)[data-open] *){display:block}.group-data-open\/disclosure-button\:hidden:is(:where(.group\/disclosure-button)[data-open] *){display:none}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius-lg)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--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)}.group-\[\.destructive\]\:text-red-300:is(:where(.group).destructive *){color:var(--color-red-300)}.group-\[\.toaster\]\:shadow-lg:is(:where(.group).toaster *){--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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:var(--spacing)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.placeholder\:text-ink-4::placeholder{color:var(--color-ink-4)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.first\:pt-0:first-child{padding-top:0}.last\:rounded-r-md:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:relative:focus-within{position:relative}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:border-brand:focus-within{border-color:var(--color-brand)}@media(hover:hover){.hover\:translate-x-1:hover{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-\[color\:var\(--color-bg-rule\)\]:hover{border-color:var(--color-bg-rule)}.hover\:border-\[color\:var\(--color-hub\)\]:hover{border-color:var(--color-hub)}.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:#1a25404d}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/30:hover{border-color:color-mix(in oklab,var(--color-hub) 30%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[color\:var\(--color-hub\)\]\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-bg-rule:hover{border-color:var(--color-bg-rule)}.hover\:border-bg-rule-strong\/30:hover{border-color:#1a1f1c4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-bg-rule-strong\/30:hover{border-color:color-mix(in oklab,var(--color-bg-rule-strong) 30%,transparent)}}.hover\:border-brand:hover{border-color:var(--color-brand)}.hover\:border-brand\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-brand\/50:hover{border-color:color-mix(in oklab,var(--color-brand) 50%,transparent)}}.hover\:border-hub:hover{border-color:var(--color-hub)}.hover\:border-hub\/40:hover{border-color:#1a254066}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/40:hover{border-color:color-mix(in oklab,var(--color-hub) 40%,transparent)}}.hover\:border-hub\/50:hover{border-color:#1a254080}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/50:hover{border-color:color-mix(in oklab,var(--color-hub) 50%,transparent)}}.hover\:border-hub\/60:hover{border-color:#1a254099}@supports (color:color-mix(in lab,red,red)){.hover\:border-hub\/60:hover{border-color:color-mix(in oklab,var(--color-hub) 60%,transparent)}}.hover\:border-white:hover{border-color:var(--color-white)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:#b07a3ae6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklab\,_var\(--color-accent\)\,_transparent_10\%\)\]:hover{background-color:color-mix(in oklab,var(--color-accent),transparent 10%)}}.hover\:bg-\[color\:var\(--color-bg\)\]:hover{background-color:var(--color-bg)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]:hover{background-color:var(--color-bg-elev)}.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:#fbfaf699}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-bg-elev\)\]\/60:hover{background-color:color-mix(in oklab,var(--color-bg-elev) 60%,transparent)}}.hover\:bg-\[color\:var\(--color-hub-soft\)\]:hover{background-color:var(--color-hub-soft)}.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:#f6eac8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color\:var\(--color-warn-soft\)\]\/80:hover{background-color:color-mix(in oklab,var(--color-warn-soft) 80%,transparent)}}.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--color-primary\)\]\/20:hover{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-bg:hover{background-color:var(--color-bg)}.hover\:bg-bg-card:hover{background-color:var(--color-bg-card)}.hover\:bg-bg-card-warm-hover:hover{background-color:var(--color-bg-card-warm-hover)}.hover\:bg-bg-elev:hover{background-color:var(--color-bg-elev)}.hover\:bg-bg-rule-2:hover{background-color:var(--color-bg-rule-2)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.hover\:bg-brand-deep:hover{background-color:var(--color-brand-deep)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-hub-2:hover{background-color:var(--color-hub-2)}.hover\:bg-hub-soft:hover{background-color:var(--color-hub-soft)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:bg-zinc-800\/5:hover{background-color:#27272a0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/5:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 5%,transparent)}}.hover\:text-\[color\:var\(--color-hub\)\]:hover{color:var(--color-hub)}.hover\:text-\[color\:var\(--color-ink\)\]:hover{color:var(--color-ink)}.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-\[var\(--color-primary\)\]\/70:hover{color:color-mix(in oklab,var(--color-primary) 70%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-bg:hover{color:var(--color-bg)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-brand:hover{color:var(--color-brand)}.hover\:text-brand-deep:hover{color:var(--color-brand-deep)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-hub:hover{color:var(--color-hub)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink-on-dark:hover{color:var(--color-ink-on-dark)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-800:hover{color:var(--color-zinc-800)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[color\:var\(--color-hub\)\]:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-accent:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:decoration-accent-deep:hover{-webkit-text-decoration-color:var(--color-accent-deep);text-decoration-color:var(--color-accent-deep)}.hover\:decoration-brand:hover{-webkit-text-decoration-color:var(--color-brand);text-decoration-color:var(--color-brand)}.hover\:decoration-hub:hover{-webkit-text-decoration-color:var(--color-hub);text-decoration-color:var(--color-hub)}.hover\:decoration-white\/70:hover{text-decoration-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.hover\:decoration-white\/70:hover{-webkit-text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent);text-decoration-color:color-mix(in oklab,var(--color-white) 70%,transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-card-hover:hover{--tw-shadow:0 4px 12px -2px var(--tw-shadow-color,#1a25401f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--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)}.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group).destructive *):hover{color:var(--color-red-50)}}.focus\:border-brand:focus{border-color:var(--color-brand)}.focus\:border-hub:focus{border-color:var(--color-hub)}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + 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-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-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:#1a254040}@supports (color:color-mix(in lab,red,red)){.focus\:ring-\[color\:var\(--color-hub\)\]\/25:focus{--tw-ring-color:color-mix(in oklab, var(--color-hub) 25%, transparent)}}.focus\:ring-\[var\(--color-primary\)\]:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group).destructive *):focus{--tw-ring-color:var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group).destructive *):focus{--tw-ring-offset-color:var(--color-red-600)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--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-visible\:ring-ink:focus-visible{--tw-ring-color:var(--color-ink)}.focus-visible\:ring-white:focus-visible{--tw-ring-color:var(--color-white)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.aria-selected\:bg-accent\/50[aria-selected=true]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.aria-selected\:opacity-30[aria-selected=true]{opacity:.3}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}.data-open\:block[data-open]{display:block}.data-\[active\]\:bg-accent\/50[data-active]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[active\]\:bg-accent\/50[data-active]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:0}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:var(--spacing)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[selected\=\'true\'\]\:bg-accent[data-selected=true]{background-color:var(--color-accent)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=on\]\:bg-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--color-accent)}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x:var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x:var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}@media not all and (min-width:48rem){.max-md\:mt-1{margin-top:var(--spacing)}.max-md\:max-w-\[8rem\]{max-width:8rem}.max-md\:grid-cols-\[auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr)}.max-md\:gap-x-3{column-gap:calc(var(--spacing) * 3)}.max-md\:text-\[9px\]{font-size:9px}.max-md\:tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}}@media(min-width:40rem){.sm\:absolute{position:absolute}.sm\:inset-auto{inset:auto}.sm\:top-2{top:calc(var(--spacing) * 2)}.sm\:top-5{top:calc(var(--spacing) * 5)}.sm\:top-6{top:calc(var(--spacing) * 6)}.sm\:top-auto{top:auto}.sm\:top-full{top:100%}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:bottom-10{bottom:calc(var(--spacing) * 10)}.sm\:bottom-auto{bottom:auto}.sm\:left-0{left:0}.sm\:left-5{left:calc(var(--spacing) * 5)}.sm\:left-6{left:calc(var(--spacing) * 6)}.sm\:left-9{left:calc(var(--spacing) * 9)}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:mt-0{margin-top:0}.sm\:mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.sm\:mt-4{margin-top:calc(var(--spacing) * 4)}.sm\:mt-\[18px\]{margin-top:18px}.sm\:ml-0{margin-left:0}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:min-h-\[280px\]{min-height:280px}.sm\:min-h-\[300px\]{min-height:300px}.sm\:min-h-\[420px\]{min-height:420px}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-44{width:calc(var(--spacing) * 44)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-56{width:calc(var(--spacing) * 56)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-\[22rem\]{width:22rem}.sm\:w-\[400px\]{width:400px}.sm\:max-w-\[min\(42vw\,280px\)\]{max-width:min(42vw,280px)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-1{flex:1}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr\,160px\,auto\]{grid-template-columns:1fr,160px,auto}.sm\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.sm\:grid-cols-\[64px_1fr\]{grid-template-columns:64px 1fr}.sm\:grid-cols-\[110px_1fr\]{grid-template-columns:110px 1fr}.sm\:grid-cols-\[160px_160px_1fr\]{grid-template-columns:160px 160px 1fr}.sm\:grid-cols-\[160px_160px_1fr_auto\]{grid-template-columns:160px 160px 1fr auto}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:items-stretch{align-items:stretch}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-7{gap:calc(var(--spacing) * 7)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.sm\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.sm\:border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-9{padding:calc(var(--spacing) * 9)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-9{padding-inline:calc(var(--spacing) * 9)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-\[18px\]{padding-inline:18px}.sm\:py-0{padding-block:0}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:py-14{padding-block:calc(var(--spacing) * 14)}.sm\:py-\[18px\]{padding-block:18px}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pt-\[60px\]{padding-top:60px}.sm\:pt-\[70px\]{padding-top:70px}.sm\:pt-\[150px\]{padding-top:150px}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-9{padding-bottom:calc(var(--spacing) * 9)}.sm\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-\[60px\]{padding-left:60px}.sm\:text-left{text-align:left}.sm\:text-\[10px\]{font-size:10px}.sm\:text-\[11\.5px\]{font-size:11.5px}.sm\:text-\[11px\]{font-size:11px}.sm\:text-\[12\.5px\]{font-size:12.5px}.sm\:text-\[12px\]{font-size:12px}.sm\:text-\[13px\]{font-size:13px}.sm\:text-\[14\.5px\]{font-size:14.5px}.sm\:text-\[14px\]{font-size:14px}.sm\:text-\[15px\]{font-size:15px}.sm\:text-\[17px\]{font-size:17px}.sm\:text-\[19px\]{font-size:19px}.sm\:text-\[21px\]{font-size:21px}.sm\:text-\[24px\]{font-size:24px}.sm\:text-\[26px\]{font-size:26px}.sm\:text-\[28px\]{font-size:28px}.sm\:text-\[30px\]{font-size:30px}.sm\:text-\[32px\]{font-size:32px}.sm\:text-\[36px\]{font-size:36px}.sm\:text-\[38px\]{font-size:38px}.sm\:text-\[40px\]{font-size:40px}.sm\:text-\[44px\]{font-size:44px}.sm\:text-\[46px\]{font-size:46px}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[50px\]{font-size:50px}.sm\:whitespace-nowrap{white-space:nowrap}.sm\: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)}.first\:sm\:pl-0:first-child{padding-left:0}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}.md\:w-auto{width:auto}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.6fr\]{grid-template-columns:.9fr 1.6fr}.md\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.md\:grid-cols-\[1fr\,auto\,auto\]{grid-template-columns:1fr,auto,auto}.md\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.md\:grid-cols-\[3\.75rem_6\.25rem_minmax\(0\,1fr\)\]{grid-template-columns:3.75rem 6.25rem minmax(0,1fr)}.md\:grid-cols-\[6\.5rem_minmax\(0\,1fr\)\]{grid-template-columns:6.5rem minmax(0,1fr)}.md\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.md\:grid-cols-\[240px_1fr\]{grid-template-columns:240px 1fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:justify-end{justify-content:flex-end}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.md\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.md\:divide-\[color\:var\(--color-bg-rule\)\]>:not(:last-child)){border-color:var(--color-bg-rule)}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:border-\[color\:var\(--color-bg-rule\)\]{border-color:var(--color-bg-rule)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:pr-6{padding-right:calc(var(--spacing) * 6)}.md\:pl-5{padding-left:calc(var(--spacing) * 5)}.md\:pl-6{padding-left:calc(var(--spacing) * 6)}.md\:text-right{text-align:right}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--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)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media(min-width:48rem){.after\:md\:hidden:after{display:none}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:float-right{float:right}.lg\:mb-12{margin-bottom:calc(var(--spacing) * 12)}.lg\:ml-8{margin-left:calc(var(--spacing) * 8)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:h-8{height:calc(var(--spacing) * 8)}.lg\:min-h-\[340px\]{min-height:340px}.lg\:min-h-\[360px\]{min-height:360px}.lg\:min-h-\[500px\]{min-height:500px}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-auto{width:auto}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[1\.1fr_1fr\]{grid-template-columns:1.1fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}.lg\:grid-cols-\[1\.3fr_1fr_1fr\]{grid-template-columns:1.3fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr\]{grid-template-columns:1.4fr 1fr}.lg\:grid-cols-\[1\.4fr_1fr_1fr_1fr\]{grid-template-columns:1.4fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.4fr_auto\]{grid-template-columns:1.4fr auto}.lg\:grid-cols-\[1\.05fr_1fr\]{grid-template-columns:1.05fr 1fr}.lg\:grid-cols-\[1\.5fr_1fr_1fr_1fr\]{grid-template-columns:1.5fr 1fr 1fr 1fr}.lg\:grid-cols-\[1\.7fr_1fr\]{grid-template-columns:1.7fr 1fr}.lg\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.lg\:grid-cols-\[1fr\,320px\]{grid-template-columns:1fr,320px}.lg\:grid-cols-\[1fr_1\.6fr\]{grid-template-columns:1fr 1.6fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.lg\:grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.lg\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-7{gap:calc(var(--spacing) * 7)}.lg\:gap-8{gap:calc(var(--spacing) * 8)}.lg\:gap-12{gap:calc(var(--spacing) * 12)}.lg\:gap-14{gap:calc(var(--spacing) * 14)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}.lg\:gap-\[72px\]{gap:72px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-14{padding-inline:calc(var(--spacing) * 14)}.lg\:px-\[18px\]{padding-inline:18px}.lg\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.lg\:py-12{padding-block:calc(var(--spacing) * 12)}.lg\:py-14{padding-block:calc(var(--spacing) * 14)}.lg\:py-16{padding-block:calc(var(--spacing) * 16)}.lg\:py-\[18px\]{padding-block:18px}.lg\:pt-9{padding-top:calc(var(--spacing) * 9)}.lg\:pt-10{padding-top:calc(var(--spacing) * 10)}.lg\:pt-14{padding-top:calc(var(--spacing) * 14)}.lg\:pt-16{padding-top:calc(var(--spacing) * 16)}.lg\:pt-20{padding-top:calc(var(--spacing) * 20)}.lg\:pr-6{padding-right:calc(var(--spacing) * 6)}.lg\:pr-8{padding-right:calc(var(--spacing) * 8)}.lg\:pb-16{padding-bottom:calc(var(--spacing) * 16)}.lg\:pb-20{padding-bottom:calc(var(--spacing) * 20)}.lg\:pb-24{padding-bottom:calc(var(--spacing) * 24)}.lg\:pb-\[72px\]{padding-bottom:72px}.lg\:pl-8{padding-left:calc(var(--spacing) * 8)}.lg\:text-right{text-align:right}.lg\:text-\[14px\]{font-size:14px}.lg\:text-\[16px\]{font-size:16px}.lg\:text-\[17px\]{font-size:17px}.lg\:text-\[19px\]{font-size:19px}.lg\:text-\[22px\]{font-size:22px}.lg\:text-\[23px\]{font-size:23px}.lg\:text-\[28px\]{font-size:28px}.lg\:text-\[30px\]{font-size:30px}.lg\:text-\[32px\]{font-size:32px}.lg\:text-\[34px\]{font-size:34px}.lg\:text-\[36px\]{font-size:36px}.lg\:text-\[38px\]{font-size:38px}.lg\:text-\[42px\]{font-size:42px}.lg\:text-\[44px\]{font-size:44px}.lg\:text-\[48px\]{font-size:48px}.lg\:text-\[50px\]{font-size:50px}.lg\:text-\[52px\]{font-size:52px}.lg\:text-\[56px\]{font-size:56px}.lg\:text-\[58px\]{font-size:58px}.lg\:first\:pl-0:first-child{padding-left:0}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline-block{display:inline-block}.xl\:w-48{width:calc(var(--spacing) * 48)}.xl\:w-56{width:calc(var(--spacing) * 56)}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-\[1fr_380px\]{grid-template-columns:1fr 380px}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}@media(prefers-color-scheme:dark){.dark\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.dark\:-rotate-90{rotate:-90deg}.dark\:rotate-0{rotate:0deg}:where(.dark\:divide-white\/15>:not(:last-child)){border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){:where(.dark\:divide-white\/15>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}:where(.dark\:divide-zinc-700>:not(:last-child)){border-color:var(--color-zinc-700)}.dark\:border-\[var\(--color-primary\)\]\/30{border-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:border-\[var\(--color-primary\)\]\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.dark\:border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.dark\:border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.dark\:border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.dark\:border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.dark\:border-zinc-700{border-color:var(--color-zinc-700)}.dark\:border-zinc-800{border-color:var(--color-zinc-800)}.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-\[var\(--color-primary\)\]\/20{background-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.dark\:bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.dark\:bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/30{background-color:color-mix(in oklab,var(--color-white) 30%,transparent)}}.dark\:bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.dark\:bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.dark\:bg-zinc-700{background-color:var(--color-zinc-700)}.dark\:bg-zinc-800{background-color:var(--color-zinc-800)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:bg-zinc-950{background-color:var(--color-zinc-950)}.dark\:text-amber-100{color:var(--color-amber-100)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-100{color:var(--color-green-100)}.dark\:text-indigo-200{color:var(--color-indigo-200)}.dark\:text-sky-100{color:var(--color-sky-100)}.dark\:text-white{color:var(--color-white)}.dark\:text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.dark\:text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.dark\:text-zinc-100{color:var(--color-zinc-100)}.dark\:text-zinc-300{color:var(--color-zinc-300)}.dark\:text-zinc-400{color:var(--color-zinc-400)}.dark\:text-zinc-600{color:var(--color-zinc-600)}@media(hover:hover){.dark\:hover\:border-zinc-600:hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-\[var\(--color-primary\)\]\/30:hover{background-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/\[7\%\]:hover{background-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:text-zinc-100:hover{color:var(--color-zinc-100)}}}@media print{.print\:hidden{display:none}}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer,.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style:none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style:none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:0}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media(hover:hover){.hover\:\[\&_a\]\:text-ink:hover a{color:var(--color-ink)}}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]){background-color:var(--color-accent)}.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:first-child:has([aria-selected]){border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:last-child:has([aria-selected]){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:#b07a3a80}@supports (color:color-mix(in lab,red,red)){.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside){background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end){border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}@media(min-width:64rem){.lg\:\[\&\:nth-child\(-n\+4\)\]\:border-t-0:nth-child(-n+4){border-top-style:var(--tw-border-style);border-top-width:0}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}:where(.\[\:where\(\&\)\]\:size-4){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:where(.\[\:where\(\&\)\]\:size-5){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}:where(.\[\:where\(\&\)\]\:size-6){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}.panel [data-flux-table] [data-flux-column]:first-child,.panel [data-flux-table] [data-flux-cell]:first-child,.panel-warm [data-flux-table] [data-flux-column]:first-child,.panel-warm [data-flux-table] [data-flux-cell]:first-child{padding-inline-start:18px}.panel [data-flux-table] [data-flux-column]:last-child,.panel [data-flux-table] [data-flux-cell]:last-child,.panel-warm [data-flux-table] [data-flux-column]:last-child,.panel-warm [data-flux-table] [data-flux-cell]:last-child{padding-inline-end:18px}.text-balance{text-wrap:balance}.hatch-dark{background-image:repeating-linear-gradient(135deg,#ffffff0a 0,#ffffff0a 10px,#0000 10px,#0000 20px)}.hatch-light{background-image:repeating-linear-gradient(135deg,#0000000a 0,#0000000a 6px,#0000 6px,#0000 12px)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.animate-fade-in{animation:.6s ease-out forwards fade-in}.animate-fade-in-up{animation:.6s ease-out forwards fade-in-up}.animate-fade-in-down{animation:.6s ease-out forwards fade-in-down}.animate-slide-in-right{animation:.6s ease-out forwards slide-in-right}.animate-scale-in{animation:.4s ease-out forwards scale-in}.animation-delay-100{opacity:0;animation-delay:.1s}.animation-delay-200{opacity:0;animation-delay:.2s}.animation-delay-300{opacity:0;animation-delay:.3s}.animation-delay-400{opacity:0;animation-delay:.4s}.gradient-indicator{background:linear-gradient(to bottom,hsl(var(--primary)),hsl(var(--secondary)));border-radius:9999px;width:.5rem;height:2.5rem;display:inline-block}.slider-wrapper{margin-top:-3rem;margin-left:-1.5rem;margin-right:-1.5rem;padding:.5rem 1rem;position:relative}.slider-nav-btn{cursor:pointer;background:0 0;border:1px solid #e4e4e7;border-radius:9999px;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;transition:all .2s;display:flex}.dark .slider-nav-btn{border-color:#3f3f46}.slider-nav-btn:hover:not(:disabled){border-color:hsl(var(--primary));background:hsl(var(--primary) / .1)}.slider-nav-btn:disabled{opacity:.3;cursor:not-allowed}.slider-dots{justify-content:center;gap:.5rem;margin-top:0;display:flex}.slider-dot{cursor:pointer;background:#d4d4d8;border:none;border-radius:9999px;width:.5rem;height:.5rem;padding:0;transition:all .3s}.dark .slider-dot{background:#52525b}.slider-dot.active{background:hsl(var(--primary));width:2rem}.highlight-card-link{scroll-snap-align:center;flex-shrink:0;width:100%;text-decoration:none;display:block}.highlight-card-link:focus{outline:2px solid hsl(var(--primary));outline-offset:2px}.card-premium{background:var(--color-white);box-shadow:var(--shadow-card);border:1px solid;border-color:hsl(var(--primary) / .2)}.card-premium-hover{box-shadow:var(--shadow-card-hover);border-color:hsl(var(--primary) / .4);transform:translateY(-.125rem)}.highlight-card{border:1px solid;border-color:hsl(var(--primary) / .2);background:linear-gradient(to bottom right,#f4f4f580,#f4f4f540);border-radius:.75rem;flex-direction:column;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000001a}.dark .highlight-card{background:linear-gradient(to bottom right,#27272a,#27272a80);border-color:#3f3f46}.highlight-card-link:hover .highlight-card{border-color:hsl(var(--primary) / .3);transform:translateY(-.125rem);box-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.highlight-card-image{background:linear-gradient(to bottom right,#f4f4f5,#fafafa);height:16rem;position:relative;overflow:hidden}.dark .highlight-card-image{background:linear-gradient(to bottom right,#27272a,#18181b)}@media(min-width:768px){.highlight-card-image{height:100%}}.highlight-badge{text-transform:uppercase;letter-spacing:.1em;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;border-radius:.25rem;padding:.375rem .75rem;font-size:.625rem;font-weight:700;display:inline-block;box-shadow:0 4px 6px -1px #0000001a}.highlight-card-content{flex-direction:column;justify-content:space-between;padding:1.5rem 2rem;display:flex}.highlight-meta{color:#71717a;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.75rem;line-height:1rem;display:flex}.dark .highlight-meta{color:#a1a1aa}.highlight-title{color:#18181b;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1rem;font-size:1.5rem;font-weight:700;line-height:1.25;transition:color .2s;display:-webkit-box;overflow:hidden}@media(min-width:768px){.highlight-title{font-size:1.875rem;line-height:2.25rem}}.dark .highlight-title{color:#fafafa}.highlight-card-link:hover .highlight-title{color:hsl(var(--primary))}.highlight-text{color:#52525b;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin-bottom:1.5rem;font-size:1rem;line-height:1.625;display:-webkit-box;overflow:hidden}.dark .highlight-text{color:#a1a1aa}.highlight-footer{border-top:1px solid;border-color:hsl(var(--primary) / .1);justify-content:space-between;align-items:center;padding-top:1.25rem;display:flex}.section-light-bg{background:linear-gradient(135deg,#fafafa80,#f4f4f580)}.dark .section-light-bg{background:linear-gradient(135deg,#18181b80,#27272a80)}.section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .05),hsl(var(--secondary) / .05));border-top:1px solid;border-bottom:1px solid;border-color:hsl(var(--primary) / .1)}.dark .section-gradient-bg{background:linear-gradient(to bottom right,hsl(var(--primary) / .1),hsl(var(--secondary) / .1))}.hero-gradient{background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--secondary)));position:relative;box-shadow:inset 0 -6px 16px #00000029}.dark .hero-gradient{box-shadow:inset 0 -6px 16px #0003}.hero-title{text-shadow:0 2px 8px #0003}.hero-subtitle{text-shadow:0 1px 4px #00000026}.industry-icon-badge img{opacity:.6}.dark .industry-icon-badge img{opacity:.6;filter:brightness(0)saturate()invert()sepia(0%)saturate(0%)hue-rotate()brightness()contrast()}.page-header{background:linear-gradient(135deg,#fafafa80,#f4f4f580);border-bottom:1px solid #e4e4e7;padding:3rem 0}.dark .page-header{background:linear-gradient(135deg,#18181b80,#27272a80);border-bottom:1px solid #3f3f46}.page-header-compact{padding:2rem 0}.page-header-title{color:#18181b;margin-bottom:1rem;font-size:2.25rem;font-weight:700;line-height:2.5rem}@media(min-width:768px){.page-header-title{font-size:3rem;line-height:1.2}}.dark .page-header-title{color:#fafafa}.page-header-subtitle{color:#52525b;font-size:1.125rem;line-height:1.75rem}.dark .page-header-subtitle{color:#a1a1aa}.sidebar-widget{background:#fff;border:1px solid #e4e4e7;border-radius:.75rem;margin-bottom:1.5rem;padding:1.5rem;transition:all .2s}.dark .sidebar-widget{background:#27272a;border-color:#3f3f46}.sidebar-widget:hover{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.sidebar-widget-header{border-bottom:1px solid #e4e4e7;align-items:center;gap:.75rem;margin-bottom:1rem;padding-bottom:1rem;display:flex}.dark .sidebar-widget-header{border-bottom-color:#3f3f46}.sidebar-widget-title{color:#18181b;font-size:1.125rem;font-weight:600}.dark .sidebar-widget-title{color:#fafafa}.sidebar-widget-content{color:#52525b}.dark .sidebar-widget-content{color:#a1a1aa}.main-nav-link.active{color:hsl(var(--primary))}.main-nav-link.active:after{width:100%}.header-sticky{z-index:50;position:fixed;top:0;left:0;right:0;box-shadow:0 1px 3px #00000014,0 6px 20px #0000000d}.pagination-btn{color:var(--zinc-900);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);cursor:pointer;background:#ffffffb3;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:all .2s}.dark .pagination-btn{color:var(--zinc-100);background:#fff3}.pagination-btn:hover:not(.pagination-active):not(:disabled){background:var(--zinc-100);box-shadow:var(--shadow-lg);transform:translateY(-2px)}.dark .pagination-btn:hover:not(.pagination-active):not(:disabled){background:#ffffff1a}.pagination-active,.dark .pagination-active{background:linear-gradient(90deg,hsl(var(--primary)),hsl(var(--secondary)));box-shadow:var(--shadow-md);color:#fff}.pagination-active:hover{background:linear-gradient(90deg,hsl(var(--primary) / .9),hsl(var(--secondary) / .9));box-shadow:var(--shadow-lg);transform:translateY(-2px)}.pagination-nav{box-shadow:none;color:#6b7280;background:0 0}.dark .pagination-nav{color:#9ca3af}.pagination-nav:hover:not(:disabled){color:#111827;box-shadow:none;background:0 0;transform:none}.dark .pagination-nav:hover:not(:disabled){color:#f3f4f6}.tabular-nums{font-variant-numeric:tabular-nums}}.dark{--color-bg:#0e1218;--color-bg-elev:#14181f;--color-bg-rule:#2a3142;--color-bg-rule-2:#232838;--color-bg-rule-strong:#ece9e0;--color-bg-card:#181d27;--color-bg-card-warm:#1f1a12;--color-hub:#5a78c2;--color-hub-2:#6d8ad3;--color-hub-3:#4a65a8;--color-hub-soft:#1f2a47;--color-hub-soft-2:#2c3a5d;--color-hub-line:#7b8fbf;--color-accent:#d9a560;--color-accent-deep:#b07a3a;--color-accent-soft:#2a2418;--color-ink:#ece9e0;--color-ink-2:#c9c5b8;--color-ink-3:#8e8b82;--color-ink-4:#5d5c57;--color-brand:#5a78c2;--color-brand-deep:#4a65a8;--color-brand-soft:#1f2a47;--color-ok:#4dc076;--color-ok-soft:#1a2d22;--color-warn:#d9a560;--color-warn-soft:#2d2418;--color-err:#e07664;--color-err-soft:#2e1715;--color-gain:#4dc076;--color-gain-deep:#3aa060;--color-loss:#e07664;--color-bridge-presseecho:#4da37a;--color-bridge-businessportal:#e36340;--color-card-warm-cat:#8e8b82;--color-card-warm-title:#ece9e0;--color-feature-line:#2c3a5d;--color-feature-dot:#2a3142;--shadow-soft:0 1px 0 #0006;--shadow-card:0 1px 2px 0 #0006;--shadow-card-hover:0 4px 12px -2px #0000008c;--shadow-auth:0 1px 0 #00000080, 0 20px 50px -32px #000000b3;color-scheme:dark;--brand-mark-name-color:#fff}:root{--font-primary:var(--font-sans);--font-secondary:var(--font-sans);--background:40 30% 95%;--foreground:144 8% 11%;--card:0 0% 100%;--card-foreground:144 8% 11%;--popover:0 0% 100%;--popover-foreground:144 8% 11%;--primary:222 43% 18%;--primary-foreground:0 0% 100%;--primary-50:222 43% 96%;--primary-100:222 43% 92%;--primary-200:222 43% 85%;--primary-300:222 43% 75%;--primary-400:222 43% 60%;--primary-500:222 43% 45%;--primary-600:222 43% 36%;--primary-700:222 43% 28%;--primary-800:222 43% 22%;--primary-900:222 43% 18%;--primary-950:222 43% 12%;--secondary:224 30% 30%;--secondary-foreground:0 0% 100%;--muted:40 18% 90%;--muted-foreground:144 6% 38%;--accent:31 51% 46%;--accent-foreground:0 0% 100%;--destructive:0 84% 60%;--destructive-foreground:0 0% 100%;--border:38 23% 85%;--input:38 23% 85%;--ring:222 43% 18%;--radius:4px;--shadow-card:0 1px 2px 0 #1a25400f;--shadow-card-hover:0 4px 12px -2px #1a25401f}[x-cloak]{display:none!important}@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-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/resources/js/error-reporting.js b/resources/js/error-reporting.js index d2b474e6..65c6cddb 100644 --- a/resources/js/error-reporting.js +++ b/resources/js/error-reporting.js @@ -123,6 +123,12 @@ if (config?.dsn) { }); window.addEventListener('unhandledrejection', (event) => { + // Alpine bricht laufende x-transition-Übergänge mit diesem Objekt ab + // (GlitchTip browser-pressekonto, Issue 18) — kein Fehler. + if (event.reason?.isFromCancelledTransition === true) { + return; + } + capture(rejectionToError(event.reason)); }); } diff --git a/resources/js/passkeys.js b/resources/js/passkeys.js new file mode 100644 index 00000000..a66b89a9 --- /dev/null +++ b/resources/js/passkeys.js @@ -0,0 +1,48 @@ +// Passkeys (Entscheidung 5, 07.10.2026): dünne Hülle um den offiziellen +// Laravel-Client für Login-Seite, Sicherheitsseite und Admin-Bestätigung. +// Kein eigenes Alpine — die Seiten rufen window.PkPasskeys aus ihren +// bestehenden Alpine-Komponenten auf. Ergebnis immer { ok, error, result }. +import { + Passkeys, + InvalidDomainError, + NotSupportedError, + PasskeyExistsError, + UserCancelledError, +} from "@laravel/passkeys"; + +const CONFIRM_ROUTES = { + options: "/passkeys/confirm/options", + submit: "/passkeys/confirm", +}; + +function messageFor(error) { + if (error instanceof UserCancelledError) { + return "Der Vorgang wurde abgebrochen."; + } + if (error instanceof NotSupportedError) { + return "Dieser Browser unterstützt keine Passkeys."; + } + if (error instanceof PasskeyExistsError) { + return "Für dieses Gerät ist bereits ein Passkey hinterlegt."; + } + if (error instanceof InvalidDomainError) { + return "Passkeys funktionieren nur auf der Anmeldeseite von pressekonto."; + } + + return "Der Passkey konnte nicht geprüft werden. Bitte versuchen Sie es erneut."; +} + +async function run(action) { + try { + return { ok: true, error: null, result: await action() }; + } catch (error) { + return { ok: false, error: messageFor(error), result: null }; + } +} + +window.PkPasskeys = { + isSupported: () => Passkeys.isSupported(), + login: (remember = false) => run(() => Passkeys.verify({ remember })), + confirm: () => run(() => Passkeys.verify({ routes: CONFIRM_ROUTES })), + register: (name) => run(() => Passkeys.register({ name })), +}; diff --git a/resources/views/components/layouts/app/sidebar.blade.php b/resources/views/components/layouts/app/sidebar.blade.php index 3c94f11d..d1a9775d 100644 --- a/resources/views/components/layouts/app/sidebar.blade.php +++ b/resources/views/components/layouts/app/sidebar.blade.php @@ -41,6 +41,8 @@ : 0; $legalOpenCount = $canAdmin ? \App\Models\LegalRequest::query()->open()->count() : 0; $contactOpenCount = $canAdmin ? \App\Models\ContactMessage::query()->open()->count() : 0; + // „Neu“-Hinweis (Changelog E11): freigegebener Eintrag der letzten 14 Tage. + $changelogIsNew = \Illuminate\Support\Facades\Cache::remember(\App\Services\Changelog\ChangelogTimeline::RECENT_CACHE_KEY, 600, fn (): bool => app(\App\Services\Changelog\ChangelogTimeline::class)->hasRecent()); @endphp @@ -67,6 +69,10 @@ :current="request()->routeIs('me.press-kits.*')" wire:navigate> {{ __('Firmen') }} + + {{ __('Was ist neu') }} + @@ -219,6 +225,13 @@ {{ __('Voreinstellungen') }} + @can('settings:manage') + + {{ __('Changelog') }} + + @endcan + @can('roles:manage') @@ -230,6 +243,10 @@ {{-- Reports --}} + + {{ __('Wachstum') }} + {{ __('Performance') }} @@ -450,7 +467,7 @@ @endpersist - @vite(['resources/js/portal-form-hooks.js'], 'build/portal') + @vite(['resources/js/portal-form-hooks.js', 'resources/js/passkeys.js'], 'build/portal') @fluxScripts diff --git a/resources/views/components/layouts/auth/pressekonto.blade.php b/resources/views/components/layouts/auth/pressekonto.blade.php index 0c269a75..1baf29fd 100644 --- a/resources/views/components/layouts/auth/pressekonto.blade.php +++ b/resources/views/components/layouts/auth/pressekonto.blade.php @@ -58,6 +58,8 @@ laden, gäbe es zwei Alpine-Instanzen und wire:submit, x-data, wire:model würden brechen (siehe Browser-Logs vor diesem Fix). --}} @vite([$themeCssPath], $assetsDir) + {{-- Passkey-Login (Entscheidung 5): kleiner Client ohne eigenes Alpine. --}} + @vite(['resources/js/passkeys.js'], 'build/portal') @livewireStyles diff --git a/resources/views/components/portal/newsroom-links.blade.php b/resources/views/components/portal/newsroom-links.blade.php new file mode 100644 index 00000000..8828e2e4 --- /dev/null +++ b/resources/views/components/portal/newsroom-links.blade.php @@ -0,0 +1,23 @@ +@props([ + // Company::publicNewsroomLinks(): je Portal, auf dem der Newsroom schon erscheint. + 'links' => [], +]) + +{{-- Verknüpfung Firma ↔ Newsroom (Roadmap 6.17): Im Backend heißt der + Datensatz „Firma“, öffentlich ist er der Newsroom. Ohne sichtbare Meldung + gibt es noch keine öffentliche Seite (Roadmap 1b.1) — das steht dann da, + statt dass der Link fehlt. --}} + diff --git a/resources/views/components/turnstile.blade.php b/resources/views/components/turnstile.blade.php new file mode 100644 index 00000000..b7e8a96d --- /dev/null +++ b/resources/views/components/turnstile.blade.php @@ -0,0 +1,133 @@ +{{-- + Cloudflare Turnstile (Spamschutz B1, dev/sicherheit/ENTWICKLUNGSPLAN- + SPAMSCHUTZ-2026-10-09.md). Serverseitig prüft TurnstileVerifier. + + - Das Skript lädt erst, wenn das Widget sichtbar wird (Kontakt-Widget: + beim Öffnen) — normale Seitenaufrufe sprechen Cloudflare nicht an. + - Klassisches Formular: Turnstile legt das Feld `cf-turnstile-response` + selbst an. Wird abgeschickt, bevor das Token da ist, wartet das Formular + und sendet automatisch nach. + - Livewire: `wire-token` / `wire-unavailable` nennen die Properties, die + das Widget ohne Request setzt; `turnstile-reset` (Browser-Event) holt + nach einer abgelehnten Prüfung ein frisches Token. + - Lädt das Skript nicht (Cloudflare nicht erreichbar, Netz blockiert) + oder ist das Widget falsch konfiguriert, meldet es `turnstile_unavailable`: + Der Server lässt dann durch und markiert (Entscheidung 09.10.2026). + Nicht bestandene Challenges (Fehlercodes 300xxx/600xxx) zählen nicht + als Ausfall — Turnstile versucht es selbst erneut. +--}} +@props([ + 'action', + 'wireToken' => null, + 'wireUnavailable' => null, +]) + +@if (\App\Services\Spam\TurnstileVerifier::enabled()) +
class('min-h-[65px]') }} + > +
+ +

{{ __('web.launcher.bot_check_waiting') }}

+
+@endif diff --git a/resources/views/components/web/boosted-label.blade.php b/resources/views/components/web/boosted-label.blade.php new file mode 100644 index 00000000..f312ec84 --- /dev/null +++ b/resources/views/components/web/boosted-label.blade.php @@ -0,0 +1,27 @@ +@props([ + // tag = Schild auf dem Aufmacher-Bild, inline = kleiner Rahmen hinter der Überschrift in Listen + 'variant' => 'inline', +]) + +{{-- Kennzeichnung gebuchter Platzierungen (Rechtspaket 10/2026, U10): das + Label allein sagt, dass der Platz gebucht wurde; die Erklärung erscheint + am Desktop beim Überfahren und auf Mobil per Tipp, ohne dass der Tipp den + umgebenden Link öffnet. Screenreader lesen die Erklärung als Teil des + Linktexts mit. --}} + + @if ($variant === 'tag') + {{ __('web.shared.boosted_placement') }} + @else + {{ __('web.shared.boosted_placement') }} + @endif + : {{ __('web.shared.boosted_placement_hint') }} + + diff --git a/resources/views/components/web/contact-launcher.blade.php b/resources/views/components/web/contact-launcher.blade.php index 79d209e4..b209b4fd 100644 --- a/resources/views/components/web/contact-launcher.blade.php +++ b/resources/views/components/web/contact-launcher.blade.php @@ -163,6 +163,15 @@ {{ __('web.launcher.legal_link') }}

+ {{-- Spamschutz für Gäste und unbestätigte Konten (siehe ContactController). --}} + @unless (auth()->user()?->hasVerifiedEmail()) + + @error('turnstile') +

{{ $message }}

+ @enderror + + @endunless + {{-- Bot-Schutz: versteckte Honeypot-Felder (siehe ContactController). --}} + @can('companies:write')
{{ __('Bestehenden Kontakt zuordnen') }} @@ -444,6 +458,7 @@ new #[Layout('components.layouts.app'), Title('Firma anzeigen')] class extends C
+ @endcan
@forelse ($filteredContacts as $contact) diff --git a/resources/views/livewire/admin/contact-messages/index.blade.php b/resources/views/livewire/admin/contact-messages/index.blade.php index fffbea64..893e5ffb 100644 --- a/resources/views/livewire/admin/contact-messages/index.blade.php +++ b/resources/views/livewire/admin/contact-messages/index.blade.php @@ -19,13 +19,41 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen #[Url(as: 'topic', except: 'all')] public string $topicFilter = 'all'; + /** @var list Auswahl für die Sammelaktion „Als Spam markieren“. */ + public array $selected = []; + + public string $notification = ''; + public function updatedStatusFilter(): void { + $this->selected = []; $this->resetPage(); } + /** + * Sammelaktion: ausgewählte Anliegen in die Spam-Quarantäne legen + * (Spamschutz B3). Keine Mail, Löschung nach 30 Tagen. + */ + public function markSelectedAsSpam(): void + { + $this->authorize('compliance:manage'); + + $messages = ContactMessage::query() + ->whereKey(array_map('intval', $this->selected)) + ->where('status', '!=', ContactMessageStatus::Spam->value) + ->get(); + + foreach ($messages as $message) { + $message->markAsSpam(auth()->user()); + } + + $this->selected = []; + $this->notification = __(':count Anliegen als Spam markiert.', ['count' => $messages->count()]); + } + public function updatedTopicFilter(): void { + $this->selected = []; $this->resetPage(); } @@ -42,7 +70,8 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen 'messages' => $messages, 'topicOptions' => ContactMessageTopic::cases(), 'openCount' => ContactMessage::query()->open()->count(), - 'totalCount' => ContactMessage::query()->count(), + 'spamCount' => ContactMessage::query()->where('status', ContactMessageStatus::Spam->value)->count(), + 'totalCount' => ContactMessage::query()->where('status', '!=', ContactMessageStatus::Spam->value)->count(), ]; } @@ -53,6 +82,7 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen ContactMessageStatus::InProgress => 'hub', ContactMessageStatus::Resolved => 'ok', ContactMessageStatus::Rejected => 'err', + ContactMessageStatus::Spam => 'muted', }; } }; ?> @@ -67,14 +97,18 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen /> {{-- ============== KPI-Reihe ============== --}} -
+
{{ __('zu bearbeiten') }} {{ __('offen + in Bearbeitung') }} {{ __('alle Anliegen') }} - {{ __('inkl. erledigt') }} + {{ __('inkl. erledigt, ohne Spam') }} + + + {{ __('in Quarantäne') }} + {{ __('ohne Mail, nach :days Tagen gelöscht', ['days' => \App\Models\ContactMessage::SPAM_RETENTION_DAYS]) }}
@@ -89,6 +123,7 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen + @@ -104,12 +139,28 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen
{{ __('Anliegen') }} - - {{ __(':count Einträge', ['count' => $messages->total()]) }} - +
+ @if (count($selected) > 0) + + {{ __(':count als Spam markieren', ['count' => count($selected)]) }} + + @endif + + {{ __(':count Einträge', ['count' => $messages->total()]) }} + +
+ @if ($notification) +
+ + {{ $notification }} +
+ @endif + {{ __('Auswahl') }} {{ __('Anliegen') }} {{ __('Status') }} {{ __('Absender') }} @@ -121,6 +172,13 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen @forelse ($messages as $message) + + @unless ($message->isSpam()) + + @endunless + {{ $message->topic->label() }} @@ -133,6 +191,11 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen {{ $message->status->label() }} + @if ($message->isSpam() && $message->spamReasonLabel()) + {{ $message->spamReasonLabel() }} + @elseif ($message->skippedBotCheck()) + {{ __('ohne Bot-Prüfung') }} + @endif @@ -161,7 +224,7 @@ new #[Layout('components.layouts.app'), Title('Kontakt')] class extends Componen @empty - +
diff --git a/resources/views/livewire/admin/contact-messages/show.blade.php b/resources/views/livewire/admin/contact-messages/show.blade.php index 981146ef..337a5c4e 100644 --- a/resources/views/livewire/admin/contact-messages/show.blade.php +++ b/resources/views/livewire/admin/contact-messages/show.blade.php @@ -2,6 +2,7 @@ use App\Enums\ContactMessageStatus; use App\Models\ContactMessage; +use App\Services\Web\ContactMessageNotifier; use Livewire\Attributes\Layout; use Livewire\Attributes\Locked; use Livewire\Attributes\Title; @@ -56,6 +57,34 @@ new #[Layout('components.layouts.app'), Title('Anliegen · Kontakt')] class exte $this->notification = __('Anliegen wieder geöffnet.'); } + public function markAsSpam(): void + { + $this->authorize('compliance:manage'); + + $this->message()->markAsSpam(auth()->user()); + $this->notification = __('Als Spam markiert. Nach :days Tagen wird das Anliegen gelöscht.', ['days' => ContactMessage::SPAM_RETENTION_DAYS]); + } + + /** + * Fehlalarm der Spam-Quarantäne: wieder öffnen und die Team-Mail + * nachholen, die beim Eingang zurückgehalten wurde. + */ + public function releaseFromSpam(ContactMessageNotifier $notifier): void + { + $this->authorize('compliance:manage'); + + $message = $this->message(); + + if ($message->releaseFromSpam()) { + $notifier->notify($message->refresh()); + $this->notification = __('Kein Spam: Anliegen wieder geöffnet, die Mail an das Team wurde nachgeholt.'); + + return; + } + + $this->notification = __('Kein Spam: Anliegen wieder geöffnet.'); + } + private function finish(ContactMessageStatus $status, string $notification): void { $this->message()->update([ @@ -85,6 +114,7 @@ new #[Layout('components.layouts.app'), Title('Anliegen · Kontakt')] class exte ContactMessageStatus::InProgress => 'hub', ContactMessageStatus::Resolved => 'ok', ContactMessageStatus::Rejected => 'err', + ContactMessageStatus::Spam => 'muted', }; } }; ?> @@ -155,6 +185,18 @@ new #[Layout('components.layouts.app'), Title('Anliegen · Kontakt')] class exte
{{ __('Portal') }}
{{ $message->portal ?: '—' }}
+ @if ($message->spamReasonLabel()) +
+
{{ __('Spamschutz') }}
+
{{ $message->spamReasonLabel() }}
+
+ @endif + @if ($message->skippedBotCheck()) +
+
{{ __('Bot-Prüfung') }}
+
{{ __('Cloudflare nicht erreichbar — bitte prüfen') }}
+
+ @endif @if ($message->user)
{{ __('Benutzerkonto') }}
@@ -217,6 +259,13 @@ new #[Layout('components.layouts.app'), Title('Anliegen · Kontakt')] class exte {{ __('Ablehnen') }} + + {{ __('Als Spam markieren') }} + + @elseif ($message->isSpam()) + + {{ __('Kein Spam — wieder öffnen') }} + @else {{ __('Wieder öffnen') }} diff --git a/resources/views/livewire/admin/payments/plans.blade.php b/resources/views/livewire/admin/payments/plans.blade.php index 4a05be43..c3706109 100644 --- a/resources/views/livewire/admin/payments/plans.blade.php +++ b/resources/views/livewire/admin/payments/plans.blade.php @@ -284,7 +284,7 @@ new #[Layout('components.layouts.app'), Title('Tarife & Pakete')] class extends
diff --git a/resources/views/livewire/admin/press-releases/show.blade.php b/resources/views/livewire/admin/press-releases/show.blade.php index 387efe8b..624e27be 100644 --- a/resources/views/livewire/admin/press-releases/show.blade.php +++ b/resources/views/livewire/admin/press-releases/show.blade.php @@ -7,6 +7,7 @@ use App\Enums\AiImageDeclaration; use App\Services\PressRelease\ImageRightsConfirmationRequiredException; use App\Enums\ImagePrecheckCategory; use App\Services\Image\Precheck\ImagePrecheckReviewService; +use App\Services\PressRelease\BoostService; use App\Services\PressRelease\Images\ImageCorrectionService; use App\Services\PressRelease\PressReleaseService; use App\Services\PressRelease\QuotaExceededException; @@ -116,6 +117,31 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends Flux::modal('confirm-show-archive')->close(); } + public string $boostEndReason = ''; + + /** + * Gebuchte Platzierung vorzeitig beenden (Rechtspaket 10/2026, U10): + * etwa nach einem Test-Boost oder wenn die Platzierung nicht mehr + * vertretbar ist. Ohne Rückbuchung; nur mit Abrechnungsrecht. + */ + public function endBoost(BoostService $boosts): void + { + $this->authorize('billing:manage'); + + $this->validate([ + 'boostEndReason' => ['required', 'string', 'min:5', 'max:490'], + ]); + + $ended = $boosts->endActive($this->findAdminPR($this->id), auth()->user(), trim($this->boostEndReason)); + + $this->boostEndReason = ''; + + Flux::toast( + text: $ended > 0 ? __('Gebuchte Platzierung beendet.') : __('Kein laufender Boost.'), + variant: $ended > 0 ? 'success' : 'warning', + ); + } + /** * Korrekturweg (Bildkennzeichnung E.6): Bildnachweis oder * Portalkennzeichnung mit Pflichtgrund ändern, Bild vorläufig zurückhalten. @@ -275,6 +301,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends 'latestRejection' => $latestRejection, 'coverUrl' => $cover->coverUrl($pr, 'cover'), 'coverIsPlaceholder' => $cover->coverIsPlaceholder($pr), + 'activeBoosts' => $pr->boosts()->active()->orderBy('ends_at')->get(), 'categoryName' => $pr->category?->translations->firstWhere('locale', 'de')?->name ?? $pr->category?->translations->first()?->name ?? '–', @@ -489,6 +516,35 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
@endif + {{-- ============== GEBUCHTE PLATZIERUNG (BOOST) ============== --}} + @if ($activeBoosts->isNotEmpty()) +
+
+ {{ __('Gebuchte Platzierung') }} + {{ __('läuft') }} +
+
+
    + @foreach ($activeBoosts as $activeBoost) +
  • + {{ $activeBoost->placement->label() }} · {{ __(':days Tage', ['days' => $activeBoost->days]) }} · {{ __(':credits Credits', ['credits' => $activeBoost->credits_charged]) }} + ({{ $activeBoost->starts_at->format('d.m.Y H:i') }} – {{ $activeBoost->ends_at->format('d.m.Y H:i') }}) +
  • + @endforeach +
+ @can('billing:manage') +

+ {{ __('Beenden nimmt die Meldung sofort von Start- und Branchenseite. Die Buchung bleibt als Nachweis erhalten; Credits werden nicht zurückgebucht.') }} +

+ +
+ {{ __('Boost beenden') }} +
+ @endcan +
+
+ @endif + {{-- ============== REJECTION-HINWEIS ============== --}} @if ($pr->status === \App\Enums\PressReleaseStatus::Rejected && $latestRejection)
diff --git a/resources/views/livewire/admin/reports/growth.blade.php b/resources/views/livewire/admin/reports/growth.blade.php new file mode 100644 index 00000000..52014e94 --- /dev/null +++ b/resources/views/livewire/admin/reports/growth.blade.php @@ -0,0 +1,163 @@ +fresh = true; + } + + public function with(): array + { + $report = app(GrowthReport::class)->build($this->fresh); + $this->fresh = false; + + return [ + 'report' => $report, + 'funnel' => app(ConversionFunnelReport::class)->build($report['period']['start']), + ]; + } +}; ?> + +
+ + + @php + $period = $report['period']; + @endphp + +
+ + {{ __(':percent % der Zeit vergangen', ['percent' => (int) round($period['elapsed_share'] * 100)]) }} + + + {{ __('danach Audit im Quartal') }} + + + {{ $report['umami']['error'] ?? __('zwischengespeichert, siehe unten') }} + + + {{ __('dieselben Zahlen auf der Konsole') }} + +
+ + @foreach ($report['blocks'] as $block) +
+
+ {{ $block['title'] }} + {{ $block['consequence'] }} +
+ + + {{ __('Bedingung') }} + {{ __('Ist') }} + {{ __('Soll heute') }} + {{ __('Schwelle') }} + {{ __('Status') }} + + + @foreach ($block['criteria'] as $criterion) + + + {{ $criterion['label'] }} + @if ($criterion['note']) + {{ $criterion['note'] }} + @endif + + {{ $criterion['actual'] ?? '—' }} + {{ $criterion['expected'] ?? '—' }} + {{ $criterion['threshold'] }} + + {{ GrowthReport::statusLabel($criterion['status']) }} + + + @endforeach + + +
+ @endforeach + +
+
+ {{ __('Trichter seit :date', ['date' => $period['start']->format('d.m.Y')]) }} + {{ __('eindeutige Firmen je Stufe; „ohne Firma“ steht daneben, nicht im Nenner') }} +
+ @forelse ($funnel['sources'] as $source) +
{{ $source['label'] }}
+ + + # + {{ __('Stufe') }} + {{ __('Firmen') }} + {{ __('Übergang') }} + {{ __('ohne Firma') }} + {{ __('Ein Abbruch hier bedeutet') }} + + + @foreach ($source['steps'] as $step) + + {{ $step['step'] }} + {{ $step['label'] }} + {{ $step['firmen'] }} + {{ $step['uebergang'] === null ? '–' : number_format($step['uebergang'], 1, ',', '.').' %' }} + {{ $step['ohne_firma'] ?: '' }} + {{ $step['diagnosis'] }} + + @endforeach + + + @empty +
{{ __('Keine Ereignisse im Zeitraum.') }}
+ @endforelse +
+ +
+
+ {{ __('Transparenzseiten · letzte 30 Tage') }} + {{ __('Umami neu abfragen') }} +
+ @if ($report['pages'] === []) +
{{ $report['umami']['error'] ?? __('Keine Daten.') }}
+ @else + + + {{ __('Portal') }} + {{ __('Seite') }} + {{ __('Aufrufe') }} + {{ __('aus der Suche') }} + + + @foreach ($report['pages'] as $row) + + {{ $row['brand'] }} + {{ $row['page'] }} + {{ $row['views'] }} + {{ $row['search_views'] }} + + @endforeach + + + @endif +
+
diff --git a/resources/views/livewire/admin/users/edit.blade.php b/resources/views/livewire/admin/users/edit.blade.php index c8b01499..d7efba7b 100644 --- a/resources/views/livewire/admin/users/edit.blade.php +++ b/resources/views/livewire/admin/users/edit.blade.php @@ -2,10 +2,13 @@ use App\Enums\Portal; use App\Enums\RegistrationType; +use App\Enums\SecurityChange; use App\Models\Company; use App\Models\Contact; use App\Models\User; use App\Services\Admin\AdminPerformanceCache; +use App\Services\Auth\SecurityNotifier; +use App\Services\Auth\SessionRevocation; use Illuminate\Database\Eloquent\Collection; use Illuminate\Validation\Rule; use Livewire\Attributes\Layout; @@ -622,6 +625,48 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte 'countries' => config('countries.items', []), 'portalOptions' => Portal::cases(), 'registrationTypeOptions' => RegistrationType::cases(), + 'secondFactors' => $this->secondFactorsOfTarget(), + ]; + } + + /** + * Notfallweg bei verlorenem Gerät (Entscheidung 5, 07.10.2026): Ein + * Super-Admin setzt Passkeys und Authenticator-App eines anderen Kontos + * zurück. Alle Sessions des Kontos enden, der Inhaber wird informiert und + * richtet den zweiten Faktor nach der nächsten Anmeldung neu ein. + */ + public function resetSecondFactors(SessionRevocation $sessions, SecurityNotifier $notifier): void + { + $this->authorize('users:manage'); + abort_unless(auth()->user()->is_super_admin, 403); + + $user = User::query()->findOrFail($this->id); + abort_if($user->is(auth()->user()), 403, __('Das eigene Konto verwalten Sie unter „Sicherheit“.')); + + $user->passkeys()->delete(); + $user->forceFill([ + 'two_factor_secret' => null, + 'two_factor_recovery_codes' => null, + 'two_factor_confirmed_at' => null, + ])->save(); + + $sessions->revokeAllFor($user); + $notifier->notify($user, SecurityChange::SecondFactorsReset); + + session()->flash('success', __('Passkeys und Zwei-Faktor-Authentifizierung wurden zurückgesetzt. Alle Sitzungen des Kontos sind beendet.')); + } + + /** + * @return array{passkeys: int, totp: bool, canReset: bool} + */ + private function secondFactorsOfTarget(): array + { + $user = User::query()->find($this->id); + + return [ + 'passkeys' => $user?->passkeys()->count() ?? 0, + 'totp' => (bool) $user?->hasEnabledTwoFactorAuthentication(), + 'canReset' => $user !== null && auth()->user()->is_super_admin && ! $user->is(auth()->user()), ]; } @@ -1160,6 +1205,24 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte @endforelse + {{-- Zweiter Faktor (Entscheidung 5): Notfall-Reset nur durch Super-Admins. --}} + + {{ __('Zweiter Faktor') }} +

+ {{ trans_choice('{0} Keine Passkeys|{1} :count Passkey|[2,*] :count Passkeys', $secondFactors['passkeys'], ['count' => $secondFactors['passkeys']]) }} + · {{ $secondFactors['totp'] ? __('Authenticator-App aktiv') : __('keine Authenticator-App') }} +

+ @if ($secondFactors['canReset'] && ($secondFactors['passkeys'] > 0 || $secondFactors['totp'])) +
+ + {{ __('Zweiten Faktor zurücksetzen') }} + +
+ @endif +
+ {{ __('Rechnungsadresse') }} diff --git a/resources/views/livewire/auth/login.blade.php b/resources/views/livewire/auth/login.blade.php index e96a6f6d..63c376f2 100644 --- a/resources/views/livewire/auth/login.blade.php +++ b/resources/views/livewire/auth/login.blade.php @@ -2,6 +2,7 @@ use App\Models\User; use App\Services\Auth\LoginCompletion; +use App\Services\Auth\LoginIpThrottle; use App\Support\LoginRedirect; use Illuminate\Auth\Events\Failed; use Illuminate\Auth\Events\Lockout; @@ -99,7 +100,12 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Willkommen zu */ protected function ensureIsNotRateLimited(): void { - if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + // Zwei Grenzen: je Adresse und IP sowie IP-weit über alle Konten + // (LoginIpThrottle, Fehlversuche zählt CountFailedLoginsPerIp). + $ipThrottle = app(LoginIpThrottle::class); + $accountLimited = RateLimiter::tooManyAttempts($this->throttleKey(), 5); + + if (! $accountLimited && ! $ipThrottle->isBlocked(request()->ip())) { return; } @@ -107,7 +113,9 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Willkommen zu // für den Aktivitäts-Verlauf mitgeben. event(new Lockout(request()->duplicate(request: ['email' => $this->email]))); - $seconds = RateLimiter::availableIn($this->throttleKey()); + $seconds = $accountLimited + ? RateLimiter::availableIn($this->throttleKey()) + : $ipThrottle->availableIn(request()->ip()); throw ValidationException::withMessages([ 'email' => __('auth.throttle', [ @@ -175,6 +183,27 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Willkommen zu
+ {{-- Passkey-Login (Entscheidung 5, 07.10.2026): Fingerabdruck, Gesicht + oder Geräte-PIN statt Passwort und App-Code. Nur sichtbar, wenn der + Browser WebAuthn kann. --}} +
+ +

+
+
+ @if ($sent) +
+ {{ __('Wir haben einen Anmeldelink an :email geschickt. Er ist 15 Minuten gültig; nach dem Klick landen Sie direkt bei Ihrer Pressemitteilung.', ['email' => $maskedEmail]) }} +
+ @else +

+ {{ __('Sie brauchen weder ein Konto noch ein Passwort. Wir schicken einen Anmeldelink an die Adresse, an die unsere Mail ging:') }} +

+

{{ $maskedEmail }}

+

{{ __('Pressemitteilung:') }} {{ $title }}

+ + @error('link') +

{{ $message }}

+ @enderror + + + @endif + +

+ {{ __('Nach der Anmeldung können Sie die Meldung ansehen und korrigieren, eine abgelehnte Meldung überarbeiten und erneut einreichen, die Aufrufe verfolgen und den Newsroom Ihrer Firma pflegen. Das ist kostenlos.') }} +

+
diff --git a/resources/views/livewire/auth/register.blade.php b/resources/views/livewire/auth/register.blade.php index ea9362c6..c64db954 100644 --- a/resources/views/livewire/auth/register.blade.php +++ b/resources/views/livewire/auth/register.blade.php @@ -1,7 +1,11 @@ 'Konto erstell public bool $terms_accepted = false; + /** Vom Turnstile-Widget gesetzt (Spamschutz B4). */ + public string $turnstileToken = ''; + + public bool $turnstileUnavailable = false; + /** * Handle an incoming registration request. */ - public function register(): void + public function register(TurnstileVerifier $turnstile, ActivityLog $activityLog): void { $validated = $this->validate([ - 'name' => ['required', 'string', 'max:255'], + // Bots registrieren mit Zufallsnamen („ruLrlotwaCoVStmZetSxD“), + // 389 Konten in 30 Tagen bis 07.10.2026 (Spamschutz B4). + 'name' => ['required', 'string', 'max:255', function (string $attribute, mixed $value, \Closure $fail): void { + if (is_string($value) && GibberishDetector::isRandomPersonName($value)) { + $fail(__('Bitte geben Sie Ihren Vor- und Nachnamen an.')); + } + }], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], 'terms_accepted' => ['accepted'], @@ -46,6 +61,21 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Konto erstell RateLimiter::hit('register-ip|'.request()->ip(), 3600); + // Jede Registrierung verschickt eine Bestätigungsmail an die + // angegebene Adresse — ohne Bot-Prüfung ein Werkzeug, fremde + // Postfächer zu fluten. Ist Cloudflare nicht erreichbar, wird + // durchgelassen und im Verlauf markiert (Entscheidung 09.10.2026). + $botCheck = $turnstile->verify($this->turnstileToken, $this->turnstileUnavailable, 'register', request()->ip()); + + if ($botCheck->blocks()) { + $this->turnstileToken = ''; + $this->dispatch('turnstile-reset'); + + throw ValidationException::withMessages([ + 'turnstile' => __('Die Sicherheitsprüfung ist fehlgeschlagen. Bitte warten Sie einen Moment und versuchen Sie es erneut.'), + ]); + } + // Die bestätigte AGB-/Datenschutz-Checkbox wird als DSGVO-Einwilligung // mit Zeitstempel festgehalten (users.gdpr_consent_at). unset($validated['terms_accepted']); @@ -65,6 +95,16 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Konto erstell // SendEmailVerificationNotification-Listener die Bestätigungsmail. event(new Registered($user = User::create($validated))); + if ($botCheck->needsReview()) { + $activityLog->record( + ActivityType::BotCheckUnavailable, + sprintf('Registrierung von %s ohne Bot-Prüfung angenommen (%s) — bitte nachprüfen.', $user->email, $botCheck->reason), + user: $user, + subject: $user, + meta: ['form' => 'register', 'reason' => $botCheck->reason], + ); + } + Auth::login($user); // Direkt zur Bestätigungs-/Notice-Seite. Ohne navigate:true, weil das @@ -117,7 +157,7 @@ new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Konto erstell name="password" :label="__('Passwort')" autocomplete="new-password" - :placeholder="__('Mindestens 8 Zeichen')" + :placeholder="__('Mindestens 12 Zeichen')" /> 'Konto erstell @enderror
+
+ + @error('turnstile') +

{{ $message }}

+ @enderror +
+