diff --git a/.gitignore b/.gitignore index 30a5fd4..b4d426c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ *.log .DS_Store Thumbs.db + +# Internal maintainer notes (not shipped) +/AUDIT_IMPLEMENTATION.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4d40de2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,363 @@ +# Changelog + +All notable changes to **janczakb/filament-short-url** are documented here. + +Recent releases (v5.x) are summarized in [README.md](README.md#changelog). This file contains the full history for older versions and the complete **v5.2.0** release notes (including enterprise hardening follow-up, signed 2026-06-08). + +--- + +## v5.2.3 + +> **Production Redis mode, stats scaling for high traffic, and Settings diagnostics.** + +### Settings → Redis & queue diagnostics + +- **Redis connection in Settings** — When **Queue Connection = `redis`**, configure host, port, password, database, and key prefix in **Settings → General**. Values are stored in `short_url_settings` and **override** `database.redis` + `queue.connections.redis` at runtime (independent of `CACHE_STORE`). +- **Test Redis connection** — PING + pipelined `INCR`/`SADD` probe (same Redis primitives as visit counters). Uses unsaved form values via preview overrides. +- **Test queue worker** — Dispatches `VerifyQueueWorkerJob` on the selected connection/queue and waits up to 12 s for a worker to process it; reports the exact `php artisan queue:work {connection} --queue={name}` command on failure. +- **Unified queue callout** — Single info box per async driver with a **dynamic** worker command from current Settings (no duplicate boxes; hidden entirely for `sync`). +- **`withPreviewSettings()`** — Settings test buttons apply form state temporarily without saving. + +### Stats scaling (`queue_connection = redis`) + +- **`StatsScalingProfile`** — Central profile: auto counter buffering, dedicated Redis counters, Redis today buffer, SQL micro-cache for sync mode. +- **`PluginRedisConnection`** — Resolves Redis from `queue.connections.redis` (phpredis/Predis), not from `CACHE_STORE`. +- **`VisitCounterBuffer`** — Unified buffered totals/uniques: dedicated Redis path when Settings queue is `redis`, Laravel cache path for sync + manual toggle. +- **`TodayStatsBuffer`** — Pipelined Redis counters for today's summary and hourly charts; merged live in `HasStatsCache` without busting historical stats cache on every click. +- **`StatsVisitRecorder`** — Hot-path stats side effects extracted from the visit job; **`TrackShortUrlVisitJob`** no longer clears full stats cache per visit. +- **`SyncBufferedCountersCommand`** — Refactored to flush via `VisitCounterBuffer` (Redis dirty-set + cache path). +- **Live feed** — `LiveFeedBroadcaster` prefers plugin queue Redis over cache-store Redis (unchanged priority, now shares infra with counters/stats when queue is `redis`). + +### Config & migrations + +- **`config/filament-short-url.php`** — New `redis.*` defaults (`REDIS_HOST`, `REDIS_PORT`, …) used as fallbacks before Settings overrides. +- **Service provider** — All package migrations registered in `hasMigrations()` including `2026_06_10_000001` and `2026_06_11_000001`. + +### Tests + +- **`tests/Feature/StatsScalingTest.php`** — Redis queue profile, today buffer, counter buffering. +- **`tests/Feature/RedisSettingsTest.php`** — Config overrides, masked password preservation, sync worker test. +- **`tests/Unit/PluginRedisConnectionTesterTest.php`** — Redis health-check service. + +--- + +## v5.2.2 + +> **Enterprise hardening, airtight visit counters, trait refactor, and i18n audit.** + +### Security + +- **XSS** — `@json()` in pixel interstitial and Alpine stats widgets (replaces `addslashes()`). +- **Atomic `max_visits`** — `VisitSlotReservation::reserveAtomicSlot()` with fast-path SQL and pessimistic lock near cap. +- **Single-use bots** — BotDetector gate before consuming single-use links. +- **Buffer double-count** — `revertBufferedIncrements()` before DB fallback in `HasVisitCounters`. +- **API tenancy** — `owner_user_id` required on API keys when `scope_links_to_user` is enabled. +- **IDOR** — `ResourceOwnershipValidator` for folder/tag/pixel on API writes. +- **Redirect pipeline** — Limits before app interstitial; caps enforced when `track_visits=false`. + +### Performance + +- **`max_visits_pessimistic_remaining`** config (default 5). +- **`LiveFeedBroadcaster`** — Redis source priority: plugin **Settings → Queue Connection = redis** first, then `CACHE_STORE=redis`; pub/sub push with PhpRedis, SSE poll fallback otherwise. +- **`StatsCacheHelper`** — `Cache::lock` on stats miss. +- **`preloadBufferedCountersForIds()`** — Batch buffer reads in list tables. + +### Quality + +- **Public stats** — Uniform 404; public-safe response subset. +- **Octane** — A/B variant on request attributes. +- **Filtered uniques** — Rollup merge in `FilteredStatsCollector`. +- **`findByKey()`** — `domain_scope_id` index path. + +### Maintainability + +- **`HasStats` facade** — `HasVisitCounters`, `HasStatsCache`, `HasStatsQueries`, `HasSecurityStats`. +- **i18n** — API, redirect, and visitor-facing strings use translation keys (EN + PL). + +### Tests + +- **`tests/Feature/WorldClassHardeningTest.php`** — Comprehensive audit regression suite. + +--- + +## v5.2.1 + +> **Audit roadmap follow-up** — Authorization policy, API stats parity, SSE live feed, load baselines, and hardening tests. + +### Authorization + +- **`ShortUrlPolicy`** — `view`, `update`, `delete`, `restore`, `forceDelete`, and `manageSettings` aligned with `scope_links_to_user` / `user_id`. Auto-registered in `FilamentShortUrlServiceProvider` when the host has no custom policy. +- **Stats page** — `ViewShortUrlStats` calls `authorize('view', $record)`. + +### REST API + +- **Filtered stats** — `GET /links/{idOrKey}/stats` passes query filters to `FilteredStatsCollector` (same dimensions as the Filament stats dashboard). +- **`ApiStatsFilterParser`** — Parses `CrossDimensionalStatsEngine::FILTER_KEYS` plus aliases `country` → `country_code`, `device` → `device_type`. +- **Response meta** — Returns `meta.date_from`, `meta.date_to`, and `meta.filters`. + +### Live feed (SSE) + +- **`ShortUrlLiveFeedStreamController`** — Authenticated SSE endpoint at `GET /short-url/live-feed/{shortUrl}/stream`. +- **Widget** — Alpine `EventSource` + `ShortUrlLiveFeedWidget::onStreamUpdate()` replaces Livewire polling. +- **Config** — `live_feed.sse_interval_seconds` (default 3), `live_feed.sse_max_duration_seconds` (default 120). + +### Load & stress baselines + +- **`php artisan short-url:stress-redirect {key}`** — In-process redirect benchmark (avg / min / p95 / max ms). +- **`scripts/k6/redirect-baseline.js`** — k6 HTTP load script with setup probe, configurable VUs/duration, and p95 thresholds. + +### Tests + +- **`tests/Feature/RoadmapHardeningTest.php`** — Policy scoping, API stats filters, webhook HMAC E2E via `Http::fake()`, `max_visits` burst guard, SSE stream authorization, stress command smoke test. + +--- + +## v5.2.0 + +> **Main release theme: SEO & Social + integration hardening** — Open Graph metadata, link cloaking, search indexing control, expanded REST API, production security fixes, and **enterprise hardening** (GA4 MP, Geo-IP, custom domain DNS gate). + +### Stats & security hardening (audit follow-up) + +- **Filtered stats optimizer** — `FilteredStatsCollector` replaces 15+ raw GROUP BY queries with daily JSON rollups + single summary + cursor pass. +- **Cross-dimensional daily rollups** — `CrossDimensionalStatsEngine` stores single- and two-filter slices in `short_url_daily_stats` (`cross_dimensional_stats`, `cross_filter_pairs`, `filter_qr_counts`); aggregation uses one cursor pass instead of 11 GROUP BY queries; re-aggregation backfills NULL cross columns. +- **Stats cache helper** — `StatsCacheHelper` wraps remember/forget with driver-agnostic fallbacks (file, database, Redis, Memcached, array). +- **Security widget cache** — `getSecurityBreakdownStats()` with daily `all_visits_count` / `bot_visits_count` / `proxy_visits_count` rollups. +- **World map** — Always routes through `getCachedStats()`. +- **VPN fail-closed** — When `block_with_403`, detection timeout/error blocks access. +- **Public stats password** — Accepted only via POST body or `Authorization` header (not query string). +- **Custom domain legacy URLs** — `/s/{key}` → 301 → `/{key}` on verified custom domains. + +### SEO, Open Graph & Link Cloaking + +- **New SEO & Social tab** — `og_title`, `og_description`, `og_image`, `do_index`, `is_cloaked`, live social preview sidebar. +- **Custom Open Graph meta** — Per-link OG/Twitter tags for Facebook, LinkedIn, X, Slack, WhatsApp, and other preview bots. +- **Search Engine Indexing (`do_index`)** — Per-link toggle; when off, all responses emit `noindex, nofollow`. +- **Link Cloaking (`is_cloaked`)** — Iframe embedding on your short-link domain for humans; standalone OG page for crawlers. +- **OG meta scraper** — SSRF-safe streaming fetch (`GET /short-url/scrape-meta`). +- **OG image pipeline** — WebP conversion, temp storage, promotion to permanent disk on save. +- **Iframeable pre-check** — `POST /short-url/check-iframeable` with redirect-chain validation. + +### REST API + +- **Bulk create** — `POST /api/short-url/links/bulk` (max 100). +- **Upsert** — `PUT /api/short-url/links/upsert` by `external_id` or `url_key` + `destination_url`. +- **Helpers** — `GET /links/exists`, `/links/random`, `/links/info`. +- **CSV export** — `GET /links/{idOrKey}/visits/export`. +- **Tags & Folders CRUD** — `/api/short-url/tags`, `/api/short-url/folders`. +- **Per-key owner scoping** — Optional `owner_user_id` on API keys. +- **Link-level UTM** — `utm_*` and `ref` stored on the link and merged on redirect. +- **Expanded serializer** — `external_id`, UTM fields, tags, folder, archive, public stats flags. +- **Visits, bulk delete/update** — Paginated visits log, bulk delete by IDs/keys, bulk patch. + +### Public Stats + +- **Shareable endpoint** — `GET /short-url/public-stats/{url_key}` with optional password (`public_stats_enabled`, `public_stats_password`). + +### Security & Reliability + +- **Password hashing** — Link passwords hashed at rest; legacy plain-text re-hashed on save. +- **DNS-aware SSRF guard** — Webhooks, OG scraper, iframe checker block hostnames resolving to private IPs. +- **`OutboundUrl` rule** — Shared validation for outbound URLs. +- **Safe Browsing fail-closed** — Unreachable API rejects URLs when checking is enabled. +- **Global webhook toggle** — `global_webhook_enabled` must be on for global webhooks to fire. +- **`log-error` hardened** — Auth + throttle + validation. +- **Bot hardening** — Bot visit exclusion, optional click dedup, Googlebot IP verify, `?bot=1` secret. +- **Single-use fix** — No visit recorded after single-use consumption. +- **Redis counter fix** — Buffered stats sync with Redis cache driver. + +### Settings GUI + +- **Analytics & Bot Detection** — Click deduplication, Googlebot verify, bot debug secret in **Settings → Advanced**. + +### Database (safe upgrade) + +- **Migration `2026_06_08_000001`** — Adds nullable `external_id`, `utm_*`, `ref`, `public_stats_*`, and index on `short_url_visits (short_url_id, ip_hash)`. No existing data modified. +- **Migration `2026_06_09_000001`** — Adds `domain_scope_id`, composite unique `(url_key, domain_scope_id)`, FK on `custom_domain_id` (`ON DELETE SET NULL`), admin/aggregation indexes, and JSON stats columns on `short_url_daily_stats`. Existing rows backfilled (`domain_scope_id = custom_domain_id` where set, else `0`). +- **Cross-database** — No `->after()` hints, no DB-specific `ENUM`; runs on SQLite, MySQL, and PostgreSQL. + +### Performance & reliability audit + +- **`domain_scope_id` + composite unique** — Same slug on default domain and custom domains without collision. +- **Custom domain routing** — Root-level URLs on verified domains; reserved segments blocked (`api`, `admin`, `auth`, …). +- **`getRealTimeTotalVisits()`** — Merges buffered counters for accurate `max_visits` / single-use checks with cached redirect models. +- **HasStats / aggregation** — Incremental daily aggregation, bot/proxy filters, chunked prune, Redis dirty-set fix, scoped buffer reads, unique metric via `COUNT(DISTINCT ip_hash)`. +- **`SyncBufferedCountersCommand`** — Atomic batch flush; temp keys cleaned after commit. +- **`VerifyCustomDomainsCommand`** — Scheduled DNS re-verification for custom domains. +- **API** — Transactions on bulk/upsert, `ShortUrlCacheInvalidator`, scoped `exists`, hashed-only API keys, public stats throttle. +- **Security** — `AuthenticateShortUrlApi` drops plaintext legacy keys; public stats password from query/body/Authorization. +- **Settings** — VPN cache TTL + timeout in GUI; settings cache 3600s; queue default remains **`sync`** (opt-in `database`/`redis`). +- **Support classes** — `HostNormalizer`, `ShortUrlCacheInvalidator`, `LinkUtmMerger`, `ApiLinkScope`, `VisitCsvExporter`. +- **Verification doc** — Full itemized checklist in **[AUDIT_IMPLEMENTATION.md](AUDIT_IMPLEMENTATION.md)**. + +### Refactoring + +- **`ShortUrlRedirectHandler`**, **`RedirectUrlResolver`**, **`OgMetaPresenter`**, **`StatsSqlHelper`**, **`SafeUrl` rule**. + +### Enterprise hardening (follow-up — 2026-06-08) + +> **Signed:** Bartek Janczak — post-audit production hardening before v5.2.0 tag. + +#### GA4 Measurement Protocol (enterprise) + +- **`Ga4MeasurementProtocolService`** — Extracted from `TrackShortUrlVisitJob`; singleton registered in service provider. +- **Full MP payload** — `timestamp_micros`, `session_id`, `engagement_time_msec`, standard events `page_view` + `click`, custom `short_url_visit`. +- **Measurement ID validation** — Rejects invalid `ga_tracking_id` format before HTTP; logs and skips send. +- **Settings Test connection** — Requires real `G-XXXXXXXXXX` (or Firebase App ID); validates via GA4 debug collector with the configured secret (not placeholder `G-XXXXXXXXXX`). +- **Privacy-safe `client_id`** — Deterministic SHA-256 hash of IP + User Agent (unchanged semantics, now in dedicated service). + +#### Geo-IP foolproofing + +- **Headers driver auto-trust** — Saving `geo_ip_driver = headers` forces `trust_cdn_headers = true` in DB and runtime config. +- **Offline fallback chain** — When CDN headers are missing, Headers driver falls back to MaxMind, then ip-api (instead of returning empty geo). +- **ip-api rate limit** — Laravel `RateLimiter` guard: max 40 lookups/minute (`fsu_geo_ip_api:{YmdHi}`). +- **Settings UI** — GeoIP tab info callout explains auto-trust and fallback behaviour. + +#### Custom domains (DNS gate) + +- **Multi-record verification** — All A records resolved; multiple CNAME targets; IP match via `array_intersect`; CNAME chain to `app.url` host. +- **Activation enforcement** — `custom_domains.enforce_dns_on_activate` (default `true`, env `SHORT_URL_CUSTOM_DOMAIN_ENFORCE_DNS`); saving with `is_active=true` without DNS → auto-deactivate. +- **Removed `SERVER_ADDR` fallback** — Verification relies on DNS resolution against `app.url` only. + +#### API & settings + +- **Upsert + `lock_url_key`** — `UpsertShortUrlRequest` blocks changing `url_key` and `custom_domain_id` when lock is enabled (closes panel/API parity gap). +- **`ShortUrlSettingsManager`** — `last_aggregation_date` in system keys; secret preservation on masked save; `trust_cdn_headers` derived when driver is headers. + +#### Stats & reliability audit (P0–P2) + +- **Redis dirty-set prefix** — `SyncBufferedCountersCommand` uses store prefix for dirty ID set. +- **Webhook SSRF** — `SendWebhookJob`: `allow_redirects => false`, rejects 3xx responses. +- **Buffer fallback** — `HasStats::incrementVisits()` DB fallback when dirty-ID tracking fails. +- **Unique visits** — Human clicks from daily rollups; no DISTINCT override inflation. +- **Cross-filter stats** — Two-filter pairs in aggregation; gap fill in `FilteredStatsCollector`. +- **Per-link webhooks** — Respects `webhook_events` on link model. +- **Octane** — `GeoIpService::flush()`, `ShortUrl::flushBufferedCounterMemory()` on request terminate. +- **Security** — Redirect HTML XSS fix; public stats rate limit; visit logs default to stats-counted scope. +- **Tests** — `EnterpriseHardeningTest.php`, `StatsAuditHardeningTest.php`; run `php artisan test packages/filament-short-url/tests/ --compact` in the host app. + +#### Critical audit hardening (follow-up — 2026-06-08) + +- **Stateless redirect default** — Main `/s/{key}` route uses `throttle:120,1` only (no `web` middleware). Password flow stays on `/s-auth/{key}` with explicit `web`. +- **Filament `lock_url_key` server-side** — `LockedUrlKeyGuard` sanitizes Filament save data and blocks model persistence when key/domain change is attempted (parity with API). +- **Multi-tenant Filament scope** — `LinkUserScope` filters `ShortUrlResource` by `user_id` when `scope_links_to_user` is enabled (default). +- **Custom domain ownership in API** — `CustomDomainValidator` ensures API keys/users can only assign domains they own. +- **Scoped `exists` API** — `custom_domain_id` + `domain_scope_id` in response; checks per domain scope. +- **Safe Browsing on redirect** — `SafeBrowsingService::isSafeCached()` re-checks destination at redirect time (configurable TTL). +- **Webhook signing required** — Global webhooks require `webhook_signing_secret` when `webhook_signing_required` is true (default); jobs skip unsigned dispatch. +- **Hot path optimizations** — Single domain resolution passed to `findByKey()`; pixels lazy-loaded; `max_visits` enforced under row lock before tracking. +- **Docs** — README claims corrected (no sub-15ms; dub.co parity table scoped; production checklist; sync queue default documented). +- **Tests** — `SecurityHardeningFixesTest.php`, `LockedUrlKeyGuardTest.php`. + +--- + +## v4.0.0 + +- **Custom Domains Branding** — Let users connect branded custom domains with real-time CNAME/A record DNS verification and automatic prefix-free root routing. +- **Cache Leak Fix** — Solved a critical caching bug where single-use links could be visited multiple times during the cache TTL by passing the host-specific key suffix to cache invalidations. +- **Aggregator Performance Tuning** — Restructured daily aggregation SQL queries to filter only active URL IDs, leveraging composite indexes and running native DB aggregations. +- **Logo Upload Authorization** — Secured the logo upload API with resource-level permission and policy checks. +- **DB-Free Registration Phase** — Deferred settings overrides to the service provider boot phase to prevent database errors during offline configuration caching. +- **Conditional Redirection Fallback** — Added configurations to optionally disable global fallback route registration. + +## v3.5.0 + +- **User Attribution** — Short URLs now record the creator. Their avatar and hover card (name + email) are displayed in the list table. +- **Relative Date Badges** — Creation dates show compact relative strings (`2h`, `5d`, `3mo`). Hover to see the precise date and timezone. +- **Keyboard Shortcuts** — Hover any table row and press `E` (edit), `Q` (QR code), `I` (share), `S` (statistics), or `X` (delete). +- **Unified Action Dropdown** — All per-row actions consolidated under a single 3-dot button with keyboard shortcut badges. +- **Row Click → Statistics** — Clicking a table row navigates directly to the link's Statistics page. +- **A/B Split Testing** — Weighted traffic rotation in root-level links and nested targeting rules, with drag-based sliders and a one-click "Balance weights" action. +- **Variant Analytics** — Tracks which A/B variant was served and shows a "Variant Clicks Distribution" chart in the analytics dashboard. +- **Query Optimization** — Composite DB index on the visits table; queries filter by indexed `country_code`; Eloquent hydration bypassed with `toBase()->get()` for large sets. +- **GDPR IP Anonymization** — Opt-in IP masking (IPv4/IPv6) with SHA-256 hashing for unique visitor identification, managed via Settings. +- **Google Safe Browsing in REST API** — Safety checks now apply to all incoming URLs in the API (destination, A/B variants, targeting rules). +- **Settings URL Cleanup** — Tab query parameters are now human-readable (e.g. `?tab=qr` instead of `?tab=qr-defaults::data::tab`). +- **Analytics Enhancements** — QR Scan Conversion Rate card with period-over-period delta, browser/OS version subtexts, A/B click-share vs. weight comparison. + +## v3.3.0 + +- **Advanced Multi-Filter Targeting Engine** — Replaced the legacy single-strategy selection panel with a highly flexible rule engine supporting custom `AND` / `OR` logic matching. +- **Granular Filter Categories** — Added support for filtering by devices (Desktop, Mobile, Tablet), platform operating systems (Windows, macOS, Linux, iOS, Android, Fire OS), countries (multiselect with search), and browser languages (multiselect with search). +- **Client-Side Flag Icons** — Integrated high-quality country flag icons dynamically loaded from a trusted CDN (`flagcdn.com`) inside both the Filament form targeting dropdown and the analytics country statistics widget. +- **Redirection Performance Boost** — Bypassed full user agent parsing (which involves regular expression scanning for versions) during redirections by introducing specialized fast-path `getDeviceType` and `getOs` helper functions. +- **Dynamic Legacy Data Adapter** — Added automatic on-the-fly hydration and upgrade of legacy database records to the new rule format when loaded in the Filament form. + +## v3.2.0 + +- **Expanded Developer REST API** — Added new endpoints to inspect single short URLs (`GET /api/short-url/links/{idOrKey}`), fetch real-time click metrics (`GET /api/short-url/links/{idOrKey}/stats`), and fully update links programmatically (`PUT/PATCH /api/short-url/links/{idOrKey}`). Enabled flexible lookup dynamically by ID or URL key. +- **REST API Throttling & Rate Limiting** — Added route middleware throttling for the Developer REST API. Current default: `throttle:120,1` (configurable via `filament-short-url.middleware`); per-key limits default to 60 req/min. +- **Unified Validation System** — Cleaned up and unified API and admin panel form validation, supporting advanced fields like granular logging parameters (`track_visits`, `track_browser_language`, etc.), custom GA4 tracking IDs (`ga_tracking_id`), and auto-open deep linking options (`auto_open_app_mobile`). +- **Media Controller Separation** — Refactored internal logo uploads and serving routes out of the public REST API controller into a dedicated `ShortUrlLogoController` (Single Responsibility compliance). +- **Alpine.js Webhook Payload Preview** — Replaced the Filament package CodeEditor component with a custom, high-reliability dark-mode HTML/CSS component featuring live code highlighting and copy-to-clipboard functionality powered by Alpine.js. + +## v3.1.0 + +- **Database-Backed & Cached Settings** — Relocated user configuration from local JSON files to the database (`short_url_settings` table) with automatic caching and zero-downtime migration of legacy settings. +- **High-Performance Aggregations** — Completely refactored the statistics aggregator command to run optimized GROUP BY queries directly in the database, reducing memory usage (OOM protection) to near zero. +- **Secure Hashed API Keys** — API keys are now stored securely as SHA-256 hashes, verified using constant-time comparisons (`hash_equals()`), and displayed only once upon generation. +- **HMAC Signed Webhooks** — Webhook payloads are now optionally signed with a configured secret key and verified via the `X-ShortUrl-Signature` header. +- **Privacy-Safe GA4 Client IDs** — Replaced random UUIDs with deterministic client IDs based on hashed visitor IP and User Agent, ensuring session integrity in Google Analytics without storing raw visitor data. +- **Browser Cache Prevention for Limited Links** — Force temporary `302` redirects automatically for single-use, max-visit, or expiring links to prevent browsers from caching redirects and bypassing tracking logic. +- **Proxy Detection Optimization** — Implemented an aggressive 800ms timeout for external proxy checkers and reduced cache time for transient rate-limit failures to 60 seconds. + +## v3.0.0 + +- **Native App Linking (Mobile Auto-Open)** — Automatically match and redirect mobile visitors directly inside 24+ native mobile apps (such as WhatsApp, YouTube, TikTok, Instagram, Spotify, etc.) using custom schemes, complete with a glassmorphic redirect page and a live interactive matching preview widget. +- **Global Deep Linking (Universal Links & App Links)** — Easily serve iOS `apple-app-site-association` and Android `.well-known/assetlinks.json` configuration files directly from your root domain to support OS-level native integration (disabled by default, managed via Settings). +- **Central Retargeting Pixel Registry** — Introduced a premium Many-to-Many pixel management registry. Define pixels centrally (Meta Pixel, Google Tag, LinkedIn Insight, TikTok Pixel, Pinterest Tag) and easily associate them with short links via the Filament panel or the REST API. +- **Standalone Settings Page** — Relocated the Settings interface from a resource header sub-action to a standalone sidebar navigation page under the default plugin group. +- **Retargeting Pixel API** — The REST API now fully exposes the `pixels` relationship array parameter for registering and linking retargeting pixels programmatically. +- **Enhanced Browser Language Redirection** — Robust double-pass language targeting logic matching exact locales first (e.g. `en-US`, `zh-CN`) and falling back to base language codes (e.g. `en`, `zh`). +- **Custom Branded Expiry Pages** — Replaced raw 410 HTTP errors with a beautiful, fully localized, dark-mode compatible HTML expiry page displaying the Site Name, expired link details, and a homepage button. + +## v2.0.0 + +- **Interactive QR Code Designer Branding Logo** — Upload custom brand logos inside the QR designer canvas in Filament. Configure logo sizing, margins, shapes (square/circle), and toggle dot backing removal to prevent dots overlapping with the logo. +- **Dedicated QR Code Scan Tracking** — Differentiates visitor clicks from physical QR code scans by dynamically appending source tags (`?source=qr`). Added a new database tracking column (`is_qr_scan` on visits, `qr_scans` on short URLs, and `qr_visits_count` on daily stats). Displays a dedicated scans counter badge in the Filament list table. +- **Browser Language Detection & Statistics** — Captures visitor browser preferred language headers (`browser_language` field) and aggregates them into the daily stats table. Displays a new "Top Languages" widget breakdown in the link statistics dashboard. +- **High-Traffic Performance Safeguards & Robust Rollbacks** — Atomic database transactions for buffered counter updates with fail-safe rollback that restores cache values in case of DB connection failures. Prevents N+1 queries by preloading request-wide counters in a single batch cache lookup. +- **Support for Empty Route Prefix (Root-Level URLs)** — Enhanced `getShortUrl()` to support empty route prefixes without generating double slashes (e.g. `domain.com/abc123` instead of `domain.com//abc123`). + +## v1.7.0 + +- **Role-based Settings Access Control** — New `authorizeSettingsUsing(Closure)` method on the plugin to restrict who can access the Settings page. Supports any callable returning a `bool`. Also auto-detects a `manageSettings` method on a registered `ShortUrl` policy. The Settings button in the table header is hidden automatically when access is denied. + +## v1.6.0 + +- **Google Safe Browsing Integration** — Automatic safety checks against Google's API during link creation or modification. Includes bypass settings, asynchronous checking option, and alert badges. +- **VPN / Proxy / Bot Filtering** — Detect and filter out VPN/proxy traffic and Tor nodes using external proxy detection APIs to keep traffic analytics clean. +- **Visitor World Map Widget** — Live interactive SVG world map showing clicks distribution per country, custom intensity highlighting, and hover details. + +## v1.5.1 + +- **REST API On/Off Toggle** — Enable or disable the entire developer REST API from Settings → API & Webhooks without touching code. Returns `503 Service Unavailable` when disabled. + +## v1.5.0 + +- **Social Retargeting Pixels** — Attach Meta Pixel, Google Tag (GA4/Ads), and LinkedIn Insight Tag to any short URL. A premium glassmorphic interstitial page executes pixel scripts in the visitor's browser before forwarding them to the destination. Enables building remarketing audiences even on external domains. +- **Developer REST API** — Full `GET /api/short-url/links`, `POST /api/short-url/links`, and `DELETE /api/short-url/links/{id}` endpoints with API Key authentication (managed via Settings UI). Supports creating links with all available attributes including pixels and webhooks. +- **Webhook System** — Real-time HTTP POST notifications on `visited`, `created`, `expired`, and `limit_reached` events. Configurable per-link or globally. Dispatched asynchronously via `SendWebhookJob` with 3-attempt retry policy and 10-second backoff. +- **Settings: API & Webhooks Tab** — New settings tab to manage global webhook URL, monitored event types, and developer API key management with name labels and per-key activation toggles. + +## v1.4.0 + +- **Validity Date Ranges (From-To)** — Set activation dates (`activated_at` and `expires_at`) to control exactly when a short link is active. +- **Custom Visit Limit Counters** — Define a custom maximum visit limit (`max_visits`) after which a link automatically expires (e.g., active for 3 hits). +- **Custom Expiration Fallbacks** — Redirect expired/inactive visitors to a custom `expiration_redirect_url` rather than showing a static 410 Gone error page. +- **Fluent Builder APIs** — Fluent method additions (`activatedAt()`, `deactivatedAt()`, `maxVisits()`, `expirationRedirectUrl()`) in the developer query builder. + +## v1.3.0 + +- **Automatic Scheduler Registration** — Zero-configuration task registration within the ServiceProvider booted phase (dynamically honors Settings toggles). +- **Interactive Settings Validators** — Adds real-time "Test connection" verify action for GA4 Measurement Protocol and "Verify file" action for MaxMind database paths. +- **Robust Table Row Copy Action** — High-reliability, conflict-free click-to-copy in table rows with built-in fallback helper for non-HTTPS (secure context) browser environments. + +## v1.2.0 + +- **Password-protected links** — Session-based unlock flow with a styled prompt page. +- **Redirect warning pages** — Interstitial security screen before external redirects. +- **Smart targeting** — Device-based, Country/Geo-based, and A/B weighted rotation rules per link. +- **Rate limiting** — Configurable per-IP redirect throttling with 429 responses. +- **Daily stats aggregation** — Nightly `short-url:aggregate-and-prune` command for scalable log management. +- **Extended Settings GUI** — New "Performance & Security" tab for aggregation and rate limiting configuration. +- **Polish translations** — Full `pl` locale support for all new features. diff --git a/LICENSE b/LICENSE index e2ff6e8..1a01fd9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ ================================================================================ - SOURCE-AVAILABLE & DUAL-COMMERCIAL LICENSE — VERSION 1.1 + SOURCE-AVAILABLE & DUAL-COMMERCIAL LICENSE — VERSION 1.3 janczakb/filament-short-url (the "Software") ================================================================================ @@ -11,6 +11,11 @@ SOFTWARE. BY TAKING ANY OF THOSE ACTIONS, YOU UNCONDITIONALLY ACCEPT EVERY TERM AND CONDITION OF THIS AGREEMENT. IF YOU DO NOT ACCEPT, DO NOT DOWNLOAD, INSTALL, OR USE THE SOFTWARE IN ANY WAY. +This License is intended for professional and business use (B2B). You represent +that You are acquiring the Software for professional purposes and not as a +consumer acting outside Your trade, business, craft, or profession, to the +extent such qualification is relevant under applicable law. + ================================================================================ SECTION 1 — DEFINITIONS ================================================================================ @@ -21,27 +26,73 @@ SECTION 1 — DEFINITIONS documentation, and any future updates, patches, or versions thereof. 1.2 "Copyright Holder" means Bartłomiej Janczak, sole and exclusive author - and owner of all intellectual property rights in and to the Software. + and owner of all intellectual property rights in and to the Software, + except for third-party components governed by Section 6.4. 1.3 "You" (or "Your") means the individual or legal entity exercising rights under this License. -1.4 "Permitted Free Use" means: +1.4 "Official Distribution Channels" means distribution points operated or + expressly authorized in writing by the Copyright Holder for distributing + the Software to licensees, including without limitation: + (a) the official GitHub repository maintained by the Copyright Holder; + (b) the janczakb/filament-short-url package listing on Packagist.org; + (c) any mirror, release artifact, or update channel explicitly linked + from the official repository or Copyright Holder website. + Receiving a copy through an Official Distribution Channel at the Copyright + Holder's direction is not "redistribution" by You. + +1.5 "Software Transfer" means, with respect to the Software or any portion + thereof (including unmodified vendor copies, source trees, archives, + Composer packages, Docker images, or deployment artifacts from which the + Software can be extracted): + (a) delivering, disclosing, publishing, or making accessible such copies + to any third party; + (b) granting any third party the right or practical ability to copy, + redistribute, sublicense, republish, or further transfer the Software; + (c) placing the Software in a repository, package index, shared drive, + client portal, or artifact store where the client or any third party + may obtain standalone copies independent of Your controlled runtime; + (d) licensing or selling access to the Software itself, rather than to + services or outcomes produced using the Software under this License. + For the avoidance of doubt, Software Transfer does NOT include: + (i) operating the Software on infrastructure controlled by You or Your + client where the client receives no standalone copy and no rights + to extract, republish, or sublicense the Software; + (ii) delivering an integrated application to a client under Section + 1.7(b) when the client receives only runtime access and no rights + described in subsections (a) through (d) above. + +1.6 "Distinct Client Engagement" means one separately contracted scope of work + for one end client identified in writing before deployment begins. Multiple + projects, environments, brands, or business units of the same client + constitute separate engagements unless expressly covered by one written + statement of work. + +1.7 "Permitted Free Use" means use that satisfies ALL of Sections 1.7(a) or + (b), Section 1.12 (High-Volume Use limit), and every restriction in + Section 3: (a) Personal, educational, research, or internal business use by a single natural person or a single legal entity solely for that entity's own - internal operations; - (b) Deployment of the Software for a single, uniquely identified client as - a work-for-hire or freelance project, provided that: - (i) the client does not receive, resell, or otherwise transfer the - Software or any portion thereof to any third party; - (ii) the deployment is limited to one (1) production environment per - distinct client engagement; and - (iii) the monthly tracked-click/redirect volume of the resulting - system does not exceed 1,000,000 (one million) events per - calendar month across all deployed instances attributable to - that engagement. + internal operations, including staging and non-production environments + controlled by that same entity; + (b) Deployment of the Software for one Distinct Client Engagement as a + work-for-hire or freelance project, provided that: + (i) You remain the sole licensee and operator responsible for + compliance with this License; + (ii) the engagement uses no more than one (1) production environment + for that client unless a Commercial License expressly authorizes + more; + (iii) You do not perform any Software Transfer to the client or any + third party, except that the client may receive compiled or + integrated application access without standalone Software copies + or redistribution rights as described in Section 1.5; + (iv) the client does not resell, license, distribute, or operate the + Software as a product for third parties; + (v) Qualified Events attributable to that engagement do not exceed + the High-Volume Use threshold in Section 1.12. -1.5 "Commercial Distribution" means any act of selling, renting, leasing, +1.8 "Commercial Distribution" means any act of selling, renting, leasing, sublicensing, or otherwise transferring — for monetary gain, in-kind consideration, or any other commercial benefit — the Software, or any Derivative Work, or any Bundled Product, to one or more third parties. @@ -55,30 +106,41 @@ SECTION 1 — DEFINITIONS which the Software's functionality is a material component; (c) providing the Software to a client under a contract where the client subsequently resells, licenses, or distributes the resulting product - to end users. + to end users; + (d) performing any Software Transfer for consideration or as part of a + commercial deliverable. -1.6 "Derivative Work" means any work that is based upon, incorporates, +1.9 "Derivative Work" means any work that is based upon, incorporates, modifies, adapts, translates, or is otherwise derived from the Software or any substantial part thereof, regardless of the programming language, file format, or packaging used. -1.7 "Bundled Product" means any software application, plugin, extension, +1.10 "Bundled Product" means any software application, plugin, extension, theme, template, framework, boilerplate, starter kit, digital product, or service offering in which the Software — in whole or in any part, modified or unmodified — is included, embedded, required as a dependency, or integrated in any manner, irrespective of whether the Software constitutes the primary component or a minor ancillary element. -1.8 "High-Volume Use" means any deployment — whether by a single entity or - across multiple instances — that generates more than 1,000,000 (one - million) combined tracked clicks, redirects, or link events per calendar - month attributable to the Software's functionality. +1.11 "Qualified Event" means each HTTP redirect response served through the + Software's redirect routes and each visit or click recorded by the + Software's built-in tracking, counters, analytics, or daily-stats + subsystems, whether or not visit logging is enabled for a given link. + Automated health checks, load tests, and crawler traffic that the Software + explicitly excludes from counters in its own code are excluded. -1.9 "Repository" means any version-control hosting service or platform, +1.12 "High-Volume Use" means any deployment — whether internal, client, + single-instance, or multi-instance — that generates more than 1,000,000 + (one million) Qualified Events in any calendar month attributable to + deployments operated under Your license. Attribution includes all + environments (production, staging, preview, and replicas) that You + control or cause to be operated for the same entity or engagement. + +1.13 "Repository" means any version-control hosting service or platform, including without limitation GitHub, GitLab, Bitbucket, Codeberg, or any self-hosted equivalent, whether public, private, or restricted. -1.10 "Package Registry" means any software distribution index, including +1.14 "Package Registry" means any software distribution index, including without limitation Packagist, npm, PyPI, or any equivalent service. ================================================================================ @@ -89,16 +151,23 @@ Subject strictly to the conditions and restrictions in Sections 3 and 4, the Copyright Holder grants You a worldwide, royalty-free, non-exclusive, non-sublicensable, non-transferable license to: -2.1 Download, install, and use the Software solely for Permitted Free Use as - defined in Section 1.4. +2.1 Obtain copies of the Software only through Official Distribution Channels + or other channels expressly authorized in writing by the Copyright Holder, + and install and use the Software solely for Permitted Free Use as defined + in Section 1.7. Merely downloading or installing a copy from an Official + Distribution Channel does not constitute redistribution by You. 2.2 Modify the Software solely for Your own private or internal use under - Section 1.4(a) or (b), provided that all such modifications: + Section 1.7(a) or (b), provided that all such modifications: (a) are kept strictly private and are never distributed, published, shared, disclosed, or made accessible to any third party in any form; (b) retain this entire License and all copyright notices without alteration. +2.3 Make a reasonable number of backup copies and deployment artifacts + strictly necessary to operate Permitted Free Use, provided such copies + remain under Your control and are not subject to Software Transfer. + No rights are granted except those expressly set out in this Section 2. All other rights are reserved exclusively by the Copyright Holder. @@ -107,31 +176,38 @@ SECTION 3 — STRICT RESTRICTIONS AND PROHIBITIONS ================================================================================ The following acts are CATEGORICALLY AND UNCONDITIONALLY PROHIBITED unless -You hold a valid, current, written Commercial License issued by the Copyright -Holder under Section 5: +You hold a valid, current Commercial License issued by the Copyright Holder +under Section 5: 3.1 REDISTRIBUTION IN ANY FORM. You may not publish, upload, transmit, broadcast, mirror, host, or otherwise make available the Software — in whole or in any part, modified or unmodified — through any means, including but not limited to: - (a) any public or private Repository, regardless of access controls; - (b) any Package Registry; + (a) any public or private Repository, regardless of access controls, + except as expressly permitted in Section 3.1(A); + (b) any Package Registry, except Official Distribution Channels operated + by the Copyright Holder; (c) file-sharing platforms, cloud storage, or peer-to-peer networks; (d) email, instant messaging, or any other communication channel. - SOLE EXCEPTION — CONTRIBUTION FORKS: A single public fork of the - official repository on GitHub is permitted exclusively to submit a Pull - Request to the original repository. Such a fork: - (i) must be created solely for the purpose of the specific contribution; - (ii) must not be used for any other purpose, including personal hosting - or showcase; + (A) CONTRIBUTION FORKS — SOLE EXCEPTION. Public fork(s) of the official + repository on GitHub are permitted exclusively to prepare and submit Pull + Request(s) to the original repository. Each such fork: + (i) must be created and maintained solely for contribution work; + (ii) must not be used for hosting, demonstration, resale, or any + independent product; (iii) must reproduce this License in full without modification; (iv) must be deleted or converted to private within thirty (30) calendar - days of the earlier of: (A) the Pull Request being closed, merged, - or rejected; or (B) ninety (90) calendar days of inactivity. Failure - to do so constitutes a material breach of this License. + days of the earlier of: (A) all related Pull Request(s) being + closed, merged, or rejected; or (B) ninety (90) calendar days of + inactivity on that fork. Failure to comply constitutes a material + breach of this License. -3.2 BUNDLING AND COMMERCIAL EXPLOITATION. You may not: +3.2 SOFTWARE TRANSFER. You may not perform any Software Transfer except as + expressly allowed without transfer in Section 1.5(i)–(ii) and Section + 1.7(b)(iii). + +3.3 BUNDLING AND COMMERCIAL EXPLOITATION. You may not: (a) include, embed, bundle, or integrate the Software, in whole or in any part, into any Bundled Product that is or will be subject to Commercial Distribution; @@ -144,30 +220,38 @@ Holder under Section 5: end users, whether individually priced or as part of a bundle or subscription. -3.3 COMMERCIAL DISTRIBUTION. You may not engage in any act constituting - Commercial Distribution as defined in Section 1.5. +3.4 COMMERCIAL DISTRIBUTION. You may not engage in any act constituting + Commercial Distribution as defined in Section 1.8. -3.4 HIGH-VOLUME USE without a Commercial License. You may not operate any +3.5 HIGH-VOLUME USE without a Commercial License. You may not operate any system or service that constitutes High-Volume Use as defined in - Section 1.8. + Section 1.12, including internal business use under Section 1.7(a). -3.5 RELABELING AND MISATTRIBUTION. You may not: +3.6 RELABELING AND MISATTRIBUTION. You may not: (a) publish, distribute, or otherwise make available the Software under a different package name, author name, or vendor identity; - (b) remove, obscure, alter, or misrepresent the copyright notice or author - attribution in any copy or portion of the Software; + (b) remove, obscure, alter, or misrepresent the copyright notice, license + text, or author attribution in any copy or portion of the Software; (c) represent, imply, or permit others to believe that the Software was created by anyone other than Bartłomiej Janczak. -3.6 SUBLICENSING AND TRANSFER. You may not grant any sublicense, assign any - rights, or otherwise transfer this License or any rights granted hereunder - to any third party. +3.7 SUBLICENSING AND TRANSFER OF LICENSE RIGHTS. You may not grant any + sublicense, assign any rights, or otherwise transfer this License or any + rights granted hereunder to any third party. Hosting the Software for a + client under Section 1.7(b) does not sublicense rights to the client. -3.7 CIRCUMVENTION. You may not structure any transaction, arrangement, or +3.8 CIRCUMVENTION. You may not structure any transaction, arrangement, or technical implementation with the intent or effect of circumventing any restriction in this Section 3, including without limitation by splitting a - Bundled Product into artificially separate components or by using an - intermediary entity. + Bundled Product into artificially separate components, using an + intermediary entity, masking the Software as a different dependency, + or separating repositories solely to evade transfer or redistribution + prohibitions. + +3.9 COMPETING PRODUCTS. You may not use the Software, or any Derivative Work, + as the core of a substantially similar link-management, URL-shortening, + QR-code, or redirect-analytics product offered to third parties, whether + open or closed source, except under a Commercial License. ================================================================================ SECTION 4 — CONTRIBUTOR LICENSE AGREEMENT (CLA) @@ -182,12 +266,14 @@ SECTION 4 — CONTRIBUTOR LICENSE AGREEMENT (CLA) terms the Copyright Holder deems appropriate, including proprietary terms. 4.2 You represent and warrant that: - (a) You are the sole author of the contribution and have the full legal - right to grant the license in Section 4.1; + (a) You are the sole author of the contribution or have obtained all + rights necessary to grant the license in Section 4.1; (b) the contribution does not infringe any third-party intellectual property rights; (c) the contribution is not subject to any license, agreement, or - obligation that would conflict with the grant in Section 4.1. + obligation that would conflict with the grant in Section 4.1; + (d) if the contribution includes work created for an employer or client, + You have authority to submit it under Section 4.1. 4.3 The Copyright Holder retains the right to reject any contribution without giving reasons and without incurring any obligation to the contributor. @@ -197,10 +283,11 @@ SECTION 5 — COMMERCIAL LICENSING ================================================================================ 5.1 Any use not expressly permitted by Section 2 — including Commercial - Distribution, Bundled Product distribution, High-Volume Use, or any - other commercial exploitation of the Software — requires a separate, - written Commercial License issued by the Copyright Holder prior to such - use. + Distribution, Software Transfer beyond Section 1.5(i)–(ii), Bundled + Product distribution, High-Volume Use, competing products under + Section 3.9, or any other commercial exploitation of the Software — + requires a separate Commercial License issued by the Copyright Holder + prior to such use. 5.2 To inquire about or obtain a Commercial License, contact: @@ -209,11 +296,15 @@ SECTION 5 — COMMERCIAL LICENSING 5.3 Commercial Licenses are issued at the Copyright Holder's sole discretion and may be subject to a one-time fee, recurring royalty, revenue-sharing - arrangement, or other terms as agreed in writing. No Commercial License - is effective until signed in writing by the Copyright Holder. + arrangement, or other terms as agreed in a written instrument signed by + the Copyright Holder, including a qualified electronic signature or other + form of document with legal effect equivalent to writing under applicable + law. No Commercial License is effective until so signed or otherwise + authenticated by the Copyright Holder. -5.4 Any act of Commercial Distribution, Bundled Product distribution, or - High-Volume Use without a valid Commercial License: +5.4 Any act of Commercial Distribution, prohibited Software Transfer, + Bundled Product distribution, High-Volume Use, or competing use under + Section 3.9 without a valid Commercial License: (a) is null and void ab initio; (b) constitutes a material breach of this License; (c) constitutes direct infringement of the Copyright Holder's exclusive @@ -232,7 +323,7 @@ SECTION 6 — INTELLECTUAL PROPERTY 6.1 The Software is licensed, not sold. Bartłomiej Janczak retains all right, title, and interest in and to the Software, including all copyrights, moral rights, trade secrets, and any other intellectual property rights, - worldwide. + worldwide, except as expressly granted in this License. 6.2 This License does not transfer to You any ownership interest in or to the Software, any trademarks, trade names, or service marks of the Copyright @@ -250,6 +341,11 @@ SECTION 6 — INTELLECTUAL PROPERTY janczakb/filament-short-url package and does not modify or supersede the terms of any third-party license. +6.5 PATENTS. No patent rights are granted except to the minimum extent + necessary for You to exercise the copyright permissions expressly granted + in Section 2 during Permitted Free Use or under a valid Commercial + License. All other patent rights are reserved. + ================================================================================ SECTION 7 — TERMINATION ================================================================================ @@ -262,7 +358,8 @@ SECTION 7 — TERMINATION (a) immediately cease all use, reproduction, and distribution of the Software; (b) permanently delete all copies, full or partial, of the Software in - Your possession or control, including backups and archived copies; + Your possession or control, including backups, deployment artifacts, + and archived copies; (c) upon request, certify in writing to the Copyright Holder that You have complied with Section 7.2(b). @@ -277,20 +374,58 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT. THE COPYRIGHT HOLDER DOES NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OPERATE WITHOUT INTERRUPTION, OR BE FREE FROM ERRORS OR SECURITY VULNERABILITIES. -YOU ASSUME ALL RISKS ASSOCIATED WITH YOUR USE OF THE SOFTWARE. + +YOU ASSUME THE ENTIRE RISK AS TO THE QUALITY, PERFORMANCE, SECURITY, AND +RESULTS OF YOUR USE OF THE SOFTWARE. YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE +TO YOUR SYSTEMS, DATA, BUSINESS, OR THIRD PARTIES ARISING FROM YOUR USE OR +INABILITY TO USE THE SOFTWARE. ================================================================================ -SECTION 9 — LIMITATION OF LIABILITY +SECTION 9 — LIMITATION OF LIABILITY (LICENSEE CLAIMS AGAINST COPYRIGHT HOLDER) ================================================================================ -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -CONSEQUENTIAL, OR PUNITIVE DAMAGES (INCLUDING BUT NOT LIMITED TO LOSS OF -PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION, OR COST OF SUBSTITUTE GOODS OR -SERVICES) ARISING OUT OF OR IN CONNECTION WITH THIS LICENSE OR THE USE OR -INABILITY TO USE THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. THE COPYRIGHT HOLDER'S TOTAL LIABILITY FOR ANY CLAIM ARISING UNDER -THIS LICENSE SHALL NOT EXCEED EUR 100 (ONE HUNDRED EURO). +This Section limits claims that a Licensee (or any user acting under this +License) may bring AGAINST the Copyright Holder. It does NOT limit, reduce, +or cap any remedy, claim, or enforcement action that the Copyright Holder may +bring against You for breach of this License, copyright infringement, or +unauthorized use, including without limitation Sections 5.4, 7, and 10.8. + +9.1 EXCLUSION OF DAMAGES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, + THE COPYRIGHT HOLDER SHALL NOT BE LIABLE TO YOU FOR ANY DAMAGES OF ANY + KIND OR NATURE, WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + CONSEQUENTIAL, OR PUNITIVE, INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS, + REVENUE, GOODWILL, DATA, BUSINESS, OR OPPORTUNITY, ARISING OUT OF OR IN + CONNECTION WITH THIS LICENSE OR THE SOFTWARE, EVEN IF THE COPYRIGHT + HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +9.2 ZERO LIABILITY FOR PROFESSIONAL USE. WHERE PERMITTED FOR PROFESSIONAL OR + BUSINESS USE (B2B), THE COPYRIGHT HOLDER SHALL HAVE NO LIABILITY WHATSOEVER + TO YOU UNDER OR IN CONNECTION WITH THIS LICENSE. + +9.3 MANDATORY-LAW FLOOR. IF A COMPETENT COURT FINALLY DETERMINES THAT ANY + PART OF SECTIONS 9.1 OR 9.2 CANNOT BE ENFORCED FOR A PARTICULAR CLAIM, + THE COPYRIGHT HOLDER'S TOTAL AGGREGATE LIABILITY FOR THAT CLAIM AND ALL + RELATED CLAIMS ARISING UNDER THIS LICENSE SHALL NOT EXCEED THE GREATER OF: + (a) EUR 0 (ZERO EURO); OR + (b) THE FEES ACTUALLY PAID BY YOU TO THE COPYRIGHT HOLDER FOR A VALID + COMMERCIAL LICENSE FOR THE SOFTWARE IN THE TWELVE (12) MONTHS + IMMEDIATELY PRECEDING THE EVENT GIVING RISE TO THE CLAIM; + AND IN ALL CASES ONLY TO THE MINIMUM EXTENT REQUIRED BY MANDATORY + APPLICABLE LAW. NOTHING IN THIS SECTION 9.3 EXPANDS LIABILITY BEYOND + WHAT APPLICABLE LAW REQUIRES. + +9.4 EXCLUSIVE REMEDY. YOUR SOLE AND EXCLUSIVE REMEDY FOR DISSATISFACTION WITH + THE SOFTWARE OR ANY BREACH BY THE COPYRIGHT HOLDER OF THIS LICENSE IS TO + DISCONTINUE USE OF THE SOFTWARE AND DELETE ALL COPIES IN YOUR POSSESSION + OR CONTROL. + +9.5 NO LIMITATION ON COPYRIGHT HOLDER ENFORCEMENT. For clarity: if You breach + this License, the Copyright Holder may pursue all remedies available under + this License and applicable law without regard to this Section 9. A person + who infringes or misuses the Software is not a beneficiary of this + limitation and may owe the Copyright Holder damages, injunctive relief, + disgorgement of profits, and other remedies far exceeding any amount + referenced in Section 9.3. ================================================================================ SECTION 10 — GENERAL PROVISIONS @@ -324,11 +459,18 @@ SECTION 10 — GENERAL PROVISIONS publish revised versions of this License. Each version will be identified by a version number. The version under which You obtained the Software governs Your use unless the Copyright Holder expressly states otherwise. - This is version 1.1, effective 1 January 2026. + This is version 1.3, effective 8 June 2026. Version 1.3 supersedes + version 1.2 for copies obtained on or after its effective date. 10.7 LANGUAGE. This License is written in English. Any translation is provided for convenience only; in the event of a conflict the English text prevails. +10.8 AUDIT. Upon reasonable prior written notice, the Copyright Holder may + request written confirmation that Your use remains within Permitted Free + Use, including monthly Qualified Event volumes. You must respond within + thirty (30) calendar days with good-faith information. Refusal to respond + or material misrepresentation constitutes a breach of this License. + ================================================================================ END OF LICENSE -================================================================================ \ No newline at end of file +================================================================================ diff --git a/README.md b/README.md index 74e5dea..f0b1ade 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

Filament Short URL

-

The most complete open-source link management plugin for Laravel & Filament.
Short URLs · QR codes · Analytics · Targeting · Deep links · Webhooks · REST API

+

The most complete self-hosted link management plugin for Laravel & Filament.
Short URLs · QR codes · Analytics · SEO & OG Meta · Link Cloaking · Targeting · Deep links · Webhooks · REST API

Latest Version on Packagist @@ -17,71 +17,80 @@ A self-hosted **URL shortener, redirect engine, and QR code manager** built as a [Filament v5](https://filamentphp.com) plugin. Drop it into any Laravel 11+ application to replace Bitly, Dub.co, or Rebrandly subscriptions — with full data ownership, no click limits, and no monthly fees. -On top of basic link shortening it ships: multi-channel analytics with live activity feed, cross-filtering, and cross-domain retargeting pixels; advanced routing rules (device, country, language, A/B); mobile deep linking into 24+ native apps; a REST API with scoped keys; HMAC-signed webhooks; and offline GDPR-safe Geo-IP — all managed from a polished Filament admin panel. +On top of basic link shortening it ships: per-link **SEO & Open Graph meta**, **Search Engine Indexing**, and **Link Cloaking**; multi-channel analytics with live activity feed, cross-filtering, and cross-domain retargeting pixels; advanced routing rules (device, country, language, A/B); mobile deep linking into 24+ native apps; a REST API with scoped keys; HMAC-signed webhooks; and offline GDPR-safe Geo-IP — all managed from a polished Filament admin panel. --- ## Screenshots + + + + + + + + + + + + +
Analytics dashboardShort URL creation form
Smart targeting rulesSettings panel
Visit logs table
-

- Analytics dashboard - Short URL creation form -

-

- Smart targeting rules - Settings panel -

-

- Visit logs table -

--- ## Features - 🔗 **Short Link Generation** — Auto-generate collision-free Base62 keys or set your own custom slugs. -- 🌐 **Custom Domain Branding** — Register your own domains, verify DNS in real-time (A/CNAME), and serve links directly from the domain root — no `/s/` prefix needed. -- 🌍 **Multiple Geo-IP Drivers** — Resolve visitor countries offline via MaxMind, from CDN headers (Cloudflare `CF-IPCountry`, CloudFront), or via ip-api.com fallback. +- 🌐 **Custom Domain Branding** — Register your own domains, verify DNS in real-time (multi A-record + CNAME matching), enforce verification before activation, and serve links directly from the domain root — no `/s/` prefix needed. +- 🔎 **SEO & Open Graph Meta** — Per-link `og:title`, `og:description`, and `og:image` with live social preview in Filament. Auto-scrape metadata from the destination URL, import OG images to storage, and serve bot-safe preview pages to Facebook, LinkedIn, X, Slack, and other crawlers. +- 🎭 **Link Cloaking** — Mask the destination URL in the browser address bar by embedding the target in an iframe on your short-link domain. Social bots still receive your custom OG tags; human visitors stay on your branded URL. +- 🚫 **Search Engine Indexing Control** — Per-link toggle to allow or block search engine indexing. When disabled, every redirect and interstitial response sends `X-Robots-Tag: noindex, nofollow` plus matching `` tags. +- 🌍 **Multiple Geo-IP Drivers** — Resolve visitor countries from CDN headers (Cloudflare, CloudFront), offline MaxMind, or ip-api.com. The **Headers** driver auto-enables CDN trust on save and falls back to MaxMind → ip-api when edge headers are missing (ip-api rate-limited to protect the free tier). - 🗺️ **Visitor World Map** — Visualize click distribution on an interactive SVG world map with per-country hover stats. - 📈 **Full Analytics Dashboard** — Track total/unique visits, referrers, devices, browsers, OSes, and browser languages. Fully cross-filterable (e.g., "only mobile visits from Poland in May"). -- ⚡ **Live Activity Feed** — Standalone real-time visit stream at `/stats/live`. Uses `MAX(id)` polling — returns a ~100-byte response when nothing changed, full render only on new visits. +- ⚡ **Live Activity Feed** — Real-time visit stream on each link's stats page (`/{record}/stats/live`). Browser uses **SSE + `EventSource`** (not Livewire `wire:poll`). The server **auto-detects** your cache stack and picks the fastest transport — see [Live Activity Feed](#live-activity-feed-sse). +- 🚀 **Production Redis mode** — Set **Queue Connection = `redis`** in Settings for async visit jobs plus dedicated Redis counters, today/hourly stats, and live feed — independent of `CACHE_STORE`. Configure Redis host/port/password in the panel; **Test Redis** and **Test queue worker** buttons validate before save. - 🗂️ **Folders & Tags** — Assign each link to a folder and up to 5 tags. Click any folder or tag to navigate to a filtered link list. - 🗄️ **Link Archiving** — Soft-archive links instead of deleting them. Archived links are hidden by default and fully restorable. -- 🛡️ **VPN, Proxy & Bot Filtering** — Filter out Tor nodes, VPNs, anonymous proxies, and known bot user agents from visit stats. -- 🔍 **Google Safe Browsing** — All target URLs are checked against Google's threat database on create and edit. -- 🎨 **SVG QR Code Designer** — Full dot style, gradient, margin, and logo customization. Export as SVG or high-resolution PNG. -- 📊 **QR Scan Tracking** — QR scans are recorded separately from regular web clicks via `?source=qr`. Shown as a distinct metric in analytics. +- 🛡️ **VPN, Proxy & Bot Filtering** — Optional VPN/proxy/Tor detection (flag or block) when enabled in **Settings → Advanced**. Known bot and social-preview crawlers are excluded from visit logs entirely (not logged or counted). +- 🔍 **Google Safe Browsing** — When enabled in **Settings → Advanced**, target URLs are checked against Google's threat database on create and edit (Filament panel and REST API). +- 🎨 **SVG QR Code Designer** — Full dot style, gradient, margin, and logo customization. Export as SVG or high-resolution PNG directly from the admin panel (client-side via QRCodeStyling — colors, gradients, and logo are preserved). +- 📊 **QR Scan Tracking** — QR scans are recorded separately from regular web clicks via `?source=qr` or `?qr=1`. Shown as a distinct metric in analytics. - ✈️ **Browser Language Targeting** — Route visitors to different destinations based on their browser's `Accept-Language` header. -- 🚀 **Ultra-Fast Redirects** — Sub-15ms redirect response time. Bypasses the heavy Laravel session/cookie middleware group for standard links, falling back to a stateful route dynamically only when password protection is active. -- 🎯 **Server-Side GA4** — Send `short_url_visit` events via GA4 Measurement Protocol, completely bypassing browser ad-blockers. +- 🚀 **Fast Redirects** — The main `/s/{key}` route skips Laravel's `web` middleware (no session/cookies on every click). Password-protected links use a separate stateful `/s-auth/{key}` route. Simple redirects stay lean; HTML interstitials (warning page, pixels, cloaking) add latency by design. +- 🎯 **Server-Side GA4 (Enterprise MP)** — Full GA4 Measurement Protocol payloads (`page_view`, `click`, `short_url_visit`) with `session_id`, `timestamp_micros`, and engagement time. Per-link Measurement ID validated before send; Settings **Test connection** verifies the real `G-XXXXXXXXXX` + API secret pair via the debug collector. - ⚙️ **UTM Builder** — Build and preview campaign URLs with a real-time UTM form that syncs bidirectionally with the destination URL field. -- 🔒 **Link Expiration & Caps** — Set `activated_at`, `expires_at`, `max_visits`, single-use mode, and a custom fallback URL for when any of these conditions are met. +- 🔒 **Link Expiration & Caps** — Set `activated_at`, `expires_at`, `max_visits`, and single-use mode. `expiration_redirect_url` applies only when the link is **expired or inactive** (time/schedule); visit-cap and single-use limits return **410 Gone** (or a branded expiry page), not a fallback redirect. - ➡️ **Query Parameter Forwarding** — Automatically append incoming query strings (UTM parameters, ad tokens, discount codes) to the destination. - 🛠️ **Settings Panel** — All configuration in a dedicated Filament settings page — no `.env` editing required for day-to-day changes. -- 🔑 **Password-Protected Links** — Visitors enter a password before being redirected. Session-persisted, so they only see the prompt once. -- ⚠️ **Redirect Warning Pages** — Show a confirmation screen before sending visitors off to external domains. +- 🔑 **Password-Protected Links** — Visitors enter a password before being redirected. Passwords are hashed at rest (bcrypt/argon). Session-persisted unlock — visitors only see the prompt once per session. +- 🛑 **Redirect Warning Pages** — Show a confirmation screen before sending visitors off to external domains. - 🎲 **A/B Split Testing** — Distribute traffic across 2–5 weighted variants. Works at the root level or nested inside targeting rules. +- 📊 **Public Stats Pages** — Per-link shareable analytics: HTML dashboard for visitors, JSON API for embeds, optional password — no API key required. - 📉 **Log Aggregation & Pruning** — A nightly command aggregates raw visits into daily summaries and prunes records older than the configured retention window. Keeps the database lean even at millions of visits. - 🏷️ **Retargeting Pixel Registry** — Define Meta Pixel, Google Tag, LinkedIn Insight, TikTok, and Pinterest pixels once, then attach them to any link via a simple checkbox list. -- 🔌 **REST API with Scoped Keys** — Full CRUD API, SHA-256 hashed key storage, `links:read-only` / `links:read-write` scopes, and per-key rate limits. -- 📡 **Webhooks** — HMAC-SHA256 signed HTTP POST callbacks on `visited`, `created`, `expired`, and `limit_reached` events. Dispatched asynchronously with 3-attempt exponential retry. +- 🔌 **REST API with Scoped Keys** — Full CRUD API, bulk create/update/delete, upsert by `external_id`, visit log + CSV export, tags/folders CRUD, public stats, SHA-256 hashed keys, `links:read-only` / `links:read-write` scopes, **`owner_user_id` required when `scope_links_to_user` is enabled**, and per-key rate limits. +- 📡 **Webhooks** — HMAC-SHA256 signed HTTP POST callbacks on `visited`, `created`, `expired`, and `limit_reached` events. Outbound URLs are validated against SSRF blocklists before dispatch. - 📱 **Mobile Deep Linking** — Detect mobile visitors and launch the link directly inside 24+ native apps (Instagram, YouTube, Spotify, TikTok, WhatsApp, etc.). - 🍎 **Universal Links & Android App Links** — Serve `apple-app-site-association` and `assetlinks.json` directly from your domain to enable OS-level native app integration. - 💀 **Branded Expiry Pages** — When a link expires or hits its limit, visitors see a styled page with your site name instead of a bare 410 error. - 👤 **User Attribution** — Each link records its creator. Avatar and name/email hover card visible in the table. - 🕒 **Relative Time Badges** — Compact timestamps (`2h`, `5d`, `3mo`) with exact date on hover. -- ⌨️ **Keyboard Shortcuts** — `E` edit, `Q` QR, `I` copy, `S` stats, `X` delete — available on any row hover. +- ⌨️ **Keyboard Shortcuts** — `E` edit, `Q` QR, `I` share/copy, `S` stats, `P` public stats, `X` delete — available on any row hover. - ⋯ **Unified Action Menu** — All row actions in one 3-dot dropdown with shortcut badges. --- ## vs. Bitly, Dub.co & Rebrandly +Self-hosted link management for Laravel/Filament — **not** a full Dub.co-style attribution SaaS (no workspaces, conversion tracking, or edge analytics pipeline). + | Feature | Filament Short URL | Bitly | Dub.co | Rebrandly | |---|:---:|:---:|:---:|:---:| | Self-hosted | ✅ | ❌ | partial¹ | ❌ | -| Unlimited links & clicks | ✅ | ❌ | ❌ | ❌ | +| Unlimited links & clicks² | ✅ | ❌ | ❌ | ❌ | | Custom domains | ✅ | 💰 | 💰 | 💰 | | QR code designer | ✅ | 💰 basic | 💰 basic | 💰 | | A/B split testing | ✅ | ❌ | ✅ | ❌ | @@ -89,17 +98,40 @@ On top of basic link shortening it ships: multi-channel analytics with live acti | Mobile deep linking | ✅ 24+ apps | 💰 Enterprise | 💰 partial | 💰 | | Server-side GA4 (ad-block bypass) | ✅ | ❌ | ❌ | ❌ | | Live activity feed | ✅ | ❌ | ✅ | ❌ | -| Cross-filtering analytics | ✅ | 💰 basic | partial | 💰 basic | -| REST API | ✅ scoped keys | 💰 | ✅ | 💰 | -| Webhooks | ✅ HMAC-signed | 💰 Enterprise | ✅ | 💰 | +| Cross-filtering analytics (panel) | ✅ | 💰 basic | ✅ | 💰 basic | +| REST API | ✅ scoped keys | 💰 | ✅ deep | 💰 | +| Webhooks (global event list) | ✅ HMAC-signed | 💰 Enterprise | ✅ per-workspace | 💰 | +| Workspaces / team RBAC | ❌ | ✅ | ✅ | ✅ | +| Lead & sale conversion tracking | ❌ | 💰 | ✅ core | 💰 | | Offline GDPR Geo-IP (MaxMind) | ✅ | ❌ | ❌ | ❌ | -| VPN & bot filtering | ✅ | ❌ | ❌ | ❌ | -| Google Safe Browsing on save | ✅ | ❌ | ❌ | ❌ | +| VPN & bot filtering³ | ✅ | ❌ | ❌ | ❌ | +| Google Safe Browsing³ | ✅ save + redirect | ❌ | ❌ | ❌ | +| Custom OG meta & social previews | ✅ | 💰 | ✅ | 💰 | +| Link cloaking (iframe masking) | ✅ | ❌ | ✅ | ❌ | +| Per-link search indexing control | ✅ | ❌ | partial | ❌ | | Filament/Laravel admin panel | ✅ | ❌ | ❌ | ❌ | | Data stays on your server | ✅ | ❌ | partial¹ | ❌ | | Monthly cost | **$0** | $0–$199+ | $0–$190+ | $0–$49+ | -> 💰 = paid plans only  ·  ¹ Dub.co is open-source (AGPLv3) but self-hosting requires external managed services (Tinybird, PlanetScale, Upstash) +> 💰 = paid plans only  ·  ¹ Dub.co is open-source (AGPLv3) but self-hosting expects external managed services (Tinybird, PlanetScale, Upstash)  ·  ² Throughput depends on your PHP/DB/Redis stack — not a CDN edge product  ·  ³ VPN/proxy detection and Safe Browsing are **disabled by default**; enable in **Settings → Advanced**. Per-link webhooks use a URL only; subscribed events are configured globally in Settings → Developer. + +--- + +## Architecture + +Filament-native short-link engine inside your Laravel app — **not** a Dub.co-style attribution SaaS. + +| Route | Middleware | Session | Purpose | +|-------|------------|---------|---------| +| `/s/{key}` | `throttle:120,1` only | No | Main redirect (stateless hot path) | +| `/s-auth/{key}` | `web` + throttle | Yes | Password unlock (once per session) | +| `/s/public-stats/{key}` | `web` + throttle | Yes (password unlock) | Public HTML stats page + JSON API | +| Custom domain `/{key}` | same as `/s/{key}` | No | Branded links without prefix | +| `/api/short-url/*` | API auth + throttle | No | CRUD, bulk, exists, stats | + +**Multi-tenant (single app):** `ShortUrlResource` scopes by `user_id` when `SHORT_URL_SCOPE_TO_USER=true` (default). API keys **must** include `owner_user_id` when link scoping is enabled; keys without an owner receive **403 Forbidden**. No workspaces, team RBAC, or billing. + +**Stats retention:** raw visits pruned after ~90 days (configurable). Long-range API stats use daily rollups in `short_url_daily_stats`. --- @@ -126,6 +158,114 @@ php artisan vendor:publish --tag=filament-short-url-migrations php artisan migrate ``` +### Production checklist + +| Task | Why | +|------|-----| +| `* * * * * php artisan schedule:run` | Domain verification, counter sync, visit aggregation/pruning | +| Queue worker (when async) | Default `sync` needs no worker. For **`redis`** or **`database`**, run `php artisan queue:work {connection} --queue={name}` matching **Settings → General** (not necessarily `QUEUE_CONNECTION` in `.env`). Use **Test queue worker** in Settings to verify. | +| `SHORT_URL_SCOPE_TO_USER=true` | Filament users see only their own links (default) | +| Enable Safe Browsing / VPN in Settings | Security features are **off by default** | +| Global webhook signing secret | Required when global webhook is enabled | + +Raw visit logs are pruned after the retention window (default 90 days); long-range API stats rely on daily rollups. + +### Load & stress testing + +Two complementary baselines — use both before high-traffic launches or after infra changes. + +**1. In-process (Artisan)** — measures Laravel routing + redirect handler without HTTP overhead: + +```bash +php artisan short-url:stress-redirect your-key --requests=200 --warmup=10 +``` + +Reports avg / min / p95 / max in milliseconds. Best for quick regressions in CI or after code changes. + +**2. HTTP load (k6)** — concurrent requests against a running app (Herd, staging, production-like stack): + +```bash +# Install k6: https://grafana.com/docs/k6/latest/set-up/install-k6/ +k6 run vendor/janczakb/filament-short-url/scripts/k6/redirect-baseline.js \ + -e BASE_URL=https://your-app.test \ + -e URL_KEY=bench-key \ + -e VUS=20 \ + -e DURATION=1m \ + -e P95_MS=500 +``` + +| Variable | Default | Purpose | +|----------|---------|---------| +| `BASE_URL` | *(required)* | App origin, e.g. `https://wyachts.test` | +| `URL_KEY` | *(required)* | Existing short link key | +| `ROUTE_PREFIX` | `s` | From `SHORT_URL_ROUTE_PREFIX` | +| `VUS` | `10` | Concurrent virtual users | +| `DURATION` | `30s` | Test duration | +| `P95_MS` | `500` | Fail threshold for p95 latency | +| `SLEEP_MS` | — | Optional pause between iterations | + +**Tips** + +- Create a dedicated link with `track_visits=false` for a pure redirect benchmark (no queue/DB write noise). +- Compare SQLite vs MySQL on staging — driver and connection pool matter under load. +- These tests establish **your** baseline; they are not a license throughput guarantee. + +--- + +## Upgrading + +When updating from **v5.1.x or earlier**: + +```bash +composer update janczakb/filament-short-url +php artisan migrate +``` + +### Migration safety (v5.2.0) + +Three additive migrations ship with this release. They do **not** drop, rename, or rewrite existing rows. Your links, visit history, API keys, and settings remain intact. + +| Migration | Purpose | +|---|---| +| `2026_06_08_000001_add_api_and_utm_fields_to_short_urls_table` | API/UTM/public-stats columns + visit index | +| `2026_06_09_000001_audit_schema_and_performance_fixes` | `domain_scope_id`, composite unique keys, FK, stats columns | +| `2026_06_10_000001_add_security_counts_to_daily_stats` | `all_visits_count`, `bot_visits_count`, `proxy_visits_count` on daily rollups | +| `2026_06_11_000001_add_cross_dimensional_stats_to_daily_stats` | Cross-filter JSON rollups for filtered dashboard widgets | + +#### `2026_06_08_000001` + +| Database change | Effect on existing installs | +|---|---| +| `external_id`, `utm_*`, `ref` columns | Added as **nullable** — all existing links stay `NULL` until you set values | +| `public_stats_enabled` | Added with default **`false`** — public stats stay off until enabled per link | +| `public_stats_password` | Added as **nullable** | +| Index on `short_url_visits (short_url_id, ip_hash)` | Performance only — no data change | + +#### `2026_06_09_000001` + +| Database change | Effect on existing installs | +|---|---| +| `domain_scope_id` | Added with default **`0`** (default app domain). Existing custom-domain links get `domain_scope_id = custom_domain_id`. | +| Unique `(url_key, domain_scope_id)` | Replaces global `url_key` unique — allows the same slug on different domains | +| FK `custom_domain_id` → `short_url_custom_domains` | `ON DELETE SET NULL` when a domain is removed | +| Index `(user_id, is_archived, id)` | Admin list performance | +| Index `(short_url_id, id)` on visits | Aggregation/pruning performance | +| JSON columns on `short_url_daily_stats` | `utm_terms`, `utm_contents`, `browser_versions`, `os_versions` for richer charts | + +#### `2026_06_10_000001` + +| Database change | Effect on existing installs | +|---|---| +| `all_visits_count` | Total daily visits including bots/proxies (security widget rollups) | +| `bot_visits_count` | Pre-aggregated bot traffic per day | +| `proxy_visits_count` | Pre-aggregated VPN/proxy traffic per day | + +All three migrations use no `->after()` column ordering hints and no database-specific `ENUM` types, so they run cleanly on **SQLite, MySQL, and PostgreSQL**. + +**If you publish migrations to `database/migrations/`**, make sure both new files are present after `composer update`, then run `php artisan migrate`. If you never published migrations, the package service provider registers them automatically — `migrate` is still required once per release that adds schema changes. + +**Rollback:** `php artisan migrate:rollback --step=4` removes the v5.2.0 columns and indexes (one step per migration). Existing link data created before v5.2.0 is unaffected. + --- ## Publishing Package Assets @@ -234,7 +374,7 @@ public function manageSettings(User $user): bool } ``` -Then register it in `AuthServiceProvider`: +Then register the policy in your application (e.g. `AppServiceProvider` or `bootstrap/app.php` in Laravel 11+): ```php use Bjanczak\FilamentShortUrl\Models\ShortUrl; @@ -253,10 +393,10 @@ protected $policies = [ The package comes with a built-in admin settings dashboard. It is accessible directly from your sidebar menu under the same navigation group as your links. -Settings are stored dynamically in the database (`short_url_settings` table), cached indefinitely, and immediately override config defaults. Legacy settings from `filament-short-url-settings.json` are automatically imported on first load. +Settings are stored dynamically in the database (`short_url_settings` table), cached for 3600 seconds by default, and immediately override config defaults. Legacy settings from `filament-short-url-settings.json` are automatically imported on first load. > [!NOTE] -> **Modular Tab Architecture (New in v3.5.0)**: The settings form is split into 8 independent, single-responsibility tab classes (`LinkTab`, `TargetingTab`, `TrackingTab`, `SecurityTab`, `GeoIpTab`, `VpnDetectionTab`, `QrDesignTab`, `PixelsTab`) to reduce load times, improve code maintainability, and allow clean tab query parameters navigation (e.g. `?tab=qr`). +> **Modular Tab Architecture**: The **Settings** page is split into independent tab classes (`GeneralTab`, `GeoIpTab`, `Ga4Tab`, `AdvancedTab`, `TrackingDefaultsTab`, `QrDefaultsTab`, `DeveloperTab`, `DeepLinkingTab`) with clean query-string navigation (e.g. `?tab=qr-defaults`). The **link create/edit form** uses separate tabs: **Link Details**, **Targeting**, **Password**, **Expiration**, **Tracking**, **Marketing & API**, and **SEO & Social**. The settings panel allows you to configure: @@ -265,26 +405,45 @@ The settings panel allows you to configure: * **Default Redirect Status**: Choose `302 (Found / Temporary)` or `301 (Moved Permanently)`. * *Note: `302` is highly recommended for analytics accuracy because browsers cache `301` redirects, skipping subsequent logs.* * **Key Length**: Default character count (base62) for auto-generated keys (default: `6`). -* **Queue Connection**: Define the Laravel queue connection (e.g. `redis`, `database`, `sync`) used for processing visit analytics asynchronously. +* **Queue Connection**: Laravel queue driver for async visit tracking. Default is **`sync`** (works without a background worker). Set to `database` or `redis` in **Settings → General** (or `SHORT_URL_QUEUE`) when you run a matching queue worker. +* **Queue Name**: Target queue for visit tracking and counter sync jobs (default: `default`). Shown when connection ≠ `sync`. +* **Queue mode callout**: One contextual info box per async driver with a **dynamic** worker command, e.g. `php artisan queue:work redis --queue=default`. Hidden for `sync`. +* **Redis connection** (when Queue = `redis`): Host, port, password, database index, and optional key prefix — stored in settings and **override** `database.redis` / `queue.connections.redis` at runtime (no `.env` edit required for day-to-day ops). +* **Test Redis connection**: PING + counter-style Redis probe using current form values (works before Save). +* **Test queue worker**: Enqueues a probe job and confirms a worker processes it within 12 seconds; shows the exact worker command if not. ### 2. Geo-IP Country Detection Toggle country tracking and select from three drivers: -* **Headers** (Edge Resolution): Automatically detects client country using standard edge headers (e.g. Cloudflare's `CF-IPCountry`, AWS CloudFront's `CloudFront-Viewer-Country`, or generic proxies). +* **Headers** (Edge Resolution, recommended behind CDN): Reads country/city from edge headers (`CF-IPCountry`, `CloudFront-Viewer-Country`, etc.). Saving settings with this driver **automatically enables** **Trust CDN & Proxy Headers**. When headers are missing, the plugin falls back to MaxMind, then ip-api.com (rate-limited). * **MaxMind** (Offline Resolution): Reads from a local GeoIP2 database (such as the free GeoLite2-Country database). -* **IP-API** (Online Fallback): Makes an external API call to `ip-api.com` with configurable timeout. +* **IP-API** (Online): Direct lookup via `ip-api.com` with configurable timeout and built-in rate limiting (40 requests/minute guard). + +> **Tip:** Enable **Trust CDN & Proxy Headers** only when your app sits behind a real CDN or reverse proxy. The Headers driver turns this on for you on save — do not enable it on a server that receives traffic directly from the internet. ### 3. Google Analytics 4 (GA4) Integration -Sends server-side `short_url_visit` hits using the **GA4 Measurement Protocol API**. This bypasses browser-side AdBlockers entirely. -* **GA4 API Secret**: Create this secret in Google Analytics under `Admin -> Data Streams -> Measurement Protocol API secrets`. -* **Firebase App ID / Measurement ID**: The target analytics stream identifier. +Sends server-side hits using the **GA4 Measurement Protocol API** — bypassing browser ad-blockers entirely. Hits are dispatched asynchronously in `TrackShortUrlVisitJob` (never blocking redirects). + +Each visit sends a standards-compliant MP payload: +* **`page_view`** — `page_location`, `page_title`, `page_referrer`, `language` +* **`click`** — outbound link metadata (`link_url`, `link_domain`) +* **`short_url_visit`** — plugin-specific dimensions (`url_key`, device, country, QR flag) +* **`session_id`**, **`timestamp_micros`**, **`engagement_time_msec`** — required for GA4 session reporting + +Configuration: +* **GA4 API Secret** — Create in Google Analytics under `Admin → Data Streams → Measurement Protocol API secrets`. +* **Per-link Measurement ID** — Set `ga_tracking_id` (`G-XXXXXXXXXX`) on each link. Invalid IDs are rejected before HTTP. +* **Firebase App ID** (optional) — Use instead of Measurement ID for Firebase streams. +* **Test connection** — In **Settings → GA4**, enter your Measurement ID and click **Test connection**. Uses the GA4 **debug collector** with your real stream ID + secret (not a placeholder). + +Privacy: `client_id` is a deterministic SHA-256 hash of IP + User Agent — no raw PII sent to Google. ### 4. Counter Buffering (Write-back Caching) For extremely high-traffic applications, direct database writes for click counts can cause row-locking bottlenecks. -* **Buffer Click Counts**: Toggling this option buffers total and unique visit count increments in the application cache. +* **Buffer Click Counts**: Toggling this option buffers total and unique visit count increments in the application cache (or **dedicated Redis** when Queue Connection = `redis` — then buffering is **automatic** and the toggle is disabled). * **Cron Synchronization**: When enabled, the synchronization command flushes counts to the database. The package automatically registers this in the Laravel Scheduler to run every minute when counter buffering is active, so you only need to ensure the standard Laravel schedule runner (`* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1`) is running on your server. * Command: `php artisan short-url:sync-counters` -### 5. Performance & Security Tab (new in v1.2.0) +### 5. Advanced Tab — Aggregation, Rate Limiting & Security #### High-Traffic Log Management (Aggregation & Pruning) At scale, the `short_url_visits` table can grow to tens of gigabytes. The aggregation system solves this: @@ -300,34 +459,45 @@ Prevent redirect abuse and bot traffic flooding: When a client exceeds the limit, a `429 Too Many Requests` response is returned with a `Retry-After` header. +#### Analytics & Bot Detection (Settings GUI) + +These options were previously `.env`-only; they are now editable under **Settings → Performance & Security** (`?tab=advanced`) → **Analytics & Bot Detection**: + +* **Click deduplication** — Ignore repeat clicks from the same IP within a configurable window (default: off, 1 hour). Mirrors `SHORT_URL_CLICK_DEDUP` / `SHORT_URL_CLICK_DEDUP_HOURS`. +* **Verify Googlebot IP** — Optional reverse-DNS + forward IP check for Googlebot user agents. Mirrors `SHORT_URL_VERIFY_GOOGLEBOT_IP`. +* **Bot debug secret** — Allows `?bot=1` preview testing in production when the query matches `SHORT_URL_BOT_DEBUG_SECRET`. + --- -## Password-Protected Links (new in v1.2.0) +## Password-Protected Links -You can require visitors to enter a password before being redirected. Enable this in the **Targeting & Security** tab of the short URL form: +You can require visitors to enter a password before being redirected. Enable this in the **Password** tab of the short URL form: -- Set a plain-text password in the **Access Password** field. +- Set a password in the **Access Password** field. - Visitors will see a styled password prompt page before gaining access. - The unlock state is stored in the PHP session — visitors only need to enter the password once per session. +- Passwords are **hashed at rest** using Laravel's `Hash` facade (bcrypt/argon). Legacy plain-text passwords created before v5.2.0 are still verified and automatically re-hashed on the next save. ```php -// Programmatically — set via fillable attributes +// Programmatically — set via fillable attributes (hashed automatically on save) $shortUrl = ShortUrl::destination('https://secret.example.com') ->create(); $shortUrl->update(['password' => 'my-secret-pass']); + +// Verify programmatically +$shortUrl->verifyPassword('my-secret-pass'); // true +$shortUrl->hasPassword(); // true ``` -> **Note**: Passwords are currently stored as plain text. For sensitive use-cases, hash the password and compare with `Hash::check()` by overriding the redirect controller. - > [!NOTE] -> **Stateful Route Transition (v5.1.0+)**: To achieve ultra-fast (<15ms) redirects for normal links, the main `/s/{key}` path completely bypasses Laravel's session/cookie `web` middleware group. If password protection is detected, the engine dynamically redirects the visitor to a stateful `/s-auth/{key}` route where sessions are loaded and the password prompt is served. +> **Stateful vs stateless routes**: The main `/s/{key}` redirect uses only rate limiting by default (no `web` middleware). Password unlock uses `/s-auth/{key}`, which loads sessions. Visit tracking defaults to the `sync` queue so redirects work without a queue worker; switch to `redis`/`database` in **Settings → General** for async tracking on high-traffic sites. --- -## Redirect Warning Pages (new in v1.2.0) +## Redirect Warning Pages -Enable the **Show Redirect Warning Page** toggle in the **Targeting & Security** tab to display a safety interstitial before redirecting. +Enable the **Show Redirect Warning Page** toggle in the **Password** tab to display a safety interstitial before redirecting. The warning page: - Shows the destination URL clearly so visitors can verify they trust it. @@ -339,12 +509,12 @@ This feature is useful for NSFW links, external partner links, or any URL that l --- -## Security & Anti-Fraud v2.0 (new in v1.6.0) +## Security & Anti-Fraud Protect your application redirection routes and visitor data from malicious activities and automated scrapers. ### 1. VPN & Proxy Detection -Filter out anonymous proxy, VPN, or Tor connections to ensure clean analytics and prevent abuse. +When enabled in **Settings → Advanced**, filter anonymous proxy, VPN, or Tor connections to keep analytics clean and prevent abuse. Disabled by default. * **Driver Selection**: Choose between the free **IP-API** service (default) or the premium **VPNAPI.io** service (requires setting an API key). * **Configurable Action**: * **Flag Only**: Flags VPN/Proxy visits in database statistics for inspection but allows the redirection to continue. @@ -352,28 +522,28 @@ Filter out anonymous proxy, VPN, or Tor connections to ensure clean analytics an * **Verify Key**: An interactive "Verify connection" action is available in settings to check your API credentials. ### 2. Google Safe Browsing URL Verification -Scan and verify all user-provided target URLs against Google's safe browsing lookup API on creation and edit. +When enabled in **Settings → Advanced**, scan and verify user-provided target URLs against Google's Safe Browsing API on creation, edit, **and redirect** (cached per destination URL). Disabled by default. * **Protection**: Blocks malware, phishing, and social engineering domains. * **Filament UI**: Displays a clean status badge and blocks form saving if the target URL is flagged as unsafe. * **Verify Key**: Includes a "Test API Connection" action on the settings dashboard to validate your Safe Browsing API credentials. --- -## Custom Branded Expiry Pages (new in v3.0.0) +## Custom Branded Expiry Pages When a short URL is expired, deactivated, or has reached its maximum visit limit, it needs to handle the redirect gracefully: * **Custom Fallback URL**: If configured, visitors are immediately redirected to the `expiration_redirect_url` target. * **Branded Expiry Page (Default)**: If no fallback URL is specified, the system displays a premium branded, fully localized, dark-mode compatible HTML page (`expired.blade.php`) instead of a generic browser `410 Gone` error. - - Automatically displays your customized **Site Name** (and host application logo if the `setting('logo_path')` helper is defined). + - Automatically displays your customized **Site Name** from **Settings → General** (falls back to `config('app.name')`) and the host application logo when the `setting('logo_path')` helper is defined. The same branding is used on password prompts, public stats pages, and other visitor-facing screens. - Displays a clean visual alert state with details about the expired link. - Features a friendly back button pointing to your website's homepage. - Can be easily customized by publishing package views: `php artisan vendor:publish --tag=filament-short-url-views`. --- -## Smart Link Targeting (updated in v3.5.0) +## Smart Link Targeting -The **Targeting & Security** tab exposes a powerful rule engine that lets you route different visitors to different destinations — all from a single short URL. +The **Targeting** tab exposes a powerful rule engine that lets you route different visitors to different destinations — all from a single short URL. You can configure multiple rules evaluated sequentially from top to bottom. Each rule contains: - A **Target URL** (the redirect destination if rule matches). @@ -384,7 +554,7 @@ You can configure multiple rules evaluated sequentially from top to bottom. Each - **Country**: Filter by country codes (e.g. `PL`, `US`, `DE`) with flags display. - **Language**: Filter by preferred browser language codes (e.g. `pl`, `en`, `de`). -### Multi-Filter JSON Schema (v3.3.0+) +### Multi-Filter JSON Schema For programmatic or REST API updates, pass an array of rules to `targeting_rules`: @@ -436,7 +606,7 @@ If your database contains legacy single-strategy rules (e.g. `'type' => 'device' --- -## A/B Split Testing & Weighted Traffic Rotation (new in v3.5.0) +## A/B Split Testing & Weighted Traffic Rotation A single short URL can distribute traffic across 2–5 landing pages using configurable weights. This is useful for comparing conversion rates between different pages without changing the link you've already shared. @@ -495,13 +665,13 @@ To nest a split test inside a targeting rule, use `variants` within the rule obj --- -## Native App Linking & Deep Linking (new in v3.0.0) +## Native App Linking & Deep Linking This package supports two distinct levels of mobile app integration: **Per-Link App Linking** (client-side redirects using custom schemes) and **Global Deep Linking Files** (domain association files for OS-level native integration). ### 1. Per-Link App Linking (Mobile Auto-Open) -When creating or editing a short URL, the **App Linking** tab allows you to configure automatic redirects into native mobile applications. +When creating or editing a short URL, the **Targeting** tab includes an **App Linking** section where you configure automatic redirects into native mobile applications. * **How it works**: If a destination URL matches one of the 24+ pre-configured native applications (such as YouTube, TikTok, Instagram, Facebook, Spotify, WhatsApp, Messenger, etc.), the plugin can bypass standard web views for mobile visitors. * **The Interstitial Experience**: If **Auto open app on mobile** is enabled, mobile visitors are shown a premium glassmorphic redirect interstitial page that triggers the corresponding custom URL scheme (e.g. `whatsapp://`, `instagram://`, `youtube://`) to launch the native app directly, with fallback options to open in a web browser. @@ -567,7 +737,7 @@ To support seamless OS-level integrations without browser intermediaries—such --- -## High-Traffic Optimizations (new in v1.2.0) +## High-Traffic Optimizations ### Daily Stats Aggregation @@ -576,8 +746,11 @@ The `short_url_daily_stats` table stores pre-aggregated daily summaries per shor | Column | Description | |--------|-------------| | `date` | The calendar day | -| `visits_count` | Total visits | -| `unique_visits_count` | Unique visitors (by hashed IP) | +| `visits_count` | Human visits (excludes bots/proxies) | +| `unique_visits_count` | Unique human visitors (by hashed IP) | +| `all_visits_count` | All visits including bots and proxies | +| `bot_visits_count` | Bot visits for the day | +| `proxy_visits_count` | VPN/proxy visits for the day | | `device_stats` | JSON — visit counts by device type | | `browser_stats` | JSON — visit counts by browser | | `os_stats` | JSON — visit counts by operating system | @@ -589,34 +762,56 @@ The `short_url_daily_stats` table stores pre-aggregated daily summaries per shor | `utm_campaign_stats` | JSON — visit counts by UTM campaign | | `qr_visits_count` | Pre-aggregated daily QR code scans | | `language_stats` | JSON — visit counts by browser language preferences | +| `utm_terms`, `utm_contents` | JSON — UTM term/content breakdowns | +| `browser_versions`, `os_versions` | JSON — version-level breakdowns | +| `variant_stats` | JSON — A/B variant breakdowns | -The `getCachedStats()` model method **automatically merges** data from both tables: historical days come from `short_url_daily_stats`, while today's data comes directly from `short_url_visits` — completely transparent to the dashboard. +The `getCachedStats()` model method **automatically merges** data from both tables: historical days come from `short_url_daily_stats`, while today's data is merged live — from **Redis today buffer** when Settings queue is `redis`, otherwise from a short-TTL SQL micro-cache on `short_url_visits`. + +**Filtered stats** (dashboard filters active) use `FilteredStatsCollector`: pruned history is read from **cross-dimensional daily rollups** (`cross_dimensional_stats`, `cross_filter_pairs`) where possible, the retention window contributes exact `unique` via one SQL query, and only **today** (or 3+ simultaneous filters) requires a bounded raw scan. Results are cached via `StatsCacheHelper` (works on file, database, Redis, Memcached, and array cache drivers). Historical stats cache is **not** invalidated on every visit when using the Redis scaling profile. + +**Security breakdown** (bots / VPN widget) uses `getSecurityBreakdownStats()` with the same daily rollups plus a single aggregated query on raw visits. + +#### Production scaling profile (`queue_connection = redis`) + +When **Settings → Queue Connection = `redis`** and Redis is reachable: + +| Component | Role | +|-----------|------| +| `PluginRedisConnection` | Shared Redis from `queue.connections.redis` (not `CACHE_STORE`) | +| `VisitCounterBuffer` | Buffered link totals/uniques + dirty-set sync | +| `TodayStatsBuffer` | Live today summary + hourly chart counters | +| `StatsScalingProfile` | Chooses Redis vs SQL/cache paths per feature | +| `StatsVisitRecorder` | Stats side effects in the visit job without full cache bust | + +Requires a running worker: `php artisan queue:work redis --queue=` (use **Test queue worker** in Settings to verify). ### Queue Worker vs. Synchronous Execution The plugin is designed to be highly reliable and performant regardless of whether your hosting environment runs a background queue worker. -#### 1. With a Queue Worker (Recommended) -If your application runs a queue worker (e.g. via supervisor running `php artisan queue:work`), you should configure the **Queue Connection** in the **Settings** panel (or via `SHORT_URL_QUEUE` env variable) to your primary queue driver (like `redis` or `database`). -- **Performance**: High-speed redirects are prioritized. Visitor clicks, Geo-IP lookups, GA4 hits, and Webhook dispatches are immediately deferred to background queue jobs (`TrackShortUrlVisitJob` and `SendWebhookJob`), keeping redirect response times under 20ms. -- **Worker Configuration**: Ensure your queue listener is running: +#### 1. With a Queue Worker (Recommended for high traffic) +If your application runs a queue worker (e.g. via Supervisor), configure **Queue Connection** in **Settings → General** (or `SHORT_URL_QUEUE`) to `database` or `redis`. The package default is **`sync`** so redirects work out of the box without a worker. +- **Performance**: With `database` or `redis` queue, visitor clicks, Geo-IP lookups, GA4 hits, and webhook dispatches run in `TrackShortUrlVisitJob` / `SendWebhookJob` **after** the redirect response is sent — keeping the hot path lean. Latency still depends on your stack (DB, Redis, enabled security features, HTML interstitials). +- **Worker command**: Must match **Settings → General**, not necessarily `.env` `QUEUE_CONNECTION`: ```bash - php artisan queue:work --queue=default + php artisan queue:work redis --queue=default ``` - *(If you customized the queue name in Settings, replace `default` with your custom queue name).* + Replace `redis` with your selected connection and `default` with your **Queue Name** from Settings. +- **Verify before production**: Use **Test queue worker** in Settings (dispatches a probe job and waits for processing). -#### 2. Without a Queue Worker (Sync Driver Fallback) +#### 2. Without a Queue Worker (Sync Driver) If you do not run background queue workers, set the **Queue Connection** to `sync`. - **Automatic Fallback**: The plugin dynamically executes all jobs synchronously on the request thread. The visitor is redirected as soon as the synchronous processes (log recording, webhook calls, etc.) complete. - **Fault Tolerance (Safety Nets)**: Webhook failures (timeouts, 500 errors) or database tracking glitches can happen. The plugin wraps all synchronous execution points in strict error boundaries (`try/catch`). **A failed tracking job or a slow/offline webhook will NEVER crash the visitor's redirect or programmatic REST API responses.** They are gracefully logged in the background. ### Queue-Based Counter Fallback -When Redis is not available and counter buffering is enabled, the `IncrementVisitJob` is dispatched to the configured queue connection. This guarantees visit counts are not lost during cache evictions or restarts. +When counter buffering is enabled and Settings queue is **not** `redis`, `IncrementVisitJob` can dispatch to the configured queue connection so counts survive cache evictions. With **queue = `redis`**, counters use dedicated Redis keys via `VisitCounterBuffer` and flush through `short-url:sync-counters`. --- -## Social Retargeting Pixels & Central Pixel Registry (new in v3.0.0) +## Social Retargeting Pixels & Central Pixel Registry Instead of manually copy-pasting tracking pixel IDs (Meta, Google Tag, LinkedIn, TikTok, Pinterest) every time you create a new link, the package features a centralized **Retargeting Pixel Registry** with a Many-to-Many relationship. You define your marketing pixels once in the new **Pixel Registry** resource, and then easily select them via checkbox/list options when creating or editing short links. @@ -664,15 +859,17 @@ $shortUrl->pixels()->sync([$pixelId1, $pixelId2]); --- -## Custom Domain Branding (new in v4.0.0) +## Custom Domain Branding Branded links (e.g. `go.company.com/abc123` instead of `yourdomain.com/s/abc123`) significantly increase click-through rates and build trust. This package includes a full-featured custom domain manager out-of-the-box. ### Key Features -1. **Dynamic CNAME/A Record Verification**: Resolves DNS records in real-time natively using PHP's `dns_get_record()` (with fallback to `dig`) and matches against the host server IP — supports both CNAME and A record setups. -2. **DNS Setup Instructions**: Step-by-step instructions for non-technical users to connect their domain in their registrar (GoDaddy, Cloudflare, Namecheap, etc.) directly in the Filament UI. -3. **Verified-Only Assignment**: Only domains that pass DNS verification can be associated with short URLs. -4. **Root-Level Redirections**: When a visitor hits a custom domain link (e.g. `go.company.com/abc123`), the request is matched directly at the root path — omitting the default `/s/` prefix automatically. +1. **Multi-record DNS verification**: Resolves all A records and CNAME targets via `dns_get_record()` (with `gethostbynamel` / `dig` fallbacks). Matches when **any** resolved IP intersects the app host, or when a CNAME chain points to `app.url`. +2. **Activation gate**: Domains cannot stay active without passing DNS verification (`custom_domains.enforce_dns_on_activate`, default `true`). Failed activation attempts are automatically deactivated. +3. **DNS Setup Instructions**: Step-by-step instructions for non-technical users to connect their domain in their registrar (GoDaddy, Cloudflare, Namecheap, etc.) directly in the Filament UI. +4. **Verified-Only Assignment**: Only domains that are **active and verified** can be associated with short URLs (enforced in Filament and API validation). +5. **Root-Level Redirections**: When a visitor hits a custom domain link (e.g. `go.company.com/abc123`), the request is matched directly at the root path — omitting the default `/s/` prefix automatically. +6. **Scheduled re-verification**: `short-url:verify-custom-domains` re-checks DNS daily for active domains. ### How to use 1. Go to the **Custom Domains** page in the Filament admin panel (sidebar → Links → Custom Domains). @@ -766,9 +963,9 @@ go.company.com { ### Server Requirements - DNS verification runs natively using PHP's built-in `dns_get_record()` function. -- If native DNS functions are disabled or fail, the plugin falls back to using the `dig` CLI tool (`apt install dnsutils` on Debian/Ubuntu, `yum install bind-utils` on CentOS/RHEL). -- If neither is available, the plugin falls back to `$_SERVER['SERVER_ADDR']` for A record matching. -- The DNS verification runs synchronously in the admin panel when the **Verify** button is clicked. For production use with many domains, consider wrapping it in a queued job. +- If native DNS functions are disabled or fail, the plugin falls back to the `dig` CLI tool (`apt install dnsutils` on Debian/Ubuntu, `yum install bind-utils` on CentOS/RHEL). +- Verification compares resolved records against `config('app.url')` host IPs — no hardcoded server IP or `SERVER_ADDR` fallback. +- The DNS verification runs synchronously in the admin panel when the **Verify** button is clicked. For production use with many domains, the scheduled `short-url:verify-custom-domains` command handles bulk re-checks. ### Database Schema @@ -788,7 +985,7 @@ Short URLs reference their custom domain via `custom_domain_id` (foreign key on --- -## Developer REST API (new in v1.5.0) +## Developer REST API The plugin exposes a REST API that allows external systems (CRMs, Zapier, Make, custom integrations) to manage short URLs programmatically. @@ -832,6 +1029,14 @@ Each API key can have its own **individual rate limit** (requests per minute), i Configure the rate limit for each key in **Settings → API & Webhooks → Developer API Keys**. The default is **60 requests per minute**. +### Per-Key Link Scoping (Owner User ID) + +When **`scope_links_to_user`** is enabled (default), every API key **must** include an **`owner_user_id`**. All link queries and mutations through that key are scoped to short URLs where `user_id` matches — useful for multi-user panels or per-team integrations. Keys without an owner ID are rejected with **403 Forbidden**. + +When link scoping is **disabled** (`SHORT_URL_SCOPE_TO_USER=false`), `owner_user_id` is optional and keys without an owner retain access to all links (subject to scope and rate limits). + +Configure in **Settings → API & Webhooks → Developer API Keys → Owner User ID**. + ### Endpoints All endpoints are prefix-grouped under `/api/short-url/` and are protected by the API Key middleware. The effective rate limit is the lower of the global route throttle and the per-key rate limit. @@ -862,7 +1067,7 @@ curl https://yourdomain.com/api/short-url/links \ "expires_at": null, "webhook_url": null, "targeting_rules": null, - "password": null, + "password_protected": false, "show_warning_page": false, "auto_open_app_mobile": false, "ga_tracking_id": null, @@ -909,26 +1114,12 @@ curl https://yourdomain.com/api/short-url/links/abc123 \ "redirect_status_code": 302, "total_visits": 47, "unique_visits": 31, - "max_visits": null, - "activated_at": null, - "expires_at": null, - "webhook_url": null, - "targeting_rules": null, - "password": null, - "show_warning_page": false, - "auto_open_app_mobile": false, - "ga_tracking_id": null, - "track_visits": true, - "track_ip_address": true, - "track_browser": true, - "track_browser_version": true, - "track_operating_system": true, - "track_operating_system_version": true, - "track_device_type": true, - "track_referer_url": true, - "track_browser_language": true, - "pixels": [], - "notes": null, + "password_protected": false, + "is_cloaked": false, + "do_index": false, + "og_title": null, + "og_description": null, + "og_image": null, "created_at": "2026-06-01T12:00:00+00:00" } } @@ -984,8 +1175,13 @@ curl -X PATCH https://yourdomain.com/api/short-url/links/promo26 \ | `expires_at` | datetime | ❌ | Expiration timestamp (must be after or equal to `activated_at`) | | `pixels` | array of integers | ❌ | List of registered retargeting pixel IDs to associate with the link | | `webhook_url` | string (URL) | ❌ | Per-link webhook URL for immediate event notifications | -| `targeting_rules` | array | ❌ | Advanced Multi-Filter Targeting Rules JSON schema (see [Smart Link Targeting](#smart-link-targeting-updated-in-v340) for schema details) | -| `password` | string | ❌ | Password to protect the short URL | +| `targeting_rules` | array | ❌ | Advanced Multi-Filter Targeting Rules JSON schema (see [Smart Link Targeting](#smart-link-targeting) for schema details) | +| `is_cloaked` | boolean | ❌ | Embed destination in an iframe on your short-link domain (default: `false`) | +| `do_index` | boolean | ❌ | Allow search engine indexing of the short link (default: `false`) | +| `og_title` | string | ❌ | Custom Open Graph / Twitter Card title (max 255 chars) | +| `og_description` | string | ❌ | Custom social preview description (max 500 chars) | +| `og_image` | string (URL) | ❌ | Public URL to an OG image (Filament upload/import pipeline stores processed images on disk) | +| `password` | string | ❌ | Password to protect the short URL (hashed automatically on save; never returned in API responses) | | `show_warning_page` | boolean | ❌ | Toggle redirect warning interstitial page | | `auto_open_app_mobile` | boolean | ❌ | Auto open deep link in native application on mobile devices | | `ga_tracking_id` | string | ❌ | Custom Google Analytics 4 Measurement ID for this link (`G-XXXXXXXXXX`, max 50 chars) | @@ -998,6 +1194,14 @@ curl -X PATCH https://yourdomain.com/api/short-url/links/promo26 \ | `track_device_type` | boolean | ❌ | Track client device type (default: `true`) | | `track_referer_url` | boolean | ❌ | Track visitor referrer URL (default: `true`) | | `track_browser_language` | boolean | ❌ | Track visitor preferred browser language (default: `true`) | +| `external_id` | string | ❌ | External CRM/integration identifier (unique, max 255 chars) | +| `folder_id` | integer | ❌ | Assign link to a folder (`short_url_folders.id`) | +| `tag_ids` | array of integers | ❌ | Up to 5 tag IDs to attach | +| `is_archived` | boolean | ❌ | Archive instead of delete (hidden from default list) | +| `utm_source` / `utm_medium` / `utm_campaign` / `utm_term` / `utm_content` | string | ❌ | Stored on the link and merged into the destination URL on redirect (existing query params on the destination are preserved; link-level values fill gaps only) | +| `ref` | string | ❌ | Appended as `?ref=` on redirect when not already present | +| `public_stats_enabled` | boolean | ❌ | Enable the public stats page + JSON endpoint for this link (default: `false`) | +| `public_stats_password` | string | ❌ | Optional password for public stats (hashed at rest; session unlock on HTML, Bearer/POST for JSON) | **Response (POST & PUT/PATCH success):** `200 OK` (or `201 Created` for POST) containing: ```json @@ -1017,9 +1221,14 @@ curl -X PATCH https://yourdomain.com/api/short-url/links/promo26 \ "expires_at": null, "webhook_url": "https://api.mycrm.com/clicks", "targeting_rules": null, - "password": null, + "password_protected": false, "show_warning_page": false, "auto_open_app_mobile": false, + "is_cloaked": false, + "do_index": false, + "og_title": null, + "og_description": null, + "og_image": null, "ga_tracking_id": null, "track_visits": true, "track_ip_address": true, @@ -1105,6 +1314,143 @@ curl https://yourdomain.com/api/short-url/links/promo26/stats \ } ``` +#### `GET /api/short-url/links/{idOrKey}/visits` +List raw visit logs for a single short URL (paginated, 30 per page by default). + +```bash +curl "https://yourdomain.com/api/short-url/links/promo26/visits?per_page=50" \ + -H "X-Api-Key: sh_key_your_key_here" +``` + +**Response:** `200 OK` with paginated visit records (`id`, `visited_at`, `browser`, `country_code`, `referer_host`, `is_qr_scan`, UTM fields, etc.). The raw password hash is never included. + +#### `POST /api/short-url/links/bulk-delete` +Delete multiple short URLs in a single request (max 100). + +```bash +curl -X POST https://yourdomain.com/api/short-url/links/bulk-delete \ + -H "X-Api-Key: sh_key_your_key_here" \ + -H "Content-Type: application/json" \ + -d '{"ids": [1, 2, 3]}' +``` + +Alternatively, pass `"keys": ["promo26", "summer24"]` instead of `"ids"`. + +**Response:** `200 OK` +```json +{ + "message": "Short URLs deleted successfully.", + "deleted": 3 +} +``` + +#### `PATCH /api/short-url/links/bulk-update` +Update multiple short URLs at once (max 100). Supported fields in the `data` object: `is_enabled`, `notes`, `expires_at`, `max_visits`. + +```bash +curl -X PATCH https://yourdomain.com/api/short-url/links/bulk-update \ + -H "X-Api-Key: sh_key_your_key_here" \ + -H "Content-Type: application/json" \ + -d '{ + "keys": ["promo26", "summer24"], + "data": { "is_enabled": false } + }' +``` + +**Response:** `200 OK` +```json +{ + "message": "Short URLs updated successfully.", + "updated": 2 +} +``` + +#### `PUT /api/short-url/links/upsert` +Create or update a link by **`external_id`**, or by matching **`url_key` + `destination_url`**. Accepts the same fields as `POST /links`. When a match exists, unique validation ignores the existing record. + +```bash +curl -X PUT https://yourdomain.com/api/short-url/links/upsert \ + -H "X-Api-Key: sh_key_your_key_here" \ + -H "Content-Type: application/json" \ + -d '{ + "external_id": "crm-deal-42", + "destination_url": "https://example.com/offer", + "url_key": "offer42", + "notes": "Synced from CRM" + }' +``` + +**Response:** `200 OK` (updated) or `201 Created` (new link). + +#### `POST /api/short-url/links/bulk` +Bulk-create up to **100** links in one request. + +```bash +curl -X POST https://yourdomain.com/api/short-url/links/bulk \ + -H "X-Api-Key: sh_key_your_key_here" \ + -H "Content-Type: application/json" \ + -d '{ + "links": [ + {"destination_url": "https://a.com", "url_key": "bulk-a"}, + {"destination_url": "https://b.com", "url_key": "bulk-b"} + ] + }' +``` + +**Response:** `201 Created` with `data` array of created links. + +#### `GET /api/short-url/links/exists` +Check whether a URL key is already taken **within a domain scope** (default app domain = scope `0`, custom domain = its ID). + +```bash +# Default domain scope +curl "https://yourdomain.com/api/short-url/links/exists?url_key=promo26" \ + -H "X-Api-Key: sh_key_your_key_here" + +# Custom domain scope (same slug can exist on another domain) +curl "https://yourdomain.com/api/short-url/links/exists?url_key=promo26&custom_domain_id=3" \ + -H "X-Api-Key: sh_key_your_key_here" +``` + +**Response:** `200 OK` — `{"exists": true, "url_key": "promo26", "domain_scope_id": 0}` + +#### `GET /api/short-url/links/random` +Return one random link from the scoped collection (respects `owner_user_id` on the API key). + +#### `GET /api/short-url/links/info` +Lightweight lookup by `url_key` **or** `external_id` query parameter. + +```bash +curl "https://yourdomain.com/api/short-url/links/info?external_id=crm-deal-42" \ + -H "X-Api-Key: sh_key_your_key_here" +``` + +#### `GET /api/short-url/links/{idOrKey}/visits/export` +Download raw visit logs as **CSV** (same filters as the paginated visits endpoint). + +```bash +curl "https://yourdomain.com/api/short-url/links/promo26/visits/export" \ + -H "X-Api-Key: sh_key_your_key_here" \ + -o visits.csv +``` + +#### Tags & Folders REST API + +Manage organization metadata programmatically: + +| Method | Endpoint | Description | +|---|---|---| +| `GET` | `/api/short-url/tags` | List tags | +| `POST` | `/api/short-url/tags` | Create tag (`name`, optional `color`) | +| `PUT/PATCH` | `/api/short-url/tags/{id}` | Update tag | +| `DELETE` | `/api/short-url/tags/{id}` | Delete tag | +| `GET` | `/api/short-url/folders` | List folders | +| `POST` | `/api/short-url/folders` | Create folder (`name`) | +| `PUT/PATCH` | `/api/short-url/folders/{id}` | Update folder | +| `DELETE` | `/api/short-url/folders/{id}` | Delete folder | + +Attach tags and folders to links via `tag_ids` and `folder_id` on create/update/upsert requests. + #### `DELETE /api/short-url/links/{idOrKey}` Permanently delete a short URL by its database `id` or short `url_key`. @@ -1125,13 +1471,14 @@ curl -X DELETE https://yourdomain.com/api/short-url/links/promo26 \ | HTTP Code | Reason | |---|---| | `401 Unauthorized` | Missing or invalid API key | +| `403 Forbidden` | Read-only API key attempted a write, or public stats password missing/invalid | | `404 Not Found` | Short URL not found | | `422 Unprocessable Entity` | Validation error (see `errors` field in response) | | `503 Service Unavailable` | REST API is disabled in Settings | --- -## Webhooks (new in v1.5.0) +## Webhooks Webhooks allow external systems to receive real-time HTTP POST notifications when events occur on your short URLs. Payloads are dispatched **asynchronously** via the Laravel Queue — redirects are never blocked. @@ -1208,11 +1555,16 @@ All webhook requests are HTTP POST with `Content-Type: application/json` and the If the webhook endpoint returns a non-2xx response or is unreachable, the `SendWebhookJob` will automatically retry up to **3 times** with a **10-second backoff** between attempts. Failed jobs land in your queue's failed jobs table after exhausting retries. +### Outbound URL Validation + +Before a webhook job is queued or executed, the target URL is validated against an SSRF blocklist. Requests to `localhost`, link-local/private IP ranges, cloud metadata endpoints, and `.local`/`.internal` hostnames are rejected. Hostnames are **DNS-resolved** — URLs that resolve to private IPs are blocked even when the hostname looks public. This applies to per-link webhooks, global webhooks, OG image imports, and the iframeable pre-check redirect chain. + ### Webhook Priority (per-link vs global) -The resolution order is: +The global webhook URL fires only when **Enable Global Webhook** is turned on in Settings (or `global_webhook_enabled` is `true` in config). Resolution order: + 1. If the short URL has its own `webhook_url` → use it (always fires, regardless of global event selection). -2. If no per-link URL is set, and a **Global Webhook URL** is configured, and the event type is in the selected **Monitored Events** list → use the global URL. +2. If no per-link URL is set, **global webhook is enabled**, a **Global Webhook URL** is configured, and the event type is in the selected **Monitored Events** list → use the global URL. 3. Otherwise no webhook is fired. --- @@ -1228,7 +1580,7 @@ You can also pre-configure all parameters via your `.env` file: ### User Integration Configuration -The `user` configuration block (new in v3.5.0) connects the package to your application's `User` model so that creator avatars and details are displayed in the admin table: +The `user` configuration block connects the package to your application's `User` model so that creator avatars and details are displayed in the admin table: ```php // config/filament-short-url.php @@ -1260,11 +1612,20 @@ The package automatically attaches the currently authenticated user's ID to ever | `SHORT_URL_STATS_CACHE_TTL` | `geo_ip.stats_cache_ttl` | `300` | Caching TTL in seconds for dashboard charts. | | `SHORT_URL_QUEUE` | `queue_connection` | `'sync'` | Queue connection for recording visits. | | `SHORT_URL_QUEUE_NAME` | `queue_name` | `'default'` | Queue name to which visit tracking jobs are dispatched. | +| `REDIS_HOST` | `redis.host` | `'127.0.0.1'` | Default Redis host (overridden by Settings when queue = `redis`). | +| `REDIS_PORT` | `redis.port` | `6379` | Default Redis port. | +| `REDIS_PASSWORD` | `redis.password` | `null` | Default Redis password. | +| `REDIS_DB` | `redis.database` | `0` | Default Redis database index. | +| `REDIS_PREFIX` | `redis.prefix` | `''` | Optional Redis key prefix for plugin keys. | | `SHORT_URL_CACHE_TTL` | `cache_ttl` | `3600` | Redirection model caching TTL (set to `0` to disable). | | `GA4_API_SECRET` | `ga4.api_secret` | `null` | Google Analytics 4 Measurement Protocol API Secret. | | `FIREBASE_APP_ID` | `ga4.firebase_app_id` | `null` | Google Analytics 4 Firebase App ID (or uses Measurement ID). | | `SHORT_URL_COUNTER_BUFFERING` | `counter_buffering.enabled` | `false` | Buffer click counts in cache (flushed via console command). | -| `SHORT_URL_TRUST_CDN_HEADERS` | `trust_cdn_headers` | `false` | Trust proxy/CDN headers to extract real client IP and country. | +| `SHORT_URL_LIVE_FEED_SSE_INTERVAL` | `live_feed.sse_interval_seconds` | `3` | Live feed SSE heartbeat / poll interval (seconds). | +| `SHORT_URL_LIVE_FEED_SSE_MAX_DURATION` | `live_feed.sse_max_duration_seconds` | `120` | Max SSE stream duration before client reconnects. | +| `SHORT_URL_LIVE_FEED_REDIS_PUSH` | `live_feed.use_redis_push` | `true` | Use Redis pub/sub push when cache is Redis + PhpRedis; `false` forces SSE poll. | +| `SHORT_URL_TRUST_CDN_HEADERS` | `trust_cdn_headers` | `false`¹ | Trust proxy/CDN headers to extract real client IP and country. | +| `SHORT_URL_CUSTOM_DOMAIN_ENFORCE_DNS` | `custom_domains.enforce_dns_on_activate` | `true` | Require passing DNS verification before a custom domain can stay active. | | `SHORT_URL_PRUNING_ENABLED` | `pruning.enabled` | `true` | Enable daily aggregation and log pruning. | | `SHORT_URL_PRUNING_DAYS` | `pruning.retention_days` | `90` | Number of days to retain raw visit logs. | | `SHORT_URL_RATE_LIMITING` | `rate_limiting.enabled` | `false` | Enable per-IP redirect rate limiting. | @@ -1272,6 +1633,19 @@ The package automatically attaches the currently authenticated user's ID to ever | `SHORT_URL_RATE_LIMIT_DECAY` | `rate_limiting.decay_seconds` | `60` | Rate limiter rolling window in seconds. | | `SHORT_URL_DEEP_LINKING_ENABLED` | `deep_linking.enabled` | `false` | Enable serving domain association files for deep linking. | | `SHORT_URL_ENABLE_FALLBACK` | `enable_fallback_route` | `true` | Toggle registration of the global fallback redirection route. | +| `SHORT_URL_API_ENABLED` | `api_enabled` | `false` | Enable the Developer REST API (`/api/short-url/*`). | +| `SHORT_URL_VPN_DETECTION` | `vpn_detection.enabled` | `false` | Enable VPN/proxy detection on incoming visits. | +| `SHORT_URL_VPN_DRIVER` | `vpn_detection.driver` | `'ip-api'` | VPN detection driver (`ip-api` or `vpnapi`). | +| `SHORT_URL_VPNAPI_KEY` | `vpn_detection.vpnapi_key` | `null` | VPNAPI.io API key (when driver is `vpnapi`). | +| `SHORT_URL_VPN_BLOCK_ACTION` | `vpn_detection.block_action` | `'flag_only'` | Action on VPN/proxy detection (`flag_only` or `block_with_403`). | +| `SHORT_URL_SAFE_BROWSING` | `safe_browsing.enabled` | `false` | Enable Google Safe Browsing URL checks. | +| `SHORT_URL_SAFE_BROWSING_KEY` | `safe_browsing.api_key` | `null` | Google Safe Browsing API key. | +| `SHORT_URL_CLICK_DEDUP` | `click_deduplication.enabled` | `false` | Ignore repeat clicks from the same IP within the dedup window. | +| `SHORT_URL_CLICK_DEDUP_HOURS` | `click_deduplication.hours` | `1` | Deduplication window in hours. | +| `SHORT_URL_VERIFY_GOOGLEBOT_IP` | `bot_detection.verify_google_bot_ip` | `false` | Verify Googlebot user agents via reverse DNS + forward IP check. | +| `SHORT_URL_BOT_DEBUG_SECRET` | `bot_detection.debug_secret` | `null` | Secret value for `?bot=` debug param outside local/testing environments. | + +> ¹ When `geo_ip.driver` is `headers`, **Trust CDN & Proxy Headers** is automatically enabled on settings save and at runtime. The effective default for CDN deployments is therefore `true`. > [!TIP] > **Database Configuration Preferred**: Avoid configuring large, multi-line JSON blocks (such as `apple-app-site-association` and `assetlinks.json`) via `.env` file environment variables as it is error-prone and can cause parsing issues. The recommended approach is to configure them dynamically via the **Filament Settings Panel**, which stores them securely in the database with real-time JSON validation. @@ -1284,13 +1658,15 @@ The package automatically attaches the currently authenticated user's ID to ever |---------|-------------| | `short-url:sync-counters` | Flushes buffered visit counts from cache to the database. Schedule every minute when counter buffering is enabled. | | `short-url:aggregate-and-prune` | Aggregates previous days' raw visits into `short_url_daily_stats` and prunes raw records older than the configured retention period. Schedule daily (e.g. at `02:00`). | +| `short-url:verify-custom-domains` | Re-verifies DNS for all active custom domains. Schedule daily in production. | -### Automatic Scheduler Registration (v1.3.0) +### Automatic Scheduler Registration As of version `1.3.0`, **you no longer need to manually copy scheduled commands into your host application code!** The plugin automatically registers the required tasks inside its ServiceProvider booted phase, dynamically respecting your Settings GUI toggles: - **`short-url:aggregate-and-prune`** is scheduled **daily at 02:00** (runs automatically only if **Enable Daily Aggregation** is ON). - **`short-url:sync-counters`** is scheduled **every minute** (runs automatically only if **Buffer Visit Counts in Cache** is ON). +- **`short-url:verify-custom-domains`** is scheduled **daily** (always registered; re-checks DNS for active custom domains). > [!IMPORTANT] > **Cron Setup Required**: @@ -1364,6 +1740,8 @@ echo $shortUrl->getShortUrl(); // https://yourdomain.com/s/promo2026 ## Model Helpers & Service ### ShortUrl Model Methods +* `hasPassword(): bool` — Whether the link requires a password. +* `verifyPassword(string $plain): bool` — Verify a plain-text password against the stored hash (supports legacy plain-text values). * `isActive(): bool` — Checks if the short URL is enabled and within its activation/expiration timestamps. * `isExpired(): bool` — Checks if the URL has passed its expiration date. * `getShortUrl(): string` — Resolves the complete URL string. @@ -1403,7 +1781,174 @@ Event::listen(ShortUrlVisited::class, function (ShortUrlVisited $event) { --- ## Visitor Filtering (Bot Detection) -Visits from scrapers, search bots, and web crawlers are automatically ignored to keep stats clean. The system matches user agents against a custom list (including Googlebot, Bingbot, Applebot, Facebook, Twitter, and generic curl/http request clients). + +Visits from scrapers, search bots, and web crawlers are **not recorded** in the visit log at all — they never increment counters or appear in analytics. The redirect engine still serves appropriate responses (OG preview HTML for bots when custom meta tags are configured, or a standard redirect otherwise). + +Bot detection matches user agents and referers against a configurable list (Googlebot, Bingbot, Applebot, Facebook, Twitter, Slack, WhatsApp, and generic curl/http clients). Optional Googlebot reverse-DNS IP verification is available via `SHORT_URL_VERIFY_GOOGLEBOT_IP`. + +The `?bot=1` query parameter (for testing link previews) is restricted to `local`/`testing` environments or requires a matching `SHORT_URL_BOT_DEBUG_SECRET` (configurable in **Settings → Advanced**). + +--- + +## Live Activity Feed (SSE) + +The **Live Feed** tab (`/{record}/stats/live`) streams visit updates to the Filament panel over **Server-Sent Events (SSE)**. The browser opens an authenticated `EventSource` to `GET /short-url/live-feed/{id}/stream` and calls Livewire `onStreamUpdate()` only when a new visit id arrives — no full-page or `wire:poll` refresh. + +### How the cursor works (all environments) + +On every recorded visit, `TrackShortUrlVisitJob` calls `LiveFeedBroadcaster::publish()` which stores the latest visit id (TTL 24 h) and, when Redis is available, **`PUBLISH`**es it on a per-link channel. + +**Redis source priority** (first match wins — Settings override `.env` cache): + +1. **Short URL Settings → General → Queue Connection = `redis`** — uses Laravel's `queue.connections.redis` Redis connection (same infra as async visit jobs). +2. **`CACHE_STORE=redis`** — uses the default Laravel cache Redis store. +3. **Otherwise** — cursor lives in the active cache driver (`database`, `file`, …) with SSE poll + optional DB fallback. + +The SSE stream tracks a **`cursor`** (last seen visit id). The widget badge shows which transport is active: + +| Badge | Meaning | +|---|---| +| **Live · Redis push** | Redis (from Settings queue **or** cache) + PhpRedis — instant updates via `SUBSCRIBE` | +| **Live · SSE poll** | All other setups — interval check of the cursor | + +### Auto-adaptive SSE transport + +The plugin resolves Redis at runtime (`LiveFeedBroadcaster::resolveRedisSource()`): + +| Redis source | Redis client | SSE transport | DB `MAX(id)` in loop? | +|---|:---:|:---|:---:| +| Settings **Queue = redis** | **PhpRedis** | **Redis pub/sub push** | ❌ | +| Settings **Queue = redis** | Predis | **SSE poll** on Redis cursor | ❌ | +| `CACHE_STORE=redis` (queue ≠ redis) | **PhpRedis** | **Redis pub/sub push** | ❌ | +| `CACHE_STORE=redis` | Predis | **SSE poll** on Redis cursor | ❌ | +| No Redis (sync/database queue + database cache) | — | **SSE poll** on cache; DB fallback when cursor cold | Only on cold cursor | + +**Typical production setup:** set **Queue Connection = `redis`** in **Settings → General** (no need to change `CACHE_STORE` if it stays `database`). Ensure `REDIS_CLIENT=phpredis` and a running `queue:work` for async visit jobs. + +**Predis note:** cursor + `PUBLISH` still work, but SSE uses polling because Predis cannot reliably time out `SUBSCRIBE` for heartbeats. + +**Queue timing:** with **`sync`** queue, the cursor updates on the redirect thread. With **`redis`** queue, it updates when the worker runs `TrackShortUrlVisitJob` (typically sub-second). + +### Configuration + +| Setting / env | Default | Purpose | +|---|---|---| +| **Settings → Queue Connection** | `sync` | **`redis` enables live-feed Redis** (wins over `CACHE_STORE`) | +| `CACHE_STORE` | `database` | Fallback Redis source when queue ≠ redis | +| `REDIS_CLIENT` | `phpredis` | Required for pub/sub push; Predis → SSE poll | +| `SHORT_URL_LIVE_FEED_SSE_INTERVAL` | `3` | Heartbeat / poll interval (seconds) | +| `SHORT_URL_LIVE_FEED_SSE_MAX_DURATION` | `120` | Max SSE connection length before client auto-reconnects | +| `SHORT_URL_LIVE_FEED_REDIS_PUSH` | `true` | Set `false` to force SSE poll even with PhpRedis + Redis | + +Filament badge and Alpine client **reconnect automatically** after the stream closes (every ~120 s), passing the updated `cursor` so no visits are skipped. + +--- + +## Public Stats (Shareable Analytics) + +Each link can expose a **read-only public stats page** and matching **JSON API** without API key authentication — useful for sharing campaign dashboards or embedding click counts on landing pages. + +> **Upgrade note:** requires migration `2026_06_08_000001` (`public_stats_enabled`, `public_stats_password`). Run `php artisan migrate` after updating the package. + +### Enable in Filament + +Open the link row **⋮ menu → Public stats** (`P`): + +| State | What you see | +|---|---| +| **Off** | Toggle + hint; save to generate the shareable URL | +| **On** | Status badge, copyable link, **Open** button, optional password field | +| **Password** | Leave blank to keep the current hash; disable public stats to clear it | + +The public URL is built from the link’s `url_key` (and custom domain when configured), e.g. `https://yourdomain.com/s/public-stats/promo26`. + +### Public HTML page (browser) + +A normal `GET` in the browser renders a branded stats dashboard: + +- Summary cards: total / unique visits, today, this week, this month, QR scans +- Visits-by-day table with optional **date_from** / **date_to** filters +- **Site name** from **Settings → General → Site Name Override** (same as password/expiry pages); logo from host `setting('logo_path')` when available +- Optional password form (session unlock, same pattern as `/s-auth/{key}`) + +Legacy alias: `GET /short-url/public-stats/{url_key}` behaves the same. + +### JSON API (embeds & curl) + +Request JSON explicitly when integrating programmatically: + +```bash +# Accept header +curl -H "Accept: application/json" "https://yourdomain.com/s/public-stats/promo26" + +# or query flag +curl "https://yourdomain.com/s/public-stats/promo26?format=json&date_from=2026-06-01&date_to=2026-06-30" +``` + +If a password is set, send it in the **POST body** or **`Authorization: Bearer …`** header (not in the query string): + +```bash +curl -X POST -H "Content-Type: application/json" \ + -d '{"password":"secret"}' \ + "https://yourdomain.com/s/public-stats/promo26" + +curl -H "Authorization: Bearer secret" \ + -H "Accept: application/json" \ + "https://yourdomain.com/s/public-stats/promo26" +``` + +You can also enable or configure public stats via the REST API (`public_stats_enabled`, `public_stats_password` on create/update). + +**Response:** `200 OK` with a **public-safe stats subset** (`totalVisits`, `uniqueVisits`, `visitsToday`, `visitsThisWeek`, `visitsThisMonth`, `qrScans`, `visitsByDay` — no raw visit rows or sensitive metadata). Returns **`404`** for unknown keys **and** disabled public stats (prevents slug enumeration). Returns **`403`** when password is missing, wrong, or supplied in the query string. Rate limited to **10 requests/minute per IP per link**. + +--- + +## SEO, Open Graph & Link Cloaking + +Control how each short link appears on social networks, in search engines, and in the browser address bar — all from the **SEO & Social** tab: + +| Toggle / field | Config key | What it does | +|---|---|---| +| **Search Engine Indexing** | `do_index` | When **off** (default), every redirect and interstitial sends `X-Robots-Tag: noindex, nofollow` and ``. When **on**, a canonical URL is emitted and bots may index the short link. | +| **Link Cloaking** | `is_cloaked` | When **on**, human visitors see the destination embedded in an iframe on your short-link domain — the address bar keeps your branded URL. Social crawlers receive a standalone OG HTML page instead of the iframe. | +| **OG Title** | `og_title` | Custom Open Graph / Twitter Card title (falls back to link title or URL key). | +| **OG Description** | `og_description` | Custom social preview description. | +| **OG Image** | `og_image` | Upload or auto-import a preview image (WebP, stored on disk). Rendered with `og:image:width` / `og:image:height` for large-card previews. | + +### How it works on redirect + +1. **Social bots & crawlers** (Facebook, LinkedIn, X, Slack, WhatsApp, Googlebot, …) hit your short URL and receive a dedicated HTML page with full OG/Twitter meta tags — **without** `meta refresh` or JavaScript redirects, so preview scrapers can read the tags reliably. +2. **Human visitors** on a cloaked link see the destination inside an iframe; on a normal link they are redirected instantly. +3. **Search indexing off** applies `noindex` headers on every response type: direct redirects, password prompts, warning pages, expiry pages, pixel loaders, and OG preview pages. + +### Auto-scrape & live preview + +- Click **Scrape from destination** in the Filament form to pull `og:title`, `og:description`, and `og:image` from the target URL (SSRF-safe, streaming fetch). +- Imported OG images are processed to WebP and promoted to permanent storage on save. +- A live **Social Preview** sidebar shows exactly how the link card will look before you publish. + +### Iframeable pre-check (cloaking) + +Before enabling **Link Cloaking**, verify the destination allows iframe embedding: + +```bash +curl -X POST https://yourdomain.com/short-url/check-iframeable \ + -H "Cookie: ..." \ + -H "Content-Type: application/json" \ + -d '{"url": "https://destination.example.com/page"}' +``` + +**Response:** +```json +{ + "url": "https://destination.example.com/page", + "iframeable": true +} +``` + +Sites that send `X-Frame-Options: DENY/SAMEORIGIN` or restrictive `Content-Security-Policy: frame-ancestors` headers will return `"iframeable": false`. + +OG metadata can also be fetched manually via the authenticated scrape endpoint: `GET /short-url/scrape-meta?url=...` --- @@ -1414,15 +1959,195 @@ All migrations are compatible with **SQLite**, **MySQL**, and **PostgreSQL**: - No MySQL-specific `ENUM` types — `device_type` uses `VARCHAR(20)` validated at PHP level. - No `->after()` column ordering hints — fully cross-database. - JSON columns work natively on MySQL 5.7.8+ and are stored as TEXT on SQLite. +- **Upgrade-safe schema changes** — New columns are nullable or have safe defaults; indexes are additive. See [Upgrading](#upgrading) for the v5.2.0 migration details. --- ## Changelog +Recent releases are summarized below. For the full version history (v1.2.0–v4.0.0), see **[CHANGELOG.md](CHANGELOG.md)**. + +### v5.2.3 + +> **Production Redis mode, stats scaling, and Settings diagnostics.** + +#### Settings → Redis & queue + +- **Redis in Settings GUI** — Host, port, password, DB index, key prefix when Queue Connection = `redis`; overrides `database.redis` and `queue.connections.redis` at runtime. +- **Test Redis connection** — Health check with PING + INCR/SADD probe (preview unsaved form values). +- **Test queue worker** — Probe job + 12 s wait; reports exact `php artisan queue:work {connection} --queue={name}` if no worker. +- **Unified queue callout** — One box per async driver with dynamic worker command; hidden for `sync`. + +#### Stats scaling (high traffic) + +- **`StatsScalingProfile`**, **`PluginRedisConnection`**, **`VisitCounterBuffer`**, **`TodayStatsBuffer`**, **`StatsVisitRecorder`** — Dedicated Redis counters/stats when Settings queue is `redis`; historical stats cache no longer busted on every visit. +- **Auto counter buffering** — Forced on when queue = `redis`. +- **Live feed** — Shares queue Redis infra with counters/stats when configured. + +#### Public stats UI + +- **Filament row action** — **⋮ → Public stats** (`P`): toggle, optional password, copy/open shareable URL. +- **Public HTML dashboard** — Browser `GET /s/public-stats/{key}` with branded layout (Settings site name + optional host logo). +- **Dual format** — Same route serves HTML by default; JSON via `Accept: application/json`, `?format=json`, or authenticated POST. +- **Password flows** — HTML uses session unlock after form POST; JSON uses POST body or `Authorization: Bearer`. Query-string passwords rejected (`403`). + +#### Tests + +- `StatsScalingTest`, `RedisSettingsTest`, `PluginRedisConnectionTesterTest`, `PublicStatsUiTest`. + +### v5.2.2 + +> **Enterprise hardening, airtight counters, and maintainability.** + +#### Security (P0 / P1) + +- **Stored XSS fixes** — Pixel interstitial and Alpine stats widgets use `@json()` instead of `addslashes()` for JavaScript context output. +- **Atomic `max_visits`** — `VisitSlotReservation` reserves slots at redirect time with fast-path `UPDATE … WHERE total_visits < max_visits` and pessimistic locking near the cap; parallel bursts cannot exceed the limit. +- **Single-use + bots** — Social preview bots no longer consume single-use links. +- **Counter buffer integrity** — Cache increments are reverted before DB fallback so `SyncBufferedCountersCommand` cannot double-count. +- **API tenancy** — Keys without `owner_user_id` are rejected when `scope_links_to_user` is enabled; folder/tag/pixel ownership validated on API writes (IDOR fix). +- **Redirect order** — `single_use` and `max_visits` run before `auto_open_app_mobile` interstitial and visit tracking. +- **`max_visits` without tracking** — Visit caps enforced even when `track_visits=false` (counters still increment). + +#### Performance (P1) + +- **`max_visits_pessimistic_remaining`** — Configurable threshold (default 5) for when pessimistic locking kicks in. +- **Live feed adaptive SSE** — Redis cache + PhpRedis → pub/sub push (instant); Predis or non-Redis cache → SSE poll on cache cursor; auto-reconnect with cursor; see [Live Activity Feed](#live-activity-feed-sse). +- **Stats cache lock** — `Cache::lock` on cold misses prevents thundering herd across widgets. +- **List table batching** — `preloadBufferedCountersForIds()` loads buffered counters in one round-trip. + +#### Quality (P2) + +- **Public stats** — Uniform `404` for unknown/disabled keys; response limited to a public-safe subset. +- **Octane-safe A/B variant** — `resolved_ab_variant` stored on `request()->attributes`, not `app()->instance()`. +- **Filtered uniques** — Daily rollup `unique_visits_count` merged in `FilteredStatsCollector`. +- **`findByKey()`** — Queries by `domain_scope_id` for better index use. + +#### Code quality + +- **`HasStats` split** — Facade trait composing `HasVisitCounters`, `HasStatsCache`, `HasStatsQueries`, and `HasSecurityStats`; atomic reservation centralized in `VisitSlotReservation`. +- **i18n audit** — Filament panel, visitor interstitials, and API/redirect error messages use `__('filament-short-url::default.*')` translation keys (EN + PL). + +### v5.2.1 + +> **Policy, API stats, SSE live feed, and load baselines.** + +#### Authorization & API + +- **`ShortUrlPolicy`** — Per-link authorization for view, update, delete, and settings access. Aligns with `scope_links_to_user` and `user_id`. Override in your app by registering your own policy. +- **API stats filters** — `GET /api/short-url/links/{idOrKey}/stats` supports the same cross-filters as the Filament dashboard (country, device, date range, UTM, and more). Query aliases: `country`, `device`. Response includes `meta.filters`. + +#### Live feed + +- **SSE stream** — Authenticated endpoint pushes visit updates to the admin panel without Livewire polling. +- **Configurable timing** — `live_feed.sse_interval_seconds` and `live_feed.sse_max_duration_seconds`. +- **Adaptive transport (v5.2.2+)** — Auto-detects Redis cache + PhpRedis for pub/sub push; falls back to cache-cursor polling (Predis, file, database drivers). See [Live Activity Feed](#live-activity-feed-sse). + +#### Load testing + +- **`php artisan short-url:stress-redirect {key}`** — Quick in-process redirect timing (avg / min / p95 / max). +- **`scripts/k6/redirect-baseline.js`** — Concurrent HTTP load test for staging or production-like environments (requires [k6](https://grafana.com/docs/k6/latest/set-up/install-k6/)). + +### v5.2.0 + +> **Main release theme: SEO & Social** — First-class per-link Open Graph metadata, Search Engine Indexing control, and Link Cloaking. None of these existed in v5.1.x or earlier. + +#### SEO, Open Graph & Link Cloaking *(headline)* + +- **New SEO & Social tab** — Dedicated Filament form tab for `og_title`, `og_description`, `og_image`, **Search Engine Indexing** (`do_index`), and **Link Cloaking** (`is_cloaked`). Live social preview sidebar in the admin panel. +- **Custom Open Graph meta** — Per-link OG/Twitter tags (`og:site_name`, image dimensions, canonical URL, HTTPS-normalized images) served to Facebook, LinkedIn, X, Slack, WhatsApp, and other preview bots. +- **Search Engine Indexing (`do_index`)** — Per-link toggle (default: off). When disabled, all response types emit `X-Robots-Tag: noindex, nofollow` and matching `` tags — redirects, password prompts, warning pages, expiry pages, pixel loaders, and OG HTML. +- **Link Cloaking (`is_cloaked`)** — Embeds the destination in an iframe on your short-link domain so the browser address bar shows your branded URL. Human visitors see the iframe; crawlers receive a standalone OG page without iframe/JS redirect. +- **Bot-safe OG pages** — Social crawlers get full meta tags without `meta refresh` or JavaScript redirects, so link previews scrape reliably. +- **OG meta scraper** — SSRF-safe streaming fetch from the destination URL; auto-populates title, description, and image in the Filament form (`GET /short-url/scrape-meta`). +- **OG image pipeline** — Download, WebP conversion (Imagick → GD → original fallback), temp-bucket storage with automatic promotion to `short-urls/og/` on save. +- **Iframeable pre-check** — Authenticated `POST /short-url/check-iframeable` endpoint validates `X-Frame-Options` / CSP `frame-ancestors` before enabling cloaking. +- **`OgMetaPresenter` & `redirect-html` view** — Centralized OG rendering for cloaked links and bot previews. + +#### Security +- **Password hashing** — Link passwords are hashed at rest (bcrypt/argon). Legacy plain-text passwords remain verifiable and are re-hashed automatically on save. New model helpers: `hasPassword()` and `verifyPassword()`. +- **API password privacy** — REST responses expose `password_protected: bool` instead of the raw password/hash. +- **Webhook SSRF guard** — Outbound webhook URLs are validated against private IP, localhost, and cloud metadata blocklists before queueing and execution. +- **Bot query hardening** — The `?bot=1` debug parameter is limited to `local`/`testing` environments or a configured `SHORT_URL_BOT_DEBUG_SECRET`. +- **Optional Googlebot IP verification** — Reverse-DNS + forward IP check for Googlebot user agents (`SHORT_URL_VERIFY_GOOGLEBOT_IP`). + +#### Analytics & Bot Detection +- **Bot visit exclusion** — Crawlers and preview bots no longer create visit records or increment counters. +- **Click deduplication (opt-in)** — Configurable per-IP dedup window (`SHORT_URL_CLICK_DEDUP`, default off) to suppress repeat-click inflation. +- **`StatsSqlHelper`** — Cross-database date/month SQL expressions; stats logic split into focused traits (`HasVisitCounters`, `HasStatsCache`, `HasStatsQueries`, `HasSecurityStats`) with `VisitSlotReservation` for atomic caps. + +#### REST API +- **Expanded serializer** — Responses now include `password_protected`, `is_cloaked`, `do_index`, `og_*`, `qr_scans`, `single_use`, `forward_query_params`, `external_id`, UTM fields, `folder_id`, `tags`, and `public_stats_enabled`. +- **`GET /links/{idOrKey}/visits`** — Paginated raw visit log export. +- **`GET /links/{idOrKey}/visits/export`** — CSV export of visit logs. +- **`POST /links/bulk-delete`** — Bulk delete by database IDs or URL keys (max 100). +- **`PATCH /links/bulk-update`** — Bulk update `is_enabled`, `notes`, `expires_at`, `max_visits`. +- **`POST /links/bulk`** — Bulk create up to 100 links. +- **`PUT /links/upsert`** — Create or update by `external_id` (or `url_key` + `destination_url` match). +- **`GET /links/exists`**, **`GET /links/random`**, **`GET /links/info`** — Slug availability, random link, and lightweight lookup helpers. +- **Tags & Folders API** — Full CRUD at `/api/short-url/tags` and `/api/short-url/folders`. +- **Per-key owner scoping** — `owner_user_id` on API keys limits access to links created by that user (required when `scope_links_to_user` is enabled — see [v5.2.2](#v522)). +- **Link-level UTM params** — `utm_*` and `ref` stored on the link and merged into the destination on redirect. + +#### Public Stats +- **Shareable stats endpoint** — `GET` or `POST /short-url/public-stats/{url_key}` (and prefixed `/s/public-stats/{url_key}`) returns aggregated analytics when `public_stats_enabled` is on. **v5.2.3+** adds a public HTML dashboard and Filament **⋮ → Public stats** modal. +- **Password auth** — If `public_stats_password` is set, send the password in the **POST body** or **`Authorization: Bearer …`** header for JSON; HTML uses a password form with session unlock. Passwords in the query string are **rejected** (403). +- **Host scope** — Stats are scoped to the request host (default app domain vs verified custom domain). + +#### Security & Reliability Hardening +- **DNS-aware SSRF protection** — Outbound URLs (webhooks, OG scraper, iframe checker redirects) resolve hostnames and block targets that resolve to private/metadata IPs. +- **`OutboundUrl` validation rule** — Reusable SSRF guard for form requests and services. +- **Iframeable redirect re-validation** — Redirect chains during cloaking pre-check are followed manually without `allow_redirects`, re-validating each hop. +- **Safe Browsing fail-closed** — When Safe Browsing is enabled but the API is unreachable, URLs are rejected instead of silently allowed. +- **VPN detection fail-closed** — When `block_with_403` is enabled, API timeout/error treats the client as proxy (403). +- **Custom domain legacy URLs** — `/s/{key}` on a verified custom domain returns **301** to `/{key}`. +- **Global webhook toggle respected** — `global_webhook_enabled` in Settings/config must be on before the global webhook URL fires. +- **`log-error` endpoint hardened** — Authenticated, throttled, and validated; no longer accepts anonymous error dumps. +- **Single-use link fix** — Expired single-use links return `410` without recording a visit or incrementing counters. +- **Redis counter fix** — Buffered counter sync no longer fails when Redis is the cache driver. + +#### Settings GUI +- **Analytics & Bot Detection section** — Click deduplication, Googlebot IP verification, and bot debug secret are editable in **Settings → Advanced** (previously `.env`-only). + +#### Database +- **Additive migrations** — `2026_06_08_000001`, `2026_06_09_000001`, and `2026_06_10_000001` — safe upgrade from v5.1.x with no data loss. Cross-database: SQLite, MySQL, PostgreSQL. + +#### Performance & reliability +- **`domain_scope_id`** — Composite unique `(url_key, domain_scope_id)` so the same slug can exist on the default domain and on custom domains independently. +- **Custom domain URLs** — Links on verified custom domains resolve at `https://domain.com/{key}` (no `/s/` prefix); password auth at `/auth/{key}`; legacy `/s/{key}` → 301 → `/{key}`. +- **Real-time visit limits** — `getRealTimeTotalVisits()` merges DB totals with counter-buffer cache; `max_visits` enforced correctly even when redirect model is cached. +- **Counter buffering fixes** — Redis dirty-set prefix, scoped buffer loads, `SyncBufferedCountersCommand` batch flush, incremental aggregation with `last_aggregation_date`. +- **Stats accuracy & performance** — Unique visits via `COUNT(DISTINCT ip_hash)`; bot/proxy filtering in human aggregation; daily rollups for all chart dimensions; **`FilteredStatsCollector`** (single raw scan with filters); world map and security widget routed through cached stats layers. +- **API hardening** — DB transactions on bulk/upsert, per-link cache invalidation, scoped `exists`, hashed-only API keys, public stats rate limit + password not in query string. +- **Custom domain cron** — `short-url:verify-custom-domains` re-checks DNS for active domains. +- **Central cache invalidation** — `ShortUrlCacheInvalidator`, `HostNormalizer`, reserved path segments on custom domains. +- **Settings** — VPN timeout/TTL in GUI; settings cache TTL 3600s; route cache cleared on prefix change; `set()` surfaces errors to the admin UI. +- **Default queue: `sync`** — No background worker required by default; opt in to `database`/`redis` when you run a worker. + +#### Enterprise hardening + +- **`Ga4MeasurementProtocolService`** — Centralized GA4 MP with `page_view`, `click`, `short_url_visit`, `session_id`, `timestamp_micros`, `engagement_time_msec`; Measurement ID format validation; debug-collector credential test with real stream ID. +- **Geo-IP foolproofing** — Headers driver auto-enables CDN trust on save; offline fallback chain (MaxMind → ip-api); ip-api rate limit guard (40/min). +- **Custom domain DNS gate** — Multi A-record + CNAME verification; activation blocked until DNS passes (`enforce_dns_on_activate`); removed `SERVER_ADDR` fallback. +- **API upsert lock** — `lock_url_key` now blocks `url_key` and `custom_domain_id` changes via upsert (parity with panel/API update). +- **Stats reliability fixes** — Cross-filter aggregation, public stats rate limiting, webhook SSRF protection, and Octane-safe memory flushing. +- **Stateless redirect default** — `/s/{key}` without `web` middleware; password unlock on `/s-auth/{key}`. +- **Filament link scoping** — `LinkUserScope` + `scope_links_to_user`. +- **API domain scope** — `exists` respects custom domains; store/update validate domain ownership. +- **Locked URL keys** — Server-side enforcement when `lock_url_key` is enabled. +- **Safe Browsing on redirect** — Cached re-check when enabled. +- **Webhook signing** — Signing secret required for global webhooks by default. + +#### Refactoring & Validation +- **`ShortUrlRedirectHandler`** — Redirect logic extracted from the controller; `RobotsTagApplicator` applied consistently. +- **`RedirectUrlResolver`** — Shared redirect Location resolution for meta scraper and OG image importer. +- **`SafeUrl` rule** — Google Safe Browsing validation reused in Form Requests. +- **Config defaults** — Explicit `api_enabled`, `vpn_detection`, `safe_browsing`, and `click_deduplication` sections in published config. + ### v5.1.0 #### Request Lifecycle & Middleware Optimization -- **Bypassed `web` middleware group** — Standard redirect paths (`s/{key}` and fallback routes) bypass session/cookie instantiation entirely. Under active caching, redirects resolve statelessly in `< 15ms`. +- **Stateless redirect middleware** — Standard redirect paths (`/s/{key}`) use rate limiting only (no `web` session middleware by default). Password auth uses `/s-auth/{key}` with sessions. HTML interstitials and sync visit tracking add latency. - **Dynamic Stateful Route Transition** — Password-protected redirects are dynamically routed to a stateful `/s-auth/{key}` route wrapped under the `web` group. Handles session verification, password prompts, brute force rate-limiting, and warning interstitials. - **Robust Integration Testing** — Refactored the entire package test suite and main application feature tests to accommodate the dual stateful/stateless redirect routing architectures without coverage loss. @@ -1437,7 +2162,7 @@ All migrations are compatible with **SQLite**, **MySQL**, and **PostgreSQL**: - **Country flags via `flagcdn.com`** — Flag images are rendered as `` instead of emoji. The URL is precomputed once in PHP (`getViewData()`), not per-row in Blade. Alpine.js `x-on:error` handles broken images without CSP-unsafe inline `onerror` handlers. - **Blade performance** — `time_ago` is precomputed once in PHP using `$visit->visited_at->diffForHumans()` (no `Carbon::parse()` double-instantiation). All per-row presentation values are plain PHP arrays, not Eloquent model calls in Blade. - **Optimized DB query** — Selects only 12 needed columns (`id`, `visited_at`, `country`, `country_code`, `city`, `browser`, `operating_system`, `device_type`, `referer_host`, `referer_url`, `ip_address`, `is_qr_scan`, `selected_variant`) instead of `SELECT *`. Limit reduced to 25 rows. -- **Polling stops when hidden** — `wire:poll.5s.visible` pauses polling completely when the widget is scrolled out of viewport. +- **Live updates (v5.2.1+)** — SSE stream + `EventSource` replaced `wire:poll` for multi-admin live feed (see [v5.2.1](#v521)). #### Link Organization - **Folders** — Each short URL can be assigned to one folder. Clicking a folder in the sidebar navigates to a filtered link list showing only that folder's links. Link count displayed per folder. @@ -1448,106 +2173,14 @@ All migrations are compatible with **SQLite**, **MySQL**, and **PostgreSQL**: - **Per-key API scopes** — Each API key now supports either `links:read-only` (GET only) or `links:read-write` (full CRUD) scope. Read-only keys return `403 Forbidden` on any write attempt. - **Per-key rate limiting** — Each API key can have its own individual rate limit (requests per minute), independent of the global route throttle. Configure in **Settings → API & Webhooks → Developer API Keys**. -### v4.0.0 -- **Custom Domains Branding** — Let users connect branded custom domains with real-time CNAME/A record DNS verification and automatic prefix-free root routing. -- **Cache Leak Fix** — Solved a critical caching bug where single-use links could be visited multiple times during the cache TTL by passing the host-specific key suffix to cache invalidations. -- **Aggregator Performance Tuning** — Restructured daily aggregation SQL queries to filter only active URL IDs, leveraging composite indexes and running native DB aggregations. -- **Logo Upload Authorization** — Secured the logo upload API with resource-level permission and policy checks. -- **DB-Free Registration Phase** — Deferred settings overrides to the service provider boot phase to prevent database errors during offline configuration caching. -- **Conditional Redirection Fallback** — Added configurations to optionally disable global fallback route registration. - -### v3.5.0 -- **User Attribution** — Short URLs now record the creator. Their avatar and hover card (name + email) are displayed in the list table. -- **Relative Date Badges** — Creation dates show compact relative strings (`2h`, `5d`, `3mo`). Hover to see the precise date and timezone. -- **Keyboard Shortcuts** — Hover any table row and press `E` (edit), `Q` (QR code), `I` (share), `S` (statistics), or `X` (delete). -- **Unified Action Dropdown** — All per-row actions consolidated under a single 3-dot button with keyboard shortcut badges. -- **Row Click → Statistics** — Clicking a table row navigates directly to the link's Statistics page. -- **A/B Split Testing** — Weighted traffic rotation in root-level links and nested targeting rules, with drag-based sliders and a one-click "Balance weights" action. -- **Variant Analytics** — Tracks which A/B variant was served and shows a "Variant Clicks Distribution" chart in the analytics dashboard. -- **Query Optimization** — Composite DB index on the visits table; queries filter by indexed `country_code`; Eloquent hydration bypassed with `toBase()->get()` for large sets. -- **GDPR IP Anonymization** — Opt-in IP masking (IPv4/IPv6) with SHA-256 hashing for unique visitor identification, managed via Settings. -- **Google Safe Browsing in REST API** — Safety checks now apply to all incoming URLs in the API (destination, A/B variants, targeting rules). -- **Settings URL Cleanup** — Tab query parameters are now human-readable (e.g. `?tab=qr` instead of `?tab=qr-defaults::data::tab`). -- **Analytics Enhancements** — QR Scan Conversion Rate card with period-over-period delta, browser/OS version subtexts, A/B click-share vs. weight comparison. - -### v3.3.0 -- **Advanced Multi-Filter Targeting Engine** — Replaced the legacy single-strategy selection panel with a highly flexible rule engine supporting custom `AND` / `OR` logic matching. -- **Granular Filter Categories** — Added support for filtering by devices (Desktop, Mobile, Tablet), platform operating systems (Windows, macOS, Linux, iOS, Android, Fire OS), countries (multiselect with search), and browser languages (multiselect with search). -- **Client-Side Flag Icons** — Integrated high-quality country flag icons dynamically loaded from a trusted CDN (`flagcdn.com`) inside both the Filament form targeting dropdown and the analytics country statistics widget. -- **Redirection Performance Boost** — Bypassed full user agent parsing (which involves regular expression scanning for versions) during redirections by introducing specialized fast-path `getDeviceType` and `getOs` helper functions. -- **Dynamic Legacy Data Adapter** — Added automatic on-the-fly hydration and upgrade of legacy database records to the new rule format when loaded in the Filament form. - -### v3.2.0 -- **Expanded Developer REST API** — Added new endpoints to inspect single short URLs (`GET /api/short-url/links/{idOrKey}`), fetch real-time click metrics (`GET /api/short-url/links/{idOrKey}/stats`), and fully update links programmatically (`PUT/PATCH /api/short-url/links/{idOrKey}`). Enabled flexible lookup dynamically by ID or URL key. -- **REST API Throttling & Rate Limiting** — Configured built-in route middleware to rate limit the Developer REST API to 60 requests per minute (`throttle:60,1`) to protect from abuse. -- **Unified Validation System** — Cleaned up and unified API and admin panel form validation, supporting advanced fields like granular logging parameters (`track_visits`, `track_browser_language`, etc.), custom GA4 tracking IDs (`ga_tracking_id`), and auto-open deep linking options (`auto_open_app_mobile`). -- **Media Controller Separation** — Refactored internal logo uploads and serving routes out of the public REST API controller into a dedicated `ShortUrlLogoController` (Single Responsibility compliance). -- **Alpine.js Webhook Payload Preview** — Replaced the Filament package CodeEditor component with a custom, high-reliability dark-mode HTML/CSS component featuring live code highlighting and copy-to-clipboard functionality powered by Alpine.js. - -### v3.1.0 -- **Database-Backed & Cached Settings** — Relocated user configuration from local JSON files to the database (`short_url_settings` table) with automatic caching and zero-downtime migration of legacy settings. -- **High-Performance Aggregations** — Completely refactored the statistics aggregator command to run optimized GROUP BY queries directly in the database, reducing memory usage (OOM protection) to near zero. -- **Secure Hashed API Keys** — API keys are now stored securely as SHA-256 hashes, verified using constant-time comparisons (`hash_equals()`), and displayed only once upon generation. -- **HMAC Signed Webhooks** — Webhook payloads are now optionally signed with a configured secret key and verified via the `X-ShortUrl-Signature` header. -- **Privacy-Safe GA4 Client IDs** — Replaced random UUIDs with deterministic client IDs based on hashed visitor IP and User Agent, ensuring session integrity in Google Analytics without storing raw visitor data. -- **Browser Cache Prevention for Limited Links** — Force temporary `302` redirects automatically for single-use, max-visit, or expiring links to prevent browsers from caching redirects and bypassing tracking logic. -- **Proxy Detection Optimization** — Implemented an aggressive 800ms timeout for external proxy checkers and reduced cache time for transient rate-limit failures to 60 seconds. - -### v3.0.0 -- **Native App Linking (Mobile Auto-Open)** — Automatically match and redirect mobile visitors directly inside 24+ native mobile apps (such as WhatsApp, YouTube, TikTok, Instagram, Spotify, etc.) using custom schemes, complete with a glassmorphic redirect page and a live interactive matching preview widget. -- **Global Deep Linking (Universal Links & App Links)** — Easily serve iOS `apple-app-site-association` and Android `.well-known/assetlinks.json` configuration files directly from your root domain to support OS-level native integration (disabled by default, managed via Settings). -- **Central Retargeting Pixel Registry** — Introduced a premium Many-to-Many pixel management registry. Define pixels centrally (Meta Pixel, Google Tag, LinkedIn Insight, TikTok Pixel, Pinterest Tag) and easily associate them with short links via the Filament panel or the REST API. -- **Standalone Settings Page** — Relocated the Settings interface from a resource header sub-action to a standalone sidebar navigation page under the default plugin group. -- **Retargeting Pixel API** — The REST API now fully exposes the `pixels` relationship array parameter for registering and linking retargeting pixels programmatically. -- **Enhanced Browser Language Redirection** — Robust double-pass language targeting logic matching exact locales first (e.g. `en-US`, `zh-CN`) and falling back to base language codes (e.g. `en`, `zh`). -- **Custom Branded Expiry Pages** — Replaced raw 410 HTTP errors with a beautiful, fully localized, dark-mode compatible HTML expiry page displaying the Site Name, expired link details, and a homepage button. - -### v2.0.0 -- **Interactive QR Code Designer Branding Logo** — Upload custom brand logos inside the QR designer canvas in Filament. Configure logo sizing, margins, shapes (square/circle), and toggle dot backing removal to prevent dots overlapping with the logo. -- **Dedicated QR Code Scan Tracking** — Differentiates visitor clicks from physical QR code scans by dynamically appending source tags (`?source=qr`). Added a new database tracking column (`is_qr_scan` on visits, `qr_scans` on short URLs, and `qr_visits_count` on daily stats). Displays a dedicated scans counter badge in the Filament list table. -- **Browser Language Detection & Statistics** — Captures visitor browser preferred language headers (`browser_language` field) and aggregates them into the daily stats table. Displays a new "Top Languages" widget breakdown in the link statistics dashboard. -- **High-Traffic Performance Safeguards & Robust Rollbacks** — Atomic database transactions for buffered counter updates with fail-safe rollback that restores cache values in case of DB connection failures. Prevents N+1 queries by preloading request-wide counters in a single batch cache lookup. -- **Support for Empty Route Prefix (Root-Level URLs)** — Enhanced `getShortUrl()` to support empty route prefixes without generating double slashes (e.g. `domain.com/abc123` instead of `domain.com//abc123`). - -### v1.7.0 -- **Role-based Settings Access Control** — New `authorizeSettingsUsing(Closure)` method on the plugin to restrict who can access the Settings page. Supports any callable returning a `bool`. Also auto-detects a `manageSettings` method on a registered `ShortUrl` policy. The Settings button in the table header is hidden automatically when access is denied. - -### v1.6.0 -- **Google Safe Browsing Integration** — Automatic safety checks against Google's API during link creation or modification. Includes bypass settings, asynchronous checking option, and alert badges. -- **VPN / Proxy / Bot Filtering** — Detect and filter out VPN/proxy traffic and Tor nodes using external proxy detection APIs to keep traffic analytics clean. -- **Visitor World Map Widget** — Live interactive SVG world map showing clicks distribution per country, custom intensity highlighting, and hover details. - -### v1.5.1 -- **REST API On/Off Toggle** — Enable or disable the entire developer REST API from Settings → API & Webhooks without touching code. Returns `503 Service Unavailable` when disabled. - -### v1.5.0 -- **Social Retargeting Pixels** — Attach Meta Pixel, Google Tag (GA4/Ads), and LinkedIn Insight Tag to any short URL. A premium glassmorphic interstitial page executes pixel scripts in the visitor's browser before forwarding them to the destination. Enables building remarketing audiences even on external domains. -- **Developer REST API** — Full `GET /api/short-url/links`, `POST /api/short-url/links`, and `DELETE /api/short-url/links/{id}` endpoints with API Key authentication (managed via Settings UI). Supports creating links with all available attributes including pixels and webhooks. -- **Webhook System** — Real-time HTTP POST notifications on `visited`, `created`, `expired`, and `limit_reached` events. Configurable per-link or globally. Dispatched asynchronously via `SendWebhookJob` with 3-attempt retry policy and 10-second backoff. -- **Settings: API & Webhooks Tab** — New settings tab to manage global webhook URL, monitored event types, and developer API key management with name labels and per-key activation toggles. - -### v1.4.0 -- **Validity Date Ranges (From-To)** — Set activation dates (`activated_at` and `expires_at`) to control exactly when a short link is active. -- **Custom Visit Limit Counters** — Define a custom maximum visit limit (`max_visits`) after which a link automatically expires (e.g., active for 3 hits). -- **Custom Expiration Fallbacks** — Redirect expired/inactive visitors to a custom `expiration_redirect_url` rather than showing a static 410 Gone error page. -- **Fluent Builder APIs** — Fluent method additions (`activatedAt()`, `deactivatedAt()`, `maxVisits()`, `expirationRedirectUrl()`) in the developer query builder. - -### v1.3.0 -- **Automatic Scheduler Registration** — Zero-configuration task registration within the ServiceProvider booted phase (dynamically honors Settings toggles). -- **Interactive Settings Validators** — Adds real-time "Test connection" verify action for GA4 Measurement Protocol and "Verify file" action for MaxMind database paths. -- **Robust Table Row Copy Action** — High-reliability, conflict-free click-to-copy in table rows with built-in fallback helper for non-HTTPS (secure context) browser environments. - -### v1.2.0 -- **Password-protected links** — Session-based unlock flow with a styled prompt page. -- **Redirect warning pages** — Interstitial security screen before external redirects. -- **Smart targeting** — Device-based, Country/Geo-based, and A/B weighted rotation rules per link. -- **Rate limiting** — Configurable per-IP redirect throttling with 429 responses. -- **Daily stats aggregation** — Nightly `short-url:aggregate-and-prune` command for scalable log management. -- **Extended Settings GUI** — New "Performance & Security" tab for aggregation and rate limiting configuration. -- **Polish translations** — Full `pl` locale support for all new features. +Older releases (v1.2.0–v4.0.0) are documented in **[CHANGELOG.md](CHANGELOG.md)**. --- ## License -Custom Source-Available License. Please see the [LICENSE](LICENSE) file for the full text. +**Source-Available & Dual-Commercial License — version 1.3.** See the [LICENSE](LICENSE) file for the full text. + +Permitted free use covers internal/personal use and single-client freelance deployment within defined limits. Commercial distribution, bundling, high-volume use (>1M qualified events/month), software transfer to third parties, and competing products require a separate written Commercial License from the Copyright Holder. + +Section 9 of the license excludes liability of the Copyright Holder toward licensees (B2B) and does not limit enforcement against license violators. diff --git a/art/diagrams/01-system-overview.svg b/art/diagrams/01-system-overview.svg new file mode 100644 index 0000000..cd6a010 --- /dev/null +++ b/art/diagrams/01-system-overview.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + System overview + Filament panel, public routes, core services, persistence + + + + + + Filament admin + Panel layer + ShortUrlResource + Settings, domains, QR + Analytics and live feed + scope_links_to_user + + + + + + Public HTTP + Edge of Laravel app + GET /s/[key] + GET /s-auth/[key] + GET /api/short-url/* + /[key] on custom domain + STATELESS + + + + + + Package core + Runtime services + RedirectHandler + TrackShortUrlVisitJob + SendWebhookJob (HMAC) + HasStats and rollups + + + + + + Persistence layer + short_urls, visits, daily_stats, cache, optional Redis buffer + SQL DB + Redis + Safe Browsing + Link cache + + + + + Self-hosted Laravel plugin, not edge SaaS + + diff --git a/art/diagrams/02-redirect-lifecycle.svg b/art/diagrams/02-redirect-lifecycle.svg new file mode 100644 index 0000000..216dd43 --- /dev/null +++ b/art/diagrams/02-redirect-lifecycle.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Redirect lifecycle + GET /s/[key] from click to destination + + + + + + Visitor click + Start of request + + + + + + Throttle only + No web middleware, no session cookie + + + + + + findByKey(host) + Cache hit or single DB resolve + + + + + + Safe Browsing cache + isSafeCached(destination) when enabled + + + + + + max_visits lock + lockForUpdate plus isActive() + Response path + + + + + Password + /s-auth/[key] + web + + + + + + Interstitial + warning, pixels, cloak, OG + + + + + + Simple 302 + TrackJob then redirect + + + + + TrackShortUrlVisitJob: GeoIP, VPN, visit, webhook, GA4 (sync default or async queue) + + diff --git a/art/diagrams/03-stateless-vs-stateful.svg b/art/diagrams/03-stateless-vs-stateful.svg new file mode 100644 index 0000000..1e5a2e0 --- /dev/null +++ b/art/diagrams/03-stateless-vs-stateful.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stateless vs stateful routes + Lean clicks vs session-backed password unlock + + + + + + Every redirect click + STATELESS + GET /s/[key] + GET /[key] on custom domain + Middleware: throttle:120,1 + No cookies, no CSRF + Fixed in v5.2 + + + + + + Password unlock only + SESSION + GET /s-auth/[key] + GET /auth/[key] on custom domain + Middleware: web + throttle + Unlock remembered per session + By design + + + + + + Old audit: web on /s/[key] sent cookies on every click. Republish config if middleware still includes web. + + diff --git a/art/diagrams/04-custom-domain-routing.svg b/art/diagrams/04-custom-domain-routing.svg new file mode 100644 index 0000000..e4f2f64 --- /dev/null +++ b/art/diagrams/04-custom-domain-routing.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom domains and domain_scope_id + Same slug on different domains without collision + + + + + + Default app domain + app.test/s/promo + domain_scope_id = 0 + + + + + + Verified custom domain + links.brand.com/promo + scope = custom_domain_id + + + + + + Composite unique: (url_key, domain_scope_id) + GET /links/exists?url_key=promo&custom_domain_id=3 + + + + + + Ownership enforcement + Filament domains scoped by user_id + API: CustomDomainValidator blocks foreign domain IDs + Fixed: exists scope + ownership (v5.2) + + diff --git a/art/diagrams/05-targeting-and-ab.svg b/art/diagrams/05-targeting-and-ab.svg new file mode 100644 index 0000000..6778d15 --- /dev/null +++ b/art/diagrams/05-targeting-and-ab.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Smart targeting and A/B split + RedirectUrlResolver evaluates rules top to bottom + + + + + + GET /s/[key] + + + + + + RedirectUrlResolver + UA, Geo, language, rules + First matching rule? + + + + + Rule matched + Use rule URL + Nested A/B in rule + + + + + + Root A/B + Weighted 2-5 URLs + Variant on visit row + + + + + + No match + destination_url + UTM merge + query forward + + diff --git a/art/diagrams/06-webhooks-and-security.svg b/art/diagrams/06-webhooks-and-security.svg new file mode 100644 index 0000000..8e0e2a7 --- /dev/null +++ b/art/diagrams/06-webhooks-and-security.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Webhooks and HMAC signing + Global events, per-link URL override, SSRF-safe dispatch + + + + + + Global webhook + Settings: URL, enabled, events + visited | created | expired | limit + Signing secret required (v5.2) + Events are global, not per-link + + + + + + Per-link webhook URL + short_urls.webhook_url override + SSRF re-check in SendWebhookJob + allow_redirects=false + + + + + + SendWebhookJob + Header: X-Short-Url-Signature sha256=... (HMAC body) + + + + + + Audit fixes (v5.2) + Before: optional secret allowed unsigned webhooks + After: Settings rejects enable without secret + Safe Browsing on save + redirect | lock_url_key server-side + + diff --git a/art/diagrams/07-stats-and-queue.svg b/art/diagrams/07-stats-and-queue.svg new file mode 100644 index 0000000..37a9128 --- /dev/null +++ b/art/diagrams/07-stats-and-queue.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stats pipeline and queue modes + Visits, aggregation cron, panel vs API stats gap +Visit tracking + + + + + Redirect + + + + + + TrackJob + + + + + + visits table + + + + + + Buffer + + + + + + sync (default) + Job runs inside redirect + Works without queue worker + GeoIP, webhook, GA4 add latency + + + + + + redis / database + 302 sent first + Requires queue:work + Settings - General + Aggregation (schedule:run) + + + + + Raw visits 90d + + + + + + AggregateAndPrune + + + + + + daily_stats + + + + + + Filament: FilteredStatsCollector + cross-dimensional rollups + API stats: date_from / date_to only (cross-filters = open gap) + Long-range reports use rollups after raw prune + + diff --git a/art/diagrams/08-audit-trust-summary.svg b/art/diagrams/08-audit-trust-summary.svg new file mode 100644 index 0000000..c9bfb79 --- /dev/null +++ b/art/diagrams/08-audit-trust-summary.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + v5.2 audit trust summary + Promise vs old reality vs current status + + + + + + Audit promise + Old reality + v5.2 status + + + + + + Sub-15ms / stateless + web on /s/[key] + FIXED: throttle only + + + + + + Multi-tenant panel + All admins see all links + FIXED: LinkUserScope + + + + + + API exists + Ignored domain scope + FIXED: domain_scope_id + + + + + + Domain ownership + Foreign domain ID + FIXED: CustomDomainValidator + + + + + + Safe Browsing + Save only + FIXED: redirect cache + + + + + + Webhook HMAC + Optional secret + FIXED: required when on + + + + + + lock_url_key + UI disabled only + FIXED: LockedUrlKeyGuard + + + + + + Per-link webhook events + Documented per-link + OPEN: global list + + + + + + Default queue async + README vs sync + BY DESIGN: sync default + + + + + + Dub parity table + Overstated + FIXED: scoped compare + + + + + + Product boundary: Laravel Filament plugin, not Dub clone + Open: OpenAPI, API stats filters, workspaces, conversion, load tests + + diff --git a/art/diagrams/generate-glass-diagrams.py b/art/diagrams/generate-glass-diagrams.py new file mode 100644 index 0000000..9840261 --- /dev/null +++ b/art/diagrams/generate-glass-diagrams.py @@ -0,0 +1,353 @@ +#!/usr/bin/env python3 +"""Generate liquid-glass architecture SVG diagrams for README.""" + +from pathlib import Path + +OUT = Path(__file__).parent + +GLASS_HEAD = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {title} + {subtitle} +""" + +GLASS_CARD = """ + + + + {accent}{content} + """ + +ACCENT_TOP = '\n ' + +FOOT = """ + +""" + + +def card(x, y, w, h, content, rx=26, accent=None): + accent_html = "" + if accent: + accent_html = ACCENT_TOP.format(x=x, y=y, w=w, color=accent) + return GLASS_CARD.format(x=x, y=y, w=w, h=h, rx=rx, accent=accent_html, content=content) + + +def t(x, y, text, size=12, weight="400", fill="#e2e8f0", anchor="start", mono=False): + fam = "ui-monospace,Menlo,monospace" if mono else "system-ui,-apple-system,Segoe UI,sans-serif" + w = f' font-weight="{weight}"' if weight != "400" else "" + return f'{text}' + + +def line(x1, y1, x2, y2): + return f'' + + +def pill(x, y, w, h, text, stroke="#ffffff"): + return f'{text}' + + +def diagram_01(): + h, oy = 600, 520 + body = GLASS_HEAD.format(height=h, label="System overview", title="System overview", subtitle="Filament panel, public routes, core services, persistence", orb_y=oy) + body += card(48, 100, 272, 220, "\n ".join([ + t(72, 136, "Filament admin", 16, "700"), + t(72, 158, "Panel layer", 11, fill="#94a3b8"), + t(72, 188, "ShortUrlResource", 12), + t(72, 210, "Settings, domains, QR", 12), + t(72, 232, "Analytics and live feed", 12), + pill(72, 258, 170, 24, "scope_links_to_user"), + ]), accent="#c084fc") + body += card(344, 100, 272, 220, "\n ".join([ + t(368, 136, "Public HTTP", 16, "700"), + t(368, 158, "Edge of Laravel app", 11, fill="#94a3b8"), + t(368, 188, "GET /s/[key]", 11, mono=True, fill="#bae6fd"), + t(368, 210, "GET /s-auth/[key]", 11, mono=True, fill="#bae6fd"), + t(368, 232, "GET /api/short-url/*", 11, mono=True, fill="#bae6fd"), + t(368, 254, "/[key] on custom domain", 11, mono=True, fill="#bae6fd"), + pill(368, 278, 92, 22, "STATELESS", stroke="#38bdf8"), + ]), accent="#38bdf8") + body += card(640, 100, 272, 220, "\n ".join([ + t(664, 136, "Package core", 16, "700"), + t(664, 158, "Runtime services", 11, fill="#94a3b8"), + t(664, 188, "RedirectHandler", 12), + t(664, 210, "TrackShortUrlVisitJob", 12), + t(664, 232, "SendWebhookJob (HMAC)", 12), + t(664, 254, "HasStats and rollups", 12), + ]), accent="#2dd4bf") + body += line(184, 320, 184, 352) + line(480, 320, 480, 352) + line(776, 320, 776, 352) + body += card(120, 360, 720, 130, "\n ".join([ + t(480, 396, "Persistence layer", 17, "700", anchor="middle"), + t(480, 422, "short_urls, visits, daily_stats, cache, optional Redis buffer", 12, anchor="middle", fill="#94a3b8"), + pill(200, 448, 130, 24, "SQL DB"), + pill(350, 448, 110, 24, "Redis"), + pill(480, 448, 130, 24, "Safe Browsing"), + pill(630, 448, 110, 24, "Link cache"), + ]), accent="#fb923c", rx=28) + body += card(48, 512, 864, 56, t(480, 546, "Self-hosted Laravel plugin, not edge SaaS", 13, anchor="middle", fill="#e9d5ff"), rx=20) + return body + FOOT + + +def diagram_02(): + h, oy = 680, 600 + body = GLASS_HEAD.format(height=h, label="Redirect lifecycle", title="Redirect lifecycle", subtitle="GET /s/[key] from click to destination", orb_y=oy) + steps = [ + ("Visitor click", "Start of request", "#818cf8"), + ("Throttle only", "No web middleware, no session cookie", "#fbbf24"), + ("findByKey(host)", "Cache hit or single DB resolve", "#a78bfa"), + ("Safe Browsing cache", "isSafeCached(destination) when enabled", "#f87171"), + ("max_visits lock", "lockForUpdate plus isActive()", "#34d399"), + ] + y = 96 + for i, (title, sub, color) in enumerate(steps): + body += card(280, y, 400, 54, "\n ".join([ + t(480, y + 24, title, 13, "600", anchor="middle"), + t(480, y + 42, sub, 11, anchor="middle", fill="#94a3b8"), + ]), accent=color, rx=18) + if i < len(steps) - 1: + body += line(480, y + 54, 480, y + 72) + y += 72 + body += line(480, y, 480, y + 20) + body += ''.format(y + 20, y + 58) + body += t(480, y + 48, "Response path", 12, "600", anchor="middle") + y2 = y + 72 + branches = [ + (48, "Password", "/s-auth/[key] + web", "#fb923c"), + (344, "Interstitial", "warning, pixels, cloak, OG", "#facc15"), + (640, "Simple 302", "TrackJob then redirect", "#4ade80"), + ] + for x, title, sub, color in branches: + body += card(x, y2, 272, 88, "\n ".join([ + t(x + 136, y2 + 28, title, 13, "700", anchor="middle"), + t(x + 136, y2 + 48, sub, 10, anchor="middle", fill="#94a3b8"), + ]), accent=color, rx=20) + body += card(120, y2 + 108, 720, 48, t(480, y2 + 136, "TrackShortUrlVisitJob: GeoIP, VPN, visit, webhook, GA4 (sync default or async queue)", 11, anchor="middle", fill="#cbd5e1"), rx=16) + return body + FOOT + + +def diagram_03(): + h, oy = 460, 400 + body = GLASS_HEAD.format(height=h, label="Stateless vs stateful", title="Stateless vs stateful routes", subtitle="Lean clicks vs session-backed password unlock", orb_y=oy) + for x, title, badge, lines, accent in [ + (48, "Every redirect click", "STATELESS", ["GET /s/[key]", "GET /[key] on custom domain", "Middleware: throttle:120,1", "No cookies, no CSRF"], "#34d399"), + (496, "Password unlock only", "SESSION", ["GET /s-auth/[key]", "GET /auth/[key] on custom domain", "Middleware: web + throttle", "Unlock remembered per session"], "#60a5fa"), + ]: + content = [t(x + 28, 132, title, 17, "700"), pill(x + 28, 148, 88, 22, badge)] + cy = 188 + for ln in lines: + content.append(t(x + 28, cy, ln, 12, mono=("/" in ln))) + cy += 22 + content.append(pill(x + 80, cy + 8, 200, 24, "Fixed in v5.2" if x == 48 else "By design")) + body += card(x, 96, 416, 280, "\n ".join(content), accent=accent, rx=28) + body += card(48, 396, 864, 44, t(480, 424, "Old audit: web on /s/[key] sent cookies on every click. Republish config if middleware still includes web.", 11, anchor="middle", fill="#fecaca"), rx=16, accent="#f87171") + return body + FOOT + + +def diagram_04(): + h, oy = 540, 480 + body = GLASS_HEAD.format(height=h, label="Custom domain routing", title="Custom domains and domain_scope_id", subtitle="Same slug on different domains without collision", orb_y=oy) + body += card(64, 96, 380, 150, "\n ".join([ + t(254, 132, "Default app domain", 16, "700", anchor="middle"), + t(254, 160, "app.test/s/promo", 12, anchor="middle", mono=True, fill="#ddd6fe"), + pill(154, 178, 200, 26, "domain_scope_id = 0"), + ]), accent="#c084fc", rx=24) + body += card(516, 96, 380, 150, "\n ".join([ + t(706, 132, "Verified custom domain", 16, "700", anchor="middle"), + t(706, 160, "links.brand.com/promo", 12, anchor="middle", mono=True, fill="#bae6fd"), + pill(586, 178, 240, 26, "scope = custom_domain_id"), + ]), accent="#38bdf8", rx=24) + body += line(254, 246, 254, 276) + line(706, 246, 706, 276) + body += card(180, 276, 600, 62, "\n ".join([ + t(480, 304, "Composite unique: (url_key, domain_scope_id)", 13, "700", anchor="middle", fill="#a7f3d0"), + t(480, 324, "GET /links/exists?url_key=promo&custom_domain_id=3", 11, anchor="middle", mono=True, fill="#94a3b8"), + ]), accent="#34d399", rx=20) + body += card(80, 360, 800, 120, "\n ".join([ + t(480, 392, "Ownership enforcement", 16, "700", anchor="middle", fill="#fed7aa"), + t(480, 418, "Filament domains scoped by user_id", 12, anchor="middle"), + t(480, 442, "API: CustomDomainValidator blocks foreign domain IDs", 12, anchor="middle"), + pill(320, 458, 320, 24, "Fixed: exists scope + ownership (v5.2)"), + ]), accent="#fb923c", rx=24) + return body + FOOT + + +def diagram_05(): + h, oy = 460, 400 + body = GLASS_HEAD.format(height=h, label="Targeting and A/B", title="Smart targeting and A/B split", subtitle="RedirectUrlResolver evaluates rules top to bottom", orb_y=oy) + body += card(360, 92, 240, 46, t(480, 122, "GET /s/[key]", 13, "600", anchor="middle", mono=True), rx=23, accent="#a78bfa") + body += line(480, 138, 480, 158) + body += card(300, 158, 360, 56, "\n ".join([ + t(480, 184, "RedirectUrlResolver", 13, "600", anchor="middle"), + t(480, 204, "UA, Geo, language, rules", 11, anchor="middle", fill="#94a3b8"), + ]), rx=18, accent="#38bdf8") + body += line(480, 214, 480, 238) + body += '' + body += t(480, 262, "First matching rule?", 12, "600", anchor="middle") + body += line(400, 272, 160, 310) + line(560, 272, 800, 310) + for x, title, lines, color in [ + (48, "Rule matched", ["Use rule URL", "Nested A/B in rule"], "#4ade80"), + (344, "Root A/B", ["Weighted 2-5 URLs", "Variant on visit row"], "#facc15"), + (640, "No match", ["destination_url", "UTM merge + query forward"], "#f87171"), + ]: + body += card(x, 310, 272, 100, "\n ".join([t(x + 136, 338, title, 12, "700", anchor="middle")] + [t(x + 136, 358 + i * 18, ln, 10, anchor="middle", fill="#94a3b8") for i, ln in enumerate(lines)]), accent=color, rx=20) + return body + FOOT + + +def diagram_06(): + h, oy = 500, 440 + body = GLASS_HEAD.format(height=h, label="Webhooks and HMAC", title="Webhooks and HMAC signing", subtitle="Global events, per-link URL override, SSRF-safe dispatch", orb_y=oy) + body += card(60, 96, 360, 140, "\n ".join([ + t(240, 128, "Global webhook", 15, "700", anchor="middle"), + t(240, 152, "Settings: URL, enabled, events", 11, anchor="middle", fill="#94a3b8"), + t(240, 174, "visited | created | expired | limit", 10, anchor="middle", mono=True), + t(240, 196, "Signing secret required (v5.2)", 11, anchor="middle", fill="#ddd6fe"), + pill(120, 208, 240, 22, "Events are global, not per-link"), + ]), accent="#c084fc", rx=22) + body += card(540, 96, 360, 140, "\n ".join([ + t(720, 128, "Per-link webhook URL", 15, "700", anchor="middle"), + t(720, 152, "short_urls.webhook_url override", 11, anchor="middle", fill="#94a3b8"), + t(720, 174, "SSRF re-check in SendWebhookJob", 11, anchor="middle"), + t(720, 196, "allow_redirects=false", 10, anchor="middle", mono=True), + ]), accent="#38bdf8", rx=22) + body += line(480, 236, 480, 262) + body += card(200, 262, 560, 54, "\n ".join([ + t(480, 286, "SendWebhookJob", 14, "700", anchor="middle"), + t(480, 304, "Header: X-Short-Url-Signature sha256=... (HMAC body)", 10, anchor="middle", mono=True, fill="#94a3b8"), + ]), accent="#34d399", rx=18) + body += card(80, 336, 800, 120, "\n ".join([ + t(480, 368, "Audit fixes (v5.2)", 15, "700", anchor="middle", fill="#fed7aa"), + t(480, 394, "Before: optional secret allowed unsigned webhooks", 12, anchor="middle"), + t(480, 418, "After: Settings rejects enable without secret", 12, anchor="middle"), + t(480, 442, "Safe Browsing on save + redirect | lock_url_key server-side", 11, anchor="middle", fill="#94a3b8"), + ]), accent="#fb923c", rx=24) + return body + FOOT + + +def diagram_07(): + h, oy = 540, 480 + body = GLASS_HEAD.format(height=h, label="Stats and queue", title="Stats pipeline and queue modes", subtitle="Visits, aggregation cron, panel vs API stats gap", orb_y=oy) + body += t(480, 98, "Visit tracking", 15, "700", anchor="middle") + boxes = [(60, "Redirect"), (280, "TrackJob"), (540, "visits table"), (740, "Buffer")] + for i, (x, label) in enumerate(boxes): + body += card(x, 112, 160 if x < 740 else 120, 48, t(x + (80 if x < 740 else 60), 142, label, 11, "600", anchor="middle"), rx=16, accent="#818cf8" if i == 1 else "#38bdf8") + if i < len(boxes) - 1: + nx = boxes[i + 1][0] + body += line(x + (160 if x < 740 else 120), 136, nx, 136) + body += card(120, 180, 340, 110, "\n ".join([ + t(290, 210, "sync (default)", 15, "700", anchor="middle", fill="#6ee7b7"), + t(290, 234, "Job runs inside redirect", 11, anchor="middle", fill="#94a3b8"), + t(290, 256, "Works without queue worker", 11, anchor="middle", fill="#94a3b8"), + t(290, 278, "GeoIP, webhook, GA4 add latency", 10, anchor="middle", fill="#64748b"), + ]), accent="#34d399", rx=22) + body += card(500, 180, 340, 110, "\n ".join([ + t(670, 210, "redis / database", 15, "700", anchor="middle", fill="#93c5fd"), + t(670, 234, "302 sent first", 11, anchor="middle", fill="#94a3b8"), + t(670, 256, "Requires queue:work", 11, anchor="middle", fill="#94a3b8"), + t(670, 278, "Settings - General", 10, anchor="middle", fill="#64748b"), + ]), accent="#60a5fa", rx=22) + body += t(480, 318, "Aggregation (schedule:run)", 14, "700", anchor="middle") + body += card(140, 332, 200, 44, t(240, 360, "Raw visits 90d", 11, anchor="middle"), rx=14, accent="#f87171") + body += line(340, 354, 400, 354) + body += card(400, 332, 240, 44, t(520, 360, "AggregateAndPrune", 11, anchor="middle"), rx=14, accent="#fbbf24") + body += line(640, 354, 700, 354) + body += card(700, 332, 200, 44, t(800, 360, "daily_stats", 11, anchor="middle"), rx=14, accent="#4ade80") + body += card(80, 400, 800, 90, "\n ".join([ + t(480, 430, "Filament: FilteredStatsCollector + cross-dimensional rollups", 13, "600", anchor="middle"), + t(480, 454, "API stats: date_from / date_to only (cross-filters = open gap)", 11, anchor="middle", fill="#94a3b8"), + t(480, 476, "Long-range reports use rollups after raw prune", 10, anchor="middle", fill="#64748b"), + ]), accent="#818cf8", rx=24) + return body + FOOT + + +def diagram_08(): + h, oy = 560, 500 + body = GLASS_HEAD.format(height=h, label="Audit trust summary", title="v5.2 audit trust summary", subtitle="Promise vs old reality vs current status", orb_y=oy) + rows = [ + ("Sub-15ms / stateless", "web on /s/[key]", "FIXED: throttle only", "#34d399"), + ("Multi-tenant panel", "All admins see all links", "FIXED: LinkUserScope", "#34d399"), + ("API exists", "Ignored domain scope", "FIXED: domain_scope_id", "#34d399"), + ("Domain ownership", "Foreign domain ID", "FIXED: CustomDomainValidator", "#34d399"), + ("Safe Browsing", "Save only", "FIXED: redirect cache", "#34d399"), + ("Webhook HMAC", "Optional secret", "FIXED: required when on", "#34d399"), + ("lock_url_key", "UI disabled only", "FIXED: LockedUrlKeyGuard", "#34d399"), + ("Per-link webhook events", "Documented per-link", "OPEN: global list", "#fbbf24"), + ("Default queue async", "README vs sync", "BY DESIGN: sync default", "#fbbf24"), + ("Dub parity table", "Overstated", "FIXED: scoped compare", "#34d399"), + ] + y = 92 + body += card(48, y, 864, 36, "\n ".join([ + t(180, y + 24, "Audit promise", 12, "700", anchor="middle"), + t(440, y + 24, "Old reality", 12, "700", anchor="middle"), + t(730, y + 24, "v5.2 status", 12, "700", anchor="middle"), + ]), rx=14, accent="#ffffff") + y += 48 + for promise, old, status, color in rows: + body += card(48, y, 864, 34, "\n ".join([ + t(64, y + 22, promise, 11), + t(330, y + 22, old, 11, fill="#94a3b8"), + t(600, y + 22, status, 11, "600", fill=color), + ]), rx=10, accent=color if "FIXED" in status else "#fbbf24") + y += 40 + body += card(48, y + 8, 864, 72, "\n ".join([ + t(480, y + 36, "Product boundary: Laravel Filament plugin, not Dub clone", 13, "600", anchor="middle", fill="#e9d5ff"), + t(480, y + 58, "Open: OpenAPI, API stats filters, workspaces, conversion, load tests", 11, anchor="middle", fill="#94a3b8"), + ]), rx=20, accent="#818cf8") + return body + FOOT + + +DIAGRAMS = [ + ("01-system-overview.svg", diagram_01), + ("02-redirect-lifecycle.svg", diagram_02), + ("03-stateless-vs-stateful.svg", diagram_03), + ("04-custom-domain-routing.svg", diagram_04), + ("05-targeting-and-ab.svg", diagram_05), + ("06-webhooks-and-security.svg", diagram_06), + ("07-stats-and-queue.svg", diagram_07), + ("08-audit-trust-summary.svg", diagram_08), +] + +if __name__ == "__main__": + for name, fn in DIAGRAMS: + path = OUT / name + path.write_text(fn(), encoding="utf-8") + print(f"Wrote {name}") diff --git a/art/v3_1.png b/art/v3_1.png deleted file mode 100644 index 785a6b2..0000000 Binary files a/art/v3_1.png and /dev/null differ diff --git a/art/v3_2.png b/art/v3_2.png deleted file mode 100644 index 1e2c6a7..0000000 Binary files a/art/v3_2.png and /dev/null differ diff --git a/art/v3_3.png b/art/v3_3.png deleted file mode 100644 index 498d15a..0000000 Binary files a/art/v3_3.png and /dev/null differ diff --git a/art/v3_4.png b/art/v3_4.png deleted file mode 100644 index 329970b..0000000 Binary files a/art/v3_4.png and /dev/null differ diff --git a/art/v3_5.png b/art/v3_5.png deleted file mode 100644 index 8299bee..0000000 Binary files a/art/v3_5.png and /dev/null differ diff --git a/composer.lock b/composer.lock index 42575f1..463ac11 100644 --- a/composer.lock +++ b/composer.lock @@ -1676,16 +1676,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.11.0", + "version": "7.11.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "c987f8ce84b8434fa430795eca0f3430663da72b" + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b", - "reference": "c987f8ce84b8434fa430795eca0f3430663da72b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c", + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c", "shasum": "" }, "require": { @@ -1704,7 +1704,7 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", - "guzzlehttp/test-server": "^0.4", + "guzzlehttp/test-server": "^0.5", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" @@ -1784,7 +1784,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.11.0" + "source": "https://github.com/guzzle/guzzle/tree/7.11.1" }, "funding": [ { @@ -1800,7 +1800,7 @@ "type": "tidelift" } ], - "time": "2026-06-02T12:40:51+00:00" + "time": "2026-06-07T22:54:06+00:00" }, { "name": "guzzlehttp/promises", @@ -2156,16 +2156,16 @@ }, { "name": "laravel/framework", - "version": "v12.61.0", + "version": "v12.61.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "1124062a1ca92d290c8bcb9b7f649920fa6816bf" + "reference": "e8472ca9774452fe50841d9bdced060679f4d58d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/1124062a1ca92d290c8bcb9b7f649920fa6816bf", - "reference": "1124062a1ca92d290c8bcb9b7f649920fa6816bf", + "url": "https://api.github.com/repos/laravel/framework/zipball/e8472ca9774452fe50841d9bdced060679f4d58d", + "reference": "e8472ca9774452fe50841d9bdced060679f4d58d", "shasum": "" }, "require": { @@ -2374,7 +2374,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-05-26T23:41:33+00:00" + "time": "2026-06-04T14:22:52+00:00" }, { "name": "laravel/prompts", diff --git a/config/filament-short-url.php b/config/filament-short-url.php index 03113c9..6eff008 100644 --- a/config/filament-short-url.php +++ b/config/filament-short-url.php @@ -61,6 +61,17 @@ return [ */ 'disable_default_domain' => env('SHORT_URL_DISABLE_DEFAULT_DOMAIN', false), + /* + |-------------------------------------------------------------------------- + | Custom Domains + |-------------------------------------------------------------------------- + | enforce_dns_on_activate: when true, activating a domain (or changing its + | hostname while active) requires a passing DNS check against app.url. + */ + 'custom_domains' => [ + 'enforce_dns_on_activate' => env('SHORT_URL_CUSTOM_DOMAIN_ENFORCE_DNS', true), + ], + /* |-------------------------------------------------------------------------- | Geo-IP Settings @@ -120,7 +131,8 @@ return [ | Queue Connection |-------------------------------------------------------------------------- | Visit tracking is dispatched to a queue for ultra-fast redirects. - | Set to null to run synchronously (not recommended in production). + | Default is `sync` (no background worker required). Switch to `database` or + | `redis` in Settings or via SHORT_URL_QUEUE when you run a queue worker. */ 'queue_connection' => env('SHORT_URL_QUEUE', 'sync'), @@ -133,6 +145,22 @@ return [ */ 'queue_name' => env('SHORT_URL_QUEUE_NAME', 'default'), + /* + |-------------------------------------------------------------------------- + | Redis (Settings override when Queue Connection = redis) + |-------------------------------------------------------------------------- + | Defaults from .env; overridden at runtime from Settings → General when + | queue_connection is redis. Used for queue driver, visit counters, stats, + | and live feed — independent of CACHE_STORE. + */ + 'redis' => [ + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'port' => (int) env('REDIS_PORT', 6379), + 'password' => env('REDIS_PASSWORD'), + 'database' => (int) env('REDIS_DB', 0), + 'prefix' => env('REDIS_PREFIX', ''), + ], + /* |-------------------------------------------------------------------------- | Redirect Cache TTL @@ -195,6 +223,58 @@ return [ */ 'trust_cdn_headers' => (bool) env('SHORT_URL_TRUST_CDN_HEADERS', false), + /* + |-------------------------------------------------------------------------- + | Developer REST API + |-------------------------------------------------------------------------- + | Enable programmatic access to short URLs via /api/short-url/* endpoints. + | API keys are managed in the Filament settings panel. + | + */ + 'api_enabled' => env('SHORT_URL_API_ENABLED', false), + + /* + |-------------------------------------------------------------------------- + | VPN & Proxy Detection + |-------------------------------------------------------------------------- + | Detect VPN, proxy, and Tor connections on incoming visits. + | + */ + 'vpn_detection' => [ + 'enabled' => env('SHORT_URL_VPN_DETECTION', false), + 'driver' => env('SHORT_URL_VPN_DRIVER', 'ip-api'), + 'vpnapi_key' => env('SHORT_URL_VPNAPI_KEY'), + 'block_action' => env('SHORT_URL_VPN_BLOCK_ACTION', 'flag_only'), + 'cache_ttl' => 86400, + 'timeout' => 2, + ], + + /* + |-------------------------------------------------------------------------- + | Google Safe Browsing + |-------------------------------------------------------------------------- + | Block phishing and malware URLs at creation time. + | + */ + 'safe_browsing' => [ + 'enabled' => env('SHORT_URL_SAFE_BROWSING', false), + 'api_key' => env('SHORT_URL_SAFE_BROWSING_KEY'), + 'check_on_redirect' => env('SHORT_URL_SAFE_BROWSING_ON_REDIRECT', true), + 'redirect_cache_ttl' => (int) env('SHORT_URL_SAFE_BROWSING_REDIRECT_CACHE_TTL', 3600), + ], + + /* + |-------------------------------------------------------------------------- + | Click Deduplication + |-------------------------------------------------------------------------- + | Ignore repeated clicks from the same IP within the configured window. + | + */ + 'click_deduplication' => [ + 'enabled' => env('SHORT_URL_CLICK_DEDUP', false), + 'hours' => (int) env('SHORT_URL_CLICK_DEDUP_HOURS', 1), + ], + /* |-------------------------------------------------------------------------- | Data Pruning & Aggregation @@ -235,15 +315,56 @@ return [ |-------------------------------------------------------------------------- | Redirect Route Middleware |-------------------------------------------------------------------------- - | The middleware list applied to the short URL redirect route. - | By default, standard web middleware and rate limiting are applied. + | Middleware applied to the main short URL redirect route (/s/{key}). + | Intentionally excludes the "web" group (sessions/cookies) for a lean + | hot path. Password routes always load "web" separately (/s-auth/{key}). + | Add "web" here only if your app requires session on every redirect. | */ 'middleware' => [ - 'web', 'throttle:120,1', ], + /* + |-------------------------------------------------------------------------- + | Link ownership scoping + |-------------------------------------------------------------------------- + | When true, authenticated Filament users only see links they created + | (short_urls.user_id). Disable for shared admin panels. + | + */ + 'scope_links_to_user' => env('SHORT_URL_SCOPE_TO_USER', true), + + /* + |-------------------------------------------------------------------------- + | Max visits pessimistic locking + |-------------------------------------------------------------------------- + | When remaining slots are above this threshold, use a lock-free UPDATE path. + | Near the cap, a row lock is used to stay exact under concurrent traffic. + */ + 'max_visits_pessimistic_remaining' => (int) env('SHORT_URL_MAX_VISITS_PESSIMISTIC_REMAINING', 5), + + /* + |-------------------------------------------------------------------------- + | Live feed (SSE) + |-------------------------------------------------------------------------- + */ + 'live_feed' => [ + 'sse_interval_seconds' => (int) env('SHORT_URL_LIVE_FEED_SSE_INTERVAL', 3), + 'sse_max_duration_seconds' => (int) env('SHORT_URL_LIVE_FEED_SSE_MAX_DURATION', 120), + // When the cache store is Redis, SSE blocks on pub/sub instead of sleep-polling. + 'use_redis_push' => env('SHORT_URL_LIVE_FEED_REDIS_PUSH', true), + ], + + /* + |-------------------------------------------------------------------------- + | Webhook signing + |-------------------------------------------------------------------------- + | Require a signing secret before dispatching global webhooks. + | + */ + 'webhook_signing_required' => env('SHORT_URL_WEBHOOK_SIGNING_REQUIRED', true), + /* |-------------------------------------------------------------------------- | Deep Linking v2.1 @@ -270,4 +391,111 @@ return [ 'avatar_column' => 'avatar_url', // can be attribute/method on model or null to auto-detect HasAvatar ], + /* + |-------------------------------------------------------------------------- + | Bot Detection + |-------------------------------------------------------------------------- + | Patterns used to identify crawlers and link-preview bots. Specific tokens + | avoid false positives from real browsers (e.g. Chrome never matches "googlebot"). + | + */ + 'bot_detection' => [ + 'user_agent_contains' => [ + 'facebookexternalhit', + 'meta-externalagent', + 'meta-externalfetcher', + 'meta-externalads', + 'meta-webindexer', + 'Googlebot', + 'Google-InspectionTool', + 'GoogleOther', + 'Storebot-Google', + 'bingbot', + 'BingPreview', + 'DuckDuckBot', + 'Slurp', + 'Baiduspider', + 'YandexBot', + 'Applebot', + 'Applebot-Extended', + 'Twitterbot', + 'LinkedInBot', + 'linkedinbot', + 'Slackbot', + 'Slack-ImgProxy', + 'Discordbot', + 'TelegramBot', + 'WhatsApp', + 'Pinterestbot', + 'Embedly', + 'Iframely', + 'SkypeUriPreview', + 'facebookcatalog', + 'MetaInspector', + 'vkShare', + 'Tumblr', + 'redditbot', + 'Snap URL Preview', + 'Snapchat', + 'ChatGPT-User', + 'Claude-Web', + 'anthropic-ai', + 'PerplexityBot', + 'Bytespider', + 'GPTBot', + 'OAI-SearchBot', + 'HeadlessChrome', + 'Go-http-client', + 'python-requests', + 'axios/', + 'GuzzleHttp', + 'PostmanRuntime', + 'Insomnia', + 'Scrapy', + 'FeedBurner', + 'W3C_Validator', + 'Validator.nu', + 'PocketParser', + 'BitlyBot', + 'rogerbot', + 'SemrushBot', + 'AhrefsBot', + 'MJ12bot', + 'DotBot', + 'PetalBot', + 'Sogou', + 'ia_archiver', + 'archive.org_bot', + 'Wayback', + 'UptimeRobot', + 'StatusCake', + 'Pingdom', + 'GTmetrix', + 'Bluesky', + 'thirdLandingPageFeInfra', + 'ShortLinkTranslate', + ], + 'user_agent_regex' => [ + '/bot[\s\/;\)]/i', + '/crawler[\s\/;\)]/i', + '/spider[\s\/;\)]/i', + '/\bscraper\b/i', + '/\bslurp\b/i', + '/\bpreview\b/i', + '/^curl\//i', + '/^wget\//i', + '/\bPHP\/[\d.]+/i', + ], + 'referer_contains' => [ + 'url.emailprotection.link', + 'urlsand.com', + 'statics.teams.cdn.office.net', + 'security-za.m.mimecastprotect.com', + 'deref-mail.com', + 'deref-gmx.com', + ], + 'verify_google_bot_ip' => env('SHORT_URL_VERIFY_GOOGLEBOT_IP', false), + 'debug_secret' => env('SHORT_URL_BOT_DEBUG_SECRET'), + ], + ]; diff --git a/database/migrations/2026_06_08_000001_add_api_and_utm_fields_to_short_urls_table.php b/database/migrations/2026_06_08_000001_add_api_and_utm_fields_to_short_urls_table.php new file mode 100644 index 0000000..7471932 --- /dev/null +++ b/database/migrations/2026_06_08_000001_add_api_and_utm_fields_to_short_urls_table.php @@ -0,0 +1,48 @@ +string('external_id')->nullable()->unique(); + $table->string('utm_source')->nullable(); + $table->string('utm_medium')->nullable(); + $table->string('utm_campaign')->nullable(); + $table->string('utm_term')->nullable(); + $table->string('utm_content')->nullable(); + $table->string('ref')->nullable(); + $table->boolean('public_stats_enabled')->default(false); + $table->string('public_stats_password')->nullable(); + }); + + Schema::table('short_url_visits', function (Blueprint $table) { + $table->index(['short_url_id', 'ip_hash'], 'short_url_visits_url_ip_hash_index'); + }); + } + + public function down(): void + { + Schema::table('short_url_visits', function (Blueprint $table) { + $table->dropIndex('short_url_visits_url_ip_hash_index'); + }); + + Schema::table('short_urls', function (Blueprint $table) { + $table->dropColumn([ + 'external_id', + 'utm_source', + 'utm_medium', + 'utm_campaign', + 'utm_term', + 'utm_content', + 'ref', + 'public_stats_enabled', + 'public_stats_password', + ]); + }); + } +}; diff --git a/database/migrations/2026_06_09_000001_audit_schema_and_performance_fixes.php b/database/migrations/2026_06_09_000001_audit_schema_and_performance_fixes.php new file mode 100644 index 0000000..9443143 --- /dev/null +++ b/database/migrations/2026_06_09_000001_audit_schema_and_performance_fixes.php @@ -0,0 +1,63 @@ +unsignedBigInteger('domain_scope_id')->default(0); + }); + + DB::table('short_urls')->whereNotNull('custom_domain_id')->update([ + 'domain_scope_id' => DB::raw('custom_domain_id'), + ]); + + Schema::table('short_urls', function (Blueprint $table) { + $table->dropUnique(['url_key']); + $table->unique(['url_key', 'domain_scope_id'], 'short_urls_url_key_domain_scope_unique'); + $table->index(['user_id', 'is_archived', 'id'], 'short_urls_user_archived_id_index'); + }); + + Schema::table('short_urls', function (Blueprint $table) { + $table->foreign('custom_domain_id') + ->references('id') + ->on('short_url_custom_domains') + ->nullOnDelete(); + }); + + Schema::table('short_url_visits', function (Blueprint $table) { + $table->index(['short_url_id', 'id'], 'short_url_visits_url_id_index'); + }); + + Schema::table('short_url_daily_stats', function (Blueprint $table) { + $table->json('utm_terms')->nullable(); + $table->json('utm_contents')->nullable(); + $table->json('browser_versions')->nullable(); + $table->json('os_versions')->nullable(); + }); + } + + public function down(): void + { + Schema::table('short_url_daily_stats', function (Blueprint $table) { + $table->dropColumn(['utm_terms', 'utm_contents', 'browser_versions', 'os_versions']); + }); + + Schema::table('short_url_visits', function (Blueprint $table) { + $table->dropIndex('short_url_visits_url_id_index'); + }); + + Schema::table('short_urls', function (Blueprint $table) { + $table->dropForeign(['custom_domain_id']); + $table->dropIndex('short_urls_user_archived_id_index'); + $table->dropUnique('short_urls_url_key_domain_scope_unique'); + $table->unique('url_key'); + $table->dropColumn('domain_scope_id'); + }); + } +}; diff --git a/database/migrations/2026_06_10_000001_add_security_counts_to_daily_stats.php b/database/migrations/2026_06_10_000001_add_security_counts_to_daily_stats.php new file mode 100644 index 0000000..8770874 --- /dev/null +++ b/database/migrations/2026_06_10_000001_add_security_counts_to_daily_stats.php @@ -0,0 +1,24 @@ +unsignedInteger('all_visits_count')->default(0)->after('visits_count'); + $table->unsignedInteger('bot_visits_count')->default(0)->after('all_visits_count'); + $table->unsignedInteger('proxy_visits_count')->default(0)->after('bot_visits_count'); + }); + } + + public function down(): void + { + Schema::table('short_url_daily_stats', function (Blueprint $table) { + $table->dropColumn(['all_visits_count', 'bot_visits_count', 'proxy_visits_count']); + }); + } +}; diff --git a/database/migrations/2026_06_11_000001_add_cross_dimensional_stats_to_daily_stats.php b/database/migrations/2026_06_11_000001_add_cross_dimensional_stats_to_daily_stats.php new file mode 100644 index 0000000..0d43b11 --- /dev/null +++ b/database/migrations/2026_06_11_000001_add_cross_dimensional_stats_to_daily_stats.php @@ -0,0 +1,24 @@ +json('cross_dimensional_stats')->nullable(); + $table->json('cross_filter_pairs')->nullable(); + $table->json('filter_qr_counts')->nullable(); + }); + } + + public function down(): void + { + Schema::table('short_url_daily_stats', function (Blueprint $table) { + $table->dropColumn(['cross_dimensional_stats', 'cross_filter_pairs', 'filter_qr_counts']); + }); + } +}; diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..5ad61db --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,9 @@ +includes: + - vendor/larastan/larastan/extension.neon + +parameters: + paths: + - src + level: 5 + tmpDir: build/phpstan + checkMissingIterableValueType: false diff --git a/resources/css/plugin.css b/resources/css/plugin.css index 4f39ec9..c2e1c97 100644 --- a/resources/css/plugin.css +++ b/resources/css/plugin.css @@ -6,6 +6,1931 @@ @source "packages/filament-short-url/src/**/*.php"; @source "packages/filament-short-url/resources/views/**/*.blade.php"; +/* Number stepper — keep intrinsic width inside Filament grid fields */ +.fsu-number-stepper { + display: inline-flex; + width: fit-content; + max-width: max-content; + justify-self: start; +} + +.fi-fo-field:has(> .fi-fo-field-content-col .fsu-number-stepper) > .fi-fo-field-content-col { + justify-items: start; +} + +/* Segment control — HeroUI-style sliding pill */ +.fsu-segment-control { + display: block; + width: fit-content; + max-width: max-content; + justify-self: start; +} + +.fsu-segment-control.w-full { + width: 100%; + max-width: none; +} + +.fsu-segment-track { + position: relative; + display: inline-flex; + align-items: center; + isolation: isolate; + border-radius: 9999px; + background-color: rgb(243 244 246); + padding: 3px; + gap: 0; +} + +.dark .fsu-segment-track { + background-color: rgb(255 255 255 / 0.08); +} + +.fsu-segment-track--ghost { + background-color: transparent; + box-shadow: inset 0 0 0 1px rgb(229 231 235); +} + +.dark .fsu-segment-track--ghost { + box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.1); +} + +.fsu-segment-track--sm { + min-height: 28px; + padding: 2px; +} + +.fsu-segment-track--md { + min-height: 32px; + padding: 3px; +} + +.fsu-segment-track--lg { + min-height: 40px; + padding: 4px; +} + +.fsu-segment-indicator { + position: absolute; + top: 0; + left: 0; + z-index: 0; + border-radius: 9999px; + pointer-events: none; + will-change: transform, width, height; + transition: + transform 0.32s cubic-bezier(0.34, 1.2, 0.64, 1), + width 0.32s cubic-bezier(0.34, 1.2, 0.64, 1), + height 0.32s cubic-bezier(0.34, 1.2, 0.64, 1), + opacity 0.2s ease; + background-color: #fff; + box-shadow: + 0 1px 2px rgb(0 0 0 / 0.06), + 0 2px 6px rgb(0 0 0 / 0.08); +} + +.dark .fsu-segment-indicator { + background-color: rgb(24 24 27); + box-shadow: + 0 1px 2px rgb(0 0 0 / 0.35), + inset 0 0 0 1px rgb(255 255 255 / 0.08); +} + +.fsu-segment-indicator--ghost { + background-color: rgb(79 70 229); + box-shadow: none; +} + +.dark .fsu-segment-indicator--ghost { + background-color: rgb(99 102 241); +} + +.fsu-segment-item { + position: relative; + z-index: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.375rem; + border: 0; + border-radius: 9999px; + background: transparent; + cursor: pointer; + font-weight: 500; + line-height: 1; + white-space: nowrap; + color: rgb(107 114 128); + transition: color 0.2s ease; +} + +.fsu-segment-item:hover:not(:disabled):not([data-segment-selected='true']) { + color: rgb(55 65 81); +} + +.dark .fsu-segment-item { + color: rgb(156 163 175); +} + +.dark .fsu-segment-item:hover:not(:disabled):not([data-segment-selected='true']) { + color: rgb(229 231 235); +} + +.fsu-segment-item[data-segment-selected='true'] { + color: rgb(17 24 39); + font-weight: 600; +} + +.dark .fsu-segment-item[data-segment-selected='true'] { + color: rgb(255 255 255); +} + +.fsu-segment-track--ghost .fsu-segment-item[data-segment-selected='true'] { + color: #fff; +} + +.fsu-segment-item:disabled { + cursor: not-allowed; + opacity: 0.45; +} + +.fsu-segment-item--sm { + height: 24px; + padding: 0 10px; + font-size: 11px; + gap: 0.25rem; +} + +.fsu-segment-item--md { + height: 28px; + padding: 0 14px; + font-size: 12px; +} + +.fsu-segment-item--lg { + height: 32px; + padding: 0 18px; + font-size: 14px; + gap: 0.5rem; +} + +.fsu-segment-item svg { + display: block; + flex-shrink: 0; +} + +.fsu-segment-item--sm svg { + width: 14px; + height: 14px; +} + +.fsu-segment-item--md svg { + width: 16px; + height: 16px; +} + +.fsu-segment-item--lg svg { + width: 18px; + height: 18px; +} + +.fsu-segment-separator { + z-index: 1; + flex-shrink: 0; + width: 1px; + height: 14px; + margin: 0 1px; + background-color: rgb(209 213 219 / 0.85); +} + +.dark .fsu-segment-separator { + background-color: rgb(255 255 255 / 0.12); +} + +.fsu-segment-control.w-full .fsu-segment-track { + display: flex; + width: 100%; +} + +.fsu-segment-control.w-full .fsu-segment-item { + flex: 1 1 0; +} + +.fi-fo-field:has(> .fi-fo-field-content-col .fsu-segment-control:not(.w-full)) > .fi-fo-field-content-col { + justify-items: start; +} + +/* QR designer — icon-only segment controls (Style, Eye Square, Eye Dot) */ +.qr-segment-icon-only .fsu-segment-track--lg { + min-height: 44px; + padding: 4px; +} + +.qr-segment-icon-only .fsu-segment-item--lg { + height: 36px; + min-width: 36px; + padding: 0 10px; +} + +.qr-segment-icon-only .fsu-segment-item--lg svg { + width: 28px; + height: 28px; +} + +/* Style* row — 6 dot-style previews, needs larger hit targets */ +.qr-segment-icon-only--style .fsu-segment-track--lg { + min-height: 52px; + padding: 5px; +} + +.qr-segment-icon-only--style .fsu-segment-item--lg { + height: 42px; + min-width: 42px; + padding: 0 12px; +} + +.qr-segment-icon-only--style .fsu-segment-item--lg svg { + width: 34px; + height: 34px; +} + +/* Validity / Expiration tab */ +.validity-tab-card { + overflow: hidden; + border-radius: 1rem; + border: 1px solid rgb(229 231 235); + background: rgb(255 255 255); + padding: 1.25rem; + box-shadow: 0 1px 2px rgb(0 0 0 / 0.04); +} + +.dark .validity-tab-card { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.03); + box-shadow: none; +} + +.validity-tab-card-header { + display: flex; + align-items: flex-start; + gap: 0.875rem; +} + +.validity-tab-card-header--compact { + margin-bottom: 0; +} + +.fi-fo-field:has(.validity-tab-card-header--compact) { + margin-bottom: 0 !important; + gap: 0 !important; +} + +.validity-tab-card .fi-sc-has-gap { + gap: 0.625rem !important; +} + +.validity-tab-card-icon .fsu-tab-card-icon-svg, +.validity-tab-card-icon .fi-icon { + width: 1.25rem; + height: 1.25rem; +} + +.validity-tab-card-toolbar-main { + min-width: 0; +} + +@media (min-width: 768px) { + .validity-tab-card-toolbar-grid .fi-grid-col:has(.validity-tab-card-toolbar-action) { + display: flex; + justify-content: flex-end; + align-items: flex-start; + } +} + +.validity-tab-card-toolbar-action.fi-fo-field { + gap: 0 !important; + width: auto; +} + +.validity-tab-card-toolbar-action.fi-fo-field.fi-fo-field-has-inline-label { + grid-template-columns: auto; +} + +.validity-tab-card-toolbar-action .fi-fo-field-label-col { + display: none !important; +} + +.validity-tab-card-toolbar-action .fi-fo-field-content-col { + width: auto; + justify-items: end; +} + +.validity-tab-card-toolbar-action .fi-fo-toggle { + flex-shrink: 0; +} + +.validity-tab-card-icon { + display: flex; + height: 2.5rem; + width: 2.5rem; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 0.75rem; +} + +.validity-tab-card-icon--schedule { + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .validity-tab-card-icon--schedule { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.validity-tab-card-icon--limit { + background: rgb(254 243 199); + color: rgb(217 119 6); +} + +.dark .validity-tab-card-icon--limit { + background: rgb(217 119 6 / 0.15); + color: rgb(252 211 77); +} + +.validity-tab-card-icon--tracking { + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .validity-tab-card-icon--tracking { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.validity-tab-card-icon--utm { + background: rgb(237 233 254); + color: rgb(124 58 237); +} + +.dark .validity-tab-card-icon--utm { + background: rgb(124 58 237 / 0.15); + color: rgb(196 181 253); +} + +.validity-tab-card-icon--ga { + background: rgb(220 252 231); + color: rgb(22 163 74); +} + +.dark .validity-tab-card-icon--ga { + background: rgb(22 163 74 / 0.15); + color: rgb(134 239 172); +} + +.validity-tab-card-title { + margin: 0; + font-size: 0.9375rem; + font-weight: 600; + line-height: 1.35; + color: rgb(17 24 39); +} + +.dark .validity-tab-card-title { + color: rgb(255 255 255); +} + +.validity-tab-card-subtitle { + margin: 0.125rem 0 0; + font-size: 0.8125rem; + line-height: 1.45; + color: rgb(107 114 128); +} + +.dark .validity-tab-card-subtitle { + color: rgb(156 163 175); +} + +.validity-tab-empty { + margin-top: 0.625rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: 0.875rem; + border: 1px dashed rgb(209 213 219); + background: rgb(249 250 251); + padding: 1.75rem 1.25rem; + text-align: center; +} + +.dark .validity-tab-empty { + border-color: rgb(255 255 255 / 0.12); + background: rgb(255 255 255 / 0.02); +} + +.validity-tab-empty-icon { + display: flex; + height: 2.75rem; + width: 2.75rem; + align-items: center; + justify-content: center; + border-radius: 9999px; + background: rgb(243 244 246); + color: rgb(107 114 128); + margin-bottom: 0.75rem; +} + +.dark .validity-tab-empty-icon { + background: rgb(255 255 255 / 0.06); + color: rgb(156 163 175); +} + +.validity-tab-empty-title { + margin: 0; + font-size: 0.9375rem; + font-weight: 600; + color: rgb(17 24 39); +} + +.dark .validity-tab-empty-title { + color: rgb(255 255 255); +} + +.validity-tab-empty-desc { + margin: 0.375rem 0 0; + max-width: 28rem; + font-size: 0.8125rem; + line-height: 1.5; + color: rgb(107 114 128); +} + +.dark .validity-tab-empty-desc { + color: rgb(156 163 175); +} + +.validity-schedule-panel { + margin-top: 0 !important; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + background: rgb(249 250 251); + padding: 1rem; +} + +.dark .validity-schedule-panel { + border-color: rgb(255 255 255 / 0.08); + background: rgb(255 255 255 / 0.02); +} + +.validity-timeline-hint { + position: relative; + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.25rem; + padding-bottom: 0.25rem; +} + +.validity-timeline-dot { + height: 0.625rem; + width: 0.625rem; + border-radius: 9999px; + flex-shrink: 0; +} + +.validity-timeline-dot--start { + background: rgb(34 197 94); + box-shadow: 0 0 0 3px rgb(34 197 94 / 0.18); +} + +.validity-timeline-dot--end { + background: rgb(239 68 68); + box-shadow: 0 0 0 3px rgb(239 68 68 / 0.18); +} + +.validity-timeline-line { + height: 2px; + flex: 1 1 auto; + border-radius: 9999px; + background: linear-gradient(90deg, rgb(34 197 94), rgb(239 68 68)); + opacity: 0.45; +} + +.validity-timeline-label { + margin-left: 0.25rem; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: rgb(107 114 128); +} + +.dark .validity-timeline-label { + color: rgb(156 163 175); +} + +.validity-limit-block { + height: 100%; + border-radius: 0.875rem; + border: 1px solid rgb(243 244 246); + background: rgb(249 250 251); + padding: 1rem; +} + +.dark .validity-limit-block { + border-color: rgb(255 255 255 / 0.06); + background: rgb(255 255 255 / 0.02); +} + +.validity-limit-block--counter { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.validity-max-visits-card { + position: relative !important; + overflow: hidden; + min-height: 10.5rem; +} + +.validity-max-visits-card .fi-grid-col:has(.validity-max-visits-lock) { + position: absolute !important; + inset: 0 !important; + z-index: 30 !important; + margin: 0 !important; + padding: 0 !important; + width: 100% !important; + height: 100% !important; + pointer-events: auto; +} + +.validity-max-visits-card:has(.validity-max-visits-lock) .fi-grid-col:not(:has(.validity-max-visits-lock)) { + pointer-events: none; + user-select: none; +} + +.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock) { + position: absolute !important; + inset: 0 !important; + z-index: 30 !important; + margin: 0 !important; + padding: 0 !important; + width: 100% !important; + height: 100% !important; + pointer-events: auto; +} + +.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock) .fi-fo-field-content-col, +.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock) .fi-fo-field-content { + height: 100%; + width: 100%; + padding: 0 !important; + margin: 0 !important; +} + +.validity-max-visits-lock { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + border-radius: inherit; + background: rgb(255 255 255 / 0.45); + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.55); + cursor: not-allowed; +} + +.dark .validity-max-visits-lock { + background: rgb(15 23 42 / 0.42); + backdrop-filter: blur(20px) saturate(160%); + -webkit-backdrop-filter: blur(20px) saturate(160%); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.08); +} + +.validity-max-visits-lock-icon { + display: flex; + height: 3.5rem; + width: 3.5rem; + align-items: center; + justify-content: center; + border-radius: 9999px; + background: rgb(255 255 255 / 0.72); + color: rgb(75 85 99); + backdrop-filter: blur(12px) saturate(180%); + -webkit-backdrop-filter: blur(12px) saturate(180%); + box-shadow: + 0 4px 24px rgb(0 0 0 / 0.12), + 0 0 0 1px rgb(255 255 255 / 0.65); +} + +.dark .validity-max-visits-lock-icon { + background: rgb(39 39 42 / 0.72); + color: rgb(212 212 216); + box-shadow: + 0 4px 24px rgb(0 0 0 / 0.35), + inset 0 0 0 1px rgb(255 255 255 / 0.12); +} + +.validity-stepper-wrap { + margin-top: auto; +} + +.fi-fo-field:has(.validity-stepper-wrap) > .fi-fo-field-content-col { + justify-items: start; +} + +/* Tracking tab */ +.tracking-card-toolbar-action.fi-fo-field { + align-self: start; +} + +@media (min-width: 768px) { + .validity-tab-card-toolbar-grid .fi-grid-col:has(.tracking-card-toolbar-action) { + display: flex; + justify-content: flex-end; + align-items: flex-start; + padding-top: 0.125rem; + padding-right: 0.125rem; + } +} + +.tracking-fields-panel { + margin-top: 0 !important; + display: flex; + flex-direction: column; + gap: 0.625rem; +} + +.tracking-fields-category { + margin: 0.5rem 0 0; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: rgb(107 114 128); +} + +.dark .tracking-fields-category { + color: rgb(156 163 175); +} + +.tracking-field-card { + position: relative; + padding: 1rem 3.75rem 1rem 1rem; + min-height: 4.75rem; +} + +.tracking-field-card-copy { + min-width: 0; +} + +.tracking-field-card-title { + margin: 0; + font-size: 0.875rem; + font-weight: 600; + line-height: 1.35; + color: rgb(17 24 39); +} + +.dark .tracking-field-card-title { + color: rgb(255 255 255); +} + +.tracking-field-card-desc { + margin: 0.25rem 0 0; + font-size: 0.8125rem; + line-height: 1.45; + color: rgb(107 114 128); +} + +.dark .tracking-field-card-desc { + color: rgb(156 163 175); +} + +.tracking-field-card-toggle.fi-fo-field { + position: absolute; + top: 1rem; + right: 1rem; + z-index: 2; + width: auto; + margin: 0 !important; + padding: 0 !important; + gap: 0 !important; +} + +.tracking-field-card-toggle .fi-fo-field-label-col { + display: none !important; +} + +.tracking-field-card-toggle .fi-fo-field-content-col { + width: auto; +} + +.tracking-utm-card .validity-tab-card-header--compact { + margin-bottom: 0; +} + +.tracking-utm-fields { + margin-top: 0 !important; + padding-top: 0.625rem; + border-top: 1px solid rgb(243 244 246); +} + +.dark .tracking-utm-fields { + border-top-color: rgb(255 255 255 / 0.08); +} + +.tracking-ga-field { + margin-top: 0 !important; + padding-top: 0.625rem; + border-top: 1px solid rgb(243 244 246); +} + +.dark .tracking-ga-field { + border-top-color: rgb(255 255 255 / 0.08); +} + +/* Link tab */ +.validity-tab-card-icon--link { + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .validity-tab-card-icon--link { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.validity-tab-card-icon--key { + background: rgb(254 243 199); + color: rgb(217 119 6); +} + +.dark .validity-tab-card-icon--key { + background: rgb(217 119 6 / 0.15); + color: rgb(252 211 77); +} + +.validity-tab-card-icon--behavior { + background: rgb(243 244 246); + color: rgb(75 85 99); +} + +.dark .validity-tab-card-icon--behavior { + background: rgb(255 255 255 / 0.08); + color: rgb(209 213 219); +} + +.validity-tab-card-icon--tags { + background: rgb(237 233 254); + color: rgb(124 58 237); +} + +.dark .validity-tab-card-icon--tags { + background: rgb(124 58 237 / 0.15); + color: rgb(196 181 253); +} + +.validity-tab-card-icon--notes { + background: rgb(254 249 195); + color: rgb(202 138 4); +} + +.dark .validity-tab-card-icon--notes { + background: rgb(202 138 4 / 0.15); + color: rgb(253 224 71); +} + +.validity-tab-card-icon--targeting { + background: rgb(255 237 213); + color: rgb(234 88 12); +} + +.dark .validity-tab-card-icon--targeting { + background: rgb(234 88 12 / 0.15); + color: rgb(253 186 116); +} + +.validity-tab-card-icon--app-linking { + background: rgb(209 250 229); + color: rgb(5 150 105); +} + +.dark .validity-tab-card-icon--app-linking { + background: rgb(5 150 105 / 0.15); + color: rgb(110 231 183); +} + +.validity-tab-card-icon--password { + background: rgb(254 243 199); + color: rgb(217 119 6); +} + +.dark .validity-tab-card-icon--password { + background: rgb(217 119 6 / 0.15); + color: rgb(252 211 77); +} + +.validity-tab-card-icon--password-active { + background: rgb(209 250 229); + color: rgb(5 150 105); +} + +.dark .validity-tab-card-icon--password-active { + background: rgb(16 185 129 / 0.15); + color: rgb(110 231 183); +} + +.validity-tab-card-icon--warning { + background: rgb(254 226 226); + color: rgb(220 38 38); +} + +.dark .validity-tab-card-icon--warning { + background: rgb(220 38 38 / 0.15); + color: rgb(252 165 165); +} + +/* Password tab */ +.password-tab-card, +.password-warning-card { + overflow: visible; +} + +.password-warning-card { + overflow: visible; +} + +.password-warning-card .validity-tab-card-toolbar-grid { + margin-bottom: 0; +} + +.password-tab-setup-action { + margin-top: 0.125rem; +} + +.password-tab-setup-action .fi-btn { + width: 100%; + justify-content: center; + gap: 0.375rem; + border: 1px dashed rgb(209 213 219); + border-radius: 0.625rem; + background: rgb(255 255 255); + color: rgb(55 65 81); + box-shadow: none; + padding-block: 0.625rem; +} + +.dark .password-tab-setup-action .fi-btn { + border-color: rgb(255 255 255 / 0.14); + background: rgb(255 255 255 / 0.02); + color: rgb(209 213 219); +} + +.password-tab-setup-action .fi-btn:hover { + border-color: rgb(251 146 60); + background: rgb(255 247 237); + color: rgb(194 65 12); +} + +.dark .password-tab-setup-action .fi-btn:hover { + border-color: rgb(251 146 60 / 0.45); + background: rgb(234 88 12 / 0.12); + color: rgb(253 186 116); +} + +.password-tab-form-panel { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.password-tab-section-title { + margin: 0; + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: rgb(107 114 128); +} + +.dark .password-tab-section-title { + color: rgb(156 163 175); +} + +.password-tab-status { + display: flex; + flex-direction: column; + gap: 0.75rem; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + padding: 0.875rem 1rem; + background: rgb(255 255 255); +} + +.dark .password-tab-status { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.03); +} + +.password-tab-status--active { + border-color: rgb(167 243 208); + background: rgb(236 253 245); +} + +.dark .password-tab-status--active { + border-color: rgb(16 185 129 / 0.25); + background: rgb(16 185 129 / 0.08); +} + +.password-tab-status--warning { + border-color: rgb(254 215 170); + background: rgb(255 247 237); +} + +.dark .password-tab-status--warning { + border-color: rgb(234 88 12 / 0.25); + background: rgb(234 88 12 / 0.08); +} + +.password-tab-status-main { + display: flex; + align-items: flex-start; + gap: 0.75rem; +} + +.password-tab-status-icon { + display: flex; + height: 2.5rem; + width: 2.5rem; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 0.75rem; +} + +.password-tab-status-icon--active { + background: rgb(209 250 229); + color: rgb(5 150 105); +} + +.dark .password-tab-status-icon--active { + background: rgb(16 185 129 / 0.15); + color: rgb(110 231 183); +} + +.password-tab-status-icon--warning { + background: rgb(254 226 226); + color: rgb(220 38 38); +} + +.dark .password-tab-status-icon--warning { + background: rgb(220 38 38 / 0.15); + color: rgb(252 165 165); +} + +.password-tab-status-title { + margin: 0; + font-size: 0.875rem; + font-weight: 600; + line-height: 1.4; + color: rgb(17 24 39); +} + +.dark .password-tab-status-title { + color: rgb(255 255 255); +} + +.password-tab-status-desc { + margin: 0.25rem 0 0; + font-size: 0.8125rem; + line-height: 1.5; + color: rgb(107 114 128); +} + +.dark .password-tab-status-desc { + color: rgb(156 163 175); +} + +.password-tab-active-actions, +.password-tab-form-actions { + justify-content: flex-end; +} + +.password-tab-form-panel .fi-sc-has-gap { + gap: 0.75rem !important; +} + +/* Marketing tab */ +.marketing-pixels-card, +.marketing-webhook-card { + overflow: visible; +} + +.validity-tab-card-icon--pixels { + background: rgb(237 233 254); + color: rgb(124 58 237); +} + +.dark .validity-tab-card-icon--pixels { + background: rgb(124 58 237 / 0.15); + color: rgb(196 181 253); +} + +.validity-tab-card-icon--webhook { + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .validity-tab-card-icon--webhook { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.marketing-pixels-field, +.marketing-webhook-field { + margin-top: 0.125rem; +} + +.marketing-webhook-panel { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.marketing-tab-callout { + display: flex; + align-items: flex-start; + gap: 0.75rem; + border-radius: 0.875rem; + border: 1px solid rgb(191 219 254); + background: rgb(239 246 255); + padding: 0.875rem 1rem; +} + +.dark .marketing-tab-callout { + border-color: rgb(37 99 235 / 0.25); + background: rgb(37 99 235 / 0.08); +} + +.marketing-tab-callout-icon { + display: flex; + height: 2rem; + width: 2rem; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 0.625rem; + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .marketing-tab-callout-icon { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.marketing-tab-callout-text { + margin: 0; + font-size: 0.8125rem; + line-height: 1.55; + color: rgb(55 65 81); +} + +.dark .marketing-tab-callout-text { + color: rgb(209 213 219); +} + +.marketing-webhook-payload { + margin-top: 0.125rem; +} + +.marketing-webhook-payload-action { + margin-top: 0.125rem; +} + +.marketing-webhook-payload-wrap { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.marketing-webhook-payload-label { + margin: 0; + font-size: 0.8125rem; + font-weight: 600; + color: rgb(55 65 81); +} + +.dark .marketing-webhook-payload-label { + color: rgb(209 213 219); +} + +.marketing-webhook-payload-code { + position: relative; + overflow: hidden; + border-radius: 0.875rem; + border: 1px solid rgb(39 39 42); + background: rgb(24 24 27); + padding: 1.25rem; + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); +} + +.marketing-webhook-payload-copy { + position: absolute; + top: 1rem; + right: 1rem; + display: flex; + align-items: center; + justify-content: center; + height: 2rem; + width: 2rem; + border-radius: 0.5rem; + border: none; + background: rgb(255 255 255 / 0.08); + color: rgb(161 161 170); + cursor: pointer; + transition: background-color 0.2s, color 0.2s; +} + +.marketing-webhook-payload-copy:hover { + background: rgb(255 255 255 / 0.15); + color: rgb(255 255 255); +} + +.marketing-webhook-payload-pre { + margin: 0; + overflow-x: auto; + white-space: pre-wrap; + word-break: break-all; + padding-right: 2.5rem; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + font-size: 13px; + line-height: 1.6; + color: rgb(212 212 216); +} + +.marketing-webhook-payload-code-inner { + font: inherit; + color: inherit; +} + +/* SEO & Social tab */ +.seo-settings-card, +.seo-og-card { + overflow: visible; +} + +.validity-tab-card-icon--seo { + background: rgb(219 234 254); + color: rgb(37 99 235); +} + +.dark .validity-tab-card-icon--seo { + background: rgb(37 99 235 / 0.15); + color: rgb(147 197 253); +} + +.validity-tab-card-icon--og { + background: rgb(237 233 254); + color: rgb(124 58 237); +} + +.dark .validity-tab-card-icon--og { + background: rgb(124 58 237 / 0.15); + color: rgb(196 181 253); +} + +.seo-settings-grid, +.seo-og-panel { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.seo-og-field { + margin-top: 0.125rem; +} + +.link-segment-wrap { + margin: 0 !important; + gap: 0.25rem !important; +} + +.fi-fo-field:has(> .fi-fo-field-content-col .link-segment-wrap) > .fi-fo-field-content-col, +.fi-fo-field:has(.link-segment-wrap) > .fi-fo-field-content-col { + justify-items: start; +} + +.link-tab-panel { + margin-top: 0 !important; + padding-top: 0.625rem; + border-top: 1px solid rgb(243 244 246); + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.dark .link-tab-panel { + border-top-color: rgb(255 255 255 / 0.08); +} + +.link-tab-panel--flush { + padding-top: 0; + border-top: 0; + margin-top: 0 !important; +} + +.link-tab-panel-field { + margin-top: 0 !important; + padding-top: 0.625rem; + border-top: 1px solid rgb(243 244 246); +} + +.dark .link-tab-panel-field { + border-top-color: rgb(255 255 255 / 0.08); +} + +.validity-tab-card:has(.targeting-rules-repeater) { + overflow: visible; +} + +/* Targeting tab */ +.targeting-rules-repeater.fi-fo-repeater { + gap: 0.75rem; + margin-top: 0; + width: 100%; +} + +.targeting-rules-repeater.fi-fo-repeater > .fi-fo-repeater-items { + display: grid !important; + grid-template-columns: minmax(0, 1fr) !important; + width: 100%; + gap: 0.75rem; +} + +.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item { + position: relative; + overflow: visible; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + background: rgb(249 250 251); + padding: 0.625rem 0.75rem; + box-shadow: none; + width: 100%; + max-width: none; + grid-column: 1 / -1; + --tw-ring-shadow: 0 0 #0000; +} + +.dark .targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.02); +} + +.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item > .fi-fo-repeater-item-header { + position: absolute !important; + top: 0.625rem !important; + right: 0.75rem !important; + z-index: 2; + margin: 0 !important; + padding: 0 !important; + min-height: 0; + background: transparent; + border: 0; + width: auto !important; + display: block !important; + overflow: visible !important; + flex: none !important; + gap: 0 !important; + cursor: default; +} + +.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item-has-header > .fi-fo-repeater-item-content { + border-top: 0 !important; +} + +.targeting-rules-repeater .fi-fo-repeater-item-header-start-actions { + display: none; +} + +.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions { + margin: 0 !important; + padding: 0; + list-style: none; + display: flex; +} + +.targeting-rules-repeater .targeting-rule-delete-btn, +.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn { + display: inline-flex !important; + align-items: center; + justify-content: center; + width: 1.75rem !important; + height: 1.75rem !important; + min-width: 1.75rem !important; + min-height: 1.75rem !important; + margin: 0 !important; + padding: 0 !important; + border-radius: 9999px !important; + border: 1px solid rgb(229 231 235) !important; + background: rgb(243 244 246) !important; + color: rgb(107 114 128) !important; + box-shadow: none !important; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + color 0.15s ease; +} + +.targeting-rules-repeater .targeting-rule-delete-btn:hover, +.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn:hover { + background: rgb(254 242 242) !important; + border-color: rgb(254 202 202) !important; + color: rgb(220 38 38) !important; +} + +.dark .targeting-rules-repeater .targeting-rule-delete-btn, +.dark .targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn { + border-color: rgb(255 255 255 / 0.1) !important; + background: rgb(255 255 255 / 0.06) !important; + color: rgb(156 163 175) !important; +} + +.dark .targeting-rules-repeater .targeting-rule-delete-btn:hover, +.dark .targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn:hover { + background: rgb(127 29 29 / 0.22) !important; + border-color: rgb(248 113 113 / 0.35) !important; + color: rgb(252 165 165) !important; +} + +.targeting-rules-repeater .targeting-rule-delete-btn .fi-icon, +.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn .fi-icon { + width: 0.875rem; + height: 0.875rem; +} + +.targeting-rules-repeater .fi-fo-repeater-item-content { + padding: 0; +} + +.targeting-rule-item { + display: flex; + flex-direction: column; + gap: 0.25rem; + width: 100%; + min-width: 0; +} + +.targeting-rules-repeater .targeting-rule-item > .fi-sc > .fi-grid > .fi-grid-col:first-child .targeting-rule-section-title { + padding-right: 2rem; +} + +.targeting-rule-item .fi-sc-has-gap { + gap: 0.375rem !important; +} + +.targeting-rule-item .fi-in-entry { + gap: 0 !important; + margin: 0 !important; +} + +.targeting-rule-item .fi-fo-field { + gap: 0.375rem !important; + margin-bottom: 0 !important; +} + +.targeting-rule-item .link-segment-wrap { + margin: 0 !important; +} + +.targeting-rules-repeater .fi-fo-repeater-item-content, +.targeting-rules-repeater .fi-fo-repeater-item-content > .fi-sc { + width: 100%; + min-width: 0; +} + +.targeting-rule-section-title { + margin: 0; + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: rgb(107 114 128); +} + +.targeting-rule-section-title--destination { + margin-top: 0.125rem; + padding-top: 0.4375rem; + border-top: 1px solid rgb(229 231 235); +} + +.dark .targeting-rule-section-title { + color: rgb(156 163 175); +} + +.dark .targeting-rule-section-title--destination { + border-top-color: rgb(255 255 255 / 0.08); +} + +.targeting-tab-panel { + margin-top: 0 !important; + padding-top: 0.25rem; + display: flex; + flex-direction: column; + gap: 0.375rem; +} + +.targeting-app-linking-panel { + margin-top: 0 !important; + padding-top: 0.625rem; + border-top: 1px solid rgb(243 244 246); +} + +.dark .targeting-app-linking-panel { + border-top-color: rgb(255 255 255 / 0.08); +} + +.targeting-filters-builder.fi-fo-builder { + gap: 0.375rem; + margin-top: 0.125rem; +} + +.targeting-filters-builder.fi-fo-builder .fi-fo-builder-block-picker-ctn { + margin-top: 0.125rem; +} + +.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item { + overflow: visible; + border-radius: 0.75rem; + border: 1px solid rgb(229 231 235); + background: rgb(255 255 255); + box-shadow: none; + --tw-ring-shadow: 0 0 #0000; +} + +.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item-content { + overflow: visible; +} + +.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item-header { + overflow: visible; +} + +.dark .targeting-filters-builder.fi-fo-builder .fi-fo-builder-item { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.03); +} + +.targeting-rules-repeater .fi-fo-repeater-add .fi-btn, +.targeting-filters-builder .fi-fo-builder-block-picker .fi-btn { + width: 100%; + justify-content: center; + gap: 0.375rem; + border: 1px dashed rgb(209 213 219); + border-radius: 0.625rem; + background: rgb(255 255 255); + color: rgb(55 65 81); + box-shadow: none; + padding-block: 0.625rem; +} + +.dark .targeting-rules-repeater .fi-fo-repeater-add .fi-btn, +.dark .targeting-filters-builder .fi-fo-builder-block-picker .fi-btn { + border-color: rgb(255 255 255 / 0.14); + background: rgb(255 255 255 / 0.02); + color: rgb(209 213 219); +} + +.targeting-rules-repeater .fi-fo-repeater-add .fi-btn:hover, +.targeting-filters-builder .fi-fo-builder-block-picker .fi-btn:hover { + border-color: rgb(251 146 60); + background: rgb(255 247 237); + color: rgb(194 65 12); +} + +.dark .targeting-rules-repeater .fi-fo-repeater-add .fi-btn:hover, +.dark .targeting-filters-builder .fi-fo-builder-block-picker .fi-btn:hover { + border-color: rgb(251 146 60 / 0.45); + background: rgb(234 88 12 / 0.12); + color: rgb(253 186 116); +} + +.validity-tab-card:has(.targeting-rules-repeater) .validity-tab-empty { + margin-bottom: 0.25rem; +} + +.validity-tab-card:has(.targeting-rules-repeater .fi-fo-repeater-item) .targeting-rules-empty-state, +.validity-tab-card:has(.targeting-rules-repeater .fi-fo-repeater-item) .fi-grid-col:has(.targeting-rules-empty-state) { + display: none !important; +} + +.fi-fo-field:has(.app-linking-preview) > .fi-fo-field-content-col { + max-width: none; +} + +.app-linking-preview { + display: flex; + flex-direction: column; + gap: 0.875rem; + width: 100%; +} + +.app-linking-status { + display: flex; + flex-direction: column; + gap: 0.75rem; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + padding: 0.875rem 1rem; + background: rgb(255 255 255); +} + +.dark .app-linking-status { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.03); +} + +.app-linking-status--matched { + border-color: rgb(167 243 208); + background: rgb(236 253 245); +} + +.dark .app-linking-status--matched { + border-color: rgb(16 185 129 / 0.25); + background: rgb(16 185 129 / 0.08); +} + +.app-linking-status--browser { + flex-direction: row; + align-items: center; + gap: 0.75rem; +} + +.app-linking-status-main { + display: flex; + align-items: flex-start; + gap: 0.75rem; +} + +.app-linking-status-icon { + display: flex; + height: 2.5rem; + width: 2.5rem; + flex-shrink: 0; + align-items: center; + justify-content: center; + overflow: hidden; + border-radius: 0.75rem; + border: 1px solid rgb(229 231 235); + background: rgb(255 255 255); +} + +.app-linking-status-icon img { + height: 1.5rem; + width: 1.5rem; + object-fit: contain; +} + +.app-linking-status-icon--browser { + color: rgb(107 114 128); +} + +.app-linking-status-icon--browser svg { + height: 1.25rem; + width: 1.25rem; +} + +.dark .app-linking-status-icon { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.05); +} + +.app-linking-status-icon--matched { + border-color: rgb(167 243 208); +} + +.dark .app-linking-status-icon--matched { + border-color: rgb(16 185 129 / 0.25); +} + +.app-linking-status-copy { + min-width: 0; + flex: 1; +} + +.app-linking-status-title-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; +} + +.app-linking-status-title { + margin: 0; + font-size: 0.875rem; + font-weight: 600; + color: rgb(17 24 39); +} + +.dark .app-linking-status-title { + color: rgb(255 255 255); +} + +.app-linking-status--matched .app-linking-status-title { + color: rgb(6 95 70); +} + +.dark .app-linking-status--matched .app-linking-status-title { + color: rgb(167 243 208); +} + +.app-linking-status-desc { + margin: 0.25rem 0 0; + font-size: 0.8125rem; + line-height: 1.45; + color: rgb(4 120 87); +} + +.dark .app-linking-status-desc { + color: rgb(110 231 183); +} + +.app-linking-status--browser .app-linking-status-title { + font-size: 0.8125rem; + font-weight: 500; + color: rgb(75 85 99); +} + +.dark .app-linking-status--browser .app-linking-status-title { + color: rgb(209 213 219); +} + +.app-linking-status-badge { + display: inline-flex; + align-items: center; + border-radius: 9999px; + padding: 0.125rem 0.5rem; + font-size: 0.625rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.app-linking-status-badge--success { + background: rgb(16 185 129); + color: rgb(255 255 255); +} + +.app-linking-deep-link { + display: flex; + flex-direction: column; + gap: 0.375rem; + border-radius: 0.625rem; + border: 1px solid rgb(167 243 208); + background: rgb(255 255 255 / 0.75); + padding: 0.625rem 0.75rem; +} + +.dark .app-linking-deep-link { + border-color: rgb(16 185 129 / 0.2); + background: rgb(255 255 255 / 0.04); +} + +.app-linking-deep-link-label { + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: rgb(5 150 105); +} + +.dark .app-linking-deep-link-label { + color: rgb(110 231 183); +} + +.app-linking-deep-link-value { + display: block; + overflow-wrap: anywhere; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + font-size: 0.75rem; + line-height: 1.45; + color: rgb(6 95 70); +} + +.dark .app-linking-deep-link-value { + color: rgb(167 243 208); +} + +.app-linking-catalog { + overflow: hidden; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + background: rgb(249 250 251); +} + +.dark .app-linking-catalog { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.02); +} + +.app-linking-catalog-header { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: space-between; + gap: 0.75rem; + border-bottom: 1px solid rgb(229 231 235); + padding: 0.875rem 1rem; +} + +.dark .app-linking-catalog-header { + border-bottom-color: rgb(255 255 255 / 0.08); +} + +.app-linking-catalog-title { + margin: 0; + font-size: 0.8125rem; + font-weight: 600; + color: rgb(17 24 39); +} + +.dark .app-linking-catalog-title { + color: rgb(255 255 255); +} + +.app-linking-catalog-subtitle { + margin: 0.125rem 0 0; + font-size: 0.75rem; + color: rgb(107 114 128); +} + +.dark .app-linking-catalog-subtitle { + color: rgb(156 163 175); +} + +.app-linking-os-badges { + display: flex; + flex-wrap: wrap; + gap: 0.375rem; +} + +.app-linking-os-badge { + display: inline-flex; + align-items: center; + border-radius: 0.375rem; + border: 1px solid rgb(229 231 235); + background: rgb(255 255 255); + padding: 0.125rem 0.5rem; + font-size: 0.6875rem; + font-weight: 600; + color: rgb(75 85 99); +} + +.dark .app-linking-os-badge { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.04); + color: rgb(209 213 219); +} + +.app-linking-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(5.75rem, 1fr)); + gap: 0.5rem; + padding: 0.875rem; +} + +.app-linking-app { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + border-radius: 0.75rem; + border: 1px solid transparent; + padding: 0.625rem 0.375rem; + text-align: center; + transition: + background-color 0.15s ease, + border-color 0.15s ease; +} + +.app-linking-app:hover { + background: rgb(255 255 255); + border-color: rgb(229 231 235); +} + +.dark .app-linking-app:hover { + background: rgb(255 255 255 / 0.04); + border-color: rgb(255 255 255 / 0.08); +} + +.app-linking-app--matched { + border-color: rgb(167 243 208); + background: rgb(236 253 245); +} + +.dark .app-linking-app--matched { + border-color: rgb(16 185 129 / 0.25); + background: rgb(16 185 129 / 0.08); +} + +.app-linking-app-icon-wrap { + position: relative; + display: flex; + height: 2.75rem; + width: 2.75rem; + align-items: center; + justify-content: center; + border-radius: 0.875rem; + border: 1px solid rgb(229 231 235); + background: rgb(255 255 255); +} + +.dark .app-linking-app-icon-wrap { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.05); +} + +.app-linking-app--matched .app-linking-app-icon-wrap { + border-color: rgb(110 231 183); +} + +.app-linking-app-icon { + height: 1.625rem; + width: 1.625rem; + object-fit: contain; +} + +.app-linking-app-check { + position: absolute; + top: -0.25rem; + right: -0.25rem; + display: flex; + height: 1rem; + width: 1rem; + align-items: center; + justify-content: center; + border-radius: 9999px; + background: rgb(16 185 129); + color: rgb(255 255 255); + box-shadow: 0 0 0 2px rgb(236 253 245); +} + +.dark .app-linking-app-check { + box-shadow: 0 0 0 2px rgb(6 78 59); +} + +.app-linking-app-check svg { + height: 0.625rem; + width: 0.625rem; +} + +.app-linking-app-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + font-size: 0.6875rem; + font-weight: 500; + line-height: 1.25; + color: rgb(75 85 99); + word-break: break-word; +} + +.dark .app-linking-app-name { + color: rgb(209 213 219); +} + +.app-linking-app--matched .app-linking-app-name { + font-weight: 600; + color: rgb(6 95 70); +} + +.dark .app-linking-app--matched .app-linking-app-name { + color: rgb(167 243 208); +} + +.app-linking-footnote { + margin: 0; + border-top: 1px solid rgb(229 231 235); + padding: 0.75rem 1rem; + font-size: 0.75rem; + line-height: 1.5; + color: rgb(107 114 128); +} + +.dark .app-linking-footnote { + border-top-color: rgb(255 255 255 / 0.08); + color: rgb(156 163 175); +} + +.link-short-fused.fi-fo-field { + margin-bottom: 0; +} + .short-url-card { position: relative !important; } @@ -31,6 +1956,214 @@ margin-top: 0; } +.traffic-splitter-segment { + box-shadow: none !important; +} + +/* A/B Split Test variant table */ +.ab-test-repeater.fi-fo-table-repeater { + gap: 0.625rem; + margin-top: 0; +} + +.ab-test-repeater.fi-fo-table-repeater > table { + overflow: hidden; + border-radius: 0.75rem; + border: 1px solid rgb(229 231 235); + background: rgb(249 250 251); + box-shadow: none; + --tw-ring-shadow: 0 0 #0000; + --tw-ring-offset-shadow: 0 0 #0000; +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table { + border-color: rgb(255 255 255 / 0.1); + background: rgb(255 255 255 / 0.02); +} + +.ab-test-repeater.fi-fo-table-repeater > table > thead > tr > th { + border-color: rgb(229 231 235); + background: rgb(243 244 246 / 0.85); + padding: 0.4375rem 0.625rem; + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: rgb(107 114 128); +} + +.ab-test-repeater.fi-fo-table-repeater > table > thead > tr > th.fi-fo-table-repeater-empty-header-cell { + width: 2.25rem; + min-width: 2.25rem; +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table > thead > tr > th { + border-color: rgb(255 255 255 / 0.08); + background: rgb(255 255 255 / 0.04); + color: rgb(156 163 175); +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody { + counter-reset: ab-variant-row; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr { + counter-increment: ab-variant-row; + background: rgb(255 255 255); + transition: background-color 0.15s ease; +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr { + background: rgb(17 24 39 / 0.35); +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr:hover { + background: rgb(249 250 251); +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr:hover { + background: rgb(255 255 255 / 0.05); +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:first-child { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:first-child::before { + content: counter(ab-variant-row); + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.5rem; + height: 1.5rem; + border-radius: 0.375rem; + background: rgb(238 242 255); + color: rgb(79 70 229); + font-size: 0.6875rem; + font-weight: 700; + line-height: 1; +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:first-child::before { + background: rgb(79 70 229 / 0.18); + color: rgb(165 180 252); +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:first-child .fi-fo-field { + flex: 1; + min-width: 0; + width: 100%; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td .fi-fo-field { + margin-bottom: 0; +} + +.ab-test-repeater.fi-compact.fi-fo-table-repeater > table > tbody > tr > td .fi-input-wrp { + min-height: 0; + padding-inline: 0.125rem; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:last-child .fi-fo-table-repeater-actions { + justify-content: flex-end; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:last-child .fi-btn { + border-radius: 0.5rem; +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody { + border-color: rgb(229 231 235); +} + +.dark .ab-test-repeater.fi-fo-table-repeater > table > tbody { + border-color: rgb(255 255 255 / 0.08); +} + +.ab-test-repeater.fi-fo-table-repeater > table > tbody > tr { + padding: 0.875rem; + gap: 0.625rem; +} + +@container (min-width: 36rem) { + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr { + padding: 0; + gap: 0; + } + + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td { + padding: 0.375rem 0.5rem; + vertical-align: middle; + } + + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:last-child { + width: 2.25rem; + min-width: 2.25rem; + padding: 0.25rem; + } +} + +@supports not (container-type: inline-size) { + @media (min-width: 80rem) { + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr { + padding: 0; + gap: 0; + } + + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td { + padding: 0.375rem 0.5rem; + vertical-align: middle; + } + + .ab-test-repeater.fi-fo-table-repeater > table > tbody > tr > td:last-child { + width: 2.25rem; + min-width: 2.25rem; + padding: 0.25rem; + } + } +} + +.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add { + justify-content: flex-start; +} + +.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn { + width: 100%; + justify-content: center; + gap: 0.375rem; + border: 1px dashed rgb(209 213 219); + border-radius: 0.625rem; + background: rgb(255 255 255); + color: rgb(55 65 81); + box-shadow: none; + padding-block: 0.625rem; + transition: + border-color 0.15s ease, + background-color 0.15s ease, + color 0.15s ease; +} + +.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn:hover { + border-color: rgb(165 180 252); + background: rgb(238 242 255); + color: rgb(67 56 202); +} + +.dark .ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn { + border-color: rgb(255 255 255 / 0.14); + background: rgb(255 255 255 / 0.02); + color: rgb(209 213 219); +} + +.dark .ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn:hover { + border-color: rgb(129 140 248 / 0.45); + background: rgb(79 70 229 / 0.12); + color: rgb(199 210 254); +} + .ab-test-slider .noUi-tooltip { position: absolute; top: -24px; diff --git a/resources/dist/filament-short-url.css b/resources/dist/filament-short-url.css index 7d8d79f..3f950ec 100644 --- a/resources/dist/filament-short-url.css +++ b/resources/dist/filament-short-url.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-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-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom: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:""}}}:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-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-100:oklch(95.4% .038 75.164);--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-900:oklch(40.8% .123 38.172);--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-100:oklch(96.7% .067 122.328);--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-100:oklch(95% .052 163.051);--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-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-100:oklch(95.3% .051 180.801);--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-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--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-900:oklch(39.8% .07 227.392);--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-100:oklch(94.3% .029 294.588);--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-900:oklch(38% .189 293.745);--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-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-100:oklch(95.2% .037 318.852);--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-900:oklch(40.1% .17 325.612);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--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-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--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-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--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 0);--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 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--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:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--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-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--shadow-2xs:0 1px #0000000d;--shadow-xs:0 1px 2px 0 #0000000d;--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;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--shadow-2xl:0 25px 50px -12px #00000040;--inset-shadow-2xs:inset 0 1px #0000000d;--inset-shadow-xs:inset 0 1px 1px #0000000d;--inset-shadow-sm:inset 0 2px 4px #0000000d;--drop-shadow-xs:0 1px 1px #0000000d;--drop-shadow-sm:0 1px 2px #00000026;--drop-shadow-md:0 3px 3px #0000001f;--drop-shadow-lg:0 4px 4px #00000026;--drop-shadow-xl:0 9px 7px #0000001a;--drop-shadow-2xl:0 25px 25px #00000026;--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;--animate-bounce:bounce 1s infinite;--blur-xs:4px;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--perspective-dramatic:100px;--perspective-near:300px;--perspective-normal:500px;--perspective-midrange:800px;--perspective-distant:1200px;--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)}.\@container\/page{container:page/inline-size}.\@container\/page-content{container:page-content/inline-size}.\@container\/panel{container:panel/inline-size}.\@container\/stats{container:stats/inline-size}.\@container,.\[container-type\:inline-size\]{container-type:inline-size}.\[container-type\:size\]{container-type: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}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-16{inset:calc(var(--spacing) * -16)}.-inset-\[50\%\]{inset:-50%}.inset-0{inset:calc(var(--spacing) * 0)}.inset-\[unset\]{inset:unset}.-inset-x-10{inset-inline:calc(var(--spacing) * -10)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-x-4{inset-inline:calc(var(--spacing) * 4)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.inset-y-1{inset-block:calc(var(--spacing) * 1)}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-1{top:calc(var(--spacing) * -1)}.-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-4{top:calc(var(--spacing) * -4)}.-top-6{top:calc(var(--spacing) * -6)}.-top-px{top:-1px}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-1\/3{top:33.3333%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-8{top:calc(var(--spacing) * 8)}.top-9{top:calc(var(--spacing) * 9)}.top-12{top:calc(var(--spacing) * 12)}.top-14{top:calc(var(--spacing) * 14)}.top-16{top:calc(var(--spacing) * 16)}.top-20{top:calc(var(--spacing) * 20)}.top-28{top:calc(var(--spacing) * 28)}.top-\[-20px\]{top:-20px}.top-\[-30px\]{top:-30px}.top-\[-36px\]{top:-36px}.top-\[57\%\]{top:57%}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1{right:calc(var(--spacing) * -1)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-4{right:calc(var(--spacing) * -4)}.-right-10{right:calc(var(--spacing) * -10)}.-right-px{right:-1px}.right-0{right:calc(var(--spacing) * 0)}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:calc(var(--spacing) * 1)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-2\.5{right:calc(var(--spacing) * 2.5)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.right-10{right:calc(var(--spacing) * 10)}.right-12{right:calc(var(--spacing) * 12)}.right-\[-17px\]{right:-17px}.right-\[62cqh\]{right:62cqh}.right-\[calc\(14px\+0\.375rem\)\]{right:calc(14px + .375rem)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.-bottom-1{bottom:calc(var(--spacing) * -1)}.-bottom-2{bottom:calc(var(--spacing) * -2)}.-bottom-px{bottom:-1px}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-\[45\%\]{bottom:45%}.bottom-full{bottom:100%}.-left-1\/4{left:-25%}.-left-4{left:calc(var(--spacing) * -4)}.-left-8{left:calc(var(--spacing) * -8)}.left-0{left:calc(var(--spacing) * 0)}.left-1{left:calc(var(--spacing) * 1)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.left-7{left:calc(var(--spacing) * 7)}.left-\[-17px\]{left:-17px}.left-\[11\.5px\]{left:11.5px}.left-\[11px\]{left:11px}.left-\[22px\]{left:22px}.left-\[calc\(50\%\+12px\)\]{left:calc(50% + 12px)}.left-\[calc\(50\%-60px\)\]{left:calc(50% - 60px)}.left-\[calc\(50\%-122px\)\]{left:calc(50% - 122px)}.left-full{left:100%}.isolate{isolation:isolate}.-z-10{z-index:calc(10 * -1)}.-z-\[1\]{z-index:calc(1 * -1)}.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-\[5\]{z-index:5}.z-\[11\]{z-index:11}.z-\[99\]{z-index:99}.z-\[100\]{z-index:100}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-first{order:-9999}.order-last{order:9999}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-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}}.container\!{width:100%!important}@media (min-width:40rem){.container\!{max-width:40rem!important}}@media (min-width:48rem){.container\!{max-width:48rem!important}}@media (min-width:64rem){.container\!{max-width:64rem!important}}@media (min-width:80rem){.container\!{max-width:80rem!important}}@media (min-width:96rem){.container\!{max-width:96rem!important}}.-m-0\.5{margin:calc(var(--spacing) * -.5)}.-m-1{margin:calc(var(--spacing) * -1)}.-m-1\.5{margin:calc(var(--spacing) * -1.5)}.-m-2{margin:calc(var(--spacing) * -2)}.m-0{margin:calc(var(--spacing) * 0)}.m-1{margin:calc(var(--spacing) * 1)}.m-2{margin:calc(var(--spacing) * 2)}.m-3{margin:calc(var(--spacing) * 3)}.m-4{margin:calc(var(--spacing) * 4)}.m-5{margin:calc(var(--spacing) * 5)}.m-auto{margin:auto}.m-px{margin:1px}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-mx-2\.5{margin-inline:calc(var(--spacing) * -2.5)}.-mx-3{margin-inline:calc(var(--spacing) * -3)}.-mx-5{margin-inline:calc(var(--spacing) * -5)}.-mx-px{margin-inline:-1px}.mx-0{margin-inline:calc(var(--spacing) * 0)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.mx-px{margin-inline:1px}.-my-0\.5{margin-block:calc(var(--spacing) * -.5)}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-0{margin-block:calc(var(--spacing) * 0)}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:calc(var(--spacing) * 1)}.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-8{margin-block:calc(var(--spacing) * 8)}.my-10{margin-block:calc(var(--spacing) * 10)}.my-\[-0\.1em\]{margin-block:-.1em}.my-auto{margin-block:auto}.my-px{margin-block:1px}.\!mt-0{margin-top:calc(var(--spacing) * 0)!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{margin-top:calc(var(--spacing) * -2)}.-mt-3\.5{margin-top:calc(var(--spacing) * -3.5)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-8{margin-top:calc(var(--spacing) * -8)}.-mt-16{margin-top:calc(var(--spacing) * -16)}.-mt-\[6\.6rem\]{margin-top:-6.6rem}.-mt-px{margin-top:-1px}.mt-0{margin-top:calc(var(--spacing) * 0)}.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{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-5{margin-top:calc(var(--spacing) * 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-20{margin-top:calc(var(--spacing) * 20)}.mt-22{margin-top:calc(var(--spacing) * 22)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mt-\[5px\]{margin-top:5px}.mt-\[17px\]{margin-top:17px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.-mr-1{margin-right:calc(var(--spacing) * -1)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.-mr-px{margin-right:-1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-2\.5{margin-right:calc(var(--spacing) * 2.5)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mr-12{margin-right:calc(var(--spacing) * 12)}.-mb-0\.5{margin-bottom:calc(var(--spacing) * -.5)}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.-mb-3{margin-bottom:calc(var(--spacing) * -3)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-18{margin-bottom:calc(var(--spacing) * 18)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.mb-\[3px\]{margin-bottom:3px}.-ml-0\.5{margin-left:calc(var(--spacing) * -.5)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.-ml-1\.5{margin-left:calc(var(--spacing) * -1.5)}.-ml-2{margin-left:calc(var(--spacing) * -2)}.-ml-2\.5{margin-left:calc(var(--spacing) * -2.5)}.-ml-4{margin-left:calc(var(--spacing) * -4)}.-ml-8{margin-left:calc(var(--spacing) * -8)}.-ml-px{margin-left:-1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.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-6{margin-left:calc(var(--spacing) * 6)}.ml-7{margin-left:calc(var(--spacing) * 7)}.ml-12{margin-left:calc(var(--spacing) * 12)}.ml-\[calc\(\(var\(--idx\)\+1\)\*5\%\)\]{margin-left:calc((var(--idx) + 1) * 5%)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.box-content{box-sizing:content-box}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.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}.line-clamp-4{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline\!{display:inline!important}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table\!{display:table!important}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-\[4\.2\]{aspect-ratio:4.2}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/1\]{aspect-ratio:5}.aspect-\[9\/16\]{aspect-ratio:9/16}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-\[16\/12\]{aspect-ratio:16/12}.aspect-\[96\/40\]{aspect-ratio:96/40}.aspect-\[335\/364\]{aspect-ratio:335/364}.aspect-\[900\/580\]{aspect-ratio:900/580}.aspect-\[1084\/994\]{aspect-ratio:1084/994}.aspect-\[1200\/630\]{aspect-ratio:1200/630}.aspect-\[1368\/994\]{aspect-ratio:1368/994}.aspect-\[unset\]{aspect-ratio:unset}.aspect-\[var\(--aspect\,1200\/630\)\]{aspect-ratio:var(--aspect,1200/630)}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-0\.5{width:calc(var(--spacing) * .5);height:calc(var(--spacing) * .5)}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.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-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.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\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.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-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-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-32{width:calc(var(--spacing) * 32);height:calc(var(--spacing) * 32)}.size-36{width:calc(var(--spacing) * 36);height:calc(var(--spacing) * 36)}.size-72{width:calc(var(--spacing) * 72);height:calc(var(--spacing) * 72)}.size-\[1\.125rem\]{width:1.125rem;height:1.125rem}.size-\[4\.5rem\]{width:4.5rem;height:4.5rem}.size-\[8px\]{width:8px;height:8px}.size-\[11px\]{width:11px;height:11px}.size-\[18px\]{width:18px;height:18px}.size-\[28px\]{width:28px;height:28px}.size-\[34px\]{width:34px;height:34px}.size-\[42px\]{width:42px;height:42px}.size-\[70px\]{width:70px;height:70px}.size-\[80px\]{width:80px;height:80px}.size-\[82px\]{width:82px;height:82px}.size-\[104px\]{width:104px;height:104px}.size-\[132px\]{width:132px;height:132px}.size-full{width:100%;height:100%}.\!h-8{height:calc(var(--spacing) * 8)!important}.h-0{height:calc(var(--spacing) * 0)}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-1\/2{height:50%}.h-1\/4{height:25%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-2\/3{height:66.6667%}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-6\.5{height:calc(var(--spacing) * 6.5)}.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-14\.5{height:calc(var(--spacing) * 14.5)}.h-16{height:calc(var(--spacing) * 16)}.h-18{height:calc(var(--spacing) * 18)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-28{height:calc(var(--spacing) * 28)}.h-32{height:calc(var(--spacing) * 32)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-44{height:calc(var(--spacing) * 44)}.h-48{height:calc(var(--spacing) * 48)}.h-52{height:calc(var(--spacing) * 52)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-80{height:calc(var(--spacing) * 80)}.h-96{height:calc(var(--spacing) * 96)}.h-\[1em\]{height:1em}.h-\[1px\]{height:1px}.h-\[2\.35rem\]{height:2.35rem}.h-\[4\.5rem\]{height:4.5rem}.h-\[5px\]{height:5px}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[24px\]{height:24px}.h-\[24rem\]{height:24rem}.h-\[26px\]{height:26px}.h-\[27px\]{height:27px}.h-\[28rem\]{height:28rem}.h-\[30px\]{height:30px}.h-\[32px\]{height:32px}.h-\[38px\]{height:38px}.h-\[39px\]{height:39px}.h-\[44px\]{height:44px}.h-\[50vh\]{height:50vh}.h-\[51px\]{height:51px}.h-\[55vh\]{height:55vh}.h-\[60\%\]{height:60%}.h-\[60px\]{height:60px}.h-\[64px\]{height:64px}.h-\[65vh\]{height:65vh}.h-\[66px\]{height:66px}.h-\[72px\]{height:72px}.h-\[81px\]{height:81px}.h-\[85vh\]{height:85vh}.h-\[90\%\]{height:90%}.h-\[90px\]{height:90px}.h-\[94px\]{height:94px}.h-\[100px\]{height:100px}.h-\[102px\]{height:102px}.h-\[104px\]{height:104px}.h-\[115px\]{height:115px}.h-\[120px\]{height:120px}.h-\[124px\]{height:124px}.h-\[125px\]{height:125px}.h-\[130px\]{height:130px}.h-\[132px\]{height:132px}.h-\[135\%\]{height:135%}.h-\[140px\]{height:140px}.h-\[156px\]{height:156px}.h-\[158px\]{height:158px}.h-\[161px\]{height:161px}.h-\[170px\]{height:170px}.h-\[190px\]{height:190px}.h-\[200\%\]{height:200%}.h-\[200px\]{height:200px}.h-\[250px\]{height:250px}.h-\[260px\]{height:260px}.h-\[280px\]{height:280px}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[420px\]{height:420px}.h-\[444px\]{height:444px}.h-\[500px\]{height:500px}.h-\[660px\]{height:660px}.h-\[700px\]{height:700px}.h-\[720px\]{height:720px}.h-\[calc\(100\%-0\.5rem\)\]{height:calc(100% - .5rem)}.h-\[calc\(100\%-8px\)\]{height:calc(100% - 8px)}.h-\[calc\(100dvh-48px\)\]{height:calc(100dvh - 48px)}.h-\[calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-\[calc\(100vh-16px\)\]{height:calc(100vh - 16px)}.h-\[calc\(100vh-48px\)\]{height:calc(100vh - 48px)}.h-\[max\(1200px\,100\%\)\]{height:max(1200px,100%)}.h-\[var\(--page-height\)\]{height:var(--page-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing) * 0)}.max-h-7{max-height:calc(var(--spacing) * 7)}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-84{max-height:calc(var(--spacing) * 84)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[26rem\]{max-height:26rem}.max-h-\[40vh\]{max-height:40vh}.max-h-\[50dvh\]{max-height:50dvh}.max-h-\[52vh\]{max-height:52vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95dvh\]{max-height:95dvh}.max-h-\[190px\]{max-height:190px}.max-h-\[530px\]{max-height:530px}.max-h-\[700px\]{max-height:700px}.max-h-\[800px\]{max-height:800px}.max-h-\[calc\(70dvh\)\]{max-height:70dvh}.max-h-\[calc\(100dvh-50px\)\]{max-height:calc(100dvh - 50px)}.max-h-\[calc\(100dvh-64px\)\]{max-height:calc(100dvh - 64px)}.max-h-\[calc\(100dvh-100px\)\]{max-height:calc(100dvh - 100px)}.max-h-\[calc\(100dvh-200px\)\]{max-height:calc(100dvh - 200px)}.max-h-\[calc\(100dvh-250px\)\]{max-height:calc(100dvh - 250px)}.max-h-\[calc\(100dvh-280px\)\]{max-height:calc(100dvh - 280px)}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.max-h-\[calc\(100vh-160px\)\]{max-height:calc(100vh - 160px)}.max-h-\[calc\(100vh-300px\)\]{max-height:calc(100vh - 300px)}.max-h-\[calc\(100vh-350px\)\]{max-height:calc(100vh - 350px)}.max-h-\[calc\(100vh-400px\)\]{max-height:calc(100vh - 400px)}.max-h-\[calc\(var\(--radix-popper-available-height\,100dvh\)-12px\)\]{max-height:calc(var(--radix-popper-available-height,100dvh) - 12px)}.max-h-\[min\(40dvh\,15rem\)\]{max-height:min(40dvh,15rem)}.max-h-\[min\(260px\,calc\(100vh-300px\)\)\]{max-height:min(260px,100vh - 300px)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-48{min-height:calc(var(--spacing) * 48)}.min-h-\[20px\]{min-height:20px}.min-h-\[22rem\]{min-height:22rem}.min-h-\[40px\]{min-height:40px}.min-h-\[100dvh\]{min-height:100dvh}.min-h-\[200px\]{min-height:200px}.min-h-\[280px\]{min-height:280px}.min-h-\[300px\]{min-height:300px}.min-h-\[315px\]{min-height:315px}.min-h-\[400px\]{min-height:400px}.min-h-\[500px\]{min-height:500px}.min-h-\[calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{min-height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.min-h-\[calc\(100vh-1rem\)\]{min-height:calc(100vh - 1rem)}.min-h-\[calc\(100vh-10rem\)\]{min-height:calc(100vh - 10rem)}.min-h-\[calc\(100vh-60px\)\]{min-height:calc(100vh - 60px)}.min-h-\[calc\(100vh-200px\)\]{min-height:calc(100vh - 200px)}.min-h-\[var\(--page-height\)\]{min-height:var(--page-height)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.\!w-8{width:calc(var(--spacing) * 8)!important}.\!w-full{width:100%!important}.w-0{width:calc(var(--spacing) * 0)}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.6667%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-2\/5{width:40%}.w-2\/6{width:33.3333%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing) * 6)}.w-6\.5{width:calc(var(--spacing) * 6.5)}.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-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-\[1px\]{width:1px}.w-\[2\.125rem\]{width:2.125rem}.w-\[4\.75rem\]{width:4.75rem}.w-\[5\/6\]{width:5/6}.w-\[5px\]{width:5px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[40px\]{width:40px}.w-\[44px\]{width:44px}.w-\[51px\]{width:51px}.w-\[64px\]{width:64px}.w-\[70\%\]{width:70%}.w-\[82px\]{width:82px}.w-\[88\%\]{width:88%}.w-\[100px\]{width:100px}.w-\[102px\]{width:102px}.w-\[120px\]{width:120px}.w-\[150\%\]{width:150%}.w-\[199px\]{width:199px}.w-\[207px\]{width:207px}.w-\[220px\]{width:220px}.w-\[236px\]{width:236px}.w-\[240px\]{width:240px}.w-\[244px\]{width:244px}.w-\[260px\]{width:260px}.w-\[280px\]{width:280px}.w-\[284px\]{width:284px}.w-\[340px\]{width:340px}.w-\[392px\]{width:392px}.w-\[438px\]{width:438px}.w-\[444px\]{width:444px}.w-\[600px\]{width:600px}.w-\[640px\]{width:640px}.w-\[879px\]{width:879px}.w-\[888px\]{width:888px}.w-\[1080px\]{width:1080px}.w-\[1200px\]{width:1200px}.w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.w-\[calc\(var\(--sidebar-areas-width\)-0\.5rem\)\]{width:calc(var(--sidebar-areas-width) - .5rem)}.w-\[var\(--radix-popover-trigger-width\)\]{width:var(--radix-popover-trigger-width)}.w-\[var\(--sidebar-width\)\]{width:var(--sidebar-width)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-min{width:min-content}.w-px{width:1px}.w-screen{width:100vw}.w-xs{width:var(--container-xs)}.max-w-0{max-width:calc(var(--spacing) * 0)}.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-32{max-width:calc(var(--spacing) * 32)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-44{max-width:calc(var(--spacing) * 44)}.max-w-52{max-width:calc(var(--spacing) * 52)}.max-w-60{max-width:calc(var(--spacing) * 60)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-96{max-width:calc(var(--spacing) * 96)}.max-w-\[13rem\]{max-width:13rem}.max-w-\[20rem\]{max-width:20rem}.max-w-\[50ch\]{max-width:50ch}.max-w-\[85\%\]{max-width:85%}.max-w-\[85px\]{max-width:85px}.max-w-\[100px\]{max-width:100px}.max-w-\[112px\]{max-width:112px}.max-w-\[130px\]{max-width:130px}.max-w-\[140px\]{max-width:140px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[192px\]{max-width:192px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[225px\]{max-width:225px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[335px\]{max-width:335px}.max-w-\[350px\]{max-width:350px}.max-w-\[360px\]{max-width:360px}.max-w-\[370px\]{max-width:370px}.max-w-\[400px\]{max-width:400px}.max-w-\[420px\]{max-width:420px}.max-w-\[430px\]{max-width:430px}.max-w-\[440px\]{max-width:440px}.max-w-\[480px\]{max-width:480px}.max-w-\[495px\]{max-width:495px}.max-w-\[500px\]{max-width:500px}.max-w-\[600px\]{max-width:600px}.max-w-\[700px\]{max-width:700px}.max-w-\[768px\]{max-width:768px}.max-w-\[800px\]{max-width:800px}.max-w-\[calc\(100\%-1\.5rem\)\]{max-width:calc(100% - 1.5rem)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-\[calc\(100cqw-32px\)\]{max-width:calc(100cqw - 32px)}.max-w-\[calc\(var\(--cols\)\*342px\)\]{max-width:calc(var(--cols) * 342px)}.max-w-\[min\(100\%\,11rem\)\]{max-width:min(100%,11rem)}.max-w-\[min\(100\%\,512px\)\]{max-width:min(100%,512px)}.max-w-\[min\(100vw-2rem\,17\.5rem\)\]{max-width:min(100vw - 2rem,17.5rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.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-prose{max-width:65ch}.max-w-screen{max-width:100vw}.max-w-screen-2xl{max-width:var(--breakpoint-2xl)}.max-w-screen-lg{max-width:var(--breakpoint-lg)}.max-w-screen-md{max-width:var(--breakpoint-md)}.max-w-screen-sm{max-width:var(--breakpoint-sm)}.max-w-screen-xl{max-width:var(--breakpoint-xl)}.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:calc(var(--spacing) * 0)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-12{min-width:calc(var(--spacing) * 12)}.min-w-20{min-width:calc(var(--spacing) * 20)}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[52px\]{min-width:52px}.min-w-\[110px\]{min-width:110px}.min-w-\[140px\]{min-width:140px}.min-w-\[150px\]{min-width:150px}.min-w-\[280px\]{min-width:280px}.min-w-\[1000px\]{min-width:1000px}.min-w-\[1010px\]{min-width:1010px}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.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-0{flex-basis:calc(var(--spacing) * 0)}.basis-2\/3{flex-basis:66.6667%}.basis-full{flex-basis:100%}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing) * 0);--tw-border-spacing-y:calc(var(--spacing) * 0);border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.\[transform-origin\:center\]{transform-origin:50%}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.origin-center{transform-origin:50%}.origin-left{transform-origin:0}.origin-top{transform-origin:top}.origin-top-left{transform-origin:0 0}.-translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-2{--tw-translate-x:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-3{--tw-translate-x:calc(var(--spacing) * -3);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-14{--tw-translate-x:calc(var(--spacing) * -14);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-14{--tw-translate-x:calc(var(--spacing) * 14);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[calc\(var\(--current-panel\)\*-100\%\)\]{--tw-translate-x:calc(var(--current-panel) * -100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[calc\(var\(--dx\)\*1px\)\]{--tw-translate-x:calc(var(--dx) * 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-0\.5{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-4{--tw-translate-y:calc(var(--spacing) * -4);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-px{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[3px\]{--tw-translate-y:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[30\%\]{--tw-translate-y:30%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[var\(--y\)\]{--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-scale-100{--tw-scale-x:calc(100% * -1);--tw-scale-y:calc(100% * -1);--tw-scale-z:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;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)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-x-100{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-x-\[1\.8\]{--tw-scale-x:calc(1.8 * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-x-\[1\.6\]{--tw-scale-x:1.6;scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-y-100{--tw-scale-y:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-\[var\(--scale\)\]{scale:var(--scale)}.-rotate-90{rotate:-90deg}.-rotate-\[55deg\]{rotate:-55deg}.rotate-0{rotate:0deg}.rotate-1{rotate:1deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-\[-8deg\]{rotate:-8deg}.rotate-\[-15deg\]{rotate:-15deg}.rotate-\[15deg\]{rotate:15deg}.rotate-\[calc\(var\(--dx\)\*0\.05deg\)\]{rotate:calc(var(--dx) * .05deg)}.-skew-x-12{--tw-skew-x:skewX(calc(12deg * -1));transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.skew-y-\[-16deg\]{--tw-skew-y:skewY(-16deg);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.\[transform\:translate3d\(0\,0\,0\)\]{transform:translate(0)}.\[transform\:translateZ\(0\)\]{transform:translateZ(0)}.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-bounce{animation:var(--animate-bounce)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-alias{cursor:alias}.cursor-col-resize{cursor:col-resize}.cursor-copy{cursor:copy}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.resize\!{resize:both!important}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-my-1\.5{scroll-margin-block:calc(var(--spacing) * 1.5)}.scroll-mt-12{scroll-margin-top:calc(var(--spacing) * 12)}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-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-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[0fr\]{grid-template-columns:0fr}.grid-cols-\[1\.5fr_1fr\]{grid-template-columns:1.5fr 1fr}.grid-cols-\[1fr\,auto\]{grid-template-columns:1fr,auto}.grid-cols-\[1fr\,minmax\(0\,min-content\)\]{grid-template-columns:1fr,minmax(0,min-content)}.grid-cols-\[1fr_min-content_1fr\]{grid-template-columns:1fr min-content 1fr}.grid-cols-\[28px_1fr_auto\]{grid-template-columns:28px 1fr auto}.grid-cols-\[80px_minmax\(320px\,1fr\)_300px_minmax\(260px\,1fr\)_24px\]{grid-template-columns:80px minmax(320px,1fr) 300px minmax(260px,1fr) 24px}.grid-cols-\[100\%_100\%\]{grid-template-columns:100% 100%}.grid-cols-\[140px_1fr\]{grid-template-columns:140px 1fr}.grid-cols-\[max-content_minmax\(0\,1fr\)\]{grid-template-columns:max-content minmax(0,1fr)}.grid-cols-\[min-content\,minmax\(0\,1fr\)\]{grid-template-columns:min-content,minmax(0,1fr)}.grid-cols-\[min-content_1fr_min-content\]{grid-template-columns:min-content 1fr min-content}.grid-cols-\[minmax\(0\,1fr\)\,min-content\]{grid-template-columns:minmax(0,1fr),min-content}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,5fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,5fr)}.grid-cols-\[minmax\(0\,7rem\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,7rem) minmax(0,1fr)}.grid-cols-\[minmax\(340px\,1fr\)_minmax\(0\,min-content\)\]{grid-template-columns:minmax(340px,1fr) minmax(0,min-content)}.grid-cols-\[repeat\(3\,max-content\)\]{grid-template-columns:repeat(3,max-content)}.grid-cols-\[repeat\(4\,max-content\)\]{grid-template-columns:repeat(4,max-content)}.grid-cols-\[repeat\(var\(--cols\)\,1fr\)\]{grid-template-columns:repeat(var(--cols),1fr)}.grid-cols-\[repeat\(var\(--tabs\)\,minmax\(0\,1fr\)\)\]{grid-template-columns:repeat(var(--tabs),minmax(0,1fr))}.grid-cols-\[var\(--sidebar-groups-width\)_1fr\]{grid-template-columns:var(--sidebar-groups-width) 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.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-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.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}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-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-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-16{gap:calc(var(--spacing) * 16)}.gap-\[1px\]{gap:1px}.gap-\[5px\]{gap:5px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-16>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 16) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 16) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:calc(var(--spacing) * 1)}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.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-10{column-gap:calc(var(--spacing) * 10)}.gap-x-14{column-gap:calc(var(--spacing) * 14)}.gap-x-16{column-gap:calc(var(--spacing) * 16)}:where(.-space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * -1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -1) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 0) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 1.5) * 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-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 3) * 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)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing) * 0)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.gap-y-5{row-gap:calc(var(--spacing) * 5)}.gap-y-6{row-gap:calc(var(--spacing) * 6)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}: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-x-200>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(200px * var(--tw-divide-x-reverse));border-inline-end-width:calc(200px * 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-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.divide-neutral-100>:not(:last-child)){border-color:var(--color-neutral-100)}:where(.divide-neutral-200>:not(:last-child)){border-color:var(--color-neutral-200)}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\!overflow-visible{overflow:visible!important}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.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}.overflow-y-scroll{overflow-y:scroll}.overflow-y-visible{overflow-y:visible}.overscroll-contain{overscroll-behavior:contain}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[0\.75rem\]{border-radius:.75rem}.rounded-\[0\.625rem\]{border-radius:.625rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[10px\]{border-radius:10px}.rounded-\[31px\]{border-radius:31px}.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-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-\[inherit\]{border-top-left-radius:inherit;border-top-right-radius:inherit}.rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.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)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-\[0\.625rem\]{border-bottom-right-radius:.625rem;border-bottom-left-radius:.625rem}.rounded-b-\[11px\]{border-bottom-right-radius:11px;border-bottom-left-radius:11px}.rounded-b-\[12px\]{border-bottom-right-radius:12px;border-bottom-left-radius:12px}.rounded-b-\[inherit\]{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-lg{border-bottom-right-radius:var(--radius-lg)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-lg{border-bottom-left-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-4{border-style:var(--tw-border-style);border-width:4px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.border-x-2{border-inline-style:var(--tw-border-style);border-inline-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-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-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{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-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\[\#8c8c8c33\]{border-color:#8c8c8c33}.border-\[\#1717170D\]{border-color:#1717170d}.border-\[\#1717171A\]{border-color:#1717171a}.border-\[\#19140035\]{border-color:#19140035}.border-\[\#e3e3e0\]{border-color:#e3e3e0}.border-\[var\(--brand\)\]{border-color:var(--brand)}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-200\/90{border-color:#fee685e6}@supports (color:color-mix(in lab, red, red)){.border-amber-200\/90{border-color:color-mix(in oklab, var(--color-amber-200) 90%, transparent)}}.border-amber-300{border-color:var(--color-amber-300)}.border-black{border-color:var(--color-black)}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.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\/\[0\.075\]{border-color:#00000013}@supports (color:color-mix(in lab, red, red)){.border-black\/\[0\.075\]{border-color:color-mix(in oklab, var(--color-black) 7.5%, transparent)}}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-100\/60{border-color:#dbeafe99}@supports (color:color-mix(in lab, red, red)){.border-blue-100\/60{border-color:color-mix(in oklab, var(--color-blue-100) 60%, transparent)}}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-500{border-color:var(--color-blue-500)}.border-cyan-500{border-color:var(--color-cyan-500)}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/20{border-color:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/30{border-color:color-mix(in oklab, var(--color-cyan-500) 30%, transparent)}}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/20{border-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-200\/50{border-color:#e5e7eb80}@supports (color:color-mix(in lab, red, red)){.border-gray-200\/50{border-color:color-mix(in oklab, var(--color-gray-200) 50%, transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-100{border-color:var(--color-green-100)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-green-500{border-color:var(--color-green-500)}.border-green-600\/15{border-color:#00a54426}@supports (color:color-mix(in lab, red, red)){.border-green-600\/15{border-color:color-mix(in oklab, var(--color-green-600) 15%, transparent)}}.border-green-600\/50{border-color:#00a54480}@supports (color:color-mix(in lab, red, red)){.border-green-600\/50{border-color:color-mix(in oklab, var(--color-green-600) 50%, transparent)}}.border-green-700\/50{border-color:#00813880}@supports (color:color-mix(in lab, red, red)){.border-green-700\/50{border-color:color-mix(in oklab, var(--color-green-700) 50%, transparent)}}.border-indigo-100{border-color:var(--color-indigo-100)}.border-indigo-100\/30{border-color:#e0e7ff4d}@supports (color:color-mix(in lab, red, red)){.border-indigo-100\/30{border-color:color-mix(in oklab, var(--color-indigo-100) 30%, transparent)}}.border-indigo-200{border-color:var(--color-indigo-200)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-200\/50{border-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/50{border-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.border-neutral-200\/60{border-color:#e5e5e599}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/60{border-color:color-mix(in oklab, var(--color-neutral-200) 60%, transparent)}}.border-neutral-200\/80{border-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/80{border-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-300\/80{border-color:#d4d4d4cc}@supports (color:color-mix(in lab, red, red)){.border-neutral-300\/80{border-color:color-mix(in oklab, var(--color-neutral-300) 80%, transparent)}}.border-neutral-400{border-color:var(--color-neutral-400)}.border-neutral-400\/30{border-color:#a1a1a14d}@supports (color:color-mix(in lab, red, red)){.border-neutral-400\/30{border-color:color-mix(in oklab, var(--color-neutral-400) 30%, transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-800\/10{border-color:#2626261a}@supports (color:color-mix(in lab, red, red)){.border-neutral-800\/10{border-color:color-mix(in oklab, var(--color-neutral-800) 10%, transparent)}}.border-neutral-900{border-color:var(--color-neutral-900)}.border-neutral-900\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-neutral-900\/10{border-color:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.border-neutral-950{border-color:var(--color-neutral-950)}.border-orange-100\/30{border-color:#ffedd54d}@supports (color:color-mix(in lab, red, red)){.border-orange-100\/30{border-color:color-mix(in oklab, var(--color-orange-100) 30%, transparent)}}.border-orange-200{border-color:var(--color-orange-200)}.border-orange-500{border-color:var(--color-orange-500)}.border-orange-600{border-color:var(--color-orange-600)}.border-pink-200{border-color:var(--color-pink-200)}.border-purple-100{border-color:var(--color-purple-100)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-300{border-color:var(--color-purple-300)}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-red-500{border-color:var(--color-red-500)}.border-red-600{border-color:var(--color-red-600)}.border-rose-400{border-color:var(--color-rose-400)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-900{border-color:var(--color-slate-900)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-200\/90{border-color:#96f7e4e6}@supports (color:color-mix(in lab, red, red)){.border-teal-200\/90{border-color:color-mix(in oklab, var(--color-teal-200) 90%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.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\/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-yellow-300{border-color:var(--color-yellow-300)}.border-t-current{border-top-color:currentColor}.border-t-gray-800{border-top-color:var(--color-gray-800)}.border-t-neutral-600{border-top-color:var(--color-neutral-600)}.border-t-transparent{border-top-color:#0000}.border-r-transparent{border-right-color:#0000}.border-l-transparent{border-left-color:#0000}.\!bg-blue-50{background-color:var(--color-blue-50)!important}.\!bg-orange-50{background-color:var(--color-orange-50)!important}.bg-\[\#0f1419\]{background-color:#0f1419}.bg-\[\#1b1b18\]{background-color:#1b1b18}.bg-\[\#6b7280\]{background-color:#6b7280}.bg-\[\#25d366\]{background-color:#25d366}.bg-\[\#0077b5\]{background-color:#0077b5}.bg-\[\#1877f2\]{background-color:#1877f2}.bg-\[\#EDE8FD\]{background-color:#ede8fd}.bg-\[\#F0F7FF\]{background-color:#f0f7ff}.bg-\[\#F5EDFF\]{background-color:#f5edff}.bg-\[\#FCFCFC\]{background-color:#fcfcfc}.bg-\[\#FDFDFC\]{background-color:#fdfdfc}.bg-\[\#FFEBEB\]{background-color:#ffebeb}.bg-\[\#FFF3EC\]{background-color:#fff3ec}.bg-\[\#dbdbd7\]{background-color:#dbdbd7}.bg-\[\#f2f3f5\]{background-color:#f2f3f5}.bg-\[\#f4f4f5\]{background-color:#f4f4f5}.bg-\[\#f9fafb\]{background-color:#f9fafb}.bg-\[\#fff2f2\]{background-color:#fff2f2}.bg-\[var\(--brand\)\]{background-color:var(--brand)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/80{background-color:#fffbebcc}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/80{background-color:color-mix(in oklab, var(--color-amber-50) 80%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-100\/50{background-color:#fef3c680}@supports (color:color-mix(in lab, red, red)){.bg-amber-100\/50{background-color:color-mix(in oklab, var(--color-amber-100) 50%, transparent)}}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-black{background-color:var(--color-black)}.bg-black\/5{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.bg-black\/5{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, 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\.03\]{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-black) 3%, 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-black\/\[0\.77\]{background-color:#000000c4}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.77\]{background-color:color-mix(in oklab, var(--color-black) 77%, transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/50{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/50{background-color:color-mix(in oklab, var(--color-blue-50) 50%, transparent)}}.bg-blue-50\/80{background-color:#eff6ffcc}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/80{background-color:color-mix(in oklab, var(--color-blue-50) 80%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-100\/50{background-color:#dbeafe80}@supports (color:color-mix(in lab, red, red)){.bg-blue-100\/50{background-color:color-mix(in oklab, var(--color-blue-100) 50%, transparent)}}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/10{background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.bg-blue-500\/50{background-color:#3080ff80}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/50{background-color:color-mix(in oklab, var(--color-blue-500) 50%, transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-current{background-color:currentColor}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab, red, red)){.bg-cyan-500\/10{background-color:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.bg-cyan-950\/40{background-color:#05334566}@supports (color:color-mix(in lab, red, red)){.bg-cyan-950\/40{background-color:color-mix(in oklab, var(--color-cyan-950) 40%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-emerald-500\/8{background-color:#00bb7f14}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/8{background-color:color-mix(in oklab, var(--color-emerald-500) 8%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/50{background-color:color-mix(in oklab, var(--color-gray-50) 50%, transparent)}}.bg-gray-50\/60{background-color:#f9fafb99}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/60{background-color:color-mix(in oklab, var(--color-gray-50) 60%, transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-100\/50{background-color:#f3f4f680}@supports (color:color-mix(in lab, red, red)){.bg-gray-100\/50{background-color:color-mix(in oklab, var(--color-gray-100) 50%, transparent)}}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-950\/40{background-color:#03071266}@supports (color:color-mix(in lab, red, red)){.bg-gray-950\/40{background-color:color-mix(in oklab, var(--color-gray-950) 40%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-100\/80{background-color:#dcfce7cc}@supports (color:color-mix(in lab, red, red)){.bg-green-100\/80{background-color:color-mix(in oklab, var(--color-green-100) 80%, transparent)}}.bg-green-200{background-color:var(--color-green-200)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/10{background-color:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.bg-green-500\/50{background-color:#00c75880}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/50{background-color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-50\/20{background-color:#fafafa33}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/20{background-color:color-mix(in oklab, var(--color-neutral-50) 20%, transparent)}}.bg-neutral-50\/30{background-color:#fafafa4d}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/30{background-color:color-mix(in oklab, var(--color-neutral-50) 30%, transparent)}}.bg-neutral-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/50{background-color:color-mix(in oklab, var(--color-neutral-50) 50%, transparent)}}.bg-neutral-50\/80{background-color:#fafafacc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/80{background-color:color-mix(in oklab, var(--color-neutral-50) 80%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-100\/50{background-color:#f5f5f580}@supports (color:color-mix(in lab, red, red)){.bg-neutral-100\/50{background-color:color-mix(in oklab, var(--color-neutral-100) 50%, transparent)}}.bg-neutral-100\/80{background-color:#f5f5f5cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-100\/80{background-color:color-mix(in oklab, var(--color-neutral-100) 80%, transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-200\/40{background-color:#e5e5e566}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/40{background-color:color-mix(in oklab, var(--color-neutral-200) 40%, transparent)}}.bg-neutral-200\/50{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/50{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.bg-neutral-200\/75{background-color:#e5e5e5bf}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/75{background-color:color-mix(in oklab, var(--color-neutral-200) 75%, transparent)}}.bg-neutral-200\/80{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/80{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-500\/10{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.bg-neutral-500\/10{background-color:color-mix(in oklab, var(--color-neutral-500) 10%, transparent)}}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-800\/80{background-color:#262626cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-800\/80{background-color:color-mix(in oklab, var(--color-neutral-800) 80%, transparent)}}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-900\/5{background-color:#1717170d}@supports (color:color-mix(in lab, red, red)){.bg-neutral-900\/5{background-color:color-mix(in oklab, var(--color-neutral-900) 5%, transparent)}}.bg-neutral-900\/10{background-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.bg-neutral-900\/10{background-color:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-500\/50{background-color:#fe6e0080}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\/50{background-color:color-mix(in oklab, var(--color-orange-500) 50%, transparent)}}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-700{background-color:var(--color-orange-700)}.bg-orange-900{background-color:var(--color-orange-900)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-500\/10{background-color:#f6339a1a}@supports (color:color-mix(in lab, red, red)){.bg-pink-500\/10{background-color:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/10{background-color:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/40{background-color:#fef2f266}@supports (color:color-mix(in lab, red, red)){.bg-red-50\/40{background-color:color-mix(in oklab, var(--color-red-50) 40%, transparent)}}.bg-red-50\/80{background-color:#fef2f2cc}@supports (color:color-mix(in lab, red, red)){.bg-red-50\/80{background-color:color-mix(in oklab, var(--color-red-50) 80%, transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/50{background-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-red-600\/5{background-color:#e400140d}@supports (color:color-mix(in lab, red, red)){.bg-red-600\/5{background-color:color-mix(in oklab, var(--color-red-600) 5%, transparent)}}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-400\/\[\.15\]{background-color:#00bcfe26}@supports (color:color-mix(in lab, red, red)){.bg-sky-400\/\[\.15\]{background-color:color-mix(in oklab, var(--color-sky-400) 15%, transparent)}}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/60{background-color:color-mix(in oklab, var(--color-slate-900) 60%, transparent)}}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/80{background-color:color-mix(in oklab, var(--color-slate-900) 80%, transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500\/50{background-color:#00baa780}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/50{background-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/50{background-color:#8d54ff80}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/50{background-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-900{background-color:var(--color-violet-900)}.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\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, 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\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.bg-white\/30{background-color:color-mix(in oklab, var(--color-white) 30%, 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\/50{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/50{background-color:color-mix(in oklab, var(--color-white) 50%, 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\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.bg-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\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-zinc-50{background-color:var(--color-zinc-50)}.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-l{--tw-gradient-position:to left 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-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.\[background-image\:radial-gradient\(140\%_146\%_at_93\%_14\%\,\#72FE7D\,rgba\(114\,254\,125\,0\)_50\%\)\,radial-gradient\(126\%_82\%_at_56\%_100\%\,\#FD3A4E\,rgba\(253\,58\,78\,0\)_50\%\)\,radial-gradient\(131\%_124\%_at_11\%_35\%\,\#855AFC\,rgba\(133\,90\,252\,0\)_50\%\)\,radial-gradient\(117\%_77\%_at_100\%_100\%\,\#E4C795\,rgba\(228\,199\,149\,0\)_50\%\)\,radial-gradient\(86\%_74\%_at_40\%_59\%\,\#3A8BFD\,rgba\(58\,139\,253\,0\)_50\%\)\,radial-gradient\(115\%_96\%_at_42\%_69\%\,\#EEA5BA\,rgba\(238\,165\,186\,0\)_50\%\)\]{background-image:radial-gradient(140% 146% at 93% 14%,#72fe7d,#72fe7d00 50%),radial-gradient(126% 82% at 56% 100%,#fd3a4e,#fd3a4e00 50%),radial-gradient(131% 124% at 11% 35%,#855afc,#855afc00 50%),radial-gradient(117% 77% at 100% 100%,#e4c795,#e4c79500 50%),radial-gradient(86% 74% at 40% 59%,#3a8bfd,#3a8bfd00 50%),radial-gradient(115% 96% at 42% 69%,#eea5ba,#eea5ba00 50%)}.\[background-image\:radial-gradient\(140\%_146\%_at_93\%_14\%\,\#F6DEAE\,rgba\(246\,222\,174\,0\)_50\%\)\,radial-gradient\(126\%_82\%_at_56\%_100\%\,\#94704C\,rgba\(148\,112\,76\,0\)_50\%\)\,radial-gradient\(131\%_124\%_at_11\%_35\%\,\#3A8BFD\,rgba\(58\,139\,253\,0\)_45\%\)\,radial-gradient\(117\%_77\%_at_100\%_100\%\,\#C28E52\,rgba\(194\,142\,82\,0\)_50\%\)\,radial-gradient\(86\%_74\%_at_40\%_59\%\,\#855AFC\,rgba\(133\,90\,252\,0\)_40\%\)\]{background-image:radial-gradient(140% 146% at 93% 14%,#f6deae,#f6deae00 50%),radial-gradient(126% 82% at 56% 100%,#94704c,#94704c00 50%),radial-gradient(131% 124% at 11% 35%,#3a8bfd,#3a8bfd00 45%),radial-gradient(117% 77% at 100% 100%,#c28e52,#c28e5200 50%),radial-gradient(86% 74% at 40% 59%,#855afc,#855afc00 40%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#635BFF22\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#635bff22,#0000 50%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#855AFC22\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#855afc22,#0000 50%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#C28E5222\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#c28e5222,#0000 50%)}.\[background-image\:radial-gradient\(rgb\(163_163_163\)_1px\,transparent_1px\)\]{background-image:radial-gradient(#a3a3a3 1px,#0000 1px)}.bg-\[conic-gradient\(from_-66deg\,\#855AFC_-32deg\,\#f00_63deg\,\#EAB308_158deg\,\#5CFF80_240deg\,\#855AFC_328deg\,\#f00_423deg\)\],.bg-\[conic-gradient\(from_-66deg_at_50\%_50\%\,\#855AFC_-32deg\,\#f00_63deg\,\#EAB308_158deg\,\#5CFF80_240deg\,\#855AFC_328deg\,\#f00_423deg\)\]{background-image:conic-gradient(from -66deg,#855afc -32deg,red 63deg,#eab308 158deg,#5cff80 240deg,#855afc 328deg,red 423deg)}.bg-\[conic-gradient\(from_90deg\,\#F00_5deg\,\#EAB308_63deg\,\#5CFF80_115deg\,\#1E00FF_170deg\,\#855AFC_220deg\,\#3A8BFD_286deg\,\#F00_360deg\)\]{background-image:conic-gradient(from 90deg,red 5deg,#eab308 63deg,#5cff80 115deg,#1e00ff 170deg,#855afc 220deg,#3a8bfd 286deg,red 360deg)}.bg-\[conic-gradient\(from_220deg_at_50\%_50\%\,\#FF0000_0\%\,\#EAB308_17\%\,\#1E00FF_31\%\,\#5CFF80_46\%\,\#855AFC_60\%\,\#3A8BFD_78\%\,\#FF0000_100\%\)\]{background-image:conic-gradient(from 220deg,red 0%,#eab308 17%,#1e00ff 31%,#5cff80 46%,#855afc 60%,#3a8bfd 78%,red 100%)}.bg-\[conic-gradient\(from_270deg\,\#F4950C\,\#EB5C0C\,transparent\,transparent\)\]{background-image:conic-gradient(from 270deg,#f4950c,#eb5c0c,#0000,#0000)}.bg-\[conic-gradient\(from_279deg\,\#EAB308_47deg\,\#F00_121deg\,\#00FFF9_190deg\,\#855AFC_251deg\,\#3A8BFD_267deg\,\#A3ECB3_314deg\,\#EAB308_360deg\)\]{background-image:conic-gradient(from 279deg,#eab308 47deg,red 121deg,#00fff9 190deg,#855afc 251deg,#3a8bfd 267deg,#a3ecb3 314deg,#eab308 360deg)}.bg-\[linear-gradient\(90deg\,\#fff1\,\#fff4\)\]{background-image:linear-gradient(90deg,#fff1,#fff4)}.bg-\[linear-gradient\(90deg\,transparent\,\#0001\,transparent\)\]{background-image:linear-gradient(90deg,#0000,#0001,#0000)}.bg-\[linear-gradient\(to_right\,\#8080800a_1px\,transparent_1px\)\,linear-gradient\(to_bottom\,\#8080800a_1px\,transparent_1px\)\]{background-image:linear-gradient(90deg,#8080800a 1px,#0000 1px),linear-gradient(#8080800a 1px,#0000 1px)}.bg-\[linear-gradient\(to_right\,transparent\,white_10\%\)\]{background-image:linear-gradient(90deg,#0000,#fff 10%)}.bg-\[radial-gradient\(60\%_80\%_at_50\%_0\%\,\#ddd\,\#f5f5f5\)\]{background-image:radial-gradient(60% 80% at 50% 0,#ddd,#f5f5f5)}.bg-\[radial-gradient\(ellipse_at_top_right\,_var\(--tw-gradient-stops\)\)\]{background-image:radial-gradient(ellipse at top right, var(--tw-gradient-stops))}.bg-none{background-image:none}.from-\[\#006aff\]{--tw-gradient-from:#006aff;--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-\[\#DDD6FE\]\/40{--tw-gradient-from:oklab(89.4268% .0216931 -.0504127/.4);--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-\[\#DDD6FE\]\/50{--tw-gradient-from:oklab(89.4268% .0216931 -.0504127/.5);--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-\[\#F0ABFC\]\/45{--tw-gradient-from:oklab(83.3033% .10336 -.0824114/.45);--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-\[\#F0ABFC\]\/60{--tw-gradient-from:oklab(83.3033% .10336 -.0824114/.6);--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-\[\#F5F3FF\]{--tw-gradient-from:#f5f3ff;--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-\[\#fff8\]{--tw-gradient-from:#fff8;--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-\[\#fff_70\%\]{--tw-gradient-from:#fff 70%;--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-\[\#fff_75\%\]{--tw-gradient-from:#fff 75%;--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-black{--tw-gradient-from: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))}.from-black\/50{--tw-gradient-from:#00000080}@supports (color:color-mix(in lab, red, red)){.from-black\/50{--tw-gradient-from:color-mix(in oklab, var(--color-black) 50%, transparent)}}.from-black\/50{--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-50{--tw-gradient-from:var(--color-blue-50);--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{--tw-gradient-from:var(--color-blue-500);--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\/90{--tw-gradient-from:#3080ffe6}@supports (color:color-mix(in lab, red, red)){.from-blue-500\/90{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 90%, transparent)}}.from-blue-500\/90{--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-400{--tw-gradient-from:var(--color-cyan-400);--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{--tw-gradient-from:var(--color-cyan-500);--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-900\/30{--tw-gradient-from:#104e644d}@supports (color:color-mix(in lab, red, red)){.from-cyan-900\/30{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-900) 30%, transparent)}}.from-cyan-900\/30{--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-100\/80{--tw-gradient-from:#ecfccacc}@supports (color:color-mix(in lab, red, red)){.from-lime-100\/80{--tw-gradient-from:color-mix(in oklab, var(--color-lime-100) 80%, transparent)}}.from-lime-100\/80{--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-neutral-100{--tw-gradient-from:var(--color-neutral-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-neutral-200{--tw-gradient-from:var(--color-neutral-200);--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-neutral-900{--tw-gradient-from:var(--color-neutral-900);--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-neutral-900\/10{--tw-gradient-from:#1717171a}@supports (color:color-mix(in lab, red, red)){.from-neutral-900\/10{--tw-gradient-from:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.from-neutral-900\/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-neutral-950\/5{--tw-gradient-from:#0a0a0a0d}@supports (color:color-mix(in lab, red, red)){.from-neutral-950\/5{--tw-gradient-from:color-mix(in oklab, var(--color-neutral-950) 5%, transparent)}}.from-neutral-950\/5{--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-50{--tw-gradient-from:var(--color-orange-50);--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-slate-900{--tw-gradient-from:var(--color-slate-900);--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-slate-950{--tw-gradient-from:var(--color-slate-950);--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-50{--tw-gradient-from:var(--color-violet-50);--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\/90{--tw-gradient-from:#8d54ffe6}@supports (color:color-mix(in lab, red, red)){.from-violet-500\/90{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 90%, transparent)}}.from-violet-500\/90{--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-600{--tw-gradient-from:var(--color-violet-600);--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-white\/50{--tw-gradient-from:#ffffff80}@supports (color:color-mix(in lab, red, red)){.from-white\/50{--tw-gradient-from:color-mix(in oklab, var(--color-white) 50%, transparent)}}.from-white\/50{--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-5\%{--tw-gradient-from-position:5%}.from-40\%{--tw-gradient-from-position:40%}.from-60\%{--tw-gradient-from-position:60%}.via-\[\#00b2ff\]{--tw-gradient-via:#00b2ff;--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)}.via-\[\#E9D5FF\]\/25{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.25);--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)}.via-\[\#E9D5FF\]\/30{--tw-gradient-via:oklab(90.2359% .0361042 -.0484321/.3);--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)}.via-\[\#E9D5FF\]\/35{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.35);--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)}.via-\[\#E9D5FF\]\/45{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.45);--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)}.via-red-500{--tw-gradient-via:var(--color-red-500);--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)}.via-slate-200{--tw-gradient-via:var(--color-slate-200);--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)}.via-slate-900{--tw-gradient-via:var(--color-slate-900);--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)}.via-slate-900\/40{--tw-gradient-via:#0f172b66}@supports (color:color-mix(in lab, red, red)){.via-slate-900\/40{--tw-gradient-via:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.via-slate-900\/40{--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)}.via-slate-950{--tw-gradient-via:var(--color-slate-950);--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)}.via-teal-300{--tw-gradient-via:var(--color-teal-300);--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)}.via-white{--tw-gradient-via:var(--color-white);--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)}.via-white\/75{--tw-gradient-via:#ffffffbf}@supports (color:color-mix(in lab, red, red)){.via-white\/75{--tw-gradient-via:color-mix(in oklab, var(--color-white) 75%, transparent)}}.via-white\/75{--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)}.via-40\%{--tw-gradient-via-position:40%}.to-\[\#00d6ff\]{--tw-gradient-to:#00d6ff;--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-\[\#FDF2FA\]{--tw-gradient-to:#fdf2fa;--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-\[\#fff6\]{--tw-gradient-to:#fff6;--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-500{--tw-gradient-to:var(--color-blue-500);--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{--tw-gradient-to:var(--color-blue-600);--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-400{--tw-gradient-to:var(--color-cyan-400);--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-emerald-100\/80{--tw-gradient-to:#d0fae5cc}@supports (color:color-mix(in lab, red, red)){.to-emerald-100\/80{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-100) 80%, transparent)}}.to-emerald-100\/80{--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\/90{--tw-gradient-to:#4f39f6e6}@supports (color:color-mix(in lab, red, red)){.to-indigo-600\/90{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 90%, transparent)}}.to-indigo-600\/90{--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-neutral-50{--tw-gradient-to:var(--color-neutral-50);--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-neutral-100{--tw-gradient-to:var(--color-neutral-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))}.to-neutral-300{--tw-gradient-to:var(--color-neutral-300);--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-neutral-600{--tw-gradient-to:var(--color-neutral-600);--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{--tw-gradient-to:var(--color-pink-600);--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{--tw-gradient-to:var(--color-purple-600);--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\/90{--tw-gradient-to:#9810fae6}@supports (color:color-mix(in lab, red, red)){.to-purple-600\/90{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 90%, transparent)}}.to-purple-600\/90{--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{--tw-gradient-to:var(--color-red-600);--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-rose-500{--tw-gradient-to:var(--color-rose-500);--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-slate-950{--tw-gradient-to:var(--color-slate-950);--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-50\/90{--tw-gradient-to:#f0fdfae6}@supports (color:color-mix(in lab, red, red)){.to-teal-50\/90{--tw-gradient-to:color-mix(in oklab, var(--color-teal-50) 90%, transparent)}}.to-teal-50\/90{--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-white{--tw-gradient-to: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))}.to-white\/0{--tw-gradient-to:#0000}@supports (color:color-mix(in lab, red, red)){.to-white\/0{--tw-gradient-to:color-mix(in oklab, var(--color-white) 0%, transparent)}}.to-white\/0{--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-40\%{--tw-gradient-to-position:40%}.\[mask-image\:linear-gradient\(\#000f_50\%\,\#0006\)\,linear-gradient\(90deg\,\#000f_50\%\,\#000a\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0006),linear-gradient(90deg,#000 50%,#000a);mask-image:linear-gradient(#000 50%,#0006),linear-gradient(90deg,#000 50%,#000a)}.\[mask-image\:linear-gradient\(\#0006\,\#0006_25\%\,transparent_40\%\)\]{-webkit-mask-image:linear-gradient(#0006,#0006 25%,#0000 40%);mask-image:linear-gradient(#0006,#0006 25%,#0000 40%)}.\[mask-image\:linear-gradient\(0deg\,transparent\,black_45px\)\]{-webkit-mask-image:linear-gradient(0deg,#0000,#000 45px);mask-image:linear-gradient(0deg,#0000,#000 45px)}.\[mask-image\:linear-gradient\(45deg\,black_50\%\,\#0003_100\%\)\]{-webkit-mask-image:linear-gradient(45deg,#000 50%,#0003 100%);mask-image:linear-gradient(45deg,#000 50%,#0003 100%)}.\[mask-image\:linear-gradient\(90deg\,black_50\%\,\#0003_100\%\)\]{-webkit-mask-image:linear-gradient(90deg,#000 50%,#0003 100%);mask-image:linear-gradient(90deg,#000 50%,#0003 100%)}.\[mask-image\:linear-gradient\(90deg\,black_50\%\,transparent_50\%\)\]{-webkit-mask-image:linear-gradient(90deg,#000 50%,#0000 50%);mask-image:linear-gradient(90deg,#000 50%,#0000 50%)}.\[mask-image\:linear-gradient\(90deg\,black_70\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000 70%,#0000);mask-image:linear-gradient(90deg,#000 70%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000);mask-image:linear-gradient(90deg,#0000,#000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000,#0000);mask-image:linear-gradient(90deg,#0000,#000,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black_8\%\,black_92\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000);mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black_10\%\,black_90\%\,transparent\)\,linear-gradient\(transparent\,black_10\%\,black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 10% 90%,#0000),linear-gradient(#0000,#000 10% 90%,#0000);mask-image:linear-gradient(90deg,#0000,#000 10% 90%,#0000),linear-gradient(#0000,#000 10% 90%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent_40\%\,black\)\]{-webkit-mask-image:linear-gradient(90deg,#0000 40%,#000);mask-image:linear-gradient(90deg,#0000 40%,#000)}.\[mask-image\:linear-gradient\(90deg\,transparent_50\%\,black_50\%\)\]{-webkit-mask-image:linear-gradient(90deg,#0000 50%,#000 50%);mask-image:linear-gradient(90deg,#0000 50%,#000 50%)}.\[mask-image\:linear-gradient\(270deg\,transparent\,black_8px\)\]{-webkit-mask-image:linear-gradient(270deg,#0000,#000 8px);mask-image:linear-gradient(270deg,#0000,#000 8px)}.\[mask-image\:linear-gradient\(black\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.\[mask-image\:linear-gradient\(black\,transparent_280px\)\]{-webkit-mask-image:linear-gradient(#000,#0000 280px);mask-image:linear-gradient(#000,#0000 280px)}.\[mask-image\:linear-gradient\(black\,transparent_320px\)\,linear-gradient\(90deg\,transparent\,black_5\%\,black_95\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000 320px),linear-gradient(90deg,#0000,#000 5% 95%,#0000);mask-image:linear-gradient(#000,#0000 320px),linear-gradient(90deg,#0000,#000 5% 95%,#0000)}.\[mask-image\:linear-gradient\(black_50\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0000);mask-image:linear-gradient(#000 50%,#0000)}.\[mask-image\:linear-gradient\(black_50\%\,transparent_90\%\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0000 90%);mask-image:linear-gradient(#000 50%,#0000 90%)}.\[mask-image\:linear-gradient\(black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 60%,#0000);mask-image:linear-gradient(#000 60%,#0000)}.\[mask-image\:linear-gradient\(black_70\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 70%,#0000);mask-image:linear-gradient(#000 70%,#0000)}.\[mask-image\:linear-gradient\(black_80\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 80%,#0000);mask-image:linear-gradient(#000 80%,#0000)}.\[mask-image\:linear-gradient\(black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 90%,#0000);mask-image:linear-gradient(#000 90%,#0000)}.\[mask-image\:linear-gradient\(to_bottom\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.\[mask-image\:linear-gradient\(to_right\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\[mask-image\:linear-gradient\(to_right\,transparent\,black_20\%\,black_80\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 20% 80%,#0000);mask-image:linear-gradient(90deg,#0000,#000 20% 80%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000,#0000);mask-image:linear-gradient(#0000,#000,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_5\%\,black_95\%\,transparent\)\,linear-gradient\(90deg\,transparent\,black_5\%\,black_95\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 5% 95%,#0000),linear-gradient(90deg,#0000,#000 5% 95%,#0000);mask-image:linear-gradient(#0000,#000 5% 95%,#0000),linear-gradient(90deg,#0000,#000 5% 95%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_10\%\,black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 10% 90%,#0000);mask-image:linear-gradient(#0000,#000 10% 90%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_15\%\,black_85\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 15% 85%,#0000);mask-image:linear-gradient(#0000,#000 15% 85%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_30\%\)\]{-webkit-mask-image:linear-gradient(#0000,#000 30%);mask-image:linear-gradient(#0000,#000 30%)}.\[mask-image\:linear-gradient\(transparent\,black_70\%\)\]{-webkit-mask-image:linear-gradient(#0000,#000 70%);mask-image:linear-gradient(#0000,#000 70%)}.\[mask-image\:radial-gradient\(40\%_80\%\,transparent_50\%\,black\)\]{-webkit-mask-image:radial-gradient(40% 80%,#0000 50%,#000);mask-image:radial-gradient(40% 80%,#0000 50%,#000)}.\[mask-image\:radial-gradient\(70\%_100\%_at_50\%_0\%\,_black_70\%\,_transparent\)\]{-webkit-mask-image:radial-gradient(70% 100% at 50% 0,#000 70%,#0000);mask-image:radial-gradient(70% 100% at 50% 0,#000 70%,#0000)}.\[mask-image\:radial-gradient\(70\%_100\%_at_50\%_0\%\,black_30\%\,transparent\)\]{-webkit-mask-image:radial-gradient(70% 100% at 50% 0,#000 30%,#0000);mask-image:radial-gradient(70% 100% at 50% 0,#000 30%,#0000)}.\[mask-image\:radial-gradient\(70\%_120\%_at_50\%_100\%\,black_50\%\,transparent\)\]{-webkit-mask-image:radial-gradient(70% 120% at 50% 100%,#000 50%,#0000);mask-image:radial-gradient(70% 120% at 50% 100%,#000 50%,#0000)}.\[mask-image\:radial-gradient\(100\%_100\%_at_100\%_0\%\,black_30\%\,transparent\)\]{-webkit-mask-image:radial-gradient(100% 100% at 100% 0,#000 30%,#0000);mask-image:radial-gradient(100% 100% at 100% 0,#000 30%,#0000)}.\[mask-image\:radial-gradient\(black\,transparent\)\]{-webkit-mask-image:radial-gradient(#000,#0000);mask-image:radial-gradient(#000,#0000)}.\[mask-image\:radial-gradient\(closest-side\,black_100\%\,transparent_100\%\)\]{-webkit-mask-image:radial-gradient(closest-side,#000 100%,#0000 100%);mask-image:radial-gradient(closest-side,#000 100%,#0000 100%)}.\[mask-image\:radial-gradient\(ellipse_60\%_50\%_at_50\%_0\%\,\#000_70\%\,transparent_100\%\)\]{-webkit-mask-image:radial-gradient(60% 50% at 50% 0,#000 70%,#0000 100%);mask-image:radial-gradient(60% 50% at 50% 0,#000 70%,#0000 100%)}.\[mask-image\:radial-gradient\(ellipse_95\%_85\%_at_50\%_42\%\,\#000_0\%\,transparent_68\%\)\]{-webkit-mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%);mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%)}.\[mask-image\:radial-gradient\(transparent\,black\)\]{-webkit-mask-image:radial-gradient(#0000,#000);mask-image:radial-gradient(#0000,#000)}.\[background-size\:4px_4px\]{background-size:4px 4px}.bg-\[size\:14px_24px\]{background-size:14px 24px}.bg-cover{background-size:cover}.bg-clip-border{background-clip:border-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-center{background-position:50%}.\[mask-composite\:intersect\]{-webkit-mask-composite:source-in;-webkit-mask-composite:source-in;mask-composite:intersect}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.\[mask-origin\:padding-box\]{-webkit-mask-origin:padding-box;mask-origin:padding-box}.fill-current{fill:currentColor}.fill-green-500{fill:var(--color-green-500)}.fill-white{fill:var(--color-white)}.stroke-neutral-200{stroke:var(--color-neutral-200)}.stroke-neutral-900{stroke:var(--color-neutral-900)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-center{object-position:center}.object-left{object-position:left}.object-left-top{object-position:left top}.object-right-bottom{object-position:right bottom}.object-top{object-position:top}.\!p-0{padding:calc(var(--spacing) * 0)!important}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-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-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.p-16{padding:calc(var(--spacing) * 16)}.p-20{padding:calc(var(--spacing) * 20)}.p-px{padding:1px}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.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-10{padding-inline:calc(var(--spacing) * 10)}.px-12{padding-inline:calc(var(--spacing) * 12)}.px-16{padding-inline:calc(var(--spacing) * 16)}.px-20{padding-inline:calc(var(--spacing) * 20)}.px-32{padding-inline:calc(var(--spacing) * 32)}.px-px{padding-inline:1px}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.py-\[0\.2rem\]{padding-block:.2rem}.py-px{padding-block:1px}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.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-10{padding-top:calc(var(--spacing) * 10)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[88px\]{padding-top:88px}.pt-\[var\(--page-top-margin\)\]{padding-top:var(--page-top-margin)}.pt-px{padding-top:1px}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.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-3\.5{padding-right:calc(var(--spacing) * 3.5)}.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-10{padding-right:calc(var(--spacing) * 10)}.pr-11{padding-right:calc(var(--spacing) * 11)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pr-24{padding-right:calc(var(--spacing) * 24)}.pr-\[72px\]{padding-right:72px}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.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-8{padding-bottom:calc(var(--spacing) * 8)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.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-\[var\(--page-bottom-margin\)\]{padding-bottom:var(--page-bottom-margin)}.pb-px{padding-bottom:1px}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.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-7{padding-left:calc(var(--spacing) * 7)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-\[30px\]{padding-left:30px}.pl-\[52px\]{padding-left:52px}.pl-px{padding-left:1px}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-text-top{vertical-align:text-top}.font-\[\'Bricolage_Grotesque\'\]{font-family:Bricolage Grotesque}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.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-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--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\.5rem\]{font-size:.5rem}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.8em\]{font-size:.8em}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[7\.5px\]{font-size:7.5px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.leading-0{--tw-leading:calc(var(--spacing) * 0);line-height:calc(var(--spacing) * 0)}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.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-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-\[14\.30px\]{--tw-leading:14.3px;line-height:14.3px}.leading-\[14px\]{--tw-leading:14px;line-height:14px}.leading-\[16px\]{--tw-leading:16px;line-height:16px}.leading-\[20px\]{--tw-leading:20px;line-height:20px}.leading-\[48px\]{--tw-leading:48px;line-height:48px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.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-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.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-wider{--tw-tracking:calc(var(--tracking-wider) * -1);letter-spacing:calc(var(--tracking-wider) * -1)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.24px\]{--tw-tracking:-.24px;letter-spacing:-.24px}.tracking-\[-0\.28px\]{--tw-tracking:-.28px;letter-spacing:-.28px}.tracking-\[-0\.32px\]{--tw-tracking:-.32px;letter-spacing:-.32px}.tracking-\[-0\.36px\]{--tw-tracking:-.36px;letter-spacing:-.36px}.tracking-\[-0\.96px\]{--tw-tracking:-.96px;letter-spacing:-.96px}.tracking-\[0\.2px\]{--tw-tracking:.2px;letter-spacing:.2px}.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-pretty{text-wrap:pretty}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-blue-700{color:var(--color-blue-700)!important}.\!text-orange-500{color:var(--color-orange-500)!important}.text-\[\#000000E6\]{color:#000000e6}.text-\[\#1B1B18\]{color:#1b1b18}.text-\[\#1F2937\]{color:#1f2937}.text-\[\#1b1b18\]{color:#1b1b18}.text-\[\#1d2129\]{color:#1d2129}.text-\[\#2a5bd7\]{color:#2a5bd7}.text-\[\#7B3AFF\]{color:#7b3aff}.text-\[\#9A3412\]{color:#9a3412}.text-\[\#34a2f1\]{color:#34a2f1}.text-\[\#00000099\]{color:#0009}.text-\[\#706f6c\]{color:#706f6c}.text-\[\#3730A3\]{color:#3730a3}.text-\[\#4783cf\]{color:#4783cf}.text-\[\#166534\]{color:#166534}.text-\[\#273144\]{color:#273144}.text-\[\#606770\]{color:#606770}.text-\[\#CE00FF\]{color:#ce00ff}.text-\[\#D60000\]{color:#d60000}.text-\[\#F3BEC7\]{color:#f3bec7}.text-\[\#F8B803\]{color:#f8b803}.text-\[\#F53003\]{color:#f53003}.text-\[\#FF4D00\]{color:#ff4d00}.text-\[\#f53003\]{color:#f53003}.text-\[var\(--brand\)\]{color:var(--brand)}.text-\[var\(--brand\,\#8e51ff\)\]{color:var(--brand,#8e51ff)}.text-\[var\(--color\)\]{color:var(--color)}.text-amber-400{color:var(--color-amber-400)}.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-black{color:var(--color-black)}.text-black\/10{color:#0000001a}@supports (color:color-mix(in lab, red, red)){.text-black\/10{color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.text-black\/30{color:#0000004d}@supports (color:color-mix(in lab, red, red)){.text-black\/30{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.text-black\/80{color:#000c}@supports (color:color-mix(in lab, red, red)){.text-black\/80{color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.text-blue-500{color:var(--color-blue-500)}.text-blue-500\/50{color:#3080ff80}@supports (color:color-mix(in lab, red, red)){.text-blue-500\/50{color:color-mix(in oklab, var(--color-blue-500) 50%, transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-blue-900\/80{color:#1c398ecc}@supports (color:color-mix(in lab, red, red)){.text-blue-900\/80{color:color-mix(in oklab, var(--color-blue-900) 80%, transparent)}}.text-current{color:currentColor}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-700{color:var(--color-cyan-700)}.text-cyan-900{color:var(--color-cyan-900)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-600\/80{color:#009767cc}@supports (color:color-mix(in lab, red, red)){.text-emerald-600\/80{color:color-mix(in oklab, var(--color-emerald-600) 80%, transparent)}}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.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-gray-950{color:var(--color-gray-950)}.text-green-500{color:var(--color-green-500)}.text-green-500\/50{color:#00c75880}@supports (color:color-mix(in lab, red, red)){.text-green-500\/50{color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.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-lime-500{color:var(--color-lime-500)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-400\/10{color:#a1a1a11a}@supports (color:color-mix(in lab, red, red)){.text-neutral-400\/10{color:color-mix(in oklab, var(--color-neutral-400) 10%, transparent)}}.text-neutral-400\/70{color:#a1a1a1b3}@supports (color:color-mix(in lab, red, red)){.text-neutral-400\/70{color:color-mix(in oklab, var(--color-neutral-400) 70%, transparent)}}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-500\/80{color:#737373cc}@supports (color:color-mix(in lab, red, red)){.text-neutral-500\/80{color:color-mix(in oklab, var(--color-neutral-500) 80%, transparent)}}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-600\/70{color:#525252b3}@supports (color:color-mix(in lab, red, red)){.text-neutral-600\/70{color:color-mix(in oklab, var(--color-neutral-600) 70%, transparent)}}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-700\/80{color:#404040cc}@supports (color:color-mix(in lab, red, red)){.text-neutral-700\/80{color:color-mix(in oklab, var(--color-neutral-700) 80%, transparent)}}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-neutral-900\/40{color:#17171766}@supports (color:color-mix(in lab, red, red)){.text-neutral-900\/40{color:color-mix(in oklab, var(--color-neutral-900) 40%, transparent)}}.text-neutral-950{color:var(--color-neutral-950)}.text-orange-400\/50{color:#ff8b1a80}@supports (color:color-mix(in lab, red, red)){.text-orange-400\/50{color:color-mix(in oklab, var(--color-orange-400) 50%, transparent)}}.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-orange-900{color:var(--color-orange-900)}.text-orange-900\/80{color:#7e2a0ccc}@supports (color:color-mix(in lab, red, red)){.text-orange-900\/80{color:color-mix(in oklab, var(--color-orange-900) 80%, transparent)}}.text-pink-500{color:var(--color-pink-500)}.text-pink-500\/50{color:#f6339a80}@supports (color:color-mix(in lab, red, red)){.text-pink-500\/50{color:color-mix(in oklab, var(--color-pink-500) 50%, transparent)}}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-purple-400{color:var(--color-purple-400)}.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-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-500\/50{color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.text-red-500\/50{color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.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-sky-500{color:var(--color-sky-500)}.text-sky-600{color:var(--color-sky-600)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-400{color:var(--color-teal-400)}.text-teal-400\/50{color:#00d3bd80}@supports (color:color-mix(in lab, red, red)){.text-teal-400\/50{color:color-mix(in oklab, var(--color-teal-400) 50%, transparent)}}.text-teal-500{color:var(--color-teal-500)}.text-teal-700{color:var(--color-teal-700)}.text-transparent{color:#0000}.text-violet-200{color:var(--color-violet-200)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-600\/50{color:#7f22fe80}@supports (color:color-mix(in lab, red, red)){.text-violet-600\/50{color:color-mix(in oklab, var(--color-violet-600) 50%, transparent)}}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-white{color:var(--color-white)}.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-yellow-500{color:var(--color-yellow-500)}.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-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.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,)}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-gray-400\/50{text-decoration-color:#99a1af80}@supports (color:color-mix(in lab, red, red)){.decoration-gray-400\/50{-webkit-text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent);text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent)}}.decoration-neutral-300{-webkit-text-decoration-color:var(--color-neutral-300);-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.decoration-neutral-300\/70{text-decoration-color:#d4d4d4b3}@supports (color:color-mix(in lab, red, red)){.decoration-neutral-300\/70{-webkit-text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent);text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent)}}.decoration-neutral-400{-webkit-text-decoration-color:var(--color-neutral-400);-webkit-text-decoration-color:var(--color-neutral-400);text-decoration-color:var(--color-neutral-400)}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.placeholder-amber-300::placeholder{color:var(--color-amber-300)}.placeholder-neutral-300::placeholder{color:var(--color-neutral-300)}.placeholder-neutral-400::placeholder{color:var(--color-neutral-400)}.placeholder-red-300::placeholder{color:var(--color-red-300)}.placeholder-slate-500::placeholder{color:var(--color-slate-500)}.opacity-0{opacity:0}.opacity-1{opacity:.01}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-15{opacity:.15}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.opacity-100{opacity:1}.opacity-\[0\.4\]{opacity:.4}.opacity-\[calc\(1-max\(var\(--dx\)\,-1\*var\(--dx\)\)\/var\(--w\)\/2\)\]{opacity:calc(1 - max(var(--dx), -1 * var(--dx)) / var(--w) / 2)}.opacity-\[var\(--opacity\)\]{opacity:var(--opacity)}.mix-blend-color{mix-blend-mode:color}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-soft-light{mix-blend-mode:soft-light}.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_black_inset\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,black) inset;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_2px_2px_0_\#00000014\]{--tw-shadow:0 2px 2px 0 var(--tw-shadow-color,#00000014);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_4px_12px_\#0000001a\]{--tw-shadow:0 4px 12px 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-\[0_4px_12px_\#0001\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0001);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_4px_12px_0_\#0000000D\]{--tw-shadow:0 4px 12px 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)}.shadow-\[0_8px_28px_0_\#00000017\]{--tw-shadow:0 8px 28px 0 var(--tw-shadow-color,#00000017);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_12px_20px_0_\#00000026_inset\,0_2px_5px_0_\#00000026_inset\,0_2px_13px_2px_\#FFFFFF59\]{--tw-shadow:0 12px 20px 0 var(--tw-shadow-color,#00000026) inset, 0 2px 5px 0 var(--tw-shadow-color,#00000026) inset, 0 2px 13px 2px var(--tw-shadow-color,#ffffff59);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_20px_20px_0_\#00000017\]{--tw-shadow:0 20px 20px 0 var(--tw-shadow-color,#00000017);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_0px_1px_0px_rgba\(0\,0\,0\,0\.03\)\,0px_1px_2px_0px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0px 0px 1px 0px var(--tw-shadow-color,#00000008), 0px 1px 2px 0px var(--tw-shadow-color,#0000000f);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_0px_2px_0px_rgba\(0\,0\,0\,0\.05\)\,0px_2px_6px_0px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow:0px 0px 2px 0px var(--tw-shadow-color,#0000000d), 0px 2px 6px 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-\[0px_1px_3px_0px_\#0000000F\,_0px_4px_14px_0px_\#00000014\]{--tw-shadow:0px 1px 3px 0px var(--tw-shadow-color,#0000000f), 0px 4px 14px 0px var(--tw-shadow-color,#00000014);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_0_0_0_1px_\#0003\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0003);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_0_0_0_1px_\#00000019\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#00000019);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_0_0_1px_1px_\#fff\]{--tw-shadow:inset 0 0 1px 1px var(--tw-shadow-color,#fff);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_0px_0px_1px_rgba\(26\,26\,0\,0\.16\)\]{--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#1a1a0029);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 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)}.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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!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}.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)}.ring-4{--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)}.ring-\[3px\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + 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-\[6px\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(6px + 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-neutral-900\/15{--tw-shadow-color:#17171726}@supports (color:color-mix(in lab, red, red)){.shadow-neutral-900\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-neutral-900\/30{--tw-shadow-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.shadow-neutral-900\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-pink-500\/10{--tw-shadow-color:#f6339a1a}@supports (color:color-mix(in lab, red, red)){.shadow-pink-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-pink-500) 10%, transparent) var(--tw-shadow-alpha), 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\/10{--tw-ring-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.ring-black\/10{--tw-ring-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.ring-blue-500\/40{--tw-ring-color:#3080ff66}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 40%, transparent)}}.ring-current{--tw-ring-color:currentcolor}.ring-emerald-400\/30{--tw-ring-color:#00d2944d}@supports (color:color-mix(in lab, red, red)){.ring-emerald-400\/30{--tw-ring-color:color-mix(in oklab, var(--color-emerald-400) 30%, transparent)}}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-gray-950\/5{--tw-ring-color:#0307120d}@supports (color:color-mix(in lab, red, red)){.ring-gray-950\/5{--tw-ring-color:color-mix(in oklab, var(--color-gray-950) 5%, transparent)}}.ring-neutral-200{--tw-ring-color:var(--color-neutral-200)}.ring-neutral-200\/80{--tw-ring-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.ring-neutral-200\/80{--tw-ring-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.ring-neutral-500{--tw-ring-color:var(--color-neutral-500)}.ring-neutral-600{--tw-ring-color:var(--color-neutral-600)}.ring-neutral-900{--tw-ring-color:var(--color-neutral-900)}.ring-neutral-950{--tw-ring-color:var(--color-neutral-950)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-400{--tw-ring-color:var(--color-red-400)}.ring-red-500{--tw-ring-color:var(--color-red-500)}.ring-red-500\/30{--tw-ring-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/30{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-2{--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)}.ring-offset-\[3px\]{--tw-ring-offset-width:3px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.-outline-offset-1{outline-offset:calc(1px * -1)}.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,)}.blur-2xl{--tw-blur:blur(var(--blur-2xl));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,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));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,)}.blur-\[2px\]{--tw-blur:blur(2px);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,)}.blur-\[3px\]{--tw-blur:blur(3px);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,)}.blur-\[40px\]{--tw-blur:blur(40px);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,)}.blur-\[50px\]{--tw-blur:blur(50px);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,)}.blur-\[60px\]{--tw-blur:blur(60px);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,)}.blur-\[100px\]{--tw-blur:blur(100px);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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-lg{--tw-blur:blur(var(--blur-lg));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,)}.blur-sm{--tw-blur:blur(var(--blur-sm));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,)}.blur-xl{--tw-blur:blur(var(--blur-xl));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,)}.brightness-0{--tw-brightness:brightness(0%);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.drop-shadow-\[0_0_15px_rgb\(from_var\(--brand-dark\,\#000\)_r_g_b\/0\.4\)\]{--tw-drop-shadow-size:drop-shadow(0 0 15px var(--tw-drop-shadow-color,rgb(from var(--brand-dark,#000) r g b/.4)));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_2px_4px_\#EA590D80\]{--tw-drop-shadow-size:drop-shadow(0 2px 4px var(--tw-drop-shadow-color,#ea590d80));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));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,)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));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,)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));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,)}.grayscale{--tw-grayscale:grayscale(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,)}.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,)}.saturate-150{--tw-saturate:saturate(150%);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,)}.saturate-\[1\.5\]{--tw-saturate:saturate(1.5);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,)}.saturate-\[2\]{--tw-saturate:saturate(2);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,)}.saturate-\[3\]{--tw-saturate:saturate(3);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\:drop-shadow\(0_1px_2px_\#0002\)_drop-shadow\(0_4px_8px_\#0002\)\]{filter:drop-shadow(0 1px 2px #0002)drop-shadow(0 4px 8px #0002)}.\[filter\:drop-shadow\(0_5px_8px_\#222A351d\)\]{filter:drop-shadow(0 5px 8px #222a351d)}.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-\[1px\]{--tw-backdrop-blur:blur(1px);-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-\[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-\[20px\]{--tw-backdrop-blur:blur(20px);-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-\[50px\]{--tw-backdrop-blur:blur(50px);-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-\[100px\]{--tw-backdrop-blur:blur(100px);-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-md{--tw-backdrop-blur:blur(var(--blur-md));-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-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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-\[backdrop-filter\,opacity\]{transition-property:-webkit-backdrop-filter,backdrop-filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,backdrop-filter\]{transition-property:background-color,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,color\,font-weight\]{transition-property:background-color,color,font-weight;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,opacity\]{transition-property:background-color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,transform\,opacity\]{transition-property:background-color,transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,transform\]{transition-property:background-color,transform;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\]{transition-property:border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\]{transition-property:border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-spacing\,margin-top\]{transition-property:border-spacing,margin-top;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[box-shadow\,transform\]{transition-property:box-shadow,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[box-shadow\]{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,transform\]{transition-property:color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[colors\,opacity\]{transition-property:colors,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\,opacity\]{transition-property:filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-columns\,grid-template-rows\]{transition-property:grid-template-columns,grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\,opacity\]{transition-property:grid-template-rows,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\,opacity\]{transition-property:height,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[max-width\]{transition-property:max-width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,background-color\]{transition-property:opacity,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,display\]{transition-property:opacity,display;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,transform\]{transition-property:opacity,transform;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\,background-color\,color\]{transition-property:transform,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,background-color\]{transition-property:transform,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,color\]{transition-property:transform,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,opacity\]{transition-property:transform,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;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\]{transition-property:width,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,opacity\]{transition-property:width,opacity;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-shadow{transition-property:box-shadow;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))}.transition-none{transition-property:none}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-400{transition-delay:.4s}.delay-\[0s\,150ms\]{transition-delay:0s,.15s}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-750{--tw-duration:.75s;transition-duration:.75s}.duration-\[50ms\]{--tw-duration:50ms;transition-duration:50ms}.duration-\[150ms\,0s\]{--tw-duration:.15s,0s;transition-duration:.15s,0s}.duration-\[300ms\]{--tw-duration:.3s;transition-duration:.3s}.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-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[--from-scale\:1\]{--from-scale:1}.\[--logo-size\:32px\]{--logo-size:32px}.\[--offset\:5px\]{--offset:5px}.\[--offset\:8px\]{--offset:8px}.\[--offset\:10px\]{--offset:10px}.\[--offset\:20px\]{--offset:20px}.\[--page-bottom-margin\:0px\]{--page-bottom-margin:0px}.\[--page-height\:calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{--page-height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.\[--page-top-margin\:0px\]{--page-top-margin:0px}.\[--scroll\:-100\%\]{--scroll:-100%}.\[--sheet-width\:720px\]{--sheet-width:720px}.\[--sheet-width\:940px\]{--sheet-width:940px}.\[--stroke-color\:\#1B1B18\]{--stroke-color:#1b1b18}.\[--thumb-radius\:10px\]{--thumb-radius:10px}.\[--to-scale\:1\.2\]{--to-scale:1.2}.\[--track-color\:\#fff3\]{--track-color:#fff3}.\[--track-height\:14px\]{--track-height:14px}.\[-webkit-mask-image\:radial-gradient\(ellipse_95\%_85\%_at_50\%_42\%\,\#000_0\%\,transparent_68\%\)\]{-webkit-mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%)}.\[animation-delay\:-0\.3s\]{animation-delay:-.3s}.\[animation-delay\:-0\.15s\]{animation-delay:-.15s}.\[animation-delay\:0\.2s\]{animation-delay:.2s}.\[animation-delay\:0\.3s\]{animation-delay:.3s}.\[animation-delay\:0\.4s\]{animation-delay:.4s}.\[animation-delay\:0\.15s\]{animation-delay:.15s}.\[animation-delay\:1\.9s\]{animation-delay:1.9s}.\[animation-delay\:2\.3s\]{animation-delay:2.3s}.\[animation-delay\:2s\]{animation-delay:2s}.\[animation-delay\:50ms\]{animation-delay:50ms}.\[animation-delay\:100ms\]{animation-delay:.1s}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:200ms\]{animation-delay:.2s}.\[animation-delay\:250ms\]{animation-delay:.25s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[animation-delay\:400ms\]{animation-delay:.4s}.\[animation-delay\:450ms\]{animation-delay:.45s}.\[animation-delay\:500ms\]{animation-delay:.5s}.\[animation-delay\:750ms\]{animation-delay:.75s}.\[animation-direction\:alternate\]{animation-direction:alternate}.\[animation-direction\:reverse\]{animation-direction:reverse}.\[animation-duration\:0\.2s\]{animation-duration:.2s}.\[animation-duration\:0\.5s\]{animation-duration:.5s}.\[animation-duration\:0\.25s\]{animation-duration:.25s}.\[animation-duration\:1\.3s\]{animation-duration:1.3s}.\[animation-duration\:1\.5s\]{animation-duration:1.5s}.\[animation-duration\:1s\]{animation-duration:1s}.\[animation-duration\:40s\]{animation-duration:40s}.\[animation-duration\:150ms\]{animation-duration:.15s}.\[animation-fill-mode\:both\]{animation-fill-mode:both}.\[animation-fill-mode\:forwards\]{animation-fill-mode:forwards}.\[animation-iteration-count\:2\]{animation-iteration-count:2}.\[animation-timing-function\:ease-in-out\]{animation-timing-function:ease-in-out}.\[perspective\:500px\]{perspective:500px}.\[stop-opacity\:0\.3\]{stop-opacity:.3}.\[stop-opacity\:0\.23\]{stop-opacity:.23}.\[transform-box\:fill-box\]{transform-box:fill-box}.\[vector-effect\:non-scaling-stroke\]{vector-effect:non-scaling-stroke}.ring-inset{--tw-ring-inset:inset}.not-has-\[nav\]\:hidden:not(:has(:is(nav))){display:none}.group-first\:block:is(:where(.group):first-child *){display:block}@media (hover:hover){.group-hover\:pointer-events-auto:is(:where(.group):hover *){pointer-events:auto}.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:w-3:is(:where(.group):hover *){width:calc(var(--spacing) * 3)}.group-hover\:w-\[82px\]:is(:where(.group):hover *){width:82px}.group-hover\:max-w-\[calc\(100\%-5rem\)\]:is(:where(.group):hover *){max-width:calc(100% - 5rem)}.group-hover\:-translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-x-14:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * -14);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-0:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-3:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-px:is(:where(.group):hover *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-0\.5:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-px:is(:where(.group):hover *){--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-y-0:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-90:is(:where(.group):hover *){--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:-rotate-12:is(:where(.group):hover *){rotate:-12deg}.group-hover\:rotate-12:is(:where(.group):hover *){rotate:12deg}.group-hover\:rotate-\[360deg\]:is(:where(.group):hover *){rotate:360deg}.group-hover\:border-neutral-200:is(:where(.group):hover *){border-color:var(--color-neutral-200)}.group-hover\:bg-neutral-100:is(:where(.group):hover *){background-color:var(--color-neutral-100)}.group-hover\:bg-neutral-200:is(:where(.group):hover *){background-color:var(--color-neutral-200)}.group-hover\:bg-neutral-300:is(:where(.group):hover *){background-color:var(--color-neutral-300)}.group-hover\:bg-neutral-400:is(:where(.group):hover *){background-color:var(--color-neutral-400)}.group-hover\:bg-red-500:is(:where(.group):hover *){background-color:var(--color-red-500)}.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-cyan-400:is(:where(.group):hover *){color:var(--color-cyan-400)}.group-hover\:text-gray-900:is(:where(.group):hover *){color:var(--color-gray-900)}.group-hover\:text-neutral-500:is(:where(.group):hover *){color:var(--color-neutral-500)}.group-hover\:text-neutral-600:is(:where(.group):hover *){color:var(--color-neutral-600)}.group-hover\:text-neutral-800:is(:where(.group):hover *){color:var(--color-neutral-800)}.group-hover\:text-neutral-900:is(:where(.group):hover *){color:var(--color-neutral-900)}.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-0:is(:where(.group):hover *){opacity:0}.group-hover\:opacity-30:is(:where(.group):hover *){opacity:.3}.group-hover\:opacity-70:is(:where(.group):hover *){opacity:.7}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\:ring:is(:where(.group):hover *){--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)}.group-hover\:ring-\[8px\]:is(:where(.group):hover *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(8px + 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)}.group-hover\:blur-\[3px\]:is(:where(.group):hover *){--tw-blur:blur(3px);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,)}.group-hover\:blur-sm:is(:where(.group):hover *){--tw-blur:blur(var(--blur-sm));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,)}.group-hover\:drop-shadow-sm:is(:where(.group):hover *){--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));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,)}.group-hover\:grayscale-0:is(:where(.group):hover *){--tw-grayscale:grayscale(0%);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,)}.group-hover\:transition-transform:is(:where(.group):hover *){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))}.group-hover\:duration-500:is(:where(.group):hover *){--tw-duration:.5s;transition-duration:.5s}.group-hover\/add-tag\:grid-cols-\[1fr\]:is(:where(.group\/add-tag):hover *){grid-template-columns:1fr}.group-hover\/add-tag\:opacity-100:is(:where(.group\/add-tag):hover *){opacity:1}.group-hover\/button\:bg-neutral-100:is(:where(.group\/button):hover *){background-color:var(--color-neutral-100)}.group-hover\/chart\:translate-x-0:is(:where(.group\/chart):hover *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\/discountcode\:underline:is(:where(.group\/discountcode):hover *){text-decoration-line:underline}.group-hover\/empty\:opacity-100:is(:where(.group\/empty):hover *){opacity:1}.group-hover\/row\:pointer-events-auto:is(:where(.group\/row):hover *){pointer-events:auto}.group-hover\/row\:opacity-0:is(:where(.group\/row):hover *){opacity:0}.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *){opacity:1}}.group-focus-visible\:opacity-100:is(:where(.group):focus-visible *){opacity:1}.group-focus-visible\:ring:is(:where(.group):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)}.group-focus-visible\/add-tag\:grid-cols-\[1fr\]:is(:where(.group\/add-tag):focus-visible *){grid-template-columns:1fr}.group-focus-visible\/add-tag\:opacity-100:is(:where(.group\/add-tag):focus-visible *){opacity:1}.group-active\:scale-95:is(:where(.group):active *){--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-active\:bg-neutral-500:is(:where(.group):active *){background-color:var(--color-neutral-500)}.group-active\:ring-\[7px\]:is(:where(.group):active *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(7px + 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)}.group-active\/button\:scale-95:is(:where(.group\/button):active *){--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-active\/button\:border-neutral-300:is(:where(.group\/button):active *),.group-disabled\:border-neutral-300:is(:where(.group):disabled *){border-color:var(--color-neutral-300)}.group-disabled\:text-neutral-400:is(:where(.group):disabled *){color:var(--color-neutral-400)}.group-has-\[\+div\[data-\[touched\=true\]\]\]\:opacity-100:is(:where(.group):has() *){opacity:1}.group-data-\[active\=true\]\:rotate-180:is(:where(.group)[data-active=true] *){rotate:180deg}.group-data-\[active\=true\]\:text-blue-600:is(:where(.group)[data-active=true] *){color:var(--color-blue-600)}.group-data-\[checked\=true\]\:scale-100:is(:where(.group)[data-checked=true] *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-data-\[checked\=true\]\:opacity-100:is(:where(.group)[data-checked=true] *){opacity:1}.group-data-\[state\=open\]\:rotate-90:is(:where(.group)[data-state=open] *){rotate:90deg}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[touched\=true\]\:pointer-events-auto:is(:where(.group)[data-touched=true] *){pointer-events:auto}.group-data-\[touched\=true\]\:opacity-100:is(:where(.group)[data-touched=true] *){opacity:1}.group-data-\[variant\=compact\]\/card-list\:flex:is(:where(.group\/card-list)[data-variant=compact] *){display:flex}.group-data-\[variant\=compact\]\/card-list\:opacity-100:is(:where(.group\/card-list)[data-variant=compact] *){opacity:1}.group-data-\[variant\=loose\]\/card-list\:flex:is(:where(.group\/card-list)[data-variant=loose] *){display:flex}.group-data-\[variant\=loose\]\/card-list\:size-6:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.group-data-\[variant\=loose\]\/card-list\:size-10:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.group-data-\[variant\=loose\]\/card-list\:h-\[46px\]:is(:where(.group\/card-list)[data-variant=loose] *){height:46px}.group-data-\[variant\=loose\]\/card-list\:h-\[60px\]:is(:where(.group\/card-list)[data-variant=loose] *){height:60px}.group-data-\[variant\=loose\]\/card-list\:p-1:is(:where(.group\/card-list)[data-variant=loose] *){padding:calc(var(--spacing) * 1)}.group-data-\[variant\=loose\]\/card-list\:opacity-100:is(:where(.group\/card-list)[data-variant=loose] *){opacity:1}@media (hover:hover){.peer-hover\:opacity-5:is(:where(.peer):hover~*){opacity:.05}}.peer-focus-visible\:ring-offset-2:is(:where(.peer):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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.marker\:text-neutral-500 ::marker{color:var(--color-neutral-500)}.marker\:text-neutral-500::marker{color:var(--color-neutral-500)}.marker\:text-neutral-500 ::-webkit-details-marker{color:var(--color-neutral-500)}.marker\:text-neutral-500::-webkit-details-marker{color:var(--color-neutral-500)}.selection\:bg-cyan-500 ::selection{background-color:var(--color-cyan-500)}.selection\:bg-cyan-500::selection{background-color:var(--color-cyan-500)}.selection\:text-slate-900 ::selection{color:var(--color-slate-900)}.selection\:text-slate-900::selection{color:var(--color-slate-900)}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:-inset-x-1:before{content:var(--tw-content);inset-inline:calc(var(--spacing) * -1)}.before\:inset-y-0:before{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing) * 0)}.before\:top-1\/2:before{content:var(--tw-content);top:50%}.before\:bottom-0:before{content:var(--tw-content);bottom:calc(var(--spacing) * 0)}.before\:bottom-1\/2:before{content:var(--tw-content);bottom:50%}.before\:left-\[0\.4rem\]:before{content:var(--tw-content);left:.4rem}.before\:rounded:before{content:var(--tw-content);border-radius:.25rem}.before\:border-l:before{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:1px}.before\:border-\[\#e3e3e0\]:before{content:var(--tw-content);border-color:#e3e3e0}.before\:opacity-0:before{content:var(--tw-content);opacity:0}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.first\:rounded-l-lg:first-child{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.first\:pt-0:first-child{padding-top:calc(var(--spacing) * 0)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing) * 0)}.last\:rounded-r-lg:last-child{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.last\:border-r:last-child{border-right-style:var(--tw-border-style);border-right-width:1px}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.read-only\:bg-neutral-100:read-only{background-color:var(--color-neutral-100)}.read-only\:text-neutral-500:read-only{color:var(--color-neutral-500)}.focus-within\:w-\[82px\]:focus-within{width:82px}.focus-within\:border-black\/75:focus-within{border-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus-within\:border-black\/75:focus-within{border-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus-within\:border-neutral-500:focus-within{border-color:var(--color-neutral-500)}.focus-within\:border-neutral-800:focus-within{border-color:var(--color-neutral-800)}.focus-within\:border-red-500:focus-within{border-color:var(--color-red-500)}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:ring-1:focus-within{--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-within\:ring-2:focus-within{--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-within\:ring-black\/75:focus-within{--tw-ring-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus-within\:ring-black\/75:focus-within{--tw-ring-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus-within\:ring-neutral-500:focus-within{--tw-ring-color:var(--color-neutral-500)}.focus-within\:ring-neutral-900:focus-within{--tw-ring-color:var(--color-neutral-900)}.focus-within\:ring-red-600:focus-within{--tw-ring-color:var(--color-red-600)}.focus-within\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:h-52:hover{height:calc(var(--spacing) * 52)}.hover\:translate-x-\[-2\%\]:hover{--tw-translate-x:-2%;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-1:hover{--tw-translate-y:calc(var(--spacing) * -1);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-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:scale-\[1\.15\]:hover{scale:1.15}.hover\:cursor-copy:hover{cursor:copy}.hover\:cursor-grab:hover{cursor:grab}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border:hover{border-style:var(--tw-border-style);border-width:1px}.hover\:border-\[\#1915014a\]:hover{border-color:#1915014a}.hover\:border-\[\#19140035\]:hover{border-color:#19140035}.hover\:border-amber-200\/50:hover{border-color:#fee68580}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber-200\/50:hover{border-color:color-mix(in oklab, var(--color-amber-200) 50%, transparent)}}.hover\:border-black:hover{border-color:var(--color-black)}.hover\:border-blue-500:hover{border-color:var(--color-blue-500)}.hover\:border-emerald-200\/50:hover{border-color:#a4f4cf80}@supports (color:color-mix(in lab, red, red)){.hover\:border-emerald-200\/50:hover{border-color:color-mix(in oklab, var(--color-emerald-200) 50%, transparent)}}.hover\:border-green-500:hover{border-color:var(--color-green-500)}.hover\:border-indigo-200\/50:hover{border-color:#c7d2ff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-indigo-200\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-200) 50%, transparent)}}.hover\:border-neutral-200:hover{border-color:var(--color-neutral-200)}.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:border-neutral-500:hover{border-color:var(--color-neutral-500)}.hover\:border-neutral-800:hover{border-color:var(--color-neutral-800)}.hover\:border-orange-500:hover{border-color:var(--color-orange-500)}.hover\:border-pink-200\/50:hover{border-color:#fccee880}@supports (color:color-mix(in lab, red, red)){.hover\:border-pink-200\/50:hover{border-color:color-mix(in oklab, var(--color-pink-200) 50%, transparent)}}.hover\:border-purple-200\/50:hover{border-color:#e9d5ff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-purple-200\/50:hover{border-color:color-mix(in oklab, var(--color-purple-200) 50%, transparent)}}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-500:hover{border-color:var(--color-red-500)}.hover\:border-rose-200\/50:hover{border-color:#ffccd380}@supports (color:color-mix(in lab, red, red)){.hover\:border-rose-200\/50:hover{border-color:color-mix(in oklab, var(--color-rose-200) 50%, transparent)}}.hover\:border-sky-200\/50:hover{border-color:#b8e6fe80}@supports (color:color-mix(in lab, red, red)){.hover\:border-sky-200\/50:hover{border-color:color-mix(in oklab, var(--color-sky-200) 50%, transparent)}}.hover\:border-slate-600:hover{border-color:var(--color-slate-600)}.hover\:border-slate-700:hover{border-color:var(--color-slate-700)}.hover\:border-violet-500:hover{border-color:var(--color-violet-500)}.hover\:\!bg-blue-100:hover{background-color:var(--color-blue-100)!important}.hover\:\!bg-orange-100:hover{background-color:var(--color-orange-100)!important}.hover\:bg-\[\#e4e4e7\]:hover{background-color:#e4e4e7}.hover\:bg-\[var\(--brand\)\]:hover{background-color:var(--brand)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.hover\:bg-black\/40:hover{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/40:hover{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.hover\:bg-black\/\[0\.03\]:hover{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/\[0\.03\]:hover{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.hover\:bg-black\/\[0\.07\]:hover{background-color:#00000012}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/\[0\.07\]:hover{background-color:color-mix(in oklab, var(--color-black) 7.0%, transparent)}}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-100\/80:hover{background-color:#dbeafecc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-100\/80:hover{background-color:color-mix(in oklab, var(--color-blue-100) 80%, transparent)}}.hover\:bg-blue-200\/60:hover{background-color:#bedbff99}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-200\/60:hover{background-color:color-mix(in oklab, var(--color-blue-200) 60%, transparent)}}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-cyan-400:hover{background-color:var(--color-cyan-400)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-50\/50:hover{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-50\/50:hover{background-color:color-mix(in oklab, var(--color-gray-50) 50%, transparent)}}.hover\:bg-gray-50\/60:hover{background-color:#f9fafb99}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-50\/60:hover{background-color:color-mix(in oklab, var(--color-gray-50) 60%, transparent)}}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-100\/60:hover{background-color:#f3f4f699}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-100\/60:hover{background-color:color-mix(in oklab, var(--color-gray-100) 60%, transparent)}}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-green-300\/80:hover{background-color:#7bf1a8cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-green-300\/80:hover{background-color:color-mix(in oklab, var(--color-green-300) 80%, transparent)}}.hover\:bg-green-500\/10:hover{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-green-500\/10:hover{background-color:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-50\/80:hover{background-color:#fafafacc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-50\/80:hover{background-color:color-mix(in oklab, var(--color-neutral-50) 80%, transparent)}}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-100\/50:hover{background-color:#f5f5f580}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-100\/50:hover{background-color:color-mix(in oklab, var(--color-neutral-100) 50%, transparent)}}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-neutral-200\/50:hover{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/50:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.hover\:bg-neutral-200\/60:hover{background-color:#e5e5e599}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/60:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 60%, transparent)}}.hover\:bg-neutral-200\/75:hover{background-color:#e5e5e5bf}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/75:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 75%, transparent)}}.hover\:bg-neutral-200\/80:hover{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/80:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.hover\:bg-neutral-300:hover{background-color:var(--color-neutral-300)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-neutral-800:hover{background-color:var(--color-neutral-800)}.hover\:bg-neutral-900:hover{background-color:var(--color-neutral-900)}.hover\:bg-orange-100:hover{background-color:var(--color-orange-100)}.hover\:bg-orange-600:hover{background-color:var(--color-orange-600)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-600\/10:hover{background-color:#e400141a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-600\/10:hover{background-color:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-transparent:hover{background-color:#0000}.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\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, 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\/90:hover{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/90:hover{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.hover\:bg-gradient-to-r:hover{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.hover\:from-blue-50:hover{--tw-gradient-from:var(--color-blue-50);--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))}.hover\:from-cyan-400:hover{--tw-gradient-from:var(--color-cyan-400);--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))}.hover\:from-green-50:hover{--tw-gradient-from:var(--color-green-50);--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))}.hover\:from-neutral-50:hover{--tw-gradient-from:var(--color-neutral-50);--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))}.hover\:from-neutral-200:hover{--tw-gradient-from:var(--color-neutral-200);--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))}.hover\:from-orange-50:hover{--tw-gradient-from:var(--color-orange-50);--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))}.hover\:from-red-50:hover{--tw-gradient-from:var(--color-red-50);--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))}.hover\:from-violet-50:hover{--tw-gradient-from:var(--color-violet-50);--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))}.hover\:to-blue-500:hover{--tw-gradient-to:var(--color-blue-500);--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))}.hover\:to-transparent:hover{--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))}.hover\:pt-10:hover{padding-top:calc(var(--spacing) * 10)}.hover\:text-amber-800:hover{color:var(--color-amber-800)}.hover\:text-black:hover{color:var(--color-black)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-cyan-300:hover{color:var(--color-cyan-300)}.hover\:text-cyan-400:hover{color:var(--color-cyan-400)}.hover\:text-gray-500:hover{color:var(--color-gray-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-neutral-500:hover{color:var(--color-neutral-500)}.hover\:text-neutral-600:hover{color:var(--color-neutral-600)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}.hover\:text-neutral-800:hover{color:var(--color-neutral-800)}.hover\:text-neutral-900:hover{color:var(--color-neutral-900)}.hover\:text-neutral-950:hover{color:var(--color-neutral-950)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-white:hover{color:var(--color-white)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-neutral-300:hover{-webkit-text-decoration-color:var(--color-neutral-300);-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.hover\:decoration-neutral-400:hover{-webkit-text-decoration-color:var(--color-neutral-400);-webkit-text-decoration-color:var(--color-neutral-400);text-decoration-color:var(--color-neutral-400)}.hover\:underline-offset-2:hover{text-underline-offset:2px}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow:hover{--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)}.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)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-sm:hover{--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)}.hover\:shadow-xl:hover{--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)}.hover\:ring:hover{--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)}.hover\:ring-0:hover{--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)}.hover\:ring-1:hover{--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)}.hover\:ring-4:hover{--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)}.hover\:shadow-cyan-500\/20:hover{--tw-shadow-color:#00b7d733}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-cyan-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-cyan-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-neutral-900\/30:hover{--tw-shadow-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-neutral-900\/30:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-pink-500\/20:hover{--tw-shadow-color:#f6339a33}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-pink-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-pink-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:ring-\[var\(--brand-ring\)\]:hover{--tw-ring-color:var(--brand-ring)}.hover\:ring-\[var\(--ring-color\)\]:hover{--tw-ring-color:var(--ring-color)}.hover\:ring-black\/5:hover{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:ring-black\/5:hover{--tw-ring-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:ring-neutral-200:hover{--tw-ring-color:var(--color-neutral-200)}.hover\:brightness-75:hover{--tw-brightness:brightness(75%);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,)}.hover\:before\:opacity-60:hover:before{content:var(--tw-content);opacity:.6}}.focus\:z-\[1\]:focus{z-index:1}.focus\:border-\[var\(--brand\)\]:focus{border-color:var(--brand)}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.focus\:border-black:focus{border-color:var(--color-black)}.focus\:border-black\/75:focus{border-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus\:border-black\/75:focus{border-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus\:border-emerald-500:focus{border-color:var(--color-emerald-500)}.focus\:border-neutral-300:focus{border-color:var(--color-neutral-300)}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:border-neutral-500:focus{border-color:var(--color-neutral-500)}.focus\:border-neutral-600:focus{border-color:var(--color-neutral-600)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:border-red-600:focus{border-color:var(--color-red-600)}.focus\:border-transparent:focus{border-color:#0000}.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-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-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-4:focus{--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)}.focus\:ring-\[var\(--brand\)\]:focus{--tw-ring-color:var(--brand)}.focus\:ring-amber-500:focus{--tw-ring-color:var(--color-amber-500)}.focus\:ring-black:focus{--tw-ring-color:var(--color-black)}.focus\:ring-black\/75:focus{--tw-ring-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus\:ring-black\/75:focus{--tw-ring-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus\:ring-cyan-500:focus{--tw-ring-color:var(--color-cyan-500)}.focus\:ring-emerald-500:focus{--tw-ring-color:var(--color-emerald-500)}.focus\:ring-neutral-200:focus{--tw-ring-color:var(--color-neutral-200)}.focus\:ring-neutral-300:focus{--tw-ring-color:var(--color-neutral-300)}.focus\:ring-neutral-500:focus{--tw-ring-color:var(--color-neutral-500)}.focus\:ring-neutral-600:focus{--tw-ring-color:var(--color-neutral-600)}.focus\:ring-neutral-900:focus{--tw-ring-color:var(--color-neutral-900)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-red-600:focus{--tw-ring-color:var(--color-red-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:pointer-events-auto:focus-visible{pointer-events:auto}.focus-visible\:translate-x-0:focus-visible{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.focus-visible\:border-\[var\(--brand\)\]:focus-visible{border-color:var(--brand)}.focus-visible\:border-black:focus-visible{border-color:var(--color-black)}.focus-visible\:border-blue-600:focus-visible{border-color:var(--color-blue-600)}.focus-visible\:border-neutral-500:focus-visible{border-color:var(--color-neutral-500)}.focus-visible\:border-neutral-800:focus-visible{border-color:var(--color-neutral-800)}.focus-visible\:border-neutral-900:focus-visible{border-color:var(--color-neutral-900)}.focus-visible\:opacity-100:focus-visible{opacity:1}.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-\[var\(--brand\)\]:focus-visible{--tw-ring-color:var(--brand)}.focus-visible\:ring-\[var\(--ring-color\)\]:focus-visible{--tw-ring-color:var(--ring-color)}.focus-visible\:ring-black\/20:focus-visible{--tw-ring-color:#0003}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.focus-visible\:ring-black\/40:focus-visible{--tw-ring-color:#0006}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.focus-visible\:ring-black\/50:focus-visible{--tw-ring-color:#00000080}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.focus-visible\:ring-blue-600:focus-visible{--tw-ring-color:var(--color-blue-600)}.focus-visible\:ring-neutral-300:focus-visible{--tw-ring-color:var(--color-neutral-300)}.focus-visible\:ring-neutral-400:focus-visible{--tw-ring-color:var(--color-neutral-400)}.focus-visible\:ring-neutral-400\/50:focus-visible{--tw-ring-color:#a1a1a180}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-neutral-400\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-neutral-400) 50%, transparent)}}.focus-visible\:ring-neutral-500:focus-visible{--tw-ring-color:var(--color-neutral-500)}.focus-visible\:ring-neutral-900:focus-visible{--tw-ring-color:var(--color-neutral-900)}.focus-visible\:ring-neutral-950\/30:focus-visible{--tw-ring-color:#0a0a0a4d}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-neutral-950\/30:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-neutral-950) 30%, transparent)}}.focus-visible\:ring-orange-500:focus-visible{--tw-ring-color:var(--color-orange-500)}.focus-visible\:ring-teal-400\/35:focus-visible{--tw-ring-color:#00d3bd59}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-teal-400\/35:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-teal-400) 35%, transparent)}}.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\:ring-offset-white:focus-visible{--tw-ring-offset-color:var(--color-white)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-90:active{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.97\]:active{scale:.97}.active\:scale-\[0\.98\]:active{scale:.98}.active\:cursor-grabbing:active{cursor:grabbing}.active\:border-neutral-300:active{border-color:var(--color-neutral-300)}.active\:bg-black\/5:active{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/5:active{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.active\:bg-black\/10:active{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/10:active{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.active\:bg-black\/15:active{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/15:active{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.active\:bg-blue-100:active{background-color:var(--color-blue-100)}.active\:bg-neutral-100:active{background-color:var(--color-neutral-100)}.active\:bg-neutral-200:active{background-color:var(--color-neutral-200)}.active\:bg-neutral-200\/80:active{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.active\:bg-neutral-200\/80:active{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.active\:bg-neutral-300:active{background-color:var(--color-neutral-300)}.active\:bg-red-200:active{background-color:var(--color-red-200)}.active\:bg-transparent:active{background-color:#0000}.active\:text-neutral-400:active{color:var(--color-neutral-400)}.active\:text-white:active{color:var(--color-white)}.active\:shadow-lg:active{--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)}.active\:ring-2:active{--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)}.active\:before\:opacity-100:active:before{content:var(--tw-content);opacity:1}.enabled\:border-\[var\(--brand\)\]:enabled{border-color:var(--brand)}.enabled\:bg-\[var\(--brand\)\]:enabled{background-color:var(--brand)}@media (hover:hover){.enabled\:hover\:bg-\[var\(--brand\)\]:enabled:hover{background-color:var(--brand)}.enabled\:hover\:bg-black\/5:enabled:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-black\/5:enabled:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.enabled\:hover\:bg-black\/\[0\.03\]:enabled:hover{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-black\/\[0\.03\]:enabled:hover{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.enabled\:hover\:text-neutral-700:enabled:hover{color:var(--color-neutral-700)}.enabled\:hover\:text-neutral-950:enabled:hover{color:var(--color-neutral-950)}.enabled\:hover\:ring-\[var\(--brand-ring\)\]:enabled:hover{--tw-ring-color:var(--brand-ring)}}.enabled\:active\:bg-black\/5:enabled:active{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.enabled\:active\:bg-black\/5:enabled:active{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.enabled\:active\:bg-black\/10:enabled:active{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.enabled\:active\:bg-black\/10:enabled:active{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.enabled\:active\:bg-neutral-200:enabled:active{background-color:var(--color-neutral-200)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-none:disabled{--tw-border-style:none;border-style:none}.disabled\:border-transparent:disabled{border-color:#0000}.disabled\:bg-neutral-50:disabled{background-color:var(--color-neutral-50)}.disabled\:bg-neutral-100:disabled{background-color:var(--color-neutral-100)}.disabled\:bg-transparent:disabled{background-color:#0000}.disabled\:text-black:disabled{color:var(--color-black)}.disabled\:text-neutral-400:disabled{color:var(--color-neutral-400)}.disabled\:text-neutral-500:disabled{color:var(--color-neutral-500)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.data-\[active\]\:bg-neutral-100[data-active]{background-color:var(--color-neutral-100)}.data-\[active\=true\]\:text-blue-500[data-active=true]{color:var(--color-blue-500)}.data-\[active\=true\]\:text-purple-500[data-active=true]{color:var(--color-purple-500)}.data-\[active\=true\]\:text-teal-500[data-active=true]{color:var(--color-teal-500)}.data-\[dragging\=true\]\:shadow-\[0_4px_12px_0_\#0000000D\][data-dragging=true]{--tw-shadow:0 4px 12px 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-\[selected\=true\]\:bg-black\/\[0\.03\][data-selected=true]{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.data-\[selected\=true\]\:bg-black\/\[0\.03\][data-selected=true]{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.data-\[selected\=true\]\:bg-neutral-100[data-selected=true]{background-color:var(--color-neutral-100)}.data-\[selected\=true\]\:bg-neutral-200\/50[data-selected=true]{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.data-\[selected\=true\]\:bg-neutral-200\/50[data-selected=true]{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.data-\[selected\=true\]\:text-neutral-800[data-selected=true]{color:var(--color-neutral-800)}.data-\[state\=checked\]\:bg-black[data-state=checked]{background-color:var(--color-black)}.data-\[state\=closed\]\:animate-none[data-state=closed]{animation:none}.data-\[state\=closed\]\:border-b-0[data-state=closed]{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.data-\[state\=indeterminate\]\:bg-black[data-state=indeterminate]{background-color:var(--color-black)}.data-\[state\=open\]\:animate-none[data-state=open]{animation:none}.data-\[state\=open\]\:border-neutral-500[data-state=open]{border-color:var(--color-neutral-500)}.data-\[state\=open\]\:border-red-500[data-state=open]{border-color:var(--color-red-500)}.data-\[state\=open\]\:bg-blue-100[data-state=open]{background-color:var(--color-blue-100)}.data-\[state\=open\]\:bg-neutral-100[data-state=open]{background-color:var(--color-neutral-100)}.data-\[state\=open\]\:bg-neutral-200[data-state=open]{background-color:var(--color-neutral-200)}.data-\[state\=open\]\:bg-neutral-200\/50[data-state=open]{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:bg-neutral-200\/50[data-state=open]{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.data-\[state\=open\]\:bg-neutral-200\/80[data-state=open]{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:bg-neutral-200\/80[data-state=open]{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.data-\[state\=open\]\:bg-orange-100[data-state=open]{background-color:var(--color-orange-100)}.data-\[state\=open\]\:text-neutral-600[data-state=open]{color:var(--color-neutral-600)}.data-\[state\=open\]\:ring[data-state=open],.data-\[state\=open\]\:ring-1[data-state=open]{--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)}.data-\[state\=open\]\:ring-4[data-state=open]{--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)}.data-\[state\=open\]\:ring-black\/20[data-state=open]{--tw-ring-color:#0003}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:ring-black\/20[data-state=open]{--tw-ring-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.data-\[state\=open\]\:ring-neutral-200[data-state=open]{--tw-ring-color:var(--color-neutral-200)}.data-\[state\=open\]\:ring-neutral-500[data-state=open]{--tw-ring-color:var(--color-neutral-500)}.data-\[state\=open\]\:ring-red-500[data-state=open]{--tw-ring-color:var(--color-red-500)}@media (prefers-reduced-motion:no-preference){.motion-safe\:\[animation-direction\:reverse\]{animation-direction:reverse}.motion-safe\:\[animation-duration\:30s\]{animation-duration:30s}.motion-safe\:\[animation-duration\:40s\]{animation-duration:40s}}@media not all and (min-width:1372px){.max-\[1372px\]\:left-0{left:calc(var(--spacing) * 0)}.max-\[1372px\]\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}}@media not all and (min-width:1120px){.max-\[1120px\]\:hidden{display:none}}@media not all and (min-width:960px){.max-\[960px\]\:hidden{display:none}}@media not all and (min-width:420px){.max-\[420px\]\:hidden{display:none}.max-\[420px\]\:inline{display:inline}}@media not all and (min-width:380px){.max-\[380px\]\:hidden{display:none}}@media not all and (min-width:64rem){.max-lg\:pointer-events-none{pointer-events:none}.max-lg\:mt-3{margin-top:calc(var(--spacing) * 3)}.max-lg\:w-\[calc\(400cqw\+3\*32px\)\]{width:calc(400cqw + 96px)}.max-lg\:w-\[calc\(var\(--cols\)\*100cqw\+\(var\(--cols\)-1\)\*32px\)\]{width:calc(var(--cols) * 100cqw + (var(--cols) - 1) * 32px)}.max-lg\:max-w-none{max-width:none}.max-lg\:translate-x-\[calc\(-1\*var\(--index\)\*\(100cqw\+32px\)\)\]{--tw-translate-x:calc(-1 * var(--index) * (100cqw + 32px));translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:grid-rows-\[0px_minmax\(0\,1fr\)\]{grid-template-rows:0 minmax(0,1fr)}.max-lg\:grid-rows-\[453px_minmax\(0\,1fr\)\]{grid-template-rows:453px minmax(0,1fr)}.max-lg\:gap-x-8{column-gap:calc(var(--spacing) * 8)}.max-lg\:overflow-hidden{overflow:hidden}.max-lg\:rounded-lg{border-radius:var(--radius-lg)}.max-lg\:rounded-xl{border-radius:var(--radius-xl)}.max-lg\:rounded-t-\[16px\]{border-top-left-radius:16px;border-top-right-radius:16px}.max-lg\:border{border-style:var(--tw-border-style);border-width:1px}.max-lg\:border-0{border-style:var(--tw-border-style);border-width:0}.max-lg\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.max-lg\:border-neutral-200{border-color:var(--color-neutral-200)}.max-lg\:opacity-0{opacity:0}.max-lg\: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)}.max-lg\:ring-neutral-200{--tw-ring-color:var(--color-neutral-200)}.max-lg\: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))}.max-lg\:ring-inset{--tw-ring-inset:inset}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}.max-md\:max-h-\[calc\(100dvh-200px\)\]{max-height:calc(100dvh - 200px)}.max-md\:min-h-\[min\(566px\,_calc\(100dvh-200px\)\)\]{min-height:min(566px,100dvh - 200px)}.max-md\:w-full{width:100%}.max-md\:overflow-auto{overflow:auto}}@media not all and (min-width:40rem){.max-sm\:hidden{display:none}.max-sm\:w-full{width:100%}:where(.max-sm\: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)))}.max-sm\: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)}}@media (min-width:300px){.min-\[300px\]\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}@media (min-width:550px){.min-\[550px\]\:flex-row{flex-direction:row}.min-\[550px\]\:items-center{align-items:center}.min-\[550px\]\:justify-between{justify-content:space-between}}@media (min-width:900px){.min-\[900px\]\:flex{display:flex}.min-\[900px\]\:hidden{display:none}.min-\[900px\]\:grid-cols-\[440px_minmax\(0\,1fr\)\]{grid-template-columns:440px minmax(0,1fr)}.min-\[900px\]\:grid-cols-\[minmax\(0\,1fr\)_440px\]{grid-template-columns:minmax(0,1fr) 440px}}@media (min-width:1120px){.min-\[1120px\]\:inline-block{display:inline-block}.min-\[1120px\]\:pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}}@media (min-width:40rem){.sm\:-top-6{top:calc(var(--spacing) * -6)}.sm\:top-1\/2{top:50%}.sm\:bottom-0{bottom:calc(var(--spacing) * 0)}.sm\:left-4{left:calc(var(--spacing) * 4)}.sm\:left-\[8px\]{left:8px}.sm\:left-\[68px\]{left:68px}.sm\:left-\[151px\]{left:151px}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mx-0{margin-inline:calc(var(--spacing) * 0)}.sm\:mx-12{margin-inline:calc(var(--spacing) * 12)}.sm\:mx-auto{margin-inline:auto}.sm\:-my-1{margin-block:calc(var(--spacing) * -1)}.sm\:mt-0{margin-top:calc(var(--spacing) * 0)}.sm\:mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.sm\:mt-8{margin-top:calc(var(--spacing) * 8)}.sm\:mt-14{margin-top:calc(var(--spacing) * 14)}.sm\:-mr-8{margin-right:calc(var(--spacing) * -8)}.sm\:-mb-6{margin-bottom:calc(var(--spacing) * -6)}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:table-cell{display:table-cell}.sm\:aspect-\[2\/1\]{aspect-ratio:2}.sm\:size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.sm\:size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.sm\:size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.sm\:size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.sm\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.sm\:size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.sm\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.sm\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.sm\:size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.sm\:size-32{width:calc(var(--spacing) * 32);height:calc(var(--spacing) * 32)}.sm\:h-0{height:calc(var(--spacing) * 0)}.sm\:h-4{height:calc(var(--spacing) * 4)}.sm\:h-6{height:calc(var(--spacing) * 6)}.sm\:h-7{height:calc(var(--spacing) * 7)}.sm\:h-9{height:calc(var(--spacing) * 9)}.sm\:h-10{height:calc(var(--spacing) * 10)}.sm\:h-12{height:calc(var(--spacing) * 12)}.sm\:h-16{height:calc(var(--spacing) * 16)}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:h-32{height:calc(var(--spacing) * 32)}.sm\:h-36{height:calc(var(--spacing) * 36)}.sm\:h-96{height:calc(var(--spacing) * 96)}.sm\:h-\[128px\]{height:128px}.sm\:h-\[132px\]{height:132px}.sm\:h-\[300px\]{height:300px}.sm\:h-\[302px\]{height:302px}.sm\:h-\[340px\]{height:340px}.sm\:h-\[464px\]{height:464px}.sm\:h-full{height:100%}.sm\:max-h-12{max-height:calc(var(--spacing) * 12)}.sm\:max-h-64{max-height:calc(var(--spacing) * 64)}.sm\:max-h-\[min\(90dvh\,720px\)\]{max-height:min(90dvh,720px)}.sm\:w-4{width:calc(var(--spacing) * 4)}.sm\:w-6{width:calc(var(--spacing) * 6)}.sm\:w-10{width:calc(var(--spacing) * 10)}.sm\:w-16{width:calc(var(--spacing) * 16)}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-32{width:calc(var(--spacing) * 32)}.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-52{width:calc(var(--spacing) * 52)}.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-\[100px\]{width:100px}.sm\:w-\[260px\]{width:260px}.sm\:w-\[340px\]{width:340px}.sm\:w-\[350px\]{width:350px}.sm\:w-\[400px\]{width:400px}.sm\:w-\[440px\]{width:440px}.sm\:w-\[560px\]{width:560px}.sm\:w-\[min\(100\%\,280px\)\]{width:min(100%,280px)}.sm\:w-auto{width:auto}.sm\:w-fit{width:fit-content}.sm\:max-w-\[50\%\]{max-width:50%}.sm\:max-w-\[140px\]{max-width:140px}.sm\:max-w-\[200px\]{max-width:200px}.sm\:max-w-\[225px\]{max-width:225px}.sm\:max-w-\[320px\]{max-width:320px}.sm\:max-w-\[400px\]{max-width:400px}.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-\[600px\]{max-width:600px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:min-w-48{min-width:calc(var(--spacing) * 48)}.sm\:min-w-56{min-width:calc(var(--spacing) * 56)}.sm\:min-w-64{min-width:calc(var(--spacing) * 64)}.sm\:min-w-\[17rem\]{min-width:17rem}.sm\:min-w-\[120px\]{min-width:120px}.sm\:min-w-\[130px\]{min-width:130px}.sm\:min-w-\[150px\]{min-width:150px}.sm\:min-w-\[180px\]{min-width:180px}.sm\:min-w-\[200px\]{min-width:200px}.sm\:min-w-\[240px\]{min-width:240px}.sm\:flex-1{flex:1}.sm\:flex-none{flex:none}.sm\:shrink-0{flex-shrink:0}.sm\:basis-\[120px\]{flex-basis:120px}.sm\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:-scale-x-100{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:rotate-\[-4deg\]{rotate:-4deg}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.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_auto\]{grid-template-columns:1fr auto}.sm\:grid-cols-\[3fr_1fr_1\.5fr\]{grid-template-columns:3fr 1fr 1.5fr}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:grid-cols-\[repeat\(var\(--cols\)\,minmax\(0\,1fr\)\)\]{grid-template-columns:repeat(var(--cols),minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-0{gap:calc(var(--spacing) * 0)}.sm\:gap-1{gap:calc(var(--spacing) * 1)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.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-8{gap:calc(var(--spacing) * 8)}.sm\:gap-10{gap:calc(var(--spacing) * 10)}.sm\:gap-12{gap:calc(var(--spacing) * 12)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}: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)))}.sm\:gap-y-4{row-gap:calc(var(--spacing) * 4)}:where(.sm\: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(.sm\:divide-y-0>: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(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}:where(.sm\:divide-transparent>:not(:last-child)){border-color:#0000}.sm\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sm\:rounded-2xl{border-radius:var(--radius-2xl)}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:rounded-md{border-radius:var(--radius-md)}.sm\:rounded-xl{border-radius:var(--radius-xl)}.sm\:rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.sm\:rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.sm\:rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.sm\:rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:p-0{padding:calc(var(--spacing) * 0)}.sm\:p-1{padding:calc(var(--spacing) * 1)}.sm\:p-1\.5{padding:calc(var(--spacing) * 1.5)}.sm\:p-2{padding:calc(var(--spacing) * 2)}.sm\:p-2\.5{padding:calc(var(--spacing) * 2.5)}.sm\:p-3{padding:calc(var(--spacing) * 3)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.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-10{padding:calc(var(--spacing) * 10)}.sm\:p-20{padding:calc(var(--spacing) * 20)}.sm\:px-0{padding-inline:calc(var(--spacing) * 0)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.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-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-12{padding-inline:calc(var(--spacing) * 12)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:py-0{padding-block:calc(var(--spacing) * 0)}.sm\:py-0\.5{padding-block:calc(var(--spacing) * .5)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}.sm\:py-3{padding-block:calc(var(--spacing) * 3)}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:py-4\.5{padding-block:calc(var(--spacing) * 4.5)}.sm\:py-6{padding-block:calc(var(--spacing) * 6)}.sm\:pt-0{padding-top:calc(var(--spacing) * 0)}.sm\:pt-4{padding-top:calc(var(--spacing) * 4)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pt-8{padding-top:calc(var(--spacing) * 8)}.sm\:pt-20{padding-top:calc(var(--spacing) * 20)}.sm\:pt-\[84px\]{padding-top:84px}.sm\:pr-3{padding-right:calc(var(--spacing) * 3)}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.sm\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.sm\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-4{padding-left:calc(var(--spacing) * 4)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.sm\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[2\.5rem\]{font-size:2.5rem}.sm\:leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.sm\:leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:opacity-0{opacity:0}.sm\:opacity-10{opacity:.1}.sm\:opacity-15{opacity:.15}.sm\:opacity-20{opacity:.2}.sm\:opacity-100{opacity:1}.sm\: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)}.sm\: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)}.sm\:\[--logo-size\:18px\]{--logo-size:18px}@media (hover:hover){.sm\:group-hover\:translate-y-\[var\(--y\)\]:is(:where(.group):hover *){--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}:where(.sm\:group-hover\:divide-neutral-200:is(:where(.group):hover *)>:not(:last-child)){border-color:var(--color-neutral-200)}.sm\:group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.sm\:group-hover\:opacity-\[var\(--opacity\)\]:is(:where(.group):hover *){opacity:var(--opacity)}.sm\:group-hover\/card\:border-neutral-200:is(:where(.group\/card):hover *){border-color:var(--color-neutral-200)}}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:h-7:is(:where(.group):has([data-dragging=true]) *){height:calc(var(--spacing) * 7)}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:translate-y-\[var\(--y\)\]:is(:where(.group):has([data-dragging=true]) *){--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:opacity-100:is(:where(.group):has([data-dragging=true]) *){opacity:1}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:opacity-\[var\(--opacity\)\]:is(:where(.group):has([data-dragging=true]) *){opacity:var(--opacity)}.sm\:group-has-\[\+div\:hover\]\:opacity-100:is(:where(.group):has(+div:hover) *){opacity:1}@media (hover:hover){.sm\:group-hover\:group-data-\[active\=true\]\:h-7:is(:where(.group):hover *):is(:where(.group)[data-active=true] *){height:calc(var(--spacing) * 7)}.sm\:group-hover\:group-data-\[active\=true\]\:opacity-100:is(:where(.group):hover *):is(:where(.group)[data-active=true] *){opacity:1}}.group-data-\[variant\=loose\]\/card-list\:sm\:size-5:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:h-5:is(:where(.group\/card-list)[data-variant=loose] *){height:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:w-5:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:opacity-100:is(:where(.group\/card-list)[data-variant=loose] *){opacity:1}.sm\:first\:rounded-tl-xl:first-child{border-top-left-radius:var(--radius-xl)}@media (hover:hover){.sm\:group-hover\/card\:data-\[state\=closed\]\:border-neutral-200:is(:where(.group\/card):hover *)[data-state=closed]{border-color:var(--color-neutral-200)}}@media not all and (min-width:1372px){.sm\:max-\[1372px\]\:w-\[calc\(100\%-150px\)\]{width:calc(100% - 150px)}}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:fixed{position:fixed}.md\:top-1\/2{top:50%}.md\:right-3{right:calc(var(--spacing) * 3)}.md\:right-\[62cqh\]{right:62cqh}.md\:bottom-0{bottom:calc(var(--spacing) * 0)}.md\:bottom-3{bottom:calc(var(--spacing) * 3)}.md\:left-0{left:calc(var(--spacing) * 0)}.md\:left-\[304px\]{left:304px}.md\:z-40{z-index:40}.md\:m-5{margin:calc(var(--spacing) * 5)}.md\:mx-0{margin-inline:calc(var(--spacing) * 0)}.md\:mt-0{margin-top:calc(var(--spacing) * 0)}.md\:mt-4{margin-top:calc(var(--spacing) * 4)}.md\:mt-6{margin-top:calc(var(--spacing) * 6)}.md\:mt-24{margin-top:calc(var(--spacing) * 24)}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline{display:inline}.md\:size-\[32cqh\]{width:32cqh;height:32cqh}.md\:h-8{height:calc(var(--spacing) * 8)}.md\:h-10{height:calc(var(--spacing) * 10)}.md\:h-96{height:calc(var(--spacing) * 96)}.md\:h-\[40vh\]{height:40vh}.md\:max-h-80{max-height:calc(var(--spacing) * 80)}.md\:min-h-0{min-height:calc(var(--spacing) * 0)}.md\:min-h-\[250px\]{min-height:250px}.md\:min-h-\[400px\]{min-height:400px}.md\:min-h-\[500px\]{min-height:500px}.md\:min-h-\[550px\]{min-height:550px}.md\:min-h-\[calc\(100vh-10rem\)\]{min-height:calc(100vh - 10rem)}.md\:min-h-\[calc\(100vh-32px\)\]{min-height:calc(100vh - 32px)}.md\:min-h-fit{min-height:fit-content}.md\:w-32{width:calc(var(--spacing) * 32)}.md\:w-48{width:calc(var(--spacing) * 48)}.md\:w-52{width:calc(var(--spacing) * 52)}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:w-60{width:calc(var(--spacing) * 60)}.md\:w-72{width:calc(var(--spacing) * 72)}.md\:w-80{width:calc(var(--spacing) * 80)}.md\:w-\[14rem\]{width:14rem}.md\:w-\[16rem\]{width:16rem}.md\:w-\[19rem\]{width:19rem}.md\:w-\[20rem\]{width:20rem}.md\:w-\[24rem\]{width:24rem}.md\:w-\[650px\]{width:650px}.md\:w-\[calc\(100\%-304px\)\]{width:calc(100% - 304px)}.md\:w-\[max\(min\(calc\(100vw-334px\)\,1170px\)\,540px\)\]{width:max(min(100vw - 334px,1170px),540px)}.md\:w-auto{width:auto}.md\:w-fit{width:fit-content}.md\:max-w-\[180px\]{max-width:180px}.md\:max-w-\[350px\]{max-width:350px}.md\:max-w-full{max-width:100%}.md\:max-w-md{max-width:var(--container-md)}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:min-w-48{min-width:calc(var(--spacing) * 48)}.md\:min-w-80{min-width:calc(var(--spacing) * 80)}.md\:min-w-\[200px\]{min-width:200px}.md\:min-w-\[250px\]{min-width:250px}.md\:flex-none{flex:none}.md\:grow{flex-grow:1}.md\:grow-0{flex-grow:0}.md\:basis-0{flex-basis:calc(var(--spacing) * 0)}.md\:translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.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-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.md\:grid-cols-\[2fr_1fr_0\.5fr_1\.5fr\]{grid-template-columns:2fr 1fr .5fr 1.5fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-12{gap:calc(var(--spacing) * 12)}:where(.md\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}.md\:gap-x-16{column-gap:calc(var(--spacing) * 16)}.md\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md\:overflow-auto{overflow:auto}.md\:overflow-visible{overflow:visible}.md\:rounded-tl-2xl{border-top-left-radius:var(--radius-2xl)}.md\:border-0{border-style:var(--tw-border-style);border-width:0}.md\:bg-transparent{background-color:#0000}.md\:\[mask-image\:linear-gradient\(to_right\,black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000 60%,#0000);mask-image:linear-gradient(90deg,#000 60%,#0000)}.md\:p-0{padding:calc(var(--spacing) * 0)}.md\:p-2{padding:calc(var(--spacing) * 2)}.md\:p-3{padding:calc(var(--spacing) * 3)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:px-0{padding-inline:calc(var(--spacing) * 0)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:px-10{padding-inline:calc(var(--spacing) * 10)}.md\:px-16{padding-inline:calc(var(--spacing) * 16)}.md\:py-0{padding-block:calc(var(--spacing) * 0)}.md\:py-3{padding-block:calc(var(--spacing) * 3)}.md\:py-16{padding-block:calc(var(--spacing) * 16)}.md\:pt-0{padding-top:calc(var(--spacing) * 0)}.md\:pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.md\:pr-4{padding-right:calc(var(--spacing) * 4)}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.md\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.md\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.md\:pl-0{padding-left:calc(var(--spacing) * 0)}.md\:pl-1{padding-left:calc(var(--spacing) * 1)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-300{--tw-duration:.3s;transition-duration:.3s}@media not all and (min-width:1372px){.md\:max-\[1372px\]\:w-\[calc\(100\%-304px-150px\)\]{width:calc(100% - 454px)}}}@media (min-width:64rem){.lg\:fixed{position:fixed}.lg\:sticky{position:sticky}.lg\:top-0{top:calc(var(--spacing) * 0)}.lg\:top-1\/2{top:50%}.lg\:right-\[62cqh\]{right:62cqh}.lg\:bottom-0{bottom:calc(var(--spacing) * 0)}.lg\:bottom-4{bottom:calc(var(--spacing) * 4)}.lg\:left-0{left:calc(var(--spacing) * 0)}.lg\:left-\[8px\]{left:8px}.lg\:left-\[68px\]{left:68px}.lg\:left-\[151px\]{left:151px}.lg\:z-0{z-index:0}.lg\:z-40{z-index:40}.lg\:z-auto{z-index:auto}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:m-5{margin:calc(var(--spacing) * 5)}.lg\:mt-6{margin-top:calc(var(--spacing) * 6)}.lg\:mt-10{margin-top:calc(var(--spacing) * 10)}.lg\:mb-0{margin-bottom:calc(var(--spacing) * 0)}.lg\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.lg\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.lg\:-ml-px{margin-left:-1px}.lg\:ml-0{margin-left:calc(var(--spacing) * 0)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:aspect-auto{aspect-ratio:auto}.lg\:size-\[32cqh\]{width:32cqh;height:32cqh}.lg\:h-3{height:calc(var(--spacing) * 3)}.lg\:h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.lg\:h-\[calc\(100vh-186px\)\]{height:calc(100vh - 186px)}.lg\:h-full{height:100%}.lg\:max-h-96{max-height:calc(var(--spacing) * 96)}.lg\:min-h-0{min-height:calc(var(--spacing) * 0)}.lg\:w-0{width:calc(var(--spacing) * 0)}.lg\:w-1\/2{width:50%}.lg\:w-64{width:calc(var(--spacing) * 64)}.lg\:w-\[240px\]{width:240px}.lg\:w-\[360px\]{width:360px}.lg\:w-\[438px\]{width:438px}.lg\:w-auto{width:auto}.lg\:w-full{width:100%}.lg\:max-w-4xl{max-width:var(--container-4xl)}.lg\:grow{flex-grow:1}.lg\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.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-\[0px_minmax\(0\,1fr\)\]{grid-template-columns:0 minmax(0,1fr)}.lg\:grid-cols-\[240px_minmax\(0\,1fr\)\]{grid-template-columns:240px minmax(0,1fr)}.lg\:grid-cols-\[300px_minmax\(0\,600px\)\]{grid-template-columns:300px minmax(0,600px)}.lg\:grid-cols-\[595px_minmax\(0\,1fr\)\]{grid-template-columns:595px minmax(0,1fr)}.lg\:grid-cols-\[min-content_minmax\(0\,1fr\)\]{grid-template-columns:min-content minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_300px\]{grid-template-columns:minmax(0,1fr) 300px}.lg\:grid-cols-\[minmax\(0\,1fr\)_595px\]{grid-template-columns:minmax(0,1fr) 595px}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,400px\)\]{grid-template-columns:minmax(0,1fr) minmax(0,400px)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(268px\,22rem\)\]{grid-template-columns:minmax(0,1fr) minmax(268px,22rem)}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}.lg\:justify-between{justify-content:space-between}.lg\:justify-center{justify-content:center}.lg\:justify-end{justify-content:flex-end}.lg\:gap-3{gap:calc(var(--spacing) * 3)}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}:where(.lg\: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(.lg\: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(.lg\:divide-y-0>: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(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.lg\:rounded-xl{border-radius:var(--radius-xl)}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-tl-lg{border-top-left-radius:var(--radius-lg)}.lg\:rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:border{border-style:var(--tw-border-style);border-width:1px}.lg\:border-0{border-style:var(--tw-border-style);border-width:0}.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\:bg-neutral-50{background-color:var(--color-neutral-50)}.lg\:bg-transparent{background-color:#0000}.lg\:bg-white{background-color:var(--color-white)}.lg\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.lg\:p-0{padding:calc(var(--spacing) * 0)}.lg\:p-3{padding:calc(var(--spacing) * 3)}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:p-14{padding:calc(var(--spacing) * 14)}.lg\:p-20{padding:calc(var(--spacing) * 20)}.lg\:p-px{padding:1px}.lg\:px-0{padding-inline:calc(var(--spacing) * 0)}.lg\:px-3{padding-inline:calc(var(--spacing) * 3)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-6{padding-inline:calc(var(--spacing) * 6)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:py-3{padding-block:calc(var(--spacing) * 3)}.lg\:py-4{padding-block:calc(var(--spacing) * 4)}.lg\:py-6{padding-block:calc(var(--spacing) * 6)}.lg\:pt-0{padding-top:calc(var(--spacing) * 0)}.lg\:pt-5{padding-top:calc(var(--spacing) * 5)}.lg\:pr-2{padding-right:calc(var(--spacing) * 2)}.lg\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.lg\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.lg\:pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.lg\:opacity-0{opacity:0}.lg\:\[filter\:drop-shadow\(0_5px_8px_\#222A351d\)\]{filter:drop-shadow(0 5px 8px #222a351d)}.lg\:transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.lg\:\[--page-bottom-margin\:0\.5rem\]{--page-bottom-margin:.5rem}.lg\:\[--page-top-margin\:0\.5rem\]{--page-top-margin:.5rem}}@media (min-width:80rem){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:grid{display:grid}.xl\:hidden{display:none}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:max-w-\[600px\]{max-width:600px}.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\:gap-4{gap:calc(var(--spacing) * 4)}.xl\:p-5{padding:calc(var(--spacing) * 5)}.xl\:px-0{padding-inline:calc(var(--spacing) * 0)}.xl\:px-12{padding-inline:calc(var(--spacing) * 12)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}@container (min-width:64px){.\@\[64px\]\:block{display:block}}@container (min-width:480px){.\@\[480px\]\:block{display:block}.\@\[480px\]\:hidden{display:none}}@container stats (min-width:695px){.\@\[695px\]\/stats\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@container (min-width:800px){.\@\[800px\]\:mt-6{margin-top:calc(var(--spacing) * 6)}}@container page (min-width:800px){.\@\[800px\]\/page\:hidden{display:none}}@container (min-width:800px){.\@\[800px\]\:size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}}@container page (min-width:800px){.\@\[800px\]\/page\:w-\[280px\]{width:280px}.\@\[800px\]\/page\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}}@container (min-width:800px){.\@\[800px\]\:translate-x-10{--tw-translate-x:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.\@\[800px\]\:-translate-y-10{--tw-translate-y:calc(var(--spacing) * -10);translate:var(--tw-translate-x) var(--tw-translate-y)}}@container page (min-width:800px){.\@\[800px\]\/page\:grid-cols-\[min-content_minmax\(340px\,1fr\)\]{grid-template-columns:min-content minmax(340px,1fr)}}@container (min-width:800px){.\@\[800px\]\:gap-4{gap:calc(var(--spacing) * 4)}.\@\[800px\]\:gap-12{gap:calc(var(--spacing) * 12)}}@container page (min-width:800px){.\@\[800px\]\/page\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}@container (min-width:800px){.\@\[800px\]\:p-16{padding:calc(var(--spacing) * 16)}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\:relative{position:relative}}@container page (min-width:960px){.\@\[960px\]\/page\:relative{position:relative}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\:z-auto{z-index:auto}.\@\[960px\]\/page-content\:hidden{display:none}}@container page (min-width:960px){.\@\[960px\]\/page\:hidden{display:none}.\@\[960px\]\/page\:w-\[340px\]{width:340px}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\: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)}}@container page (min-width:960px){.\@\[960px\]\/page\: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 (min-width:40rem){@container page (min-width:1000px){.sm\:\@\[1000px\]\/page\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}}@container page (min-width:1082px){.\@\[1082px\]\/page\:relative{position:relative}.\@\[1082px\]\/page\:hidden{display:none}.\@\[1082px\]\/page\: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)}}@container stats (min-width:20rem){.\@xs\/stats\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@xs\/stats\:grid-cols-\[repeat\(var\(--cols\)\,1fr\)\]{grid-template-columns:repeat(var(--cols),1fr)}}@container panel (min-width:24rem){.\@sm\/panel\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:28rem){.\@md\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:36rem){.\@xl\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width:42rem){.\@2xl\:h-60{height:calc(var(--spacing) * 60)}.\@2xl\:h-72{height:calc(var(--spacing) * 72)}}@container page (min-width:42rem){.\@2xl\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width:42rem){.\@2xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:48rem){.\@3xl\/page\:order-1{order:1}.\@3xl\/page\:order-2{order:2}}@container sheet (min-width:48rem){.\@3xl\/sheet\:order-1{order:1}.\@3xl\/sheet\:order-2{order:2}}@container page (min-width:48rem){.\@3xl\/page\:col-start-1{grid-column-start:1}.\@3xl\/page\:col-start-2{grid-column-start:2}.\@3xl\/page\:row-start-1{grid-row-start:1}.\@3xl\/page\:block{display:block}.\@3xl\/page\:contents{display:contents}.\@3xl\/page\:hidden{display:none}}@container sheet (min-width:48rem){.\@3xl\/sheet\:min-h-0{min-height:calc(var(--spacing) * 0)}}@container page (min-width:48rem){.\@3xl\/page\:w-\[360px\]{width:360px}.\@3xl\/page\:shrink-0{flex-shrink:0}.\@3xl\/page\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\@3xl\/page\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@3xl\/page\:grid-cols-\[minmax\(440px\,1fr\)_minmax\(0\,360px\)\]{grid-template-columns:minmax(440px,1fr) minmax(0,360px)}}@container sheet (min-width:48rem){.\@3xl\/sheet\:grid-cols-\[minmax\(440px\,1fr\)_minmax\(0\,360px\)\]{grid-template-columns:minmax(440px,1fr) minmax(0,360px)}.\@3xl\/sheet\:grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.\@3xl\/sheet\:overflow-hidden{overflow:hidden}.\@3xl\/sheet\:overflow-y-auto{overflow-y:auto}}@container (min-width:56rem){.\@4xl\:h-full{height:100%}}@container page (min-width:56rem){.\@4xl\/page\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (min-width:56rem){.\@4xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\@4xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@4xl\:grid-cols-\[minmax\(0\,1fr\)_400px\]{grid-template-columns:minmax(0,1fr) 400px}}@container page (min-width:64rem){.\@5xl\/page\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){:where(.dark\:divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-\[\#3E3E3A\]{border-color:#3e3e3a}.dark\:border-\[\#eeeeec\]{border-color:#eeeeec}.dark\:border-amber-700{border-color:var(--color-amber-700)}.dark\:border-amber-800\/50{border-color:#953d0080}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-800\/50{border-color:color-mix(in oklab, var(--color-amber-800) 50%, transparent)}}.dark\:border-amber-900\/30{border-color:#7b33064d}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-900\/30{border-color:color-mix(in oklab, var(--color-amber-900) 30%, transparent)}}.dark\:border-amber-900\/40{border-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-900\/40{border-color:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.dark\:border-amber-950\/20{border-color:#46190133}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-950\/20{border-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.dark\:border-blue-900\/30{border-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-900\/30{border-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:border-blue-900\/40{border-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-900\/40{border-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-500\/30{border-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.dark\:border-emerald-600{border-color:var(--color-emerald-600)}.dark\:border-emerald-800{border-color:var(--color-emerald-800)}.dark\:border-emerald-900\/30{border-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/30{border-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:border-emerald-900\/40{border-color:#004e3b66}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/40{border-color:color-mix(in oklab, var(--color-emerald-900) 40%, transparent)}}.dark\:border-emerald-900\/50{border-color:#004e3b80}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/50{border-color:color-mix(in oklab, var(--color-emerald-900) 50%, transparent)}}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-gray-700\/50{border-color:#36415380}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-700\/50{border-color:color-mix(in oklab, var(--color-gray-700) 50%, transparent)}}.dark\:border-gray-800{border-color:var(--color-gray-800)}.dark\:border-gray-800\/10{border-color:#1e29391a}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-800\/10{border-color:color-mix(in oklab, var(--color-gray-800) 10%, transparent)}}.dark\:border-gray-800\/80{border-color:#1e2939cc}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-800\/80{border-color:color-mix(in oklab, var(--color-gray-800) 80%, transparent)}}.dark\:border-indigo-900\/30{border-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:border-indigo-900\/30{border-color:color-mix(in oklab, var(--color-indigo-900) 30%, transparent)}}.dark\:border-indigo-900\/60{border-color:#312c8599}@supports (color:color-mix(in lab, red, red)){.dark\:border-indigo-900\/60{border-color:color-mix(in oklab, var(--color-indigo-900) 60%, transparent)}}.dark\:border-neutral-700{border-color:var(--color-neutral-700)}.dark\:border-neutral-700\/50{border-color:#40404080}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-700\/50{border-color:color-mix(in oklab, var(--color-neutral-700) 50%, transparent)}}.dark\:border-neutral-800{border-color:var(--color-neutral-800)}.dark\:border-neutral-800\/60{border-color:#26262699}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-800\/60{border-color:color-mix(in oklab, var(--color-neutral-800) 60%, transparent)}}.dark\:border-neutral-800\/80{border-color:#262626cc}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-800\/80{border-color:color-mix(in oklab, var(--color-neutral-800) 80%, transparent)}}.dark\:border-neutral-900{border-color:var(--color-neutral-900)}.dark\:border-orange-900\/30{border-color:#7e2a0c4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-orange-900\/30{border-color:color-mix(in oklab, var(--color-orange-900) 30%, transparent)}}.dark\:border-pink-900\/30{border-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:border-pink-900\/30{border-color:color-mix(in oklab, var(--color-pink-900) 30%, transparent)}}.dark\:border-purple-800\/50{border-color:#6e11b080}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-800\/50{border-color:color-mix(in oklab, var(--color-purple-800) 50%, transparent)}}.dark\:border-purple-900\/30{border-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-900\/30{border-color:color-mix(in oklab, var(--color-purple-900) 30%, transparent)}}.dark\:border-purple-900\/40{border-color:#59168b66}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-900\/40{border-color:color-mix(in oklab, var(--color-purple-900) 40%, transparent)}}.dark\:border-red-900\/30{border-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/30{border-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.dark\:border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/40{border-color:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.dark\:border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab, red, red)){.dark\:border-teal-800\/50{border-color:color-mix(in oklab, var(--color-teal-800) 50%, transparent)}}.dark\:border-white{border-color:var(--color-white)}.dark\:border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/5{border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/10{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:bg-\[\#0C0C0C\]{background-color:#0c0c0c}.dark\:bg-\[\#0a0a0a\]{background-color:#0a0a0a}.dark\:bg-\[\#1D0002\]{background-color:#1d0002}.dark\:bg-\[\#3E3E3A\]{background-color:#3e3e3a}.dark\:bg-\[\#161615\]{background-color:#161615}.dark\:bg-\[\#eeeeec\]{background-color:#eeeeec}.dark\:bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/20{background-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/30{background-color:color-mix(in oklab, var(--color-amber-900) 30%, transparent)}}.dark\:bg-amber-950\/10{background-color:#4619011a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/10{background-color:color-mix(in oklab, var(--color-amber-950) 10%, transparent)}}.dark\:bg-amber-950\/20{background-color:#46190133}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/20{background-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.dark\:bg-amber-950\/30{background-color:#4619014d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/30{background-color:color-mix(in oklab, var(--color-amber-950) 30%, transparent)}}.dark\:bg-amber-950\/40{background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40{background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-amber-950\/60{background-color:#46190199}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/60{background-color:color-mix(in oklab, var(--color-amber-950) 60%, transparent)}}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/40{background-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/30{background-color:color-mix(in oklab, var(--color-blue-950) 30%, transparent)}}.dark\:bg-blue-950\/40{background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40{background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.dark\:bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.dark\:bg-emerald-900{background-color:var(--color-emerald-900)}.dark\:bg-emerald-900\/20{background-color:#004e3b33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/20{background-color:color-mix(in oklab, var(--color-emerald-900) 20%, transparent)}}.dark\:bg-emerald-900\/30{background-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/30{background-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:bg-emerald-950{background-color:var(--color-emerald-950)}.dark\:bg-emerald-950\/20{background-color:#002c2233}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/20{background-color:color-mix(in oklab, var(--color-emerald-950) 20%, transparent)}}.dark\:bg-emerald-950\/30{background-color:#002c224d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/30{background-color:color-mix(in oklab, var(--color-emerald-950) 30%, transparent)}}.dark\:bg-emerald-950\/40{background-color:#002c2266}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/40{background-color:color-mix(in oklab, var(--color-emerald-950) 40%, transparent)}}.dark\:bg-gray-100{background-color:var(--color-gray-100)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-800\/10{background-color:#1e29391a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/10{background-color:color-mix(in oklab, var(--color-gray-800) 10%, transparent)}}.dark\:bg-gray-800\/30{background-color:#1e29394d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/30{background-color:color-mix(in oklab, var(--color-gray-800) 30%, transparent)}}.dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/50{background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-gray-900\/30{background-color:#1018284d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/30{background-color:color-mix(in oklab, var(--color-gray-900) 30%, transparent)}}.dark\:bg-gray-900\/40{background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/40{background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/50{background-color:color-mix(in oklab, var(--color-gray-900) 50%, transparent)}}.dark\:bg-gray-900\/95{background-color:#101828f2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/95{background-color:color-mix(in oklab, var(--color-gray-900) 95%, transparent)}}.dark\:bg-gray-950{background-color:var(--color-gray-950)}.dark\:bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-900\/30{background-color:color-mix(in oklab, var(--color-indigo-900) 30%, transparent)}}.dark\:bg-indigo-950\/20{background-color:#1e1a4d33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/20{background-color:color-mix(in oklab, var(--color-indigo-950) 20%, transparent)}}.dark\:bg-indigo-950\/30{background-color:#1e1a4d4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/30{background-color:color-mix(in oklab, var(--color-indigo-950) 30%, transparent)}}.dark\:bg-indigo-950\/40{background-color:#1e1a4d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/40{background-color:color-mix(in oklab, var(--color-indigo-950) 40%, transparent)}}.dark\:bg-indigo-950\/50{background-color:#1e1a4d80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/50{background-color:color-mix(in oklab, var(--color-indigo-950) 50%, transparent)}}.dark\:bg-neutral-400{background-color:var(--color-neutral-400)}.dark\:bg-neutral-500{background-color:var(--color-neutral-500)}.dark\:bg-neutral-600{background-color:var(--color-neutral-600)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-neutral-800{background-color:var(--color-neutral-800)}.dark\:bg-neutral-800\/30{background-color:#2626264d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-800\/30{background-color:color-mix(in oklab, var(--color-neutral-800) 30%, transparent)}}.dark\:bg-neutral-800\/50{background-color:#26262680}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-800\/50{background-color:color-mix(in oklab, var(--color-neutral-800) 50%, transparent)}}.dark\:bg-neutral-900{background-color:var(--color-neutral-900)}.dark\:bg-neutral-900\/30{background-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/30{background-color:color-mix(in oklab, var(--color-neutral-900) 30%, transparent)}}.dark\:bg-neutral-900\/50{background-color:#17171780}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/50{background-color:color-mix(in oklab, var(--color-neutral-900) 50%, transparent)}}.dark\:bg-neutral-900\/90{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/90{background-color:color-mix(in oklab, var(--color-neutral-900) 90%, transparent)}}.dark\:bg-neutral-900\/95{background-color:#171717f2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/95{background-color:color-mix(in oklab, var(--color-neutral-900) 95%, transparent)}}.dark\:bg-neutral-950{background-color:var(--color-neutral-950)}.dark\:bg-neutral-950\/5{background-color:#0a0a0a0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/5{background-color:color-mix(in oklab, var(--color-neutral-950) 5%, transparent)}}.dark\:bg-neutral-950\/20{background-color:#0a0a0a33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/20{background-color:color-mix(in oklab, var(--color-neutral-950) 20%, transparent)}}.dark\:bg-neutral-950\/40{background-color:#0a0a0a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/40{background-color:color-mix(in oklab, var(--color-neutral-950) 40%, transparent)}}.dark\:bg-orange-950\/20{background-color:#44130633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-950\/20{background-color:color-mix(in oklab, var(--color-orange-950) 20%, transparent)}}.dark\:bg-pink-900\/30{background-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-900\/30{background-color:color-mix(in oklab, var(--color-pink-900) 30%, transparent)}}.dark\:bg-pink-950\/30{background-color:#5104244d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/30{background-color:color-mix(in oklab, var(--color-pink-950) 30%, transparent)}}.dark\:bg-pink-950\/40{background-color:#51042466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/40{background-color:color-mix(in oklab, var(--color-pink-950) 40%, transparent)}}.dark\:bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-500\/20{background-color:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/30{background-color:color-mix(in oklab, var(--color-purple-900) 30%, transparent)}}.dark\:bg-purple-950\/30{background-color:#3c03664d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/30{background-color:color-mix(in oklab, var(--color-purple-950) 30%, transparent)}}.dark\:bg-purple-950\/40{background-color:#3c036666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/40{background-color:color-mix(in oklab, var(--color-purple-950) 40%, transparent)}}.dark\:bg-purple-950\/60{background-color:#3c036699}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/60{background-color:color-mix(in oklab, var(--color-purple-950) 60%, transparent)}}.dark\:bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-900\/30{background-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.dark\:bg-red-950\/20{background-color:#46080933}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/20{background-color:color-mix(in oklab, var(--color-red-950) 20%, transparent)}}.dark\:bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/30{background-color:color-mix(in oklab, var(--color-red-950) 30%, transparent)}}.dark\:bg-red-950\/40{background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40{background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-500{background-color:var(--color-rose-500)}.dark\:bg-rose-950\/30{background-color:#4d02184d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-950\/30{background-color:color-mix(in oklab, var(--color-rose-950) 30%, transparent)}}.dark\:bg-sky-950\/30{background-color:#052f4a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-950\/30{background-color:color-mix(in oklab, var(--color-sky-950) 30%, transparent)}}.dark\:bg-teal-950\/60{background-color:#022f2e99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-teal-950\/60{background-color:color-mix(in oklab, var(--color-teal-950) 60%, transparent)}}.dark\:bg-white{background-color:var(--color-white)}.dark\:bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/5{background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[0\.02\]{background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}.dark\:stroke-neutral-800{stroke:var(--color-neutral-800)}.dark\:text-\[\#1C1C1A\]{color:#1c1c1a}.dark\:text-\[\#4B0600\]{color:#4b0600}.dark\:text-\[\#391800\]{color:#391800}.dark\:text-\[\#733000\]{color:#733000}.dark\:text-\[\#A1A09A\]{color:#a1a09a}.dark\:text-\[\#EDEDEC\]{color:#ededec}.dark\:text-\[\#F61500\]{color:#f61500}.dark\:text-\[\#FF4433\]{color:#f43}.dark\:text-amber-200{color:var(--color-amber-200)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-amber-500{color:var(--color-amber-500)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-emerald-200{color:var(--color-emerald-200)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-emerald-500{color:var(--color-emerald-500)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-gray-500{color:var(--color-gray-500)}.dark\:text-gray-800{color:var(--color-gray-800)}.dark\:text-gray-950{color:var(--color-gray-950)}.dark\:text-indigo-300{color:var(--color-indigo-300)}.dark\:text-indigo-400{color:var(--color-indigo-400)}.dark\:text-neutral-100{color:var(--color-neutral-100)}.dark\:text-neutral-200{color:var(--color-neutral-200)}.dark\:text-neutral-300{color:var(--color-neutral-300)}.dark\:text-neutral-400{color:var(--color-neutral-400)}.dark\:text-neutral-500{color:var(--color-neutral-500)}.dark\:text-neutral-600{color:var(--color-neutral-600)}.dark\:text-neutral-700{color:var(--color-neutral-700)}.dark\:text-neutral-900{color:var(--color-neutral-900)}.dark\:text-neutral-950{color:var(--color-neutral-950)}.dark\:text-orange-400{color:var(--color-orange-400)}.dark\:text-pink-400{color:var(--color-pink-400)}.dark\:text-purple-300{color:var(--color-purple-300)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-red-500{color:var(--color-red-500)}.dark\:text-rose-400{color:var(--color-rose-400)}.dark\:text-teal-300{color:var(--color-teal-300)}.dark\:text-white{color:var(--color-white)}.dark\:placeholder-neutral-500::placeholder{color:var(--color-neutral-500)}.dark\:placeholder-neutral-700::placeholder{color:var(--color-neutral-700)}.dark\:opacity-30{opacity:.3}.dark\:opacity-50{opacity:.5}.dark\:opacity-70{opacity:.7}.dark\:mix-blend-hard-light{mix-blend-mode:hard-light}.dark\:mix-blend-normal{mix-blend-mode:normal}.dark\:shadow-\[inset_0px_0px_0px_1px_\#fffaed2d\]{--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#fffaed2d);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-white{--tw-ring-color:var(--color-white)}.dark\:ring-white\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:ring-white\/10{--tw-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:ring-offset-neutral-900{--tw-ring-offset-color:var(--color-neutral-900)}.dark\:\[--stroke-color\:\#FF750F\]{--stroke-color:#ff750f}.dark\:\[stop-opacity\:0\.1\]{stop-opacity:.1}.dark\:\[stop-opacity\:0\.17\]{stop-opacity:.17}@media (hover:hover){.dark\:group-hover\:bg-neutral-400:is(:where(.group):hover *){background-color:var(--color-neutral-400)}.dark\:group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.dark\:before\:border-\[\#3E3E3A\]:before{content:var(--tw-content);border-color:#3e3e3a}.dark\:focus-within\:ring-white:focus-within{--tw-ring-color:var(--color-white)}@media (hover:hover){.dark\:hover\:border-\[\#3E3E3A\]:hover{border-color:#3e3e3a}.dark\:hover\:border-\[\#62605b\]:hover{border-color:#62605b}.dark\:hover\:border-amber-900\/50:hover{border-color:#7b330680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-amber-900\/50:hover{border-color:color-mix(in oklab, var(--color-amber-900) 50%, transparent)}}.dark\:hover\:border-emerald-900\/50:hover{border-color:#004e3b80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-emerald-900\/50:hover{border-color:color-mix(in oklab, var(--color-emerald-900) 50%, transparent)}}.dark\:hover\:border-indigo-900\/50:hover{border-color:#312c8580}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-indigo-900\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-900) 50%, transparent)}}.dark\:hover\:border-neutral-700:hover{border-color:var(--color-neutral-700)}.dark\:hover\:border-pink-900\/50:hover{border-color:#86104380}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-pink-900\/50:hover{border-color:color-mix(in oklab, var(--color-pink-900) 50%, transparent)}}.dark\:hover\:border-purple-900\/50:hover{border-color:#59168b80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-purple-900\/50:hover{border-color:color-mix(in oklab, var(--color-purple-900) 50%, transparent)}}.dark\:hover\:border-rose-900\/50:hover{border-color:#8b083680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-rose-900\/50:hover{border-color:color-mix(in oklab, var(--color-rose-900) 50%, transparent)}}.dark\:hover\:border-sky-900\/50:hover{border-color:#024a7080}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-sky-900\/50:hover{border-color:color-mix(in oklab, var(--color-sky-900) 50%, transparent)}}.dark\:hover\:border-white:hover{border-color:var(--color-white)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.dark\:hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.dark\:hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.dark\:hover\:bg-neutral-800:hover{background-color:var(--color-neutral-800)}.dark\:hover\:bg-neutral-800\/50:hover{background-color:#26262680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-neutral-800\/50:hover{background-color:color-mix(in oklab, var(--color-neutral-800) 50%, transparent)}}.dark\:hover\:bg-neutral-900:hover{background-color:var(--color-neutral-900)}.dark\:hover\:bg-neutral-950:hover{background-color:var(--color-neutral-950)}.dark\:hover\:bg-rose-400:hover{background-color:var(--color-rose-400)}.dark\:hover\:bg-white:hover{background-color:var(--color-white)}.dark\:hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.dark\:hover\:text-gray-200:hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-indigo-100:hover{color:var(--color-indigo-100)}.dark\:hover\:text-indigo-400:hover{color:var(--color-indigo-400)}.dark\:hover\:text-neutral-300:hover{color:var(--color-neutral-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:ring-neutral-800\/50:hover{--tw-ring-color:#26262680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:ring-neutral-800\/50:hover{--tw-ring-color:color-mix(in oklab, var(--color-neutral-800) 50%, transparent)}}}.dark\:focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.dark\:focus\:ring-neutral-400:focus{--tw-ring-color:var(--color-neutral-400)}.dark\:active\:bg-neutral-700:active{background-color:var(--color-neutral-700)}}@starting-style{.starting\:opacity-0{opacity:0}}@media (prefers-reduced-motion:no-preference){@starting-style{.motion-safe\:starting\:-translate-x-\[26px\]{--tw-translate-x:calc(26px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[51px\]{--tw-translate-x:calc(51px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[78px\]{--tw-translate-x:calc(78px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[102px\]{--tw-translate-x:calc(102px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:translate-y-6{--tw-translate-y:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}}}.\[\&_\*\]\:stroke-1 *{stroke-width:1px}.\[\&_\*\]\:stroke-2 *{stroke-width:2px}.\[\&_\*\]\:tracking-\[-0\.035em\] *{--tw-tracking:-.035em;letter-spacing:-.035em}.\[\&_\*\]\:delay-75 *{transition-delay:75ms}.\[\&_\*\]\:\[vector-effect\:non-scaling-stroke\] *{vector-effect:non-scaling-stroke}.\[\&_\.react-colorful\]\:h-\[180px\] .react-colorful{height:180px}.\[\&_\.react-colorful\]\:w-full .react-colorful{width:100%}.\[\&_a\]\:cursor-help a{cursor:help}.\[\&_a\]\:font-medium a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_a\]\:font-semibold a{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_a\]\:text-neutral-600 a{color:var(--color-neutral-600)}.\[\&_a\]\:text-neutral-800 a{color:var(--color-neutral-800)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:decoration-dotted a{text-decoration-style:dotted}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media (hover:hover){.hover\:\[\&_a\]\:text-neutral-800:hover a{color:var(--color-neutral-800)}}.\[\&_circle\]\:hidden circle{display:none}.\[\&_code_\.line\]\:before\:hidden code .line:before{content:var(--tw-content);display:none}.\[\&_img\]\:grayscale img{--tw-grayscale:grayscale(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,)}.\[\&_li\]\:marker\:text-neutral-400 li ::marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li::marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li ::-webkit-details-marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li::-webkit-details-marker{color:var(--color-neutral-400)}.\[\&_line\]\:origin-bottom line{transform-origin:bottom}.\[\&_line\]\:\[transform-box\:stroke-box\] line{transform-box:stroke-box}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-4 ol{padding-left:calc(var(--spacing) * 4)}.\[\&_strong\]\:font-medium strong{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_svg\]\:\!h-4 svg{height:calc(var(--spacing) * 4)!important}.\[\&_svg\]\:h-\[25px\] svg{height:25px}.\[\&_svg\]\:\!w-4 svg{width:calc(var(--spacing) * 4)!important}.\[\&_svg\]\:w-\[25px\] svg{width:25px}.\[\&_tbody\]\:bg-transparent tbody{background-color:#0000}.\[\&_tbody_tr\:last-child_td\]\:border-b-0 tbody tr:last-child td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&_thead\]\:hidden thead{display:none}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\>td\]\:border-b-transparent tr:last-child>td{border-bottom-color:#0000}.\[\&_tr\>\*\:first-child\]\:border-l-transparent tr>:first-child{border-left-color:#0000}.\[\&_tr\>\*\:last-child\]\:border-r-transparent tr>:last-child{border-right-color:#0000}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-4 ul{padding-left:calc(var(--spacing) * 4)}.\[\&_ul\>li\]\:pl-0 ul>li{padding-left:calc(var(--spacing) * 0)}.\[_a\]\:border-current:is(a){border-color:currentColor}.\[_a\]\:\!text-current:is(a),.\[_code\]\:\!text-current:is(code),.\[_kbd\]\:\!text-current:is(kbd),.\[_strong\]\:\!text-current:is(strong){color:currentColor!important}.\[\&\>\*\]\:mt-2>*{margin-top:calc(var(--spacing) * 2)}.\[\&\>\*\]\:size-3>*{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>\*\]\:h-3>*{height:calc(var(--spacing) * 3)}.\[\&\>\*\]\:w-3>*{width:calc(var(--spacing) * 3)}.\[\&\>\*\]\:min-w-0>*{min-width:calc(var(--spacing) * 0)}.\[\&\>\*\]\:truncate>*{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>\*\]\:border-t>*{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\>\*\]\:border-neutral-200>*{border-color:var(--color-neutral-200)}@media (min-width:40rem){.sm\:\[\&\>\*\]\:size-4>*{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.\[\&\>\*\:nth-child\(n\+3\)\]\:mt-2>:nth-child(n+3){margin-top:calc(var(--spacing) * 2)}.\[\&\>div\]\:w-full>div{width:100%}.\[\&\>div\]\:flex-initial>div{flex:0 auto}.\[\&\>div\]\:justify-end>div{justify-content:flex-end}.\[\&\>div\]\:bg-transparent>div{background-color:#0000}.\[\&\>div\]\:opacity-50>div{opacity:.5}@media (hover:hover){.group-hover\/row\:\[\&\>div\]\:opacity-100:is(:where(.group\/row):hover *)>div{opacity:1}}@media (min-width:48rem){.md\:\[\&\>div\]\:max-h-\[calc\(100dvh-200px\)\]>div{max-height:calc(100dvh - 200px)}.md\:\[\&\>div\]\:min-h-\[min\(566px\,_calc\(100dvh-200px\)\)\]>div{min-height:min(566px,100dvh - 200px)}}.\[\&\>div\:first-of-type\]\:max-w-\[640px\]>div:first-of-type{max-width:640px}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-5>svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.\[\&\>svg\]\:text-neutral-400>svg{color:var(--color-neutral-400)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}@media (min-resolution:2x){@container (min-width:800px){.\[\@media\(min-resolution\:2dppx\)\]\:\@\[800px\]\:rotate-\[2\.4deg\]{rotate:2.4deg}}}.short-url-card{position:relative!important}.short-url-card:hover{z-index:20!important}.short-url-card:focus-within{z-index:30!important}.short-url-card .fi-ta-actions{z-index:10!important;margin:0!important;padding:0!important;position:absolute!important;top:1.25rem!important;right:1.25rem!important}.ab-test-slider{margin-top:0}.ab-test-slider .noUi-tooltip{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#ffffff26;border-radius:100px;justify-content:center;align-items:center;width:30px;height:20px;padding:0;font-size:12px;display:flex;position:absolute;top:-24px;bottom:inherit!important}.action-trigger-btn{transition:all .2s ease-in-out;background-color:#0000!important;border:1px solid #0000!important}.short-url-card:hover .action-trigger-btn{background-color:#f9fafb!important;border-color:#e5e7eb!important}.dark .short-url-card:hover .action-trigger-btn{background-color:#1f2937!important;border-color:#374151!important}.action-trigger-btn[aria-expanded=true]{background-color:#f3f4f6!important;border-color:#9ca3af!important;box-shadow:0 0 0 4px #e5e6eb80!important}.dark .action-trigger-btn[aria-expanded=true]{background-color:#111827!important;border-color:#4b5563!important;box-shadow:0 0 0 4px #37415180!important}.custom-fused .fi-input-wrp{border:0!important}select.fi-select-input:disabled,.fi-select-input .fi-select-input-btn[disabled],.fi-select-input .fi-select-input-btn.fi-disabled{background-image:none!important;padding-right:.75rem!important}.folder-card .fi-ta-record-content,.folder-card .fi-ta-record-content-ctn{width:100%!important;height:100%!important;padding:0!important}.folder-card .fi-ta-record-content{flex-direction:column!important;display:flex!important}.folder-card .fi-ta-actions{z-index:20!important;margin:0!important;padding:0!important;position:absolute!important;top:1rem!important;right:1rem!important}.folder-card .fi-ta-stack,.folder-card .fi-ta-stack>div,.folder-card .fi-ta-text,.folder-card .fi-ta-text>div{height:100%!important}.update-link-modal .fi-section,.update-link-modal section.fi-section.fi-section-not-contained{box-shadow:none!important}.qr-color-picker input[type=color]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.qr-margin-top,.qr-space-y>div{margin-top:12px!important}.qr-space-y>div:first-child{margin-top:0!important}@keyframes qr-spin{to{transform:rotate(360deg)}}.qr-designer-grid{grid-template-columns:340px 1fr;align-items:stretch;gap:2rem;width:100%;display:grid}@media (max-width:768px){.qr-designer-grid{grid-template-columns:1fr;gap:1.5rem}}.qr-preview-sticky{flex-direction:column;align-items:stretch;height:100%;display:flex;position:sticky;top:0;margin-top:0!important}.qr-accordion{flex-direction:column;gap:12px;display:flex}.qr-accordion-item{background:#fff;border:1px solid #e5e7eb;border-radius:12px;transition:all .2s ease-in-out;overflow:hidden}.dark .qr-accordion-item{background:#18181b;border-color:#27272a}.qr-accordion-item.open{border-color:#6366f1;box-shadow:0 4px 12px #6366f10d}.dark .qr-accordion-item.open{border-color:#818cf8;box-shadow:0 4px 12px #818cf81a}.qr-accordion-header{cursor:pointer;text-transform:uppercase;letter-spacing:.06em;color:#4b5563;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;width:100%;padding:14px 16px;font-size:13px;font-weight:700;transition:color .15s;display:flex}.dark .qr-accordion-header{color:#9ca3af}.qr-accordion-header:hover{color:#6366f1}.dark .qr-accordion-header:hover{color:#818cf8}.qr-accordion-icon{color:#9ca3af;width:18px;height:18px;transition:color .15s}.qr-accordion-item.open .qr-accordion-icon{color:#6366f1}.dark .qr-accordion-item.open .qr-accordion-icon{color:#818cf8}.qr-accordion-chevron{color:#9ca3af;width:16px;height:16px;transition:transform .2s ease-in-out}.qr-accordion-content{background:#fafafa;border-top:1px solid #f3f4f6;padding:0 16px 16px}.dark .qr-accordion-content{background:#1c1c1f;border-top-color:#27272a}.qr-label{color:#9ca3af;text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px;font-size:11px;font-weight:700;display:block}.qr-select{color:#111827;appearance:none;cursor:pointer;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E") right 8px center/16px no-repeat;border:1.5px solid #e5e7eb;border-radius:8px;width:100%;padding:8px 30px 8px 12px;font-size:13px;font-weight:500;transition:border-color .15s}.qr-select:focus{border-color:#6366f1;outline:none}.dark .qr-select{color:#f9fafb;background-color:#18181b;border-color:#27272a}.qr-input-num{color:#111827;background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;width:100%;padding:8px 12px;font-size:13px;font-weight:500;transition:border-color .15s}.qr-input-num:focus{border-color:#6366f1;outline:none}.dark .qr-input-num{color:#f9fafb;background-color:#18181b;border-color:#27272a}.qr-segment-control{background:#f3f4f6;border-radius:8px;gap:2px;padding:3px;display:flex}.dark .qr-segment-control{background:#27272a}.qr-segment-btn{color:#6b7280;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:all .15s ease-in-out;display:flex}.dark .qr-segment-btn{color:#9ca3af}.qr-segment-btn.active{color:#4f46e5;background:#fff;box-shadow:0 1px 3px #00000014}.dark .qr-segment-btn.active{color:#fff;background:#3f3f46;box-shadow:0 1px 3px #0003}.qr-toggle{cursor:pointer;border-radius:9999px;flex-shrink:0;align-items:center;width:40px;height:22px;transition:background-color .2s;display:inline-flex;position:relative}.qr-toggle.on{background:#6366f1}.qr-toggle.off{background:#d1d5db}.dark .qr-toggle.off{background:#4b5563}.qr-toggle-thumb{pointer-events:none;background:#fff;border-radius:50%;width:18px;height:18px;transition:transform .2s;position:absolute;left:2px;box-shadow:0 2px 4px #00000026}.qr-toggle.on .qr-toggle-thumb{transform:translate(18px)}.qr-upload-zone{cursor:pointer;text-align:center;background:#fff;border:2px dashed #d1d5db;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;padding:20px;transition:all .15s ease-in-out;display:flex}.dark .qr-upload-zone{background:#18181b;border-color:#3f3f46}.qr-upload-zone:hover,.qr-upload-zone.dragover{background:#f5f3ff;border-color:#6366f1}.dark .qr-upload-zone:hover,.dark .qr-upload-zone.dragover{background:#1e1b4b;border-color:#818cf8}.qr-upload-icon{color:#9ca3af;width:28px;height:28px;margin-bottom:8px;transition:color .15s}.qr-upload-zone:hover .qr-upload-icon,.qr-upload-zone.dragover .qr-upload-icon{color:#6366f1}.dark .qr-upload-zone:hover .qr-upload-icon,.dark .qr-upload-zone.dragover .qr-upload-icon{color:#818cf8}.qr-upload-text{color:#4b5563;font-size:11px;font-weight:600}.dark .qr-upload-text{color:#d1d5db}.qr-upload-hint{color:#9ca3af;margin-top:2px;font-size:10px}.qr-slider-container{flex-direction:column;gap:6px;display:flex}.qr-slider-track-wrap{align-items:center;gap:12px;display:flex}.qr-range-input{appearance:none;cursor:pointer;background:#e5e7eb;border-radius:9999px;outline:none;flex:1;height:5px}.dark .qr-range-input{background:#4b5563}.qr-range-input::-webkit-slider-thumb{appearance:none;background:#6366f1;border:2px solid #fff;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 1px 3px #00000026}.qr-range-input::-webkit-slider-thumb:hover{transform:scale(1.15)}.qr-range-input::-moz-range-thumb{background:#6366f1;border:2px solid #fff;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 1px 3px #00000026}.qr-range-input::-moz-range-thumb:hover{transform:scale(1.15)}.qr-badge{color:#4f46e5;background:#eef2ff;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:700}.dark .qr-badge{color:#a5b4fc;background:#1e1b4b}.qr-color-field{background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;align-items:center;gap:8px;width:100%;padding:4px 8px;display:flex}.dark .qr-color-field{background:#18181b;border-color:#27272a}.qr-color-swatch{cursor:pointer;border:1px solid #d1d5db;border-radius:6px;flex-shrink:0;width:24px;height:24px;position:relative;overflow:hidden}.dark .qr-color-swatch{border-color:#3f3f46}.qr-hex-input{color:#374151;letter-spacing:.03em;width:100%;font-family:monospace;font-size:11px;font-weight:600;background:0 0!important;border:none!important;padding:2px 4px!important}.dark .qr-hex-input{color:#f9fafb}.qr-hex-input:focus{box-shadow:none!important;outline:none!important}.qr-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.qr-space-y-4>*+*{margin-top:16px}.qr-preview-card{background:#fff;border:1px solid #e5e7eb;border-radius:16px;flex-direction:column;align-items:center;width:100%;max-width:none;height:100%;padding:20px;transition:all .2s ease-in-out;display:flex;box-shadow:0 10px 25px -5px #0000000d,0 8px 10px -6px #0000000d}.dark .qr-preview-card{background:#18181b;border-color:#27272a;box-shadow:0 10px 25px -5px #0000004d,0 8px 10px -6px #0000004d}.qr-dl-btn{color:#374151;cursor:pointer;background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;align-items:center;gap:5px;padding:6px 14px;font-size:12px;font-weight:600;transition:all .15s;display:inline-flex}.qr-dl-btn:hover{background:#f9fafb;border-color:#d1d5db}.dark .qr-dl-btn{color:#d1d5db;background:#374151;border-color:#4b5563}.dark .qr-dl-btn:hover{background:#4b5563}.qr-checker{background-color:#f3f4f6;background-image:linear-gradient(45deg,#d1d5db 25%,#0000 25%),linear-gradient(-45deg,#d1d5db 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#d1d5db 75%),linear-gradient(-45deg,#0000 75%,#d1d5db 75%);background-position:0 0,0 5px,5px -5px,-5px 0;background-size:10px 10px}.qr-preview-wrapper canvas,.qr-preview-wrapper svg{aspect-ratio:1;display:block;max-width:100%!important;height:100%!important}.qr-preview-dots-bg{background-color:#fafafa;background-image:radial-gradient(#9ca3af38 1px,#0000 0);background-size:8px 8px}.dark .qr-preview-dots-bg{background-color:#121214;background-image:radial-gradient(#9ca3af1f 1px,#0000 0)}.modal-fsl .fi-modal-header,.modal-fsl .fi-modal-footer{padding-top:16px!important;padding-bottom:16px!important}.modal-fsl .fi-modal-footer{justify-content:end!important;display:flex!important}.create-link-sidebar .sidebar-qr-container button svg,.create-link-sidebar .sidebar-qr-container .fi-ac-action-btn svg,.create-link-sidebar .sidebar-qr-container .fi-btn-icon{stroke-width:2px!important;stroke-width:2px!important;width:20px!important;height:20px!important}.create-link-sidebar label,.create-link-sidebar .fi-fo-field-wrp-label,.create-link-sidebar .fi-fo-field-wrp-label label,.create-link-sidebar .fi-label,.create-link-sidebar-select-wrapper label,.create-link-sidebar-select-wrapper .fi-fo-field-wrp-label,.create-link-sidebar-select-wrapper .fi-label{font-weight:600!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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{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}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-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-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom: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:""}}}:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-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-100:oklch(95.4% .038 75.164);--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-900:oklch(40.8% .123 38.172);--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-100:oklch(96.7% .067 122.328);--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-100:oklch(95% .052 163.051);--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-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-100:oklch(95.3% .051 180.801);--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-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--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-900:oklch(39.8% .07 227.392);--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-100:oklch(94.3% .029 294.588);--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-900:oklch(38% .189 293.745);--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-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-100:oklch(95.2% .037 318.852);--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-900:oklch(40.1% .17 325.612);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--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-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--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-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--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 0);--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 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--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:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--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-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-xs:.125rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--radius-4xl:2rem;--shadow-2xs:0 1px #0000000d;--shadow-xs:0 1px 2px 0 #0000000d;--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;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--shadow-2xl:0 25px 50px -12px #00000040;--inset-shadow-2xs:inset 0 1px #0000000d;--inset-shadow-xs:inset 0 1px 1px #0000000d;--inset-shadow-sm:inset 0 2px 4px #0000000d;--drop-shadow-xs:0 1px 1px #0000000d;--drop-shadow-sm:0 1px 2px #00000026;--drop-shadow-md:0 3px 3px #0000001f;--drop-shadow-lg:0 4px 4px #00000026;--drop-shadow-xl:0 9px 7px #0000001a;--drop-shadow-2xl:0 25px 25px #00000026;--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;--animate-bounce:bounce 1s infinite;--blur-xs:4px;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--perspective-dramatic:100px;--perspective-near:300px;--perspective-normal:500px;--perspective-midrange:800px;--perspective-distant:1200px;--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)}.\@container\/page{container:page/inline-size}.\@container\/page-content{container:page-content/inline-size}.\@container\/panel{container:panel/inline-size}.\@container\/stats{container:stats/inline-size}.\@container,.\[container-type\:inline-size\]{container-type:inline-size}.\[container-type\:size\]{container-type: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}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-16{inset:calc(var(--spacing) * -16)}.-inset-\[50\%\]{inset:-50%}.inset-0{inset:calc(var(--spacing) * 0)}.inset-\[unset\]{inset:unset}.-inset-x-10{inset-inline:calc(var(--spacing) * -10)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-x-4{inset-inline:calc(var(--spacing) * 4)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.inset-y-1{inset-block:calc(var(--spacing) * 1)}.-top-0\.5{top:calc(var(--spacing) * -.5)}.-top-1{top:calc(var(--spacing) * -1)}.-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-4{top:calc(var(--spacing) * -4)}.-top-6{top:calc(var(--spacing) * -6)}.-top-px{top:-1px}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:calc(var(--spacing) * 1)}.top-1\/2{top:50%}.top-1\/3{top:33.3333%}.top-2{top:calc(var(--spacing) * 2)}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-6{top:calc(var(--spacing) * 6)}.top-8{top:calc(var(--spacing) * 8)}.top-9{top:calc(var(--spacing) * 9)}.top-12{top:calc(var(--spacing) * 12)}.top-14{top:calc(var(--spacing) * 14)}.top-16{top:calc(var(--spacing) * 16)}.top-20{top:calc(var(--spacing) * 20)}.top-28{top:calc(var(--spacing) * 28)}.top-\[-20px\]{top:-20px}.top-\[-30px\]{top:-30px}.top-\[-36px\]{top:-36px}.top-\[57\%\]{top:57%}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1{right:calc(var(--spacing) * -1)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-4{right:calc(var(--spacing) * -4)}.-right-10{right:calc(var(--spacing) * -10)}.-right-px{right:-1px}.right-0{right:calc(var(--spacing) * 0)}.right-0\.5{right:calc(var(--spacing) * .5)}.right-1{right:calc(var(--spacing) * 1)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-2\.5{right:calc(var(--spacing) * 2.5)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.right-10{right:calc(var(--spacing) * 10)}.right-12{right:calc(var(--spacing) * 12)}.right-\[-17px\]{right:-17px}.right-\[62cqh\]{right:62cqh}.right-\[calc\(14px\+0\.375rem\)\]{right:calc(14px + .375rem)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.-bottom-1{bottom:calc(var(--spacing) * -1)}.-bottom-2{bottom:calc(var(--spacing) * -2)}.-bottom-px{bottom:-1px}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-\[45\%\]{bottom:45%}.bottom-full{bottom:100%}.-left-1\/4{left:-25%}.-left-4{left:calc(var(--spacing) * -4)}.-left-8{left:calc(var(--spacing) * -8)}.left-0{left:calc(var(--spacing) * 0)}.left-1{left:calc(var(--spacing) * 1)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.left-7{left:calc(var(--spacing) * 7)}.left-\[-17px\]{left:-17px}.left-\[11\.5px\]{left:11.5px}.left-\[11px\]{left:11px}.left-\[22px\]{left:22px}.left-\[calc\(50\%\+12px\)\]{left:calc(50% + 12px)}.left-\[calc\(50\%-60px\)\]{left:calc(50% - 60px)}.left-\[calc\(50\%-122px\)\]{left:calc(50% - 122px)}.left-full{left:100%}.isolate{isolation:isolate}.-z-10{z-index:calc(10 * -1)}.-z-\[1\]{z-index:calc(1 * -1)}.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-\[5\]{z-index:5}.z-\[11\]{z-index:11}.z-\[99\]{z-index:99}.z-\[100\]{z-index:100}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-first{order:-9999}.order-last{order:9999}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-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}}.container\!{width:100%!important}@media (min-width:40rem){.container\!{max-width:40rem!important}}@media (min-width:48rem){.container\!{max-width:48rem!important}}@media (min-width:64rem){.container\!{max-width:64rem!important}}@media (min-width:80rem){.container\!{max-width:80rem!important}}@media (min-width:96rem){.container\!{max-width:96rem!important}}.-m-0\.5{margin:calc(var(--spacing) * -.5)}.-m-1{margin:calc(var(--spacing) * -1)}.-m-1\.5{margin:calc(var(--spacing) * -1.5)}.-m-2{margin:calc(var(--spacing) * -2)}.m-0{margin:calc(var(--spacing) * 0)}.m-1{margin:calc(var(--spacing) * 1)}.m-2{margin:calc(var(--spacing) * 2)}.m-3{margin:calc(var(--spacing) * 3)}.m-4{margin:calc(var(--spacing) * 4)}.m-5{margin:calc(var(--spacing) * 5)}.m-auto{margin:auto}.m-px{margin:1px}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-mx-2\.5{margin-inline:calc(var(--spacing) * -2.5)}.-mx-3{margin-inline:calc(var(--spacing) * -3)}.-mx-5{margin-inline:calc(var(--spacing) * -5)}.-mx-px{margin-inline:-1px}.mx-0{margin-inline:calc(var(--spacing) * 0)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.mx-px{margin-inline:1px}.-my-0\.5{margin-block:calc(var(--spacing) * -.5)}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-0{margin-block:calc(var(--spacing) * 0)}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:calc(var(--spacing) * 1)}.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-8{margin-block:calc(var(--spacing) * 8)}.my-10{margin-block:calc(var(--spacing) * 10)}.my-\[-0\.1em\]{margin-block:-.1em}.my-auto{margin-block:auto}.my-px{margin-block:1px}.\!mt-0{margin-top:calc(var(--spacing) * 0)!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{margin-top:calc(var(--spacing) * -2)}.-mt-3\.5{margin-top:calc(var(--spacing) * -3.5)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-8{margin-top:calc(var(--spacing) * -8)}.-mt-16{margin-top:calc(var(--spacing) * -16)}.-mt-\[6\.6rem\]{margin-top:-6.6rem}.-mt-px{margin-top:-1px}.mt-0{margin-top:calc(var(--spacing) * 0)}.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{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-5{margin-top:calc(var(--spacing) * 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-20{margin-top:calc(var(--spacing) * 20)}.mt-22{margin-top:calc(var(--spacing) * 22)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mt-\[5px\]{margin-top:5px}.mt-\[17px\]{margin-top:17px}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.-mr-1{margin-right:calc(var(--spacing) * -1)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.-mr-px{margin-right:-1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-2\.5{margin-right:calc(var(--spacing) * 2.5)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mr-12{margin-right:calc(var(--spacing) * 12)}.-mb-0\.5{margin-bottom:calc(var(--spacing) * -.5)}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.-mb-3{margin-bottom:calc(var(--spacing) * -3)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-18{margin-bottom:calc(var(--spacing) * 18)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.mb-\[3px\]{margin-bottom:3px}.-ml-0\.5{margin-left:calc(var(--spacing) * -.5)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.-ml-1\.5{margin-left:calc(var(--spacing) * -1.5)}.-ml-2{margin-left:calc(var(--spacing) * -2)}.-ml-2\.5{margin-left:calc(var(--spacing) * -2.5)}.-ml-4{margin-left:calc(var(--spacing) * -4)}.-ml-8{margin-left:calc(var(--spacing) * -8)}.-ml-px{margin-left:-1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.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-6{margin-left:calc(var(--spacing) * 6)}.ml-7{margin-left:calc(var(--spacing) * 7)}.ml-12{margin-left:calc(var(--spacing) * 12)}.ml-\[calc\(\(var\(--idx\)\+1\)\*5\%\)\]{margin-left:calc((var(--idx) + 1) * 5%)}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.box-content{box-sizing:content-box}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.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}.line-clamp-4{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline\!{display:inline!important}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table\!{display:table!important}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-\[4\.2\]{aspect-ratio:4.2}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-\[5\/1\]{aspect-ratio:5}.aspect-\[9\/16\]{aspect-ratio:9/16}.aspect-\[16\/9\]{aspect-ratio:16/9}.aspect-\[16\/10\]{aspect-ratio:16/10}.aspect-\[16\/12\]{aspect-ratio:16/12}.aspect-\[96\/40\]{aspect-ratio:96/40}.aspect-\[335\/364\]{aspect-ratio:335/364}.aspect-\[900\/580\]{aspect-ratio:900/580}.aspect-\[1084\/994\]{aspect-ratio:1084/994}.aspect-\[1200\/630\]{aspect-ratio:1200/630}.aspect-\[1368\/994\]{aspect-ratio:1368/994}.aspect-\[unset\]{aspect-ratio:unset}.aspect-\[var\(--aspect\,1200\/630\)\]{aspect-ratio:var(--aspect,1200/630)}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-0\.5{width:calc(var(--spacing) * .5);height:calc(var(--spacing) * .5)}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.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-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.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\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.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-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-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-20{width:calc(var(--spacing) * 20);height:calc(var(--spacing) * 20)}.size-24{width:calc(var(--spacing) * 24);height:calc(var(--spacing) * 24)}.size-32{width:calc(var(--spacing) * 32);height:calc(var(--spacing) * 32)}.size-36{width:calc(var(--spacing) * 36);height:calc(var(--spacing) * 36)}.size-72{width:calc(var(--spacing) * 72);height:calc(var(--spacing) * 72)}.size-\[1\.125rem\]{width:1.125rem;height:1.125rem}.size-\[4\.5rem\]{width:4.5rem;height:4.5rem}.size-\[8px\]{width:8px;height:8px}.size-\[11px\]{width:11px;height:11px}.size-\[18px\]{width:18px;height:18px}.size-\[28px\]{width:28px;height:28px}.size-\[34px\]{width:34px;height:34px}.size-\[42px\]{width:42px;height:42px}.size-\[70px\]{width:70px;height:70px}.size-\[80px\]{width:80px;height:80px}.size-\[82px\]{width:82px;height:82px}.size-\[104px\]{width:104px;height:104px}.size-\[132px\]{width:132px;height:132px}.size-full{width:100%;height:100%}.\!h-8{height:calc(var(--spacing) * 8)!important}.h-0{height:calc(var(--spacing) * 0)}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-1\/2{height:50%}.h-1\/4{height:25%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-2\/3{height:66.6667%}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-6\.5{height:calc(var(--spacing) * 6.5)}.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-14\.5{height:calc(var(--spacing) * 14.5)}.h-16{height:calc(var(--spacing) * 16)}.h-18{height:calc(var(--spacing) * 18)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-28{height:calc(var(--spacing) * 28)}.h-32{height:calc(var(--spacing) * 32)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-44{height:calc(var(--spacing) * 44)}.h-48{height:calc(var(--spacing) * 48)}.h-52{height:calc(var(--spacing) * 52)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-80{height:calc(var(--spacing) * 80)}.h-96{height:calc(var(--spacing) * 96)}.h-\[1em\]{height:1em}.h-\[1px\]{height:1px}.h-\[2\.35rem\]{height:2.35rem}.h-\[4\.5rem\]{height:4.5rem}.h-\[5px\]{height:5px}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[24px\]{height:24px}.h-\[24rem\]{height:24rem}.h-\[26px\]{height:26px}.h-\[27px\]{height:27px}.h-\[28rem\]{height:28rem}.h-\[30px\]{height:30px}.h-\[32px\]{height:32px}.h-\[38px\]{height:38px}.h-\[39px\]{height:39px}.h-\[44px\]{height:44px}.h-\[50vh\]{height:50vh}.h-\[51px\]{height:51px}.h-\[55vh\]{height:55vh}.h-\[60\%\]{height:60%}.h-\[60px\]{height:60px}.h-\[64px\]{height:64px}.h-\[65vh\]{height:65vh}.h-\[66px\]{height:66px}.h-\[72px\]{height:72px}.h-\[81px\]{height:81px}.h-\[85vh\]{height:85vh}.h-\[90\%\]{height:90%}.h-\[90px\]{height:90px}.h-\[94px\]{height:94px}.h-\[100px\]{height:100px}.h-\[102px\]{height:102px}.h-\[104px\]{height:104px}.h-\[115px\]{height:115px}.h-\[120px\]{height:120px}.h-\[124px\]{height:124px}.h-\[125px\]{height:125px}.h-\[130px\]{height:130px}.h-\[132px\]{height:132px}.h-\[135\%\]{height:135%}.h-\[140px\]{height:140px}.h-\[156px\]{height:156px}.h-\[158px\]{height:158px}.h-\[161px\]{height:161px}.h-\[170px\]{height:170px}.h-\[190px\]{height:190px}.h-\[200\%\]{height:200%}.h-\[200px\]{height:200px}.h-\[250px\]{height:250px}.h-\[260px\]{height:260px}.h-\[280px\]{height:280px}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[420px\]{height:420px}.h-\[444px\]{height:444px}.h-\[500px\]{height:500px}.h-\[660px\]{height:660px}.h-\[700px\]{height:700px}.h-\[720px\]{height:720px}.h-\[calc\(100\%-0\.5rem\)\]{height:calc(100% - .5rem)}.h-\[calc\(100\%-8px\)\]{height:calc(100% - 8px)}.h-\[calc\(100dvh-48px\)\]{height:calc(100dvh - 48px)}.h-\[calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-\[calc\(100vh-16px\)\]{height:calc(100vh - 16px)}.h-\[calc\(100vh-48px\)\]{height:calc(100vh - 48px)}.h-\[max\(1200px\,100\%\)\]{height:max(1200px,100%)}.h-\[var\(--page-height\)\]{height:var(--page-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing) * 0)}.max-h-7{max-height:calc(var(--spacing) * 7)}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-84{max-height:calc(var(--spacing) * 84)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[26rem\]{max-height:26rem}.max-h-\[40vh\]{max-height:40vh}.max-h-\[50dvh\]{max-height:50dvh}.max-h-\[52vh\]{max-height:52vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95dvh\]{max-height:95dvh}.max-h-\[190px\]{max-height:190px}.max-h-\[530px\]{max-height:530px}.max-h-\[700px\]{max-height:700px}.max-h-\[800px\]{max-height:800px}.max-h-\[calc\(70dvh\)\]{max-height:70dvh}.max-h-\[calc\(100dvh-50px\)\]{max-height:calc(100dvh - 50px)}.max-h-\[calc\(100dvh-64px\)\]{max-height:calc(100dvh - 64px)}.max-h-\[calc\(100dvh-100px\)\]{max-height:calc(100dvh - 100px)}.max-h-\[calc\(100dvh-200px\)\]{max-height:calc(100dvh - 200px)}.max-h-\[calc\(100dvh-250px\)\]{max-height:calc(100dvh - 250px)}.max-h-\[calc\(100dvh-280px\)\]{max-height:calc(100dvh - 280px)}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.max-h-\[calc\(100vh-160px\)\]{max-height:calc(100vh - 160px)}.max-h-\[calc\(100vh-300px\)\]{max-height:calc(100vh - 300px)}.max-h-\[calc\(100vh-350px\)\]{max-height:calc(100vh - 350px)}.max-h-\[calc\(100vh-400px\)\]{max-height:calc(100vh - 400px)}.max-h-\[calc\(var\(--radix-popper-available-height\,100dvh\)-12px\)\]{max-height:calc(var(--radix-popper-available-height,100dvh) - 12px)}.max-h-\[min\(40dvh\,15rem\)\]{max-height:min(40dvh,15rem)}.max-h-\[min\(260px\,calc\(100vh-300px\)\)\]{max-height:min(260px,100vh - 300px)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-48{min-height:calc(var(--spacing) * 48)}.min-h-\[20px\]{min-height:20px}.min-h-\[22rem\]{min-height:22rem}.min-h-\[40px\]{min-height:40px}.min-h-\[100dvh\]{min-height:100dvh}.min-h-\[200px\]{min-height:200px}.min-h-\[280px\]{min-height:280px}.min-h-\[300px\]{min-height:300px}.min-h-\[315px\]{min-height:315px}.min-h-\[400px\]{min-height:400px}.min-h-\[500px\]{min-height:500px}.min-h-\[calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{min-height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.min-h-\[calc\(100vh-1rem\)\]{min-height:calc(100vh - 1rem)}.min-h-\[calc\(100vh-10rem\)\]{min-height:calc(100vh - 10rem)}.min-h-\[calc\(100vh-60px\)\]{min-height:calc(100vh - 60px)}.min-h-\[calc\(100vh-200px\)\]{min-height:calc(100vh - 200px)}.min-h-\[var\(--page-height\)\]{min-height:var(--page-height)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.\!w-8{width:calc(var(--spacing) * 8)!important}.\!w-full{width:100%!important}.w-0{width:calc(var(--spacing) * 0)}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.6667%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-2\/5{width:40%}.w-2\/6{width:33.3333%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing) * 6)}.w-6\.5{width:calc(var(--spacing) * 6.5)}.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-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-\[1px\]{width:1px}.w-\[2\.125rem\]{width:2.125rem}.w-\[4\.75rem\]{width:4.75rem}.w-\[5\/6\]{width:5/6}.w-\[5px\]{width:5px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[40px\]{width:40px}.w-\[44px\]{width:44px}.w-\[51px\]{width:51px}.w-\[64px\]{width:64px}.w-\[70\%\]{width:70%}.w-\[82px\]{width:82px}.w-\[88\%\]{width:88%}.w-\[100px\]{width:100px}.w-\[102px\]{width:102px}.w-\[120px\]{width:120px}.w-\[150\%\]{width:150%}.w-\[199px\]{width:199px}.w-\[207px\]{width:207px}.w-\[220px\]{width:220px}.w-\[236px\]{width:236px}.w-\[240px\]{width:240px}.w-\[244px\]{width:244px}.w-\[260px\]{width:260px}.w-\[280px\]{width:280px}.w-\[284px\]{width:284px}.w-\[340px\]{width:340px}.w-\[392px\]{width:392px}.w-\[438px\]{width:438px}.w-\[444px\]{width:444px}.w-\[600px\]{width:600px}.w-\[640px\]{width:640px}.w-\[879px\]{width:879px}.w-\[888px\]{width:888px}.w-\[1080px\]{width:1080px}.w-\[1200px\]{width:1200px}.w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.w-\[calc\(var\(--sidebar-areas-width\)-0\.5rem\)\]{width:calc(var(--sidebar-areas-width) - .5rem)}.w-\[var\(--radix-popover-trigger-width\)\]{width:var(--radix-popover-trigger-width)}.w-\[var\(--sidebar-width\)\]{width:var(--sidebar-width)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-min{width:min-content}.w-px{width:1px}.w-screen{width:100vw}.w-xs{width:var(--container-xs)}.max-w-0{max-width:calc(var(--spacing) * 0)}.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-32{max-width:calc(var(--spacing) * 32)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-44{max-width:calc(var(--spacing) * 44)}.max-w-52{max-width:calc(var(--spacing) * 52)}.max-w-60{max-width:calc(var(--spacing) * 60)}.max-w-64{max-width:calc(var(--spacing) * 64)}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-96{max-width:calc(var(--spacing) * 96)}.max-w-\[13rem\]{max-width:13rem}.max-w-\[20rem\]{max-width:20rem}.max-w-\[50ch\]{max-width:50ch}.max-w-\[85\%\]{max-width:85%}.max-w-\[85px\]{max-width:85px}.max-w-\[100px\]{max-width:100px}.max-w-\[112px\]{max-width:112px}.max-w-\[130px\]{max-width:130px}.max-w-\[140px\]{max-width:140px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[192px\]{max-width:192px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[225px\]{max-width:225px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[335px\]{max-width:335px}.max-w-\[350px\]{max-width:350px}.max-w-\[360px\]{max-width:360px}.max-w-\[370px\]{max-width:370px}.max-w-\[400px\]{max-width:400px}.max-w-\[420px\]{max-width:420px}.max-w-\[430px\]{max-width:430px}.max-w-\[440px\]{max-width:440px}.max-w-\[480px\]{max-width:480px}.max-w-\[495px\]{max-width:495px}.max-w-\[500px\]{max-width:500px}.max-w-\[600px\]{max-width:600px}.max-w-\[700px\]{max-width:700px}.max-w-\[768px\]{max-width:768px}.max-w-\[800px\]{max-width:800px}.max-w-\[calc\(100\%-1\.5rem\)\]{max-width:calc(100% - 1.5rem)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-\[calc\(100cqw-32px\)\]{max-width:calc(100cqw - 32px)}.max-w-\[calc\(var\(--cols\)\*342px\)\]{max-width:calc(var(--cols) * 342px)}.max-w-\[min\(100\%\,11rem\)\]{max-width:min(100%,11rem)}.max-w-\[min\(100\%\,512px\)\]{max-width:min(100%,512px)}.max-w-\[min\(100vw-2rem\,17\.5rem\)\]{max-width:min(100vw - 2rem,17.5rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.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-prose{max-width:65ch}.max-w-screen{max-width:100vw}.max-w-screen-2xl{max-width:var(--breakpoint-2xl)}.max-w-screen-lg{max-width:var(--breakpoint-lg)}.max-w-screen-md{max-width:var(--breakpoint-md)}.max-w-screen-sm{max-width:var(--breakpoint-sm)}.max-w-screen-xl{max-width:var(--breakpoint-xl)}.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:calc(var(--spacing) * 0)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-12{min-width:calc(var(--spacing) * 12)}.min-w-14{min-width:calc(var(--spacing) * 14)}.min-w-16{min-width:calc(var(--spacing) * 16)}.min-w-20{min-width:calc(var(--spacing) * 20)}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[52px\]{min-width:52px}.min-w-\[110px\]{min-width:110px}.min-w-\[140px\]{min-width:140px}.min-w-\[150px\]{min-width:150px}.min-w-\[280px\]{min-width:280px}.min-w-\[1000px\]{min-width:1000px}.min-w-\[1010px\]{min-width:1010px}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.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-0{flex-basis:calc(var(--spacing) * 0)}.basis-2\/3{flex-basis:66.6667%}.basis-full{flex-basis:100%}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing) * 0);--tw-border-spacing-y:calc(var(--spacing) * 0);border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.\[transform-origin\:center\]{transform-origin:50%}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.origin-center{transform-origin:50%}.origin-left{transform-origin:0}.origin-top{transform-origin:top}.origin-top-left{transform-origin:0 0}.-translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-2{--tw-translate-x:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-3{--tw-translate-x:calc(var(--spacing) * -3);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-14{--tw-translate-x:calc(var(--spacing) * -14);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-14{--tw-translate-x:calc(var(--spacing) * 14);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[calc\(var\(--current-panel\)\*-100\%\)\]{--tw-translate-x:calc(var(--current-panel) * -100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[calc\(var\(--dx\)\*1px\)\]{--tw-translate-x:calc(var(--dx) * 1px);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-0\.5{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-4{--tw-translate-y:calc(var(--spacing) * -4);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-px{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1{--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[3px\]{--tw-translate-y:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[30\%\]{--tw-translate-y:30%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[var\(--y\)\]{--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-px{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-scale-100{--tw-scale-x:calc(100% * -1);--tw-scale-y:calc(100% * -1);--tw-scale-z:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;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)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-x-100{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-x-\[1\.8\]{--tw-scale-x:calc(1.8 * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-x-\[1\.6\]{--tw-scale-x:1.6;scale:var(--tw-scale-x) var(--tw-scale-y)}.-scale-y-100{--tw-scale-y:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-\[var\(--scale\)\]{scale:var(--scale)}.-rotate-90{rotate:-90deg}.-rotate-\[55deg\]{rotate:-55deg}.rotate-0{rotate:0deg}.rotate-1{rotate:1deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-\[-8deg\]{rotate:-8deg}.rotate-\[-15deg\]{rotate:-15deg}.rotate-\[15deg\]{rotate:15deg}.rotate-\[calc\(var\(--dx\)\*0\.05deg\)\]{rotate:calc(var(--dx) * .05deg)}.-skew-x-12{--tw-skew-x:skewX(calc(12deg * -1));transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.skew-y-\[-16deg\]{--tw-skew-y:skewY(-16deg);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.\[transform\:translate3d\(0\,0\,0\)\]{transform:translate(0)}.\[transform\:translateZ\(0\)\]{transform:translateZ(0)}.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-bounce{animation:var(--animate-bounce)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-alias{cursor:alias}.cursor-col-resize{cursor:col-resize}.cursor-copy{cursor:copy}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.resize\!{resize:both!important}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-my-1\.5{scroll-margin-block:calc(var(--spacing) * 1.5)}.scroll-mt-12{scroll-margin-top:calc(var(--spacing) * 12)}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-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-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[0fr\]{grid-template-columns:0fr}.grid-cols-\[1\.5fr_1fr\]{grid-template-columns:1.5fr 1fr}.grid-cols-\[1fr\,auto\]{grid-template-columns:1fr,auto}.grid-cols-\[1fr\,minmax\(0\,min-content\)\]{grid-template-columns:1fr,minmax(0,min-content)}.grid-cols-\[1fr_min-content_1fr\]{grid-template-columns:1fr min-content 1fr}.grid-cols-\[28px_1fr_auto\]{grid-template-columns:28px 1fr auto}.grid-cols-\[80px_minmax\(320px\,1fr\)_300px_minmax\(260px\,1fr\)_24px\]{grid-template-columns:80px minmax(320px,1fr) 300px minmax(260px,1fr) 24px}.grid-cols-\[100\%_100\%\]{grid-template-columns:100% 100%}.grid-cols-\[140px_1fr\]{grid-template-columns:140px 1fr}.grid-cols-\[max-content_minmax\(0\,1fr\)\]{grid-template-columns:max-content minmax(0,1fr)}.grid-cols-\[min-content\,minmax\(0\,1fr\)\]{grid-template-columns:min-content,minmax(0,1fr)}.grid-cols-\[min-content_1fr_min-content\]{grid-template-columns:min-content 1fr min-content}.grid-cols-\[minmax\(0\,1fr\)\,min-content\]{grid-template-columns:minmax(0,1fr),min-content}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_auto_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,5fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,5fr)}.grid-cols-\[minmax\(0\,7rem\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,7rem) minmax(0,1fr)}.grid-cols-\[minmax\(340px\,1fr\)_minmax\(0\,min-content\)\]{grid-template-columns:minmax(340px,1fr) minmax(0,min-content)}.grid-cols-\[repeat\(3\,max-content\)\]{grid-template-columns:repeat(3,max-content)}.grid-cols-\[repeat\(4\,max-content\)\]{grid-template-columns:repeat(4,max-content)}.grid-cols-\[repeat\(var\(--cols\)\,1fr\)\]{grid-template-columns:repeat(var(--cols),1fr)}.grid-cols-\[repeat\(var\(--tabs\)\,minmax\(0\,1fr\)\)\]{grid-template-columns:repeat(var(--tabs),minmax(0,1fr))}.grid-cols-\[var\(--sidebar-groups-width\)_1fr\]{grid-template-columns:var(--sidebar-groups-width) 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.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-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.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}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-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-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}.gap-16{gap:calc(var(--spacing) * 16)}.gap-\[1px\]{gap:1px}.gap-\[5px\]{gap:5px}.gap-\[22px\]{gap:22px}.gap-px{gap:1px}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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-16>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 16) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 16) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:calc(var(--spacing) * 1)}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.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-10{column-gap:calc(var(--spacing) * 10)}.gap-x-14{column-gap:calc(var(--spacing) * 14)}.gap-x-16{column-gap:calc(var(--spacing) * 16)}:where(.-space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * -1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * -1) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 0) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 1.5) * 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-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 3) * 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)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing) * 0)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.gap-y-5{row-gap:calc(var(--spacing) * 5)}.gap-y-6{row-gap:calc(var(--spacing) * 6)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}.gap-y-10{row-gap:calc(var(--spacing) * 10)}: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-x-200>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(200px * var(--tw-divide-x-reverse));border-inline-end-width:calc(200px * 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-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.divide-neutral-100>:not(:last-child)){border-color:var(--color-neutral-100)}:where(.divide-neutral-200>:not(:last-child)){border-color:var(--color-neutral-200)}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\!overflow-visible{overflow:visible!important}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.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}.overflow-y-scroll{overflow-y:scroll}.overflow-y-visible{overflow-y:visible}.overscroll-contain{overscroll-behavior:contain}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[0\.75rem\]{border-radius:.75rem}.rounded-\[0\.625rem\]{border-radius:.625rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[10px\]{border-radius:10px}.rounded-\[31px\]{border-radius:31px}.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-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-\[inherit\]{border-top-left-radius:inherit;border-top-right-radius:inherit}.rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.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)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-\[0\.625rem\]{border-bottom-right-radius:.625rem;border-bottom-left-radius:.625rem}.rounded-b-\[11px\]{border-bottom-right-radius:11px;border-bottom-left-radius:11px}.rounded-b-\[12px\]{border-bottom-right-radius:12px;border-bottom-left-radius:12px}.rounded-b-\[inherit\]{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-lg{border-bottom-right-radius:var(--radius-lg)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-lg{border-bottom-left-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-4{border-style:var(--tw-border-style);border-width:4px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.border-x-2{border-inline-style:var(--tw-border-style);border-inline-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-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-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{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-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\[\#8c8c8c33\]{border-color:#8c8c8c33}.border-\[\#1717170D\]{border-color:#1717170d}.border-\[\#1717171A\]{border-color:#1717171a}.border-\[\#19140035\]{border-color:#19140035}.border-\[\#e3e3e0\]{border-color:#e3e3e0}.border-\[var\(--brand\)\]{border-color:var(--brand)}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-200\/90{border-color:#fee685e6}@supports (color:color-mix(in lab, red, red)){.border-amber-200\/90{border-color:color-mix(in oklab, var(--color-amber-200) 90%, transparent)}}.border-amber-300{border-color:var(--color-amber-300)}.border-black{border-color:var(--color-black)}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.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\/\[0\.075\]{border-color:#00000013}@supports (color:color-mix(in lab, red, red)){.border-black\/\[0\.075\]{border-color:color-mix(in oklab, var(--color-black) 7.5%, transparent)}}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-100\/60{border-color:#dbeafe99}@supports (color:color-mix(in lab, red, red)){.border-blue-100\/60{border-color:color-mix(in oklab, var(--color-blue-100) 60%, transparent)}}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-500{border-color:var(--color-blue-500)}.border-cyan-500{border-color:var(--color-cyan-500)}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/20{border-color:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/30{border-color:color-mix(in oklab, var(--color-cyan-500) 30%, transparent)}}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/20{border-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-200\/50{border-color:#e5e7eb80}@supports (color:color-mix(in lab, red, red)){.border-gray-200\/50{border-color:color-mix(in oklab, var(--color-gray-200) 50%, transparent)}}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-100{border-color:var(--color-green-100)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-green-500{border-color:var(--color-green-500)}.border-green-600\/15{border-color:#00a54426}@supports (color:color-mix(in lab, red, red)){.border-green-600\/15{border-color:color-mix(in oklab, var(--color-green-600) 15%, transparent)}}.border-green-600\/50{border-color:#00a54480}@supports (color:color-mix(in lab, red, red)){.border-green-600\/50{border-color:color-mix(in oklab, var(--color-green-600) 50%, transparent)}}.border-green-700\/50{border-color:#00813880}@supports (color:color-mix(in lab, red, red)){.border-green-700\/50{border-color:color-mix(in oklab, var(--color-green-700) 50%, transparent)}}.border-indigo-100{border-color:var(--color-indigo-100)}.border-indigo-100\/30{border-color:#e0e7ff4d}@supports (color:color-mix(in lab, red, red)){.border-indigo-100\/30{border-color:color-mix(in oklab, var(--color-indigo-100) 30%, transparent)}}.border-indigo-200{border-color:var(--color-indigo-200)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-200\/50{border-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/50{border-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.border-neutral-200\/60{border-color:#e5e5e599}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/60{border-color:color-mix(in oklab, var(--color-neutral-200) 60%, transparent)}}.border-neutral-200\/80{border-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.border-neutral-200\/80{border-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-300\/80{border-color:#d4d4d4cc}@supports (color:color-mix(in lab, red, red)){.border-neutral-300\/80{border-color:color-mix(in oklab, var(--color-neutral-300) 80%, transparent)}}.border-neutral-400{border-color:var(--color-neutral-400)}.border-neutral-400\/30{border-color:#a1a1a14d}@supports (color:color-mix(in lab, red, red)){.border-neutral-400\/30{border-color:color-mix(in oklab, var(--color-neutral-400) 30%, transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-800\/10{border-color:#2626261a}@supports (color:color-mix(in lab, red, red)){.border-neutral-800\/10{border-color:color-mix(in oklab, var(--color-neutral-800) 10%, transparent)}}.border-neutral-900{border-color:var(--color-neutral-900)}.border-neutral-900\/10{border-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.border-neutral-900\/10{border-color:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.border-neutral-950{border-color:var(--color-neutral-950)}.border-orange-100\/30{border-color:#ffedd54d}@supports (color:color-mix(in lab, red, red)){.border-orange-100\/30{border-color:color-mix(in oklab, var(--color-orange-100) 30%, transparent)}}.border-orange-200{border-color:var(--color-orange-200)}.border-orange-500{border-color:var(--color-orange-500)}.border-orange-600{border-color:var(--color-orange-600)}.border-pink-200{border-color:var(--color-pink-200)}.border-purple-100{border-color:var(--color-purple-100)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-300{border-color:var(--color-purple-300)}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-red-500{border-color:var(--color-red-500)}.border-red-600{border-color:var(--color-red-600)}.border-rose-400{border-color:var(--color-rose-400)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-900{border-color:var(--color-slate-900)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-200\/90{border-color:#96f7e4e6}@supports (color:color-mix(in lab, red, red)){.border-teal-200\/90{border-color:color-mix(in oklab, var(--color-teal-200) 90%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.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\/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-yellow-300{border-color:var(--color-yellow-300)}.border-t-current{border-top-color:currentColor}.border-t-gray-800{border-top-color:var(--color-gray-800)}.border-t-neutral-600{border-top-color:var(--color-neutral-600)}.border-t-transparent{border-top-color:#0000}.border-r-transparent{border-right-color:#0000}.border-l-transparent{border-left-color:#0000}.\!bg-blue-50{background-color:var(--color-blue-50)!important}.\!bg-orange-50{background-color:var(--color-orange-50)!important}.bg-\[\#0f1419\]{background-color:#0f1419}.bg-\[\#1b1b18\]{background-color:#1b1b18}.bg-\[\#6b7280\]{background-color:#6b7280}.bg-\[\#25d366\]{background-color:#25d366}.bg-\[\#0077b5\]{background-color:#0077b5}.bg-\[\#1877f2\]{background-color:#1877f2}.bg-\[\#EDE8FD\]{background-color:#ede8fd}.bg-\[\#F0F7FF\]{background-color:#f0f7ff}.bg-\[\#F5EDFF\]{background-color:#f5edff}.bg-\[\#FCFCFC\]{background-color:#fcfcfc}.bg-\[\#FDFDFC\]{background-color:#fdfdfc}.bg-\[\#FFEBEB\]{background-color:#ffebeb}.bg-\[\#FFF3EC\]{background-color:#fff3ec}.bg-\[\#dbdbd7\]{background-color:#dbdbd7}.bg-\[\#f2f3f5\]{background-color:#f2f3f5}.bg-\[\#f4f4f5\]{background-color:#f4f4f5}.bg-\[\#f9fafb\]{background-color:#f9fafb}.bg-\[\#fff2f2\]{background-color:#fff2f2}.bg-\[var\(--brand\)\]{background-color:var(--brand)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/80{background-color:#fffbebcc}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/80{background-color:color-mix(in oklab, var(--color-amber-50) 80%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-100\/50{background-color:#fef3c680}@supports (color:color-mix(in lab, red, red)){.bg-amber-100\/50{background-color:color-mix(in oklab, var(--color-amber-100) 50%, transparent)}}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-black{background-color:var(--color-black)}.bg-black\/5{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.bg-black\/5{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, 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\.03\]{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-black) 3%, 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-black\/\[0\.77\]{background-color:#000000c4}@supports (color:color-mix(in lab, red, red)){.bg-black\/\[0\.77\]{background-color:color-mix(in oklab, var(--color-black) 77%, transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/50{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/50{background-color:color-mix(in oklab, var(--color-blue-50) 50%, transparent)}}.bg-blue-50\/80{background-color:#eff6ffcc}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/80{background-color:color-mix(in oklab, var(--color-blue-50) 80%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-100\/50{background-color:#dbeafe80}@supports (color:color-mix(in lab, red, red)){.bg-blue-100\/50{background-color:color-mix(in oklab, var(--color-blue-100) 50%, transparent)}}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/10{background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.bg-blue-500\/50{background-color:#3080ff80}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/50{background-color:color-mix(in oklab, var(--color-blue-500) 50%, transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-current{background-color:currentColor}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab, red, red)){.bg-cyan-500\/10{background-color:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.bg-cyan-950\/40{background-color:#05334566}@supports (color:color-mix(in lab, red, red)){.bg-cyan-950\/40{background-color:color-mix(in oklab, var(--color-cyan-950) 40%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-50\/50{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/50{background-color:color-mix(in oklab, var(--color-gray-50) 50%, transparent)}}.bg-gray-50\/60{background-color:#f9fafb99}@supports (color:color-mix(in lab, red, red)){.bg-gray-50\/60{background-color:color-mix(in oklab, var(--color-gray-50) 60%, transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-200\/80{background-color:#e5e7ebcc}@supports (color:color-mix(in lab, red, red)){.bg-gray-200\/80{background-color:color-mix(in oklab, var(--color-gray-200) 80%, transparent)}}.bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-950\/40{background-color:#03071266}@supports (color:color-mix(in lab, red, red)){.bg-gray-950\/40{background-color:color-mix(in oklab, var(--color-gray-950) 40%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-100\/80{background-color:#dcfce7cc}@supports (color:color-mix(in lab, red, red)){.bg-green-100\/80{background-color:color-mix(in oklab, var(--color-green-100) 80%, transparent)}}.bg-green-200{background-color:var(--color-green-200)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/10{background-color:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.bg-green-500\/50{background-color:#00c75880}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/50{background-color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-50\/20{background-color:#fafafa33}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/20{background-color:color-mix(in oklab, var(--color-neutral-50) 20%, transparent)}}.bg-neutral-50\/30{background-color:#fafafa4d}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/30{background-color:color-mix(in oklab, var(--color-neutral-50) 30%, transparent)}}.bg-neutral-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/50{background-color:color-mix(in oklab, var(--color-neutral-50) 50%, transparent)}}.bg-neutral-50\/80{background-color:#fafafacc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/80{background-color:color-mix(in oklab, var(--color-neutral-50) 80%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-100\/50{background-color:#f5f5f580}@supports (color:color-mix(in lab, red, red)){.bg-neutral-100\/50{background-color:color-mix(in oklab, var(--color-neutral-100) 50%, transparent)}}.bg-neutral-100\/80{background-color:#f5f5f5cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-100\/80{background-color:color-mix(in oklab, var(--color-neutral-100) 80%, transparent)}}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-200\/40{background-color:#e5e5e566}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/40{background-color:color-mix(in oklab, var(--color-neutral-200) 40%, transparent)}}.bg-neutral-200\/50{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/50{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.bg-neutral-200\/75{background-color:#e5e5e5bf}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/75{background-color:color-mix(in oklab, var(--color-neutral-200) 75%, transparent)}}.bg-neutral-200\/80{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-200\/80{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-500\/10{background-color:#7373731a}@supports (color:color-mix(in lab, red, red)){.bg-neutral-500\/10{background-color:color-mix(in oklab, var(--color-neutral-500) 10%, transparent)}}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-800\/80{background-color:#262626cc}@supports (color:color-mix(in lab, red, red)){.bg-neutral-800\/80{background-color:color-mix(in oklab, var(--color-neutral-800) 80%, transparent)}}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-900\/5{background-color:#1717170d}@supports (color:color-mix(in lab, red, red)){.bg-neutral-900\/5{background-color:color-mix(in oklab, var(--color-neutral-900) 5%, transparent)}}.bg-neutral-900\/10{background-color:#1717171a}@supports (color:color-mix(in lab, red, red)){.bg-neutral-900\/10{background-color:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-500\/50{background-color:#fe6e0080}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\/50{background-color:color-mix(in oklab, var(--color-orange-500) 50%, transparent)}}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-700{background-color:var(--color-orange-700)}.bg-orange-900{background-color:var(--color-orange-900)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-500\/10{background-color:#f6339a1a}@supports (color:color-mix(in lab, red, red)){.bg-pink-500\/10{background-color:color-mix(in oklab, var(--color-pink-500) 10%, transparent)}}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/10{background-color:color-mix(in oklab, var(--color-purple-500) 10%, transparent)}}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/40{background-color:#fef2f266}@supports (color:color-mix(in lab, red, red)){.bg-red-50\/40{background-color:color-mix(in oklab, var(--color-red-50) 40%, transparent)}}.bg-red-50\/80{background-color:#fef2f2cc}@supports (color:color-mix(in lab, red, red)){.bg-red-50\/80{background-color:color-mix(in oklab, var(--color-red-50) 80%, transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/50{background-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-red-600\/5{background-color:#e400140d}@supports (color:color-mix(in lab, red, red)){.bg-red-600\/5{background-color:color-mix(in oklab, var(--color-red-600) 5%, transparent)}}.bg-red-700{background-color:var(--color-red-700)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-400\/\[\.15\]{background-color:#00bcfe26}@supports (color:color-mix(in lab, red, red)){.bg-sky-400\/\[\.15\]{background-color:color-mix(in oklab, var(--color-sky-400) 15%, transparent)}}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/60{background-color:color-mix(in oklab, var(--color-slate-900) 60%, transparent)}}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/80{background-color:color-mix(in oklab, var(--color-slate-900) 80%, transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-500\/50{background-color:#00baa780}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/50{background-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/50{background-color:#8d54ff80}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/50{background-color:color-mix(in oklab, var(--color-violet-500) 50%, transparent)}}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-900{background-color:var(--color-violet-900)}.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\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, 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\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.bg-white\/30{background-color:color-mix(in oklab, var(--color-white) 30%, 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\/50{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/50{background-color:color-mix(in oklab, var(--color-white) 50%, 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\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.bg-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\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-zinc-50{background-color:var(--color-zinc-50)}.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-l{--tw-gradient-position:to left 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-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.\[background-image\:radial-gradient\(140\%_146\%_at_93\%_14\%\,\#72FE7D\,rgba\(114\,254\,125\,0\)_50\%\)\,radial-gradient\(126\%_82\%_at_56\%_100\%\,\#FD3A4E\,rgba\(253\,58\,78\,0\)_50\%\)\,radial-gradient\(131\%_124\%_at_11\%_35\%\,\#855AFC\,rgba\(133\,90\,252\,0\)_50\%\)\,radial-gradient\(117\%_77\%_at_100\%_100\%\,\#E4C795\,rgba\(228\,199\,149\,0\)_50\%\)\,radial-gradient\(86\%_74\%_at_40\%_59\%\,\#3A8BFD\,rgba\(58\,139\,253\,0\)_50\%\)\,radial-gradient\(115\%_96\%_at_42\%_69\%\,\#EEA5BA\,rgba\(238\,165\,186\,0\)_50\%\)\]{background-image:radial-gradient(140% 146% at 93% 14%,#72fe7d,#72fe7d00 50%),radial-gradient(126% 82% at 56% 100%,#fd3a4e,#fd3a4e00 50%),radial-gradient(131% 124% at 11% 35%,#855afc,#855afc00 50%),radial-gradient(117% 77% at 100% 100%,#e4c795,#e4c79500 50%),radial-gradient(86% 74% at 40% 59%,#3a8bfd,#3a8bfd00 50%),radial-gradient(115% 96% at 42% 69%,#eea5ba,#eea5ba00 50%)}.\[background-image\:radial-gradient\(140\%_146\%_at_93\%_14\%\,\#F6DEAE\,rgba\(246\,222\,174\,0\)_50\%\)\,radial-gradient\(126\%_82\%_at_56\%_100\%\,\#94704C\,rgba\(148\,112\,76\,0\)_50\%\)\,radial-gradient\(131\%_124\%_at_11\%_35\%\,\#3A8BFD\,rgba\(58\,139\,253\,0\)_45\%\)\,radial-gradient\(117\%_77\%_at_100\%_100\%\,\#C28E52\,rgba\(194\,142\,82\,0\)_50\%\)\,radial-gradient\(86\%_74\%_at_40\%_59\%\,\#855AFC\,rgba\(133\,90\,252\,0\)_40\%\)\]{background-image:radial-gradient(140% 146% at 93% 14%,#f6deae,#f6deae00 50%),radial-gradient(126% 82% at 56% 100%,#94704c,#94704c00 50%),radial-gradient(131% 124% at 11% 35%,#3a8bfd,#3a8bfd00 45%),radial-gradient(117% 77% at 100% 100%,#c28e52,#c28e5200 50%),radial-gradient(86% 74% at 40% 59%,#855afc,#855afc00 40%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#635BFF22\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#635bff22,#0000 50%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#855AFC22\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#855afc22,#0000 50%)}.\[background-image\:radial-gradient\(200\%_150\%_at_100\%_0\%\,\#C28E5222\,transparent_50\%\)\]{background-image:radial-gradient(200% 150% at 100% 0,#c28e5222,#0000 50%)}.\[background-image\:radial-gradient\(rgb\(163_163_163\)_1px\,transparent_1px\)\]{background-image:radial-gradient(#a3a3a3 1px,#0000 1px)}.bg-\[conic-gradient\(from_-66deg\,\#855AFC_-32deg\,\#f00_63deg\,\#EAB308_158deg\,\#5CFF80_240deg\,\#855AFC_328deg\,\#f00_423deg\)\],.bg-\[conic-gradient\(from_-66deg_at_50\%_50\%\,\#855AFC_-32deg\,\#f00_63deg\,\#EAB308_158deg\,\#5CFF80_240deg\,\#855AFC_328deg\,\#f00_423deg\)\]{background-image:conic-gradient(from -66deg,#855afc -32deg,red 63deg,#eab308 158deg,#5cff80 240deg,#855afc 328deg,red 423deg)}.bg-\[conic-gradient\(from_90deg\,\#F00_5deg\,\#EAB308_63deg\,\#5CFF80_115deg\,\#1E00FF_170deg\,\#855AFC_220deg\,\#3A8BFD_286deg\,\#F00_360deg\)\]{background-image:conic-gradient(from 90deg,red 5deg,#eab308 63deg,#5cff80 115deg,#1e00ff 170deg,#855afc 220deg,#3a8bfd 286deg,red 360deg)}.bg-\[conic-gradient\(from_220deg_at_50\%_50\%\,\#FF0000_0\%\,\#EAB308_17\%\,\#1E00FF_31\%\,\#5CFF80_46\%\,\#855AFC_60\%\,\#3A8BFD_78\%\,\#FF0000_100\%\)\]{background-image:conic-gradient(from 220deg,red 0%,#eab308 17%,#1e00ff 31%,#5cff80 46%,#855afc 60%,#3a8bfd 78%,red 100%)}.bg-\[conic-gradient\(from_270deg\,\#F4950C\,\#EB5C0C\,transparent\,transparent\)\]{background-image:conic-gradient(from 270deg,#f4950c,#eb5c0c,#0000,#0000)}.bg-\[conic-gradient\(from_279deg\,\#EAB308_47deg\,\#F00_121deg\,\#00FFF9_190deg\,\#855AFC_251deg\,\#3A8BFD_267deg\,\#A3ECB3_314deg\,\#EAB308_360deg\)\]{background-image:conic-gradient(from 279deg,#eab308 47deg,red 121deg,#00fff9 190deg,#855afc 251deg,#3a8bfd 267deg,#a3ecb3 314deg,#eab308 360deg)}.bg-\[linear-gradient\(90deg\,\#fff1\,\#fff4\)\]{background-image:linear-gradient(90deg,#fff1,#fff4)}.bg-\[linear-gradient\(90deg\,transparent\,\#0001\,transparent\)\]{background-image:linear-gradient(90deg,#0000,#0001,#0000)}.bg-\[linear-gradient\(to_right\,\#8080800a_1px\,transparent_1px\)\,linear-gradient\(to_bottom\,\#8080800a_1px\,transparent_1px\)\]{background-image:linear-gradient(90deg,#8080800a 1px,#0000 1px),linear-gradient(#8080800a 1px,#0000 1px)}.bg-\[linear-gradient\(to_right\,transparent\,white_10\%\)\]{background-image:linear-gradient(90deg,#0000,#fff 10%)}.bg-\[radial-gradient\(60\%_80\%_at_50\%_0\%\,\#ddd\,\#f5f5f5\)\]{background-image:radial-gradient(60% 80% at 50% 0,#ddd,#f5f5f5)}.bg-\[radial-gradient\(ellipse_at_top_right\,_var\(--tw-gradient-stops\)\)\]{background-image:radial-gradient(ellipse at top right, var(--tw-gradient-stops))}.bg-none{background-image:none}.from-\[\#006aff\]{--tw-gradient-from:#006aff;--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-\[\#DDD6FE\]\/40{--tw-gradient-from:oklab(89.4268% .0216931 -.0504127/.4);--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-\[\#DDD6FE\]\/50{--tw-gradient-from:oklab(89.4268% .0216931 -.0504127/.5);--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-\[\#F0ABFC\]\/45{--tw-gradient-from:oklab(83.3033% .10336 -.0824114/.45);--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-\[\#F0ABFC\]\/60{--tw-gradient-from:oklab(83.3033% .10336 -.0824114/.6);--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-\[\#F5F3FF\]{--tw-gradient-from:#f5f3ff;--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-\[\#fff8\]{--tw-gradient-from:#fff8;--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-\[\#fff_70\%\]{--tw-gradient-from:#fff 70%;--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-\[\#fff_75\%\]{--tw-gradient-from:#fff 75%;--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-black{--tw-gradient-from: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))}.from-black\/50{--tw-gradient-from:#00000080}@supports (color:color-mix(in lab, red, red)){.from-black\/50{--tw-gradient-from:color-mix(in oklab, var(--color-black) 50%, transparent)}}.from-black\/50{--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-50{--tw-gradient-from:var(--color-blue-50);--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{--tw-gradient-from:var(--color-blue-500);--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\/90{--tw-gradient-from:#3080ffe6}@supports (color:color-mix(in lab, red, red)){.from-blue-500\/90{--tw-gradient-from:color-mix(in oklab, var(--color-blue-500) 90%, transparent)}}.from-blue-500\/90{--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-400{--tw-gradient-from:var(--color-cyan-400);--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{--tw-gradient-from:var(--color-cyan-500);--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-900\/30{--tw-gradient-from:#104e644d}@supports (color:color-mix(in lab, red, red)){.from-cyan-900\/30{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-900) 30%, transparent)}}.from-cyan-900\/30{--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-100\/80{--tw-gradient-from:#ecfccacc}@supports (color:color-mix(in lab, red, red)){.from-lime-100\/80{--tw-gradient-from:color-mix(in oklab, var(--color-lime-100) 80%, transparent)}}.from-lime-100\/80{--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-neutral-100{--tw-gradient-from:var(--color-neutral-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-neutral-200{--tw-gradient-from:var(--color-neutral-200);--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-neutral-900{--tw-gradient-from:var(--color-neutral-900);--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-neutral-900\/10{--tw-gradient-from:#1717171a}@supports (color:color-mix(in lab, red, red)){.from-neutral-900\/10{--tw-gradient-from:color-mix(in oklab, var(--color-neutral-900) 10%, transparent)}}.from-neutral-900\/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-neutral-950\/5{--tw-gradient-from:#0a0a0a0d}@supports (color:color-mix(in lab, red, red)){.from-neutral-950\/5{--tw-gradient-from:color-mix(in oklab, var(--color-neutral-950) 5%, transparent)}}.from-neutral-950\/5{--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-50{--tw-gradient-from:var(--color-orange-50);--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-slate-900{--tw-gradient-from:var(--color-slate-900);--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-slate-950{--tw-gradient-from:var(--color-slate-950);--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-50{--tw-gradient-from:var(--color-violet-50);--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\/90{--tw-gradient-from:#8d54ffe6}@supports (color:color-mix(in lab, red, red)){.from-violet-500\/90{--tw-gradient-from:color-mix(in oklab, var(--color-violet-500) 90%, transparent)}}.from-violet-500\/90{--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-600{--tw-gradient-from:var(--color-violet-600);--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-white\/50{--tw-gradient-from:#ffffff80}@supports (color:color-mix(in lab, red, red)){.from-white\/50{--tw-gradient-from:color-mix(in oklab, var(--color-white) 50%, transparent)}}.from-white\/50{--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-5\%{--tw-gradient-from-position:5%}.from-40\%{--tw-gradient-from-position:40%}.from-60\%{--tw-gradient-from-position:60%}.via-\[\#00b2ff\]{--tw-gradient-via:#00b2ff;--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)}.via-\[\#E9D5FF\]\/25{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.25);--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)}.via-\[\#E9D5FF\]\/30{--tw-gradient-via:oklab(90.2359% .0361042 -.0484321/.3);--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)}.via-\[\#E9D5FF\]\/35{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.35);--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)}.via-\[\#E9D5FF\]\/45{--tw-gradient-via:oklab(90.236% .0361042 -.0484321/.45);--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)}.via-red-500{--tw-gradient-via:var(--color-red-500);--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)}.via-slate-200{--tw-gradient-via:var(--color-slate-200);--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)}.via-slate-900{--tw-gradient-via:var(--color-slate-900);--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)}.via-slate-900\/40{--tw-gradient-via:#0f172b66}@supports (color:color-mix(in lab, red, red)){.via-slate-900\/40{--tw-gradient-via:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.via-slate-900\/40{--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)}.via-slate-950{--tw-gradient-via:var(--color-slate-950);--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)}.via-teal-300{--tw-gradient-via:var(--color-teal-300);--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)}.via-white{--tw-gradient-via:var(--color-white);--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)}.via-white\/75{--tw-gradient-via:#ffffffbf}@supports (color:color-mix(in lab, red, red)){.via-white\/75{--tw-gradient-via:color-mix(in oklab, var(--color-white) 75%, transparent)}}.via-white\/75{--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)}.via-40\%{--tw-gradient-via-position:40%}.to-\[\#00d6ff\]{--tw-gradient-to:#00d6ff;--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-\[\#FDF2FA\]{--tw-gradient-to:#fdf2fa;--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-\[\#fff6\]{--tw-gradient-to:#fff6;--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-500{--tw-gradient-to:var(--color-blue-500);--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{--tw-gradient-to:var(--color-blue-600);--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-400{--tw-gradient-to:var(--color-cyan-400);--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-emerald-100\/80{--tw-gradient-to:#d0fae5cc}@supports (color:color-mix(in lab, red, red)){.to-emerald-100\/80{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-100) 80%, transparent)}}.to-emerald-100\/80{--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\/90{--tw-gradient-to:#4f39f6e6}@supports (color:color-mix(in lab, red, red)){.to-indigo-600\/90{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-600) 90%, transparent)}}.to-indigo-600\/90{--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-neutral-50{--tw-gradient-to:var(--color-neutral-50);--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-neutral-100{--tw-gradient-to:var(--color-neutral-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))}.to-neutral-300{--tw-gradient-to:var(--color-neutral-300);--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-neutral-600{--tw-gradient-to:var(--color-neutral-600);--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{--tw-gradient-to:var(--color-pink-600);--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{--tw-gradient-to:var(--color-purple-600);--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\/90{--tw-gradient-to:#9810fae6}@supports (color:color-mix(in lab, red, red)){.to-purple-600\/90{--tw-gradient-to:color-mix(in oklab, var(--color-purple-600) 90%, transparent)}}.to-purple-600\/90{--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{--tw-gradient-to:var(--color-red-600);--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-rose-500{--tw-gradient-to:var(--color-rose-500);--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-slate-950{--tw-gradient-to:var(--color-slate-950);--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-50\/90{--tw-gradient-to:#f0fdfae6}@supports (color:color-mix(in lab, red, red)){.to-teal-50\/90{--tw-gradient-to:color-mix(in oklab, var(--color-teal-50) 90%, transparent)}}.to-teal-50\/90{--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-white{--tw-gradient-to: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))}.to-white\/0{--tw-gradient-to:#0000}@supports (color:color-mix(in lab, red, red)){.to-white\/0{--tw-gradient-to:color-mix(in oklab, var(--color-white) 0%, transparent)}}.to-white\/0{--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-40\%{--tw-gradient-to-position:40%}.\[mask-image\:linear-gradient\(\#000f_50\%\,\#0006\)\,linear-gradient\(90deg\,\#000f_50\%\,\#000a\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0006),linear-gradient(90deg,#000 50%,#000a);mask-image:linear-gradient(#000 50%,#0006),linear-gradient(90deg,#000 50%,#000a)}.\[mask-image\:linear-gradient\(\#0006\,\#0006_25\%\,transparent_40\%\)\]{-webkit-mask-image:linear-gradient(#0006,#0006 25%,#0000 40%);mask-image:linear-gradient(#0006,#0006 25%,#0000 40%)}.\[mask-image\:linear-gradient\(0deg\,transparent\,black_45px\)\]{-webkit-mask-image:linear-gradient(0deg,#0000,#000 45px);mask-image:linear-gradient(0deg,#0000,#000 45px)}.\[mask-image\:linear-gradient\(45deg\,black_50\%\,\#0003_100\%\)\]{-webkit-mask-image:linear-gradient(45deg,#000 50%,#0003 100%);mask-image:linear-gradient(45deg,#000 50%,#0003 100%)}.\[mask-image\:linear-gradient\(90deg\,black_50\%\,\#0003_100\%\)\]{-webkit-mask-image:linear-gradient(90deg,#000 50%,#0003 100%);mask-image:linear-gradient(90deg,#000 50%,#0003 100%)}.\[mask-image\:linear-gradient\(90deg\,black_50\%\,transparent_50\%\)\]{-webkit-mask-image:linear-gradient(90deg,#000 50%,#0000 50%);mask-image:linear-gradient(90deg,#000 50%,#0000 50%)}.\[mask-image\:linear-gradient\(90deg\,black_70\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000 70%,#0000);mask-image:linear-gradient(90deg,#000 70%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000);mask-image:linear-gradient(90deg,#0000,#000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000,#0000);mask-image:linear-gradient(90deg,#0000,#000,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black_8\%\,black_92\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000);mask-image:linear-gradient(90deg,#0000,#000 8% 92%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent\,black_10\%\,black_90\%\,transparent\)\,linear-gradient\(transparent\,black_10\%\,black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 10% 90%,#0000),linear-gradient(#0000,#000 10% 90%,#0000);mask-image:linear-gradient(90deg,#0000,#000 10% 90%,#0000),linear-gradient(#0000,#000 10% 90%,#0000)}.\[mask-image\:linear-gradient\(90deg\,transparent_40\%\,black\)\]{-webkit-mask-image:linear-gradient(90deg,#0000 40%,#000);mask-image:linear-gradient(90deg,#0000 40%,#000)}.\[mask-image\:linear-gradient\(90deg\,transparent_50\%\,black_50\%\)\]{-webkit-mask-image:linear-gradient(90deg,#0000 50%,#000 50%);mask-image:linear-gradient(90deg,#0000 50%,#000 50%)}.\[mask-image\:linear-gradient\(270deg\,transparent\,black_8px\)\]{-webkit-mask-image:linear-gradient(270deg,#0000,#000 8px);mask-image:linear-gradient(270deg,#0000,#000 8px)}.\[mask-image\:linear-gradient\(black\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.\[mask-image\:linear-gradient\(black\,transparent_280px\)\]{-webkit-mask-image:linear-gradient(#000,#0000 280px);mask-image:linear-gradient(#000,#0000 280px)}.\[mask-image\:linear-gradient\(black\,transparent_320px\)\,linear-gradient\(90deg\,transparent\,black_5\%\,black_95\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000 320px),linear-gradient(90deg,#0000,#000 5% 95%,#0000);mask-image:linear-gradient(#000,#0000 320px),linear-gradient(90deg,#0000,#000 5% 95%,#0000)}.\[mask-image\:linear-gradient\(black_50\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0000);mask-image:linear-gradient(#000 50%,#0000)}.\[mask-image\:linear-gradient\(black_50\%\,transparent_90\%\)\]{-webkit-mask-image:linear-gradient(#000 50%,#0000 90%);mask-image:linear-gradient(#000 50%,#0000 90%)}.\[mask-image\:linear-gradient\(black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 60%,#0000);mask-image:linear-gradient(#000 60%,#0000)}.\[mask-image\:linear-gradient\(black_70\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 70%,#0000);mask-image:linear-gradient(#000 70%,#0000)}.\[mask-image\:linear-gradient\(black_80\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 80%,#0000);mask-image:linear-gradient(#000 80%,#0000)}.\[mask-image\:linear-gradient\(black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#000 90%,#0000);mask-image:linear-gradient(#000 90%,#0000)}.\[mask-image\:linear-gradient\(to_bottom\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(#000,#0000);mask-image:linear-gradient(#000,#0000)}.\[mask-image\:linear-gradient\(to_right\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\[mask-image\:linear-gradient\(to_right\,transparent\,black_20\%\,black_80\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#0000,#000 20% 80%,#0000);mask-image:linear-gradient(90deg,#0000,#000 20% 80%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000,#0000);mask-image:linear-gradient(#0000,#000,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_5\%\,black_95\%\,transparent\)\,linear-gradient\(90deg\,transparent\,black_5\%\,black_95\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 5% 95%,#0000),linear-gradient(90deg,#0000,#000 5% 95%,#0000);mask-image:linear-gradient(#0000,#000 5% 95%,#0000),linear-gradient(90deg,#0000,#000 5% 95%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_10\%\,black_90\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 10% 90%,#0000);mask-image:linear-gradient(#0000,#000 10% 90%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_15\%\,black_85\%\,transparent\)\]{-webkit-mask-image:linear-gradient(#0000,#000 15% 85%,#0000);mask-image:linear-gradient(#0000,#000 15% 85%,#0000)}.\[mask-image\:linear-gradient\(transparent\,black_30\%\)\]{-webkit-mask-image:linear-gradient(#0000,#000 30%);mask-image:linear-gradient(#0000,#000 30%)}.\[mask-image\:linear-gradient\(transparent\,black_70\%\)\]{-webkit-mask-image:linear-gradient(#0000,#000 70%);mask-image:linear-gradient(#0000,#000 70%)}.\[mask-image\:radial-gradient\(40\%_80\%\,transparent_50\%\,black\)\]{-webkit-mask-image:radial-gradient(40% 80%,#0000 50%,#000);mask-image:radial-gradient(40% 80%,#0000 50%,#000)}.\[mask-image\:radial-gradient\(70\%_100\%_at_50\%_0\%\,_black_70\%\,_transparent\)\]{-webkit-mask-image:radial-gradient(70% 100% at 50% 0,#000 70%,#0000);mask-image:radial-gradient(70% 100% at 50% 0,#000 70%,#0000)}.\[mask-image\:radial-gradient\(70\%_100\%_at_50\%_0\%\,black_30\%\,transparent\)\]{-webkit-mask-image:radial-gradient(70% 100% at 50% 0,#000 30%,#0000);mask-image:radial-gradient(70% 100% at 50% 0,#000 30%,#0000)}.\[mask-image\:radial-gradient\(70\%_120\%_at_50\%_100\%\,black_50\%\,transparent\)\]{-webkit-mask-image:radial-gradient(70% 120% at 50% 100%,#000 50%,#0000);mask-image:radial-gradient(70% 120% at 50% 100%,#000 50%,#0000)}.\[mask-image\:radial-gradient\(100\%_100\%_at_100\%_0\%\,black_30\%\,transparent\)\]{-webkit-mask-image:radial-gradient(100% 100% at 100% 0,#000 30%,#0000);mask-image:radial-gradient(100% 100% at 100% 0,#000 30%,#0000)}.\[mask-image\:radial-gradient\(black\,transparent\)\]{-webkit-mask-image:radial-gradient(#000,#0000);mask-image:radial-gradient(#000,#0000)}.\[mask-image\:radial-gradient\(closest-side\,black_100\%\,transparent_100\%\)\]{-webkit-mask-image:radial-gradient(closest-side,#000 100%,#0000 100%);mask-image:radial-gradient(closest-side,#000 100%,#0000 100%)}.\[mask-image\:radial-gradient\(ellipse_60\%_50\%_at_50\%_0\%\,\#000_70\%\,transparent_100\%\)\]{-webkit-mask-image:radial-gradient(60% 50% at 50% 0,#000 70%,#0000 100%);mask-image:radial-gradient(60% 50% at 50% 0,#000 70%,#0000 100%)}.\[mask-image\:radial-gradient\(ellipse_95\%_85\%_at_50\%_42\%\,\#000_0\%\,transparent_68\%\)\]{-webkit-mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%);mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%)}.\[mask-image\:radial-gradient\(transparent\,black\)\]{-webkit-mask-image:radial-gradient(#0000,#000);mask-image:radial-gradient(#0000,#000)}.\[background-size\:4px_4px\]{background-size:4px 4px}.bg-\[size\:14px_24px\]{background-size:14px 24px}.bg-cover{background-size:cover}.bg-clip-border{background-clip:border-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-center{background-position:50%}.\[mask-composite\:intersect\]{-webkit-mask-composite:source-in;-webkit-mask-composite:source-in;mask-composite:intersect}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.\[mask-origin\:padding-box\]{-webkit-mask-origin:padding-box;mask-origin:padding-box}.fill-current{fill:currentColor}.fill-green-500{fill:var(--color-green-500)}.fill-white{fill:var(--color-white)}.stroke-neutral-200{stroke:var(--color-neutral-200)}.stroke-neutral-900{stroke:var(--color-neutral-900)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-center{object-position:center}.object-left{object-position:left}.object-left-top{object-position:left top}.object-right-bottom{object-position:right bottom}.object-top{object-position:top}.\!p-0{padding:calc(var(--spacing) * 0)!important}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-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-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.p-16{padding:calc(var(--spacing) * 16)}.p-20{padding:calc(var(--spacing) * 20)}.p-px{padding:1px}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.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-10{padding-inline:calc(var(--spacing) * 10)}.px-12{padding-inline:calc(var(--spacing) * 12)}.px-16{padding-inline:calc(var(--spacing) * 16)}.px-20{padding-inline:calc(var(--spacing) * 20)}.px-32{padding-inline:calc(var(--spacing) * 32)}.px-px{padding-inline:1px}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-24{padding-block:calc(var(--spacing) * 24)}.py-\[0\.2rem\]{padding-block:.2rem}.py-px{padding-block:1px}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.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-10{padding-top:calc(var(--spacing) * 10)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[88px\]{padding-top:88px}.pt-\[var\(--page-top-margin\)\]{padding-top:var(--page-top-margin)}.pt-px{padding-top:1px}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.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-3\.5{padding-right:calc(var(--spacing) * 3.5)}.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-10{padding-right:calc(var(--spacing) * 10)}.pr-11{padding-right:calc(var(--spacing) * 11)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pr-24{padding-right:calc(var(--spacing) * 24)}.pr-\[72px\]{padding-right:72px}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.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-8{padding-bottom:calc(var(--spacing) * 8)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.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-\[var\(--page-bottom-margin\)\]{padding-bottom:var(--page-bottom-margin)}.pb-px{padding-bottom:1px}.pl-0{padding-left:calc(var(--spacing) * 0)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.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-7{padding-left:calc(var(--spacing) * 7)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.pl-\[30px\]{padding-left:30px}.pl-\[52px\]{padding-left:52px}.pl-px{padding-left:1px}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-text-top{vertical-align:text-top}.font-\[\'Bricolage_Grotesque\'\]{font-family:Bricolage Grotesque}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.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-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--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\.5rem\]{font-size:.5rem}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.8em\]{font-size:.8em}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[7\.5px\]{font-size:7.5px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.leading-0{--tw-leading:calc(var(--spacing) * 0);line-height:calc(var(--spacing) * 0)}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.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-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-\[14\.30px\]{--tw-leading:14.3px;line-height:14.3px}.leading-\[14px\]{--tw-leading:14px;line-height:14px}.leading-\[16px\]{--tw-leading:16px;line-height:16px}.leading-\[20px\]{--tw-leading:20px;line-height:20px}.leading-\[48px\]{--tw-leading:48px;line-height:48px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.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-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.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-wider{--tw-tracking:calc(var(--tracking-wider) * -1);letter-spacing:calc(var(--tracking-wider) * -1)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.24px\]{--tw-tracking:-.24px;letter-spacing:-.24px}.tracking-\[-0\.28px\]{--tw-tracking:-.28px;letter-spacing:-.28px}.tracking-\[-0\.32px\]{--tw-tracking:-.32px;letter-spacing:-.32px}.tracking-\[-0\.36px\]{--tw-tracking:-.36px;letter-spacing:-.36px}.tracking-\[-0\.96px\]{--tw-tracking:-.96px;letter-spacing:-.96px}.tracking-\[0\.2px\]{--tw-tracking:.2px;letter-spacing:.2px}.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-pretty{text-wrap:pretty}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-blue-700{color:var(--color-blue-700)!important}.\!text-orange-500{color:var(--color-orange-500)!important}.text-\[\#000000E6\]{color:#000000e6}.text-\[\#1B1B18\]{color:#1b1b18}.text-\[\#1F2937\]{color:#1f2937}.text-\[\#1b1b18\]{color:#1b1b18}.text-\[\#1d2129\]{color:#1d2129}.text-\[\#2a5bd7\]{color:#2a5bd7}.text-\[\#7B3AFF\]{color:#7b3aff}.text-\[\#9A3412\]{color:#9a3412}.text-\[\#34a2f1\]{color:#34a2f1}.text-\[\#00000099\]{color:#0009}.text-\[\#706f6c\]{color:#706f6c}.text-\[\#3730A3\]{color:#3730a3}.text-\[\#4783cf\]{color:#4783cf}.text-\[\#166534\]{color:#166534}.text-\[\#273144\]{color:#273144}.text-\[\#606770\]{color:#606770}.text-\[\#CE00FF\]{color:#ce00ff}.text-\[\#D60000\]{color:#d60000}.text-\[\#F3BEC7\]{color:#f3bec7}.text-\[\#F8B803\]{color:#f8b803}.text-\[\#F53003\]{color:#f53003}.text-\[\#FF4D00\]{color:#ff4d00}.text-\[\#f53003\]{color:#f53003}.text-\[var\(--brand\)\]{color:var(--brand)}.text-\[var\(--brand\,\#8e51ff\)\]{color:var(--brand,#8e51ff)}.text-\[var\(--color\)\]{color:var(--color)}.text-amber-400{color:var(--color-amber-400)}.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-black{color:var(--color-black)}.text-black\/10{color:#0000001a}@supports (color:color-mix(in lab, red, red)){.text-black\/10{color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.text-black\/30{color:#0000004d}@supports (color:color-mix(in lab, red, red)){.text-black\/30{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.text-black\/80{color:#000c}@supports (color:color-mix(in lab, red, red)){.text-black\/80{color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.text-blue-500{color:var(--color-blue-500)}.text-blue-500\/50{color:#3080ff80}@supports (color:color-mix(in lab, red, red)){.text-blue-500\/50{color:color-mix(in oklab, var(--color-blue-500) 50%, transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-blue-900\/80{color:#1c398ecc}@supports (color:color-mix(in lab, red, red)){.text-blue-900\/80{color:color-mix(in oklab, var(--color-blue-900) 80%, transparent)}}.text-current{color:currentColor}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-700{color:var(--color-cyan-700)}.text-cyan-900{color:var(--color-cyan-900)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.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-gray-950{color:var(--color-gray-950)}.text-green-500{color:var(--color-green-500)}.text-green-500\/50{color:#00c75880}@supports (color:color-mix(in lab, red, red)){.text-green-500\/50{color:color-mix(in oklab, var(--color-green-500) 50%, transparent)}}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.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-lime-500{color:var(--color-lime-500)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-400\/10{color:#a1a1a11a}@supports (color:color-mix(in lab, red, red)){.text-neutral-400\/10{color:color-mix(in oklab, var(--color-neutral-400) 10%, transparent)}}.text-neutral-400\/70{color:#a1a1a1b3}@supports (color:color-mix(in lab, red, red)){.text-neutral-400\/70{color:color-mix(in oklab, var(--color-neutral-400) 70%, transparent)}}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-500\/80{color:#737373cc}@supports (color:color-mix(in lab, red, red)){.text-neutral-500\/80{color:color-mix(in oklab, var(--color-neutral-500) 80%, transparent)}}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-600\/70{color:#525252b3}@supports (color:color-mix(in lab, red, red)){.text-neutral-600\/70{color:color-mix(in oklab, var(--color-neutral-600) 70%, transparent)}}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-700\/80{color:#404040cc}@supports (color:color-mix(in lab, red, red)){.text-neutral-700\/80{color:color-mix(in oklab, var(--color-neutral-700) 80%, transparent)}}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-neutral-900\/40{color:#17171766}@supports (color:color-mix(in lab, red, red)){.text-neutral-900\/40{color:color-mix(in oklab, var(--color-neutral-900) 40%, transparent)}}.text-neutral-950{color:var(--color-neutral-950)}.text-orange-400\/50{color:#ff8b1a80}@supports (color:color-mix(in lab, red, red)){.text-orange-400\/50{color:color-mix(in oklab, var(--color-orange-400) 50%, transparent)}}.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-orange-900{color:var(--color-orange-900)}.text-orange-900\/80{color:#7e2a0ccc}@supports (color:color-mix(in lab, red, red)){.text-orange-900\/80{color:color-mix(in oklab, var(--color-orange-900) 80%, transparent)}}.text-pink-500{color:var(--color-pink-500)}.text-pink-500\/50{color:#f6339a80}@supports (color:color-mix(in lab, red, red)){.text-pink-500\/50{color:color-mix(in oklab, var(--color-pink-500) 50%, transparent)}}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-purple-400{color:var(--color-purple-400)}.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-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-500\/50{color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.text-red-500\/50{color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.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-sky-500{color:var(--color-sky-500)}.text-sky-600{color:var(--color-sky-600)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-400{color:var(--color-teal-400)}.text-teal-400\/50{color:#00d3bd80}@supports (color:color-mix(in lab, red, red)){.text-teal-400\/50{color:color-mix(in oklab, var(--color-teal-400) 50%, transparent)}}.text-teal-500{color:var(--color-teal-500)}.text-teal-700{color:var(--color-teal-700)}.text-transparent{color:#0000}.text-violet-200{color:var(--color-violet-200)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-600\/50{color:#7f22fe80}@supports (color:color-mix(in lab, red, red)){.text-violet-600\/50{color:color-mix(in oklab, var(--color-violet-600) 50%, transparent)}}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-white{color:var(--color-white)}.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-yellow-500{color:var(--color-yellow-500)}.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-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.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,)}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-gray-400\/50{text-decoration-color:#99a1af80}@supports (color:color-mix(in lab, red, red)){.decoration-gray-400\/50{-webkit-text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent);text-decoration-color:color-mix(in oklab, var(--color-gray-400) 50%, transparent)}}.decoration-neutral-300{-webkit-text-decoration-color:var(--color-neutral-300);-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.decoration-neutral-300\/70{text-decoration-color:#d4d4d4b3}@supports (color:color-mix(in lab, red, red)){.decoration-neutral-300\/70{-webkit-text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent);text-decoration-color:color-mix(in oklab, var(--color-neutral-300) 70%, transparent)}}.decoration-neutral-400{-webkit-text-decoration-color:var(--color-neutral-400);-webkit-text-decoration-color:var(--color-neutral-400);text-decoration-color:var(--color-neutral-400)}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.placeholder-amber-300::placeholder{color:var(--color-amber-300)}.placeholder-neutral-300::placeholder{color:var(--color-neutral-300)}.placeholder-neutral-400::placeholder{color:var(--color-neutral-400)}.placeholder-red-300::placeholder{color:var(--color-red-300)}.placeholder-slate-500::placeholder{color:var(--color-slate-500)}.opacity-0{opacity:0}.opacity-1{opacity:.01}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-15{opacity:.15}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.opacity-100{opacity:1}.opacity-\[0\.4\]{opacity:.4}.opacity-\[calc\(1-max\(var\(--dx\)\,-1\*var\(--dx\)\)\/var\(--w\)\/2\)\]{opacity:calc(1 - max(var(--dx), -1 * var(--dx)) / var(--w) / 2)}.opacity-\[var\(--opacity\)\]{opacity:var(--opacity)}.mix-blend-color{mix-blend-mode:color}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-soft-light{mix-blend-mode:soft-light}.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_black_inset\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,black) inset;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_2px_2px_0_\#00000014\]{--tw-shadow:0 2px 2px 0 var(--tw-shadow-color,#00000014);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_4px_12px_\#0000001a\]{--tw-shadow:0 4px 12px 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-\[0_4px_12px_\#0001\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0001);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_4px_12px_0_\#0000000D\]{--tw-shadow:0 4px 12px 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)}.shadow-\[0_8px_28px_0_\#00000017\]{--tw-shadow:0 8px 28px 0 var(--tw-shadow-color,#00000017);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_12px_20px_0_\#00000026_inset\,0_2px_5px_0_\#00000026_inset\,0_2px_13px_2px_\#FFFFFF59\]{--tw-shadow:0 12px 20px 0 var(--tw-shadow-color,#00000026) inset, 0 2px 5px 0 var(--tw-shadow-color,#00000026) inset, 0 2px 13px 2px var(--tw-shadow-color,#ffffff59);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_20px_20px_0_\#00000017\]{--tw-shadow:0 20px 20px 0 var(--tw-shadow-color,#00000017);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_0px_1px_0px_rgba\(0\,0\,0\,0\.03\)\,0px_1px_2px_0px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0px 0px 1px 0px var(--tw-shadow-color,#00000008), 0px 1px 2px 0px var(--tw-shadow-color,#0000000f);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_0px_2px_0px_rgba\(0\,0\,0\,0\.05\)\,0px_2px_6px_0px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow:0px 0px 2px 0px var(--tw-shadow-color,#0000000d), 0px 2px 6px 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-\[0px_1px_3px_0px_\#0000000F\,_0px_4px_14px_0px_\#00000014\]{--tw-shadow:0px 1px 3px 0px var(--tw-shadow-color,#0000000f), 0px 4px 14px 0px var(--tw-shadow-color,#00000014);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_0_0_0_1px_\#0003\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0003);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_0_0_0_1px_\#00000019\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#00000019);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_0_0_1px_1px_\#fff\]{--tw-shadow:inset 0 0 1px 1px var(--tw-shadow-color,#fff);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_0px_0px_1px_rgba\(26\,26\,0\,0\.16\)\]{--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#1a1a0029);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 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)}.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-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!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}.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)}.ring-4{--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)}.ring-\[3px\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + 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-\[6px\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(6px + 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-neutral-900\/15{--tw-shadow-color:#17171726}@supports (color:color-mix(in lab, red, red)){.shadow-neutral-900\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-neutral-900\/30{--tw-shadow-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.shadow-neutral-900\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-pink-500\/10{--tw-shadow-color:#f6339a1a}@supports (color:color-mix(in lab, red, red)){.shadow-pink-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-pink-500) 10%, transparent) var(--tw-shadow-alpha), 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\/10{--tw-ring-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.ring-black\/10{--tw-ring-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.ring-blue-500\/40{--tw-ring-color:#3080ff66}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 40%, transparent)}}.ring-current{--tw-ring-color:currentcolor}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-neutral-200{--tw-ring-color:var(--color-neutral-200)}.ring-neutral-200\/80{--tw-ring-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.ring-neutral-200\/80{--tw-ring-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.ring-neutral-500{--tw-ring-color:var(--color-neutral-500)}.ring-neutral-600{--tw-ring-color:var(--color-neutral-600)}.ring-neutral-900{--tw-ring-color:var(--color-neutral-900)}.ring-neutral-950{--tw-ring-color:var(--color-neutral-950)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.ring-red-400{--tw-ring-color:var(--color-red-400)}.ring-red-500{--tw-ring-color:var(--color-red-500)}.ring-red-500\/30{--tw-ring-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.ring-red-500\/30{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-2{--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)}.ring-offset-\[3px\]{--tw-ring-offset-width:3px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.-outline-offset-1{outline-offset:calc(1px * -1)}.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,)}.blur-2xl{--tw-blur:blur(var(--blur-2xl));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,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));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,)}.blur-\[2px\]{--tw-blur:blur(2px);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,)}.blur-\[3px\]{--tw-blur:blur(3px);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,)}.blur-\[40px\]{--tw-blur:blur(40px);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,)}.blur-\[50px\]{--tw-blur:blur(50px);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,)}.blur-\[60px\]{--tw-blur:blur(60px);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,)}.blur-\[100px\]{--tw-blur:blur(100px);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,)}.blur-\[130px\]{--tw-blur:blur(130px);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,)}.blur-lg{--tw-blur:blur(var(--blur-lg));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,)}.blur-sm{--tw-blur:blur(var(--blur-sm));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,)}.blur-xl{--tw-blur:blur(var(--blur-xl));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,)}.brightness-0{--tw-brightness:brightness(0%);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,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);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,)}.drop-shadow-\[0_0_15px_rgb\(from_var\(--brand-dark\,\#000\)_r_g_b\/0\.4\)\]{--tw-drop-shadow-size:drop-shadow(0 0 15px var(--tw-drop-shadow-color,rgb(from var(--brand-dark,#000) r g b/.4)));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_2px_4px_\#EA590D80\]{--tw-drop-shadow-size:drop-shadow(0 2px 4px var(--tw-drop-shadow-color,#ea590d80));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));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,)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));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,)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));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,)}.grayscale{--tw-grayscale:grayscale(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,)}.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,)}.saturate-150{--tw-saturate:saturate(150%);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,)}.saturate-\[1\.5\]{--tw-saturate:saturate(1.5);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,)}.saturate-\[2\]{--tw-saturate:saturate(2);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,)}.saturate-\[3\]{--tw-saturate:saturate(3);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\:drop-shadow\(0_1px_2px_\#0002\)_drop-shadow\(0_4px_8px_\#0002\)\]{filter:drop-shadow(0 1px 2px #0002)drop-shadow(0 4px 8px #0002)}.\[filter\:drop-shadow\(0_5px_8px_\#222A351d\)\]{filter:drop-shadow(0 5px 8px #222a351d)}.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-\[1px\]{--tw-backdrop-blur:blur(1px);-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-\[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-\[20px\]{--tw-backdrop-blur:blur(20px);-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-\[50px\]{--tw-backdrop-blur:blur(50px);-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-\[100px\]{--tw-backdrop-blur:blur(100px);-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-md{--tw-backdrop-blur:blur(var(--blur-md));-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-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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-\[backdrop-filter\,opacity\]{transition-property:-webkit-backdrop-filter,backdrop-filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,backdrop-filter\]{transition-property:background-color,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,color\,font-weight\]{transition-property:background-color,color,font-weight;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,opacity\]{transition-property:background-color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,transform\,opacity\]{transition-property:background-color,transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,transform\]{transition-property:background-color,transform;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\]{transition-property:border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\]{transition-property:border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-spacing\,margin-top\]{transition-property:border-spacing,margin-top;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[box-shadow\,transform\]{transition-property:box-shadow,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[box-shadow\]{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,transform\]{transition-property:color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[colors\,opacity\]{transition-property:colors,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\,opacity\]{transition-property:filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-columns\,grid-template-rows\]{transition-property:grid-template-columns,grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-columns\]{transition-property:grid-template-columns;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\,opacity\]{transition-property:grid-template-rows,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\,opacity\]{transition-property:height,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[max-width\]{transition-property:max-width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,background-color\]{transition-property:opacity,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,display\]{transition-property:opacity,display;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,transform\]{transition-property:opacity,transform;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\,background-color\,color\]{transition-property:transform,background-color,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,background-color\]{transition-property:transform,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,color\]{transition-property:transform,color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,opacity\]{transition-property:transform,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;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\]{transition-property:width,height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,opacity\]{transition-property:width,opacity;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-shadow{transition-property:box-shadow;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))}.transition-none{transition-property:none}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-400{transition-delay:.4s}.delay-\[0s\,150ms\]{transition-delay:0s,.15s}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-750{--tw-duration:.75s;transition-duration:.75s}.duration-\[50ms\]{--tw-duration:50ms;transition-duration:50ms}.duration-\[150ms\,0s\]{--tw-duration:.15s,0s;transition-duration:.15s,0s}.duration-\[300ms\]{--tw-duration:.3s;transition-duration:.3s}.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-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[--from-scale\:1\]{--from-scale:1}.\[--logo-size\:32px\]{--logo-size:32px}.\[--offset\:5px\]{--offset:5px}.\[--offset\:8px\]{--offset:8px}.\[--offset\:10px\]{--offset:10px}.\[--offset\:20px\]{--offset:20px}.\[--page-bottom-margin\:0px\]{--page-bottom-margin:0px}.\[--page-height\:calc\(100dvh-var\(--page-top-margin\)-var\(--page-bottom-margin\)-1px\)\]{--page-height:calc(100dvh - var(--page-top-margin) - var(--page-bottom-margin) - 1px)}.\[--page-top-margin\:0px\]{--page-top-margin:0px}.\[--scroll\:-100\%\]{--scroll:-100%}.\[--sheet-width\:720px\]{--sheet-width:720px}.\[--sheet-width\:940px\]{--sheet-width:940px}.\[--stroke-color\:\#1B1B18\]{--stroke-color:#1b1b18}.\[--thumb-radius\:10px\]{--thumb-radius:10px}.\[--to-scale\:1\.2\]{--to-scale:1.2}.\[--track-color\:\#fff3\]{--track-color:#fff3}.\[--track-height\:14px\]{--track-height:14px}.\[-webkit-mask-image\:radial-gradient\(ellipse_95\%_85\%_at_50\%_42\%\,\#000_0\%\,transparent_68\%\)\]{-webkit-mask-image:radial-gradient(95% 85% at 50% 42%,#000 0%,#0000 68%)}.\[animation-delay\:-0\.3s\]{animation-delay:-.3s}.\[animation-delay\:-0\.15s\]{animation-delay:-.15s}.\[animation-delay\:0\.2s\]{animation-delay:.2s}.\[animation-delay\:0\.3s\]{animation-delay:.3s}.\[animation-delay\:0\.4s\]{animation-delay:.4s}.\[animation-delay\:0\.15s\]{animation-delay:.15s}.\[animation-delay\:1\.9s\]{animation-delay:1.9s}.\[animation-delay\:2\.3s\]{animation-delay:2.3s}.\[animation-delay\:2s\]{animation-delay:2s}.\[animation-delay\:50ms\]{animation-delay:50ms}.\[animation-delay\:100ms\]{animation-delay:.1s}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:200ms\]{animation-delay:.2s}.\[animation-delay\:250ms\]{animation-delay:.25s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[animation-delay\:400ms\]{animation-delay:.4s}.\[animation-delay\:450ms\]{animation-delay:.45s}.\[animation-delay\:500ms\]{animation-delay:.5s}.\[animation-delay\:750ms\]{animation-delay:.75s}.\[animation-direction\:alternate\]{animation-direction:alternate}.\[animation-direction\:reverse\]{animation-direction:reverse}.\[animation-duration\:0\.2s\]{animation-duration:.2s}.\[animation-duration\:0\.5s\]{animation-duration:.5s}.\[animation-duration\:0\.25s\]{animation-duration:.25s}.\[animation-duration\:1\.3s\]{animation-duration:1.3s}.\[animation-duration\:1\.5s\]{animation-duration:1.5s}.\[animation-duration\:1s\]{animation-duration:1s}.\[animation-duration\:40s\]{animation-duration:40s}.\[animation-duration\:150ms\]{animation-duration:.15s}.\[animation-fill-mode\:both\]{animation-fill-mode:both}.\[animation-fill-mode\:forwards\]{animation-fill-mode:forwards}.\[animation-iteration-count\:2\]{animation-iteration-count:2}.\[animation-timing-function\:ease-in-out\]{animation-timing-function:ease-in-out}.\[perspective\:500px\]{perspective:500px}.\[stop-opacity\:0\.3\]{stop-opacity:.3}.\[stop-opacity\:0\.23\]{stop-opacity:.23}.\[transform-box\:fill-box\]{transform-box:fill-box}.\[vector-effect\:non-scaling-stroke\]{vector-effect:non-scaling-stroke}.ring-inset{--tw-ring-inset:inset}.not-has-\[nav\]\:hidden:not(:has(:is(nav))){display:none}.group-first\:block:is(:where(.group):first-child *){display:block}@media (hover:hover){.group-hover\:pointer-events-auto:is(:where(.group):hover *){pointer-events:auto}.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:w-3:is(:where(.group):hover *){width:calc(var(--spacing) * 3)}.group-hover\:w-\[82px\]:is(:where(.group):hover *){width:82px}.group-hover\:max-w-\[calc\(100\%-5rem\)\]:is(:where(.group):hover *){max-width:calc(100% - 5rem)}.group-hover\:-translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-x-14:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * -14);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-0:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-3:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-px:is(:where(.group):hover *){--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-0\.5:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:-translate-y-px:is(:where(.group):hover *){--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-y-0:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-90:is(:where(.group):hover *){--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:-rotate-12:is(:where(.group):hover *){rotate:-12deg}.group-hover\:rotate-12:is(:where(.group):hover *){rotate:12deg}.group-hover\:rotate-\[360deg\]:is(:where(.group):hover *){rotate:360deg}.group-hover\:border-neutral-200:is(:where(.group):hover *){border-color:var(--color-neutral-200)}.group-hover\:bg-neutral-100:is(:where(.group):hover *){background-color:var(--color-neutral-100)}.group-hover\:bg-neutral-200:is(:where(.group):hover *){background-color:var(--color-neutral-200)}.group-hover\:bg-neutral-300:is(:where(.group):hover *){background-color:var(--color-neutral-300)}.group-hover\:bg-neutral-400:is(:where(.group):hover *){background-color:var(--color-neutral-400)}.group-hover\:bg-red-500:is(:where(.group):hover *){background-color:var(--color-red-500)}.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-cyan-400:is(:where(.group):hover *){color:var(--color-cyan-400)}.group-hover\:text-gray-900:is(:where(.group):hover *){color:var(--color-gray-900)}.group-hover\:text-neutral-500:is(:where(.group):hover *){color:var(--color-neutral-500)}.group-hover\:text-neutral-600:is(:where(.group):hover *){color:var(--color-neutral-600)}.group-hover\:text-neutral-800:is(:where(.group):hover *){color:var(--color-neutral-800)}.group-hover\:text-neutral-900:is(:where(.group):hover *){color:var(--color-neutral-900)}.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-0:is(:where(.group):hover *){opacity:0}.group-hover\:opacity-30:is(:where(.group):hover *){opacity:.3}.group-hover\:opacity-70:is(:where(.group):hover *){opacity:.7}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\:ring:is(:where(.group):hover *){--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)}.group-hover\:ring-\[8px\]:is(:where(.group):hover *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(8px + 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)}.group-hover\:blur-\[3px\]:is(:where(.group):hover *){--tw-blur:blur(3px);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,)}.group-hover\:blur-sm:is(:where(.group):hover *){--tw-blur:blur(var(--blur-sm));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,)}.group-hover\:drop-shadow-sm:is(:where(.group):hover *){--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));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,)}.group-hover\:grayscale-0:is(:where(.group):hover *){--tw-grayscale:grayscale(0%);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,)}.group-hover\:transition-transform:is(:where(.group):hover *){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))}.group-hover\:duration-500:is(:where(.group):hover *){--tw-duration:.5s;transition-duration:.5s}.group-hover\/add-tag\:grid-cols-\[1fr\]:is(:where(.group\/add-tag):hover *){grid-template-columns:1fr}.group-hover\/add-tag\:opacity-100:is(:where(.group\/add-tag):hover *){opacity:1}.group-hover\/button\:bg-neutral-100:is(:where(.group\/button):hover *){background-color:var(--color-neutral-100)}.group-hover\/chart\:translate-x-0:is(:where(.group\/chart):hover *){--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\/discountcode\:underline:is(:where(.group\/discountcode):hover *){text-decoration-line:underline}.group-hover\/empty\:opacity-100:is(:where(.group\/empty):hover *){opacity:1}.group-hover\/row\:pointer-events-auto:is(:where(.group\/row):hover *){pointer-events:auto}.group-hover\/row\:opacity-0:is(:where(.group\/row):hover *){opacity:0}.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *){opacity:1}}.group-focus-visible\:opacity-100:is(:where(.group):focus-visible *){opacity:1}.group-focus-visible\:ring:is(:where(.group):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)}.group-focus-visible\/add-tag\:grid-cols-\[1fr\]:is(:where(.group\/add-tag):focus-visible *){grid-template-columns:1fr}.group-focus-visible\/add-tag\:opacity-100:is(:where(.group\/add-tag):focus-visible *){opacity:1}.group-active\:scale-95:is(:where(.group):active *){--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-active\:bg-neutral-500:is(:where(.group):active *){background-color:var(--color-neutral-500)}.group-active\:ring-\[7px\]:is(:where(.group):active *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(7px + 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)}.group-active\/button\:scale-95:is(:where(.group\/button):active *){--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-active\/button\:border-neutral-300:is(:where(.group\/button):active *),.group-disabled\:border-neutral-300:is(:where(.group):disabled *){border-color:var(--color-neutral-300)}.group-disabled\:text-neutral-400:is(:where(.group):disabled *){color:var(--color-neutral-400)}.group-has-\[\+div\[data-\[touched\=true\]\]\]\:opacity-100:is(:where(.group):has() *){opacity:1}.group-data-\[active\=true\]\:rotate-180:is(:where(.group)[data-active=true] *){rotate:180deg}.group-data-\[active\=true\]\:text-blue-600:is(:where(.group)[data-active=true] *){color:var(--color-blue-600)}.group-data-\[checked\=true\]\:scale-100:is(:where(.group)[data-checked=true] *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-data-\[checked\=true\]\:opacity-100:is(:where(.group)[data-checked=true] *){opacity:1}.group-data-\[state\=open\]\:rotate-90:is(:where(.group)[data-state=open] *){rotate:90deg}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[touched\=true\]\:pointer-events-auto:is(:where(.group)[data-touched=true] *){pointer-events:auto}.group-data-\[touched\=true\]\:opacity-100:is(:where(.group)[data-touched=true] *){opacity:1}.group-data-\[variant\=compact\]\/card-list\:flex:is(:where(.group\/card-list)[data-variant=compact] *){display:flex}.group-data-\[variant\=compact\]\/card-list\:opacity-100:is(:where(.group\/card-list)[data-variant=compact] *){opacity:1}.group-data-\[variant\=loose\]\/card-list\:flex:is(:where(.group\/card-list)[data-variant=loose] *){display:flex}.group-data-\[variant\=loose\]\/card-list\:size-6:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.group-data-\[variant\=loose\]\/card-list\:size-10:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.group-data-\[variant\=loose\]\/card-list\:h-\[46px\]:is(:where(.group\/card-list)[data-variant=loose] *){height:46px}.group-data-\[variant\=loose\]\/card-list\:h-\[60px\]:is(:where(.group\/card-list)[data-variant=loose] *){height:60px}.group-data-\[variant\=loose\]\/card-list\:p-1:is(:where(.group\/card-list)[data-variant=loose] *){padding:calc(var(--spacing) * 1)}.group-data-\[variant\=loose\]\/card-list\:opacity-100:is(:where(.group\/card-list)[data-variant=loose] *){opacity:1}@media (hover:hover){.peer-hover\:opacity-5:is(:where(.peer):hover~*){opacity:.05}}.peer-focus-visible\:ring-offset-2:is(:where(.peer):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)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.marker\:text-neutral-500 ::marker{color:var(--color-neutral-500)}.marker\:text-neutral-500::marker{color:var(--color-neutral-500)}.marker\:text-neutral-500 ::-webkit-details-marker{color:var(--color-neutral-500)}.marker\:text-neutral-500::-webkit-details-marker{color:var(--color-neutral-500)}.selection\:bg-cyan-500 ::selection{background-color:var(--color-cyan-500)}.selection\:bg-cyan-500::selection{background-color:var(--color-cyan-500)}.selection\:text-slate-900 ::selection{color:var(--color-slate-900)}.selection\:text-slate-900::selection{color:var(--color-slate-900)}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:-inset-x-1:before{content:var(--tw-content);inset-inline:calc(var(--spacing) * -1)}.before\:inset-y-0:before{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing) * 0)}.before\:top-1\/2:before{content:var(--tw-content);top:50%}.before\:bottom-0:before{content:var(--tw-content);bottom:calc(var(--spacing) * 0)}.before\:bottom-1\/2:before{content:var(--tw-content);bottom:50%}.before\:left-\[0\.4rem\]:before{content:var(--tw-content);left:.4rem}.before\:rounded:before{content:var(--tw-content);border-radius:.25rem}.before\:border-l:before{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:1px}.before\:border-\[\#e3e3e0\]:before{content:var(--tw-content);border-color:#e3e3e0}.before\:opacity-0:before{content:var(--tw-content);opacity:0}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.first\:rounded-l-lg:first-child{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.first\:pt-0:first-child{padding-top:calc(var(--spacing) * 0)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing) * 0)}.last\:rounded-r-lg:last-child{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.last\:border-r:last-child{border-right-style:var(--tw-border-style);border-right-width:1px}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.read-only\:bg-neutral-100:read-only{background-color:var(--color-neutral-100)}.read-only\:text-neutral-500:read-only{color:var(--color-neutral-500)}.focus-within\:w-\[82px\]:focus-within{width:82px}.focus-within\:border-black\/75:focus-within{border-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus-within\:border-black\/75:focus-within{border-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus-within\:border-neutral-500:focus-within{border-color:var(--color-neutral-500)}.focus-within\:border-neutral-800:focus-within{border-color:var(--color-neutral-800)}.focus-within\:border-red-500:focus-within{border-color:var(--color-red-500)}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:ring-1:focus-within{--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-within\:ring-2:focus-within{--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-within\:ring-black\/75:focus-within{--tw-ring-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus-within\:ring-black\/75:focus-within{--tw-ring-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus-within\:ring-neutral-500:focus-within{--tw-ring-color:var(--color-neutral-500)}.focus-within\:ring-neutral-900:focus-within{--tw-ring-color:var(--color-neutral-900)}.focus-within\:ring-red-600:focus-within{--tw-ring-color:var(--color-red-600)}.focus-within\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:h-52:hover{height:calc(var(--spacing) * 52)}.hover\:translate-x-\[-2\%\]:hover{--tw-translate-x:-2%;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-1:hover{--tw-translate-y:calc(var(--spacing) * -1);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-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:scale-\[1\.15\]:hover{scale:1.15}.hover\:cursor-copy:hover{cursor:copy}.hover\:cursor-grab:hover{cursor:grab}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border:hover{border-style:var(--tw-border-style);border-width:1px}.hover\:border-\[\#1915014a\]:hover{border-color:#1915014a}.hover\:border-\[\#19140035\]:hover{border-color:#19140035}.hover\:border-amber-200\/50:hover{border-color:#fee68580}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber-200\/50:hover{border-color:color-mix(in oklab, var(--color-amber-200) 50%, transparent)}}.hover\:border-black:hover{border-color:var(--color-black)}.hover\:border-blue-500:hover{border-color:var(--color-blue-500)}.hover\:border-emerald-200\/50:hover{border-color:#a4f4cf80}@supports (color:color-mix(in lab, red, red)){.hover\:border-emerald-200\/50:hover{border-color:color-mix(in oklab, var(--color-emerald-200) 50%, transparent)}}.hover\:border-green-500:hover{border-color:var(--color-green-500)}.hover\:border-indigo-200\/50:hover{border-color:#c7d2ff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-indigo-200\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-200) 50%, transparent)}}.hover\:border-neutral-200:hover{border-color:var(--color-neutral-200)}.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:border-neutral-500:hover{border-color:var(--color-neutral-500)}.hover\:border-neutral-800:hover{border-color:var(--color-neutral-800)}.hover\:border-orange-500:hover{border-color:var(--color-orange-500)}.hover\:border-pink-200\/50:hover{border-color:#fccee880}@supports (color:color-mix(in lab, red, red)){.hover\:border-pink-200\/50:hover{border-color:color-mix(in oklab, var(--color-pink-200) 50%, transparent)}}.hover\:border-purple-200\/50:hover{border-color:#e9d5ff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-purple-200\/50:hover{border-color:color-mix(in oklab, var(--color-purple-200) 50%, transparent)}}.hover\:border-red-200:hover{border-color:var(--color-red-200)}.hover\:border-red-500:hover{border-color:var(--color-red-500)}.hover\:border-rose-200\/50:hover{border-color:#ffccd380}@supports (color:color-mix(in lab, red, red)){.hover\:border-rose-200\/50:hover{border-color:color-mix(in oklab, var(--color-rose-200) 50%, transparent)}}.hover\:border-sky-200\/50:hover{border-color:#b8e6fe80}@supports (color:color-mix(in lab, red, red)){.hover\:border-sky-200\/50:hover{border-color:color-mix(in oklab, var(--color-sky-200) 50%, transparent)}}.hover\:border-slate-600:hover{border-color:var(--color-slate-600)}.hover\:border-slate-700:hover{border-color:var(--color-slate-700)}.hover\:border-violet-500:hover{border-color:var(--color-violet-500)}.hover\:\!bg-blue-100:hover{background-color:var(--color-blue-100)!important}.hover\:\!bg-orange-100:hover{background-color:var(--color-orange-100)!important}.hover\:bg-\[\#e4e4e7\]:hover{background-color:#e4e4e7}.hover\:bg-\[var\(--brand\)\]:hover{background-color:var(--brand)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.hover\:bg-black\/40:hover{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/40:hover{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.hover\:bg-black\/\[0\.03\]:hover{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/\[0\.03\]:hover{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.hover\:bg-black\/\[0\.07\]:hover{background-color:#00000012}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/\[0\.07\]:hover{background-color:color-mix(in oklab, var(--color-black) 7.0%, transparent)}}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-100\/80:hover{background-color:#dbeafecc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-100\/80:hover{background-color:color-mix(in oklab, var(--color-blue-100) 80%, transparent)}}.hover\:bg-blue-200\/60:hover{background-color:#bedbff99}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-200\/60:hover{background-color:color-mix(in oklab, var(--color-blue-200) 60%, transparent)}}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-cyan-400:hover{background-color:var(--color-cyan-400)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-50\/50:hover{background-color:#f9fafb80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-50\/50:hover{background-color:color-mix(in oklab, var(--color-gray-50) 50%, transparent)}}.hover\:bg-gray-50\/60:hover{background-color:#f9fafb99}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-50\/60:hover{background-color:color-mix(in oklab, var(--color-gray-50) 60%, transparent)}}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-300\/80:hover{background-color:#d1d5dccc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-300\/80:hover{background-color:color-mix(in oklab, var(--color-gray-300) 80%, transparent)}}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-green-300\/80:hover{background-color:#7bf1a8cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-green-300\/80:hover{background-color:color-mix(in oklab, var(--color-green-300) 80%, transparent)}}.hover\:bg-green-500\/10:hover{background-color:#00c7581a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-green-500\/10:hover{background-color:color-mix(in oklab, var(--color-green-500) 10%, transparent)}}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-50\/80:hover{background-color:#fafafacc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-50\/80:hover{background-color:color-mix(in oklab, var(--color-neutral-50) 80%, transparent)}}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-100\/50:hover{background-color:#f5f5f580}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-100\/50:hover{background-color:color-mix(in oklab, var(--color-neutral-100) 50%, transparent)}}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-neutral-200\/50:hover{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/50:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.hover\:bg-neutral-200\/60:hover{background-color:#e5e5e599}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/60:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 60%, transparent)}}.hover\:bg-neutral-200\/75:hover{background-color:#e5e5e5bf}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/75:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 75%, transparent)}}.hover\:bg-neutral-200\/80:hover{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-neutral-200\/80:hover{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.hover\:bg-neutral-300:hover{background-color:var(--color-neutral-300)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-neutral-800:hover{background-color:var(--color-neutral-800)}.hover\:bg-neutral-900:hover{background-color:var(--color-neutral-900)}.hover\:bg-orange-100:hover{background-color:var(--color-orange-100)}.hover\:bg-orange-600:hover{background-color:var(--color-orange-600)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-600\/10:hover{background-color:#e400141a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-600\/10:hover{background-color:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-transparent:hover{background-color:#0000}.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\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, 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\/90:hover{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/90:hover{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.hover\:bg-gradient-to-r:hover{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.hover\:from-blue-50:hover{--tw-gradient-from:var(--color-blue-50);--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))}.hover\:from-cyan-400:hover{--tw-gradient-from:var(--color-cyan-400);--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))}.hover\:from-green-50:hover{--tw-gradient-from:var(--color-green-50);--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))}.hover\:from-neutral-50:hover{--tw-gradient-from:var(--color-neutral-50);--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))}.hover\:from-neutral-200:hover{--tw-gradient-from:var(--color-neutral-200);--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))}.hover\:from-orange-50:hover{--tw-gradient-from:var(--color-orange-50);--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))}.hover\:from-red-50:hover{--tw-gradient-from:var(--color-red-50);--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))}.hover\:from-violet-50:hover{--tw-gradient-from:var(--color-violet-50);--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))}.hover\:to-blue-500:hover{--tw-gradient-to:var(--color-blue-500);--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))}.hover\:to-transparent:hover{--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))}.hover\:pt-10:hover{padding-top:calc(var(--spacing) * 10)}.hover\:text-amber-800:hover{color:var(--color-amber-800)}.hover\:text-black:hover{color:var(--color-black)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-cyan-300:hover{color:var(--color-cyan-300)}.hover\:text-cyan-400:hover{color:var(--color-cyan-400)}.hover\:text-gray-500:hover{color:var(--color-gray-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-neutral-500:hover{color:var(--color-neutral-500)}.hover\:text-neutral-600:hover{color:var(--color-neutral-600)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}.hover\:text-neutral-800:hover{color:var(--color-neutral-800)}.hover\:text-neutral-900:hover{color:var(--color-neutral-900)}.hover\:text-neutral-950:hover{color:var(--color-neutral-950)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-white:hover{color:var(--color-white)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-neutral-300:hover{-webkit-text-decoration-color:var(--color-neutral-300);-webkit-text-decoration-color:var(--color-neutral-300);text-decoration-color:var(--color-neutral-300)}.hover\:decoration-neutral-400:hover{-webkit-text-decoration-color:var(--color-neutral-400);-webkit-text-decoration-color:var(--color-neutral-400);text-decoration-color:var(--color-neutral-400)}.hover\:underline-offset-2:hover{text-underline-offset:2px}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow:hover{--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)}.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)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-sm:hover{--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)}.hover\:shadow-xl:hover{--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)}.hover\:ring:hover{--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)}.hover\:ring-0:hover{--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)}.hover\:ring-1:hover{--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)}.hover\:ring-4:hover{--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)}.hover\:shadow-cyan-500\/20:hover{--tw-shadow-color:#00b7d733}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-cyan-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-cyan-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-neutral-900\/30:hover{--tw-shadow-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-neutral-900\/30:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-neutral-900) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-pink-500\/20:hover{--tw-shadow-color:#f6339a33}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-pink-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-pink-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:ring-\[var\(--brand-ring\)\]:hover{--tw-ring-color:var(--brand-ring)}.hover\:ring-\[var\(--ring-color\)\]:hover{--tw-ring-color:var(--ring-color)}.hover\:ring-black\/5:hover{--tw-ring-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.hover\:ring-black\/5:hover{--tw-ring-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.hover\:ring-neutral-200:hover{--tw-ring-color:var(--color-neutral-200)}.hover\:brightness-75:hover{--tw-brightness:brightness(75%);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,)}.hover\:before\:opacity-60:hover:before{content:var(--tw-content);opacity:.6}}.focus\:z-\[1\]:focus{z-index:1}.focus\:border-\[var\(--brand\)\]:focus{border-color:var(--brand)}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.focus\:border-black:focus{border-color:var(--color-black)}.focus\:border-black\/75:focus{border-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus\:border-black\/75:focus{border-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus\:border-emerald-500:focus{border-color:var(--color-emerald-500)}.focus\:border-neutral-300:focus{border-color:var(--color-neutral-300)}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:border-neutral-500:focus{border-color:var(--color-neutral-500)}.focus\:border-neutral-600:focus{border-color:var(--color-neutral-600)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:border-red-600:focus{border-color:var(--color-red-600)}.focus\:border-transparent:focus{border-color:#0000}.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-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-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-4:focus{--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)}.focus\:ring-\[var\(--brand\)\]:focus{--tw-ring-color:var(--brand)}.focus\:ring-amber-500:focus{--tw-ring-color:var(--color-amber-500)}.focus\:ring-black:focus{--tw-ring-color:var(--color-black)}.focus\:ring-black\/75:focus{--tw-ring-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.focus\:ring-black\/75:focus{--tw-ring-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.focus\:ring-cyan-500:focus{--tw-ring-color:var(--color-cyan-500)}.focus\:ring-emerald-500:focus{--tw-ring-color:var(--color-emerald-500)}.focus\:ring-neutral-200:focus{--tw-ring-color:var(--color-neutral-200)}.focus\:ring-neutral-300:focus{--tw-ring-color:var(--color-neutral-300)}.focus\:ring-neutral-500:focus{--tw-ring-color:var(--color-neutral-500)}.focus\:ring-neutral-600:focus{--tw-ring-color:var(--color-neutral-600)}.focus\:ring-neutral-900:focus{--tw-ring-color:var(--color-neutral-900)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-red-600:focus{--tw-ring-color:var(--color-red-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:pointer-events-auto:focus-visible{pointer-events:auto}.focus-visible\:translate-x-0:focus-visible{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.focus-visible\:border-\[var\(--brand\)\]:focus-visible{border-color:var(--brand)}.focus-visible\:border-black:focus-visible{border-color:var(--color-black)}.focus-visible\:border-blue-600:focus-visible{border-color:var(--color-blue-600)}.focus-visible\:border-neutral-500:focus-visible{border-color:var(--color-neutral-500)}.focus-visible\:border-neutral-800:focus-visible{border-color:var(--color-neutral-800)}.focus-visible\:border-neutral-900:focus-visible{border-color:var(--color-neutral-900)}.focus-visible\:opacity-100:focus-visible{opacity:1}.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-\[var\(--brand\)\]:focus-visible{--tw-ring-color:var(--brand)}.focus-visible\:ring-\[var\(--ring-color\)\]:focus-visible{--tw-ring-color:var(--ring-color)}.focus-visible\:ring-black\/20:focus-visible{--tw-ring-color:#0003}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.focus-visible\:ring-black\/40:focus-visible{--tw-ring-color:#0006}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.focus-visible\:ring-black\/50:focus-visible{--tw-ring-color:#00000080}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-black\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.focus-visible\:ring-blue-600:focus-visible{--tw-ring-color:var(--color-blue-600)}.focus-visible\:ring-neutral-300:focus-visible{--tw-ring-color:var(--color-neutral-300)}.focus-visible\:ring-neutral-400:focus-visible{--tw-ring-color:var(--color-neutral-400)}.focus-visible\:ring-neutral-400\/50:focus-visible{--tw-ring-color:#a1a1a180}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-neutral-400\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-neutral-400) 50%, transparent)}}.focus-visible\:ring-neutral-500:focus-visible{--tw-ring-color:var(--color-neutral-500)}.focus-visible\:ring-neutral-900:focus-visible{--tw-ring-color:var(--color-neutral-900)}.focus-visible\:ring-neutral-950\/30:focus-visible{--tw-ring-color:#0a0a0a4d}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-neutral-950\/30:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-neutral-950) 30%, transparent)}}.focus-visible\:ring-orange-500:focus-visible{--tw-ring-color:var(--color-orange-500)}.focus-visible\:ring-teal-400\/35:focus-visible{--tw-ring-color:#00d3bd59}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-teal-400\/35:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-teal-400) 35%, transparent)}}.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\:ring-offset-white:focus-visible{--tw-ring-offset-color:var(--color-white)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-90:active{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.97\]:active{scale:.97}.active\:scale-\[0\.98\]:active{scale:.98}.active\:cursor-grabbing:active{cursor:grabbing}.active\:border-neutral-300:active{border-color:var(--color-neutral-300)}.active\:bg-black\/5:active{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/5:active{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.active\:bg-black\/10:active{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/10:active{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.active\:bg-black\/15:active{background-color:#00000026}@supports (color:color-mix(in lab, red, red)){.active\:bg-black\/15:active{background-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.active\:bg-blue-100:active{background-color:var(--color-blue-100)}.active\:bg-neutral-100:active{background-color:var(--color-neutral-100)}.active\:bg-neutral-200:active{background-color:var(--color-neutral-200)}.active\:bg-neutral-200\/80:active{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.active\:bg-neutral-200\/80:active{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.active\:bg-neutral-300:active{background-color:var(--color-neutral-300)}.active\:bg-red-200:active{background-color:var(--color-red-200)}.active\:bg-transparent:active{background-color:#0000}.active\:text-neutral-400:active{color:var(--color-neutral-400)}.active\:text-white:active{color:var(--color-white)}.active\:shadow-lg:active{--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)}.active\:ring-2:active{--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)}.active\:before\:opacity-100:active:before{content:var(--tw-content);opacity:1}.enabled\:border-\[var\(--brand\)\]:enabled{border-color:var(--brand)}.enabled\:bg-\[var\(--brand\)\]:enabled{background-color:var(--brand)}@media (hover:hover){.enabled\:hover\:bg-\[var\(--brand\)\]:enabled:hover{background-color:var(--brand)}.enabled\:hover\:bg-black\/5:enabled:hover{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-black\/5:enabled:hover{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.enabled\:hover\:bg-black\/\[0\.03\]:enabled:hover{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-black\/\[0\.03\]:enabled:hover{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.enabled\:hover\:text-neutral-700:enabled:hover{color:var(--color-neutral-700)}.enabled\:hover\:text-neutral-950:enabled:hover{color:var(--color-neutral-950)}.enabled\:hover\:ring-\[var\(--brand-ring\)\]:enabled:hover{--tw-ring-color:var(--brand-ring)}}.enabled\:active\:bg-black\/5:enabled:active{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.enabled\:active\:bg-black\/5:enabled:active{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.enabled\:active\:bg-black\/10:enabled:active{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.enabled\:active\:bg-black\/10:enabled:active{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.enabled\:active\:bg-neutral-200:enabled:active{background-color:var(--color-neutral-200)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-none:disabled{--tw-border-style:none;border-style:none}.disabled\:border-transparent:disabled{border-color:#0000}.disabled\:bg-neutral-50:disabled{background-color:var(--color-neutral-50)}.disabled\:bg-neutral-100:disabled{background-color:var(--color-neutral-100)}.disabled\:bg-transparent:disabled{background-color:#0000}.disabled\:text-black:disabled{color:var(--color-black)}.disabled\:text-neutral-400:disabled{color:var(--color-neutral-400)}.disabled\:text-neutral-500:disabled{color:var(--color-neutral-500)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.data-\[active\]\:bg-neutral-100[data-active]{background-color:var(--color-neutral-100)}.data-\[active\=true\]\:text-blue-500[data-active=true]{color:var(--color-blue-500)}.data-\[active\=true\]\:text-purple-500[data-active=true]{color:var(--color-purple-500)}.data-\[active\=true\]\:text-teal-500[data-active=true]{color:var(--color-teal-500)}.data-\[dragging\=true\]\:shadow-\[0_4px_12px_0_\#0000000D\][data-dragging=true]{--tw-shadow:0 4px 12px 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-\[selected\=true\]\:bg-black\/\[0\.03\][data-selected=true]{background-color:#00000008}@supports (color:color-mix(in lab, red, red)){.data-\[selected\=true\]\:bg-black\/\[0\.03\][data-selected=true]{background-color:color-mix(in oklab, var(--color-black) 3%, transparent)}}.data-\[selected\=true\]\:bg-neutral-100[data-selected=true]{background-color:var(--color-neutral-100)}.data-\[selected\=true\]\:bg-neutral-200\/50[data-selected=true]{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.data-\[selected\=true\]\:bg-neutral-200\/50[data-selected=true]{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.data-\[selected\=true\]\:text-neutral-800[data-selected=true]{color:var(--color-neutral-800)}.data-\[state\=checked\]\:bg-black[data-state=checked]{background-color:var(--color-black)}.data-\[state\=closed\]\:animate-none[data-state=closed]{animation:none}.data-\[state\=closed\]\:border-b-0[data-state=closed]{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.data-\[state\=indeterminate\]\:bg-black[data-state=indeterminate]{background-color:var(--color-black)}.data-\[state\=open\]\:animate-none[data-state=open]{animation:none}.data-\[state\=open\]\:border-neutral-500[data-state=open]{border-color:var(--color-neutral-500)}.data-\[state\=open\]\:border-red-500[data-state=open]{border-color:var(--color-red-500)}.data-\[state\=open\]\:bg-blue-100[data-state=open]{background-color:var(--color-blue-100)}.data-\[state\=open\]\:bg-neutral-100[data-state=open]{background-color:var(--color-neutral-100)}.data-\[state\=open\]\:bg-neutral-200[data-state=open]{background-color:var(--color-neutral-200)}.data-\[state\=open\]\:bg-neutral-200\/50[data-state=open]{background-color:#e5e5e580}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:bg-neutral-200\/50[data-state=open]{background-color:color-mix(in oklab, var(--color-neutral-200) 50%, transparent)}}.data-\[state\=open\]\:bg-neutral-200\/80[data-state=open]{background-color:#e5e5e5cc}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:bg-neutral-200\/80[data-state=open]{background-color:color-mix(in oklab, var(--color-neutral-200) 80%, transparent)}}.data-\[state\=open\]\:bg-orange-100[data-state=open]{background-color:var(--color-orange-100)}.data-\[state\=open\]\:text-neutral-600[data-state=open]{color:var(--color-neutral-600)}.data-\[state\=open\]\:ring[data-state=open],.data-\[state\=open\]\:ring-1[data-state=open]{--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)}.data-\[state\=open\]\:ring-4[data-state=open]{--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)}.data-\[state\=open\]\:ring-black\/20[data-state=open]{--tw-ring-color:#0003}@supports (color:color-mix(in lab, red, red)){.data-\[state\=open\]\:ring-black\/20[data-state=open]{--tw-ring-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.data-\[state\=open\]\:ring-neutral-200[data-state=open]{--tw-ring-color:var(--color-neutral-200)}.data-\[state\=open\]\:ring-neutral-500[data-state=open]{--tw-ring-color:var(--color-neutral-500)}.data-\[state\=open\]\:ring-red-500[data-state=open]{--tw-ring-color:var(--color-red-500)}@media (prefers-reduced-motion:no-preference){.motion-safe\:\[animation-direction\:reverse\]{animation-direction:reverse}.motion-safe\:\[animation-duration\:30s\]{animation-duration:30s}.motion-safe\:\[animation-duration\:40s\]{animation-duration:40s}}@media not all and (min-width:1372px){.max-\[1372px\]\:left-0{left:calc(var(--spacing) * 0)}.max-\[1372px\]\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}}@media not all and (min-width:1120px){.max-\[1120px\]\:hidden{display:none}}@media not all and (min-width:960px){.max-\[960px\]\:hidden{display:none}}@media not all and (min-width:420px){.max-\[420px\]\:hidden{display:none}.max-\[420px\]\:inline{display:inline}}@media not all and (min-width:380px){.max-\[380px\]\:hidden{display:none}}@media not all and (min-width:64rem){.max-lg\:pointer-events-none{pointer-events:none}.max-lg\:mt-3{margin-top:calc(var(--spacing) * 3)}.max-lg\:w-\[calc\(400cqw\+3\*32px\)\]{width:calc(400cqw + 96px)}.max-lg\:w-\[calc\(var\(--cols\)\*100cqw\+\(var\(--cols\)-1\)\*32px\)\]{width:calc(var(--cols) * 100cqw + (var(--cols) - 1) * 32px)}.max-lg\:max-w-none{max-width:none}.max-lg\:translate-x-\[calc\(-1\*var\(--index\)\*\(100cqw\+32px\)\)\]{--tw-translate-x:calc(-1 * var(--index) * (100cqw + 32px));translate:var(--tw-translate-x) var(--tw-translate-y)}.max-lg\:grid-rows-\[0px_minmax\(0\,1fr\)\]{grid-template-rows:0 minmax(0,1fr)}.max-lg\:grid-rows-\[453px_minmax\(0\,1fr\)\]{grid-template-rows:453px minmax(0,1fr)}.max-lg\:gap-x-8{column-gap:calc(var(--spacing) * 8)}.max-lg\:overflow-hidden{overflow:hidden}.max-lg\:rounded-lg{border-radius:var(--radius-lg)}.max-lg\:rounded-xl{border-radius:var(--radius-xl)}.max-lg\:rounded-t-\[16px\]{border-top-left-radius:16px;border-top-right-radius:16px}.max-lg\:border{border-style:var(--tw-border-style);border-width:1px}.max-lg\:border-0{border-style:var(--tw-border-style);border-width:0}.max-lg\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.max-lg\:border-neutral-200{border-color:var(--color-neutral-200)}.max-lg\:opacity-0{opacity:0}.max-lg\: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)}.max-lg\:ring-neutral-200{--tw-ring-color:var(--color-neutral-200)}.max-lg\: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))}.max-lg\:ring-inset{--tw-ring-inset:inset}}@media not all and (min-width:48rem){.max-md\:hidden{display:none}.max-md\:max-h-\[calc\(100dvh-200px\)\]{max-height:calc(100dvh - 200px)}.max-md\:min-h-\[min\(566px\,_calc\(100dvh-200px\)\)\]{min-height:min(566px,100dvh - 200px)}.max-md\:w-full{width:100%}.max-md\:overflow-auto{overflow:auto}}@media not all and (min-width:40rem){.max-sm\:hidden{display:none}.max-sm\:w-full{width:100%}:where(.max-sm\: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)))}.max-sm\: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)}}@media (min-width:300px){.min-\[300px\]\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}@media (min-width:550px){.min-\[550px\]\:flex-row{flex-direction:row}.min-\[550px\]\:items-center{align-items:center}.min-\[550px\]\:justify-between{justify-content:space-between}}@media (min-width:900px){.min-\[900px\]\:flex{display:flex}.min-\[900px\]\:hidden{display:none}.min-\[900px\]\:grid-cols-\[440px_minmax\(0\,1fr\)\]{grid-template-columns:440px minmax(0,1fr)}.min-\[900px\]\:grid-cols-\[minmax\(0\,1fr\)_440px\]{grid-template-columns:minmax(0,1fr) 440px}}@media (min-width:1120px){.min-\[1120px\]\:inline-block{display:inline-block}.min-\[1120px\]\:pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}}@media (min-width:40rem){.sm\:-top-6{top:calc(var(--spacing) * -6)}.sm\:top-1\/2{top:50%}.sm\:bottom-0{bottom:calc(var(--spacing) * 0)}.sm\:left-4{left:calc(var(--spacing) * 4)}.sm\:left-\[8px\]{left:8px}.sm\:left-\[68px\]{left:68px}.sm\:left-\[151px\]{left:151px}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mx-0{margin-inline:calc(var(--spacing) * 0)}.sm\:mx-12{margin-inline:calc(var(--spacing) * 12)}.sm\:mx-auto{margin-inline:auto}.sm\:-my-1{margin-block:calc(var(--spacing) * -1)}.sm\:mt-0{margin-top:calc(var(--spacing) * 0)}.sm\:mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.sm\:mt-8{margin-top:calc(var(--spacing) * 8)}.sm\:mt-14{margin-top:calc(var(--spacing) * 14)}.sm\:-mr-8{margin-right:calc(var(--spacing) * -8)}.sm\:-mb-6{margin-bottom:calc(var(--spacing) * -6)}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:table-cell{display:table-cell}.sm\:aspect-\[2\/1\]{aspect-ratio:2}.sm\:size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.sm\:size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.sm\:size-4\.5{width:calc(var(--spacing) * 4.5);height:calc(var(--spacing) * 4.5)}.sm\:size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.sm\:size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.sm\:size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.sm\:size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.sm\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.sm\:size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.sm\:size-32{width:calc(var(--spacing) * 32);height:calc(var(--spacing) * 32)}.sm\:h-0{height:calc(var(--spacing) * 0)}.sm\:h-4{height:calc(var(--spacing) * 4)}.sm\:h-6{height:calc(var(--spacing) * 6)}.sm\:h-7{height:calc(var(--spacing) * 7)}.sm\:h-9{height:calc(var(--spacing) * 9)}.sm\:h-10{height:calc(var(--spacing) * 10)}.sm\:h-12{height:calc(var(--spacing) * 12)}.sm\:h-16{height:calc(var(--spacing) * 16)}.sm\:h-24{height:calc(var(--spacing) * 24)}.sm\:h-32{height:calc(var(--spacing) * 32)}.sm\:h-36{height:calc(var(--spacing) * 36)}.sm\:h-96{height:calc(var(--spacing) * 96)}.sm\:h-\[128px\]{height:128px}.sm\:h-\[132px\]{height:132px}.sm\:h-\[300px\]{height:300px}.sm\:h-\[302px\]{height:302px}.sm\:h-\[340px\]{height:340px}.sm\:h-\[464px\]{height:464px}.sm\:h-full{height:100%}.sm\:max-h-12{max-height:calc(var(--spacing) * 12)}.sm\:max-h-64{max-height:calc(var(--spacing) * 64)}.sm\:max-h-\[min\(90dvh\,720px\)\]{max-height:min(90dvh,720px)}.sm\:w-4{width:calc(var(--spacing) * 4)}.sm\:w-6{width:calc(var(--spacing) * 6)}.sm\:w-10{width:calc(var(--spacing) * 10)}.sm\:w-16{width:calc(var(--spacing) * 16)}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-32{width:calc(var(--spacing) * 32)}.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-52{width:calc(var(--spacing) * 52)}.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-\[100px\]{width:100px}.sm\:w-\[260px\]{width:260px}.sm\:w-\[340px\]{width:340px}.sm\:w-\[350px\]{width:350px}.sm\:w-\[400px\]{width:400px}.sm\:w-\[440px\]{width:440px}.sm\:w-\[560px\]{width:560px}.sm\:w-\[min\(100\%\,280px\)\]{width:min(100%,280px)}.sm\:w-auto{width:auto}.sm\:w-fit{width:fit-content}.sm\:max-w-\[50\%\]{max-width:50%}.sm\:max-w-\[140px\]{max-width:140px}.sm\:max-w-\[200px\]{max-width:200px}.sm\:max-w-\[225px\]{max-width:225px}.sm\:max-w-\[320px\]{max-width:320px}.sm\:max-w-\[400px\]{max-width:400px}.sm\:max-w-\[500px\]{max-width:500px}.sm\:max-w-\[600px\]{max-width:600px}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:min-w-48{min-width:calc(var(--spacing) * 48)}.sm\:min-w-56{min-width:calc(var(--spacing) * 56)}.sm\:min-w-64{min-width:calc(var(--spacing) * 64)}.sm\:min-w-\[17rem\]{min-width:17rem}.sm\:min-w-\[120px\]{min-width:120px}.sm\:min-w-\[130px\]{min-width:130px}.sm\:min-w-\[150px\]{min-width:150px}.sm\:min-w-\[180px\]{min-width:180px}.sm\:min-w-\[200px\]{min-width:200px}.sm\:min-w-\[240px\]{min-width:240px}.sm\:flex-1{flex:1}.sm\:flex-none{flex:none}.sm\:shrink-0{flex-shrink:0}.sm\:basis-\[120px\]{flex-basis:120px}.sm\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:-scale-x-100{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.sm\:rotate-\[-4deg\]{rotate:-4deg}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.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_auto\]{grid-template-columns:1fr auto}.sm\:grid-cols-\[3fr_1fr_1\.5fr\]{grid-template-columns:3fr 1fr 1.5fr}.sm\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.sm\:grid-cols-\[repeat\(var\(--cols\)\,minmax\(0\,1fr\)\)\]{grid-template-columns:repeat(var(--cols),minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-0{gap:calc(var(--spacing) * 0)}.sm\:gap-1{gap:calc(var(--spacing) * 1)}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.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-8{gap:calc(var(--spacing) * 8)}.sm\:gap-10{gap:calc(var(--spacing) * 10)}.sm\:gap-12{gap:calc(var(--spacing) * 12)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}: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)))}.sm\:gap-y-4{row-gap:calc(var(--spacing) * 4)}:where(.sm\: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(.sm\:divide-y-0>: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(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}:where(.sm\:divide-transparent>:not(:last-child)){border-color:#0000}.sm\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sm\:rounded-2xl{border-radius:var(--radius-2xl)}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:rounded-md{border-radius:var(--radius-md)}.sm\:rounded-xl{border-radius:var(--radius-xl)}.sm\:rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.sm\:rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.sm\:rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.sm\:rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:p-0{padding:calc(var(--spacing) * 0)}.sm\:p-1{padding:calc(var(--spacing) * 1)}.sm\:p-1\.5{padding:calc(var(--spacing) * 1.5)}.sm\:p-2{padding:calc(var(--spacing) * 2)}.sm\:p-2\.5{padding:calc(var(--spacing) * 2.5)}.sm\:p-3{padding:calc(var(--spacing) * 3)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.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-10{padding:calc(var(--spacing) * 10)}.sm\:p-20{padding:calc(var(--spacing) * 20)}.sm\:px-0{padding-inline:calc(var(--spacing) * 0)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.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-8{padding-inline:calc(var(--spacing) * 8)}.sm\:px-10{padding-inline:calc(var(--spacing) * 10)}.sm\:px-12{padding-inline:calc(var(--spacing) * 12)}.sm\:px-16{padding-inline:calc(var(--spacing) * 16)}.sm\:py-0{padding-block:calc(var(--spacing) * 0)}.sm\:py-0\.5{padding-block:calc(var(--spacing) * .5)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}.sm\:py-3{padding-block:calc(var(--spacing) * 3)}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:py-4\.5{padding-block:calc(var(--spacing) * 4.5)}.sm\:py-6{padding-block:calc(var(--spacing) * 6)}.sm\:pt-0{padding-top:calc(var(--spacing) * 0)}.sm\:pt-4{padding-top:calc(var(--spacing) * 4)}.sm\:pt-6{padding-top:calc(var(--spacing) * 6)}.sm\:pt-8{padding-top:calc(var(--spacing) * 8)}.sm\:pt-20{padding-top:calc(var(--spacing) * 20)}.sm\:pt-\[84px\]{padding-top:84px}.sm\:pr-3{padding-right:calc(var(--spacing) * 3)}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.sm\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.sm\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.sm\:pl-2{padding-left:calc(var(--spacing) * 2)}.sm\:pl-4{padding-left:calc(var(--spacing) * 4)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.sm\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[2\.5rem\]{font-size:2.5rem}.sm\:leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.sm\:leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:opacity-0{opacity:0}.sm\:opacity-10{opacity:.1}.sm\:opacity-15{opacity:.15}.sm\:opacity-20{opacity:.2}.sm\:opacity-100{opacity:1}.sm\: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)}.sm\: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)}.sm\:\[--logo-size\:18px\]{--logo-size:18px}@media (hover:hover){.sm\:group-hover\:translate-y-\[var\(--y\)\]:is(:where(.group):hover *){--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}:where(.sm\:group-hover\:divide-neutral-200:is(:where(.group):hover *)>:not(:last-child)){border-color:var(--color-neutral-200)}.sm\:group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.sm\:group-hover\:opacity-\[var\(--opacity\)\]:is(:where(.group):hover *){opacity:var(--opacity)}.sm\:group-hover\/card\:border-neutral-200:is(:where(.group\/card):hover *){border-color:var(--color-neutral-200)}}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:h-7:is(:where(.group):has([data-dragging=true]) *){height:calc(var(--spacing) * 7)}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:translate-y-\[var\(--y\)\]:is(:where(.group):has([data-dragging=true]) *){--tw-translate-y:var(--y);translate:var(--tw-translate-x) var(--tw-translate-y)}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:opacity-100:is(:where(.group):has([data-dragging=true]) *){opacity:1}.sm\:group-has-\[\*\[data-dragging\=true\]\]\:opacity-\[var\(--opacity\)\]:is(:where(.group):has([data-dragging=true]) *){opacity:var(--opacity)}.sm\:group-has-\[\+div\:hover\]\:opacity-100:is(:where(.group):has(+div:hover) *){opacity:1}@media (hover:hover){.sm\:group-hover\:group-data-\[active\=true\]\:h-7:is(:where(.group):hover *):is(:where(.group)[data-active=true] *){height:calc(var(--spacing) * 7)}.sm\:group-hover\:group-data-\[active\=true\]\:opacity-100:is(:where(.group):hover *):is(:where(.group)[data-active=true] *){opacity:1}}.group-data-\[variant\=loose\]\/card-list\:sm\:size-5:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:h-5:is(:where(.group\/card-list)[data-variant=loose] *){height:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:w-5:is(:where(.group\/card-list)[data-variant=loose] *){width:calc(var(--spacing) * 5)}.group-data-\[variant\=loose\]\/card-list\:sm\:opacity-100:is(:where(.group\/card-list)[data-variant=loose] *){opacity:1}.sm\:first\:rounded-tl-xl:first-child{border-top-left-radius:var(--radius-xl)}@media (hover:hover){.sm\:group-hover\/card\:data-\[state\=closed\]\:border-neutral-200:is(:where(.group\/card):hover *)[data-state=closed]{border-color:var(--color-neutral-200)}}@media not all and (min-width:1372px){.sm\:max-\[1372px\]\:w-\[calc\(100\%-150px\)\]{width:calc(100% - 150px)}}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:fixed{position:fixed}.md\:top-1\/2{top:50%}.md\:right-3{right:calc(var(--spacing) * 3)}.md\:right-\[62cqh\]{right:62cqh}.md\:bottom-0{bottom:calc(var(--spacing) * 0)}.md\:bottom-3{bottom:calc(var(--spacing) * 3)}.md\:left-0{left:calc(var(--spacing) * 0)}.md\:left-\[304px\]{left:304px}.md\:z-40{z-index:40}.md\:m-5{margin:calc(var(--spacing) * 5)}.md\:mx-0{margin-inline:calc(var(--spacing) * 0)}.md\:mt-0{margin-top:calc(var(--spacing) * 0)}.md\:mt-4{margin-top:calc(var(--spacing) * 4)}.md\:mt-6{margin-top:calc(var(--spacing) * 6)}.md\:mt-24{margin-top:calc(var(--spacing) * 24)}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline{display:inline}.md\:size-\[32cqh\]{width:32cqh;height:32cqh}.md\:h-8{height:calc(var(--spacing) * 8)}.md\:h-10{height:calc(var(--spacing) * 10)}.md\:h-96{height:calc(var(--spacing) * 96)}.md\:h-\[40vh\]{height:40vh}.md\:max-h-80{max-height:calc(var(--spacing) * 80)}.md\:min-h-0{min-height:calc(var(--spacing) * 0)}.md\:min-h-\[250px\]{min-height:250px}.md\:min-h-\[400px\]{min-height:400px}.md\:min-h-\[500px\]{min-height:500px}.md\:min-h-\[550px\]{min-height:550px}.md\:min-h-\[calc\(100vh-10rem\)\]{min-height:calc(100vh - 10rem)}.md\:min-h-\[calc\(100vh-32px\)\]{min-height:calc(100vh - 32px)}.md\:min-h-fit{min-height:fit-content}.md\:w-32{width:calc(var(--spacing) * 32)}.md\:w-48{width:calc(var(--spacing) * 48)}.md\:w-52{width:calc(var(--spacing) * 52)}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:w-60{width:calc(var(--spacing) * 60)}.md\:w-72{width:calc(var(--spacing) * 72)}.md\:w-80{width:calc(var(--spacing) * 80)}.md\:w-\[14rem\]{width:14rem}.md\:w-\[16rem\]{width:16rem}.md\:w-\[19rem\]{width:19rem}.md\:w-\[20rem\]{width:20rem}.md\:w-\[24rem\]{width:24rem}.md\:w-\[650px\]{width:650px}.md\:w-\[calc\(100\%-304px\)\]{width:calc(100% - 304px)}.md\:w-\[max\(min\(calc\(100vw-334px\)\,1170px\)\,540px\)\]{width:max(min(100vw - 334px,1170px),540px)}.md\:w-auto{width:auto}.md\:w-fit{width:fit-content}.md\:max-w-\[180px\]{max-width:180px}.md\:max-w-\[350px\]{max-width:350px}.md\:max-w-full{max-width:100%}.md\:max-w-md{max-width:var(--container-md)}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:min-w-48{min-width:calc(var(--spacing) * 48)}.md\:min-w-80{min-width:calc(var(--spacing) * 80)}.md\:min-w-\[200px\]{min-width:200px}.md\:min-w-\[250px\]{min-width:250px}.md\:flex-none{flex:none}.md\:grow{flex-grow:1}.md\:grow-0{flex-grow:0}.md\:basis-0{flex-basis:calc(var(--spacing) * 0)}.md\:translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.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-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-\[2fr_1fr\]{grid-template-columns:2fr 1fr}.md\:grid-cols-\[2fr_1fr_0\.5fr_1\.5fr\]{grid-template-columns:2fr 1fr .5fr 1.5fr}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-12{gap:calc(var(--spacing) * 12)}:where(.md\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}.md\:gap-x-16{column-gap:calc(var(--spacing) * 16)}.md\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md\:overflow-auto{overflow:auto}.md\:overflow-visible{overflow:visible}.md\:rounded-tl-2xl{border-top-left-radius:var(--radius-2xl)}.md\:border-0{border-style:var(--tw-border-style);border-width:0}.md\:bg-transparent{background-color:#0000}.md\:\[mask-image\:linear-gradient\(to_right\,black_60\%\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000 60%,#0000);mask-image:linear-gradient(90deg,#000 60%,#0000)}.md\:p-0{padding:calc(var(--spacing) * 0)}.md\:p-2{padding:calc(var(--spacing) * 2)}.md\:p-3{padding:calc(var(--spacing) * 3)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:px-0{padding-inline:calc(var(--spacing) * 0)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:px-10{padding-inline:calc(var(--spacing) * 10)}.md\:px-16{padding-inline:calc(var(--spacing) * 16)}.md\:py-0{padding-block:calc(var(--spacing) * 0)}.md\:py-3{padding-block:calc(var(--spacing) * 3)}.md\:py-16{padding-block:calc(var(--spacing) * 16)}.md\:pt-0{padding-top:calc(var(--spacing) * 0)}.md\:pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.md\:pr-4{padding-right:calc(var(--spacing) * 4)}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.md\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.md\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.md\:pl-0{padding-left:calc(var(--spacing) * 0)}.md\:pl-1{padding-left:calc(var(--spacing) * 1)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.md\:duration-300{--tw-duration:.3s;transition-duration:.3s}@media not all and (min-width:1372px){.md\:max-\[1372px\]\:w-\[calc\(100\%-304px-150px\)\]{width:calc(100% - 454px)}}}@media (min-width:64rem){.lg\:fixed{position:fixed}.lg\:sticky{position:sticky}.lg\:top-0{top:calc(var(--spacing) * 0)}.lg\:top-1\/2{top:50%}.lg\:right-\[62cqh\]{right:62cqh}.lg\:bottom-0{bottom:calc(var(--spacing) * 0)}.lg\:bottom-4{bottom:calc(var(--spacing) * 4)}.lg\:left-0{left:calc(var(--spacing) * 0)}.lg\:left-\[8px\]{left:8px}.lg\:left-\[68px\]{left:68px}.lg\:left-\[151px\]{left:151px}.lg\:z-0{z-index:0}.lg\:z-40{z-index:40}.lg\:z-auto{z-index:auto}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:m-5{margin:calc(var(--spacing) * 5)}.lg\:mt-6{margin-top:calc(var(--spacing) * 6)}.lg\:mt-10{margin-top:calc(var(--spacing) * 10)}.lg\:mb-0{margin-bottom:calc(var(--spacing) * 0)}.lg\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.lg\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.lg\:-ml-px{margin-left:-1px}.lg\:ml-0{margin-left:calc(var(--spacing) * 0)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:aspect-auto{aspect-ratio:auto}.lg\:size-\[32cqh\]{width:32cqh;height:32cqh}.lg\:h-3{height:calc(var(--spacing) * 3)}.lg\:h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.lg\:h-\[calc\(100vh-186px\)\]{height:calc(100vh - 186px)}.lg\:h-full{height:100%}.lg\:max-h-96{max-height:calc(var(--spacing) * 96)}.lg\:min-h-0{min-height:calc(var(--spacing) * 0)}.lg\:w-0{width:calc(var(--spacing) * 0)}.lg\:w-1\/2{width:50%}.lg\:w-64{width:calc(var(--spacing) * 64)}.lg\:w-\[240px\]{width:240px}.lg\:w-\[360px\]{width:360px}.lg\:w-\[438px\]{width:438px}.lg\:w-auto{width:auto}.lg\:w-full{width:100%}.lg\:max-w-4xl{max-width:var(--container-4xl)}.lg\:grow{flex-grow:1}.lg\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:translate-x-1\/2{--tw-translate-x:calc(1 / 2 * 100%);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x) var(--tw-scale-y)}.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-\[0px_minmax\(0\,1fr\)\]{grid-template-columns:0 minmax(0,1fr)}.lg\:grid-cols-\[240px_minmax\(0\,1fr\)\]{grid-template-columns:240px minmax(0,1fr)}.lg\:grid-cols-\[300px_minmax\(0\,600px\)\]{grid-template-columns:300px minmax(0,600px)}.lg\:grid-cols-\[595px_minmax\(0\,1fr\)\]{grid-template-columns:595px minmax(0,1fr)}.lg\:grid-cols-\[min-content_minmax\(0\,1fr\)\]{grid-template-columns:min-content minmax(0,1fr)}.lg\:grid-cols-\[minmax\(0\,1fr\)_300px\]{grid-template-columns:minmax(0,1fr) 300px}.lg\:grid-cols-\[minmax\(0\,1fr\)_595px\]{grid-template-columns:minmax(0,1fr) 595px}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,400px\)\]{grid-template-columns:minmax(0,1fr) minmax(0,400px)}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(268px\,22rem\)\]{grid-template-columns:minmax(0,1fr) minmax(268px,22rem)}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:items-center{align-items:center}.lg\:items-stretch{align-items:stretch}.lg\:justify-between{justify-content:space-between}.lg\:justify-center{justify-content:center}.lg\:justify-end{justify-content:flex-end}.lg\:gap-3{gap:calc(var(--spacing) * 3)}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:gap-16{gap:calc(var(--spacing) * 16)}:where(.lg\: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(.lg\: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(.lg\:divide-y-0>: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(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.lg\:rounded-xl{border-radius:var(--radius-xl)}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-tl-lg{border-top-left-radius:var(--radius-lg)}.lg\:rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:border{border-style:var(--tw-border-style);border-width:1px}.lg\:border-0{border-style:var(--tw-border-style);border-width:0}.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\:bg-neutral-50{background-color:var(--color-neutral-50)}.lg\:bg-transparent{background-color:#0000}.lg\:bg-white{background-color:var(--color-white)}.lg\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.lg\:p-0{padding:calc(var(--spacing) * 0)}.lg\:p-3{padding:calc(var(--spacing) * 3)}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:p-14{padding:calc(var(--spacing) * 14)}.lg\:p-20{padding:calc(var(--spacing) * 20)}.lg\:p-px{padding:1px}.lg\:px-0{padding-inline:calc(var(--spacing) * 0)}.lg\:px-3{padding-inline:calc(var(--spacing) * 3)}.lg\:px-4{padding-inline:calc(var(--spacing) * 4)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:px-6{padding-inline:calc(var(--spacing) * 6)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:py-3{padding-block:calc(var(--spacing) * 3)}.lg\:py-4{padding-block:calc(var(--spacing) * 4)}.lg\:py-6{padding-block:calc(var(--spacing) * 6)}.lg\:pt-0{padding-top:calc(var(--spacing) * 0)}.lg\:pt-5{padding-top:calc(var(--spacing) * 5)}.lg\:pr-2{padding-right:calc(var(--spacing) * 2)}.lg\:pb-2{padding-bottom:calc(var(--spacing) * 2)}.lg\:pb-10{padding-bottom:calc(var(--spacing) * 10)}.lg\:pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.lg\:opacity-0{opacity:0}.lg\:\[filter\:drop-shadow\(0_5px_8px_\#222A351d\)\]{filter:drop-shadow(0 5px 8px #222a351d)}.lg\:transition-\[opacity\,transform\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.lg\:\[--page-bottom-margin\:0\.5rem\]{--page-bottom-margin:.5rem}.lg\:\[--page-top-margin\:0\.5rem\]{--page-top-margin:.5rem}}@media (min-width:80rem){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:grid{display:grid}.xl\:hidden{display:none}.xl\:w-64{width:calc(var(--spacing) * 64)}.xl\:max-w-\[600px\]{max-width:600px}.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\:gap-4{gap:calc(var(--spacing) * 4)}.xl\:p-5{padding:calc(var(--spacing) * 5)}.xl\:px-0{padding-inline:calc(var(--spacing) * 0)}.xl\:px-12{padding-inline:calc(var(--spacing) * 12)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}@container (min-width:64px){.\@\[64px\]\:block{display:block}}@container (min-width:480px){.\@\[480px\]\:block{display:block}.\@\[480px\]\:hidden{display:none}}@container stats (min-width:695px){.\@\[695px\]\/stats\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@container (min-width:800px){.\@\[800px\]\:mt-6{margin-top:calc(var(--spacing) * 6)}}@container page (min-width:800px){.\@\[800px\]\/page\:hidden{display:none}}@container (min-width:800px){.\@\[800px\]\:size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}}@container page (min-width:800px){.\@\[800px\]\/page\:w-\[280px\]{width:280px}.\@\[800px\]\/page\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}}@container (min-width:800px){.\@\[800px\]\:translate-x-10{--tw-translate-x:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.\@\[800px\]\:-translate-y-10{--tw-translate-y:calc(var(--spacing) * -10);translate:var(--tw-translate-x) var(--tw-translate-y)}}@container page (min-width:800px){.\@\[800px\]\/page\:grid-cols-\[min-content_minmax\(340px\,1fr\)\]{grid-template-columns:min-content minmax(340px,1fr)}}@container (min-width:800px){.\@\[800px\]\:gap-4{gap:calc(var(--spacing) * 4)}.\@\[800px\]\:gap-12{gap:calc(var(--spacing) * 12)}}@container page (min-width:800px){.\@\[800px\]\/page\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}@container (min-width:800px){.\@\[800px\]\:p-16{padding:calc(var(--spacing) * 16)}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\:relative{position:relative}}@container page (min-width:960px){.\@\[960px\]\/page\:relative{position:relative}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\:z-auto{z-index:auto}.\@\[960px\]\/page-content\:hidden{display:none}}@container page (min-width:960px){.\@\[960px\]\/page\:hidden{display:none}.\@\[960px\]\/page\:w-\[340px\]{width:340px}}@container page-content (min-width:960px){.\@\[960px\]\/page-content\: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)}}@container page (min-width:960px){.\@\[960px\]\/page\: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 (min-width:40rem){@container page (min-width:1000px){.sm\:\@\[1000px\]\/page\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}}@container page (min-width:1082px){.\@\[1082px\]\/page\:relative{position:relative}.\@\[1082px\]\/page\:hidden{display:none}.\@\[1082px\]\/page\: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)}}@container stats (min-width:20rem){.\@xs\/stats\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@xs\/stats\:grid-cols-\[repeat\(var\(--cols\)\,1fr\)\]{grid-template-columns:repeat(var(--cols),1fr)}}@container panel (min-width:24rem){.\@sm\/panel\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:28rem){.\@md\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:36rem){.\@xl\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width:42rem){.\@2xl\:h-60{height:calc(var(--spacing) * 60)}.\@2xl\:h-72{height:calc(var(--spacing) * 72)}}@container page (min-width:42rem){.\@2xl\/page\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width:42rem){.\@2xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container page (min-width:48rem){.\@3xl\/page\:order-1{order:1}.\@3xl\/page\:order-2{order:2}}@container sheet (min-width:48rem){.\@3xl\/sheet\:order-1{order:1}.\@3xl\/sheet\:order-2{order:2}}@container page (min-width:48rem){.\@3xl\/page\:col-start-1{grid-column-start:1}.\@3xl\/page\:col-start-2{grid-column-start:2}.\@3xl\/page\:row-start-1{grid-row-start:1}.\@3xl\/page\:block{display:block}.\@3xl\/page\:contents{display:contents}.\@3xl\/page\:hidden{display:none}}@container sheet (min-width:48rem){.\@3xl\/sheet\:min-h-0{min-height:calc(var(--spacing) * 0)}}@container page (min-width:48rem){.\@3xl\/page\:w-\[360px\]{width:360px}.\@3xl\/page\:shrink-0{flex-shrink:0}.\@3xl\/page\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\@3xl\/page\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@3xl\/page\:grid-cols-\[minmax\(440px\,1fr\)_minmax\(0\,360px\)\]{grid-template-columns:minmax(440px,1fr) minmax(0,360px)}}@container sheet (min-width:48rem){.\@3xl\/sheet\:grid-cols-\[minmax\(440px\,1fr\)_minmax\(0\,360px\)\]{grid-template-columns:minmax(440px,1fr) minmax(0,360px)}.\@3xl\/sheet\:grid-rows-\[minmax\(0\,1fr\)\]{grid-template-rows:minmax(0,1fr)}.\@3xl\/sheet\:overflow-hidden{overflow:hidden}.\@3xl\/sheet\:overflow-y-auto{overflow-y:auto}}@container (min-width:56rem){.\@4xl\:h-full{height:100%}}@container page (min-width:56rem){.\@4xl\/page\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (min-width:56rem){.\@4xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\@4xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\@4xl\:grid-cols-\[minmax\(0\,1fr\)_400px\]{grid-template-columns:minmax(0,1fr) 400px}}@container page (min-width:64rem){.\@5xl\/page\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){:where(.dark\:divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-\[\#3E3E3A\]{border-color:#3e3e3a}.dark\:border-\[\#eeeeec\]{border-color:#eeeeec}.dark\:border-amber-700{border-color:var(--color-amber-700)}.dark\:border-amber-800{border-color:var(--color-amber-800)}.dark\:border-amber-800\/50{border-color:#953d0080}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-800\/50{border-color:color-mix(in oklab, var(--color-amber-800) 50%, transparent)}}.dark\:border-amber-900\/30{border-color:#7b33064d}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-900\/30{border-color:color-mix(in oklab, var(--color-amber-900) 30%, transparent)}}.dark\:border-amber-900\/40{border-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-900\/40{border-color:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.dark\:border-amber-950\/20{border-color:#46190133}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-950\/20{border-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.dark\:border-blue-700{border-color:var(--color-blue-700)}.dark\:border-blue-800{border-color:var(--color-blue-800)}.dark\:border-blue-900\/30{border-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-900\/30{border-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:border-blue-900\/40{border-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-900\/40{border-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:border-emerald-800{border-color:var(--color-emerald-800)}.dark\:border-emerald-900\/30{border-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/30{border-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:border-emerald-900\/40{border-color:#004e3b66}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-900\/40{border-color:color-mix(in oklab, var(--color-emerald-900) 40%, transparent)}}.dark\:border-gray-700{border-color:var(--color-gray-700)}.dark\:border-gray-700\/50{border-color:#36415380}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-700\/50{border-color:color-mix(in oklab, var(--color-gray-700) 50%, transparent)}}.dark\:border-gray-800{border-color:var(--color-gray-800)}.dark\:border-gray-800\/10{border-color:#1e29391a}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-800\/10{border-color:color-mix(in oklab, var(--color-gray-800) 10%, transparent)}}.dark\:border-gray-800\/80{border-color:#1e2939cc}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-800\/80{border-color:color-mix(in oklab, var(--color-gray-800) 80%, transparent)}}.dark\:border-indigo-900\/30{border-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:border-indigo-900\/30{border-color:color-mix(in oklab, var(--color-indigo-900) 30%, transparent)}}.dark\:border-indigo-900\/60{border-color:#312c8599}@supports (color:color-mix(in lab, red, red)){.dark\:border-indigo-900\/60{border-color:color-mix(in oklab, var(--color-indigo-900) 60%, transparent)}}.dark\:border-neutral-700{border-color:var(--color-neutral-700)}.dark\:border-neutral-700\/50{border-color:#40404080}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-700\/50{border-color:color-mix(in oklab, var(--color-neutral-700) 50%, transparent)}}.dark\:border-neutral-800{border-color:var(--color-neutral-800)}.dark\:border-neutral-800\/60{border-color:#26262699}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-800\/60{border-color:color-mix(in oklab, var(--color-neutral-800) 60%, transparent)}}.dark\:border-neutral-800\/80{border-color:#262626cc}@supports (color:color-mix(in lab, red, red)){.dark\:border-neutral-800\/80{border-color:color-mix(in oklab, var(--color-neutral-800) 80%, transparent)}}.dark\:border-neutral-900{border-color:var(--color-neutral-900)}.dark\:border-orange-900\/30{border-color:#7e2a0c4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-orange-900\/30{border-color:color-mix(in oklab, var(--color-orange-900) 30%, transparent)}}.dark\:border-pink-900\/30{border-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:border-pink-900\/30{border-color:color-mix(in oklab, var(--color-pink-900) 30%, transparent)}}.dark\:border-purple-800\/50{border-color:#6e11b080}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-800\/50{border-color:color-mix(in oklab, var(--color-purple-800) 50%, transparent)}}.dark\:border-purple-900\/30{border-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-900\/30{border-color:color-mix(in oklab, var(--color-purple-900) 30%, transparent)}}.dark\:border-purple-900\/40{border-color:#59168b66}@supports (color:color-mix(in lab, red, red)){.dark\:border-purple-900\/40{border-color:color-mix(in oklab, var(--color-purple-900) 40%, transparent)}}.dark\:border-red-900\/30{border-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/30{border-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.dark\:border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-900\/40{border-color:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.dark\:border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab, red, red)){.dark\:border-teal-800\/50{border-color:color-mix(in oklab, var(--color-teal-800) 50%, transparent)}}.dark\:border-white{border-color:var(--color-white)}.dark\:border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/5{border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/10{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.dark\:bg-\[\#0C0C0C\]{background-color:#0c0c0c}.dark\:bg-\[\#0a0a0a\]{background-color:#0a0a0a}.dark\:bg-\[\#1D0002\]{background-color:#1d0002}.dark\:bg-\[\#3E3E3A\]{background-color:#3e3e3a}.dark\:bg-\[\#161615\]{background-color:#161615}.dark\:bg-\[\#eeeeec\]{background-color:#eeeeec}.dark\:bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/20{background-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/30{background-color:color-mix(in oklab, var(--color-amber-900) 30%, transparent)}}.dark\:bg-amber-950\/10{background-color:#4619011a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/10{background-color:color-mix(in oklab, var(--color-amber-950) 10%, transparent)}}.dark\:bg-amber-950\/20{background-color:#46190133}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/20{background-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.dark\:bg-amber-950\/30{background-color:#4619014d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/30{background-color:color-mix(in oklab, var(--color-amber-950) 30%, transparent)}}.dark\:bg-amber-950\/40{background-color:#46190166}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/40{background-color:color-mix(in oklab, var(--color-amber-950) 40%, transparent)}}.dark\:bg-amber-950\/60{background-color:#46190199}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-950\/60{background-color:color-mix(in oklab, var(--color-amber-950) 60%, transparent)}}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/40{background-color:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.dark\:bg-blue-950\/20{background-color:#16245633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/20{background-color:color-mix(in oklab, var(--color-blue-950) 20%, transparent)}}.dark\:bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/30{background-color:color-mix(in oklab, var(--color-blue-950) 30%, transparent)}}.dark\:bg-blue-950\/40{background-color:#16245666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/40{background-color:color-mix(in oklab, var(--color-blue-950) 40%, transparent)}}.dark\:bg-emerald-900{background-color:var(--color-emerald-900)}.dark\:bg-emerald-900\/30{background-color:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/30{background-color:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.dark\:bg-emerald-950{background-color:var(--color-emerald-950)}.dark\:bg-emerald-950\/20{background-color:#002c2233}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/20{background-color:color-mix(in oklab, var(--color-emerald-950) 20%, transparent)}}.dark\:bg-emerald-950\/30{background-color:#002c224d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/30{background-color:color-mix(in oklab, var(--color-emerald-950) 30%, transparent)}}.dark\:bg-emerald-950\/40{background-color:#002c2266}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-950\/40{background-color:color-mix(in oklab, var(--color-emerald-950) 40%, transparent)}}.dark\:bg-gray-100{background-color:var(--color-gray-100)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-800\/30{background-color:#1e29394d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/30{background-color:color-mix(in oklab, var(--color-gray-800) 30%, transparent)}}.dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/50{background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:bg-gray-900\/40{background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/40{background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/50{background-color:color-mix(in oklab, var(--color-gray-900) 50%, transparent)}}.dark\:bg-gray-900\/95{background-color:#101828f2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/95{background-color:color-mix(in oklab, var(--color-gray-900) 95%, transparent)}}.dark\:bg-gray-950{background-color:var(--color-gray-950)}.dark\:bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-900\/30{background-color:color-mix(in oklab, var(--color-indigo-900) 30%, transparent)}}.dark\:bg-indigo-950\/20{background-color:#1e1a4d33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/20{background-color:color-mix(in oklab, var(--color-indigo-950) 20%, transparent)}}.dark\:bg-indigo-950\/30{background-color:#1e1a4d4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/30{background-color:color-mix(in oklab, var(--color-indigo-950) 30%, transparent)}}.dark\:bg-indigo-950\/40{background-color:#1e1a4d66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/40{background-color:color-mix(in oklab, var(--color-indigo-950) 40%, transparent)}}.dark\:bg-indigo-950\/50{background-color:#1e1a4d80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-indigo-950\/50{background-color:color-mix(in oklab, var(--color-indigo-950) 50%, transparent)}}.dark\:bg-neutral-400{background-color:var(--color-neutral-400)}.dark\:bg-neutral-500{background-color:var(--color-neutral-500)}.dark\:bg-neutral-600{background-color:var(--color-neutral-600)}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-neutral-800{background-color:var(--color-neutral-800)}.dark\:bg-neutral-800\/20{background-color:#26262633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-800\/20{background-color:color-mix(in oklab, var(--color-neutral-800) 20%, transparent)}}.dark\:bg-neutral-800\/50{background-color:#26262680}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-800\/50{background-color:color-mix(in oklab, var(--color-neutral-800) 50%, transparent)}}.dark\:bg-neutral-800\/60{background-color:#26262699}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-800\/60{background-color:color-mix(in oklab, var(--color-neutral-800) 60%, transparent)}}.dark\:bg-neutral-900{background-color:var(--color-neutral-900)}.dark\:bg-neutral-900\/30{background-color:#1717174d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/30{background-color:color-mix(in oklab, var(--color-neutral-900) 30%, transparent)}}.dark\:bg-neutral-900\/50{background-color:#17171780}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/50{background-color:color-mix(in oklab, var(--color-neutral-900) 50%, transparent)}}.dark\:bg-neutral-900\/90{background-color:#171717e6}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/90{background-color:color-mix(in oklab, var(--color-neutral-900) 90%, transparent)}}.dark\:bg-neutral-900\/95{background-color:#171717f2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/95{background-color:color-mix(in oklab, var(--color-neutral-900) 95%, transparent)}}.dark\:bg-neutral-950{background-color:var(--color-neutral-950)}.dark\:bg-neutral-950\/5{background-color:#0a0a0a0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/5{background-color:color-mix(in oklab, var(--color-neutral-950) 5%, transparent)}}.dark\:bg-neutral-950\/20{background-color:#0a0a0a33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/20{background-color:color-mix(in oklab, var(--color-neutral-950) 20%, transparent)}}.dark\:bg-neutral-950\/40{background-color:#0a0a0a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-950\/40{background-color:color-mix(in oklab, var(--color-neutral-950) 40%, transparent)}}.dark\:bg-orange-950\/20{background-color:#44130633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-950\/20{background-color:color-mix(in oklab, var(--color-orange-950) 20%, transparent)}}.dark\:bg-pink-900\/30{background-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-900\/30{background-color:color-mix(in oklab, var(--color-pink-900) 30%, transparent)}}.dark\:bg-pink-950\/30{background-color:#5104244d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/30{background-color:color-mix(in oklab, var(--color-pink-950) 30%, transparent)}}.dark\:bg-pink-950\/40{background-color:#51042466}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-950\/40{background-color:color-mix(in oklab, var(--color-pink-950) 40%, transparent)}}.dark\:bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-500\/20{background-color:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/30{background-color:color-mix(in oklab, var(--color-purple-900) 30%, transparent)}}.dark\:bg-purple-950\/30{background-color:#3c03664d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/30{background-color:color-mix(in oklab, var(--color-purple-950) 30%, transparent)}}.dark\:bg-purple-950\/40{background-color:#3c036666}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/40{background-color:color-mix(in oklab, var(--color-purple-950) 40%, transparent)}}.dark\:bg-purple-950\/60{background-color:#3c036699}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-950\/60{background-color:color-mix(in oklab, var(--color-purple-950) 60%, transparent)}}.dark\:bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-900\/30{background-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.dark\:bg-red-950\/20{background-color:#46080933}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/20{background-color:color-mix(in oklab, var(--color-red-950) 20%, transparent)}}.dark\:bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/30{background-color:color-mix(in oklab, var(--color-red-950) 30%, transparent)}}.dark\:bg-red-950\/40{background-color:#46080966}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-950\/40{background-color:color-mix(in oklab, var(--color-red-950) 40%, transparent)}}.dark\:bg-rose-500{background-color:var(--color-rose-500)}.dark\:bg-rose-950\/30{background-color:#4d02184d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-950\/30{background-color:color-mix(in oklab, var(--color-rose-950) 30%, transparent)}}.dark\:bg-sky-950\/30{background-color:#052f4a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-950\/30{background-color:color-mix(in oklab, var(--color-sky-950) 30%, transparent)}}.dark\:bg-teal-950\/60{background-color:#022f2e99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-teal-950\/60{background-color:color-mix(in oklab, var(--color-teal-950) 60%, transparent)}}.dark\:bg-transparent{background-color:#0000}.dark\:bg-white{background-color:var(--color-white)}.dark\:bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/5{background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[0\.02\]{background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}.dark\:stroke-neutral-800{stroke:var(--color-neutral-800)}.dark\:text-\[\#1C1C1A\]{color:#1c1c1a}.dark\:text-\[\#4B0600\]{color:#4b0600}.dark\:text-\[\#391800\]{color:#391800}.dark\:text-\[\#733000\]{color:#733000}.dark\:text-\[\#A1A09A\]{color:#a1a09a}.dark\:text-\[\#EDEDEC\]{color:#ededec}.dark\:text-\[\#F61500\]{color:#f61500}.dark\:text-\[\#FF4433\]{color:#f43}.dark\:text-amber-200{color:var(--color-amber-200)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-amber-500{color:var(--color-amber-500)}.dark\:text-black{color:var(--color-black)}.dark\:text-blue-200{color:var(--color-blue-200)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-emerald-200{color:var(--color-emerald-200)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-emerald-500{color:var(--color-emerald-500)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-gray-500{color:var(--color-gray-500)}.dark\:text-gray-800{color:var(--color-gray-800)}.dark\:text-gray-950{color:var(--color-gray-950)}.dark\:text-indigo-300{color:var(--color-indigo-300)}.dark\:text-indigo-400{color:var(--color-indigo-400)}.dark\:text-neutral-100{color:var(--color-neutral-100)}.dark\:text-neutral-200{color:var(--color-neutral-200)}.dark\:text-neutral-300{color:var(--color-neutral-300)}.dark\:text-neutral-400{color:var(--color-neutral-400)}.dark\:text-neutral-500{color:var(--color-neutral-500)}.dark\:text-neutral-600{color:var(--color-neutral-600)}.dark\:text-neutral-700{color:var(--color-neutral-700)}.dark\:text-neutral-900{color:var(--color-neutral-900)}.dark\:text-neutral-950{color:var(--color-neutral-950)}.dark\:text-orange-400{color:var(--color-orange-400)}.dark\:text-pink-400{color:var(--color-pink-400)}.dark\:text-purple-300{color:var(--color-purple-300)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-red-500{color:var(--color-red-500)}.dark\:text-rose-400{color:var(--color-rose-400)}.dark\:text-teal-300{color:var(--color-teal-300)}.dark\:text-white{color:var(--color-white)}.dark\:placeholder-neutral-500::placeholder{color:var(--color-neutral-500)}.dark\:placeholder-neutral-700::placeholder{color:var(--color-neutral-700)}.dark\:opacity-30{opacity:.3}.dark\:opacity-50{opacity:.5}.dark\:opacity-70{opacity:.7}.dark\:mix-blend-hard-light{mix-blend-mode:hard-light}.dark\:mix-blend-normal{mix-blend-mode:normal}.dark\:shadow-\[inset_0px_0px_0px_1px_\#fffaed2d\]{--tw-shadow:inset 0px 0px 0px 1px var(--tw-shadow-color,#fffaed2d);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-white{--tw-ring-color:var(--color-white)}.dark\:ring-white\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:ring-white\/10{--tw-ring-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:ring-offset-neutral-900{--tw-ring-offset-color:var(--color-neutral-900)}.dark\:\[--stroke-color\:\#FF750F\]{--stroke-color:#ff750f}.dark\:\[stop-opacity\:0\.1\]{stop-opacity:.1}.dark\:\[stop-opacity\:0\.17\]{stop-opacity:.17}@media (hover:hover){.dark\:group-hover\:bg-neutral-400:is(:where(.group):hover *){background-color:var(--color-neutral-400)}.dark\:group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.dark\:before\:border-\[\#3E3E3A\]:before{content:var(--tw-content);border-color:#3e3e3a}.dark\:focus-within\:ring-white:focus-within{--tw-ring-color:var(--color-white)}@media (hover:hover){.dark\:hover\:border-\[\#3E3E3A\]:hover{border-color:#3e3e3a}.dark\:hover\:border-\[\#62605b\]:hover{border-color:#62605b}.dark\:hover\:border-amber-900\/50:hover{border-color:#7b330680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-amber-900\/50:hover{border-color:color-mix(in oklab, var(--color-amber-900) 50%, transparent)}}.dark\:hover\:border-emerald-900\/50:hover{border-color:#004e3b80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-emerald-900\/50:hover{border-color:color-mix(in oklab, var(--color-emerald-900) 50%, transparent)}}.dark\:hover\:border-indigo-900\/50:hover{border-color:#312c8580}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-indigo-900\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-900) 50%, transparent)}}.dark\:hover\:border-neutral-700:hover{border-color:var(--color-neutral-700)}.dark\:hover\:border-pink-900\/50:hover{border-color:#86104380}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-pink-900\/50:hover{border-color:color-mix(in oklab, var(--color-pink-900) 50%, transparent)}}.dark\:hover\:border-purple-900\/50:hover{border-color:#59168b80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-purple-900\/50:hover{border-color:color-mix(in oklab, var(--color-purple-900) 50%, transparent)}}.dark\:hover\:border-rose-900\/50:hover{border-color:#8b083680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-rose-900\/50:hover{border-color:color-mix(in oklab, var(--color-rose-900) 50%, transparent)}}.dark\:hover\:border-sky-900\/50:hover{border-color:#024a7080}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-sky-900\/50:hover{border-color:color-mix(in oklab, var(--color-sky-900) 50%, transparent)}}.dark\:hover\:border-white:hover{border-color:var(--color-white)}.dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.dark\:hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.dark\:hover\:bg-neutral-800:hover{background-color:var(--color-neutral-800)}.dark\:hover\:bg-neutral-900:hover{background-color:var(--color-neutral-900)}.dark\:hover\:bg-neutral-950:hover{background-color:var(--color-neutral-950)}.dark\:hover\:bg-rose-400:hover{background-color:var(--color-rose-400)}.dark\:hover\:bg-white:hover{background-color:var(--color-white)}.dark\:hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:bg-white\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.dark\:hover\:text-gray-200:hover{color:var(--color-gray-200)}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-indigo-100:hover{color:var(--color-indigo-100)}.dark\:hover\:text-indigo-400:hover{color:var(--color-indigo-400)}.dark\:hover\:text-neutral-300:hover{color:var(--color-neutral-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}.dark\:hover\:ring-neutral-800\/50:hover{--tw-ring-color:#26262680}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:ring-neutral-800\/50:hover{--tw-ring-color:color-mix(in oklab, var(--color-neutral-800) 50%, transparent)}}}.dark\:focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.dark\:focus\:ring-neutral-400:focus{--tw-ring-color:var(--color-neutral-400)}.dark\:active\:bg-neutral-700:active{background-color:var(--color-neutral-700)}}@starting-style{.starting\:opacity-0{opacity:0}}@media (prefers-reduced-motion:no-preference){@starting-style{.motion-safe\:starting\:-translate-x-\[26px\]{--tw-translate-x:calc(26px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[51px\]{--tw-translate-x:calc(51px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[78px\]{--tw-translate-x:calc(78px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:-translate-x-\[102px\]{--tw-translate-x:calc(102px * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}}@starting-style{.motion-safe\:starting\:translate-y-6{--tw-translate-y:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}}}.\[\&_\*\]\:stroke-1 *{stroke-width:1px}.\[\&_\*\]\:stroke-2 *{stroke-width:2px}.\[\&_\*\]\:tracking-\[-0\.035em\] *{--tw-tracking:-.035em;letter-spacing:-.035em}.\[\&_\*\]\:delay-75 *{transition-delay:75ms}.\[\&_\*\]\:\[vector-effect\:non-scaling-stroke\] *{vector-effect:non-scaling-stroke}.\[\&_\.react-colorful\]\:h-\[180px\] .react-colorful{height:180px}.\[\&_\.react-colorful\]\:w-full .react-colorful{width:100%}.\[\&_a\]\:cursor-help a{cursor:help}.\[\&_a\]\:font-medium a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_a\]\:font-semibold a{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_a\]\:text-neutral-600 a{color:var(--color-neutral-600)}.\[\&_a\]\:text-neutral-800 a{color:var(--color-neutral-800)}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:decoration-dotted a{text-decoration-style:dotted}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}@media (hover:hover){.hover\:\[\&_a\]\:text-neutral-800:hover a{color:var(--color-neutral-800)}}.\[\&_circle\]\:hidden circle{display:none}.\[\&_code_\.line\]\:before\:hidden code .line:before{content:var(--tw-content);display:none}.\[\&_img\]\:grayscale img{--tw-grayscale:grayscale(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,)}.\[\&_li\]\:marker\:text-neutral-400 li ::marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li::marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li ::-webkit-details-marker{color:var(--color-neutral-400)}.\[\&_li\]\:marker\:text-neutral-400 li::-webkit-details-marker{color:var(--color-neutral-400)}.\[\&_line\]\:origin-bottom line{transform-origin:bottom}.\[\&_line\]\:\[transform-box\:stroke-box\] line{transform-box:stroke-box}.\[\&_ol\]\:list-decimal ol{list-style-type:decimal}.\[\&_ol\]\:pl-4 ol{padding-left:calc(var(--spacing) * 4)}.\[\&_strong\]\:font-medium strong{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_strong\]\:font-semibold strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\[\&_svg\]\:\!h-4 svg{height:calc(var(--spacing) * 4)!important}.\[\&_svg\]\:\!w-4 svg{width:calc(var(--spacing) * 4)!important}.\[\&_tbody\]\:bg-transparent tbody{background-color:#0000}.\[\&_tbody_tr\:last-child_td\]\:border-b-0 tbody tr:last-child td{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&_thead\]\:hidden thead{display:none}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\>td\]\:border-b-transparent tr:last-child>td{border-bottom-color:#0000}.\[\&_tr\>\*\:first-child\]\:border-l-transparent tr>:first-child{border-left-color:#0000}.\[\&_tr\>\*\:last-child\]\:border-r-transparent tr>:last-child{border-right-color:#0000}.\[\&_ul\]\:list-disc ul{list-style-type:disc}.\[\&_ul\]\:pl-4 ul{padding-left:calc(var(--spacing) * 4)}.\[\&_ul\>li\]\:pl-0 ul>li{padding-left:calc(var(--spacing) * 0)}.\[_a\]\:border-current:is(a){border-color:currentColor}.\[_a\]\:\!text-current:is(a),.\[_code\]\:\!text-current:is(code),.\[_kbd\]\:\!text-current:is(kbd),.\[_strong\]\:\!text-current:is(strong){color:currentColor!important}.\[\&\>\*\]\:mt-2>*{margin-top:calc(var(--spacing) * 2)}.\[\&\>\*\]\:size-3>*{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&\>\*\]\:h-3>*{height:calc(var(--spacing) * 3)}.\[\&\>\*\]\:w-3>*{width:calc(var(--spacing) * 3)}.\[\&\>\*\]\:min-w-0>*{min-width:calc(var(--spacing) * 0)}.\[\&\>\*\]\:truncate>*{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>\*\]\:border-t>*{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\>\*\]\:border-neutral-200>*{border-color:var(--color-neutral-200)}@media (min-width:40rem){.sm\:\[\&\>\*\]\:size-4>*{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.\[\&\>\*\:nth-child\(n\+3\)\]\:mt-2>:nth-child(n+3){margin-top:calc(var(--spacing) * 2)}.\[\&\>div\]\:w-full>div{width:100%}.\[\&\>div\]\:flex-initial>div{flex:0 auto}.\[\&\>div\]\:justify-end>div{justify-content:flex-end}.\[\&\>div\]\:opacity-50>div{opacity:.5}@media (hover:hover){.group-hover\/row\:\[\&\>div\]\:opacity-100:is(:where(.group\/row):hover *)>div{opacity:1}}@media (min-width:48rem){.md\:\[\&\>div\]\:max-h-\[calc\(100dvh-200px\)\]>div{max-height:calc(100dvh - 200px)}.md\:\[\&\>div\]\:min-h-\[min\(566px\,_calc\(100dvh-200px\)\)\]>div{min-height:min(566px,100dvh - 200px)}}.\[\&\>div\:first-of-type\]\:max-w-\[640px\]>div:first-of-type{max-width:640px}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-5>svg{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.\[\&\>svg\]\:text-neutral-400>svg{color:var(--color-neutral-400)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}@media (min-resolution:2x){@container (min-width:800px){.\[\@media\(min-resolution\:2dppx\)\]\:\@\[800px\]\:rotate-\[2\.4deg\]{rotate:2.4deg}}}.fsu-number-stepper{justify-self:start;width:fit-content;max-width:max-content;display:inline-flex}.fi-fo-field:has(>.fi-fo-field-content-col .fsu-number-stepper)>.fi-fo-field-content-col{justify-items:start}.fsu-segment-control{justify-self:start;width:fit-content;max-width:max-content;display:block}.fsu-segment-control.w-full{width:100%;max-width:none}.fsu-segment-track{isolation:isolate;background-color:#f3f4f6;border-radius:9999px;align-items:center;gap:0;padding:3px;display:inline-flex;position:relative}.dark .fsu-segment-track{background-color:#ffffff14}.fsu-segment-track--ghost{background-color:#0000;box-shadow:inset 0 0 0 1px #e5e7eb}.dark .fsu-segment-track--ghost{box-shadow:inset 0 0 0 1px #ffffff1a}.fsu-segment-track--sm{min-height:28px;padding:2px}.fsu-segment-track--md{min-height:32px;padding:3px}.fsu-segment-track--lg{min-height:40px;padding:4px}.fsu-segment-indicator{z-index:0;pointer-events:none;will-change:transform, width, height;background-color:#fff;border-radius:9999px;transition:transform .32s cubic-bezier(.34,1.2,.64,1),width .32s cubic-bezier(.34,1.2,.64,1),height .32s cubic-bezier(.34,1.2,.64,1),opacity .2s;position:absolute;top:0;left:0;box-shadow:0 1px 2px #0000000f,0 2px 6px #00000014}.dark .fsu-segment-indicator{background-color:#18181b;box-shadow:0 1px 2px #00000059,inset 0 0 0 1px #ffffff14}.fsu-segment-indicator--ghost{box-shadow:none;background-color:#4f46e5}.dark .fsu-segment-indicator--ghost{background-color:#6366f1}.fsu-segment-item{z-index:1;cursor:pointer;white-space:nowrap;color:#6b7280;background:0 0;border:0;border-radius:9999px;justify-content:center;align-items:center;gap:.375rem;font-weight:500;line-height:1;transition:color .2s;display:inline-flex;position:relative}.fsu-segment-item:hover:not(:disabled):not([data-segment-selected=true]){color:#374151}.dark .fsu-segment-item{color:#9ca3af}.dark .fsu-segment-item:hover:not(:disabled):not([data-segment-selected=true]){color:#e5e7eb}.fsu-segment-item[data-segment-selected=true]{color:#111827;font-weight:600}.dark .fsu-segment-item[data-segment-selected=true],.fsu-segment-track--ghost .fsu-segment-item[data-segment-selected=true]{color:#fff}.fsu-segment-item:disabled{cursor:not-allowed;opacity:.45}.fsu-segment-item--sm{gap:.25rem;height:24px;padding:0 10px;font-size:11px}.fsu-segment-item--md{height:28px;padding:0 14px;font-size:12px}.fsu-segment-item--lg{gap:.5rem;height:32px;padding:0 18px;font-size:14px}.fsu-segment-item svg{flex-shrink:0;display:block}.fsu-segment-item--sm svg{width:14px;height:14px}.fsu-segment-item--md svg{width:16px;height:16px}.fsu-segment-item--lg svg{width:18px;height:18px}.fsu-segment-separator{z-index:1;background-color:#d1d5dbd9;flex-shrink:0;width:1px;height:14px;margin:0 1px}.dark .fsu-segment-separator{background-color:#ffffff1f}.fsu-segment-control.w-full .fsu-segment-track{width:100%;display:flex}.fsu-segment-control.w-full .fsu-segment-item{flex:1 1 0}.fi-fo-field:has(>.fi-fo-field-content-col .fsu-segment-control:not(.w-full))>.fi-fo-field-content-col{justify-items:start}.qr-segment-icon-only .fsu-segment-track--lg{min-height:44px;padding:4px}.qr-segment-icon-only .fsu-segment-item--lg{min-width:36px;height:36px;padding:0 10px}.qr-segment-icon-only .fsu-segment-item--lg svg{width:28px;height:28px}.qr-segment-icon-only--style .fsu-segment-track--lg{min-height:52px;padding:5px}.qr-segment-icon-only--style .fsu-segment-item--lg{min-width:42px;height:42px;padding:0 12px}.qr-segment-icon-only--style .fsu-segment-item--lg svg{width:34px;height:34px}.validity-tab-card{background:#fff;border:1px solid #e5e7eb;border-radius:1rem;padding:1.25rem;overflow:hidden;box-shadow:0 1px 2px #0000000a}.dark .validity-tab-card{box-shadow:none;background:#ffffff08;border-color:#ffffff1a}.validity-tab-card-header{align-items:flex-start;gap:.875rem;display:flex}.validity-tab-card-header--compact{margin-bottom:0}.fi-fo-field:has(.validity-tab-card-header--compact){gap:0!important;margin-bottom:0!important}.validity-tab-card .fi-sc-has-gap{gap:.625rem!important}.validity-tab-card-icon .fsu-tab-card-icon-svg,.validity-tab-card-icon .fi-icon{width:1.25rem;height:1.25rem}.validity-tab-card-toolbar-main{min-width:0}@media (min-width:768px){.validity-tab-card-toolbar-grid .fi-grid-col:has(.validity-tab-card-toolbar-action){justify-content:flex-end;align-items:flex-start;display:flex}}.validity-tab-card-toolbar-action.fi-fo-field{width:auto;gap:0!important}.validity-tab-card-toolbar-action.fi-fo-field.fi-fo-field-has-inline-label{grid-template-columns:auto}.validity-tab-card-toolbar-action .fi-fo-field-label-col{display:none!important}.validity-tab-card-toolbar-action .fi-fo-field-content-col{justify-items:end;width:auto}.validity-tab-card-toolbar-action .fi-fo-toggle{flex-shrink:0}.validity-tab-card-icon{border-radius:.75rem;flex-shrink:0;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}.validity-tab-card-icon--schedule{color:#2563eb;background:#dbeafe}.dark .validity-tab-card-icon--schedule{color:#93c5fd;background:#2563eb26}.validity-tab-card-icon--limit{color:#d97706;background:#fef3c7}.dark .validity-tab-card-icon--limit{color:#fcd34d;background:#d9770626}.validity-tab-card-icon--tracking{color:#2563eb;background:#dbeafe}.dark .validity-tab-card-icon--tracking{color:#93c5fd;background:#2563eb26}.validity-tab-card-icon--utm{color:#7c3aed;background:#ede9fe}.dark .validity-tab-card-icon--utm{color:#c4b5fd;background:#7c3aed26}.validity-tab-card-icon--ga{color:#16a34a;background:#dcfce7}.dark .validity-tab-card-icon--ga{color:#86efac;background:#16a34a26}.validity-tab-card-title{color:#111827;margin:0;font-size:.9375rem;font-weight:600;line-height:1.35}.dark .validity-tab-card-title{color:#fff}.validity-tab-card-subtitle{color:#6b7280;margin:.125rem 0 0;font-size:.8125rem;line-height:1.45}.dark .validity-tab-card-subtitle{color:#9ca3af}.validity-tab-empty{text-align:center;background:#f9fafb;border:1px dashed #d1d5db;border-radius:.875rem;flex-direction:column;justify-content:center;align-items:center;margin-top:.625rem;padding:1.75rem 1.25rem;display:flex}.dark .validity-tab-empty{background:#ffffff05;border-color:#ffffff1f}.validity-tab-empty-icon{color:#6b7280;background:#f3f4f6;border-radius:9999px;justify-content:center;align-items:center;width:2.75rem;height:2.75rem;margin-bottom:.75rem;display:flex}.dark .validity-tab-empty-icon{color:#9ca3af;background:#ffffff0f}.validity-tab-empty-title{color:#111827;margin:0;font-size:.9375rem;font-weight:600}.dark .validity-tab-empty-title{color:#fff}.validity-tab-empty-desc{color:#6b7280;max-width:28rem;margin:.375rem 0 0;font-size:.8125rem;line-height:1.5}.dark .validity-tab-empty-desc{color:#9ca3af}.validity-schedule-panel{background:#f9fafb;border:1px solid #e5e7eb;border-radius:.875rem;padding:1rem;margin-top:0!important}.dark .validity-schedule-panel{background:#ffffff05;border-color:#ffffff14}.validity-timeline-hint{align-items:center;gap:.5rem;margin-bottom:.25rem;padding-bottom:.25rem;display:flex;position:relative}.validity-timeline-dot{border-radius:9999px;flex-shrink:0;width:.625rem;height:.625rem}.validity-timeline-dot--start{background:#22c55e;box-shadow:0 0 0 3px #22c55e2e}.validity-timeline-dot--end{background:#ef4444;box-shadow:0 0 0 3px #ef44442e}.validity-timeline-line{opacity:.45;background:linear-gradient(90deg,#22c55e,#ef4444);border-radius:9999px;flex:auto;height:2px}.validity-timeline-label{letter-spacing:.08em;text-transform:uppercase;color:#6b7280;margin-left:.25rem;font-size:.6875rem;font-weight:700}.dark .validity-timeline-label{color:#9ca3af}.validity-limit-block{background:#f9fafb;border:1px solid #f3f4f6;border-radius:.875rem;height:100%;padding:1rem}.dark .validity-limit-block{background:#ffffff05;border-color:#ffffff0f}.validity-limit-block--counter{flex-direction:column;gap:.75rem;display:flex}.validity-max-visits-card{min-height:10.5rem;overflow:hidden;position:relative!important}.validity-max-visits-card .fi-grid-col:has(.validity-max-visits-lock){pointer-events:auto;z-index:30!important;width:100%!important;height:100%!important;margin:0!important;padding:0!important;position:absolute!important;inset:0!important}.validity-max-visits-card:has(.validity-max-visits-lock) .fi-grid-col:not(:has(.validity-max-visits-lock)){pointer-events:none;-webkit-user-select:none;user-select:none}.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock){pointer-events:auto;z-index:30!important;width:100%!important;height:100%!important;margin:0!important;padding:0!important;position:absolute!important;inset:0!important}.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock) .fi-fo-field-content-col,.validity-max-visits-card .fi-fo-field:has(.validity-max-visits-lock) .fi-fo-field-content{width:100%;height:100%;margin:0!important;padding:0!important}.validity-max-visits-lock{border-radius:inherit;-webkit-backdrop-filter:blur(20px)saturate(180%);cursor:not-allowed;background:#ffffff73;justify-content:center;align-items:center;display:flex;position:absolute;inset:0;box-shadow:inset 0 1px #ffffff8c}.dark .validity-max-visits-lock{-webkit-backdrop-filter:blur(20px)saturate(160%);background:#0f172a6b;box-shadow:inset 0 1px #ffffff14}.validity-max-visits-lock-icon{color:#4b5563;-webkit-backdrop-filter:blur(12px)saturate(180%);background:#ffffffb8;border-radius:9999px;justify-content:center;align-items:center;width:3.5rem;height:3.5rem;display:flex;box-shadow:0 4px 24px #0000001f,0 0 0 1px #ffffffa6}.dark .validity-max-visits-lock-icon{color:#d4d4d8;background:#27272ab8;box-shadow:0 4px 24px #00000059,inset 0 0 0 1px #ffffff1f}.validity-stepper-wrap{margin-top:auto}.fi-fo-field:has(.validity-stepper-wrap)>.fi-fo-field-content-col{justify-items:start}.tracking-card-toolbar-action.fi-fo-field{align-self:start}@media (min-width:768px){.validity-tab-card-toolbar-grid .fi-grid-col:has(.tracking-card-toolbar-action){justify-content:flex-end;align-items:flex-start;padding-top:.125rem;padding-right:.125rem;display:flex}}.tracking-fields-panel{flex-direction:column;gap:.625rem;display:flex;margin-top:0!important}.tracking-fields-category{letter-spacing:.08em;text-transform:uppercase;color:#6b7280;margin:.5rem 0 0;font-size:.6875rem;font-weight:700}.dark .tracking-fields-category{color:#9ca3af}.tracking-field-card{min-height:4.75rem;padding:1rem 3.75rem 1rem 1rem;position:relative}.tracking-field-card-copy{min-width:0}.tracking-field-card-title{color:#111827;margin:0;font-size:.875rem;font-weight:600;line-height:1.35}.dark .tracking-field-card-title{color:#fff}.tracking-field-card-desc{color:#6b7280;margin:.25rem 0 0;font-size:.8125rem;line-height:1.45}.dark .tracking-field-card-desc{color:#9ca3af}.tracking-field-card-toggle.fi-fo-field{z-index:2;width:auto;position:absolute;top:1rem;right:1rem;gap:0!important;margin:0!important;padding:0!important}.tracking-field-card-toggle .fi-fo-field-label-col{display:none!important}.tracking-field-card-toggle .fi-fo-field-content-col{width:auto}.tracking-utm-card .validity-tab-card-header--compact{margin-bottom:0}.tracking-utm-fields{border-top:1px solid #f3f4f6;padding-top:.625rem;margin-top:0!important}.dark .tracking-utm-fields{border-top-color:#ffffff14}.tracking-ga-field{border-top:1px solid #f3f4f6;padding-top:.625rem;margin-top:0!important}.dark .tracking-ga-field{border-top-color:#ffffff14}.validity-tab-card-icon--link{color:#2563eb;background:#dbeafe}.dark .validity-tab-card-icon--link{color:#93c5fd;background:#2563eb26}.validity-tab-card-icon--key{color:#d97706;background:#fef3c7}.dark .validity-tab-card-icon--key{color:#fcd34d;background:#d9770626}.validity-tab-card-icon--behavior{color:#4b5563;background:#f3f4f6}.dark .validity-tab-card-icon--behavior{color:#d1d5db;background:#ffffff14}.validity-tab-card-icon--tags{color:#7c3aed;background:#ede9fe}.dark .validity-tab-card-icon--tags{color:#c4b5fd;background:#7c3aed26}.validity-tab-card-icon--notes{color:#ca8a04;background:#fef9c3}.dark .validity-tab-card-icon--notes{color:#fde047;background:#ca8a0426}.validity-tab-card-icon--targeting{color:#ea580c;background:#ffedd5}.dark .validity-tab-card-icon--targeting{color:#fdba74;background:#ea580c26}.validity-tab-card-icon--app-linking{color:#059669;background:#d1fae5}.dark .validity-tab-card-icon--app-linking{color:#6ee7b7;background:#05966926}.validity-tab-card-icon--password{color:#d97706;background:#fef3c7}.dark .validity-tab-card-icon--password{color:#fcd34d;background:#d9770626}.validity-tab-card-icon--password-active{color:#059669;background:#d1fae5}.dark .validity-tab-card-icon--password-active{color:#6ee7b7;background:#10b98126}.validity-tab-card-icon--warning{color:#dc2626;background:#fee2e2}.dark .validity-tab-card-icon--warning{color:#fca5a5;background:#dc262626}.password-tab-card,.password-warning-card,.password-warning-card{overflow:visible}.password-warning-card .validity-tab-card-toolbar-grid{margin-bottom:0}.password-tab-setup-action{margin-top:.125rem}.password-tab-setup-action .fi-btn{color:#374151;width:100%;box-shadow:none;background:#fff;border:1px dashed #d1d5db;border-radius:.625rem;justify-content:center;gap:.375rem;padding-block:.625rem}.dark .password-tab-setup-action .fi-btn{color:#d1d5db;background:#ffffff05;border-color:#ffffff24}.password-tab-setup-action .fi-btn:hover{color:#c2410c;background:#fff7ed;border-color:#fb923c}.dark .password-tab-setup-action .fi-btn:hover{color:#fdba74;background:#ea580c1f;border-color:#fb923c73}.password-tab-form-panel{flex-direction:column;gap:.75rem;display:flex}.password-tab-section-title{letter-spacing:.04em;text-transform:uppercase;color:#6b7280;margin:0;font-size:.6875rem;font-weight:600}.dark .password-tab-section-title{color:#9ca3af}.password-tab-status{background:#fff;border:1px solid #e5e7eb;border-radius:.875rem;flex-direction:column;gap:.75rem;padding:.875rem 1rem;display:flex}.dark .password-tab-status{background:#ffffff08;border-color:#ffffff1a}.password-tab-status--active{background:#ecfdf5;border-color:#a7f3d0}.dark .password-tab-status--active{background:#10b98114;border-color:#10b98140}.password-tab-status--warning{background:#fff7ed;border-color:#fed7aa}.dark .password-tab-status--warning{background:#ea580c14;border-color:#ea580c40}.password-tab-status-main{align-items:flex-start;gap:.75rem;display:flex}.password-tab-status-icon{border-radius:.75rem;flex-shrink:0;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}.password-tab-status-icon--active{color:#059669;background:#d1fae5}.dark .password-tab-status-icon--active{color:#6ee7b7;background:#10b98126}.password-tab-status-icon--warning{color:#dc2626;background:#fee2e2}.dark .password-tab-status-icon--warning{color:#fca5a5;background:#dc262626}.password-tab-status-title{color:#111827;margin:0;font-size:.875rem;font-weight:600;line-height:1.4}.dark .password-tab-status-title{color:#fff}.password-tab-status-desc{color:#6b7280;margin:.25rem 0 0;font-size:.8125rem;line-height:1.5}.dark .password-tab-status-desc{color:#9ca3af}.password-tab-active-actions,.password-tab-form-actions{justify-content:flex-end}.password-tab-form-panel .fi-sc-has-gap{gap:.75rem!important}.marketing-pixels-card,.marketing-webhook-card{overflow:visible}.validity-tab-card-icon--pixels{color:#7c3aed;background:#ede9fe}.dark .validity-tab-card-icon--pixels{color:#c4b5fd;background:#7c3aed26}.validity-tab-card-icon--webhook{color:#2563eb;background:#dbeafe}.dark .validity-tab-card-icon--webhook{color:#93c5fd;background:#2563eb26}.marketing-pixels-field,.marketing-webhook-field{margin-top:.125rem}.marketing-webhook-panel{flex-direction:column;gap:.75rem;display:flex}.marketing-tab-callout{background:#eff6ff;border:1px solid #bfdbfe;border-radius:.875rem;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;display:flex}.dark .marketing-tab-callout{background:#2563eb14;border-color:#2563eb40}.marketing-tab-callout-icon{color:#2563eb;background:#dbeafe;border-radius:.625rem;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;display:flex}.dark .marketing-tab-callout-icon{color:#93c5fd;background:#2563eb26}.marketing-tab-callout-text{color:#374151;margin:0;font-size:.8125rem;line-height:1.55}.dark .marketing-tab-callout-text{color:#d1d5db}.marketing-webhook-payload,.marketing-webhook-payload-action{margin-top:.125rem}.marketing-webhook-payload-wrap{flex-direction:column;gap:.5rem;display:flex}.marketing-webhook-payload-label{color:#374151;margin:0;font-size:.8125rem;font-weight:600}.dark .marketing-webhook-payload-label{color:#d1d5db}.marketing-webhook-payload-code{background:#18181b;border:1px solid #27272a;border-radius:.875rem;padding:1.25rem;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000d}.marketing-webhook-payload-copy{color:#a1a1aa;cursor:pointer;background:#ffffff14;border:none;border-radius:.5rem;justify-content:center;align-items:center;width:2rem;height:2rem;transition:background-color .2s,color .2s;display:flex;position:absolute;top:1rem;right:1rem}.marketing-webhook-payload-copy:hover{color:#fff;background:#ffffff26}.marketing-webhook-payload-pre{white-space:pre-wrap;word-break:break-all;color:#d4d4d8;margin:0;padding-right:2.5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:1.6;overflow-x:auto}.marketing-webhook-payload-code-inner{font:inherit;color:inherit}.seo-settings-card,.seo-og-card{overflow:visible}.validity-tab-card-icon--seo{color:#2563eb;background:#dbeafe}.dark .validity-tab-card-icon--seo{color:#93c5fd;background:#2563eb26}.validity-tab-card-icon--og{color:#7c3aed;background:#ede9fe}.dark .validity-tab-card-icon--og{color:#c4b5fd;background:#7c3aed26}.seo-settings-grid,.seo-og-panel{flex-direction:column;gap:.75rem;display:flex}.seo-og-field{margin-top:.125rem}.link-segment-wrap{gap:.25rem!important;margin:0!important}.fi-fo-field:has(>.fi-fo-field-content-col .link-segment-wrap)>.fi-fo-field-content-col,.fi-fo-field:has(.link-segment-wrap)>.fi-fo-field-content-col{justify-items:start}.link-tab-panel{border-top:1px solid #f3f4f6;flex-direction:column;gap:.75rem;padding-top:.625rem;display:flex;margin-top:0!important}.dark .link-tab-panel{border-top-color:#ffffff14}.link-tab-panel--flush{border-top:0;padding-top:0;margin-top:0!important}.link-tab-panel-field{border-top:1px solid #f3f4f6;padding-top:.625rem;margin-top:0!important}.dark .link-tab-panel-field{border-top-color:#ffffff14}.validity-tab-card:has(.targeting-rules-repeater){overflow:visible}.targeting-rules-repeater.fi-fo-repeater{gap:.75rem;width:100%;margin-top:0}.targeting-rules-repeater.fi-fo-repeater>.fi-fo-repeater-items{gap:.75rem;width:100%;grid-template-columns:minmax(0,1fr)!important;display:grid!important}.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item{box-shadow:none;--tw-ring-shadow:0 0 #0000;background:#f9fafb;border:1px solid #e5e7eb;border-radius:.875rem;grid-column:1/-1;width:100%;max-width:none;padding:.625rem .75rem;position:relative;overflow:visible}.dark .targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item{background:#ffffff05;border-color:#ffffff1a}.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item>.fi-fo-repeater-item-header{z-index:2;cursor:default;background:0 0;border:0;min-height:0;flex:none!important;gap:0!important;width:auto!important;margin:0!important;padding:0!important;display:block!important;position:absolute!important;top:.625rem!important;right:.75rem!important;overflow:visible!important}.targeting-rules-repeater.fi-fo-repeater .fi-fo-repeater-item-has-header>.fi-fo-repeater-item-content{border-top:0!important}.targeting-rules-repeater .fi-fo-repeater-item-header-start-actions{display:none}.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions{padding:0;list-style:none;display:flex;margin:0!important}.targeting-rules-repeater .targeting-rule-delete-btn,.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn{justify-content:center;align-items:center;transition:background-color .15s,border-color .15s,color .15s;color:#6b7280!important;width:1.75rem!important;min-width:1.75rem!important;height:1.75rem!important;min-height:1.75rem!important;box-shadow:none!important;background:#f3f4f6!important;border:1px solid #e5e7eb!important;border-radius:9999px!important;margin:0!important;padding:0!important;display:inline-flex!important}.targeting-rules-repeater .targeting-rule-delete-btn:hover,.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn:hover{color:#dc2626!important;background:#fef2f2!important;border-color:#fecaca!important}.dark .targeting-rules-repeater .targeting-rule-delete-btn,.dark .targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn{color:#9ca3af!important;background:#ffffff0f!important;border-color:#ffffff1a!important}.dark .targeting-rules-repeater .targeting-rule-delete-btn:hover,.dark .targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn:hover{color:#fca5a5!important;background:#7f1d1d38!important;border-color:#f8717159!important}.targeting-rules-repeater .targeting-rule-delete-btn .fi-icon,.targeting-rules-repeater .fi-fo-repeater-item-header-end-actions .fi-icon-btn .fi-icon{width:.875rem;height:.875rem}.targeting-rules-repeater .fi-fo-repeater-item-content{padding:0}.targeting-rule-item{flex-direction:column;gap:.25rem;width:100%;min-width:0;display:flex}.targeting-rules-repeater .targeting-rule-item>.fi-sc>.fi-grid>.fi-grid-col:first-child .targeting-rule-section-title{padding-right:2rem}.targeting-rule-item .fi-sc-has-gap{gap:.375rem!important}.targeting-rule-item .fi-in-entry{gap:0!important;margin:0!important}.targeting-rule-item .fi-fo-field{gap:.375rem!important;margin-bottom:0!important}.targeting-rule-item .link-segment-wrap{margin:0!important}.targeting-rules-repeater .fi-fo-repeater-item-content,.targeting-rules-repeater .fi-fo-repeater-item-content>.fi-sc{width:100%;min-width:0}.targeting-rule-section-title{letter-spacing:.04em;text-transform:uppercase;color:#6b7280;margin:0;font-size:.6875rem;font-weight:600}.targeting-rule-section-title--destination{border-top:1px solid #e5e7eb;margin-top:.125rem;padding-top:.4375rem}.dark .targeting-rule-section-title{color:#9ca3af}.dark .targeting-rule-section-title--destination{border-top-color:#ffffff14}.targeting-tab-panel{flex-direction:column;gap:.375rem;padding-top:.25rem;display:flex;margin-top:0!important}.targeting-app-linking-panel{border-top:1px solid #f3f4f6;padding-top:.625rem;margin-top:0!important}.dark .targeting-app-linking-panel{border-top-color:#ffffff14}.targeting-filters-builder.fi-fo-builder{gap:.375rem;margin-top:.125rem}.targeting-filters-builder.fi-fo-builder .fi-fo-builder-block-picker-ctn{margin-top:.125rem}.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item{box-shadow:none;--tw-ring-shadow:0 0 #0000;background:#fff;border:1px solid #e5e7eb;border-radius:.75rem;overflow:visible}.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item-content,.targeting-filters-builder.fi-fo-builder .fi-fo-builder-item-header{overflow:visible}.dark .targeting-filters-builder.fi-fo-builder .fi-fo-builder-item{background:#ffffff08;border-color:#ffffff1a}.targeting-rules-repeater .fi-fo-repeater-add .fi-btn,.targeting-filters-builder .fi-fo-builder-block-picker .fi-btn{color:#374151;width:100%;box-shadow:none;background:#fff;border:1px dashed #d1d5db;border-radius:.625rem;justify-content:center;gap:.375rem;padding-block:.625rem}.dark .targeting-rules-repeater .fi-fo-repeater-add .fi-btn,.dark .targeting-filters-builder .fi-fo-builder-block-picker .fi-btn{color:#d1d5db;background:#ffffff05;border-color:#ffffff24}.targeting-rules-repeater .fi-fo-repeater-add .fi-btn:hover,.targeting-filters-builder .fi-fo-builder-block-picker .fi-btn:hover{color:#c2410c;background:#fff7ed;border-color:#fb923c}.dark .targeting-rules-repeater .fi-fo-repeater-add .fi-btn:hover,.dark .targeting-filters-builder .fi-fo-builder-block-picker .fi-btn:hover{color:#fdba74;background:#ea580c1f;border-color:#fb923c73}.validity-tab-card:has(.targeting-rules-repeater) .validity-tab-empty{margin-bottom:.25rem}.validity-tab-card:has(.targeting-rules-repeater .fi-fo-repeater-item) .targeting-rules-empty-state,.validity-tab-card:has(.targeting-rules-repeater .fi-fo-repeater-item) .fi-grid-col:has(.targeting-rules-empty-state){display:none!important}.fi-fo-field:has(.app-linking-preview)>.fi-fo-field-content-col{max-width:none}.app-linking-preview{flex-direction:column;gap:.875rem;width:100%;display:flex}.app-linking-status{background:#fff;border:1px solid #e5e7eb;border-radius:.875rem;flex-direction:column;gap:.75rem;padding:.875rem 1rem;display:flex}.dark .app-linking-status{background:#ffffff08;border-color:#ffffff1a}.app-linking-status--matched{background:#ecfdf5;border-color:#a7f3d0}.dark .app-linking-status--matched{background:#10b98114;border-color:#10b98140}.app-linking-status--browser{flex-direction:row;align-items:center;gap:.75rem}.app-linking-status-main{align-items:flex-start;gap:.75rem;display:flex}.app-linking-status-icon{background:#fff;border:1px solid #e5e7eb;border-radius:.75rem;flex-shrink:0;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex;overflow:hidden}.app-linking-status-icon img{object-fit:contain;width:1.5rem;height:1.5rem}.app-linking-status-icon--browser{color:#6b7280}.app-linking-status-icon--browser svg{width:1.25rem;height:1.25rem}.dark .app-linking-status-icon{background:#ffffff0d;border-color:#ffffff1a}.app-linking-status-icon--matched{border-color:#a7f3d0}.dark .app-linking-status-icon--matched{border-color:#10b98140}.app-linking-status-copy{flex:1;min-width:0}.app-linking-status-title-row{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.app-linking-status-title{color:#111827;margin:0;font-size:.875rem;font-weight:600}.dark .app-linking-status-title{color:#fff}.app-linking-status--matched .app-linking-status-title{color:#065f46}.dark .app-linking-status--matched .app-linking-status-title{color:#a7f3d0}.app-linking-status-desc{color:#047857;margin:.25rem 0 0;font-size:.8125rem;line-height:1.45}.dark .app-linking-status-desc{color:#6ee7b7}.app-linking-status--browser .app-linking-status-title{color:#4b5563;font-size:.8125rem;font-weight:500}.dark .app-linking-status--browser .app-linking-status-title{color:#d1d5db}.app-linking-status-badge{letter-spacing:.04em;text-transform:uppercase;border-radius:9999px;align-items:center;padding:.125rem .5rem;font-size:.625rem;font-weight:700;display:inline-flex}.app-linking-status-badge--success{color:#fff;background:#10b981}.app-linking-deep-link{background:#ffffffbf;border:1px solid #a7f3d0;border-radius:.625rem;flex-direction:column;gap:.375rem;padding:.625rem .75rem;display:flex}.dark .app-linking-deep-link{background:#ffffff0a;border-color:#10b98133}.app-linking-deep-link-label{letter-spacing:.04em;text-transform:uppercase;color:#059669;font-size:.6875rem;font-weight:600}.dark .app-linking-deep-link-label{color:#6ee7b7}.app-linking-deep-link-value{overflow-wrap:anywhere;color:#065f46;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.75rem;line-height:1.45;display:block}.dark .app-linking-deep-link-value{color:#a7f3d0}.app-linking-catalog{background:#f9fafb;border:1px solid #e5e7eb;border-radius:.875rem;overflow:hidden}.dark .app-linking-catalog{background:#ffffff05;border-color:#ffffff1a}.app-linking-catalog-header{border-bottom:1px solid #e5e7eb;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.875rem 1rem;display:flex}.dark .app-linking-catalog-header{border-bottom-color:#ffffff14}.app-linking-catalog-title{color:#111827;margin:0;font-size:.8125rem;font-weight:600}.dark .app-linking-catalog-title{color:#fff}.app-linking-catalog-subtitle{color:#6b7280;margin:.125rem 0 0;font-size:.75rem}.dark .app-linking-catalog-subtitle{color:#9ca3af}.app-linking-os-badges{flex-wrap:wrap;gap:.375rem;display:flex}.app-linking-os-badge{color:#4b5563;background:#fff;border:1px solid #e5e7eb;border-radius:.375rem;align-items:center;padding:.125rem .5rem;font-size:.6875rem;font-weight:600;display:inline-flex}.dark .app-linking-os-badge{color:#d1d5db;background:#ffffff0a;border-color:#ffffff1a}.app-linking-grid{grid-template-columns:repeat(auto-fill,minmax(5.75rem,1fr));gap:.5rem;padding:.875rem;display:grid}.app-linking-app{text-align:center;border:1px solid #0000;border-radius:.75rem;flex-direction:column;align-items:center;gap:.5rem;padding:.625rem .375rem;transition:background-color .15s,border-color .15s;display:flex}.app-linking-app:hover{background:#fff;border-color:#e5e7eb}.dark .app-linking-app:hover{background:#ffffff0a;border-color:#ffffff14}.app-linking-app--matched{background:#ecfdf5;border-color:#a7f3d0}.dark .app-linking-app--matched{background:#10b98114;border-color:#10b98140}.app-linking-app-icon-wrap{background:#fff;border:1px solid #e5e7eb;border-radius:.875rem;justify-content:center;align-items:center;width:2.75rem;height:2.75rem;display:flex;position:relative}.dark .app-linking-app-icon-wrap{background:#ffffff0d;border-color:#ffffff1a}.app-linking-app--matched .app-linking-app-icon-wrap{border-color:#6ee7b7}.app-linking-app-icon{object-fit:contain;width:1.625rem;height:1.625rem}.app-linking-app-check{color:#fff;background:#10b981;border-radius:9999px;justify-content:center;align-items:center;width:1rem;height:1rem;display:flex;position:absolute;top:-.25rem;right:-.25rem;box-shadow:0 0 0 2px #ecfdf5}.dark .app-linking-app-check{box-shadow:0 0 0 2px #064e3b}.app-linking-app-check svg{width:.625rem;height:.625rem}.app-linking-app-name{-webkit-line-clamp:2;color:#4b5563;word-break:break-word;-webkit-box-orient:vertical;font-size:.6875rem;font-weight:500;line-height:1.25;display:-webkit-box;overflow:hidden}.dark .app-linking-app-name{color:#d1d5db}.app-linking-app--matched .app-linking-app-name{color:#065f46;font-weight:600}.dark .app-linking-app--matched .app-linking-app-name{color:#a7f3d0}.app-linking-footnote{color:#6b7280;border-top:1px solid #e5e7eb;margin:0;padding:.75rem 1rem;font-size:.75rem;line-height:1.5}.dark .app-linking-footnote{color:#9ca3af;border-top-color:#ffffff14}.link-short-fused.fi-fo-field{margin-bottom:0}.short-url-card{position:relative!important}.short-url-card:hover{z-index:20!important}.short-url-card:focus-within{z-index:30!important}.short-url-card .fi-ta-actions{z-index:10!important;margin:0!important;padding:0!important;position:absolute!important;top:1.25rem!important;right:1.25rem!important}.ab-test-slider{margin-top:0}.traffic-splitter-segment{box-shadow:none!important}.ab-test-repeater.fi-fo-table-repeater{gap:.625rem;margin-top:0}.ab-test-repeater.fi-fo-table-repeater>table{box-shadow:none;--tw-ring-shadow:0 0 #0000;--tw-ring-offset-shadow:0 0 #0000;background:#f9fafb;border:1px solid #e5e7eb;border-radius:.75rem;overflow:hidden}.dark .ab-test-repeater.fi-fo-table-repeater>table{background:#ffffff05;border-color:#ffffff1a}.ab-test-repeater.fi-fo-table-repeater>table>thead>tr>th{letter-spacing:.04em;text-transform:uppercase;color:#6b7280;background:#f3f4f6d9;border-color:#e5e7eb;padding:.4375rem .625rem;font-size:.6875rem;font-weight:600}.ab-test-repeater.fi-fo-table-repeater>table>thead>tr>th.fi-fo-table-repeater-empty-header-cell{width:2.25rem;min-width:2.25rem}.dark .ab-test-repeater.fi-fo-table-repeater>table>thead>tr>th{color:#9ca3af;background:#ffffff0a;border-color:#ffffff14}.ab-test-repeater.fi-fo-table-repeater>table>tbody{counter-reset:ab-variant-row}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr{counter-increment:ab-variant-row;background:#fff;transition:background-color .15s}.dark .ab-test-repeater.fi-fo-table-repeater>table>tbody>tr{background:#11182759}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr:hover{background:#f9fafb}.dark .ab-test-repeater.fi-fo-table-repeater>table>tbody>tr:hover{background:#ffffff0d}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:first-child{align-items:center;gap:.5rem;display:flex}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:first-child:before{content:counter(ab-variant-row);color:#4f46e5;background:#eef2ff;border-radius:.375rem;flex-shrink:0;justify-content:center;align-items:center;width:1.5rem;height:1.5rem;font-size:.6875rem;font-weight:700;line-height:1;display:inline-flex}.dark .ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:first-child:before{color:#a5b4fc;background:#4f46e52e}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:first-child .fi-fo-field{flex:1;width:100%;min-width:0}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td .fi-fo-field{margin-bottom:0}.ab-test-repeater.fi-compact.fi-fo-table-repeater>table>tbody>tr>td .fi-input-wrp{min-height:0;padding-inline:.125rem}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:last-child .fi-fo-table-repeater-actions{justify-content:flex-end}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:last-child .fi-btn{border-radius:.5rem}.ab-test-repeater.fi-fo-table-repeater>table>tbody{border-color:#e5e7eb}.dark .ab-test-repeater.fi-fo-table-repeater>table>tbody{border-color:#ffffff14}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr{gap:.625rem;padding:.875rem}@container (min-width:36rem){.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr{gap:0;padding:0}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td{vertical-align:middle;padding:.375rem .5rem}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:last-child{width:2.25rem;min-width:2.25rem;padding:.25rem}}@supports not (container-type:inline-size){@media (min-width:80rem){.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr{gap:0;padding:0}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td{vertical-align:middle;padding:.375rem .5rem}.ab-test-repeater.fi-fo-table-repeater>table>tbody>tr>td:last-child{width:2.25rem;min-width:2.25rem;padding:.25rem}}}.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add{justify-content:flex-start}.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn{color:#374151;width:100%;box-shadow:none;background:#fff;border:1px dashed #d1d5db;border-radius:.625rem;justify-content:center;gap:.375rem;padding-block:.625rem;transition:border-color .15s,background-color .15s,color .15s}.ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn:hover{color:#4338ca;background:#eef2ff;border-color:#a5b4fc}.dark .ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn{color:#d1d5db;background:#ffffff05;border-color:#ffffff24}.dark .ab-test-repeater.fi-fo-table-repeater .fi-fo-table-repeater-add .fi-btn:hover{color:#c7d2fe;background:#4f46e51f;border-color:#818cf873}.ab-test-slider .noUi-tooltip{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#ffffff26;border-radius:100px;justify-content:center;align-items:center;width:30px;height:20px;padding:0;font-size:12px;display:flex;position:absolute;top:-24px;bottom:inherit!important}.action-trigger-btn{transition:all .2s ease-in-out;background-color:#0000!important;border:1px solid #0000!important}.short-url-card:hover .action-trigger-btn{background-color:#f9fafb!important;border-color:#e5e7eb!important}.dark .short-url-card:hover .action-trigger-btn{background-color:#1f2937!important;border-color:#374151!important}.action-trigger-btn[aria-expanded=true]{background-color:#f3f4f6!important;border-color:#9ca3af!important;box-shadow:0 0 0 4px #e5e6eb80!important}.dark .action-trigger-btn[aria-expanded=true]{background-color:#111827!important;border-color:#4b5563!important;box-shadow:0 0 0 4px #37415180!important}.custom-fused .fi-input-wrp{border:0!important}select.fi-select-input:disabled,.fi-select-input .fi-select-input-btn[disabled],.fi-select-input .fi-select-input-btn.fi-disabled{background-image:none!important;padding-right:.75rem!important}.folder-card .fi-ta-record-content,.folder-card .fi-ta-record-content-ctn{width:100%!important;height:100%!important;padding:0!important}.folder-card .fi-ta-record-content{flex-direction:column!important;display:flex!important}.folder-card .fi-ta-actions{z-index:20!important;margin:0!important;padding:0!important;position:absolute!important;top:1rem!important;right:1rem!important}.folder-card .fi-ta-stack,.folder-card .fi-ta-stack>div,.folder-card .fi-ta-text,.folder-card .fi-ta-text>div{height:100%!important}.update-link-modal .fi-section,.update-link-modal section.fi-section.fi-section-not-contained{box-shadow:none!important}.qr-color-picker input[type=color]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.qr-margin-top,.qr-space-y>div{margin-top:12px!important}.qr-space-y>div:first-child{margin-top:0!important}@keyframes qr-spin{to{transform:rotate(360deg)}}.qr-designer-grid{grid-template-columns:340px 1fr;align-items:stretch;gap:2rem;width:100%;display:grid}@media (max-width:768px){.qr-designer-grid{grid-template-columns:1fr;gap:1.5rem}}.qr-preview-sticky{flex-direction:column;align-items:stretch;height:100%;display:flex;position:sticky;top:0;margin-top:0!important}.qr-accordion{flex-direction:column;gap:12px;display:flex}.qr-accordion-item{background:#fff;border:1px solid #e5e7eb;border-radius:12px;transition:all .2s ease-in-out;overflow:hidden}.dark .qr-accordion-item{background:#18181b;border-color:#27272a}.qr-accordion-item.open{border-color:#6366f1;box-shadow:0 4px 12px #6366f10d}.dark .qr-accordion-item.open{border-color:#818cf8;box-shadow:0 4px 12px #818cf81a}.qr-accordion-header{cursor:pointer;text-transform:uppercase;letter-spacing:.06em;color:#4b5563;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;width:100%;padding:14px 16px;font-size:13px;font-weight:700;transition:color .15s;display:flex}.dark .qr-accordion-header{color:#9ca3af}.qr-accordion-header:hover{color:#6366f1}.dark .qr-accordion-header:hover{color:#818cf8}.qr-accordion-icon{color:#9ca3af;width:18px;height:18px;transition:color .15s}.qr-accordion-item.open .qr-accordion-icon{color:#6366f1}.dark .qr-accordion-item.open .qr-accordion-icon{color:#818cf8}.qr-accordion-chevron{color:#9ca3af;width:16px;height:16px;transition:transform .2s ease-in-out}.qr-accordion-content{background:#fafafa;border-top:1px solid #f3f4f6;padding:0 16px 16px}.dark .qr-accordion-content{background:#1c1c1f;border-top-color:#27272a}.qr-label{color:#9ca3af;text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px;font-size:11px;font-weight:700;display:block}.qr-select{color:#111827;appearance:none;cursor:pointer;background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E") right 8px center/16px no-repeat;border:1.5px solid #e5e7eb;border-radius:8px;width:100%;padding:8px 30px 8px 12px;font-size:13px;font-weight:500;transition:border-color .15s}.qr-select:focus{border-color:#6366f1;outline:none}.dark .qr-select{color:#f9fafb;background-color:#18181b;border-color:#27272a}.qr-input-num{color:#111827;background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;width:100%;padding:8px 12px;font-size:13px;font-weight:500;transition:border-color .15s}.qr-input-num:focus{border-color:#6366f1;outline:none}.dark .qr-input-num{color:#f9fafb;background-color:#18181b;border-color:#27272a}.qr-segment-control{background:#f3f4f6;border-radius:8px;gap:2px;padding:3px;display:flex}.dark .qr-segment-control{background:#27272a}.qr-segment-btn{color:#6b7280;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:6px 12px;font-size:12px;font-weight:600;transition:all .15s ease-in-out;display:flex}.dark .qr-segment-btn{color:#9ca3af}.qr-segment-btn.active{color:#4f46e5;background:#fff;box-shadow:0 1px 3px #00000014}.dark .qr-segment-btn.active{color:#fff;background:#3f3f46;box-shadow:0 1px 3px #0003}.qr-toggle{cursor:pointer;border-radius:9999px;flex-shrink:0;align-items:center;width:40px;height:22px;transition:background-color .2s;display:inline-flex;position:relative}.qr-toggle.on{background:#6366f1}.qr-toggle.off{background:#d1d5db}.dark .qr-toggle.off{background:#4b5563}.qr-toggle-thumb{pointer-events:none;background:#fff;border-radius:50%;width:18px;height:18px;transition:transform .2s;position:absolute;left:2px;box-shadow:0 2px 4px #00000026}.qr-toggle.on .qr-toggle-thumb{transform:translate(18px)}.qr-upload-zone{cursor:pointer;text-align:center;background:#fff;border:2px dashed #d1d5db;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;padding:20px;transition:all .15s ease-in-out;display:flex}.dark .qr-upload-zone{background:#18181b;border-color:#3f3f46}.qr-upload-zone:hover,.qr-upload-zone.dragover{background:#f5f3ff;border-color:#6366f1}.dark .qr-upload-zone:hover,.dark .qr-upload-zone.dragover{background:#1e1b4b;border-color:#818cf8}.qr-upload-icon{color:#9ca3af;width:28px;height:28px;margin-bottom:8px;transition:color .15s}.qr-upload-zone:hover .qr-upload-icon,.qr-upload-zone.dragover .qr-upload-icon{color:#6366f1}.dark .qr-upload-zone:hover .qr-upload-icon,.dark .qr-upload-zone.dragover .qr-upload-icon{color:#818cf8}.qr-upload-text{color:#4b5563;font-size:11px;font-weight:600}.dark .qr-upload-text{color:#d1d5db}.qr-upload-hint{color:#9ca3af;margin-top:2px;font-size:10px}.qr-slider-container{flex-direction:column;gap:6px;display:flex}.qr-slider-track-wrap{align-items:center;gap:12px;display:flex}.qr-range-input{appearance:none;cursor:pointer;background:#e5e7eb;border-radius:9999px;outline:none;flex:1;height:5px}.dark .qr-range-input{background:#4b5563}.qr-range-input::-webkit-slider-thumb{appearance:none;background:#6366f1;border:2px solid #fff;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 1px 3px #00000026}.qr-range-input::-webkit-slider-thumb:hover{transform:scale(1.15)}.qr-range-input::-moz-range-thumb{background:#6366f1;border:2px solid #fff;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 1px 3px #00000026}.qr-range-input::-moz-range-thumb:hover{transform:scale(1.15)}.qr-badge{color:#4f46e5;background:#eef2ff;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:700}.dark .qr-badge{color:#a5b4fc;background:#1e1b4b}.qr-color-field{background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;align-items:center;gap:8px;width:100%;padding:4px 8px;display:flex}.dark .qr-color-field{background:#18181b;border-color:#27272a}.qr-color-swatch{cursor:pointer;border:1px solid #d1d5db;border-radius:6px;flex-shrink:0;width:24px;height:24px;position:relative;overflow:hidden}.dark .qr-color-swatch{border-color:#3f3f46}.qr-hex-input{color:#374151;letter-spacing:.03em;width:100%;font-family:monospace;font-size:11px;font-weight:600;background:0 0!important;border:none!important;padding:2px 4px!important}.dark .qr-hex-input{color:#f9fafb}.qr-hex-input:focus{box-shadow:none!important;outline:none!important}.qr-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.qr-space-y-4>*+*{margin-top:16px}.qr-preview-card{background:#fff;border:1px solid #e5e7eb;border-radius:16px;flex-direction:column;align-items:center;width:100%;max-width:none;height:100%;padding:20px;transition:all .2s ease-in-out;display:flex;box-shadow:0 10px 25px -5px #0000000d,0 8px 10px -6px #0000000d}.dark .qr-preview-card{background:#18181b;border-color:#27272a;box-shadow:0 10px 25px -5px #0000004d,0 8px 10px -6px #0000004d}.qr-dl-btn{color:#374151;cursor:pointer;background:#fff;border:1.5px solid #e5e7eb;border-radius:8px;align-items:center;gap:5px;padding:6px 14px;font-size:12px;font-weight:600;transition:all .15s;display:inline-flex}.qr-dl-btn:hover{background:#f9fafb;border-color:#d1d5db}.dark .qr-dl-btn{color:#d1d5db;background:#374151;border-color:#4b5563}.dark .qr-dl-btn:hover{background:#4b5563}.qr-checker{background-color:#f3f4f6;background-image:linear-gradient(45deg,#d1d5db 25%,#0000 25%),linear-gradient(-45deg,#d1d5db 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#d1d5db 75%),linear-gradient(-45deg,#0000 75%,#d1d5db 75%);background-position:0 0,0 5px,5px -5px,-5px 0;background-size:10px 10px}.qr-preview-wrapper canvas,.qr-preview-wrapper svg{aspect-ratio:1;display:block;max-width:100%!important;height:100%!important}.qr-preview-dots-bg{background-color:#fafafa;background-image:radial-gradient(#9ca3af38 1px,#0000 0);background-size:8px 8px}.dark .qr-preview-dots-bg{background-color:#121214;background-image:radial-gradient(#9ca3af1f 1px,#0000 0)}.modal-fsl .fi-modal-header,.modal-fsl .fi-modal-footer{padding-top:16px!important;padding-bottom:16px!important}.modal-fsl .fi-modal-footer{justify-content:end!important;display:flex!important}.create-link-sidebar .sidebar-qr-container button svg,.create-link-sidebar .sidebar-qr-container .fi-ac-action-btn svg,.create-link-sidebar .sidebar-qr-container .fi-btn-icon{stroke-width:2px!important;stroke-width:2px!important;width:20px!important;height:20px!important}.create-link-sidebar label,.create-link-sidebar .fi-fo-field-wrp-label,.create-link-sidebar .fi-fo-field-wrp-label label,.create-link-sidebar .fi-label,.create-link-sidebar-select-wrapper label,.create-link-sidebar-select-wrapper .fi-fo-field-wrp-label,.create-link-sidebar-select-wrapper .fi-label{font-weight:600!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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{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}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file diff --git a/resources/dist/filament-short-url.js b/resources/dist/filament-short-url.js index 35d2fe2..e341985 100644 --- a/resources/dist/filament-short-url.js +++ b/resources/dist/filament-short-url.js @@ -488,7 +488,7 @@ document.addEventListener('alpine:init', () => { domain = this.domains[domainId]; } - if (this.routePrefix) { + if (this.routePrefix && !domainId) { return `${this.protocol}://${domain}/${this.routePrefix}/${key}`; } diff --git a/resources/dist/meta-scraper.js b/resources/dist/meta-scraper.js index fd54a35..b8d7f20 100644 --- a/resources/dist/meta-scraper.js +++ b/resources/dist/meta-scraper.js @@ -52,12 +52,145 @@ window.fsuResolveFormApi = function ($get, $set, $el) { return null; }; +window.fsuIsPasswordProtected = function (api) { + if (!api || typeof api.get !== 'function') { + return false; + } + + return !!(api.get('password_active_flag') || api.get('password')); +}; + +window.fsuHasManualOgImage = function (get) { + if (typeof get !== 'function') { + return false; + } + + var image = get('og_image'); + + if (!image) { + return false; + } + + if (typeof image === 'string') { + return image.trim() !== ''; + } + + if (Array.isArray(image)) { + return image.length > 0; + } + + if (typeof image === 'object') { + return Object.keys(image).length > 0; + } + + return false; +}; + +window.fsuLockScrape = function (inputEl) { + if (inputEl) { + inputEl.dataset.fsuScrapeLocked = 'true'; + + return; + } + + document.querySelectorAll('[data-fsu-destination-url]').forEach(function (el) { + el.dataset.fsuScrapeLocked = 'true'; + }); +}; + +window.fsuUnlockScrape = function (inputEl) { + if (inputEl) { + delete inputEl.dataset.fsuScrapeLocked; + + return; + } + + document.querySelectorAll('[data-fsu-destination-url]').forEach(function (el) { + delete el.dataset.fsuScrapeLocked; + }); +}; + +window.fsuIsScrapeLocked = function (inputEl, get) { + if (inputEl && inputEl.dataset.fsuScrapeLocked === 'true') { + return true; + } + + return window.fsuHasManualOgImage(get); +}; + +window.fsuGetScrapedUrl = function (inputEl) { + return inputEl && inputEl.dataset.scrapedUrl ? inputEl.dataset.scrapedUrl : null; +}; + +window.fsuMarkDestinationScraped = function (inputEl, url) { + if (inputEl && url) { + inputEl.dataset.scrapedUrl = url; + } +}; + +window.fsuClearDestinationScrape = function (inputEl) { + if (inputEl) { + delete inputEl.dataset.scrapedUrl; + } +}; + +window.fsuShouldSkipScrape = function (inputEl, url, get) { + if (window.fsuIsScrapeLocked(inputEl, get)) { + return true; + } + + return window.fsuGetScrapedUrl(inputEl) === url; +}; + +window.fsuStopScraping = function (api) { + window.fsuDispatchScraping(false); + window.dispatchEvent(new CustomEvent('fsu-og-image-updated')); + + if (api && typeof api.set === 'function') { + api.set('is_scraping', false); + } +}; + +window.fsuOnManualOgImage = function ($get, $set) { + var api = window.fsuResolveFormApi($get, $set); + + if (api) { + api.set('og_image_scraped', null); + } + + window.fsuStopScraping(api); + window.fsuLockScrape(); +}; + +window.fsuClearOgMetadata = function (api) { + if (!api || typeof api.set !== 'function') { + return; + } + + api.set('og_title', null); + api.set('og_description', null); + api.set('og_image_scraped', null); +}; + +window.fsuRetryScrapeAfterImageRemoved = function ($get, $set) { + var api = window.fsuResolveFormApi($get, $set); + var dest = api ? api.get('destination_url') : null; + + if (!dest || window.fsuHasManualOgImage(api ? api.get : $get)) { + return; + } + + window.fsuUnlockScrape(); + window.fsuClearOgMetadata(api); + + document.querySelectorAll('[data-fsu-destination-url]').forEach(function (el) { + window.fsuClearDestinationScrape(el); + window.fsuScrape(dest, $get, $set, el); + }); +}; + window.fsuScrape = function (val, $get, $set, $el) { if (!val) { - if ($el) { - $el.dataset.scraped = 'false'; - } - return; } @@ -70,16 +203,24 @@ window.fsuScrape = function (val, $get, $set, $el) { return; } - if ($el && $el.dataset.scraped === 'true') { - return; - } - var api = window.fsuResolveFormApi($get, $set, $el); if (!api) { return; } + if (window.fsuIsPasswordProtected(api)) { + window.fsuStopScraping(api); + + return; + } + + if (window.fsuShouldSkipScrape($el, val, api.get)) { + window.fsuStopScraping(api); + + return; + } + window.fsuDispatchScraping(true); api.set('is_scraping', true); @@ -88,6 +229,18 @@ window.fsuScrape = function (val, $get, $set, $el) { return r.ok ? r.json() : null; }) .then(function (data) { + if (window.fsuIsPasswordProtected(api)) { + window.fsuStopScraping(api); + + return; + } + + if (window.fsuIsScrapeLocked($el, api.get)) { + window.fsuStopScraping(api); + + return; + } + if (data && (data.title || data.description || data.image)) { if (data.title && !api.get('og_title')) { api.set('og_title', data.title); @@ -95,36 +248,47 @@ window.fsuScrape = function (val, $get, $set, $el) { if (data.description && !api.get('og_description')) { api.set('og_description', data.description); } - if (data.image && !api.get('og_image_scraped') && !api.get('og_image')) { + if (data.image && !window.fsuHasManualOgImage(api.get)) { api.set('og_image_scraped', data.image); + window.fsuLockScrape($el); } else { - api.set('is_scraping', false); - window.fsuDispatchScraping(false); - } - if ($el) { - $el.dataset.scraped = 'true'; + window.fsuStopScraping(api); } + + window.fsuMarkDestinationScraped($el, val); } else { - api.set('is_scraping', false); - window.fsuDispatchScraping(false); + window.fsuStopScraping(api); } }) .catch(function () { - api.set('is_scraping', false); - window.fsuDispatchScraping(false); + window.fsuStopScraping(api); }); }; window.fsuInitScrape = function ($get, $el) { var api = window.fsuResolveFormApi($get, null, $el); - if ($el && api) { - try { - $el.dataset.scraped = (api.get('og_title') || api.get('og_description') || api.get('og_image_scraped')) ? 'true' : 'false'; - } catch (_) { - $el.dataset.scraped = 'false'; - } - } else if ($el) { - $el.dataset.scraped = 'false'; + if (!$el || !api) { + return; + } + + var dest = api.get('destination_url'); + + if (!dest) { + return; + } + + if (window.fsuHasManualOgImage(api.get)) { + window.fsuLockScrape($el); + window.fsuMarkDestinationScraped($el, dest); + + return; + } + + if ( + !window.fsuGetScrapedUrl($el) + && (api.get('og_title') || api.get('og_description') || api.get('og_image_scraped')) + ) { + window.fsuMarkDestinationScraped($el, dest); } }; diff --git a/resources/lang/en/default.php b/resources/lang/en/default.php index 92a336a..4f42940 100644 --- a/resources/lang/en/default.php +++ b/resources/lang/en/default.php @@ -46,10 +46,68 @@ return [ 'activated_at' => 'Active From', 'max_visits' => 'Max Visits Limit', 'max_visits_helper' => 'Optional limit of total visits allowed before this link is deactivated.', + 'max_visits_no_limit' => 'No limit', + 'max_visits_suffix' => 'visits', + 'number_stepper_decrease' => 'Decrease value', + 'number_stepper_increase' => 'Increase value', 'expiration_redirect_url' => 'Expiration Redirect URL', 'expiration_redirect_url_helper' => 'Fallback URL to redirect to when the link is expired or inactive (leaves blank for 410 Gone error page).', 'form_section_validity' => 'Validity & Limits', 'use_date_validity' => 'Set Date Range Limits', + 'use_date_validity_helper' => 'Schedule when the link becomes active and when it should stop working.', + 'validity_tab_intro' => 'Control when your link is available and how many times it can be clicked. Leave everything off for a link that stays open indefinitely.', + 'validity_schedule_card_title' => 'Schedule availability', + 'validity_schedule_card_subtitle' => 'Optional start and end dates for campaigns, launches, or limited-time offers.', + 'validity_schedule_empty_title' => 'Always available', + 'validity_schedule_empty_desc' => 'Turn on the switch above to set an activation date, expiration date, or both.', + 'validity_schedule_timeline_label' => 'Active window', + 'validity_activated_at_helper' => 'Leave empty to activate immediately when saved.', + 'validity_expires_at_helper' => 'Optional. After this moment the link stops redirecting.', + 'validity_single_use_toggle' => 'Enable single-use mode', + 'validity_single_use_active_note' => 'Single-use is on — the link deactivates after the first successful visit. Max visits limit is ignored.', + 'validity_max_visits_locked' => 'Unavailable while single-use is enabled', + 'tracking_visit_card_title' => 'Visit analytics', + 'tracking_visit_card_subtitle' => 'Collect click statistics for this link — disable for privacy-first or redirect-only links.', + 'tracking_visit_empty_title' => 'Tracking disabled', + 'tracking_visit_empty_desc' => 'Turn on the switch above to record visits and configure which data points are stored.', + 'tracking_fields_identity_title' => 'Identity & source', + 'tracking_fields_device_title' => 'Device & browser', + 'track_ip_desc' => 'IP address for geo insights and abuse signals.', + 'track_referer_desc' => 'Referring page URL when the visitor arrives from another site.', + 'track_browser_desc' => 'Browser family such as Chrome, Safari, or Firefox.', + 'track_browser_version_desc' => 'Exact browser version string from the user agent.', + 'track_os_desc' => 'Operating system name such as iOS, Windows, or Android.', + 'track_os_version_desc' => 'OS version reported by the visitor device.', + 'track_device_type_desc' => 'Device category — desktop, mobile, tablet, or bot.', + 'track_browser_language_desc' => 'Preferred language from the Accept-Language header.', + 'tracking_utm_card_title' => 'Campaign parameters', + 'tracking_utm_card_subtitle' => 'Append UTM tags to the destination URL. Changes sync instantly with the link target.', + 'tracking_ga_card_title' => 'Google Analytics 4', + 'tracking_ga_card_subtitle' => 'Optional Measurement ID for server-side redirect events via GA4 Measurement Protocol.', + 'link_destination_card_title' => 'Destination', + 'link_destination_card_subtitle' => 'Send visitors to one URL or split traffic across A/B test variants.', + 'link_short_url_card_title' => 'Short link', + 'link_short_url_card_subtitle' => 'Choose a domain and customize the back-half of your short URL.', + 'link_behavior_card_title' => 'Behavior', + 'link_behavior_card_subtitle' => 'Control whether the link is active and how incoming query parameters are handled.', + 'link_status_desc' => 'When disabled, visitors see an error page instead of being redirected.', + 'link_tags_card_title' => 'Tags', + 'link_tags_card_subtitle' => 'Add up to five labels to organize, filter, and report on links.', + 'link_notes_card_title' => 'Internal notes', + 'link_notes_card_subtitle' => 'Private admin memo — never shown to visitors.', + 'link_notes_placeholder' => 'Add a reminder for your team…', + 'targeting_rules_card_title' => 'Conditional redirects', + 'targeting_rules_card_subtitle' => 'Send visitors to different URLs based on device, country, language, or platform.', + 'targeting_rules_empty_title' => 'No targeting rules yet', + 'targeting_rules_empty_desc' => 'Add a rule below to override the default destination when specific conditions match.', + 'add_targeting_rule' => 'Add rule', + 'targeting_rule_conditions_title' => 'When to apply', + 'targeting_rule_destination_title' => 'Redirect to', + 'filter_duplicate_error' => 'Each filter type (Device, Platform, Country, Language) can only be added once.', + 'app_linking_card_title' => 'App linking', + 'app_linking_card_subtitle' => 'Open the native mobile app instead of the browser when a matching app is detected.', + 'app_linking_empty_title' => 'App auto-open disabled', + 'app_linking_empty_desc' => 'Turn on the switch above to preview and enable deep-link behavior on mobile devices.', 'notes' => 'Internal Notes', 'ga_tracking_id' => 'Google Analytics 4 Measurement ID', 'ga_tracking_id_helper' => 'Optional G-XXXXXXXXXX ID to track redirects server-side.', @@ -237,7 +295,39 @@ return [ 'settings_cache_ttl' => 'Redirect Cache TTL', 'settings_cache_ttl_helper' => 'Seconds to cache resolved short URL records. Set to 0 to disable (not recommended in production).', 'settings_queue_connection' => 'Queue Connection', - 'settings_queue_connection_helper' => 'Laravel queue connection used for async visit tracking. Use "sync" for synchronous (slower redirects), or "redis"/"sqs" for production.', + 'settings_queue_connection_helper' => 'Laravel queue connection for async visit tracking. Each driver has different requirements — see the info box below when you change this value.', + + 'settings_redis_test' => 'Test Redis connection', + 'settings_redis_test_ok' => 'Redis connection OK', + 'settings_redis_test_fail' => 'Redis connection failed', + 'settings_queue_worker_test' => 'Test queue worker', + 'settings_queue_worker_test_ok' => 'Queue worker OK', + 'settings_queue_worker_test_fail' => 'Queue worker not responding', + 'settings_section_redis' => 'Redis Connection', + 'settings_section_redis_description' => 'These values override database.redis and queue.connections.redis at runtime when Queue Connection is redis. Save settings after changing them.', + 'settings_redis_host' => 'Redis Host', + 'settings_redis_host_helper' => 'Hostname or IP of the Redis server used for queues, counters, stats, and live feed.', + 'settings_redis_port' => 'Redis Port', + 'settings_redis_port_helper' => 'Default: 6379.', + 'settings_redis_password' => 'Redis Password', + 'settings_redis_password_helper' => 'Leave empty if Redis has no password. Stored securely in settings.', + 'settings_redis_database' => 'Redis Database', + 'settings_redis_database_helper' => 'Logical Redis DB index (0–15). Default: 0.', + 'settings_redis_key_prefix' => 'Key Prefix', + 'settings_redis_key_prefix_helper' => 'Optional prefix for all plugin Redis keys. Leave empty to use config default.', + + 'settings_queue_worker_command' => 'Queue Worker Required: Run a worker on the same connection and queue name as above (independent of QUEUE_CONNECTION in .env): php artisan queue:work :connection --queue=:queue', + + 'settings_queue_mode_desc_redis' => 'redis — production mode: async jobs, dedicated Redis counters/stats/live feed (phpredis or Predis), auto counter buffering. Configure Redis below (overrides .env at runtime). Use the test buttons before saving.', + 'settings_queue_mode_desc_database' => 'database — async visit jobs stored in the jobs table. No dedicated Redis counters unless you enable buffering manually.', + 'settings_queue_mode_desc_sqs' => 'sqs — async jobs via AWS SQS. Requires valid AWS credentials in config/queue.php.', + 'settings_queue_mode_desc_beanstalkd' => 'beanstalkd — async jobs via Beanstalkd. Requires a running beanstalkd server.', + 'settings_queue_mode_desc_deferred' => 'deferred — jobs run after the HTTP response in the same PHP process. No separate worker, but adds post-response latency under load.', + 'settings_queue_mode_desc_background' => 'background — Laravel background driver: jobs run after the response without a queue worker (similar to deferred).', + 'settings_queue_mode_desc_failover' => 'failover — uses your Laravel failover chain in config/queue.php. Ensure at least one backend in the chain is reachable.', + 'settings_queue_mode_desc_default' => ':connection — async visit tracking via this Laravel queue connection. Ensure it is configured in config/queue.php.', + + 'settings_queue_mode_info_sync' => '
sync — visits are recorded during the redirect (no queue worker). Best for local dev and low traffic. Optional manual counter buffering via the toggle below.
', 'settings_geoip_enabled' => 'Enable Geo-IP Detection', 'settings_geoip_enabled_helper' => 'Detect and record the visitor\'s country on each visit.', @@ -266,11 +356,15 @@ return [ 'settings_ga4_verify_ok' => '✅ API Secret is valid — GA4 connection successful', 'settings_ga4_verify_fail' => '❌ Invalid API Secret — GA4 rejected the request', 'settings_ga4_verify_empty' => 'Please enter an API Secret first.', + 'settings_ga4_verify_measurement_id' => 'Measurement ID for connection test', + 'settings_ga4_verify_measurement_id_helper' => 'Use the exact G-XXXXXXXXXX from the same GA4 data stream as your API secret. Required unless you use Firebase App ID.', + 'settings_ga4_verify_measurement_required' => 'Enter a Measurement ID (G-XXXXXXXXXX) or Firebase App ID to test the connection.', 'settings_ga4_verify_error' => '⚠️ Connection error — could not reach GA4', 'settings_section_buffering' => 'Visit Counters Buffering', 'settings_buffering_enabled' => 'Buffer Visit Counts in Cache', 'settings_buffering_helper' => 'When enabled, visit count increments are temporarily buffered in the application cache and must be flushed periodically to the database via "php artisan short-url:sync-counters". This prevents row-locking issues and performance degradation under high-traffic spikes.', + 'settings_buffering_redis_auto' => 'Automatically enabled with Redis queue. Visit counters, today stats, and live feed use the dedicated queue Redis connection (phpredis or Predis) — independent of CACHE_STORE. Schedule short-url:sync-counters every minute.', 'settings_buffering_worker_info' => '
Required Cron Task (Scheduler): You have enabled click counter buffering. You must add the following task to your server\'s crontab:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Command run automatically in the background by the scheduler:
php artisan short-url:sync-counters
', // CDN Trust Settings @@ -278,10 +372,12 @@ return [ 'settings_trust_cdn_headers_helper' => 'Enable this if your app sits behind a CDN (like Cloudflare, AWS CloudFront) or a reverse proxy. This allows extracting the real client IP and country code from CDN headers. Warning: only enable this if you are actually behind a proxy, otherwise client IP addresses can be spoofed!', 'settings_trust_cdn_headers_info_callout' => '
Warning (IP Address Security): You have enabled trust for proxy headers. Enable this option only if your website is behind:
Cloudflare (reads from CF-Connecting-IP)
AWS CloudFront or another CDN system
Nginx/Apache reverse proxy forwarding X-Forwarded-For.

Turn this option OFF if your server connects directly to users. If left ON without a proxy, malicious users can easily spoof their IP address by sending a custom header.
', 'settings_geoip_headers_warning' => '
Proxy Header Trust Disabled: You selected CDN Headers as the Geo-IP driver, but the option "Trust CDN & Proxy Headers" in the General tab is disabled. Location detection will not function until you enable it.
', + 'settings_geoip_headers_info' => '
CDN Headers driver: Saving settings with this driver automatically enables Trust CDN & Proxy Headers. When CDN country headers are missing, the plugin falls back to MaxMind and then ip-api.com (rate-limited) instead of returning empty geo data.
', // Stats View & Export Localization 'stats_filter_visited_from' => 'Visited From', 'stats_filter_visited_until' => 'Visited Until', + 'stats_filter_counted_in_stats' => 'Stats-counted visits only', 'stats_action_export' => 'Export CSV', 'stats_csv_time' => 'Time', 'stats_csv_ip' => 'IP Address', @@ -308,8 +404,11 @@ return [ 'form_section_options' => 'Options', 'form_section_notes' => 'Internal Notes', 'form_section_tracking' => 'Visit Tracking', + 'form_section_tracking_desc' => 'Enable or disable visit tracking and statistics for this short link.', 'form_section_tracked_fields' => 'Tracked Fields', + 'form_section_tracked_fields_desc' => 'Choose which metrics are collected for this link — useful for analytics depth and privacy.', 'form_section_analytics' => 'Third-Party Analytics', + 'form_section_analytics_desc' => 'Integrate this link with Google Analytics by providing a data stream identifier.', // New Dashboard Analytics Keys 'stats_card_top_source' => 'Top UTM Source', @@ -338,11 +437,27 @@ return [ 'security_section_title' => 'Security Controls', 'password' => 'Access Password', 'password_helper' => 'Require visitors to enter a password before being redirected.', + 'password_card_title' => 'Password protection', + 'password_card_subtitle' => 'Require visitors to enter a password before being redirected.', + 'warning_page_card_title' => 'Redirect warning page', + 'warning_page_card_subtitle' => 'Show an intermediate screen before redirecting visitors to the destination.', + 'warning_page_empty_title' => 'Warning page disabled', + 'warning_page_empty_desc' => 'Turn on the switch above to show a safety screen before external redirects.', + 'warning_page_active_title' => 'Warning page enabled', 'confirm_password' => 'Confirm Password', 'new_password' => 'New Password', 'change_password' => 'Change Password', 'remove_password' => 'Remove Password', 'password_status_active' => 'Password protection is enabled.', + 'password_status_active_desc' => 'This link is protected. Visitors must enter the correct password to continue.', + 'password_empty_state_title' => 'No protection', + 'password_empty_state_desc' => 'Add a password to restrict access to this short link to selected people only.', + 'password_settings_section' => 'Password settings', + 'password_change_short' => 'Change', + 'password_remove_short' => 'Remove', + 'save_password' => 'Save password', + 'expiration_dates_section_desc' => 'Control when the link is available. Schedule a campaign start or automatic end.', + 'visit_limits_section_desc' => 'Cap total clicks. Useful for one-time tickets or limited offers.', 'set_password' => 'Set Password', 'cancel' => 'Cancel', 'confirm' => 'Confirm', @@ -374,6 +489,7 @@ return [ 'variant_url' => 'Variant URL', 'variant_weight' => 'Traffic Share (%)', 'safe_browsing_error' => 'This URL has been flagged by Google Safe Browsing as unsafe.', + 'outbound_url_blocked' => 'This outbound URL is not allowed.', // New Advanced Targeting Builder 'targeting_rules' => 'Targeting Rules', @@ -399,8 +515,8 @@ return [ 'settings_section_aggregation' => 'High-Traffic Log Management', 'settings_retention_days' => 'Raw Log Retention Period', 'settings_retention_days_helper' => 'Select the duration for which you want to keep detailed raw click logs before they are deleted.', - 'settings_aggregation_enabled' => 'Enable Automatic Daily Pruning & Aggregation', - 'settings_aggregation_enabled_helper' => 'When enabled, the plugin automatically registers a daily task in the scheduler (at 02:00) to aggregate visits into daily statistics and delete raw logs older than the chosen retention period.', + 'settings_aggregation_enabled' => 'Enable raw visit log pruning', + 'settings_aggregation_enabled_helper' => 'The daily 02:00 job always aggregates visits into daily statistics. This toggle controls only whether raw visit rows older than the retention period are deleted.', 'retention_30_days' => '30 Days', 'retention_60_days' => '60 Days', 'retention_90_days' => '90 Days', @@ -410,6 +526,7 @@ return [ 'settings_section_rate_limiting' => 'Rate Limiting / Bot Protection', 'settings_rate_limiting_enabled' => 'Enable Limit Protection', 'settings_rate_limiting_enabled_helper' => 'Limit the rate of redirects per client IP address.', + 'settings_rate_limiting_route_info' => '
Two layers: redirect routes also use the package middleware throttle (default 120/min per IP). When you enable the limiter below, both can return HTTP 429 — the stricter one wins first.
', 'settings_rate_limiting_max_attempts' => 'Max Redirects Allowed', 'settings_rate_limiting_max_attempts_helper' => 'Maximum allowed redirection requests within the decay window.', 'settings_rate_limiting_decay_seconds' => 'Decay Window (Seconds)', @@ -418,7 +535,7 @@ return [ // Queue Settings Additions 'settings_queue_name' => 'Queue Name', 'settings_queue_name_helper' => 'The target queue to which tracking and buffering sync jobs are dispatched. Default: "default".', - 'settings_queue_worker_info' => '
Queue Worker Required: The selected connection runs asynchronously. You must run a background worker to process these jobs:
php artisan queue:work --queue=:queue
', + 'settings_queue_worker_info' => '
Queue Worker Required: The selected connection runs asynchronously. Run a worker that listens on the same connection and queue name as above (this is independent of QUEUE_CONNECTION in .env):
php artisan queue:work :connection --queue=:queue
', 'settings_geoip_stats_cache_ttl' => 'Stats Dashboard Cache TTL', 'settings_geoip_stats_cache_ttl_helper' => 'Time (in seconds) to cache stats calculation on the dashboard. When viewing charts and logs, the system loads calculated numbers from cache instead of querying millions of rows from SQL on every refresh. Default: 300 (5 minutes). Max: 86400 (24 hours).', @@ -470,14 +587,22 @@ return [ 'tab_marketing' => 'Marketing & API', 'marketing_pixels_title' => 'Retargeting Pixels (Client-Side)', 'marketing_pixels_desc' => 'Add ad tracking scripts to capture visitor cookies and build remarketing lists.', + 'marketing_pixels_empty_title' => 'No pixels attached', + 'marketing_pixels_empty_desc' => 'Select one or more retargeting pixels to fire client-side tracking scripts when visitors click this link.', + 'marketing_pixels_select_placeholder' => 'Choose retargeting pixels…', + 'marketing_webhook_empty_title' => 'No webhook configured', + 'marketing_webhook_empty_desc' => 'Add a destination URL to receive real-time HTTP POST notifications on each click.', 'pixel_meta' => 'Meta Pixel ID', 'pixel_google' => 'Google Tag / GA4 ID', 'pixel_linkedin' => 'LinkedIn Partner ID', 'marketing_webhooks_title' => 'Link Webhook Integration', 'marketing_webhooks_desc' => 'Configure a custom destination URL to send a real-time HTTP POST notification on each click.', 'webhook_url' => 'Dedicated Webhook URL', - 'webhook_helper_alert' => 'Once configured, each visit to this short link triggers a real-time HTTP POST request to this URL. The payload contains detailed click metadata in JSON format (including URL key, IP address, country, browser, operating system, referrer, and UTM parameters).', + 'webhook_helper_alert' => 'Once configured, each visit to this short link triggers a real-time HTTP POST request to this URL. The payload contains detailed click metadata in JSON format (URL key, destination, device, browser, operating system, geo, referrer, UTM parameters, and QR scan flag). IP addresses are not included in webhook payloads.', 'webhook_show_payload' => 'Show example JSON payload', + 'webhook_payload_modal_title' => 'Example webhook payload', + 'webhook_payload_modal_desc' => 'Sample JSON body for the visited event. Actual values depend on each click.', + 'webhook_payload_copy' => 'Copy payload to clipboard', // Settings tab additions 'settings_tab_developer' => 'API & Webhooks', @@ -499,6 +624,8 @@ return [ 'settings_api_keys_description' => 'Manage API keys to integrate with external systems (e.g. CRM, Zapier, Make). Authenticate requests using the X-Api-Key header.', 'settings_api_keys' => 'Active API Keys', 'api_key_name' => 'Key Name (Description)', + 'api_key_owner_user_id' => 'Owner User ID', + 'api_key_owner_user_id_helper' => 'Required when link scoping is enabled (default). Limits this key to links owned by that user.', 'api_key' => 'API Key', 'active' => 'Active', 'api_key_generated' => 'API Key Generated', @@ -507,6 +634,16 @@ return [ // Security v2.0 'settings_section_security_v2' => 'Security & Anti-Fraud v2.0', 'settings_section_security_v2_desc' => 'Configure VPN/proxy detection and Google Safe Browsing URL validation.', + 'settings_section_analytics_security' => 'Analytics & Bot Detection', + 'settings_section_analytics_security_desc' => 'Optional click deduplication and advanced bot detection settings.', + 'settings_click_dedup_enabled' => 'Enable Click Deduplication', + 'settings_click_dedup_enabled_helper' => 'Ignore repeat clicks from the same IP within the configured time window.', + 'settings_click_dedup_hours' => 'Deduplication Window (hours)', + 'settings_click_dedup_hours_helper' => 'How long to treat repeat clicks from the same IP as duplicates.', + 'settings_bot_verify_googlebot' => 'Verify Googlebot IP', + 'settings_bot_verify_googlebot_helper' => 'Reverse-DNS + forward IP check for Googlebot user agents.', + 'settings_bot_debug_secret' => 'Bot Debug Secret', + 'settings_bot_debug_secret_helper' => 'Required value for ?bot=1 outside local/testing environments.', 'settings_vpn_detection_enabled' => 'Enable VPN & Proxy Detection', 'settings_vpn_detection_enabled_helper' => 'When enabled, incoming visits will be checked for VPN, proxy, or Tor usage.', 'settings_vpn_driver' => 'Detection Driver', @@ -517,6 +654,12 @@ return [ 'settings_vpnapi_key_helper' => 'Your API key from vpnapi.io (required for vpnapi driver).', 'settings_vpn_block_action' => 'VPN Block Action', 'settings_vpn_block_action_helper' => 'Choose whether to only flag VPN traffic in statistics or actively block them with a 403 Forbidden page.', + 'settings_vpn_block_social_warning' => '
Link previews: blocking mode returns HTTP 403 for VPN/proxy/datacenter IPs. Known social crawlers (Facebook, LinkedIn, Google preview bots) are still allowed so OG meta and cloaked pages keep working. Human visitors on VPN may be blocked.
', + 'settings_vpn_detection_timeout' => 'VPN detection timeout', + 'settings_vpn_detection_timeout_helper' => 'Maximum seconds to wait for the VPN/proxy API response on each redirect.', + 'settings_vpn_detection_cache_ttl' => 'VPN detection cache TTL', + 'settings_vpn_detection_cache_ttl_helper' => 'How long (in seconds) to cache VPN/proxy lookup results per IP address.', + 'settings_trust_cdn_headers_auto_enabled' => '
The CDN Headers Geo-IP driver (Geo-IP tab) requires trusting proxy headers. This option is automatically enabled when that driver is selected and on save.
', 'settings_vpn_block_flag_only' => 'Flag in stats only (allow redirect)', 'settings_vpn_block_block_403' => 'Block traffic (serve 403 Forbidden)', 'settings_safe_browsing_enabled' => 'Enable Google Safe Browsing URL Verification', @@ -575,6 +718,7 @@ return [ 'app_linking_auto_open' => 'Auto-Open', 'app_linking_matched_description' => 'When clicked on a mobile device, this link will open immediately inside the native :app application instead of the web browser.', 'app_linking_deep_link_scheme' => 'Mobile app path (Deep Link): :scheme', + 'app_linking_deep_link_label' => 'Deep link URL', 'app_linking_standard_redirect' => 'This link will open in a standard mobile browser (no matching mobile app found).', // App Redirect Page @@ -595,6 +739,11 @@ return [ 'balance_weights' => 'Adjust to 100%', 'url_key_locked_error' => 'The URL key is locked and cannot be changed.', 'custom_domain_locked_error' => 'The custom domain is locked and cannot be changed.', + 'custom_domain_not_owned_error' => 'You do not have permission to use this custom domain.', + 'resource_not_owned_error' => 'You do not have permission to use this resource.', + 'webhook_signing_secret_required' => 'A webhook signing secret is required when the global webhook is enabled.', + 'webhook_signing_secret' => 'Webhook Signing Secret', + 'webhook_signing_secret_helper' => 'Required when the global webhook is enabled. Outgoing requests include HMAC-SHA256 in X-ShortUrl-Signature.', // Stats View & Granularity & PoP Trends 'stats_prev_period' => 'prev period', @@ -732,7 +881,9 @@ return [ // Live Feed 'stats_tab_live_feed' => 'Live Feed', 'stats_live_feed_empty' => 'No visits recorded yet. Visits will appear here in real-time.', - 'stats_live_feed_poll_interval' => 'Updates every 5s', + 'stats_live_feed_poll_interval' => 'Live via SSE', + 'stats_live_feed_mode_redis' => 'Live · Redis push', + 'stats_live_feed_mode_poll' => 'Live · SSE poll', 'stats_col_visitor' => 'Visitor / Location', // Empty state mock values @@ -759,6 +910,7 @@ return [ 'tab_seo_social' => 'SEO & Social', 'is_cloaked' => 'Link Cloaking', 'is_cloaked_helper' => 'Mask the destination URL in the address bar using an iframe on your short link domain.', + 'is_cloaked_iframeable_hint' => 'Some destinations block iframe embedding (X-Frame-Options). Use the iframeable pre-check before enabling cloaking.', 'do_index' => 'Search Engine Indexing', 'do_index_helper' => 'Allow search engines (like Google) to index this short URL. Otherwise, it is served with a noindex tag.', 'og_title' => 'Custom Title', @@ -778,4 +930,60 @@ return [ 'og_empty_state_hint' => 'Paste a link to auto-generate preview', 'password_prompt_preview_desc' => 'Visitors will see a password prompt before being redirected.', 'fetching_metadata' => 'Fetching preview...', + + // HTTP / API messages (visitor-facing & REST) + 'api_disabled' => 'The Developer API is currently disabled. Enable it in Short URL Settings → API & Webhooks.', + 'api_key_missing' => 'Unauthorized. API Key is missing.', + 'api_key_invalid' => 'Unauthorized. Invalid or inactive API Key.', + 'api_key_owner_required' => 'Forbidden. This API key must have an owner_user_id when link scoping is enabled.', + 'api_key_read_only' => 'Forbidden. This API key has read-only permissions.', + 'api_rate_limit_exceeded' => 'Too many requests. API key rate limit exceeded.', + 'short_url_not_found' => 'Short URL not found.', + 'redirect_vpn_blocked' => 'Access denied. VPN, Proxy, or automated scraping connection detected.', + 'redirect_rate_limited' => 'Too many requests. Please try again in :seconds seconds.', + 'redirect_destination_blocked' => 'This link destination has been blocked for security reasons.', + 'public_stats_rate_limited' => 'Too many requests.', + 'public_stats_password_invalid' => 'Password required or invalid.', + 'public_stats_password_rate_limited' => 'Too many incorrect password attempts. Please try again later.', + 'public_stats_retry_in' => 'Please try again in :seconds seconds.', + 'action_public_stats' => 'Public stats', + 'public_stats_modal_title' => 'Public statistics', + 'public_stats_modal_description' => 'Share a read-only stats page without giving access to the admin panel.', + 'public_stats_save' => 'Save', + 'public_stats_enabled_label' => 'Enable public statistics page', + 'public_stats_password_label' => 'Optional password', + 'public_stats_password_helper' => 'Leave blank to keep the current password. Clear by disabling public stats.', + 'public_stats_disabled_hint' => 'Public stats are off. Enable the toggle and save to generate a shareable link.', + 'public_stats_link_label' => 'Public stats link', + 'public_stats_save_to_activate' => 'Save to activate this link.', + 'public_stats_enabled_status' => 'Public stats are enabled.', + 'public_stats_copied' => 'Public stats link copied.', + 'public_stats_open' => 'Open', + 'public_stats_saved_enabled' => 'Public statistics enabled.', + 'public_stats_saved_disabled' => 'Public statistics disabled.', + 'public_stats_page_title' => 'Link statistics', + 'public_stats_page_subtitle' => 'Stats for /:key', + 'public_stats_date_from' => 'From', + 'public_stats_date_to' => 'To', + 'public_stats_apply_filter' => 'Apply', + 'public_stats_total_visits' => 'Total visits', + 'public_stats_unique_visits' => 'Unique visits', + 'public_stats_today' => 'Today', + 'public_stats_this_week' => 'This week', + 'public_stats_this_month' => 'This month', + 'public_stats_qr_scans' => 'QR scans', + 'public_stats_visits_by_day' => 'Visits by day', + 'public_stats_no_data' => 'No visits recorded for this period.', + 'public_stats_day' => 'Day', + 'public_stats_visits' => 'Visits', + 'public_stats_password_title' => 'Protected statistics', + 'public_stats_password_description' => 'Enter the password to view statistics for this link.', + 'public_stats_password_submit' => 'View statistics', + 'redirect_html_redirecting' => 'Redirecting you to the destination website...', + 'api_created' => 'Short URL created successfully.', + 'api_updated' => 'Short URL updated successfully.', + 'api_bulk_created' => 'Short URLs created successfully.', + 'api_deleted' => 'Short URL deleted successfully.', + 'api_bulk_deleted' => 'Short URLs deleted successfully.', + 'api_bulk_updated' => 'Short URLs updated successfully.', ]; diff --git a/resources/lang/pl/default.php b/resources/lang/pl/default.php index c1bf058..685bdfb 100644 --- a/resources/lang/pl/default.php +++ b/resources/lang/pl/default.php @@ -42,10 +42,68 @@ return [ 'activated_at' => 'Aktywny od', 'max_visits' => 'Maksymalny limit wejść', 'max_visits_helper' => 'Opcjonalny limit liczby wejść, po osiągnięciu którego link zostanie automatycznie wyłączony.', + 'max_visits_no_limit' => 'Bez limitu', + 'max_visits_suffix' => 'wejść', + 'number_stepper_decrease' => 'Zmniejsz wartość', + 'number_stepper_increase' => 'Zwiększ wartość', 'expiration_redirect_url' => 'URL przekierowania po wygaśnięciu', 'expiration_redirect_url_helper' => 'Adres URL, na który nastąpi przekierowanie, gdy link wygaśnie lub będzie nieaktywny (pozostaw puste, aby wyświetlić błąd 410 Gone).', 'form_section_validity' => 'Ważność i limity', 'use_date_validity' => 'Ustaw limity datowe', + 'use_date_validity_helper' => 'Zaplanuj, kiedy link ma się włączyć i kiedy przestać działać.', + 'validity_tab_intro' => 'Kontroluj dostępność linku w czasie oraz liczbę dozwolonych kliknięć. Wyłączone opcje oznaczają link bez ograniczeń czasowych i ilościowych.', + 'validity_schedule_card_title' => 'Harmonogram dostępności', + 'validity_schedule_card_subtitle' => 'Opcjonalna data startu i końca — idealne na kampanie, premiery i oferty limitowane.', + 'validity_schedule_empty_title' => 'Dostępny bezterminowo', + 'validity_schedule_empty_desc' => 'Włącz przełącznik powyżej, aby ustawić datę aktywacji, wygaśnięcia lub obie.', + 'validity_schedule_timeline_label' => 'Okno aktywności', + 'validity_activated_at_helper' => 'Pozostaw puste, aby link był aktywny od razu po zapisaniu.', + 'validity_expires_at_helper' => 'Opcjonalnie. Po tym momencie link przestaje przekierowywać.', + 'validity_single_use_toggle' => 'Włącz tryb jednorazowy', + 'validity_single_use_active_note' => 'Tryb jednorazowy jest włączony — link wyłączy się po pierwszej udanej wizycie. Limit wejść nie ma zastosowania.', + 'validity_max_visits_locked' => 'Niedostępne przy włączonym trybie jednorazowym', + 'tracking_visit_card_title' => 'Analityka wizyt', + 'tracking_visit_card_subtitle' => 'Zbieraj statystyki kliknięć dla tego linku — wyłącz dla linków prywatnościowych lub samych przekierowań.', + 'tracking_visit_empty_title' => 'Śledzenie wyłączone', + 'tracking_visit_empty_desc' => 'Włącz przełącznik powyżej, aby rejestrować wizyty i wybrać zapisywane dane.', + 'tracking_fields_identity_title' => 'Tożsamość i źródło', + 'tracking_fields_device_title' => 'Urządzenie i przeglądarka', + 'track_ip_desc' => 'Adres IP do geolokalizacji i wykrywania nadużyć.', + 'track_referer_desc' => 'Adres strony odsyłającej, gdy użytkownik przychodzi z innej witryny.', + 'track_browser_desc' => 'Rodzina przeglądarki, np. Chrome, Safari lub Firefox.', + 'track_browser_version_desc' => 'Dokładna wersja przeglądarki z user agenta.', + 'track_os_desc' => 'System operacyjny, np. iOS, Windows lub Android.', + 'track_os_version_desc' => 'Wersja systemu operacyjnego urządzenia.', + 'track_device_type_desc' => 'Typ urządzenia — desktop, mobile, tablet lub bot.', + 'track_browser_language_desc' => 'Preferowany język z nagłówka Accept-Language.', + 'tracking_utm_card_title' => 'Parametry kampanii', + 'tracking_utm_card_subtitle' => 'Dołącz tagi UTM do docelowego URL. Zmiany synchronizują się od razu z adresem linku.', + 'tracking_ga_card_title' => 'Google Analytics 4', + 'tracking_ga_card_subtitle' => 'Opcjonalny identyfikator pomiaru do zdarzeń przekierowań po stronie serwera (GA4 Measurement Protocol).', + 'link_destination_card_title' => 'Docelowy adres', + 'link_destination_card_subtitle' => 'Kieruj odwiedzających na jeden URL lub dziel ruch między warianty testu A/B.', + 'link_short_url_card_title' => 'Krótki link', + 'link_short_url_card_subtitle' => 'Wybierz domenę i dostosuj końcówkę adresu skróconego linku.', + 'link_behavior_card_title' => 'Zachowanie', + 'link_behavior_card_subtitle' => 'Steruj aktywnością linku i sposobem przekazywania parametrów URL.', + 'link_status_desc' => 'Po wyłączeniu odwiedzający zobaczą stronę błędu zamiast przekierowania.', + 'link_tags_card_title' => 'Tagi', + 'link_tags_card_subtitle' => 'Dodaj do pięciu etykiet, aby organizować, filtrować i raportować linki.', + 'link_notes_card_title' => 'Notatki wewnętrzne', + 'link_notes_card_subtitle' => 'Prywatna notatka w panelu — nigdy niewidoczna dla odwiedzających.', + 'link_notes_placeholder' => 'Dodaj przypomnienie dla zespołu…', + 'targeting_rules_card_title' => 'Warunkowe przekierowania', + 'targeting_rules_card_subtitle' => 'Kieruj odwiedzających na różne URL-e w zależności od urządzenia, kraju, języka lub platformy.', + 'targeting_rules_empty_title' => 'Brak reguł targetowania', + 'targeting_rules_empty_desc' => 'Dodaj regułę poniżej, aby nadpisać domyślny cel linku, gdy spełnione są określone warunki.', + 'add_targeting_rule' => 'Dodaj regułę', + 'targeting_rule_conditions_title' => 'Kiedy zastosować', + 'targeting_rule_destination_title' => 'Przekieruj na', + 'filter_duplicate_error' => 'Każdy typ filtra (Urządzenie, Platforma, Kraj, Język) można dodać tylko raz.', + 'app_linking_card_title' => 'Linkowanie aplikacji', + 'app_linking_card_subtitle' => 'Otwieraj natywną aplikację mobilną zamiast przeglądarki, gdy wykryto pasującą aplikację.', + 'app_linking_empty_title' => 'Autootwieranie aplikacji wyłączone', + 'app_linking_empty_desc' => 'Włącz przełącznik powyżej, aby podejrzeć i włączyć zachowanie deep link na urządzeniach mobilnych.', 'notes' => 'Wewnętrzne notatki', 'ga_tracking_id' => 'Identyfikator śledzenia Google Analytics 4', 'ga_tracking_id_helper' => 'Opcjonalny identyfikator G-XXXXXXXXXX do śledzenia przekierowań po stronie serwera.', @@ -234,7 +292,39 @@ return [ 'settings_cache_ttl' => 'TTL cache przekierowania', 'settings_cache_ttl_helper' => 'Sekundy cachowania rekordów krótkich URL. Ustaw 0 aby wyłączyć (niezalecane na produkcji).', 'settings_queue_connection' => 'Połączenie kolejki', - 'settings_queue_connection_helper' => 'Kolejka Laravel do asynchronicznego śledzenia wizyt. Użyj "sync" (synchroniczne), lub "redis"/"sqs" na produkcji.', + 'settings_queue_connection_helper' => 'Połączenie kolejki Laravel do asynchronicznego śledzenia wizyt. Każdy sterownik ma inne wymagania — zobacz infobox poniżej po zmianie wartości.', + + 'settings_redis_test' => 'Testuj połączenie Redis', + 'settings_redis_test_ok' => 'Połączenie Redis OK', + 'settings_redis_test_fail' => 'Połączenie Redis nieudane', + 'settings_queue_worker_test' => 'Testuj workera kolejki', + 'settings_queue_worker_test_ok' => 'Worker kolejki OK', + 'settings_queue_worker_test_fail' => 'Worker kolejki nie odpowiada', + 'settings_section_redis' => 'Połączenie Redis', + 'settings_section_redis_description' => 'Te wartości nadpisują database.redis i queue.connections.redis w runtime, gdy Queue Connection = redis. Zapisz ustawienia po zmianie.', + 'settings_redis_host' => 'Host Redis', + 'settings_redis_host_helper' => 'Host lub IP serwera Redis dla kolejek, liczników, statystyk i live feed.', + 'settings_redis_port' => 'Port Redis', + 'settings_redis_port_helper' => 'Domyślnie: 6379.', + 'settings_redis_password' => 'Hasło Redis', + 'settings_redis_password_helper' => 'Pozostaw puste, jeśli Redis nie wymaga hasła. Przechowywane bezpiecznie w ustawieniach.', + 'settings_redis_database' => 'Baza Redis (DB index)', + 'settings_redis_database_helper' => 'Indeks logicznej bazy Redis (0–15). Domyślnie: 0.', + 'settings_redis_key_prefix' => 'Prefix kluczy', + 'settings_redis_key_prefix_helper' => 'Opcjonalny prefix dla kluczy pluginu w Redis. Puste = domyślny z config.', + + 'settings_queue_worker_command' => 'Wymagany proces w tle (Queue Worker): Uruchom workera na tym samym połączeniu i nazwie kolejki co powyżej (niezależnie od QUEUE_CONNECTION w .env): php artisan queue:work :connection --queue=:queue', + + 'settings_queue_mode_desc_redis' => 'redis — tryb produkcyjny: async joby, dedykowane liczniki/statystyki/live feed w Redis (phpredis lub Predis), auto buforowanie. Skonfiguruj Redis poniżej (nadpisuje .env w runtime). Użyj przycisków testu przed zapisem.', + 'settings_queue_mode_desc_database' => 'database — joby w tabeli jobs. Bez dedykowanego Redis — chyba że włączysz buforowanie ręcznie.', + 'settings_queue_mode_desc_sqs' => 'sqs — joby przez AWS SQS. Wymaga poprawnych credentiali AWS w config/queue.php.', + 'settings_queue_mode_desc_beanstalkd' => 'beanstalkd — joby przez Beanstalkd. Wymaga działającego serwera beanstalkd.', + 'settings_queue_mode_desc_deferred' => 'deferred — joby po odpowiedzi HTTP w tym samym procesie PHP. Bez workera, ale większe obciążenie po response przy ruchu.', + 'settings_queue_mode_desc_background' => 'background — sterownik background Laravel: joby po response bez workera (podobnie jak deferred).', + 'settings_queue_mode_desc_failover' => 'failover — łańcuch failover z config/queue.php. Upewnij się, że co najmniej jeden backend działa.', + 'settings_queue_mode_desc_default' => ':connection — async tracking przez to połączenie Laravel. Skonfiguruj je w config/queue.php.', + + 'settings_queue_mode_info_sync' => '
sync — wizyty zapisywane podczas przekierowania (bez workera). Dev i niski ruch. Opcjonalne ręczne buforowanie liczników poniżej.
', 'settings_geoip_enabled' => 'Włącz wykrywanie Geo-IP', 'settings_geoip_enabled_helper' => 'Wykrywaj i zapisuj kraj odwiedzającego przy każdej wizycie.', @@ -263,11 +353,15 @@ return [ 'settings_ga4_verify_ok' => '✅ Klucz API jest prawidłowy — połączenie z GA4 udane', 'settings_ga4_verify_fail' => '❌ Nieprawidłowy klucz API — GA4 odrzuciło żądanie', 'settings_ga4_verify_empty' => 'Najpierw wprowadź klucz API.', + 'settings_ga4_verify_measurement_id' => 'Measurement ID do testu połączenia', + 'settings_ga4_verify_measurement_id_helper' => 'Podaj dokładny G-XXXXXXXXXX ze strumienia GA4 powiązanego z kluczem API. Wymagane, chyba że używasz Firebase App ID.', + 'settings_ga4_verify_measurement_required' => 'Podaj Measurement ID (G-XXXXXXXXXX) lub Firebase App ID, aby przetestować połączenie.', 'settings_ga4_verify_error' => '⚠️ Błąd połączenia — nie można nawiązać kontaktu z GA4', 'settings_section_buffering' => 'Buforowanie liczników wizyt', 'settings_buffering_enabled' => 'Buforuj kliknięcia w pamięci podręcznej (Cache)', 'settings_buffering_helper' => 'Po włączeniu, zliczenia kliknięć będą buforowane w pamięci podręcznej aplikacji i muszą być okresowo synchronizowane z bazą danych za pomocą komendy "php artisan short-url:sync-counters". Zapobiega to blokowaniu wierszy bazy danych i spadkom wydajności przy masowym ruchu.', + 'settings_buffering_redis_auto' => 'Włączane automatycznie przy kolejce Redis. Liczniki linków, statystyki „dziś” i live feed korzystaj z dedykowanego połączenia Redis kolejki (phpredis lub Predis) — niezależnie od CACHE_STORE. Zaplanuj short-url:sync-counters co minutę.', 'settings_buffering_worker_info' => '
Wymagane zadanie Cron (Scheduler): Włączyłeś buforowanie kliknięć. Musisz dodać do harmonogramu zadań (cron) komendę synchronizującą liczniki z bazą danych:
* * * * * cd /sciezka-do-twojego-projektu && php artisan schedule:run >> /dev/null 2>&1
Komenda uruchamiana automatycznie w tle przez harmonogram:
php artisan short-url:sync-counters
', // CDN Trust Settings @@ -275,10 +369,12 @@ return [ 'settings_trust_cdn_headers_helper' => 'Włącz tę opcję, jeśli Twoja aplikacja działa za CDN (np. Cloudflare, AWS CloudFront) lub reverse proxy. Pozwala to na pobieranie prawdziwego adresu IP klienta i kodu kraju z nagłówków CDN. Uwaga: włączaj tylko wtedy, gdy faktycznie korzystasz z proxy, w przeciwnym razie adresy IP mogą być sfałszowane!', 'settings_trust_cdn_headers_info_callout' => '
Uwaga (Bezpieczeństwo adresów IP): Włączyłeś ufanie nagłówkom proxy. Włączaj tę opcję wyłącznie wtedy, gdy Twoja strona jest podpięta pod:
Cloudflare (odczyt z nagłówka CF-Connecting-IP)
AWS CloudFront lub inny system CDN
Nginx/Apache reverse proxy przekazujący nagłówki X-Forwarded-For.

Wyłącz tę opcję, jeśli Twój serwer łączy się z użytkownikami bezpośrednio. Jeśli pozostawisz ją włączoną bez CDN, złośliwi użytkownicy mogą łatwo sfałszować swój adres IP, wysyłając własny nagłówek.
', 'settings_geoip_headers_warning' => '
Brak zaufania do nagłówków proxy: Wybrałeś Nagłówki CDN jako sterownik wykrywania lokalizacji, ale opcja „Ufaj nagłówkom CDN i proxy” w zakładce Ogólne jest wyłączona. Wykrywanie kraju nie będzie działać, dopóki jej nie włączysz.
', + 'settings_geoip_headers_info' => '
Sterownik Nagłówki CDN: Zapis ustawień z tym sterownikiem automatycznie włącza opcję Ufaj nagłówkom CDN i proxy. Gdy brakuje nagłówków kraju z CDN, wtyczka korzysta z MaxMind, a następnie ip-api.com (z limitem zapytań) zamiast zwracać puste dane geo.
', // Stats View & Export Localization 'stats_filter_visited_from' => 'Odwiedzono od', 'stats_filter_visited_until' => 'Odwiedzono do', + 'stats_filter_counted_in_stats' => 'Tylko wizyty w statystykach', 'stats_action_export' => 'Eksportuj CSV', 'stats_csv_time' => 'Czas', 'stats_csv_ip' => 'Adres IP', @@ -305,8 +401,11 @@ return [ 'form_section_options' => 'Opcje', 'form_section_notes' => 'Wewnętrzne notatki', 'form_section_tracking' => 'Śledzenie wizyt', + 'form_section_tracking_desc' => 'Włącz lub wyłącz śledzenie wizyt i statystyki dla tego skróconego linku.', 'form_section_tracked_fields' => 'Śledzone pola', + 'form_section_tracked_fields_desc' => 'Wybierz, które metryki są zbierane dla tego linku — przydatne pod kątem analityki i prywatności.', 'form_section_analytics' => 'Zewnętrzne systemy analityczne', + 'form_section_analytics_desc' => 'Zintegruj ten link z Google Analytics, podając identyfikator strumienia danych.', // New Dashboard Analytics Keys 'stats_card_top_source' => 'Główne źródło UTM', @@ -335,11 +434,27 @@ return [ 'security_section_title' => 'Kontrola bezpieczeństwa', 'password' => 'Hasło dostępu', 'password_helper' => 'Wymagaj od odwiedzających wprowadzenia hasła przed przekierowaniem.', + 'password_card_title' => 'Ochrona hasłem', + 'password_card_subtitle' => 'Wymagaj od odwiedzających wprowadzenia hasła przed przekierowaniem.', + 'warning_page_card_title' => 'Strona ostrzegająca przed przekierowaniem', + 'warning_page_card_subtitle' => 'Pokaż ekran pośredni przed przekierowaniem odwiedzających na docelowy adres.', + 'warning_page_empty_title' => 'Strona ostrzegająca wyłączona', + 'warning_page_empty_desc' => 'Włącz przełącznik powyżej, aby pokazać ekran bezpieczeństwa przed zewnętrznym przekierowaniem.', + 'warning_page_active_title' => 'Strona ostrzegająca włączona', 'confirm_password' => 'Potwierdź hasło', 'new_password' => 'Nowe hasło', 'change_password' => 'Zmień hasło', 'remove_password' => 'Usuń hasło', 'password_status_active' => 'Ochrona hasłem jest włączona.', + 'password_status_active_desc' => 'Link jest zabezpieczony. Dostęp wymaga podania prawidłowego hasła.', + 'password_empty_state_title' => 'Brak zabezpieczeń', + 'password_empty_state_desc' => 'Dodaj hasło, aby ograniczyć dostęp do tego skróconego linku tylko dla wybranych osób.', + 'password_settings_section' => 'Ustawienia hasła', + 'password_change_short' => 'Zmień', + 'password_remove_short' => 'Usuń', + 'save_password' => 'Zapisz hasło', + 'expiration_dates_section_desc' => 'Zarządzaj dostępnością linku w czasie. Możesz zaplanować start kampanii lub jej automatyczne zakończenie.', + 'visit_limits_section_desc' => 'Ogranicz maksymalną liczbę kliknięć. Idealne do biletów jednorazowych lub ofert limitowanych.', 'set_password' => 'Ustaw hasło', 'cancel' => 'Anuluj', 'confirm' => 'Potwierdź', @@ -396,8 +511,8 @@ return [ 'settings_section_aggregation' => 'Zarządzanie logami o dużym natężeniu ruchu', 'settings_retention_days' => 'Czas retencji surowych logów', 'settings_retention_days_helper' => 'Wybierz, przez jaki okres czasu chcesz przechowywać szczegółowe logi pojedynczych wizyt przed ich usunięciem.', - 'settings_aggregation_enabled' => 'Włącz automatyczną agregację i czyszczenie logów', - 'settings_aggregation_enabled_helper' => 'Gdy włączone, wtyczka automatycznie rejestruje zadanie w harmonogramie (codziennie o 02:00), aby zsumować wizyty do statystyk dziennych i usunąć surowe logi starsze niż wybrany okres retencji.', + 'settings_aggregation_enabled' => 'Włącz automatyczne usuwanie surowych logów', + 'settings_aggregation_enabled_helper' => 'Codzienne zadanie o 02:00 zawsze agreguje wizyty do statystyk dziennych. Ten przełącznik kontroluje wyłącznie usuwanie surowych logów starszych niż wybrany okres retencji.', 'retention_30_days' => '30 dni', 'retention_60_days' => '60 dni', 'retention_90_days' => '90 dni', @@ -407,6 +522,7 @@ return [ 'settings_section_rate_limiting' => 'Ograniczanie częstotliwości żądań / Ochrona przed botami', 'settings_rate_limiting_enabled' => 'Włącz ochronę limitów', 'settings_rate_limiting_enabled_helper' => 'Ograniczaj liczbę przekierowań na adres IP klienta.', + 'settings_rate_limiting_route_info' => '
Dwa poziomy: trasy przekierowań mają też domyślny limit middleware pakietu (120/min na IP). Po włączeniu limitera poniżej oba mogą zwrócić HTTP 429 — pierwszy osiągnięty limit wygrywa.
', 'settings_rate_limiting_max_attempts' => 'Maksymalna dopuszczalna liczba przekierowań', 'settings_rate_limiting_max_attempts_helper' => 'Maksymalna liczba żądań w oknie wygasania.', 'settings_rate_limiting_decay_seconds' => 'Okno wygasania (sekundy)', @@ -415,7 +531,7 @@ return [ // Queue Settings Additions 'settings_queue_name' => 'Nazwa kolejki', 'settings_queue_name_helper' => 'Docelowa nazwa kolejki, do której wysyłane są zadania śledzenia i synchronizacji liczników. Domyślnie: "default".', - 'settings_queue_worker_info' => '
Wymagany proces w tle (Queue Worker): Wybrane połączenie działa asynchronicznie. Musisz uruchomić proces w tle (workera), aby przetwarzać te zadania:
php artisan queue:work --queue=:queue
', + 'settings_queue_worker_info' => '
Wymagany proces w tle (Queue Worker): Wybrane połączenie działa asynchronicznie. Uruchom workera na tym samym połączeniu i nazwie kolejki co powyżej (niezależnie od QUEUE_CONNECTION w .env):
php artisan queue:work :connection --queue=:queue
', 'settings_geoip_stats_cache_ttl' => 'Czas życia (TTL) pamięci podręcznej statystyk', 'settings_geoip_stats_cache_ttl_helper' => 'Czas (w sekundach) buforowania obliczeń statystyk linków na pulpicie. Kiedy przeglądasz statystyki, system pobiera dane z cache zamiast każdorazowo przeliczać miliony rekordów w bazie danych. Domyślnie: 300 (5 minut). Maksymalnie: 86400 (24 godziny).', @@ -467,14 +583,22 @@ return [ 'tab_marketing' => 'Marketing i API', 'marketing_pixels_title' => 'Piksele retargetingowe (Client-Side)', 'marketing_pixels_desc' => 'Dodaj skrypty śledzące, aby dołączać ciasteczka odwiedzających i budować grupy remarketingowe reklam.', + 'marketing_pixels_empty_title' => 'Brak przypisanych pikseli', + 'marketing_pixels_empty_desc' => 'Wybierz piksele retargetingowe, które mają uruchamiać skrypty śledzące po kliknięciu w ten link.', + 'marketing_pixels_select_placeholder' => 'Wybierz piksele retargetingowe…', + 'marketing_webhook_empty_title' => 'Brak skonfigurowanego webhooka', + 'marketing_webhook_empty_desc' => 'Dodaj docelowy adres URL, aby otrzymywać powiadomienia HTTP POST w czasie rzeczywistym po każdym kliknięciu.', 'pixel_meta' => 'Meta Pixel ID', 'pixel_google' => 'Google Tag / GA4 ID', 'pixel_linkedin' => 'LinkedIn Partner ID', 'marketing_webhooks_title' => 'Integracja Webhook linku', 'marketing_webhooks_desc' => 'Skonfiguruj niestandardowy adres URL, pod który wysłane zostanie natychmiastowe powiadomienie HTTP POST po kliknięciu.', 'webhook_url' => 'Dedykowany Webhook URL', - 'webhook_helper_alert' => 'Po skonfigurowaniu adresu URL webhooka, przy każdym kliknięciu w ten skrócony link wyślemy żądanie HTTP POST w tle w czasie rzeczywistym. Przekazuje ono szczegółowe metadane wizyty w formacie JSON (klucz linku, adres IP, kraj, przeglądarka, system operacyjny, referer i parametry UTM).', + 'webhook_helper_alert' => 'Po skonfigurowaniu adresu URL webhooka, przy każdym kliknięciu w ten skrócony link wyślemy żądanie HTTP POST w tle w czasie rzeczywistym. Payload zawiera szczegółowe metadane wizyty w JSON (klucz linku, docelowy URL, urządzenie, przeglądarka, system operacyjny, geolokalizacja, referer, parametry UTM i flagę skanowania QR). Adresy IP nie są uwzględniane w payloadzie webhooka.', 'webhook_show_payload' => 'Pokaż przykładowy payload JSON', + 'webhook_payload_modal_title' => 'Przykładowy payload webhooka', + 'webhook_payload_modal_desc' => 'Przykładowe body JSON dla zdarzenia visited. Rzeczywiste wartości zależą od każdego kliknięcia.', + 'webhook_payload_copy' => 'Kopiuj payload do schowka', // Settings tab additions 'settings_tab_developer' => 'API i Webhooki', @@ -504,6 +628,19 @@ return [ // Ochrona v2.0 'settings_section_security_v2' => 'Bezpieczeństwo i ochrona przed nadużyciami v2.0', 'settings_section_security_v2_desc' => 'Skonfiguruj wykrywanie sieci VPN/Proxy oraz walidację adresów przez Google Safe Browsing.', + 'settings_section_analytics_security' => 'Analityka i wykrywanie botów', + 'settings_section_analytics_security_desc' => 'Opcjonalna deduplikacja kliknięć i zaawansowane ustawienia botów.', + 'settings_click_dedup_enabled' => 'Włącz deduplikację kliknięć', + 'settings_click_dedup_enabled_helper' => 'Ignoruj powtarzające się kliknięcia z tego samego IP w określonym oknie czasu.', + 'settings_click_dedup_hours' => 'Okno deduplikacji (godziny)', + 'settings_click_dedup_hours_helper' => 'Jak długo traktować powtarzające się kliknięcia z tego samego IP jako duplikaty.', + 'settings_bot_verify_googlebot' => 'Weryfikuj IP Googlebota', + 'settings_bot_verify_googlebot_helper' => 'Reverse-DNS + forward IP dla user agentów Googlebota.', + 'settings_bot_debug_secret' => 'Sekret debugowania botów', + 'settings_bot_debug_secret_helper' => 'Wymagana wartość dla ?bot=1 poza local/testing.', + 'outbound_url_blocked' => 'Ten adres URL wychodzący jest niedozwolony.', + 'api_key_owner_user_id' => 'ID właściciela', + 'api_key_owner_user_id_helper' => 'Wymagane, gdy włączone jest scope linków do użytkownika (domyślnie). Ogranicza klucz do linków tego użytkownika.', 'settings_vpn_detection_enabled' => 'Włącz wykrywanie VPN i Proxy', 'settings_vpn_detection_enabled_helper' => 'Po włączeniu każda wizyta będzie sprawdzana pod kątem korzystania z połączeń VPN, proxy lub sieci Tor.', 'settings_vpn_driver' => 'Sterownik wykrywania', @@ -514,6 +651,12 @@ return [ 'settings_vpnapi_key_helper' => 'Twój klucz API pobrany z vpnapi.io (wymagany dla sterownika vpnapi).', 'settings_vpn_block_action' => 'Akcja blokowania VPN', 'settings_vpn_block_action_helper' => 'Wybierz, czy ruch z sieci VPN ma być jedynie flagowany w statystykach, czy aktywnie blokowany stroną 403 Forbidden.', + 'settings_vpn_block_social_warning' => '
Podglądy linków: tryb blokowania zwraca HTTP 403 dla IP VPN/proxy/hostingu. Znane boty social (Facebook, LinkedIn, Google preview) są nadal wpuszczane, aby OG i cloaking działały. Ludzie na VPN mogą dostać 403.
', + 'settings_vpn_detection_timeout' => 'Timeout detekcji VPN', + 'settings_vpn_detection_timeout_helper' => 'Maksymalny czas oczekiwania (w sekundach) na odpowiedź API VPN/proxy przy przekierowaniu.', + 'settings_vpn_detection_cache_ttl' => 'TTL cache detekcji VPN', + 'settings_vpn_detection_cache_ttl_helper' => 'Jak długo (w sekundach) cache’ować wynik lookupu VPN/proxy dla danego IP.', + 'settings_trust_cdn_headers_auto_enabled' => '
Sterownik Nagłówki CDN (zakładka Geo-IP) wymaga ufania nagłówkom proxy. Opcja jest automatycznie włączana przy tym sterowniku i przy zapisie ustawień.
', 'settings_vpn_block_flag_only' => 'Tylko flaguj w statystykach (zezwól na przekierowanie)', 'settings_vpn_block_block_403' => 'Blokuj ruch (wyświetl błąd 403 Forbidden)', 'settings_safe_browsing_enabled' => 'Włącz weryfikację przez Google Safe Browsing', @@ -572,6 +715,7 @@ return [ 'app_linking_auto_open' => 'Autootwieranie', 'app_linking_matched_description' => 'Po kliknięciu na telefonie lub tablecie, ten link otworzy się od razu w dedykowanej aplikacji :app zamiast w zwykłej przeglądarce.', 'app_linking_deep_link_scheme' => 'Używany schemat (Deep Link): :scheme', + 'app_linking_deep_link_label' => 'Adres deep link', 'app_linking_standard_redirect' => 'Ten link otworzy się w zwykłej przeglądarce internetowej (brak dopasowanej aplikacji mobilnej).', // App Redirect Page @@ -592,6 +736,11 @@ return [ 'balance_weights' => 'Wyreguluj do 100%', 'url_key_locked_error' => 'Klucz URL jest zablokowany i nie może być zmieniony.', 'custom_domain_locked_error' => 'Domena niestandardowa jest zablokowana i nie może być zmieniona.', + 'custom_domain_not_owned_error' => 'Nie masz uprawnień do użycia tej domeny niestandardowej.', + 'resource_not_owned_error' => 'Nie masz uprawnień do użycia tego zasobu.', + 'webhook_signing_secret_required' => 'Włączenie globalnego webhooka wymaga ustawienia sekretu podpisu HMAC.', + 'webhook_signing_secret' => 'Sekret podpisu webhooka', + 'webhook_signing_secret_helper' => 'Wymagany, gdy włączony jest globalny webhook. Żądania wychodzące zawierają HMAC-SHA256 w nagłówku X-ShortUrl-Signature.', // Stats View & Granularity & PoP Trends 'stats_prev_period' => 'poprzedni okres', @@ -730,7 +879,9 @@ return [ // Live Feed 'stats_tab_live_feed' => 'Strumień aktywności', 'stats_live_feed_empty' => 'Brak wizyt. Nowe wizyty pojawią się tutaj w czasie rzeczywistym.', - 'stats_live_feed_poll_interval' => 'Aktualizacja co 5s', + 'stats_live_feed_poll_interval' => 'Na żywo (SSE)', + 'stats_live_feed_mode_redis' => 'Na żywo · Redis push', + 'stats_live_feed_mode_poll' => 'Na żywo · SSE poll', 'stats_col_visitor' => 'Odwiedzający / Lokalizacja', // Puste stany - makiety @@ -757,6 +908,7 @@ return [ 'tab_seo_social' => 'SEO i Social', 'is_cloaked' => 'Maskowanie linku (Cloaking)', 'is_cloaked_helper' => 'Maskuj adres docelowy w pasku adresu przeglądarki za pomocą ramki iframe na domenie krótkiego linku.', + 'is_cloaked_iframeable_hint' => 'Niektóre strony docelowe blokują osadzanie w iframe (X-Frame-Options). Przed włączeniem cloakingu użyj testu iframeable.', 'do_index' => 'Indeksowanie w wyszukiwarkach', 'do_index_helper' => 'Zezwól wyszukiwarkom (np. Google) na indeksowanie tego krótkiego linku. W przeciwnym razie będzie on serwowany z tagiem noindex.', 'og_title' => 'Niestandardowy tytuł', @@ -770,4 +922,60 @@ return [ 'live_qr_preview' => 'Podgląd kodu QR', 'advanced_options_section' => 'Zaawansowane opcje przekierowań i stanu', 'fetching_metadata' => 'Pobieranie podglądu...', + + // HTTP / API messages (visitor-facing & REST) + 'api_disabled' => 'API deweloperskie jest wyłączone. Włącz je w Ustawieniach skrótów → API i webhooki.', + 'api_key_missing' => 'Brak autoryzacji. Nie podano klucza API.', + 'api_key_invalid' => 'Brak autoryzacji. Nieprawidłowy lub nieaktywny klucz API.', + 'api_key_owner_required' => 'Brak dostępu. Ten klucz API musi mieć owner_user_id, gdy włączone jest scope linków do użytkownika.', + 'api_key_read_only' => 'Brak dostępu. Ten klucz API ma uprawnienia tylko do odczytu.', + 'api_rate_limit_exceeded' => 'Zbyt wiele żądań. Przekroczono limit klucza API.', + 'short_url_not_found' => 'Nie znaleziono skrótu URL.', + 'redirect_vpn_blocked' => 'Odmowa dostępu. Wykryto VPN, proxy lub automatyczne pobieranie.', + 'redirect_rate_limited' => 'Zbyt wiele żądań. Spróbuj ponownie za :seconds sek.', + 'redirect_destination_blocked' => 'Docelowy adres tego linku został zablokowany ze względów bezpieczeństwa.', + 'public_stats_rate_limited' => 'Zbyt wiele żądań.', + 'public_stats_password_invalid' => 'Wymagane lub nieprawidłowe hasło.', + 'public_stats_password_rate_limited' => 'Zbyt wiele nieudanych prób hasła. Spróbuj ponownie później.', + 'public_stats_retry_in' => 'Spróbuj ponownie za :seconds s.', + 'action_public_stats' => 'Statystyki publiczne', + 'public_stats_modal_title' => 'Publiczne statystyki', + 'public_stats_modal_description' => 'Udostępnij stronę ze statystykami bez dostępu do panelu administracyjnego.', + 'public_stats_save' => 'Zapisz', + 'public_stats_enabled_label' => 'Włącz publiczną stronę statystyk', + 'public_stats_password_label' => 'Opcjonalne hasło', + 'public_stats_password_helper' => 'Pozostaw puste, aby zachować obecne hasło. Wyłącz statystyki, aby je usunąć.', + 'public_stats_disabled_hint' => 'Statystyki publiczne są wyłączone. Włącz przełącznik i zapisz, aby wygenerować link.', + 'public_stats_link_label' => 'Link do statystyk', + 'public_stats_save_to_activate' => 'Zapisz, aby aktywować ten link.', + 'public_stats_enabled_status' => 'Statystyki publiczne są włączone.', + 'public_stats_copied' => 'Skopiowano link do statystyk.', + 'public_stats_open' => 'Otwórz', + 'public_stats_saved_enabled' => 'Włączono publiczne statystyki.', + 'public_stats_saved_disabled' => 'Wyłączono publiczne statystyki.', + 'public_stats_page_title' => 'Statystyki linku', + 'public_stats_page_subtitle' => 'Statystyki dla /:key', + 'public_stats_date_from' => 'Od', + 'public_stats_date_to' => 'Do', + 'public_stats_apply_filter' => 'Filtruj', + 'public_stats_total_visits' => 'Wszystkie wizyty', + 'public_stats_unique_visits' => 'Unikalne wizyty', + 'public_stats_today' => 'Dziś', + 'public_stats_this_week' => 'Ten tydzień', + 'public_stats_this_month' => 'Ten miesiąc', + 'public_stats_qr_scans' => 'Skany QR', + 'public_stats_visits_by_day' => 'Wizyty wg dnia', + 'public_stats_no_data' => 'Brak wizyt w tym okresie.', + 'public_stats_day' => 'Dzień', + 'public_stats_visits' => 'Wizyty', + 'public_stats_password_title' => 'Chronione statystyki', + 'public_stats_password_description' => 'Podaj hasło, aby zobaczyć statystyki tego linku.', + 'public_stats_password_submit' => 'Pokaż statystyki', + 'redirect_html_redirecting' => 'Trwa przekierowanie na stronę docelową...', + 'api_created' => 'Skrót URL został utworzony.', + 'api_updated' => 'Skrót URL został zaktualizowany.', + 'api_bulk_created' => 'Skróty URL zostały utworzone.', + 'api_deleted' => 'Skrót URL został usunięty.', + 'api_bulk_deleted' => 'Skróty URL zostały usunięte.', + 'api_bulk_updated' => 'Skróty URL zostały zaktualizowane.', ]; diff --git a/resources/views/app-linking-preview.blade.php b/resources/views/app-linking-preview.blade.php index 23ccf18..22ad3d8 100644 --- a/resources/views/app-linking-preview.blade.php +++ b/resources/views/app-linking-preview.blade.php @@ -1,11 +1,10 @@ @php $matchedAppId = \Bjanczak\FilamentShortUrl\Services\AppLinkingEngine::matchApp($destinationUrl); $apps = \Bjanczak\FilamentShortUrl\Services\AppLinkingEngine::getSupportedApps(); + $appCount = count($apps); @endphp -
- - {{-- Matched App Banner --}} +
@if ($matchedAppId && isset($apps[$matchedAppId])) @php $matchedApp = $apps[$matchedAppId]; @@ -13,106 +12,100 @@ $matchedFavicon = "https://icons.duckduckgo.com/ip2/{$matchedDomain}.ico"; $deepLink = \Bjanczak\FilamentShortUrl\Services\AppLinkingEngine::convertToScheme($destinationUrl, $matchedAppId); @endphp -
-
-
- {{ $matchedApp['name'] }} + +
+
+
+ {{ $matchedApp['name'] }}
-
-
- {{ $matchedApp['name'] }} - - + +
+
+

{{ $matchedApp['name'] }}

+ {{ __('filament-short-url::default.app_linking_auto_open') }}
-

+

{!! __('filament-short-url::default.app_linking_matched_description', ['app' => e($matchedApp['name'])]) !!}

-
- {{ $deepLink }} + +
@else - {{-- Standard Web Redirect notice --}} -
-
- - - +
+
+
- - {{ __('filament-short-url::default.app_linking_standard_redirect') }} - + +
+

{{ __('filament-short-url::default.app_linking_standard_redirect') }}

+
@endif - {{-- Supported Apps Section --}} -
+
+
+
+

{{ __('filament-short-url::default.app_linking_supported_apps') }}

+

+ {{ __('filament-short-url::default.app_linking_preconfigured_count', ['count' => $appCount]) }} +

+
- {{-- Header --}} -
- - {{ __('filament-short-url::default.app_linking_supported_apps') }} - -
- iOS - Android +
+ iOS + Android
- {{-- iOS-style App Grid --}} -
+
@foreach ($apps as $appId => $app) @php $isMatched = ($appId === $matchedAppId); $appDomain = explode('/', $app['domains'][0])[0]; $appFavicon = "https://icons.duckduckgo.com/ip2/{$appDomain}.ico"; @endphp -
- {{-- App Icon --}} -
+ +
$isMatched, + ])> +
{{ $app['name'] }} + @if ($isMatched) + + @endif
- {{-- App Name --}} - - {{ $app['name'] }} - - {{-- Matched checkmark badge --}} - @if ($isMatched) - - - - - - @endif + {{ $app['name'] }}
@endforeach
- {{-- Footer hint --}} -
-

- {{ __('filament-short-url::default.app_linking_supported_apps_helper') }} -

-
+

+ {{ __('filament-short-url::default.app_linking_supported_apps_helper') }} +

diff --git a/resources/views/forms/components/number-stepper.blade.php b/resources/views/forms/components/number-stepper.blade.php new file mode 100644 index 0000000..27646f2 --- /dev/null +++ b/resources/views/forms/components/number-stepper.blade.php @@ -0,0 +1,216 @@ +@php + $statePath = $getStatePath(); + $minValue = $getMinValue(); + $maxValue = $getMaxValue(); + $step = $getStep(); + $isInteger = $isInteger(); + $isNullable = $isNullable(); + $isDisabled = $isDisabled(); + $variant = $getVariant(); + $size = $getSize(); + $displaySuffix = $getDisplaySuffix(); + $nullLabel = $getNullLabel() ?? '—'; + + $containerClasses = match ($size) { + 'sm' => 'h-8 gap-0.5 p-0.5', + 'lg' => 'h-12 gap-1.5 p-1.5', + default => 'h-10 gap-1 p-1', + }; + + $buttonSizeClasses = match ($size) { + 'sm' => 'size-7', + 'lg' => 'size-10', + default => 'size-8', + }; + + $valueClasses = match ($size) { + 'sm' => 'min-w-14 px-1 text-xs', + 'lg' => 'min-w-20 px-2 text-base', + default => 'min-w-16 px-1.5 text-sm', + }; + + $iconClasses = match ($size) { + 'sm' => 'size-3', + 'lg' => 'size-5', + default => 'size-4', + }; + + $buttonVariantClasses = match ($variant) { + 'secondary' => 'bg-primary-50 text-primary-600 shadow-sm hover:bg-primary-100 disabled:opacity-40 dark:bg-primary-500/10 dark:text-primary-400 dark:hover:bg-primary-500/20', + 'tertiary' => 'bg-gray-200/80 text-gray-700 shadow-sm hover:bg-gray-300/80 disabled:opacity-40 dark:bg-white/10 dark:text-gray-200 dark:hover:bg-white/15', + 'outline' => 'border border-gray-300 bg-white text-gray-700 shadow-sm hover:bg-gray-50 disabled:opacity-40 dark:border-white/20 dark:bg-transparent dark:text-gray-200 dark:hover:bg-white/5', + default => 'bg-primary-600 text-white shadow-sm hover:bg-primary-500 disabled:opacity-40 dark:bg-primary-500 dark:hover:bg-primary-400', + }; +@endphp + + +
0; + } + + if (this.nullable && this.numericState <= this.min) { + return true; + } + + return this.numericState > this.min; + }, + get canIncrement() { + if (this.disabled) { + return false; + } + + if (! this.hasValue) { + return true; + } + + if (this.max === null) { + return true; + } + + return this.numericState < this.max; + }, + decrement() { + if (! this.canDecrement) { + return; + } + + if (! this.hasValue) { + return; + } + + if (this.nullable && this.min !== null && this.numericState <= this.min) { + this.state = null; + + return; + } + + let next = this.numericState - this.step; + + if (this.min !== null) { + next = Math.max(next, this.min); + } + + this.state = this.integer ? Math.round(next) : next; + }, + increment() { + if (! this.canIncrement) { + return; + } + + let next = this.hasValue + ? this.numericState + this.step + : (this.min ?? this.step); + + if (this.max !== null) { + next = Math.min(next, this.max); + } + + this.state = this.integer ? Math.round(next) : next; + }, + }" + @class([ + 'fsu-number-stepper inline-flex w-fit max-w-max shrink-0 justify-self-start items-center rounded-full bg-gray-100 dark:bg-white/10', + $containerClasses, + 'opacity-60' => $isDisabled, + ]) + role="group" + aria-label="{{ $getLabel() }}" + > + + +
+ + +
+ + +
+
diff --git a/resources/views/forms/components/segment-control.blade.php b/resources/views/forms/components/segment-control.blade.php new file mode 100644 index 0000000..67d2331 --- /dev/null +++ b/resources/views/forms/components/segment-control.blade.php @@ -0,0 +1,169 @@ +@php + use Illuminate\Support\Js; + + $statePath = $getStatePath(); + $options = $getNormalizedOptions(); + $optionKeys = array_keys($options); + $size = $getSize(); + $variant = $getVariant(); + $hasSeparators = $hasSeparators(); + $isFullWidth = $isFullWidth(); + $isIconOnly = $isIconOnly(); + $expandSelectedLabel = $shouldExpandSelectedLabel(); + $isDisabled = $isDisabled(); +@endphp + + +
mapWithKeys(fn (array $option, string | int $key): array => [(string) $key => $option['disabled']])->all()) }}, + separators: @js($hasSeparators), + disabled: @js($isDisabled), + indicatorStyle: '', + resizeObserver: null, + normalize(value) { + return value === null || value === undefined ? null : String(value); + }, + isSelected(value) { + return this.normalize(this.state) === this.normalize(value); + }, + isOptionDisabled(value) { + return this.disabledOptions[this.normalize(value)] ?? false; + }, + canSelect(value) { + return ! this.disabled && ! this.isOptionDisabled(value); + }, + select(value) { + if (! this.canSelect(value)) { + return; + } + + this.state = value; + this.$nextTick(() => this.updateIndicator()); + }, + selectedIndex() { + const current = this.normalize(this.state); + + return this.optionKeys.findIndex((key) => this.normalize(key) === current); + }, + showSeparator(separatorIndex) { + if (! this.separators) { + return false; + } + + const selectedIndex = this.selectedIndex(); + + if (selectedIndex === -1) { + return true; + } + + return separatorIndex !== selectedIndex - 1 && separatorIndex !== selectedIndex; + }, + updateIndicator() { + const track = this.$refs.track; + if (! track) { + return; + } + + const selected = track.querySelector('[data-segment-selected=true]'); + if (! selected) { + this.indicatorStyle = 'opacity: 0;'; + + return; + } + + this.indicatorStyle = + 'width: ' + selected.offsetWidth + 'px;' + + 'height: ' + selected.offsetHeight + 'px;' + + 'transform: translate3d(' + selected.offsetLeft + 'px, ' + selected.offsetTop + 'px, 0);' + + 'opacity: 1;'; + }, + init() { + this.$watch('state', () => this.$nextTick(() => this.updateIndicator())); + this.$nextTick(() => this.updateIndicator()); + + if (typeof ResizeObserver === 'undefined') { + return; + } + + this.resizeObserver = new ResizeObserver(() => this.updateIndicator()); + this.resizeObserver.observe(this.$refs.track); + }, + }" + x-init="init()" + @class([ + 'fsu-segment-control', + 'w-full' => $isFullWidth, + 'opacity-60 pointer-events-none' => $isDisabled, + ]) + role="radiogroup" + aria-label="{{ $getLabel() }}" + > +
$variant === 'ghost', + ]) + > + + + @foreach ($options as $value => $option) + @if (! $loop->first && $hasSeparators) + + @endif + + + @endforeach +
+
+
diff --git a/resources/views/forms/components/traffic-splitter.blade.php b/resources/views/forms/components/traffic-splitter.blade.php index 20d5157..d396ddf 100644 --- a/resources/views/forms/components/traffic-splitter.blade.php +++ b/resources/views/forms/components/traffic-splitter.blade.php @@ -134,7 +134,7 @@
-
+
diff --git a/resources/views/modals/share-after-create.blade.php b/resources/views/modals/share-after-create.blade.php index 57d6b92..c94ea53 100644 --- a/resources/views/modals/share-after-create.blade.php +++ b/resources/views/modals/share-after-create.blade.php @@ -6,7 +6,7 @@ - $destHost string Host of destination URL (for favicon) - $urlKey string URL key (used for QR download filenames) - $eid string Unique element ID prefix - - $escapedQrOptions string JSON-encoded & HTML-escaped QR options + - $qrOptions array QR styling options for QRCodeStyling - $successTitle string Modal heading text - $successSubtitle string Modal subtitle text - $successHelper string Modal helper text @@ -65,7 +65,7 @@ {{-- QR toggle button --}} - + +
+@endsection diff --git a/resources/views/public-stats-rate-limited.blade.php b/resources/views/public-stats-rate-limited.blade.php new file mode 100644 index 0000000..3a87b5e --- /dev/null +++ b/resources/views/public-stats-rate-limited.blade.php @@ -0,0 +1,12 @@ +@extends('filament-short-url::public-stats-layout') + +@section('title', __('filament-short-url::default.public_stats_rate_limited')) + +@section('content') +
+

{{ __('filament-short-url::default.public_stats_rate_limited') }}

+

+ {{ __('filament-short-url::default.public_stats_retry_in', ['seconds' => $retryAfter]) }} +

+
+@endsection diff --git a/resources/views/public-stats.blade.php b/resources/views/public-stats.blade.php new file mode 100644 index 0000000..d81f7be --- /dev/null +++ b/resources/views/public-stats.blade.php @@ -0,0 +1,69 @@ +@extends('filament-short-url::public-stats-layout') + +@section('title', __('filament-short-url::default.public_stats_page_title')) + +@section('subtitle') + {{ __('filament-short-url::default.public_stats_page_subtitle', ['key' => $shortUrl->url_key]) }} +@endsection + +@section('content') +
+
+ + +
+
+ + +
+ +
+ +
+ @foreach ([ + 'totalVisits' => __('filament-short-url::default.public_stats_total_visits'), + 'uniqueVisits' => __('filament-short-url::default.public_stats_unique_visits'), + 'visitsToday' => __('filament-short-url::default.public_stats_today'), + 'visitsThisWeek' => __('filament-short-url::default.public_stats_this_week'), + 'visitsThisMonth' => __('filament-short-url::default.public_stats_this_month'), + 'qrScans' => __('filament-short-url::default.public_stats_qr_scans'), + ] as $metric => $label) +
+

{{ $label }}

+

{{ number_format((int) ($stats[$metric] ?? 0)) }}

+
+ @endforeach +
+ +
+

{{ __('filament-short-url::default.public_stats_visits_by_day') }}

+ + @php($visitsByDay = $stats['visitsByDay'] ?? []) + @if (empty($visitsByDay)) +

{{ __('filament-short-url::default.public_stats_no_data') }}

+ @else +
+ + + + + + + + + @foreach ($visitsByDay as $day => $count) + + + + + @endforeach + +
{{ __('filament-short-url::default.public_stats_day') }}{{ __('filament-short-url::default.public_stats_visits') }}
{{ $day }}{{ number_format((int) $count) }}
+
+ @endif +
+@endsection diff --git a/resources/views/redirect-html.blade.php b/resources/views/redirect-html.blade.php index 802461c..8353bf1 100644 --- a/resources/views/redirect-html.blade.php +++ b/resources/views/redirect-html.blade.php @@ -3,48 +3,48 @@ - {{ $shortUrl->og_title ?: ($shortUrl->title ?: $shortUrl->url_key) }} + {{ $ogMeta['title'] }} {{-- Robots Search Indexing configuration --}} @if($shortUrl->do_index) + @else @endif {{-- Open Graph / Facebook Metadata --}} - - - @if($shortUrl->og_description) - + + + + @if($ogMeta['description']) + @endif - @if($shortUrl->og_image) - @php - $ogImageUrl = $shortUrl->og_image; - if (!str_starts_with($ogImageUrl, 'http')) { - $ogImageUrl = \Illuminate\Support\Facades\Storage::disk('public')->url($ogImageUrl); - } - @endphp - + @if($ogMeta['image_url']) + + @if($ogMeta['image_width'] && $ogMeta['image_height']) + + + @endif @endif {{-- Twitter Metadata --}} - - - @if($shortUrl->og_description) - + + + @if($ogMeta['description']) + @endif - @if($shortUrl->og_image) - + @if($ogMeta['image_url']) + @endif - {{-- If not cloaked, execute client-side redirect for users --}} - @if(!$shortUrl->is_cloaked) - + {{-- Human visitors only: bots must stay on this page to read OG tags --}} + @if(!$shortUrl->is_cloaked && !$isBot) + @endif @@ -79,18 +79,17 @@ @if($shortUrl->is_cloaked) {{-- Link Cloaking Iframe --}} - - @else - {{-- Standard JS redirect page fallback --}} + + @elseif(!$isBot) + {{-- Standard JS redirect page fallback for human visitors --}}
- {{-- Animated spinner --}} -

Redirecting you to the destination website...

-

If you are not redirected automatically, click here.

+

{{ __('filament-short-url::default.redirect_html_redirecting') }}

+

If you are not redirected automatically, click here.

@endif diff --git a/resources/views/sidebar/social-preview.blade.php b/resources/views/sidebar/social-preview.blade.php index fcda603..2408c57 100644 --- a/resources/views/sidebar/social-preview.blade.php +++ b/resources/views/sidebar/social-preview.blade.php @@ -1,34 +1,18 @@ @php - $ogTitle = $get('og_title') ?: null; - $ogDescription = $get('og_description') ?: null; - - // Resolve the OG image url - $ogImage = null; - $ogImageState = $get('og_image'); - if ($ogImageState) { - if (is_array($ogImageState)) { - $first = reset($ogImageState); - if ($first) { - if (is_string($first)) { - $ogImage = \Illuminate\Support\Facades\Storage::disk('public')->url($first); - } elseif (method_exists($first, 'temporaryUrl')) { - $ogImage = $first->temporaryUrl(); - } - } - } elseif (is_string($ogImageState)) { - $ogImage = \Illuminate\Support\Facades\Storage::disk('public')->url($ogImageState); - } - } else { - $ogImage = $get('og_image_scraped') ?: null; - } - $isScraping = $get('is_scraping') ?: false; + $ogTitle = $ogTitle ?? ($get('og_title') ?: null); + $ogDescription = $ogDescription ?? ($get('og_description') ?: null); + $ogImageUrl = $ogImageUrl ?? null; + $isScraping = $isScraping ?? ($get('is_scraping') ?: false); @endphp