From 39f1f0651a128e6173ec7f54fe19d6c487e93b64 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Jul 2026 19:27:11 +0000 Subject: [PATCH 1/3] Providers redesign, LLM API key, and gate device sync out of the binary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reworked onto current main (Providers is now a Settings tab; the LLM tab and live-apply provider swap already exist upstream). LLM API key (Settings → LLM tab): - Add an API-key field to the tab. It's a write-only secret: the value is never rendered back (the form shows only whether a key is set), a blank submission keeps the current key, and it applies live like the other LLM settings (swaps the running client, no restart). - Persist it to the 0600 config file via config.SaveLLM (llm.api_key), and thread it through llm.Settings + the Applier. MSGBROWSE_LLM_API_KEY still overrides at startup. Providers page (now the /providers Settings tab): - 2×2 grid of source cards plus a Telegram "coming soon" placeholder (not wired into internal/source). - Remove the one-shot "Refresh all sources" button/route and replace it with a background auto-refresh scheduler (providers.refresh_interval, default 6h; 0 disables), reusing the per-source job guard. - "Last synced" per card from a new store.LastSyncTimes over ingest_runs. Device sync gated out of the binary (ADR-0021 / SPEC-0014): - Behind the `devicesync` build tag. The default `msgbrowse` binary links with zero internal/syncthing symbols and no engine constructors; build with `-tags devicesync` to include it. - serve + desktop wiring, `msgbrowse devices`, and doctor's device checks split into tagged/stub files behind a wireDeviceSync seam. - The Device sync UI on /settings and /status is hidden via a compile-time feature flag (web.SetDeviceSyncFeature). Both build variants pass `go build`/`go test` for the main and desktop modules. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01PruXCwhbcG7C6U88x7wykZ --- .../internal/embedded/devicesync_seam.go | 15 ++ .../internal/embedded/embedded.go | 53 ++--- .../internal/embedded/llm_test.go | 16 +- .../internal/embedded/syncthing.go | 46 +++- .../internal/embedded/syncthing_stub.go | 28 +++ .../internal/embedded/syncthing_test.go | 2 + config.example.yaml | 22 +- internal/cli/common.go | 12 +- internal/cli/devices.go | 2 + internal/cli/devices_stub.go | 29 +++ internal/cli/devices_test.go | 2 + internal/cli/doctor_devices.go | 2 + internal/cli/doctor_devices_stub.go | 23 ++ internal/cli/doctor_devices_test.go | 2 + internal/cli/serve.go | 199 ++--------------- internal/cli/serve_devicesync.go | 202 ++++++++++++++++++ internal/cli/serve_devicesync_test.go | 105 +++++++++ internal/cli/serve_nodevicesync.go | 28 +++ internal/cli/serve_test.go | 94 -------- internal/config/config.go | 19 ++ internal/config/save.go | 30 +-- internal/config/save_test.go | 31 +-- internal/llm/holder.go | 36 ++-- internal/llm/holder_test.go | 4 +- internal/store/sources.go | 29 +++ internal/web/autorefresh.go | 40 ++++ internal/web/devsync_test.go | 16 +- internal/web/disable_test.go | 4 +- internal/web/handlers.go | 5 + internal/web/handlers_test.go | 6 + internal/web/llmsettings.go | 45 +++- internal/web/llmsettings_test.go | 41 ++-- internal/web/pair_test.go | 3 + internal/web/refresh.go | 112 +++------- internal/web/refresh_test.go | 121 ++++------- internal/web/server.go | 18 +- internal/web/settings.go | 5 + internal/web/settings_test.go | 40 ++++ internal/web/setup.go | 36 +++- internal/web/setup_security.go | 2 +- internal/web/setup_test.go | 17 +- internal/web/static/app.css | 9 +- internal/web/tailwind/input.css | 44 ++-- internal/web/templates/icons.html | 1 + internal/web/templates/llm_settings.html | 34 ++- internal/web/templates/settings.html | 7 +- internal/web/templates/setup.html | 87 ++++---- internal/web/templates/status.html | 7 +- 48 files changed, 1071 insertions(+), 660 deletions(-) create mode 100644 cmd/msgbrowse-desktop/internal/embedded/devicesync_seam.go create mode 100644 cmd/msgbrowse-desktop/internal/embedded/syncthing_stub.go create mode 100644 internal/cli/devices_stub.go create mode 100644 internal/cli/doctor_devices_stub.go create mode 100644 internal/cli/serve_devicesync.go create mode 100644 internal/cli/serve_devicesync_test.go create mode 100644 internal/cli/serve_nodevicesync.go create mode 100644 internal/web/autorefresh.go diff --git a/cmd/msgbrowse-desktop/internal/embedded/devicesync_seam.go b/cmd/msgbrowse-desktop/internal/embedded/devicesync_seam.go new file mode 100644 index 0000000..c7ca554 --- /dev/null +++ b/cmd/msgbrowse-desktop/internal/embedded/devicesync_seam.go @@ -0,0 +1,15 @@ +// The device-sync seam shared by the tagged (syncthing.go) and untagged +// (syncthing_stub.go) builds. embedded.go holds the running stack only through +// this interface, so the concrete internal/devsync + internal/syncthing types +// exist ONLY in the `devicesync` build — the default desktop binary links +// without them (the feature is not release-ready; ADR-0021 / SPEC-0014). +package embedded + +// deviceSyncHandle is the running device-sync stack the embedded server owns, +// reduced to what Close needs: a drain that stops the supervised engine and the +// folder-watch worker. The tagged build's *deviceSync implements it; the +// untagged build never produces one (wireDeviceSync returns nil). +type deviceSyncHandle interface { + // Drain blocks until the device-sync child process and workers have exited. + Drain() +} diff --git a/cmd/msgbrowse-desktop/internal/embedded/embedded.go b/cmd/msgbrowse-desktop/internal/embedded/embedded.go index ccf3a86..c1968cb 100644 --- a/cmd/msgbrowse-desktop/internal/embedded/embedded.go +++ b/cmd/msgbrowse-desktop/internal/embedded/embedded.go @@ -141,10 +141,10 @@ type Server struct { MCPURL string store *store.Store - onboard *onboard.Runner // Setup Enable worker registry; torn down on Close - sync *deviceSync // supervised device-sync stack, nil when sync is disabled or failed to start - done chan struct{} // closed when the serve loop has exited - serveErr error // set before done is closed + onboard *onboard.Runner // Setup Enable worker registry; torn down on Close + sync deviceSyncHandle // device-sync stack (nil when disabled, failed, or the feature is not compiled in) + done chan struct{} // closed when the serve loop has exited + serveErr error // set before done is closed closeOnce sync.Once closeErr error } @@ -201,6 +201,12 @@ func Start(ctx context.Context, cfg *config.Config, log *slog.Logger, opts ...Op return nil, err } + // Background provider auto-refresh (replaces the retired "Refresh all + // sources" button): re-import each Enabled source's delta on the configured + // cadence. No-op when disabled (providers.refresh_interval <= 0); drains + // with the Start context. + go srv.StartAutoRefresh(ctx, cfg.Providers.RefreshInterval) + // One live LLM provider for the whole app (issue #191): the MCP server // and the Settings → LLM tab share this holder, so a save on the tab // swaps the client and semantic search uses the new endpoint on its very @@ -238,20 +244,19 @@ func Start(ctx context.Context, cfg *config.Config, log *slog.Logger, opts ...Op // engine must not brick the message browser (documented handling per // SPEC-0014 REQ "Error Handling Standards"; the doctor/status story // surfaces the condition in the UI). - sup, err := startDeviceSync(ctx, cfg, st, onboardRunner, log) + // Device sync (ADR-0021) is gated behind the `devicesync` build tag and is + // NOT compiled into release binaries. wireDeviceSync is the real wiring + // under the tag (engine + pairing manager + status/roles monitor + + // folder-watch worker, all wired into the web server) and a no-op stub + // without it; deviceSyncCompiledIn tells the web UI whether to render the + // Device sync surface. A sync-engine failure is logged and the app keeps + // serving (SPEC-0014 REQ "Error Handling Standards"). + srv.SetDeviceSyncFeature(deviceSyncCompiledIn) + sup, err := wireDeviceSync(ctx, srv, cfg, st, onboardRunner, log) if err != nil { log.Error("device sync failed to start; continuing without sync", "error", err) sup = nil } - if sup != nil { - // Wire the /settings pairing section, the status/roles monitor, and - // the Logs event feed to the live engine before the serve goroutine - // starts (the SetPairingSource wiring contract; #158 SPEC-0014 REQ - // "Status and Doctor Surfacing"). - srv.SetPairingSource(sup.Manager) - srv.SetSyncMonitor(sup.Manager) - srv.SetSyncNotes(sup.Notes.Snapshot) - } base := "http://" + ln.Addr().String() e := &Server{ @@ -289,6 +294,7 @@ func newLLMHolder(cfg *config.Config) *llm.Holder { BaseURL: cfg.LLM.BaseURL, EmbedModel: cfg.LLM.EmbedModel, ChatModel: cfg.LLM.ChatModel, + APIKey: cfg.LLM.APIKey, }) } @@ -310,17 +316,17 @@ func llmConfigSavePath(cfg *config.Config) (string, error) { } // newLLMApplier builds the web layer's LLMConfigurator over holder, exactly -// like internal/cli's helper: persist the three llm keys into the resolved -// config file, then swap the live client. The API key stays the -// boot-resolved value (MSGBROWSE_LLM_API_KEY / config file) — never editable -// or displayed on the tab. +// like internal/cli's helper: persist the llm keys (base URL, both models, +// and the API key) into the resolved config file, then swap the live client. +// The key is editable from the tab and stored in the 0600 config file +// (Option A — a desktop user has no handy env var). func newLLMApplier(cfg *config.Config, holder *llm.Holder) *llm.Applier { - return llm.NewApplier(holder, cfg.LLM.APIKey, cfg.LLM.Timeout, func(s llm.Settings) error { + return llm.NewApplier(holder, cfg.LLM.Timeout, func(s llm.Settings) error { path, err := llmConfigSavePath(cfg) if err != nil { return err } - return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel) + return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel, s.APIKey) }) } @@ -394,11 +400,10 @@ func (e *Server) Close() error { // shutdown of the Syncthing child AND the folder-watch worker's // goroutines — no orphan process, no leaked worker outlives the app // (SPEC-0014 "App quit stops the daemon", REQ "Concurrency Safety"). + // nil in the default build (feature not compiled in) or when sync was + // disabled/failed. if e.sync != nil { - if serr := e.sync.Sup.Wait(); serr != nil { - slog.Error("device-sync supervisor exited with error", "error", serr) - } - e.sync.Watcher.Wait() + e.sync.Drain() } err := e.store.Close() if e.serveErr != nil { diff --git a/cmd/msgbrowse-desktop/internal/embedded/llm_test.go b/cmd/msgbrowse-desktop/internal/embedded/llm_test.go index 5da94bf..8da8d88 100644 --- a/cmd/msgbrowse-desktop/internal/embedded/llm_test.go +++ b/cmd/msgbrowse-desktop/internal/embedded/llm_test.go @@ -1,7 +1,7 @@ // Headless end-to-end coverage for the desktop LLM settings wiring (issue // #191): the embedded server serves the Settings → LLM tab, and a gated save -// over the real loopback socket persists the three llm keys into the loaded -// config file. Pure Go, CGO_ENABLED=0, no webview. +// over the real loopback socket persists the llm keys — including the API key +// (Option A) — into the loaded config file. Pure Go, CGO_ENABLED=0, no webview. package embedded import ( @@ -50,14 +50,11 @@ func TestLLMSettingsSaveEndToEnd(t *testing.T) { if resp.StatusCode != http.StatusOK { t.Fatalf("GET /settings/llm status = %d", resp.StatusCode) } - for _, want := range []string{`name="base_url"`, `name="embed_model"`, `name="facts_model"`, "MSGBROWSE_LLM_API_KEY"} { + for _, want := range []string{`name="base_url"`, `name="embed_model"`, `name="facts_model"`, `name="api_key"`, "MSGBROWSE_LLM_API_KEY"} { if !strings.Contains(string(page), want) { t.Errorf("LLM tab missing %q", want) } } - if strings.Contains(string(page), `name="api_key"`) { - t.Error("LLM tab rendered an api_key input") - } m := setupTokenRe.FindSubmatch(page) if m == nil { t.Fatal("LLM tab carries no setup token") @@ -69,6 +66,7 @@ func TestLLMSettingsSaveEndToEnd(t *testing.T) { "base_url": {"http://127.0.0.1:11434/v1"}, "embed_model": {"nomic-embed-text"}, "facts_model": {"llama3"}, + "api_key": {"sk-desktop-key"}, } req, err := http.NewRequest(http.MethodPost, es.URL+"/settings/llm", strings.NewReader(form.Encode())) if err != nil { @@ -98,13 +96,15 @@ func TestLLMSettingsSaveEndToEnd(t *testing.T) { "base_url: http://127.0.0.1:11434/v1", "embed_model: nomic-embed-text", "chat_model: llama3", + "api_key: sk-desktop-key", } { if !strings.Contains(string(saved), want) { t.Errorf("saved config missing %q:\n%s", want, saved) } } - if strings.Contains(string(saved), "api_key") { - t.Errorf("saved config gained an api_key:\n%s", saved) + // The secret is never rendered back into the page. + if strings.Contains(string(body), "sk-desktop-key") { + t.Error("the API key value must never be echoed into the LLM tab HTML") } // And a cross-origin replay with a fresh valid token is rejected 403 — diff --git a/cmd/msgbrowse-desktop/internal/embedded/syncthing.go b/cmd/msgbrowse-desktop/internal/embedded/syncthing.go index 467f442..665bb79 100644 --- a/cmd/msgbrowse-desktop/internal/embedded/syncthing.go +++ b/cmd/msgbrowse-desktop/internal/embedded/syncthing.go @@ -1,4 +1,10 @@ -// Device-sync wiring for the desktop shell: when device_sync.enabled is true, +//go:build devicesync + +// Device-sync wiring for the desktop shell, compiled ONLY under the `devicesync` +// build tag (ADR-0021 / SPEC-0014). The feature is not release-ready, so the +// default desktop build excludes this file — and the internal/devsync + +// internal/syncthing packages with it; syncthing_stub.go supplies the no-op +// seam. When device_sync.enabled is true, // the embedded server starts the Syncthing supervisor (internal/syncthing) // alongside the web UI, resolving the engine binary the ADR-0020 way — from // the .app bundle (Contents/Resources/tools/syncthing, version-pinned via @@ -29,8 +35,46 @@ import ( "github.com/joestump/msgbrowse/internal/onboard" "github.com/joestump/msgbrowse/internal/store" "github.com/joestump/msgbrowse/internal/syncthing" + "github.com/joestump/msgbrowse/internal/web" ) +// deviceSyncCompiledIn reports that this desktop binary was built with the +// device-sync feature; the web UI renders the Device sync surface accordingly. +const deviceSyncCompiledIn = true + +// wireDeviceSync starts the device-sync stack (when device_sync.enabled) and +// wires its pairing manager, status/roles monitor, and Logs event feed into the +// web server, returning a handle the embedded server drains on Close. With sync +// disabled it returns a nil handle. This is the seam embedded.go calls; +// syncthing_stub.go is the no-op version for builds without the tag. +func wireDeviceSync(ctx context.Context, srv *web.Server, cfg *config.Config, st *store.Store, runner *onboard.Runner, log *slog.Logger) (deviceSyncHandle, error) { + sup, err := startDeviceSync(ctx, cfg, st, runner, log) + if err != nil { + return nil, err + } + if sup == nil { + return nil, nil + } + // Wire the /settings pairing section, the status/roles monitor, and the + // Logs event feed to the live engine (#158 SPEC-0014 REQ "Status and Doctor + // Surfacing"). + srv.SetPairingSource(sup.Manager) + srv.SetSyncMonitor(sup.Manager) + srv.SetSyncNotes(sup.Notes.Snapshot) + return sup, nil +} + +// Drain waits for the supervised Syncthing child's SIGTERM→grace shutdown AND +// the folder-watch worker's goroutines, so no orphan process or leaked worker +// outlives the app (SPEC-0014 "App quit stops the daemon"). It satisfies +// deviceSyncHandle. +func (d *deviceSync) Drain() { + if serr := d.Sup.Wait(); serr != nil { + slog.Error("device-sync supervisor exited with error", "error", serr) + } + d.Watcher.Wait() +} + // resolvedSyncthing is the outcome of binary resolution: the path to run, // the pinned version to enforce (bundled only; empty for BYO), and whether // it came from the bundle. diff --git a/cmd/msgbrowse-desktop/internal/embedded/syncthing_stub.go b/cmd/msgbrowse-desktop/internal/embedded/syncthing_stub.go new file mode 100644 index 0000000..de0092d --- /dev/null +++ b/cmd/msgbrowse-desktop/internal/embedded/syncthing_stub.go @@ -0,0 +1,28 @@ +//go:build !devicesync + +// Default desktop build: device sync is NOT compiled in. This stub replaces +// syncthing.go so the embedded server links WITHOUT internal/devsync or +// internal/syncthing — device sync (ADR-0021 / SPEC-0014) is unfinished and must +// not ship. Build with `-tags devicesync` to include it. +package embedded + +import ( + "context" + "log/slog" + + "github.com/joestump/msgbrowse/internal/config" + "github.com/joestump/msgbrowse/internal/onboard" + "github.com/joestump/msgbrowse/internal/store" + "github.com/joestump/msgbrowse/internal/web" +) + +// deviceSyncCompiledIn reports that this desktop binary was built WITHOUT the +// device-sync feature; the web UI hides the entire Device sync surface. +const deviceSyncCompiledIn = false + +// wireDeviceSync is the no-op seam for builds without the `devicesync` tag: it +// starts nothing and returns a nil handle, so embedded.go's serve and drain +// paths are identical whether or not the feature is compiled in. +func wireDeviceSync(_ context.Context, _ *web.Server, _ *config.Config, _ *store.Store, _ *onboard.Runner, _ *slog.Logger) (deviceSyncHandle, error) { + return nil, nil +} diff --git a/cmd/msgbrowse-desktop/internal/embedded/syncthing_test.go b/cmd/msgbrowse-desktop/internal/embedded/syncthing_test.go index 35877dd..37647c4 100644 --- a/cmd/msgbrowse-desktop/internal/embedded/syncthing_test.go +++ b/cmd/msgbrowse-desktop/internal/embedded/syncthing_test.go @@ -1,3 +1,5 @@ +//go:build devicesync + // Headless tests for the desktop shell's Syncthing binary resolution: bundled // resolution from a faked .app (never $PATH), the typed error on a bundle // missing its engine or version pin, and the BYO fallback for the non-bundled diff --git a/config.example.yaml b/config.example.yaml index 07a6ba8..c513212 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -38,14 +38,23 @@ listen_addr: "127.0.0.1:8787" llm: # The ONLY network egress msgbrowse performs. Default: a local LiteLLM proxy. base_url: "http://127.0.0.1:4000/v1" - # Leave empty here; set MSGBROWSE_LLM_API_KEY in the environment if your route - # needs a key. A local Ollama route needs none. + # API key, if your route needs one (a local Ollama/LiteLLM route needs none). + # Editable from Settings → LLM, which writes it back here (this file is + # gitignored, mode 0600). MSGBROWSE_LLM_API_KEY still overrides it at startup. api_key: "" chat_model: "local-chat" # used for RAG synthesis + journal digests embed_model: "local-embed" # used for message embeddings (semantic search) max_concurrency: 4 timeout: "60s" +# In-app message sources ("Providers"). Enabled sources auto-refresh on this +# cadence — `serve` and the desktop app re-run each source's export + incremental +# import in the background so the archive stays current without a manual click. +providers: + # How often Enabled sources auto-refresh. Set to 0 to disable auto-refresh + # (the per-source manual Refresh control still works). Go duration string. + refresh_interval: "6h" + # Vector backend: "sqlite-vec" (default) or "qdrant". The "sqlite-vec" setting # is currently served by a pure-Go brute-force cosine scan in the same SQLite # file (a sqlite-vec extension can replace it later behind the same setting); @@ -59,9 +68,12 @@ journal: # 0 = no cap on days processed per run. max_days_per_run: 0 -# Multi-device archive sync (ADR-0021 / SPEC-0014). STRICTLY OPT-IN: with -# enabled false (or the block absent) no Syncthing process runs and msgbrowse -# keeps its loopback-only posture. When enabled, msgbrowse supervises a +# Multi-device archive sync (ADR-0021 / SPEC-0014). NOT COMPILED INTO RELEASE +# BUILDS: device sync is unfinished and gated behind the `devicesync` build tag +# (build with `go build -tags devicesync` to include it). Without that tag these +# keys are inert and the Device sync UI is hidden. STRICTLY OPT-IN even then: +# with enabled false (or the block absent) no Syncthing process runs and +# msgbrowse keeps its loopback-only posture. When enabled, msgbrowse supervises a # bundled/BYO Syncthing as the transfer engine: its P2P listener is the one # socket beyond loopback — mutual TLS with device-ID pinning, both ends must # accept a peer — and its config is generated LAN-only by default (global diff --git a/internal/cli/common.go b/internal/cli/common.go index 3277174..a434aea 100644 --- a/internal/cli/common.go +++ b/internal/cli/common.go @@ -52,6 +52,7 @@ func newLLMHolder(cfg *config.Config) *llm.Holder { BaseURL: cfg.LLM.BaseURL, EmbedModel: cfg.LLM.EmbedModel, ChatModel: cfg.LLM.ChatModel, + APIKey: cfg.LLM.APIKey, }) } @@ -72,16 +73,17 @@ func llmConfigSavePath(cfg *config.Config) (string, error) { } // newLLMApplier builds the web layer's LLMConfigurator over holder: persist -// the three llm keys into the resolved config file, then swap the live -// client. The API key stays the boot-resolved value (MSGBROWSE_LLM_API_KEY / -// config, per the config posture) — it is not editable from the tab. +// the llm keys (base URL, both models, and the API key) into the resolved +// config file, then swap the live client. The key is editable from the tab +// and stored in the 0600 config file (Option A — a desktop user has no handy +// env var). func newLLMApplier(cfg *config.Config, holder *llm.Holder) *llm.Applier { - return llm.NewApplier(holder, cfg.LLM.APIKey, cfg.LLM.Timeout, func(s llm.Settings) error { + return llm.NewApplier(holder, cfg.LLM.Timeout, func(s llm.Settings) error { path, err := llmConfigSavePath(cfg) if err != nil { return err } - return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel) + return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel, s.APIKey) }) } diff --git a/internal/cli/devices.go b/internal/cli/devices.go index 882a5f3..82494cc 100644 --- a/internal/cli/devices.go +++ b/internal/cli/devices.go @@ -1,3 +1,5 @@ +//go:build devicesync + // The `msgbrowse devices` namespace under the Syncthing sync engine // (ADR-0021 supersedes ADR-0018). The SPEC-0011 surface this file used to // hold — pairing windows, token payloads, the mTLS listener client, unpair diff --git a/internal/cli/devices_stub.go b/internal/cli/devices_stub.go new file mode 100644 index 0000000..0973103 --- /dev/null +++ b/internal/cli/devices_stub.go @@ -0,0 +1,29 @@ +//go:build !devicesync + +// Default build: the `msgbrowse devices` namespace (device-sync peer +// management) is not compiled in — device sync is gated behind the `devicesync` +// build tag (ADR-0021 / SPEC-0014) and excluded from release binaries. This stub +// keeps root.go's command registration unchanged while linking WITHOUT +// internal/devices, internal/devsync, or internal/syncthing: it registers a +// hidden `devices` command that explains the feature is not built in. +package cli + +import ( + "github.com/spf13/cobra" +) + +// newDevicesCommand returns a hidden placeholder in builds without the +// `devicesync` tag. Hidden so it does not clutter --help, but present so an +// operator who runs `msgbrowse devices` gets a clear explanation rather than an +// "unknown command" error. +func newDevicesCommand() *cobra.Command { + return &cobra.Command{ + Use: "devices", + Short: "Manage device-sync peers (not built into this binary)", + Hidden: true, + RunE: func(cmd *cobra.Command, _ []string) error { + cmd.Println("device sync is not built into this binary (feature gated behind the `devicesync` build tag).") + return nil + }, + } +} diff --git a/internal/cli/devices_test.go b/internal/cli/devices_test.go index f7ce0fb..d835b2b 100644 --- a/internal/cli/devices_test.go +++ b/internal/cli/devices_test.go @@ -1,3 +1,5 @@ +//go:build devicesync + // CLI tests for the rebuilt `msgbrowse devices` namespace (ADR-0021): the // read-only `devices list` over the paired_devices registry — empty state, // seeded rows through a REAL store, and the error path. The pairing flow diff --git a/internal/cli/doctor_devices.go b/internal/cli/doctor_devices.go index d4ad245..7da8013 100644 --- a/internal/cli/doctor_devices.go +++ b/internal/cli/doctor_devices.go @@ -1,3 +1,5 @@ +//go:build devicesync + // doctor's device-sync checks under the Syncthing engine (ADR-0021), the // #158 status/doctor story: disabled remains the healthy default (pass, not // warn); enabled gets the full condition ladder from SPEC-0014 REQ "Status diff --git a/internal/cli/doctor_devices_stub.go b/internal/cli/doctor_devices_stub.go new file mode 100644 index 0000000..c6cb811 --- /dev/null +++ b/internal/cli/doctor_devices_stub.go @@ -0,0 +1,23 @@ +//go:build !devicesync + +// Default build: device sync is not compiled in (see serve_nodevicesync.go), so +// doctor's device-sync condition ladder is replaced by a single informational +// line. This keeps `msgbrowse doctor` linking without internal/devices or +// internal/syncthing while still telling the operator why there is no sync +// posture to report. +package cli + +import ( + "context" + + "github.com/joestump/msgbrowse/internal/config" + "github.com/joestump/msgbrowse/internal/store" +) + +// checkDeviceSync reports that device sync is not built into this binary. The +// feature is gated behind the `devicesync` build tag (ADR-0021 / SPEC-0014) and +// excluded from release builds; the full check ladder lives in +// doctor_devices.go under that tag. +func checkDeviceSync(_ context.Context, r *report, _ *config.Config, _ *store.Store) { + r.add(statusPass, "device sync not built into this binary (feature gated behind the `devicesync` build tag)", "") +} diff --git a/internal/cli/doctor_devices_test.go b/internal/cli/doctor_devices_test.go index 90b97a1..fb4feac 100644 --- a/internal/cli/doctor_devices_test.go +++ b/internal/cli/doctor_devices_test.go @@ -1,3 +1,5 @@ +//go:build devicesync + // doctor device-sync rows (#158; SPEC-0014 REQ "Status and Doctor // Surfacing"): each health state — disabled, engine down, healthy, syncing, // paused, errored, peers connected/disconnected — must come out as its own diff --git a/internal/cli/serve.go b/internal/cli/serve.go index 8eb6d2f..8c1a77a 100644 --- a/internal/cli/serve.go +++ b/internal/cli/serve.go @@ -5,21 +5,16 @@ import ( "fmt" "log/slog" "net" - "os" - "os/exec" "os/signal" "strconv" "syscall" "github.com/joestump/msgbrowse/internal/config" - "github.com/joestump/msgbrowse/internal/devsync" "github.com/joestump/msgbrowse/internal/ingest" - "github.com/joestump/msgbrowse/internal/onboard" "github.com/joestump/msgbrowse/internal/onboardsvc" "github.com/joestump/msgbrowse/internal/setup" "github.com/joestump/msgbrowse/internal/source" "github.com/joestump/msgbrowse/internal/store" - "github.com/joestump/msgbrowse/internal/syncthing" "github.com/joestump/msgbrowse/internal/web" "github.com/spf13/cobra" ) @@ -76,29 +71,28 @@ func newServeCommand() *cobra.Command { defer onboardRunner.Shutdown() srv.SetEnabler(onboardRunner) + // Background provider auto-refresh (replaces the retired "Refresh all + // sources" button): re-import each Enabled source's delta on the + // configured cadence. No-op when disabled (providers.refresh_interval + // <= 0); drains with the shared context. + go srv.StartAutoRefresh(ctx, cfg.Providers.RefreshInterval) + // The Settings → LLM tab (#191): saves persist the three llm // keys into the loaded config file and swap the process's live // LLM holder, so a changed endpoint applies without a restart. srv.SetLLMConfig(newLLMApplier(cfg, newLLMHolder(cfg))) - // Device sync (ADR-0021): with device_sync.enabled the - // supervised Syncthing engine runs beside the web UI as a - // context-managed worker — plus the pairing manager behind - // /settings and the folder-watch → re-ingest worker (#157); - // disabled (the default) means no Syncthing process and no P2P - // listener exist at all. - devSync, err := startDeviceSync(ctx, cfg, st, onboardRunner) + // Device sync (ADR-0021) is gated behind the `devicesync` build + // tag — it is NOT compiled into release binaries. wireDeviceSync is + // the real wiring under the tag (supervised Syncthing engine + + // pairing manager + status/roles monitor + folder-watch re-ingest + // worker) and a no-op stub without it; deviceSyncCompiledIn tells + // the web UI whether to render the Device sync surface at all. + srv.SetDeviceSyncFeature(deviceSyncCompiledIn) + syncWait, err := wireDeviceSync(ctx, srv, cfg, st, onboardRunner) if err != nil { return err } - if devSync != nil { - srv.SetPairingSource(devSync.Manager) - // Status + roles + the Logs event feed (#158; SPEC-0014 REQ - // "Status and Doctor Surfacing", REQ "Importer and Replica - // Roles"): the same Manager backs all three seams. - srv.SetSyncMonitor(devSync.Manager) - srv.SetSyncNotes(devSync.Notes.Snapshot) - } // Convenience for local use: open the UI in the default browser once // the listener is up. Best-effort and easily disabled (--open=false) @@ -110,17 +104,15 @@ func newServeCommand() *cobra.Command { // The web UI has stopped (clean shutdown, or Run failed at bind // before any signal arrived). Cancel the shared context so the - // device-sync worker drains too — otherwise Wait() blocks forever + // device-sync worker drains too — otherwise its Wait blocks forever // on a still-serving listener when Run returns an early bind error. // stop() cancels the NotifyContext; the deferred stop() is a no-op. stop() - // Wait for the sync listener's graceful drain (SPEC-0011 - // "Concurrency Safety": no leaked workers on shutdown). - if devSync != nil { - if derr := devSync.Wait(); derr != nil && err == nil { - err = derr - } + // Wait for the sync listener's graceful drain (no leaked workers on + // shutdown); the stub's waiter returns immediately. + if derr := syncWait(); derr != nil && err == nil { + err = derr } return err }, @@ -155,159 +147,6 @@ func resolveListenAddr(cmd *cobra.Command, configured string) (string, error) { return net.JoinHostPort(host, port), nil } -// deviceSyncWorker is the running device-sync engine started by -// startDeviceSync: the supervised Syncthing daemon's loopback REST address, -// the pairing manager the web layer renders /settings from, and a Wait that -// blocks until the supervisor AND the folder-watch worker have fully drained -// (child stopped, no orphan, no leaked goroutine). -type deviceSyncWorker struct { - // Addr is the daemon's loopback REST API address (host:port). - Addr string - // Manager is the pairing surface wired into web.SetPairingSource, and — - // as the SyncMonitor — the status/roles source behind Settings, /status, - // and the Providers cards (#158). - Manager *devsync.Manager - // Notes is the device-sync event feed the Logs page renders (#158). - Notes *devsync.Notes - watcher *devsync.Watcher - done <-chan error -} - -// Wait blocks until the supervision worker and the folder-watch worker have -// exited and returns the supervisor's error. -func (w *deviceSyncWorker) Wait() error { - err := <-w.done - w.watcher.Wait() - return err -} - -// startDeviceSync starts the supervised Syncthing engine as a context-managed -// worker when device_sync.enabled is true, then layers the msgbrowse-owned -// pieces on top (issue #157): the pairing manager (internal/devsync.Manager, -// the /settings PairingSource) and the folder-watch → re-ingest worker -// (devsync.Watcher), which dispatches incremental imports through the shared -// onboard Runner so sync imports respect the same per-source job guard and -// surface in the same Logs view. With device sync disabled — the default — -// it returns (nil, nil) and starts NO process and NO socket, keeping the -// process's socket inventory exactly the loopback web UI (SPEC-0014 "Device -// sync disabled means no Syncthing process"). -// -// Paired peers persist in the repurposed paired_devices table and are folded -// into the generated config on every start (devsync.ApplyPeers), so pairing -// survives restarts even though msgbrowse regenerates Syncthing's config.xml -// each launch. -// -// Binary resolution here is the bring-your-own path (config key, then $PATH), -// mirroring the exporters: only the desktop .app bundles a pinned binary -// (SPEC-0014 REQ "Bundled Syncthing Runtime"; resolution in -// cmd/msgbrowse-desktop). It starts eagerly and fails fast: the operator -// explicitly enabled sync, so a missing engine or a failed start aborts -// serve rather than degrading silently (SPEC-0014 REQ "Error Handling -// Standards"). -// -// Governing: ADR-0021, SPEC-0014 REQ "Supervised Daemon Lifecycle", REQ -// "Pairing via Device ID and QR", REQ "Re-ingest Trigger". -func startDeviceSync(ctx context.Context, cfg *config.Config, st *store.Store, runner *onboard.Runner) (*deviceSyncWorker, error) { - if !cfg.DeviceSync.Enabled { - return nil, nil - } - bin, err := resolveSyncthingBin(cfg) - if err != nil { - return nil, err - } - existing, err := syncthing.ExistingManagedFolders(cfg.DataDir) - if err != nil { - return nil, fmt.Errorf("device sync start failed: %w", err) - } - // The LIVE managed-folder set, shared by the pairing manager and the - // watcher: pairing can provision a managed root a fresh replica lacks, - // and the watcher must see it immediately (SPEC-0014 REQ "Importer and - // Replica Roles"). - folderSet, err := devsync.NewFolderSet(cfg.DataDir, existing) - if err != nil { - return nil, fmt.Errorf("device sync start failed: %w", err) - } - peers, err := st.ListSyncPeers(ctx) - if err != nil { - return nil, fmt.Errorf("device sync start failed: load paired devices: %w", err) - } - folders, peerDevices := devsync.ApplyPeers(existing, peers) - sup, err := syncthing.New(syncthing.Options{ - BinPath: bin, - DataDir: cfg.DataDir, - ListenAddr: cfg.DeviceSync.ListenAddr, - DeviceName: deviceName(cfg), - Folders: folders, - Devices: peerDevices, - Logger: slog.Default(), - }) - if err != nil { - return nil, err - } - if err := sup.Start(ctx); err != nil { - return nil, err - } - - client := sup.Client() - // One shared event ring: the Manager (pair/unpair) and Watcher (imports, - // accepted offers, peer connects) record into it; the Logs page reads it - // (#158; SPEC-0014 REQ "Status and Doctor Surfacing"). - notes := devsync.NewNotes(0) - manager := devsync.NewManager(client, st, deviceName(cfg), folderSet, slog.Default()) - manager.SetNotes(notes) - watcher, err := devsync.NewWatcher(devsync.WatcherOptions{ - API: client, - Store: st, - Importer: runner, - Folders: folderSet, - Notes: notes, - Logger: slog.Default(), - }) - if err != nil { - return nil, fmt.Errorf("device sync start failed: %w", err) - } - watcher.Start(ctx) - - done := make(chan error, 1) - go func() { - err := sup.Wait() - if err != nil && ctx.Err() == nil { - slog.Error("device-sync supervisor failed", "error", err) - } - done <- err - }() - return &deviceSyncWorker{Addr: sup.APIAddr(), Manager: manager, Notes: notes, watcher: watcher, done: done}, nil -} - -// deviceName resolves this node's friendly device name: the configured -// device_sync.device_name, else the hostname. -func deviceName(cfg *config.Config) string { - if cfg.DeviceSync.DeviceName != "" { - return cfg.DeviceSync.DeviceName - } - if host, err := os.Hostname(); err == nil && host != "" { - return host - } - return "msgbrowse" -} - -// resolveSyncthingBin resolves the Syncthing binary for `serve`'s -// bring-your-own path: the device_sync.syncthing_bin config key when set, -// otherwise a $PATH lookup of `syncthing` — exactly the resolution shape the -// exporter *_bin keys use. A miss is the typed ErrBinaryNotFound with -// guidance, never a silent no-op. -func resolveSyncthingBin(cfg *config.Config) (string, error) { - if bin := cfg.DeviceSync.SyncthingBin; bin != "" { - return bin, nil - } - bin, err := exec.LookPath("syncthing") - if err != nil { - return "", fmt.Errorf("device sync start failed: %w: install syncthing or set device_sync.syncthing_bin (the desktop app bundles its own copy)", - syncthing.ErrBinaryNotFound) - } - return bin, nil -} - // ingestOnStart runs a best-effort ingest pass before serving, when configured // and an archive is available. The root is the EFFECTIVE Signal root (the // configured archive_root, else the managed root a desktop onboarding diff --git a/internal/cli/serve_devicesync.go b/internal/cli/serve_devicesync.go new file mode 100644 index 0000000..aff8389 --- /dev/null +++ b/internal/cli/serve_devicesync.go @@ -0,0 +1,202 @@ +//go:build devicesync + +// Device-sync wiring for `msgbrowse serve`, compiled ONLY under the `devicesync` +// build tag (ADR-0021 / SPEC-0014). The feature is not release-ready, so the +// default build excludes this file — and with it the internal/devsync and +// internal/syncthing packages — entirely; serve_nodevicesync.go supplies the +// no-op seam instead. Everything the pre-gate serve.go did inline lives here. +package cli + +import ( + "context" + "fmt" + "log/slog" + "os" + "os/exec" + + "github.com/joestump/msgbrowse/internal/config" + "github.com/joestump/msgbrowse/internal/devsync" + "github.com/joestump/msgbrowse/internal/onboard" + "github.com/joestump/msgbrowse/internal/store" + "github.com/joestump/msgbrowse/internal/syncthing" + "github.com/joestump/msgbrowse/internal/web" +) + +// deviceSyncCompiledIn reports that this binary was built with the device-sync +// feature; the web UI renders the Device sync surface accordingly. +const deviceSyncCompiledIn = true + +// wireDeviceSync starts the device-sync engine (when device_sync.enabled) and +// wires its pairing manager, status/roles monitor, and Logs event feed into the +// web server. It returns a waiter the caller blocks on during shutdown to drain +// the supervisor and folder-watch worker; with sync disabled the waiter is a +// no-op. This is the seam serve.go calls; serve_nodevicesync.go is the stub. +func wireDeviceSync(ctx context.Context, srv *web.Server, cfg *config.Config, st *store.Store, runner *onboard.Runner) (func() error, error) { + worker, err := startDeviceSync(ctx, cfg, st, runner) + if err != nil { + return nil, err + } + if worker == nil { + return func() error { return nil }, nil + } + srv.SetPairingSource(worker.Manager) + // Status + roles + the Logs event feed (#158; SPEC-0014 REQ "Status and + // Doctor Surfacing", REQ "Importer and Replica Roles"): the same Manager + // backs all three seams. + srv.SetSyncMonitor(worker.Manager) + srv.SetSyncNotes(worker.Notes.Snapshot) + return worker.Wait, nil +} + +// deviceSyncWorker is the running device-sync engine started by +// startDeviceSync: the supervised Syncthing daemon's loopback REST address, +// the pairing manager the web layer renders /settings from, and a Wait that +// blocks until the supervisor AND the folder-watch worker have fully drained +// (child stopped, no orphan, no leaked goroutine). +type deviceSyncWorker struct { + // Addr is the daemon's loopback REST API address (host:port). + Addr string + // Manager is the pairing surface wired into web.SetPairingSource, and — + // as the SyncMonitor — the status/roles source behind Settings, /status, + // and the Providers cards (#158). + Manager *devsync.Manager + // Notes is the device-sync event feed the Logs page renders (#158). + Notes *devsync.Notes + watcher *devsync.Watcher + done <-chan error +} + +// Wait blocks until the supervision worker and the folder-watch worker have +// exited and returns the supervisor's error. +func (w *deviceSyncWorker) Wait() error { + err := <-w.done + w.watcher.Wait() + return err +} + +// startDeviceSync starts the supervised Syncthing engine as a context-managed +// worker when device_sync.enabled is true, then layers the msgbrowse-owned +// pieces on top (issue #157): the pairing manager (internal/devsync.Manager, +// the /settings PairingSource) and the folder-watch → re-ingest worker +// (devsync.Watcher), which dispatches incremental imports through the shared +// onboard Runner so sync imports respect the same per-source job guard and +// surface in the same Logs view. With device sync disabled — the default — +// it returns (nil, nil) and starts NO process and NO socket, keeping the +// process's socket inventory exactly the loopback web UI (SPEC-0014 "Device +// sync disabled means no Syncthing process"). +// +// Paired peers persist in the repurposed paired_devices table and are folded +// into the generated config on every start (devsync.ApplyPeers), so pairing +// survives restarts even though msgbrowse regenerates Syncthing's config.xml +// each launch. +// +// Binary resolution here is the bring-your-own path (config key, then $PATH), +// mirroring the exporters: only the desktop .app bundles a pinned binary +// (SPEC-0014 REQ "Bundled Syncthing Runtime"; resolution in +// cmd/msgbrowse-desktop). It starts eagerly and fails fast: the operator +// explicitly enabled sync, so a missing engine or a failed start aborts +// serve rather than degrading silently (SPEC-0014 REQ "Error Handling +// Standards"). +// +// Governing: ADR-0021, SPEC-0014 REQ "Supervised Daemon Lifecycle", REQ +// "Pairing via Device ID and QR", REQ "Re-ingest Trigger". +func startDeviceSync(ctx context.Context, cfg *config.Config, st *store.Store, runner *onboard.Runner) (*deviceSyncWorker, error) { + if !cfg.DeviceSync.Enabled { + return nil, nil + } + bin, err := resolveSyncthingBin(cfg) + if err != nil { + return nil, err + } + existing, err := syncthing.ExistingManagedFolders(cfg.DataDir) + if err != nil { + return nil, fmt.Errorf("device sync start failed: %w", err) + } + // The LIVE managed-folder set, shared by the pairing manager and the + // watcher: pairing can provision a managed root a fresh replica lacks, + // and the watcher must see it immediately (SPEC-0014 REQ "Importer and + // Replica Roles"). + folderSet, err := devsync.NewFolderSet(cfg.DataDir, existing) + if err != nil { + return nil, fmt.Errorf("device sync start failed: %w", err) + } + peers, err := st.ListSyncPeers(ctx) + if err != nil { + return nil, fmt.Errorf("device sync start failed: load paired devices: %w", err) + } + folders, peerDevices := devsync.ApplyPeers(existing, peers) + sup, err := syncthing.New(syncthing.Options{ + BinPath: bin, + DataDir: cfg.DataDir, + ListenAddr: cfg.DeviceSync.ListenAddr, + DeviceName: deviceName(cfg), + Folders: folders, + Devices: peerDevices, + Logger: slog.Default(), + }) + if err != nil { + return nil, err + } + if err := sup.Start(ctx); err != nil { + return nil, err + } + + client := sup.Client() + // One shared event ring: the Manager (pair/unpair) and Watcher (imports, + // accepted offers, peer connects) record into it; the Logs page reads it + // (#158; SPEC-0014 REQ "Status and Doctor Surfacing"). + notes := devsync.NewNotes(0) + manager := devsync.NewManager(client, st, deviceName(cfg), folderSet, slog.Default()) + manager.SetNotes(notes) + watcher, err := devsync.NewWatcher(devsync.WatcherOptions{ + API: client, + Store: st, + Importer: runner, + Folders: folderSet, + Notes: notes, + Logger: slog.Default(), + }) + if err != nil { + return nil, fmt.Errorf("device sync start failed: %w", err) + } + watcher.Start(ctx) + + done := make(chan error, 1) + go func() { + err := sup.Wait() + if err != nil && ctx.Err() == nil { + slog.Error("device-sync supervisor failed", "error", err) + } + done <- err + }() + return &deviceSyncWorker{Addr: sup.APIAddr(), Manager: manager, Notes: notes, watcher: watcher, done: done}, nil +} + +// deviceName resolves this node's friendly device name: the configured +// device_sync.device_name, else the hostname. +func deviceName(cfg *config.Config) string { + if cfg.DeviceSync.DeviceName != "" { + return cfg.DeviceSync.DeviceName + } + if host, err := os.Hostname(); err == nil && host != "" { + return host + } + return "msgbrowse" +} + +// resolveSyncthingBin resolves the Syncthing binary for `serve`'s +// bring-your-own path: the device_sync.syncthing_bin config key when set, +// otherwise a $PATH lookup of `syncthing` — exactly the resolution shape the +// exporter *_bin keys use. A miss is the typed ErrBinaryNotFound with +// guidance, never a silent no-op. +func resolveSyncthingBin(cfg *config.Config) (string, error) { + if bin := cfg.DeviceSync.SyncthingBin; bin != "" { + return bin, nil + } + bin, err := exec.LookPath("syncthing") + if err != nil { + return "", fmt.Errorf("device sync start failed: %w: install syncthing or set device_sync.syncthing_bin (the desktop app bundles its own copy)", + syncthing.ErrBinaryNotFound) + } + return bin, nil +} diff --git a/internal/cli/serve_devicesync_test.go b/internal/cli/serve_devicesync_test.go new file mode 100644 index 0000000..fa15264 --- /dev/null +++ b/internal/cli/serve_devicesync_test.go @@ -0,0 +1,105 @@ +//go:build devicesync + +// Tests for the device-sync wiring compiled only under the `devicesync` build +// tag (serve_devicesync.go). They exercise startDeviceSync's disabled/fail-fast +// behavior and the Syncthing binary resolution; the untagged build has no such +// code, so these live behind the same tag. +package cli + +import ( + "context" + "errors" + "os" + "path/filepath" + "testing" + + "github.com/joestump/msgbrowse/internal/config" + "github.com/joestump/msgbrowse/internal/syncthing" +) + +// testDeviceCfg builds a device-sync-enabled config over a temp data dir. +func testDeviceCfg(t *testing.T, name string) *config.Config { + t.Helper() + return &config.Config{ + DataDir: t.TempDir(), + ListenAddr: "127.0.0.1:8787", + LogLevel: "error", + DeviceSync: config.DeviceSyncConfig{ + Enabled: true, + ListenAddr: "127.0.0.1:0", + DeviceName: name, + }, + } +} + +// TestStartDeviceSyncDisabled: with device_sync.enabled=false (the default), +// startDeviceSync starts nothing — no Syncthing process, no worker — keeping +// the socket inventory exactly the loopback web UI (SPEC-0014 "Device sync +// disabled means no Syncthing process"). Governing: ADR-0021. +func TestStartDeviceSyncDisabled(t *testing.T) { + cfg := testDeviceCfg(t, "disabled-test") + cfg.DeviceSync.Enabled = false + w, err := startDeviceSync(context.Background(), cfg, nil, nil) + if err != nil { + t.Fatalf("startDeviceSync: %v", err) + } + if w != nil { + t.Fatal("startDeviceSync started a worker with device sync disabled") + } + if _, statErr := os.Stat(filepath.Join(cfg.DataDir, syncthing.HomeDirName)); !errors.Is(statErr, os.ErrNotExist) { + t.Error("a syncthing home dir was provisioned with device sync disabled") + } +} + +// TestStartDeviceSyncMissingBinaryFailsFast: the operator explicitly enabled +// sync, so an unresolvable Syncthing binary aborts serve with the typed +// sentinel rather than degrading silently (SPEC-0014 REQ "Error Handling +// Standards"). The supervised lifecycle itself (start/stop/no-orphan/drain) +// is proven against a fake binary in internal/syncthing's suite. +func TestStartDeviceSyncMissingBinaryFailsFast(t *testing.T) { + cfg := testDeviceCfg(t, "missing-bin-test") + t.Setenv("PATH", t.TempDir()) // no syncthing anywhere + w, err := startDeviceSync(context.Background(), cfg, nil, nil) + if !errors.Is(err, syncthing.ErrBinaryNotFound) { + t.Fatalf("err = %v, want syncthing.ErrBinaryNotFound", err) + } + if w != nil { + t.Fatal("worker returned despite the missing binary") + } +} + +// TestResolveSyncthingBin: the device_sync.syncthing_bin config key wins; +// with it empty, `syncthing` is looked up on $PATH (the bring-your-own CLI +// path, mirroring the exporter *_bin keys — the desktop .app never resolves +// via $PATH). Governing: ADR-0021, SPEC-0014 REQ "Bundled Syncthing Runtime". +func TestResolveSyncthingBin(t *testing.T) { + t.Run("config key wins", func(t *testing.T) { + cfg := testDeviceCfg(t, "bin-key") + cfg.DeviceSync.SyncthingBin = "/opt/custom/syncthing" + got, err := resolveSyncthingBin(cfg) + if err != nil || got != "/opt/custom/syncthing" { + t.Fatalf("resolveSyncthingBin = %q, %v", got, err) + } + }) + t.Run("path fallback", func(t *testing.T) { + dir := t.TempDir() + fake := filepath.Join(dir, "syncthing") + if err := os.WriteFile(fake, []byte("#!/bin/sh\n"), 0o755); err != nil { + t.Fatal(err) + } + t.Setenv("PATH", dir) + cfg := testDeviceCfg(t, "bin-path") + got, err := resolveSyncthingBin(cfg) + if err != nil || got != fake { + t.Fatalf("resolveSyncthingBin = %q, %v (want %q)", got, err, fake) + } + }) + t.Run("miss is typed", func(t *testing.T) { + t.Setenv("PATH", t.TempDir()) + cfg := testDeviceCfg(t, "bin-miss") + _, err := resolveSyncthingBin(cfg) + if !errors.Is(err, syncthing.ErrBinaryNotFound) { + t.Fatalf("err = %v, want syncthing.ErrBinaryNotFound", err) + } + }) +} diff --git a/internal/cli/serve_nodevicesync.go b/internal/cli/serve_nodevicesync.go new file mode 100644 index 0000000..5321b39 --- /dev/null +++ b/internal/cli/serve_nodevicesync.go @@ -0,0 +1,28 @@ +//go:build !devicesync + +// Default build: the device-sync feature is NOT compiled in. This stub replaces +// serve_devicesync.go so `msgbrowse serve` links WITHOUT internal/devsync or +// internal/syncthing — device sync (ADR-0021 / SPEC-0014) is unfinished and must +// not ship in release binaries. Build with `-tags devicesync` to include it. +package cli + +import ( + "context" + + "github.com/joestump/msgbrowse/internal/config" + "github.com/joestump/msgbrowse/internal/onboard" + "github.com/joestump/msgbrowse/internal/store" + "github.com/joestump/msgbrowse/internal/web" +) + +// deviceSyncCompiledIn reports that this binary was built WITHOUT the +// device-sync feature; the web UI hides the entire Device sync surface. +const deviceSyncCompiledIn = false + +// wireDeviceSync is the no-op seam for builds without the `devicesync` tag: it +// wires nothing and returns an immediately-returning waiter, so serve.go's +// shutdown path is identical whether or not the feature is compiled in. The +// parameters match the real implementation's signature exactly. +func wireDeviceSync(_ context.Context, _ *web.Server, _ *config.Config, _ *store.Store, _ *onboard.Runner) (func() error, error) { + return func() error { return nil }, nil +} diff --git a/internal/cli/serve_test.go b/internal/cli/serve_test.go index bac00eb..94f232f 100644 --- a/internal/cli/serve_test.go +++ b/internal/cli/serve_test.go @@ -1,31 +1,9 @@ package cli import ( - "context" - "errors" - "os" - "path/filepath" "testing" - - "github.com/joestump/msgbrowse/internal/config" - "github.com/joestump/msgbrowse/internal/syncthing" ) -// testDeviceCfg builds a device-sync-enabled config over a temp data dir. -func testDeviceCfg(t *testing.T, name string) *config.Config { - t.Helper() - return &config.Config{ - DataDir: t.TempDir(), - ListenAddr: "127.0.0.1:8787", - LogLevel: "error", - DeviceSync: config.DeviceSyncConfig{ - Enabled: true, - ListenAddr: "127.0.0.1:0", - DeviceName: name, - }, - } -} - func TestResolveListenAddr(t *testing.T) { const configured = "127.0.0.1:8787" @@ -66,75 +44,3 @@ func TestResolveListenAddr(t *testing.T) { }) } } - -// TestStartDeviceSyncDisabled: with device_sync.enabled=false (the default), -// startDeviceSync starts nothing — no Syncthing process, no worker — keeping -// the socket inventory exactly the loopback web UI (SPEC-0014 "Device sync -// disabled means no Syncthing process"). Governing: ADR-0021. -func TestStartDeviceSyncDisabled(t *testing.T) { - cfg := testDeviceCfg(t, "disabled-test") - cfg.DeviceSync.Enabled = false - w, err := startDeviceSync(context.Background(), cfg, nil, nil) - if err != nil { - t.Fatalf("startDeviceSync: %v", err) - } - if w != nil { - t.Fatal("startDeviceSync started a worker with device sync disabled") - } - if _, statErr := os.Stat(filepath.Join(cfg.DataDir, syncthing.HomeDirName)); !errors.Is(statErr, os.ErrNotExist) { - t.Error("a syncthing home dir was provisioned with device sync disabled") - } -} - -// TestStartDeviceSyncMissingBinaryFailsFast: the operator explicitly enabled -// sync, so an unresolvable Syncthing binary aborts serve with the typed -// sentinel rather than degrading silently (SPEC-0014 REQ "Error Handling -// Standards"). The supervised lifecycle itself (start/stop/no-orphan/drain) -// is proven against a fake binary in internal/syncthing's suite. -func TestStartDeviceSyncMissingBinaryFailsFast(t *testing.T) { - cfg := testDeviceCfg(t, "missing-bin-test") - t.Setenv("PATH", t.TempDir()) // no syncthing anywhere - w, err := startDeviceSync(context.Background(), cfg, nil, nil) - if !errors.Is(err, syncthing.ErrBinaryNotFound) { - t.Fatalf("err = %v, want syncthing.ErrBinaryNotFound", err) - } - if w != nil { - t.Fatal("worker returned despite the missing binary") - } -} - -// TestResolveSyncthingBin: the device_sync.syncthing_bin config key wins; -// with it empty, `syncthing` is looked up on $PATH (the bring-your-own CLI -// path, mirroring the exporter *_bin keys — the desktop .app never resolves -// via $PATH). Governing: ADR-0021, SPEC-0014 REQ "Bundled Syncthing Runtime". -func TestResolveSyncthingBin(t *testing.T) { - t.Run("config key wins", func(t *testing.T) { - cfg := testDeviceCfg(t, "bin-key") - cfg.DeviceSync.SyncthingBin = "/opt/custom/syncthing" - got, err := resolveSyncthingBin(cfg) - if err != nil || got != "/opt/custom/syncthing" { - t.Fatalf("resolveSyncthingBin = %q, %v", got, err) - } - }) - t.Run("path fallback", func(t *testing.T) { - dir := t.TempDir() - fake := filepath.Join(dir, "syncthing") - if err := os.WriteFile(fake, []byte("#!/bin/sh\n"), 0o755); err != nil { - t.Fatal(err) - } - t.Setenv("PATH", dir) - cfg := testDeviceCfg(t, "bin-path") - got, err := resolveSyncthingBin(cfg) - if err != nil || got != fake { - t.Fatalf("resolveSyncthingBin = %q, %v (want %q)", got, err, fake) - } - }) - t.Run("miss is typed", func(t *testing.T) { - t.Setenv("PATH", t.TempDir()) - cfg := testDeviceCfg(t, "bin-miss") - _, err := resolveSyncthingBin(cfg) - if !errors.Is(err, syncthing.ErrBinaryNotFound) { - t.Fatalf("err = %v, want syncthing.ErrBinaryNotFound", err) - } - }) -} diff --git a/internal/config/config.go b/internal/config/config.go index 1f0d053..e094b08 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -58,6 +58,10 @@ type Config struct { // RAG synthesis, and journal digests. LLM LLMConfig `mapstructure:"llm"` + // Providers configures the in-app message-source ("Providers") surface, + // including how often Enabled sources auto-refresh. + Providers ProvidersConfig `mapstructure:"providers"` + // VectorBackend selects the vector store: "sqlite-vec" (default) or "qdrant". VectorBackend string `mapstructure:"vector_backend"` @@ -126,6 +130,16 @@ type DeviceSyncConfig struct { SyncthingBin string `mapstructure:"syncthing_bin"` } +// ProvidersConfig configures the in-app Providers surface. `serve` and the +// desktop shell run a background scheduler that re-imports each Enabled source's +// delta every RefreshInterval, so the archive stays current without a click. +type ProvidersConfig struct { + // RefreshInterval is how often Enabled sources auto-refresh (export + + // incremental import). Zero (or negative) turns auto-refresh off, leaving + // only the per-source manual Refresh control. + RefreshInterval time.Duration `mapstructure:"refresh_interval"` +} + // LLMConfig configures the OpenAI-compatible client. BaseURL is the only network // egress msgbrowse performs; by default it points at a local LiteLLM proxy. type LLMConfig struct { @@ -192,6 +206,11 @@ func SetDefaults(v *viper.Viper) { v.SetDefault("llm.max_concurrency", 4) v.SetDefault("llm.timeout", 60*time.Second) + // Providers auto-refresh: re-import each Enabled source's delta on this + // cadence. 6h keeps archives current without hammering the exporters; set + // providers.refresh_interval to 0 to disable. + v.SetDefault("providers.refresh_interval", 6*time.Hour) + v.SetDefault("vector_backend", "sqlite-vec") v.SetDefault("journal.digest_enabled", true) diff --git a/internal/config/save.go b/internal/config/save.go index 8d45cc2..15a1cd6 100644 --- a/internal/config/save.go +++ b/internal/config/save.go @@ -1,13 +1,14 @@ -// Save-back for the Settings → LLM tab (#191): persist EXACTLY the three -// user-editable llm keys into the YAML config file, touching nothing else. +// Save-back for the Settings → LLM tab (#191): persist the user-editable llm +// keys into the YAML config file, touching nothing else. // // The write is a surgical merge, never a dump: the existing file is parsed -// into a generic map, only llm.base_url / llm.embed_model / llm.chat_model -// are set, and every other key — including a pre-existing llm.api_key, which -// this code never writes — round-trips unchanged. A missing file is created -// containing only the llm block, so the built-in defaults stay defaults -// instead of being frozen into the file. The write is atomic (temp file + -// rename, 0600) so a crash mid-save can never leave a truncated config. +// into a generic map, only llm.base_url / llm.embed_model / llm.chat_model / +// llm.api_key are set, and every other key round-trips unchanged. A missing +// file is created containing only the llm block, so the built-in defaults +// stay defaults instead of being frozen into the file. The write is atomic +// (temp file + rename, 0600) so a crash mid-save can never leave a truncated +// config — and that 0600 mode is why the config file is an acceptable home +// for the key under ADR-0010's loopback single-user trust. package config import ( @@ -18,12 +19,12 @@ import ( yaml "go.yaml.in/yaml/v3" ) -// SaveLLM merges the three user-configurable LLM keys into the YAML config -// file at path, creating the file (and its directory) if absent. It writes -// ONLY llm.base_url, llm.embed_model, and llm.chat_model; unrelated keys and -// any existing llm.api_key are preserved verbatim, and no api_key is ever -// written (the MSGBROWSE_LLM_API_KEY env var is the supported key channel). -func SaveLLM(path, baseURL, embedModel, chatModel string) error { +// SaveLLM merges the user-configurable LLM keys into the YAML config file at +// path, creating the file (and its directory) if absent. It writes +// llm.base_url, llm.embed_model, llm.chat_model, and llm.api_key; unrelated +// keys round-trip verbatim. An empty apiKey is written as an empty value +// (clearing any previous key), so the tab's field is the source of truth. +func SaveLLM(path, baseURL, embedModel, chatModel, apiKey string) error { doc := map[string]any{} b, err := os.ReadFile(path) switch { @@ -47,6 +48,7 @@ func SaveLLM(path, baseURL, embedModel, chatModel string) error { llmBlock["base_url"] = baseURL llmBlock["embed_model"] = embedModel llmBlock["chat_model"] = chatModel + llmBlock["api_key"] = apiKey doc["llm"] = llmBlock out, err := yaml.Marshal(doc) diff --git a/internal/config/save_test.go b/internal/config/save_test.go index 470edc0..9100459 100644 --- a/internal/config/save_test.go +++ b/internal/config/save_test.go @@ -11,11 +11,11 @@ import ( ) // TestSaveLLMCreatesMinimalFile: with no config file present, SaveLLM creates -// one containing ONLY the llm block with the three user-editable keys — never -// a dump of the full default config, and never an api_key. +// one containing ONLY the llm block with the four user-editable keys (Option A +// includes api_key) — never a dump of the full default config. func TestSaveLLMCreatesMinimalFile(t *testing.T) { path := filepath.Join(t.TempDir(), "nested", "config.yaml") - if err := SaveLLM(path, "http://127.0.0.1:11434/v1", "nomic-embed-text", "llama3"); err != nil { + if err := SaveLLM(path, "http://127.0.0.1:11434/v1", "nomic-embed-text", "llama3", "sk-abc123"); err != nil { t.Fatalf("SaveLLM: %v", err) } @@ -34,17 +34,15 @@ func TestSaveLLMCreatesMinimalFile(t *testing.T) { if llmBlock == nil { t.Fatalf("no llm block in %s", b) } - if len(llmBlock) != 3 { - t.Errorf("llm block has %d keys, want exactly 3: %v", len(llmBlock), llmBlock) + if len(llmBlock) != 4 { + t.Errorf("llm block has %d keys, want exactly 4: %v", len(llmBlock), llmBlock) } if llmBlock["base_url"] != "http://127.0.0.1:11434/v1" || llmBlock["embed_model"] != "nomic-embed-text" || - llmBlock["chat_model"] != "llama3" { + llmBlock["chat_model"] != "llama3" || + llmBlock["api_key"] != "sk-abc123" { t.Errorf("llm block = %v", llmBlock) } - if _, ok := llmBlock["api_key"]; ok { - t.Error("SaveLLM wrote an api_key — it must never do that") - } if runtime.GOOS != "windows" { info, err := os.Stat(path) @@ -58,8 +56,10 @@ func TestSaveLLMCreatesMinimalFile(t *testing.T) { } // TestSaveLLMPreservesUnrelatedKeys is the surgical-merge contract: only the -// three llm.* keys change; every unrelated key — top-level and inside the llm -// block (including a pre-existing api_key) — round-trips unchanged. +// managed llm.* keys change; every unrelated key — top-level and inside the +// llm block — round-trips unchanged. The caller preserves an existing api_key +// by passing it back (the web handler does this for a blank field), so here we +// pass the pre-existing key through and confirm it survives. func TestSaveLLMPreservesUnrelatedKeys(t *testing.T) { path := filepath.Join(t.TempDir(), "config.yaml") existing := "" + @@ -75,8 +75,9 @@ func TestSaveLLMPreservesUnrelatedKeys(t *testing.T) { t.Fatal(err) } - // Empty embed model is allowed and means semantic search off. - if err := SaveLLM(path, "https://llm.example/v1", "", "facts-model"); err != nil { + // Empty embed model is allowed and means semantic search off. The caller + // passes the pre-existing key back to preserve it (blank-field semantics). + if err := SaveLLM(path, "https://llm.example/v1", "", "facts-model", "synthetic-placeholder"); err != nil { t.Fatalf("SaveLLM: %v", err) } @@ -117,7 +118,7 @@ func TestSaveLLMPreservesUnrelatedKeys(t *testing.T) { // model overriding the built-in default (semantic search off). func TestSaveLLMRoundTripsThroughLoad(t *testing.T) { path := filepath.Join(t.TempDir(), "config.yaml") - if err := SaveLLM(path, "http://127.0.0.1:8080/v1", "", "my-chat"); err != nil { + if err := SaveLLM(path, "http://127.0.0.1:8080/v1", "", "my-chat", ""); err != nil { t.Fatalf("SaveLLM: %v", err) } v, err := Load(path) @@ -154,7 +155,7 @@ func TestSaveLLMRejectsMalformedExisting(t *testing.T) { if err := os.WriteFile(path, []byte("{not yaml: ["), 0o600); err != nil { t.Fatal(err) } - err := SaveLLM(path, "http://x.invalid/v1", "e", "c") + err := SaveLLM(path, "http://x.invalid/v1", "e", "c", "") if err == nil { t.Fatal("SaveLLM should refuse to overwrite a file it cannot parse") } diff --git a/internal/llm/holder.go b/internal/llm/holder.go index c2858c7..e1bd5ae 100644 --- a/internal/llm/holder.go +++ b/internal/llm/holder.go @@ -13,10 +13,10 @@ import ( ) // Settings are the user-configurable LLM endpoint values the Settings → LLM -// tab edits: the base URL plus the two model names. The API key is -// deliberately absent — per the config posture (internal/config), keys come -// from the MSGBROWSE_LLM_API_KEY environment variable and are never round- -// tripped through the settings surface. +// tab edits: the base URL, the two model names, and the API key. The key is +// editable from the tab and persisted to the config file (a deliberate +// product choice — a desktop user has no convenient env var; the config file +// is 0600, ADR-0010's loopback single-user trust). type Settings struct { // BaseURL is the OpenAI-compatible endpoint — the only network egress // msgbrowse performs (ADR-0010). @@ -27,6 +27,10 @@ type Settings struct { // ChatModel is the completion model ("Facts model" in the UI: the facts // feature consumes it today, the journal digest later). ChatModel string + // APIKey authenticates to a keyed endpoint. Empty for a local proxy that + // needs none. Held in memory and persisted to the config file; it is never + // rendered back into the tab's HTML (the form shows only whether one is set). + APIKey string } // Holder is a swappable Client: it implements the Client interface by @@ -100,17 +104,15 @@ func (h *Holder) Vision(ctx context.Context, image []byte, mimeType, prompt stri // Applier binds a Holder to a persistence function: it is the object the web // layer's Settings → LLM tab drives (web.LLMConfigurator). ApplyLLM persists -// the three user-editable keys FIRST and only then swaps the live client, so -// a failed write leaves the running provider untouched and the page can -// report the error honestly. +// the settings FIRST and only then swaps the live client, so a failed write +// leaves the running provider untouched and the page can report the error +// honestly. // -// The API key and timeout are process-lifetime values captured at wiring time -// (the key comes from MSGBROWSE_LLM_API_KEY / the config file per the -// internal/config posture; neither is editable from the tab), reused for -// every rebuilt client. +// timeout is a process-lifetime value captured at wiring time, reused for +// every rebuilt client. The API key now travels in Settings (editable from +// the tab), so each swap rebuilds the client with the settings' own key. type Applier struct { holder *Holder - apiKey string timeout time.Duration persist func(Settings) error } @@ -118,15 +120,15 @@ type Applier struct { // NewApplier builds an Applier over holder. persist writes the settings to // the mode-appropriate config file (config.SaveLLM behind a path the wiring // layer resolved); a nil persist skips persistence (tests). -func NewApplier(holder *Holder, apiKey string, timeout time.Duration, persist func(Settings) error) *Applier { - return &Applier{holder: holder, apiKey: apiKey, timeout: timeout, persist: persist} +func NewApplier(holder *Holder, timeout time.Duration, persist func(Settings) error) *Applier { + return &Applier{holder: holder, timeout: timeout, persist: persist} } // CurrentLLM returns the settings behind the live client. func (a *Applier) CurrentLLM() Settings { return a.holder.Settings() } -// ApplyLLM persists s and then swaps the live client to one built from it. -// On a persist error nothing is swapped. +// ApplyLLM persists s and then swaps the live client to one built from it — +// including its API key. On a persist error nothing is swapped. func (a *Applier) ApplyLLM(s Settings) error { if a.persist != nil { if err := a.persist(s); err != nil { @@ -135,7 +137,7 @@ func (a *Applier) ApplyLLM(s Settings) error { } a.holder.Swap(New(Options{ BaseURL: s.BaseURL, - APIKey: a.apiKey, + APIKey: s.APIKey, ChatModel: s.ChatModel, EmbedModel: s.EmbedModel, Timeout: a.timeout, diff --git a/internal/llm/holder_test.go b/internal/llm/holder_test.go index e6e3601..f6679ca 100644 --- a/internal/llm/holder_test.go +++ b/internal/llm/holder_test.go @@ -71,7 +71,7 @@ func TestApplierPersistsThenSwaps(t *testing.T) { h := NewHolder(markerClient{marker: 1}, Settings{BaseURL: "http://old.invalid/v1", EmbedModel: "old-embed"}) var persisted []Settings - a := NewApplier(h, "", 0, func(s Settings) error { + a := NewApplier(h, 0, func(s Settings) error { persisted = append(persisted, s) return nil }) @@ -97,7 +97,7 @@ func TestApplierPersistsThenSwaps(t *testing.T) { func TestApplierPersistFailureLeavesHolderUntouched(t *testing.T) { before := Settings{BaseURL: "http://old.invalid/v1", EmbedModel: "old-embed"} h := NewHolder(markerClient{marker: 1}, before) - a := NewApplier(h, "", 0, func(Settings) error { return errors.New("disk full") }) + a := NewApplier(h, 0, func(Settings) error { return errors.New("disk full") }) err := a.ApplyLLM(Settings{BaseURL: "http://new.invalid/v1"}) if err == nil { diff --git a/internal/store/sources.go b/internal/store/sources.go index 0e5b983..142a761 100644 --- a/internal/store/sources.go +++ b/internal/store/sources.go @@ -8,8 +8,37 @@ package store import ( "context" "fmt" + "time" ) +// LastSyncTimes returns the most recent successful ingest time per source — +// the "Last synced" stamp the Providers cards show (auto-refresh and manual +// Refresh both record an ingest_runs row on completion). Keyed by source id; +// sources that have never completed a run are absent. finished_at is stored as +// RFC3339 UTC, so MAX() over the column is a correct chronological pick. +func (s *Store) LastSyncTimes(ctx context.Context) (map[string]time.Time, error) { + rows, err := s.db.QueryContext(ctx, + `SELECT source, MAX(finished_at) FROM ingest_runs GROUP BY source`) + if err != nil { + return nil, fmt.Errorf("last sync times: %w", err) + } + defer rows.Close() + out := make(map[string]time.Time) + for rows.Next() { + var src, finished string + if err := rows.Scan(&src, &finished); err != nil { + return nil, fmt.Errorf("scan last sync time: %w", err) + } + if t, err := time.Parse(time.RFC3339, finished); err == nil { + out[src] = t + } + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("last sync times rows: %w", err) + } + return out, nil +} + // SourceCount is one source's imported footprint: how many conversations and // messages the store holds for it. type SourceCount struct { diff --git a/internal/web/autorefresh.go b/internal/web/autorefresh.go new file mode 100644 index 0000000..6684b70 --- /dev/null +++ b/internal/web/autorefresh.go @@ -0,0 +1,40 @@ +// The background auto-refresh scheduler: msgbrowse re-runs each Enabled source's +// export→incremental-import pipeline on a fixed interval so the archive stays +// current without a manual click (replacing the retired "Refresh all sources" +// button). It reuses refreshEnabledSources (refresh.go), so it inherits the same +// Enabled-source selection, replica skip, and per-source concurrency guard — an +// auto-refresh can never collide with a manual Refresh. +// +// Governing: SPEC-0013 REQ "Refresh" (delta-only, incremental), REQ +// "Concurrency Safety" (one job per source). +package web + +import ( + "context" + "time" +) + +// StartAutoRefresh runs the periodic refresh loop until ctx is cancelled. It is +// a no-op (returns immediately) when no Enabler is wired — browser mode with no +// resolvable exporters has nothing to refresh — or when interval <= 0, the +// explicit "auto-refresh off" setting. The shell starts it in its own goroutine +// after SetEnabler; it does NOT fire an immediate refresh on start (boot +// ingest-on-start already covers launch freshness), only on each tick. +func (s *Server) StartAutoRefresh(ctx context.Context, interval time.Duration) { + if s.enabler == nil || interval <= 0 { + return + } + s.log.Info("provider auto-refresh enabled", "interval", interval.String()) + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + if n := s.refreshEnabledSources(ctx); n > 0 { + s.log.Info("provider auto-refresh started jobs", "sources", n) + } + } + } +} diff --git a/internal/web/devsync_test.go b/internal/web/devsync_test.go index a9527cd..e6ca884 100644 --- a/internal/web/devsync_test.go +++ b/internal/web/devsync_test.go @@ -125,22 +125,18 @@ func TestEnableConflictOnSyncedSource(t *testing.T) { } } -// TestRefreshAllSkipsSyncedSources: the all-sources Refresh never fans out to -// a replica's synced-in source. -func TestRefreshAllSkipsSyncedSources(t *testing.T) { +// TestAutoRefreshSkipsSyncedSources: the auto-refresh scheduler core never fans +// out to a replica's synced-in source. +func TestAutoRefreshSkipsSyncedSources(t *testing.T) { srv, _, _ := newTestServer(t) srv.SetSyncMonitor(replicaMonitor()) enabler := &fakeEnabler{} srv.SetEnabler(enabler) - tok := mintToken(t, srv) - rec := refreshAllPOST(t, srv, selfOrigin, tok) - if rec.Code != http.StatusOK { - t.Fatalf("refresh-all = %d", rec.Code) - } + srv.refreshEnabledSources(context.Background()) for _, src := range enabler.refreshedSources() { if src == "signal" { - t.Error("refresh-all ran the exporter pipeline for a synced-in source") + t.Error("auto-refresh ran the exporter pipeline for a synced-in source") } } } @@ -350,6 +346,7 @@ func TestStatusPageDeviceSyncCard(t *testing.T) { if err != nil { t.Fatal(err) } + srv.SetDeviceSyncFeature(true) srv.SetSyncMonitor(&fakeMonitor{status: &devsync.Status{ Running: true, Peers: []devsync.PeerStatus{ @@ -396,6 +393,7 @@ func TestStatusPageDeviceSyncAbsentStates(t *testing.T) { if err != nil { t.Fatal(err) } + srv2.SetDeviceSyncFeature(true) body = get(t, srv2, "/status").Body.String() if !contains(body, "its state is unavailable") { t.Error("enabled-but-unreadable state missing") diff --git a/internal/web/disable_test.go b/internal/web/disable_test.go index 07f4a0c..a93cb3d 100644 --- a/internal/web/disable_test.go +++ b/internal/web/disable_test.go @@ -203,8 +203,8 @@ func TestEnabledCardShowsCountsAndControls(t *testing.T) { if contains(body, "No sources are ready to enable") { t.Errorf("/providers footer shows the empty state while a source is Enabled") } - if !contains(body, "All detected sources are enabled") { - t.Errorf("/providers footer missing the all-enabled copy") + if !contains(body, "refresh automatically") { + t.Errorf("/providers footer missing the auto-refresh copy") } } diff --git a/internal/web/handlers.go b/internal/web/handlers.go index 0cc5520..fb2890f 100644 --- a/internal/web/handlers.go +++ b/internal/web/handlers.go @@ -177,6 +177,10 @@ type statusData struct { // REQ "Status and Doctor Surfacing" (#158). DeviceSyncEnabled bool Sync *devsync.Status + // DeviceSyncFeature gates the entire Device sync card: false (the default + // release build, feature not compiled in behind the `devicesync` tag) omits + // it so /status carries no dead surface. + DeviceSyncFeature bool } // pageSize is the number of messages per transcript page. @@ -514,6 +518,7 @@ func (s *Server) handleStatus(w http.ResponseWriter, r *http.Request) { SnapshotFootprint: footprint, HasSnapshotPipeline: len(snaps) > 0 || s.signalSnapshotsDirExists(), DeviceSyncEnabled: s.deviceSyncEnabled, + DeviceSyncFeature: s.deviceSyncFeature, Sync: s.syncStatusSnapshot(ctx), }) } diff --git a/internal/web/handlers_test.go b/internal/web/handlers_test.go index c55ba5e..1d4d126 100644 --- a/internal/web/handlers_test.go +++ b/internal/web/handlers_test.go @@ -52,6 +52,12 @@ func newTestServer(t *testing.T) (*Server, *store.Store, string) { if err != nil { t.Fatalf("new server: %v", err) } + // The device-sync surface is gated behind the compile-time feature flag + // (the `devicesync` build tag). The tagged build that supplies the engine + // also enables it; enable it here so the shared helper exercises the + // feature-present behavior the device-sync tests assert. The dedicated + // feature-OFF tests set the flag false explicitly. + srv.SetDeviceSyncFeature(true) return srv, st, archive } diff --git a/internal/web/llmsettings.go b/internal/web/llmsettings.go index 682292b..2e8bba0 100644 --- a/internal/web/llmsettings.go +++ b/internal/web/llmsettings.go @@ -31,6 +31,7 @@ import ( const ( llmBaseURLMaxLen = 2048 llmModelMaxLen = 128 + llmAPIKeyMaxLen = 512 ) // LLMConfigurator is the live-settings seam behind the LLM tab (the @@ -61,6 +62,10 @@ type llmSettingsData struct { BaseURL string EmbedModel string FactsModel string + // HasAPIKey reports whether a key is currently set, so the template can show + // a "key is set" placeholder without ever rendering the secret. The key + // value is NEVER echoed into the form (a blank field means "keep it"). + HasAPIKey bool // SetupToken is the per-session token the form submits through the same // checkSetupPOST gate the Setup POSTs use. SetupToken string @@ -72,12 +77,13 @@ type llmSettingsData struct { ErrBaseURL string ErrEmbedModel string ErrFactsModel string + ErrAPIKey string } // HasErrors reports whether any field failed validation, for the template's // summary banner. func (d llmSettingsData) HasErrors() bool { - return d.ErrBaseURL != "" || d.ErrEmbedModel != "" || d.ErrFactsModel != "" + return d.ErrBaseURL != "" || d.ErrEmbedModel != "" || d.ErrFactsModel != "" || d.ErrAPIKey != "" } // currentLLM resolves the effective settings for display: the live @@ -98,6 +104,7 @@ func (s *Server) handleSettingsLLM(w http.ResponseWriter, r *http.Request) { BaseURL: cur.BaseURL, EmbedModel: cur.EmbedModel, FactsModel: cur.ChatModel, + HasAPIKey: cur.APIKey != "", }) } @@ -112,14 +119,26 @@ func (s *Server) handleSettingsLLMSave(w http.ResponseWriter, r *http.Request) { return // 403 already written; nothing was validated or applied } + // The API key is a password field we never echo, so a BLANK field means + // "keep the current key" — only a non-blank value changes it (the standard + // secret-field UX; it also means the form can't accidentally wipe a key on + // an unrelated save). The effective key is resolved against the live value. + apiKey := strings.TrimSpace(r.PostFormValue("api_key")) + keptKey := apiKey == "" + if keptKey { + apiKey = s.currentLLM().APIKey + } + data := llmSettingsData{ BaseURL: strings.TrimSpace(r.PostFormValue("base_url")), EmbedModel: strings.TrimSpace(r.PostFormValue("embed_model")), FactsModel: strings.TrimSpace(r.PostFormValue("facts_model")), + HasAPIKey: apiKey != "", } data.ErrBaseURL = validateLLMBaseURL(data.BaseURL) data.ErrEmbedModel = validateLLMModel(data.EmbedModel) data.ErrFactsModel = validateLLMModel(data.FactsModel) + data.ErrAPIKey = validateLLMAPIKey(apiKey) if data.HasErrors() { s.renderLLMSettings(w, r, data) return @@ -134,6 +153,7 @@ func (s *Server) handleSettingsLLMSave(w http.ResponseWriter, r *http.Request) { BaseURL: data.BaseURL, EmbedModel: data.EmbedModel, ChatModel: data.FactsModel, + APIKey: apiKey, }); err != nil { s.log.Error("LLM settings save failed", "error", err) data.SaveResult = "error" @@ -141,15 +161,18 @@ func (s *Server) handleSettingsLLMSave(w http.ResponseWriter, r *http.Request) { return } // Endpoint/model names are configuration, never message content — safe to - // log (the API key is not part of Settings at all). + // log. The API key value is NEVER logged; only whether one is set and + // whether this save changed it. s.log.Info("LLM settings saved and applied live", - "base_url", data.BaseURL, "embed_model", data.EmbedModel, "chat_model", data.FactsModel) + "base_url", data.BaseURL, "embed_model", data.EmbedModel, "chat_model", data.FactsModel, + "api_key_set", apiKey != "", "api_key_changed", !keptKey) cur := s.llmConfig.CurrentLLM() s.renderLLMSettings(w, r, llmSettingsData{ BaseURL: cur.BaseURL, EmbedModel: cur.EmbedModel, FactsModel: cur.ChatModel, + HasAPIKey: cur.APIKey != "", SaveResult: "ok", }) } @@ -206,6 +229,22 @@ func validateLLMBaseURL(raw string) string { return "" } +// validateLLMAPIKey checks the API key: bounded length and printable runes +// only (keys are opaque ASCII/base64-ish tokens). Empty is VALID — many local +// proxies need none, and an empty submission means "keep the current key" +// upstream. Returns "" or a fixed error enum ("toolong" / "invalid"). +func validateLLMAPIKey(k string) string { + if len(k) > llmAPIKeyMaxLen { + return "toolong" + } + for _, r := range k { + if !unicode.IsPrint(r) { + return "invalid" + } + } + return "" +} + // validateLLMModel checks a model name: bounded length, printable runes only. // Empty is VALID — an empty embed model means semantic search off, an empty // facts model means the facts/journal features are unconfigured. Returns "" diff --git a/internal/web/llmsettings_test.go b/internal/web/llmsettings_test.go index 311e680..3ae1d73 100644 --- a/internal/web/llmsettings_test.go +++ b/internal/web/llmsettings_test.go @@ -96,12 +96,13 @@ func TestLLMTabRenders(t *testing.T) { if !contains(body, "llm.chat_model") { t.Error("facts-model field missing its llm.chat_model hint") } - // NO API-key input — only the env-var hint (config.go posture). - for _, forbidden := range []string{`name="api_key"`, `type="password"`} { - if contains(body, forbidden) { - t.Errorf("LLM tab must not render an API-key field, found %q", forbidden) + // The API-key input is present as a write-only password field (Option A). + for _, want := range []string{`name="api_key"`, `type="password"`} { + if !contains(body, want) { + t.Errorf("LLM tab missing the API-key field marker %q", want) } } + // The env var is still documented as an override. if !contains(body, "MSGBROWSE_LLM_API_KEY") { t.Error("LLM tab missing the MSGBROWSE_LLM_API_KEY env-var hint") } @@ -265,11 +266,12 @@ func TestLLMSaveValidationRejections(t *testing.T) { } } -// TestLLMSaveHappyPathWritesExactlyThreeKeys drives the REAL stack — handler -// → llm.Applier → config.SaveLLM → llm.Holder — against a pre-existing config -// file: exactly the three llm keys are written, the unrelated pre-existing -// key survives, and the live holder swaps (#191's no-restart contract). -func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { +// TestLLMSaveHappyPathWritesKeys drives the REAL stack — handler → llm.Applier +// → config.SaveLLM → llm.Holder — against a pre-existing config file: the llm +// keys (base URL, both models, AND the submitted api_key, Option A) are +// written, the unrelated pre-existing key survives, and the live holder swaps +// with the new key (#191's no-restart contract). +func TestLLMSaveHappyPathWritesKeys(t *testing.T) { srv, _, _ := newTestServer(t) path := filepath.Join(t.TempDir(), "config.yaml") @@ -279,8 +281,8 @@ func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { holder := llm.NewHolder(llm.New(llm.Options{BaseURL: "http://old.test/v1"}), llm.Settings{ BaseURL: "http://old.test/v1", EmbedModel: "old-embed", ChatModel: "old-chat", }) - srv.SetLLMConfig(llm.NewApplier(holder, "", 0, func(s llm.Settings) error { - return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel) + srv.SetLLMConfig(llm.NewApplier(holder, 0, func(s llm.Settings) error { + return config.SaveLLM(path, s.BaseURL, s.EmbedModel, s.ChatModel, s.APIKey) })) tok := mintToken(t, srv) @@ -288,6 +290,7 @@ func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { "base_url": " http://127.0.0.1:11434/v1 ", // trimmed "embed_model": "nomic-embed-text", "facts_model": "llama3", + "api_key": "sk-test-key-123", }) if rec.Code != http.StatusOK { t.Fatalf("status = %d", rec.Code) @@ -296,17 +299,21 @@ func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { if !contains(body, "LLM settings saved.") { t.Error("missing the saved confirmation") } - // The re-rendered form shows the now-effective (trimmed) values. + // The re-rendered form shows the now-effective (trimmed) values... if !contains(body, `value="http://127.0.0.1:11434/v1"`) { t.Error("saved render missing the trimmed effective base URL") } + // ...but NEVER the secret key value. + if contains(body, "sk-test-key-123") { + t.Error("the API key value must never be rendered back into the page") + } - // Live swap: the holder now reports the new settings. - if got := holder.Settings(); got.BaseURL != "http://127.0.0.1:11434/v1" || got.EmbedModel != "nomic-embed-text" || got.ChatModel != "llama3" { + // Live swap: the holder now reports the new settings, including the key. + if got := holder.Settings(); got.BaseURL != "http://127.0.0.1:11434/v1" || got.EmbedModel != "nomic-embed-text" || got.ChatModel != "llama3" || got.APIKey != "sk-test-key-123" { t.Errorf("holder after save = %+v", got) } - // The file: three keys written, unrelated keys preserved, no api_key. + // The file: llm keys (incl. api_key) written, unrelated keys preserved. raw, err := os.ReadFile(path) if err != nil { t.Fatal(err) @@ -316,6 +323,7 @@ func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { "base_url: http://127.0.0.1:11434/v1", "embed_model: nomic-embed-text", "chat_model: llama3", + "api_key: sk-test-key-123", "data_dir: /custom/data", // unrelated top-level key preserved "max_concurrency: 9", // unrelated llm key preserved } { @@ -323,9 +331,6 @@ func TestLLMSaveHappyPathWritesExactlyThreeKeys(t *testing.T) { t.Errorf("config file missing %q:\n%s", want, out) } } - if contains(out, "api_key") { - t.Errorf("config file gained an api_key:\n%s", out) - } } // TestLLMSaveEmptyEmbedModelAllowed: an empty embed model is valid and means diff --git a/internal/web/pair_test.go b/internal/web/pair_test.go index 6e1c9b9..6dbf554 100644 --- a/internal/web/pair_test.go +++ b/internal/web/pair_test.go @@ -33,6 +33,9 @@ func newPairServer(t *testing.T, ps PairingSource) *Server { if err != nil { t.Fatalf("new server: %v", err) } + // The device-sync UI is gated behind the compile-time feature flag; the + // tagged build that wires pairing also sets it, so mirror that here. + srv.SetDeviceSyncFeature(true) if ps != nil { srv.SetPairingSource(ps) } diff --git a/internal/web/refresh.go b/internal/web/refresh.go index e50ddcc..e69ed4f 100644 --- a/internal/web/refresh.go +++ b/internal/web/refresh.go @@ -1,26 +1,25 @@ // The privileged Setup Refresh flow: POST /setup/refresh re-runs export + -// incremental import for one already-Enabled source, and POST /setup/refresh-all -// fans that out across every Enabled source. Refresh is the SPEC-0013 REQ -// "Refresh": it re-runs the SAME export→adopt→import pipeline as Enable so only -// the delta lands (the importer is incremental + idempotent), reusing the same -// background-job, progress, cancellation, and concurrency machinery — nothing -// here reimplements the pipeline. +// incremental import for one already-Enabled source. Refresh is the SPEC-0013 +// REQ "Refresh": it re-runs the SAME export→adopt→import pipeline as Enable so +// only the delta lands (the importer is incremental + idempotent), reusing the +// same background-job, progress, cancellation, and concurrency machinery. The +// one-shot all-sources control was retired in favor of the background +// auto-refresh scheduler (autorefresh.go), which reuses refreshEnabledSources. // -// Both routes carry the IDENTICAL privileged-POST gate as /setup/enable — +// The route carries the IDENTICAL privileged-POST gate as /setup/enable — // same-origin + per-session token + MaxBytesReader body cap via checkSetupPOST, // unchanged (SPEC-0013 §Security endpoint table: "/setup/refresh … Same as // /setup/enable … Same-origin required"). A failing gate is rejected 403 with NO // job started; an unknown source is a 400. The source is read from the fixed // enum, never a client path. // -// Governing: ADR-0020, SPEC-0013 REQ "Refresh" (per-source + all-sources manual -// refresh, delta-only), REQ "Concurrency Safety" (one job per source; the -// Runner's guard rejects a duplicate same-source job — the all-sources fan-out -// starts one job per DISTINCT source so it can never corrupt via concurrent -// same-source jobs), §Security "Same-origin protection for privileged POSTs". +// Governing: ADR-0020, SPEC-0013 REQ "Refresh" (per-source manual refresh, +// delta-only), REQ "Concurrency Safety" (one job per source; the Runner's guard +// rejects a duplicate same-source job). package web import ( + "context" "errors" "net/http" @@ -70,41 +69,26 @@ func (s *Server) handleSetupRefresh(w http.ResponseWriter, r *http.Request) { s.renderProgress(w, r, src, prog) } -// handleSetupRefreshAll is POST /setup/refresh-all. It refreshes EVERY Enabled -// source: the single all-sources control (SPEC-0013 REQ "Refresh": "an -// all-sources Refresh"). It starts one background job per DISTINCT Enabled source -// via the Runner's per-source job model — so it never spawns two concurrent jobs -// for the same source (the Runner also guards this, per REQ "Concurrency -// Safety"). Each source's own aria-live progress region (which polls -// /setup/status/) then shows that source's live state; this handler -// renders a small summary fragment naming how many sources it kicked off. +// refreshEnabledSources starts a background refresh job for every Enabled, +// non-replica source and returns how many it kicked off. It is the shared core +// behind the auto-refresh scheduler (autorefresh.go): "Enabled" matches the +// Providers cards' signal (setupCardFor) — imported conversations in the store +// (store-presence, the desktop signal where no cfg root is ever set, issue +// #160) OR an explicitly configured archive root. // -// Same privileged gate as the per-source route (it starts export jobs). A failing -// gate is 403 with nothing started. -func (s *Server) handleSetupRefreshAll(w http.ResponseWriter, r *http.Request) { - if !s.checkSetupPOST(w, r) { - return // 403 already written; no job started - } - +// Synced-in sources are skipped: their importer is a paired peer, so refreshing +// here would run the exporters against a replica (#158; SPEC-0014 REQ "Importer +// and Replica Roles"). A source whose job is already running returns +// ErrJobInProgress, which is not an error here. The Runner's per-source guard +// makes this safe to call concurrently with a manual Refresh: at most one job +// per source ever runs. +func (s *Server) refreshEnabledSources(ctx context.Context) int { if s.enabler == nil { - s.renderRefreshAll(w, refreshAllData{Unavailable: true}) - return + return 0 } - - // Kick off one refresh per Enabled source. Enabled matches the Providers - // cards' signal (setupCardFor): imported conversations in the store - // (store-presence — the desktop signal, where no cfg root is ever set, - // issue #160) OR an explicitly configured archive root. Both are app-owned - // values, never request-derived. A source whose job is already running - // returns ErrJobInProgress, which is not an error here: it is simply already - // refreshing, and its own progress region reflects that. Any OTHER - // start-time error is counted as a failure to start. - present := s.sourcesPresent(r.Context()) - // Synced-in sources are skipped outright: their importer is a paired peer, - // and refreshing here would run the exporters against a replica (#158; - // SPEC-0014 REQ "Importer and Replica Roles"). - replicas := s.replicaSources(r.Context()) - var started, alreadyRunning, failed int + present := s.sourcesPresent(ctx) + replicas := s.replicaSources(ctx) + started := 0 for _, src := range source.All { if _, synced := replicas[src]; synced { continue @@ -112,46 +96,14 @@ func (s *Server) handleSetupRefreshAll(w http.ResponseWriter, r *http.Request) { if !present[src] && !s.sourceConfigured(src) { continue } - _, err := s.enabler.Refresh(src) - switch { + switch _, err := s.enabler.Refresh(src); { case err == nil: started++ case errors.Is(err, onboard.ErrJobInProgress): - alreadyRunning++ + // Already refreshing; nothing to do. default: - failed++ - s.log.Warn("setup: refresh-all could not start a source", "source", src, "error", err) + s.log.Warn("auto-refresh: could not start a source", "source", src, "error", err) } } - - s.renderRefreshAll(w, refreshAllData{ - Started: started, - AlreadyRunning: alreadyRunning, - Failed: failed, - None: started == 0 && alreadyRunning == 0 && failed == 0, - }) -} - -// refreshAllData drives the setup_refresh_all_result fragment: the summary of an -// all-sources Refresh kick-off. It is a count-only summary (no request-derived -// text), so html/template escaping is the only encoding needed. The live -// per-source state is announced by each card's own aria-live region, not here. -type refreshAllData struct { - // Started is the number of sources whose refresh job this request started. - Started int - // AlreadyRunning is the number of Enabled sources already refreshing (a job was - // in flight) — coalesced, not an error. - AlreadyRunning int - // Failed is the number of sources whose refresh could not be started. - Failed int - // None is true when no source was Enabled, so nothing was refreshed. - None bool - // Unavailable marks the "no Enabler / no tools" affordance state. - Unavailable bool -} - -// renderRefreshAll renders the all-sources Refresh summary fragment into its -// aria-live region. -func (s *Server) renderRefreshAll(w http.ResponseWriter, data refreshAllData) { - s.renderFragment(w, "setup_refresh_all_result", data) + return started } diff --git a/internal/web/refresh_test.go b/internal/web/refresh_test.go index f3086e6..980d94e 100644 --- a/internal/web/refresh_test.go +++ b/internal/web/refresh_test.go @@ -1,11 +1,10 @@ package web import ( + "context" "io" "log/slog" "net/http" - "net/http/httptest" - "net/url" "path/filepath" "sort" "strings" @@ -136,8 +135,8 @@ func TestRefreshNoEnablerUnavailable(t *testing.T) { } // configuredServer builds a Server whose three sources are all Enabled (each has a -// configured managed archive root), so /setup renders three Enabled cards and the -// all-sources Refresh control, and sourceConfigured reports true for each. +// configured managed archive root), so /setup renders three Enabled cards and +// sourceConfigured reports true for each. func configuredServer(t *testing.T) *Server { t.Helper() st, err := store.Open(filepath.Join(t.TempDir(), "empty.sqlite")) @@ -158,87 +157,36 @@ func configuredServer(t *testing.T) *Server { return srv } -// refreshAllPOST posts /setup/refresh-all with the given origin + token (no -// source — the all-sources route carries none). -func refreshAllPOST(t *testing.T, srv *Server, origin, token string) *httptest.ResponseRecorder { - t.Helper() - form := url.Values{} - if token != "" { - form.Set(setupTokenField, token) - } - req := httptest.NewRequest(http.MethodPost, "/setup/refresh-all", strings.NewReader(form.Encode())) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - if origin != "" { - req.Header.Set("Origin", origin) - } - rec := httptest.NewRecorder() - srv.Handler().ServeHTTP(rec, req) - return rec -} - -// TestRefreshAllCrossOriginRejected: the all-sources route carries the same gate -// — a cross-origin POST is 403 and starts no jobs. -func TestRefreshAllCrossOriginRejected(t *testing.T) { - srv := configuredServer(t) - fe := &fakeEnabler{} - srv.SetEnabler(fe) - - tok := mintToken(t, srv) - rec := refreshAllPOST(t, srv, "http://evil.example", tok) - if rec.Code != http.StatusForbidden { - t.Fatalf("cross-origin refresh-all status = %d, want 403", rec.Code) - } - if fe.refreshCount() != 0 { - t.Fatalf("cross-origin refresh-all started %d jobs, want 0", fe.refreshCount()) - } -} - -// TestRefreshAllMissingTokenRejected: no token is 403 and starts nothing. -func TestRefreshAllMissingTokenRejected(t *testing.T) { - srv := configuredServer(t) - fe := &fakeEnabler{} - srv.SetEnabler(fe) +// The one-shot "Refresh all sources" HTTP endpoint was retired in favor of the +// background auto-refresh scheduler; its selection logic now lives in +// refreshEnabledSources, exercised directly below (no request, no gate). - rec := refreshAllPOST(t, srv, selfOrigin, "") - if rec.Code != http.StatusForbidden { - t.Fatalf("missing-token refresh-all status = %d, want 403", rec.Code) - } - if fe.refreshCount() != 0 { - t.Fatalf("missing-token refresh-all started %d jobs, want 0", fe.refreshCount()) - } -} - -// TestRefreshAllRunsEachEnabledSource is the SPEC-0013 acceptance for the -// all-sources control: with all three sources Enabled, one refresh is started per -// DISTINCT source — exactly one each, never a duplicate for the same source. -func TestRefreshAllRunsEachEnabledSource(t *testing.T) { +// TestRefreshEnabledSourcesRunsEach: with all three sources Enabled, one refresh +// is started per DISTINCT source — exactly one each, never a duplicate. +func TestRefreshEnabledSourcesRunsEach(t *testing.T) { srv := configuredServer(t) fe := &fakeEnabler{} srv.SetEnabler(fe) - tok := mintToken(t, srv) - rec := refreshAllPOST(t, srv, selfOrigin, tok) - if rec.Code != http.StatusOK { - t.Fatalf("refresh-all status = %d, want 200", rec.Code) + started := srv.refreshEnabledSources(context.Background()) + if started != len(source.All) { + t.Fatalf("refreshEnabledSources started %d jobs, want %d (one per enabled source)", started, len(source.All)) } if fe.refreshCount() != int32(len(source.All)) { - t.Fatalf("refresh-all started %d jobs, want %d (one per enabled source)", fe.refreshCount(), len(source.All)) + t.Fatalf("enabler saw %d refresh calls, want %d", fe.refreshCount(), len(source.All)) } got := fe.refreshedSources() sort.Strings(got) want := append([]string(nil), source.All...) sort.Strings(want) if strings.Join(got, ",") != strings.Join(want, ",") { - t.Fatalf("refresh-all refreshed %v, want each of %v exactly once", got, want) - } - if !contains(rec.Body.String(), "Refreshing 3 sources") { - t.Errorf("refresh-all summary missing the started count; got %q", rec.Body.String()) + t.Fatalf("refreshed %v, want each of %v exactly once", got, want) } } -// TestRefreshAllOnlyEnabledSources: a source that is NOT Enabled (no configured -// archive root) is skipped by the all-sources fan-out. -func TestRefreshAllOnlyEnabledSources(t *testing.T) { +// TestRefreshEnabledSourcesOnlyEnabled: a source that is NOT Enabled (no +// configured archive root) is skipped. +func TestRefreshEnabledSourcesOnlyEnabled(t *testing.T) { st, err := store.Open(filepath.Join(t.TempDir(), "empty.sqlite")) if err != nil { t.Fatalf("open store: %v", err) @@ -253,27 +201,33 @@ func TestRefreshAllOnlyEnabledSources(t *testing.T) { fe := &fakeEnabler{} srv.SetEnabler(fe) - tok := mintToken(t, srv) - rec := refreshAllPOST(t, srv, selfOrigin, tok) - if rec.Code != http.StatusOK { - t.Fatalf("refresh-all status = %d, want 200", rec.Code) + if started := srv.refreshEnabledSources(context.Background()); started != 1 { + t.Fatalf("refreshEnabledSources started %d jobs, want 1", started) } if got := fe.refreshedSources(); len(got) != 1 || got[0] != source.Signal { - t.Fatalf("refresh-all refreshed %v, want only [signal]", got) + t.Fatalf("refreshed %v, want only [signal]", got) } } -// TestSetupPageRendersAllSourcesRefreshWhenEnabled: the /setup page renders the -// all-sources Refresh control (and per-Enabled-card Refresh buttons) only when at -// least one source is Enabled. -func TestSetupPageRendersAllSourcesRefreshWhenEnabled(t *testing.T) { +// TestRefreshEnabledSourcesNoEnabler: with no Enabler wired, the scheduler core +// starts nothing rather than panicking. +func TestRefreshEnabledSourcesNoEnabler(t *testing.T) { + srv := configuredServer(t) // no SetEnabler + if started := srv.refreshEnabledSources(context.Background()); started != 0 { + t.Fatalf("refreshEnabledSources with no enabler started %d jobs, want 0", started) + } +} + +// TestSetupPageRendersPerSourceRefreshWhenEnabled: an Enabled card still renders +// its own per-source Refresh control (the all-sources button is gone). +func TestSetupPageRendersPerSourceRefreshWhenEnabled(t *testing.T) { srv := configuredServer(t) fe := &fakeEnabler{} srv.SetEnabler(fe) body := get(t, srv, "/providers").Body.String() - if !contains(body, `hx-post="/setup/refresh-all"`) { - t.Error("/setup with an Enabled source should render the all-sources Refresh control") + if contains(body, `hx-post="/setup/refresh-all"`) { + t.Error("/setup should no longer render the retired all-sources Refresh control") } if !contains(body, `hx-post="/setup/refresh"`) { t.Error("/setup Enabled card should render a per-source Refresh control") @@ -283,15 +237,12 @@ func TestSetupPageRendersAllSourcesRefreshWhenEnabled(t *testing.T) { } } -// TestSetupPageHidesRefreshWhenNoneEnabled: with no source Enabled, neither the -// all-sources control nor a per-source Refresh renders. +// TestSetupPageHidesRefreshWhenNoneEnabled: with no source Enabled, no per-source +// Refresh renders. func TestSetupPageHidesRefreshWhenNoneEnabled(t *testing.T) { srv := newEmptyStoreServer(t) srv.SetDetector(detectorFor(signalPlusIMessageHome(t), false)) body := get(t, srv, "/providers").Body.String() - if contains(body, `hx-post="/setup/refresh-all"`) { - t.Error("/setup with no Enabled source should NOT render the all-sources Refresh control") - } if contains(body, `hx-post="/setup/refresh"`) { t.Error("/setup with no Enabled source should NOT render a per-source Refresh control") } diff --git a/internal/web/server.go b/internal/web/server.go index c1e7499..a889951 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -63,6 +63,7 @@ type Store interface { ListSnapshots(ctx context.Context) ([]store.Snapshot, error) SourcesPresent(ctx context.Context) ([]string, error) SourceCounts(ctx context.Context) (map[string]store.SourceCount, error) + LastSyncTimes(ctx context.Context) (map[string]time.Time, error) DeleteSourceData(ctx context.Context, src string) (int64, error) } @@ -93,6 +94,13 @@ type Server struct { // deviceSyncEnabled mirrors config device_sync.enabled for the /settings // pairing section's absent state (SPEC-0010; payload contract SPEC-0011). deviceSyncEnabled bool + // deviceSyncFeature reports whether the device-sync feature is compiled into + // this binary at all — a COMPILE-TIME flag the shell sets from a + // build-tagged constant (SetDeviceSyncFeature). Device sync is gated behind + // the `devicesync` build tag and NOT built by default, so a release binary + // hides the entire Device sync surface on /settings and /status. False (the + // default) renders those sections as if the feature did not exist. + deviceSyncFeature bool // pairing is the live pairing source for /settings' QR section and the // pair/unpair POSTs; nil until serve / the desktop shell wires // SetPairingSource. @@ -178,6 +186,7 @@ func NewServer(st Store, cfg *config.Config, log *slog.Logger) (*Server, error) BaseURL: cfg.LLM.BaseURL, EmbedModel: cfg.LLM.EmbedModel, ChatModel: cfg.LLM.ChatModel, + APIKey: cfg.LLM.APIKey, }, } tmpl, err := template.New("").Funcs(template.FuncMap{ @@ -260,6 +269,14 @@ func (s *Server) Handler() http.Handler { return s.mux } // it is the desktop shell at construction time and says so once. func (s *Server) SetDesktopChrome(enabled bool) { s.desktopChrome = enabled } +// SetDeviceSyncFeature records whether the device-sync feature is compiled into +// this binary (the `devicesync` build tag). The shell passes a build-tagged +// constant; with the feature absent — the default release build — the +// /settings and /status device-sync sections do not render at all, so an +// unfinished feature never ships a visible-but-dead surface. Call before +// serving; the flag is read-only afterwards. +func (s *Server) SetDeviceSyncFeature(enabled bool) { s.deviceSyncFeature = enabled } + // SetShellNotes wires the desktop shell's diagnostics snapshot (issue #167: // systray/dock startup must be observable on the Logs page, not silent). // fn is called per /logs render and must be safe for concurrent use; the @@ -307,7 +324,6 @@ func (s *Server) routes() http.Handler { // handler by the same-origin + per-session-token check before any work. mux.HandleFunc("POST /setup/enable", s.handleSetupEnable) mux.HandleFunc("POST /setup/refresh", s.handleSetupRefresh) - mux.HandleFunc("POST /setup/refresh-all", s.handleSetupRefreshAll) mux.HandleFunc("POST /setup/cancel", s.handleSetupCancel) mux.HandleFunc("POST /setup/recheck", s.handleSetupRecheck) mux.HandleFunc("POST /setup/disable", s.handleSetupDisable) diff --git a/internal/web/settings.go b/internal/web/settings.go index 35db4ca..4711fdd 100644 --- a/internal/web/settings.go +++ b/internal/web/settings.go @@ -103,6 +103,10 @@ type settingsData struct { // enable-instructions state, true without a payload renders the // engine-not-ready state. DeviceSyncEnabled bool + // DeviceSyncFeature gates the entire Device sync section: false (the default + // release build, feature not compiled in behind the `devicesync` tag) omits + // it wholesale so the settings page carries no dead surface. + DeviceSyncFeature bool // Pairing is non-nil while the sync engine is running and has reported // its device ID. Pairing *settingsPairing @@ -210,6 +214,7 @@ func (s *Server) handleSettings(w http.ResponseWriter, r *http.Request) { MCPConfigJSON: mcp.ClientConfigJSON(endpoint), MCPAddCommand: mcp.ClaudeMCPAddCommand(endpoint), DeviceSyncEnabled: s.deviceSyncEnabled, + DeviceSyncFeature: s.deviceSyncFeature, } if pr := r.URL.Query().Get("pair"); pairResultStates[pr] { data.PairResult = pr diff --git a/internal/web/settings_test.go b/internal/web/settings_test.go index fea4a14..d1ae7ce 100644 --- a/internal/web/settings_test.go +++ b/internal/web/settings_test.go @@ -194,6 +194,43 @@ func TestSettingsDeviceSyncDisabledState(t *testing.T) { } } +// TestSettingsDeviceSyncFeatureGated: with the device-sync feature NOT compiled +// in (the default release build, DeviceSyncFeature=false), the entire Device +// sync section is absent from /settings — no heading, no enable instructions, no +// pairing form — so an unfinished feature ships no visible surface. +func TestSettingsDeviceSyncFeatureGated(t *testing.T) { + st, cfg, _ := newTestStoreAndConfig(t) + srv, err := NewServer(st, cfg, slog.New(slog.NewTextHandler(io.Discard, nil))) + if err != nil { + t.Fatalf("new server: %v", err) + } + // Feature flag left false (its zero value) — the release-build default. + body := get(t, srv, "/settings").Body.String() + if contains(body, "Device sync") { + t.Error("Device sync section rendered while the feature is gated off") + } + if contains(body, "settings-pairing-heading") { + t.Error("pairing section markup present while the feature is gated off") + } + if !contains(body, "MCP server") { + t.Error("MCP section missing — the settings page must still render its other content") + } +} + +// TestStatusDeviceSyncFeatureGated: with the feature gated off, /status omits the +// Device sync card entirely (not even the "off" neutral line). +func TestStatusDeviceSyncFeatureGated(t *testing.T) { + st, cfg, _ := newTestStoreAndConfig(t) + srv, err := NewServer(st, cfg, slog.New(slog.NewTextHandler(io.Discard, nil))) + if err != nil { + t.Fatalf("new server: %v", err) + } + body := get(t, srv, "/status").Body.String() + if contains(body, "Device sync") { + t.Error("Device sync card rendered on /status while the feature is gated off") + } +} + // TestSettingsEnabledNoEngineState: device_sync.enabled=true with no pairing // source answering (engine not up) renders the engine-absent state, QR-free. func TestSettingsEnabledNoEngineState(t *testing.T) { @@ -203,6 +240,7 @@ func TestSettingsEnabledNoEngineState(t *testing.T) { if err != nil { t.Fatalf("new server: %v", err) } + srv.SetDeviceSyncFeature(true) body := get(t, srv, "/settings").Body.String() if !contains(body, "The sync engine is not running.") { t.Error("enabled-without-engine state missing its explanatory text") @@ -228,6 +266,7 @@ func TestSettingsQRRendersDeviceID(t *testing.T) { if err != nil { t.Fatalf("new server: %v", err) } + srv.SetDeviceSyncFeature(true) payload := testPayload(t) srv.SetPairingSource(&staticPairing{p: payload}) @@ -302,6 +341,7 @@ func TestSettingsPairedDevicesList(t *testing.T) { if err != nil { t.Fatalf("new server: %v", err) } + srv.SetDeviceSyncFeature(true) src := &staticPairing{p: testPayload(t)} srv.SetPairingSource(src) diff --git a/internal/web/setup.go b/internal/web/setup.go index 49f4ff1..e360518 100644 --- a/internal/web/setup.go +++ b/internal/web/setup.go @@ -20,6 +20,7 @@ import ( "context" "html/template" "net/http" + "time" "github.com/joestump/msgbrowse/internal/devsync" "github.com/joestump/msgbrowse/internal/setup" @@ -109,6 +110,12 @@ type setupCard struct { // (SHORTID)" — set only in the synced state (#158). Server-composed from // the registry row, never request-derived. SyncedFrom string + // LastSynced is the human-formatted time this source last completed an + // import ("2006-01-02 15:04"), shown on Enabled and Synced cards so the user + // can see how current the archive is. Empty (HasLastSynced=false) when the + // source has never completed a run. + LastSynced string + HasLastSynced bool } // HasSettingsLink reports whether the card's guidance carries a System Settings @@ -140,10 +147,6 @@ type setupData struct { // so the intro can nudge the user toward an action (vs. a pure returning-user // view where everything is Enabled/Not-detected). AnyActionable bool - // AnyEnabled is true when at least one source is Enabled, so the page renders - // the all-sources Refresh control (SPEC-0013 REQ "Refresh": "a single control - // that refreshes every enabled source"). Hidden when nothing is Enabled. - AnyEnabled bool // EnableAvailable reports whether an Enabler is wired (desktop bundle or a // configured $PATH resolver): true renders live Enable buttons, false renders // the "desktop app required / configure tools" affordance (SPEC-0013). @@ -186,20 +189,15 @@ func (s *Server) handleSetup(w http.ResponseWriter, r *http.Request) { } cards := s.setupCards(r.Context(), token) anyActionable := false - anyEnabled := false for _, c := range cards { if c.Actionable { anyActionable = true } - if c.State == setupStateEnabled { - anyEnabled = true - } } s.render(w, r, "setup", setupData{ baseData: base, Cards: cards, AnyActionable: anyActionable, - AnyEnabled: anyEnabled, EnableAvailable: s.enableAvailable(), Token: token, }) @@ -225,13 +223,31 @@ func (s *Server) setupCards(ctx context.Context, token string) []setupCard { present := s.sourcesPresent(ctx) counts := s.sourceCounts(ctx) replicas := s.replicaSources(ctx) + lastSync := s.lastSyncTimes(ctx) cards := make([]setupCard, 0, len(source.All)) for _, src := range source.All { - cards = append(cards, s.setupCardFor(det, src, token, present, counts, replicas)) + card := s.setupCardFor(det, src, token, present, counts, replicas) + if t, ok := lastSync[src]; ok { + card.LastSynced = t.Local().Format("2006-01-02 15:04") + card.HasLastSynced = true + } + cards = append(cards, card) } return cards } +// lastSyncTimes reads the per-source last-import timestamps for the Providers +// cards' "Last synced" line. A store error is logged and yields nil — the cards +// simply omit the line, never a 500. +func (s *Server) lastSyncTimes(ctx context.Context) map[string]time.Time { + times, err := s.store.LastSyncTimes(ctx) + if err != nil { + s.log.Warn("setup: could not read last sync times from store", "error", err) + return nil + } + return times +} + // setupCardFor builds a single source's card. Enabled short-circuits detection: // an imported/configured source is already live in the app regardless of what // the current machine's filesystem probes report (the archive may have been diff --git a/internal/web/setup_security.go b/internal/web/setup_security.go index f725685..bd7d3ab 100644 --- a/internal/web/setup_security.go +++ b/internal/web/setup_security.go @@ -2,7 +2,7 @@ // (SPEC-0013 §Security "Same-origin protection for privileged POSTs"). The // read-only /setup GET renders detection cards under the ADR-0010 loopback // single-user trust and needs no token; but /setup/enable (and /setup/refresh, -// /setup/refresh-all, /setup/recheck, which reuse this gate) spawns a bundled +// /setup/recheck, which reuse this gate) spawns a bundled // exporter that reads a personal database — a privileged local action that MUST // NOT be triggerable cross-origin, even under loopback, because another local // process or a malicious page loaded in a browser could otherwise drive the diff --git a/internal/web/setup_test.go b/internal/web/setup_test.go index 5f3440a..1495f41 100644 --- a/internal/web/setup_test.go +++ b/internal/web/setup_test.go @@ -107,8 +107,12 @@ func TestSetupFullPageRendersCards(t *testing.T) { t.Errorf("full /setup missing card %q", want) } } - if n := strings.Count(body, `class="setup-card `); n != 3 { - t.Errorf("full /setup rendered %d source cards, want 3", n) + // Three real source cards plus the Telegram "coming soon" placeholder = 4. + if n := strings.Count(body, `class="setup-card `); n != 4 { + t.Errorf("full /setup rendered %d cards, want 4 (3 sources + Telegram coming-soon)", n) + } + if !contains(body, `aria-label="Telegram: coming soon"`) { + t.Errorf("full /setup missing the Telegram coming-soon card") } } @@ -325,10 +329,11 @@ func TestBuiltCSSCarriesSetupComponents(t *testing.T) { ".setup-guide-steps", ".setup-guide-result", ".setup-guide-close:focus-visible", // keyboard focus on the close control - // All-sources Refresh control (#135): the drift guard must carry the new - // classes so a stale app.css cannot ship the refresh control unstyled. - ".setup-refresh-all", - ".setup-refresh-all-result", + // Providers 2×2 grid + Telegram "coming soon" card: the drift guard must + // carry the new classes so a stale app.css cannot ship them unstyled. + ".setup-card-coming-soon", + ".setup-badge-coming-soon", + ".src-telegram", } { if !strings.Contains(out, want) { t.Errorf("built app.css missing %q (rebuild: rm -rf .tools && make css)", want) diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 9556c90..82ce9b8 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -1,2 +1,9 @@ /*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-500:oklch(58.5% .233 277.117);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-500:oklch(64.5% .246 16.439);--color-black:#000;--spacing:.25rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:"";inherits:true;initial-value:0%}@property --aura-angle{syntax:"";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}:where(:root),:root:has(input.theme-controller[value=slate]:checked),[data-theme=slate]{color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=slate-light]:checked),[data-theme=slate-light]{color-scheme:light;--color-base-100:#f7f9fc;--color-base-200:#eef2f8;--color-base-300:#e2e8f1;--color-base-content:#1a2330;--color-primary:#3f63ad;--color-primary-content:#f7f9fc;--color-secondary:#5b7cc0;--color-secondary-content:#f7f9fc;--color-accent:#3f63ad;--color-accent-content:#f7f9fc;--color-neutral:#cdd6e3;--color-neutral-content:#1a2330;--color-info:#2563eb;--color-info-content:#f7f9fc;--color-success:#15803d;--color-success-content:#f7f9fc;--color-warning:#b7791f;--color-warning-content:#f7f9fc;--color-error:#be123c;--color-error-content:#f7f9fc;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}@layer components;@layer utilities{@layer daisyui.l1.l2{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;align-items:normal;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:hover .diff-item-2:after{height:2.4rem}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.drawer-open>.drawer-side{overflow-y:auto}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-inset,50% auto);inset-block:auto var(--tt-off)}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-tail-inset,50% auto);inset-block:auto var(--tt-tail)}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-hover-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:var(--btn-hover-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-hover-border,var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:var(--btn-hover-border,color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)))}}.btn:hover{--btn-border-style:solid;--btn-inset:var(--btn-hover-inset,0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%)));--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000))}}}.btn:active:not(.btn-active){translate:0 var(--btn-active-translate,.5px);--btn-bg:var(--btn-active-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:var(--btn-active-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%))}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-active-border,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:var(--btn-active-border,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:var(--btn-active-inset,0 0 0 0 oklch(0% 0 0/0));--btn-shadow:var(--btn-active-shadow,0 0 0 0 oklch(0% 0 0/0))}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}:where(.navbar){position:relative}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E")}@media (prefers-reduced-motion:no-preference){.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}}@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete, visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:oklch(0% 0 0/.4);place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}@supports (color:color-mix(in lab, red, red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){will-change:auto;transform:none}:where(:root:has(.drawer-toggle:checked)){--page-scroll-lock: }.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dock{z-index:1;background-color:var(--color-base-100);color:currentColor;border-top:.5px solid var(--color-base-content);flex-direction:row;justify-content:space-around;align-items:center;width:100%;padding:.5rem;display:flex;position:fixed;bottom:0;left:0;right:0}@supports (color:color-mix(in lab, red, red)){.dock{border-top:.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)}}.dock{height:4rem;height:calc(4rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom)}.dock>*{cursor:pointer;border-radius:var(--radius-box);background-color:#0000;flex-direction:column;flex-shrink:1;flex-basis:100%;justify-content:center;align-items:center;gap:1px;max-width:8rem;height:100%;margin-bottom:.5rem;transition:opacity .2s ease-out;display:flex;position:relative}@media (hover:hover){.dock>:hover{opacity:.8}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{opacity:1}.dock>* .dock-label{font-size:.6875rem}.dock>:after{content:"";background-color:#0000;border-top:3px solid #0000;border-radius:3.40282e38px;width:1.5rem;height:.25rem;transition:background-color .1s ease-out,text-color .1s ease-out,width .1s ease-out;position:absolute;bottom:.2rem}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:"00\a 01\a 02\a 03\a 04\a 05\a 06\a 07\a 08\a 09\a 10\a 11\a 12\a 13\a 14\a 15\a 16\a 17\a 18\a 19\a 20\a 21\a 22\a 23\a 24\a 25\a 26\a 27\a 28\a 29\a 30\a 31\a 32\a 33\a 34\a 35\a 36\a 37\a 38\a 39\a 40\a 41\a 42\a 43\a 44\a 45\a 46\a 47\a 48\a 49\a 50\a 51\a 52\a 53\a 54\a 55\a 56\a 57\a 58\a 59\a 60\a 61\a 62\a 63\a 64\a 65\a 66\a 67\a 68\a 69\a 70\a 71\a 72\a 73\a 74\a 75\a 76\a 77\a 78\a 79\a 80\a 81\a 82\a 83\a 84\a 85\a 86\a 87\a 88\a 89\a 90\a 91\a 92\a 93\a 94\a 95\a 96\a 97\a 98\a 99\a ";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s;height:auto;overflow:revert-layer}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input input::-webkit-inner-spin-button{margin-inline-end:-.15em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{direction:ltr}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-inline-end:-.75rem;margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.chat-bubble{border-radius:var(--radius-field);background-color:var(--color-base-300);width:fit-content;color:var(--color-base-content);grid-row-end:3;min-width:2.5rem;max-width:90%;min-height:2rem;padding-block:.5rem;padding-inline:1rem;display:block;position:relative}.chat-bubble:before{background-color:inherit;content:"";width:.75rem;height:.75rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-chat);-webkit-mask-image:var(--mask-chat);mask-image:var(--mask-chat);position:absolute;bottom:0;-webkit-mask-position:0 -1px;mask-position:0 -1px;-webkit-mask-size:.8125rem;mask-size:.8125rem}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0, 1fr)) auto var(--timeline-row-end,minmax(0, 1fr));grid-template-columns:var(--timeline-col-start,minmax(0, 1fr)) auto var(--timeline-col-end,minmax(0, 1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem) * 10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>:not(script,style,template){place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>:not(script,style,template){place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border) dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)}}.stat:not(:last-child){border-block-end:none}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}}@layer daisyui.l1{.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset):not([type=checkbox])) :not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.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}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\[\"\+\"54px\]{top:"+"54px}.right-4{right:calc(var(--spacing) * 4)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;--join-v:0;--join-h:1;align-items:stretch;display:inline-flex}@scope(.join){:scope>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){:scope>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}:scope :where(:scope>:first-child){--join-ss:var(--radius-field);--join-se:calc(var(--radius-field) * var(--join-v));--join-es:calc(var(--radius-field) * var(--join-h));--join-ee:0}:scope :where(:scope>:last-child){--join-ss:0;--join-se:calc(var(--radius-field) * var(--join-h));--join-es:calc(var(--radius-field) * var(--join-v));--join-ee:var(--radius-field)}:scope :where(:scope>:only-child){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.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}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.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-8{margin-bottom:calc(var(--spacing) * 8)}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-\[1\.15em\]{width:1.15em;height:1.15em}.h-full{height:100%}.min-h-0{min-height:0}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-base-300{border-color:var(--color-base-300)}.border-neutral{border-color:var(--color-neutral)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-base-100,.bg-base-100\/90{background-color:var(--color-base-100)}@supports (color:color-mix(in lab, red, red)){.bg-base-100\/90{background-color:color-mix(in oklab, var(--color-base-100) 90%, transparent)}}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.p-3{padding:calc(var(--spacing) * 3)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-base-content{color:var(--color-base-content)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.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,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:48rem){@layer daisyui.l1.l2.l3{.md\:drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.md\:drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}}@layer daisyui.l1.l2{.md\:drawer-open>.drawer-side{overflow-y:auto}.md\:drawer-open>.drawer-toggle{display:none}.md\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.md\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.md\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}}@layer daisyui.l1{.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}}.md\:hidden{display:none}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media (min-width:64rem){.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)}}}:root{--color-whatsapp:#25d366}[data-theme=slate-light]{--color-whatsapp:#128c7e}:root{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, monospace}html{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tabular-nums{font-variant-numeric:tabular-nums}.thumb{max-width:220px;max-height:220px}.lightbox{display:none}.lightbox:target{z-index:50;background:oklab(0% none none/.85);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:1.5rem;display:flex;position:fixed;inset:0}.lightbox img{border-radius:.5rem;max-width:92vw;max-height:80vh}.msg-quote{border-left:3px solid}@supports (color:color-mix(in lab, red, red)){.msg-quote{border-left:3px solid color-mix(in oklab, currentColor 35%, transparent)}}.msg-quote{opacity:.75;margin:.25rem 0;padding:.1rem 0 .1rem .6rem;font-size:.95em}@keyframes target-flash{0%{background-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}to{background-color:#0000}}.target.msg-row,.target.sys-event{animation:2.5s ease-out target-flash}.theme-switching *{transition:none!important}body{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-shell{flex:1 1 0;grid-template-rows:minmax(0,1fr);min-height:0}.app-shell>.drawer-content{flex-direction:column;min-height:0;display:flex;overflow:hidden}#main-content{flex:1 1 0;min-height:0;overflow-y:auto}#main-content:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}@media (min-width:48rem){.app-shell>.drawer-side{height:100%;overflow-y:hidden}}.app-toolbar{background:var(--color-base-300);flex-shrink:0;grid-template-columns:minmax(0,1fr) auto 1fr;align-items:center;column-gap:.5rem;height:52px;min-height:52px;display:grid}@supports (color:color-mix(in lab, red, red)){.app-toolbar{background:color-mix(in oklab, var(--color-base-300) 80%, transparent)}}.app-toolbar{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);border-bottom:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.app-toolbar{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 85%, transparent)}}.app-toolbar{--wails-draggable:drag}.app-toolbar a,.app-toolbar button,.app-toolbar label,.app-toolbar form,.app-toolbar input,.app-toolbar nav{--wails-draggable:no-drag}.toolbar-cluster{align-items:center;gap:.5rem;display:flex}.toolbar-cluster-left{min-width:0}.toolbar-cluster-right{justify-content:flex-end}@media (min-width:48rem){.desktop-chrome .app-toolbar{padding-left:80px}}.toolbar-title{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em;min-width:0;color:var(--color-base-content);padding:0 .25rem;font-size:15px;font-weight:700;overflow:hidden}@media (prefers-reduced-motion:no-preference){.toolbar-title{transition:color .12s}}.toolbar-title:hover{color:var(--color-primary)}.header-tabs{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tabs{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.header-tab{height:28px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .8rem;font-size:13px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.header-tab{white-space:nowrap;text-decoration:none}.header-tab:hover{color:var(--color-base-content)}.header-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.header-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.toolbar-icon-btn{width:34px;height:34px;color:var(--color-base-content);border:1px solid #0000;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.toolbar-icon-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.toolbar-icon-btn{transition:background-color .12s,color .12s,border-color .12s}}.toolbar-icon-btn:hover{color:var(--color-base-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.toolbar-icon-btn:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toolbar-icon-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (min-width:48rem){.app-toolbar label[for=nav-drawer]{display:none}}@media (min-width:40rem){.toolbar-search-link{display:none}}@media (max-width:39.9375rem){.app-toolbar{column-gap:.25rem;padding-inline:.5rem}.toolbar-cluster{gap:.25rem}.header-tab{padding:0 .55rem}}.toolbar-search{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:9999px;flex:0 auto;align-items:center;gap:.4rem;min-width:0;height:34px;padding:0 .6rem}@supports (color:color-mix(in lab, red, red)){.toolbar-search{background:color-mix(in oklab, var(--color-base-100) 70%, transparent)}}.toolbar-search{color:var(--color-base-content)}.toolbar-search:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-search:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toolbar-search:focus-within{background:var(--color-base-100)}.toolbar-search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:15px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.toolbar-search-input{width:auto;min-width:3rem;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:12rem;font-size:13px}.toolbar-search-input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.toolbar-search-input::placeholder{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.sidebar-filter{border:1px solid var(--color-neutral);background:var(--color-base-100);height:36px;color:var(--color-base-content);border-radius:.5rem;padding:0 .625rem}.sidebar-filter:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sidebar-filter:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.sidebar-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.sidebar-section-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-item{content-visibility:auto;contain-intrinsic-size:auto 52px}.conv-row{border-left:3px solid #0000;border-radius:.5rem;align-items:center;gap:.75rem;padding:.5rem .625rem;display:flex;position:relative}@media (prefers-reduced-motion:no-preference){.conv-row{transition:background-color .12s}}.conv-row:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.conv-row:hover{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}.conv-row-selected,.conv-row-selected:hover{border-left-color:var(--color-primary);background:#1b2330}[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:color-mix(in oklab, var(--color-primary) 12%, var(--color-base-300))}}.conv-name{color:var(--color-base-content);font-size:14px;font-weight:600}.conv-count{color:var(--color-base-content);flex-shrink:0;font-size:11px}@supports (color:color-mix(in lab, red, red)){.conv-count{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-preview{color:var(--color-base-content);font-size:12.5px;display:block}@supports (color:color-mix(in lab, red, red)){.conv-preview{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.conv-preview-sender{color:var(--color-base-content);font-weight:600}@supports (color:color-mix(in lab, red, red)){.conv-preview-sender{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.avatar-mono{color:#fff;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:12px;font-weight:600;line-height:1;display:inline-flex;position:relative}.presence-dot{border:2px solid var(--color-base-300);box-sizing:border-box;border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-1px}.presence-dot.src-signal{background:var(--color-info)}.presence-dot.src-imessage{background:var(--color-success)}.presence-dot.src-whatsapp{background:var(--color-whatsapp)}.presence-dot.src-unknown{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.presence-dot.src-unknown{background:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.source-pill{background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:.25rem;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}.source-pill.src-signal{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-signal{border-color:color-mix(in oklab, var(--color-primary) 35%, transparent)}}.source-pill.src-imessage{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{color:color-mix(in oklab, var(--color-success) 80%, white)}}.source-pill.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-imessage{color:var(--color-success)}.source-pill.src-whatsapp{color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{color:color-mix(in oklab, var(--color-whatsapp) 80%, white)}}.source-pill.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-whatsapp{color:var(--color-whatsapp)}.source-pill.src-unknown{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-unknown{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.source-pill.src-unknown{border-color:var(--color-neutral)}.conv-header-top{align-items:center;gap:.75rem;display:flex}.conv-header .avatar-mono{width:44px;height:44px;font-size:15px}.conv-header .presence-dot{border-color:var(--color-base-100)}.conv-title{letter-spacing:-.02em;color:var(--color-base-content);text-overflow:ellipsis;white-space:nowrap;font-size:22px;font-weight:700;line-height:1.15;overflow:hidden}@media (min-width:1024px){.conv-title{font-size:25px}}.conv-ids{flex-wrap:wrap;align-items:center;gap:.375rem;margin-top:.25rem;display:flex}.id-chip{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;gap:.3rem;padding:1px .5rem;font-size:11.5px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.id-chip{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.id-chip{background:0 0}.conv-meta{color:var(--color-base-content);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.625rem;font-size:12.5px;display:flex}@supports (color:color-mix(in lab, red, red)){.conv-meta{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.conv-meta-sep{opacity:.6}.meta-chip{color:var(--color-base-content);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.meta-chip{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.meta-chip:first-of-type{margin-left:.25rem}a.meta-chip:hover{color:var(--color-base-content)}.pin-btn{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:8px;align-items:center;gap:.35rem;padding:.25rem .625rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.pin-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.pin-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.pin-btn{transition:background .12s,color .12s,border-color .12s}}.pin-btn:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.pin-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.pin-btn-active{color:var(--color-primary-content);background:var(--color-primary);border-color:var(--color-primary)}.pin-btn-active:hover{color:var(--color-primary-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{background:color-mix(in oklab, var(--color-primary) 88%, black)}}.pin-btn-active:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{border-color:color-mix(in oklab, var(--color-primary) 88%, black)}}.transcript{max-width:calc(719px + 1.5rem)}.day-sep{align-items:center;gap:.75rem;margin:1.25rem 0 .75rem;display:flex}.day-sep:before,.day-sep:after{content:"";background:var(--color-neutral);flex:1;height:1px}@supports (color:color-mix(in lab, red, red)){.day-sep:before,.day-sep:after{background:color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.day-sep span{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);flex-shrink:0;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.day-sep span{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.sys-event{text-align:center;font-family:var(--font-mono);color:var(--color-base-content);margin:.5rem 0;padding:.15rem 0;font-size:12px;font-style:italic}@supports (color:color-mix(in lab, red, red)){.sys-event{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.msg-row,.sys-event{content-visibility:auto;contain-intrinsic-size:auto 2.2rem}.msg-row.target,.sys-event.target,.msg-row:target,.sys-event:target{content-visibility:visible}.msg-row{border-left:2px solid #0000;border-radius:0 6px 6px 0;grid-template-columns:76px 3px minmax(0,640px);align-items:start;column-gap:.75rem;padding:.2rem .5rem .2rem 0;display:grid}.msg-row-grouped{padding-top:.05rem}.msg-time{white-space:nowrap;color:var(--color-base-content);grid-column:1;justify-self:end;padding-top:.12rem;font-size:11px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.msg-time{color:color-mix(in oklab, var(--color-base-content) 32%, transparent)}}.msg-rail{border-radius:2px;grid-column:2;align-self:stretch;width:3px;min-height:1.1rem}.msg-rail.rail-me{background:var(--color-primary)}.msg-body{grid-column:3;min-width:0}.msg-sender{color:var(--color-base-content);font-size:12.5px;font-weight:600;line-height:1.3}@supports (color:color-mix(in lab, red, red)){.msg-sender{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.msg-sender-me{color:var(--color-secondary)}[data-theme=slate-light] .msg-sender-me{color:var(--color-primary)}.msg-text{color:var(--color-base-content);font-size:14px;line-height:1.55}.msg-row-me{border-left-color:var(--color-primary);background:#6f93d60d}[data-theme=slate-light] .msg-row-me{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .msg-row-me{background:color-mix(in oklab, var(--color-primary) 7%, transparent)}}.msg-attachments,.msg-links{flex-wrap:wrap;gap:.5rem;margin-top:.4rem;display:flex}.msg-thumb{border-radius:.5rem;display:inline-flex;overflow:hidden}.msg-thumb .thumb{border-radius:.5rem}.attach-chip{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:6px;align-items:center;gap:.35rem;max-width:100%;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.attach-chip{background:color-mix(in oklab, var(--color-base-content) 3%, transparent)}}.attach-chip{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.attach-chip{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}@media (prefers-reduced-motion:no-preference){.attach-chip{transition:border-color .12s,color .12s}}.attach-chip:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.attach-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.attach-chip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.link-pill{border:1px solid var(--color-primary);border-radius:6px;align-items:center;gap:.35rem;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-pill{border:1px solid color-mix(in oklab, var(--color-primary) 35%, transparent)}}.link-pill{color:var(--color-primary);background:var(--color-primary);font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-pill{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}@media (prefers-reduced-motion:no-preference){.link-pill{transition:background-color .12s,border-color .12s}}.link-pill:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{background:color-mix(in oklab, var(--color-primary) 12%, transparent)}}.link-pill:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, transparent)}}.msg-reactions{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.reaction-badge{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:999px;align-items:center;gap:.2rem;padding:.1rem .45rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.reaction-badge{background:color-mix(in oklab, var(--color-base-content) 4%, transparent)}}.reaction-badge{cursor:default;font-size:12px;line-height:1.4}.reaction-emoji{font-size:13px}.reaction-count{color:var(--color-base-content);font-size:11px}@supports (color:color-mix(in lab, red, red)){.reaction-count{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.screen-col{width:100%;max-width:780px;margin-inline:auto}.notice-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;padding:.95rem 1rem;display:block}.lightbox-close{color:#fff}.lightbox-caption{color:#fffc}.eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.eyebrow{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.screen-h1{letter-spacing:-.02em;color:var(--color-base-content);font-size:21px;font-weight:700;line-height:1.15}@media (min-width:1024px){.screen-h1{font-size:24px}}.screen-sub{color:var(--color-base-content);margin-top:.25rem;font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.screen-sub{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.home-hero-title{letter-spacing:-.025em;color:var(--color-base-content);font-size:38px;font-weight:700;line-height:1.05}.home-hero-tagline{color:var(--color-base-content);margin-top:.6rem;font-size:15px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.home-hero-tagline{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-strip{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;grid-template-columns:repeat(3,minmax(0,1fr));display:grid;overflow:hidden}.stat-cell{padding:1rem 1.1rem}.stat-cell+.stat-cell{border-left:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-left:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.stat-cell-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.stat-cell-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.stat-cell-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.4rem;font-size:28px;font-weight:700;line-height:1.1}.stat-cell-value-sm{font-size:14.5px;font-weight:600}@media (max-width:640px){.stat-strip{grid-template-columns:1fr}.stat-cell+.stat-cell{border-left:0;border-top:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-top:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}}.link-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;align-items:flex-start;gap:.75rem;padding:.95rem 1rem;display:flex}@media (prefers-reduced-motion:no-preference){.link-card{transition:background-color .12s,border-color .12s}}.link-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{background:color-mix(in oklab, var(--color-primary) 6%, var(--color-base-200))}}.link-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.link-card-icon{width:34px;height:34px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.link-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.link-card-icon{font-size:16px}.link-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.link-card-sub{color:var(--color-base-content);margin-top:.15rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-card-sub{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.search-field{border:1px solid var(--color-neutral);background:var(--color-base-200);height:48px;color:var(--color-base-content);border-radius:.75rem;align-items:center;gap:.6rem;padding:0 .9rem;display:flex}.search-field:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.search-field:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.search-field .search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:18px}@supports (color:color-mix(in lab, red, red)){.search-field .search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.search-field input{min-width:0;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:1;font-size:16px}.search-field input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.search-field input::placeholder{color:color-mix(in oklab, var(--color-base-content) 38%, transparent)}}.filter-row{flex-wrap:wrap;align-items:flex-end;gap:.6rem;display:flex}.filter-control{flex-direction:column;gap:.2rem;display:flex}.filter-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.filter-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.filter-input{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;padding:0 .55rem;font-size:13px}.filter-input:focus{border-color:var(--color-primary);outline:none}@supports (color:color-mix(in lab, red, red)){.filter-input:focus{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toggle-chip{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;align-items:center;gap:.35rem;padding:0 .7rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toggle-chip{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.toggle-chip{cursor:pointer;-webkit-user-select:none;user-select:none;font-size:13px}@media (prefers-reduced-motion:no-preference){.toggle-chip{transition:background-color .12s,color .12s,border-color .12s}}.toggle-chip:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toggle-chip input{appearance:none;border:1px solid;border-radius:3px;flex-shrink:0;width:13px;height:13px;position:relative}.toggle-chip input:checked{background:currentColor}.toggle-chip:has(input:checked){color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.toggle-chip:has(input:checked){background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.btn-search{background:var(--color-primary);height:34px;color:var(--color-primary-content);cursor:pointer;border:0;border-radius:.5rem;padding:0 1.1rem;font-size:13px;font-weight:600}@media (prefers-reduced-motion:no-preference){.btn-search{transition:filter .12s}}.btn-search:hover{filter:brightness(1.08)}.results-meta{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.results-meta{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.results-empty{color:var(--color-base-content);font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.results-empty{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.result-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.8rem .9rem;display:block}@media (prefers-reduced-motion:no-preference){.result-card{transition:background-color .12s,border-color .12s}}.result-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{background:color-mix(in oklab, var(--color-primary) 5%, var(--color-base-200))}}.result-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.result-card-top{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card-top{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.result-head{flex-wrap:wrap;align-items:center;gap:.4rem .5rem;display:flex}.result-conv{color:var(--color-base-content);font-size:13px;font-weight:600}.result-sender{color:var(--color-base-content);font-size:12.5px}@supports (color:color-mix(in lab, red, red)){.result-sender{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.result-ts{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:11.5px}@supports (color:color-mix(in lab, red, red)){.result-ts{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.result-spacer{flex:1}.result-glyph{color:var(--color-base-content);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.result-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.avatar-mono.avatar-sm{border-radius:6px;width:26px;height:26px;font-size:10px}.result-snippet{color:var(--color-base-content);margin-top:.4rem;font-size:13.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.result-snippet{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.result-snippet{word-break:break-word}.result-snippet mark,.search-mark mark{color:#f0d28a;background:#e8b84b47;border-radius:3px;padding:0 .12rem}[data-theme=slate-light] .result-snippet mark,[data-theme=slate-light] .search-mark mark{color:var(--color-warning)}.media-tabs{border-bottom:1px solid var(--color-neutral);align-items:center;gap:.25rem;display:flex}.media-tab{color:var(--color-base-content);border-bottom:2px solid #0000;align-items:center;gap:.4rem;margin-bottom:-1px;padding:.5rem .75rem;font-size:13.5px;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.media-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@media (prefers-reduced-motion:no-preference){.media-tab{transition:color .12s,border-color .12s}}.media-tab:hover{color:var(--color-base-content)}.media-tab-active,.media-tab-active:hover{color:var(--color-base-content);border-bottom-color:var(--color-primary)}.media-tab-badge{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.media-tab-badge{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.media-tab-active .media-tab-badge{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-tab-active .media-tab-badge{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.media-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem;display:grid}@media (min-width:640px){.media-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.media-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.media-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.media-tile{aspect-ratio:1;border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:9px;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.media-tile{transition:opacity .12s}}.media-tile:hover{opacity:.88}.media-tile img{object-fit:cover;width:100%;height:100%}.media-tile-scrim{pointer-events:none;background:linear-gradient(#0000,#000000b8);padding:1.4rem .5rem .4rem;position:absolute;inset:auto 0 0}.media-tile-name{font-family:var(--font-mono);color:#ffffffd9;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;display:block;overflow:hidden}.media-tile-placeholder{text-align:center;color:var(--color-base-content);flex-direction:column;justify-content:center;align-items:center;gap:.3rem;padding:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.media-tile-placeholder{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#1a1f26 0 9px,#161a20 9px 18px)}[data-theme=slate-light] .media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#e2e8f1 0 9px,#eef2f8 9px 18px)}.media-tile-placeholder .ph-name{font-family:var(--font-mono);word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:10px;line-height:1.2;display:-webkit-box;overflow:hidden}.media-tile-placeholder .ph-tag{border:1px solid var(--color-neutral);border-radius:5px;padding:0 .35rem;font-size:9.5px}.media-list{flex-direction:column;gap:.5rem;display:flex}.media-list-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.7rem .85rem}@media (prefers-reduced-motion:no-preference){.media-list-card{transition:border-color .12s}}.media-list-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-list-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.media-file-name{color:var(--color-base-content);align-items:center;gap:.4rem;font-size:13.5px;font-weight:500;display:inline-flex}.media-file-name:hover{color:var(--color-primary)}.media-card-meta{color:var(--color-base-content);margin-top:.25rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.media-card-meta{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.media-card-meta a{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.media-card-meta a{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.media-card-meta a:hover{color:var(--color-primary)}.media-link-url{color:var(--color-primary);word-break:break-all;font-size:13px;display:block}.media-link-url:hover{text-decoration:underline}.link-group-head{align-items:center;gap:.5rem;margin-bottom:.4rem;display:flex}.link-group-domain{color:var(--color-base-content);font-size:13.5px;font-weight:600}.link-group-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.link-group-count{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.settings-subnav{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-subnav{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.settings-tab{height:26px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .7rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.settings-tab{white-space:nowrap;text-decoration:none}.settings-tab:hover{color:var(--color-base-content)}.settings-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.settings-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.status-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;padding:1.1rem 1.2rem}.status-card-title{color:var(--color-base-content);margin-bottom:.85rem;font-size:14px;font-weight:600}.status-note{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.status-note{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.status-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem 1.1rem;display:grid}@media (min-width:640px){.status-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.status-metric-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-metric-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-metric-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.2rem;font-size:14px}.status-table{border-collapse:collapse;width:100%;font-size:13px}.status-table th{text-align:left;letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);padding:.45rem .6rem;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-table th{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-table th{border-bottom:1px solid var(--color-neutral)}.status-table td{border-bottom:1px solid var(--color-neutral);padding:.5rem .6rem}@supports (color:color-mix(in lab, red, red)){.status-table td{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 55%, transparent)}}.status-table td{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.status-table td{color:color-mix(in oklab, var(--color-base-content) 80%, transparent)}}.status-table tr:last-child td{border-bottom:0}.status-table .mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tier-pill{border:1px solid #0000;border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;display:inline-flex}.tier-pill.tier-daily{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-daily{border-color:color-mix(in oklab, var(--color-info) 35%, transparent)}}.tier-pill.tier-monthly{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{color:color-mix(in oklab, var(--color-success) 80%, white)}}.tier-pill.tier-monthly{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .tier-pill.tier-monthly{color:var(--color-success)}.tier-pill.tier-quarterly,.tier-pill.tier-yearly{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-quarterly,.tier-pill.tier-yearly{border-color:color-mix(in oklab, var(--color-warning) 35%, transparent)}}.tier-pill.tier-never{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-never{border-color:color-mix(in oklab, var(--color-error) 35%, transparent)}}.copy-block{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:.5rem;position:relative}.copy-pre{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem 3rem .65rem .85rem;font-size:12.5px;line-height:1.6;overflow-x:auto}@supports (color:color-mix(in lab, red, red)){.copy-pre{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.copy-btn{border:1px solid var(--color-neutral);background:var(--color-base-200);width:1.9rem;height:1.9rem;color:var(--color-base-content);border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:.4rem;right:.4rem}@supports (color:color-mix(in lab, red, red)){.copy-btn{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.copy-btn{cursor:pointer}@media (prefers-reduced-motion:no-preference){.copy-btn{transition:background-color .12s,color .12s}}.copy-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.copy-btn:hover{background:color-mix(in oklab, var(--color-primary) 10%, var(--color-base-200))}}.copy-btn:hover{color:var(--color-base-content)}.copy-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.copy-btn .icon-check,.copy-btn.copied .icon-copy{display:none}.copy-btn.copied .icon-check{color:var(--color-success);display:inline-flex}.qr-panel{flex-wrap:wrap;align-items:flex-start;gap:1.1rem;display:flex}.qr-img{border:1px solid var(--color-neutral);image-rendering:pixelated;border-radius:.5rem;flex-shrink:0}.qr-panel-text{flex:16rem}.setup-cards{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.setup-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;align-items:flex-start;gap:.85rem;padding:1rem 1.1rem;display:flex}.setup-card-not-detected{opacity:.72}.setup-card-icon{width:38px;height:38px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.setup-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.setup-card-icon.src-signal{color:var(--color-info);background:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.setup-card-icon.src-signal{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{border-color:color-mix(in oklab, var(--color-info) 25%, transparent)}}.setup-card-icon.src-imessage{color:var(--color-success);background:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{background:color-mix(in oklab, var(--color-success) 10%, transparent)}}.setup-card-icon.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{border-color:color-mix(in oklab, var(--color-success) 25%, transparent)}}.setup-card-icon.src-whatsapp{color:var(--color-whatsapp);background:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{background:color-mix(in oklab, var(--color-whatsapp) 10%, transparent)}}.setup-card-icon.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 25%, transparent)}}.setup-card-body{flex:1}.setup-card-head{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.setup-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.setup-card-detail{color:var(--color-base-content);margin-top:.25rem;font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-card-detail{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-card-actions{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;margin-top:.7rem;display:flex}.setup-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-badge-enabled{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{color:color-mix(in oklab, var(--color-success) 80%, white)}}.setup-badge-enabled{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{border-color:color-mix(in oklab, var(--color-success) 35%, transparent)}}[data-theme=slate-light] .setup-badge-enabled{color:var(--color-success)}.setup-badge-ready{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-badge-ready{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.setup-badge-needs-permission{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.setup-badge-needs-permission{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.setup-badge-not-detected{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-badge-not-detected{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-badge-not-detected{border-color:var(--color-neutral)}.setup-badge-synced{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-badge-synced{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.sync-badge{border:1px solid var(--color-neutral);white-space:nowrap;color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.sync-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.sync-badge-ok{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.sync-badge-ok{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.sync-badge-warn{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.sync-badge-warn{border-color:color-mix(in oklab, var(--color-warning) 45%, var(--color-neutral))}}.sync-badge-err{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.sync-badge-err{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.sync-badge-info{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sync-badge-info{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.setup-btn{border:1px solid var(--color-primary);background:var(--color-primary);height:32px;color:var(--color-primary-content);cursor:pointer;border-radius:.5rem;padding:0 .95rem;font-size:12.5px;font-weight:600}@media (prefers-reduced-motion:no-preference){.setup-btn{transition:filter .12s}}.setup-btn:hover:not(:disabled){filter:brightness(1.08)}.setup-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-btn:disabled{cursor:not-allowed;opacity:.55;color:var(--color-base-content);background:0 0}@supports (color:color-mix(in lab, red, red)){.setup-btn:disabled{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-btn:disabled{border-color:var(--color-neutral)}.setup-note{color:var(--color-base-content);align-items:center;gap:.3rem;font-size:12px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-note{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-note-ok{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-note-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-note-ok{color:var(--color-success)}.setup-note-warn{color:var(--color-warning)}.setup-footnote{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-footnote{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.setup-refresh-all{flex-wrap:wrap;align-items:center;gap:.65rem;display:flex}.setup-refresh-all-result{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-refresh-all-result{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.setup-refresh-all-result:empty{display:none}.setup-progress{margin-top:.55rem}.setup-progress:empty{display:none}.setup-progress-state{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;display:flex}.setup-progress-line{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-progress-line{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.setup-progress-line{margin:0}.setup-progress-ok{color:var(--color-success);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-progress-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-progress-ok{color:var(--color-success)}.setup-progress-err{color:var(--color-error)}.setup-progress-warn{color:var(--color-warning)}.setup-progress-unavailable{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.setup-progress-unavailable{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-progress-spin{border:2px solid var(--color-primary);border-radius:50%;width:14px;height:14px}@supports (color:color-mix(in lab, red, red)){.setup-progress-spin{border:2px solid color-mix(in oklab, var(--color-primary) 30%, transparent)}}.setup-progress-spin{border-top-color:var(--color-primary);flex:none}@media (prefers-reduced-motion:no-preference){.setup-progress-spin{animation:.7s linear infinite setup-progress-spin}}@keyframes setup-progress-spin{to{transform:rotate(360deg)}}.setup-btn-ghost{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0;align-items:center;gap:.3rem;display:inline-flex}.setup-btn-ghost:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-btn-ghost:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-btn-danger{border-color:var(--color-error);background:var(--color-error);color:var(--color-error-content,#fff)}.setup-btn-danger:focus-visible{outline-color:var(--color-error)}.setup-iconbtn{border:1px solid var(--color-neutral);width:26px;height:26px;color:var(--color-base-content);background:0 0;border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.setup-iconbtn{cursor:pointer;flex:none}.setup-iconbtn:hover:not(:disabled){background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-iconbtn:hover:not(:disabled){color:var(--color-base-content)}.setup-iconbtn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-iconbtn:disabled{cursor:not-allowed;opacity:.45}.setup-guide{z-index:60;justify-content:center;align-items:center;padding:1.25rem;display:flex;position:fixed;inset:0}.setup-guide[hidden]{display:none}.setup-guide-backdrop{background:var(--color-base-300);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.setup-guide-backdrop{background:color-mix(in oklab, var(--color-base-300) 78%, black)}}.setup-guide-backdrop{opacity:.7}.setup-guide-panel{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.9rem;width:min(30rem,100%);max-height:calc(100vh - 2.5rem);padding:1.15rem 1.25rem 1.25rem;position:relative;overflow-y:auto;box-shadow:0 18px 48px -12px oklab(0% none none/.55)}.setup-guide-head{justify-content:space-between;align-items:flex-start;gap:.75rem;display:flex}.setup-guide-title{color:var(--color-base-content);margin:0;font-size:15px;font-weight:600}.setup-guide-close{width:30px;height:30px;color:var(--color-base-content);background:0 0;border:1px solid #0000;border-radius:.5rem;flex:none;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-guide-close{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-guide-close{cursor:pointer}.setup-guide-close:hover{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-close:hover{background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-close:hover{color:var(--color-base-content)}.setup-guide-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-guide-summary{color:var(--color-base-content);margin-top:.5rem;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.setup-guide-summary{color:color-mix(in oklab, var(--color-base-content) 68%, transparent)}}.setup-guide-steps{color:var(--color-base-content);flex-direction:column;gap:.4rem;margin:.85rem 0 0;padding-left:1.25rem;font-size:12.5px;line-height:1.5;list-style:decimal;display:flex}.setup-guide-actions{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;margin-top:1.1rem;display:flex}.setup-guide-settings{align-items:center;gap:.35rem;text-decoration:none;display:inline-flex}.setup-guide-recheck{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0}.setup-guide-recheck:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-recheck:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-result{color:var(--color-warning);margin:.7rem 0 0;font-size:12px;line-height:1.5}.setup-guide-result:empty{display:none}.log-entry-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.log-entry-title{color:var(--color-base-content);font-size:15px;font-weight:600}.log-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:.4rem;padding:.1rem .5rem;font-size:11px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.log-badge{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.log-badge{white-space:nowrap}.log-badge-failed{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.log-badge-failed{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.log-badge-done{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.log-badge-done{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.log-badge-active{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.log-badge-active{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.log-status-line{color:var(--color-base-content);margin:.55rem 0 0;font-size:13px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.log-status-line{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.log-meta{gap:.4rem;margin-top:.7rem;display:grid}.log-meta-row{grid-template-columns:7.5rem 1fr;gap:.5rem;font-size:12.5px;line-height:1.5;display:grid}.log-meta-label{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-label{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.log-meta-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-value{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.log-meta-value{overflow-wrap:anywhere}.log-output{max-height:16rem;font-family:var(--font-mono);white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem .85rem;font-size:12px;line-height:1.55;overflow:auto}@supports (color:color-mix(in lab, red, red)){.log-output{color:color-mix(in oklab, var(--color-base-content) 85%, transparent)}}.log-empty{color:var(--color-base-content);font-size:13px}@supports (color:color-mix(in lab, red, red)){.log-empty{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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-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} \ 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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-500:oklch(58.5% .233 277.117);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-500:oklch(64.5% .246 16.439);--color-black:#000;--spacing:.25rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:"";inherits:true;initial-value:0%}@property --aura-angle{syntax:"";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}:where(:root),:root:has(input.theme-controller[value=slate]:checked),[data-theme=slate]{color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=slate-light]:checked),[data-theme=slate-light]{color-scheme:light;--color-base-100:#f7f9fc;--color-base-200:#eef2f8;--color-base-300:#e2e8f1;--color-base-content:#1a2330;--color-primary:#3f63ad;--color-primary-content:#f7f9fc;--color-secondary:#5b7cc0;--color-secondary-content:#f7f9fc;--color-accent:#3f63ad;--color-accent-content:#f7f9fc;--color-neutral:#cdd6e3;--color-neutral-content:#1a2330;--color-info:#2563eb;--color-info-content:#f7f9fc;--color-success:#15803d;--color-success-content:#f7f9fc;--color-warning:#b7791f;--color-warning-content:#f7f9fc;--color-error:#be123c;--color-error-content:#f7f9fc;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}@layer components;@layer utilities{@layer daisyui.l1.l2{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;align-items:normal;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:hover .diff-item-2:after{height:2.4rem}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.drawer-open>.drawer-side{overflow-y:auto}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-inset,50% auto);inset-block:auto var(--tt-off)}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-tail-inset,50% auto);inset-block:auto var(--tt-tail)}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-hover-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:var(--btn-hover-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-hover-border,var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:var(--btn-hover-border,color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)))}}.btn:hover{--btn-border-style:solid;--btn-inset:var(--btn-hover-inset,0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%)));--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000))}}}.btn:active:not(.btn-active){translate:0 var(--btn-active-translate,.5px);--btn-bg:var(--btn-active-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:var(--btn-active-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%))}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-active-border,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:var(--btn-active-border,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:var(--btn-active-inset,0 0 0 0 oklch(0% 0 0/0));--btn-shadow:var(--btn-active-shadow,0 0 0 0 oklch(0% 0 0/0))}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}:where(.navbar){position:relative}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E")}@media (prefers-reduced-motion:no-preference){.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}}@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete, visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:oklch(0% 0 0/.4);place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}@supports (color:color-mix(in lab, red, red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){will-change:auto;transform:none}:where(:root:has(.drawer-toggle:checked)){--page-scroll-lock: }.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dock{z-index:1;background-color:var(--color-base-100);color:currentColor;border-top:.5px solid var(--color-base-content);flex-direction:row;justify-content:space-around;align-items:center;width:100%;padding:.5rem;display:flex;position:fixed;bottom:0;left:0;right:0}@supports (color:color-mix(in lab, red, red)){.dock{border-top:.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)}}.dock{height:4rem;height:calc(4rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom)}.dock>*{cursor:pointer;border-radius:var(--radius-box);background-color:#0000;flex-direction:column;flex-shrink:1;flex-basis:100%;justify-content:center;align-items:center;gap:1px;max-width:8rem;height:100%;margin-bottom:.5rem;transition:opacity .2s ease-out;display:flex;position:relative}@media (hover:hover){.dock>:hover{opacity:.8}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{opacity:1}.dock>* .dock-label{font-size:.6875rem}.dock>:after{content:"";background-color:#0000;border-top:3px solid #0000;border-radius:3.40282e38px;width:1.5rem;height:.25rem;transition:background-color .1s ease-out,text-color .1s ease-out,width .1s ease-out;position:absolute;bottom:.2rem}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:"00\a 01\a 02\a 03\a 04\a 05\a 06\a 07\a 08\a 09\a 10\a 11\a 12\a 13\a 14\a 15\a 16\a 17\a 18\a 19\a 20\a 21\a 22\a 23\a 24\a 25\a 26\a 27\a 28\a 29\a 30\a 31\a 32\a 33\a 34\a 35\a 36\a 37\a 38\a 39\a 40\a 41\a 42\a 43\a 44\a 45\a 46\a 47\a 48\a 49\a 50\a 51\a 52\a 53\a 54\a 55\a 56\a 57\a 58\a 59\a 60\a 61\a 62\a 63\a 64\a 65\a 66\a 67\a 68\a 69\a 70\a 71\a 72\a 73\a 74\a 75\a 76\a 77\a 78\a 79\a 80\a 81\a 82\a 83\a 84\a 85\a 86\a 87\a 88\a 89\a 90\a 91\a 92\a 93\a 94\a 95\a 96\a 97\a 98\a 99\a ";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s;height:auto;overflow:revert-layer}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input input::-webkit-inner-spin-button{margin-inline-end:-.15em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{direction:ltr}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-inline-end:-.75rem;margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.chat-bubble{border-radius:var(--radius-field);background-color:var(--color-base-300);width:fit-content;color:var(--color-base-content);grid-row-end:3;min-width:2.5rem;max-width:90%;min-height:2rem;padding-block:.5rem;padding-inline:1rem;display:block;position:relative}.chat-bubble:before{background-color:inherit;content:"";width:.75rem;height:.75rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-chat);-webkit-mask-image:var(--mask-chat);mask-image:var(--mask-chat);position:absolute;bottom:0;-webkit-mask-position:0 -1px;mask-position:0 -1px;-webkit-mask-size:.8125rem;mask-size:.8125rem}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0, 1fr)) auto var(--timeline-row-end,minmax(0, 1fr));grid-template-columns:var(--timeline-col-start,minmax(0, 1fr)) auto var(--timeline-col-end,minmax(0, 1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem) * 10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>:not(script,style,template){place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>:not(script,style,template){place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border) dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)}}.stat:not(:last-child){border-block-end:none}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}}@layer daisyui.l1{.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset):not([type=checkbox])) :not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.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}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\[\"\+\"54px\]{top:"+"54px}.right-4{right:calc(var(--spacing) * 4)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;--join-v:0;--join-h:1;align-items:stretch;display:inline-flex}@scope(.join){:scope>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){:scope>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}:scope :where(:scope>:first-child){--join-ss:var(--radius-field);--join-se:calc(var(--radius-field) * var(--join-v));--join-es:calc(var(--radius-field) * var(--join-h));--join-ee:0}:scope :where(:scope>:last-child){--join-ss:0;--join-se:calc(var(--radius-field) * var(--join-h));--join-es:calc(var(--radius-field) * var(--join-v));--join-ee:var(--radius-field)}:scope :where(:scope>:only-child){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.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}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.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-8{margin-bottom:calc(var(--spacing) * 8)}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-\[1\.15em\]{width:1.15em;height:1.15em}.h-full{height:100%}.min-h-0{min-height:0}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-base-300{border-color:var(--color-base-300)}.border-neutral{border-color:var(--color-neutral)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-base-100,.bg-base-100\/90{background-color:var(--color-base-100)}@supports (color:color-mix(in lab, red, red)){.bg-base-100\/90{background-color:color-mix(in oklab, var(--color-base-100) 90%, transparent)}}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.p-3{padding:calc(var(--spacing) * 3)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-base-content{color:var(--color-base-content)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.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,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:48rem){@layer daisyui.l1.l2.l3{.md\:drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.md\:drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}}@layer daisyui.l1.l2{.md\:drawer-open>.drawer-side{overflow-y:auto}.md\:drawer-open>.drawer-toggle{display:none}.md\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.md\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.md\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}}@layer daisyui.l1{.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}}.md\:hidden{display:none}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media (min-width:64rem){.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)}}}:root{--color-whatsapp:#25d366}[data-theme=slate-light]{--color-whatsapp:#128c7e}:root{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, monospace}html{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tabular-nums{font-variant-numeric:tabular-nums}.thumb{max-width:220px;max-height:220px}.lightbox{display:none}.lightbox:target{z-index:50;background:oklab(0% none none/.85);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:1.5rem;display:flex;position:fixed;inset:0}.lightbox img{border-radius:.5rem;max-width:92vw;max-height:80vh}.msg-quote{border-left:3px solid}@supports (color:color-mix(in lab, red, red)){.msg-quote{border-left:3px solid color-mix(in oklab, currentColor 35%, transparent)}}.msg-quote{opacity:.75;margin:.25rem 0;padding:.1rem 0 .1rem .6rem;font-size:.95em}@keyframes target-flash{0%{background-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}to{background-color:#0000}}.target.msg-row,.target.sys-event{animation:2.5s ease-out target-flash}.theme-switching *{transition:none!important}body{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-shell{flex:1 1 0;grid-template-rows:minmax(0,1fr);min-height:0}.app-shell>.drawer-content{flex-direction:column;min-height:0;display:flex;overflow:hidden}#main-content{flex:1 1 0;min-height:0;overflow-y:auto}#main-content:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}@media (min-width:48rem){.app-shell>.drawer-side{height:100%;overflow-y:hidden}}.app-toolbar{background:var(--color-base-300);flex-shrink:0;grid-template-columns:minmax(0,1fr) auto 1fr;align-items:center;column-gap:.5rem;height:52px;min-height:52px;display:grid}@supports (color:color-mix(in lab, red, red)){.app-toolbar{background:color-mix(in oklab, var(--color-base-300) 80%, transparent)}}.app-toolbar{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);border-bottom:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.app-toolbar{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 85%, transparent)}}.app-toolbar{--wails-draggable:drag}.app-toolbar a,.app-toolbar button,.app-toolbar label,.app-toolbar form,.app-toolbar input,.app-toolbar nav{--wails-draggable:no-drag}.toolbar-cluster{align-items:center;gap:.5rem;display:flex}.toolbar-cluster-left{min-width:0}.toolbar-cluster-right{justify-content:flex-end}@media (min-width:48rem){.desktop-chrome .app-toolbar{padding-left:80px}}.toolbar-title{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em;min-width:0;color:var(--color-base-content);padding:0 .25rem;font-size:15px;font-weight:700;overflow:hidden}@media (prefers-reduced-motion:no-preference){.toolbar-title{transition:color .12s}}.toolbar-title:hover{color:var(--color-primary)}.header-tabs{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tabs{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.header-tab{height:28px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .8rem;font-size:13px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.header-tab{white-space:nowrap;text-decoration:none}.header-tab:hover{color:var(--color-base-content)}.header-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.header-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.toolbar-icon-btn{width:34px;height:34px;color:var(--color-base-content);border:1px solid #0000;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.toolbar-icon-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.toolbar-icon-btn{transition:background-color .12s,color .12s,border-color .12s}}.toolbar-icon-btn:hover{color:var(--color-base-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.toolbar-icon-btn:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toolbar-icon-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (min-width:48rem){.app-toolbar label[for=nav-drawer]{display:none}}@media (min-width:40rem){.toolbar-search-link{display:none}}@media (max-width:39.9375rem){.app-toolbar{column-gap:.25rem;padding-inline:.5rem}.toolbar-cluster{gap:.25rem}.header-tab{padding:0 .55rem}}.toolbar-search{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:9999px;flex:0 auto;align-items:center;gap:.4rem;min-width:0;height:34px;padding:0 .6rem}@supports (color:color-mix(in lab, red, red)){.toolbar-search{background:color-mix(in oklab, var(--color-base-100) 70%, transparent)}}.toolbar-search{color:var(--color-base-content)}.toolbar-search:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-search:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toolbar-search:focus-within{background:var(--color-base-100)}.toolbar-search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:15px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.toolbar-search-input{width:auto;min-width:3rem;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:12rem;font-size:13px}.toolbar-search-input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.toolbar-search-input::placeholder{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.sidebar-filter{border:1px solid var(--color-neutral);background:var(--color-base-100);height:36px;color:var(--color-base-content);border-radius:.5rem;padding:0 .625rem}.sidebar-filter:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sidebar-filter:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.sidebar-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.sidebar-section-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-item{content-visibility:auto;contain-intrinsic-size:auto 52px}.conv-row{border-left:3px solid #0000;border-radius:.5rem;align-items:center;gap:.75rem;padding:.5rem .625rem;display:flex;position:relative}@media (prefers-reduced-motion:no-preference){.conv-row{transition:background-color .12s}}.conv-row:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.conv-row:hover{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}.conv-row-selected,.conv-row-selected:hover{border-left-color:var(--color-primary);background:#1b2330}[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:color-mix(in oklab, var(--color-primary) 12%, var(--color-base-300))}}.conv-name{color:var(--color-base-content);font-size:14px;font-weight:600}.conv-count{color:var(--color-base-content);flex-shrink:0;font-size:11px}@supports (color:color-mix(in lab, red, red)){.conv-count{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-preview{color:var(--color-base-content);font-size:12.5px;display:block}@supports (color:color-mix(in lab, red, red)){.conv-preview{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.conv-preview-sender{color:var(--color-base-content);font-weight:600}@supports (color:color-mix(in lab, red, red)){.conv-preview-sender{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.avatar-mono{color:#fff;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:12px;font-weight:600;line-height:1;display:inline-flex;position:relative}.presence-dot{border:2px solid var(--color-base-300);box-sizing:border-box;border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-1px}.presence-dot.src-signal{background:var(--color-info)}.presence-dot.src-imessage{background:var(--color-success)}.presence-dot.src-whatsapp{background:var(--color-whatsapp)}.presence-dot.src-unknown{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.presence-dot.src-unknown{background:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.source-pill{background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:.25rem;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}.source-pill.src-signal{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-signal{border-color:color-mix(in oklab, var(--color-primary) 35%, transparent)}}.source-pill.src-imessage{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{color:color-mix(in oklab, var(--color-success) 80%, white)}}.source-pill.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-imessage{color:var(--color-success)}.source-pill.src-whatsapp{color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{color:color-mix(in oklab, var(--color-whatsapp) 80%, white)}}.source-pill.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-whatsapp{color:var(--color-whatsapp)}.source-pill.src-unknown{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-unknown{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.source-pill.src-unknown{border-color:var(--color-neutral)}.conv-header-top{align-items:center;gap:.75rem;display:flex}.conv-header .avatar-mono{width:44px;height:44px;font-size:15px}.conv-header .presence-dot{border-color:var(--color-base-100)}.conv-title{letter-spacing:-.02em;color:var(--color-base-content);text-overflow:ellipsis;white-space:nowrap;font-size:22px;font-weight:700;line-height:1.15;overflow:hidden}@media (min-width:1024px){.conv-title{font-size:25px}}.conv-ids{flex-wrap:wrap;align-items:center;gap:.375rem;margin-top:.25rem;display:flex}.id-chip{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;gap:.3rem;padding:1px .5rem;font-size:11.5px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.id-chip{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.id-chip{background:0 0}.conv-meta{color:var(--color-base-content);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.625rem;font-size:12.5px;display:flex}@supports (color:color-mix(in lab, red, red)){.conv-meta{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.conv-meta-sep{opacity:.6}.meta-chip{color:var(--color-base-content);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.meta-chip{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.meta-chip:first-of-type{margin-left:.25rem}a.meta-chip:hover{color:var(--color-base-content)}.pin-btn{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:8px;align-items:center;gap:.35rem;padding:.25rem .625rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.pin-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.pin-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.pin-btn{transition:background .12s,color .12s,border-color .12s}}.pin-btn:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.pin-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.pin-btn-active{color:var(--color-primary-content);background:var(--color-primary);border-color:var(--color-primary)}.pin-btn-active:hover{color:var(--color-primary-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{background:color-mix(in oklab, var(--color-primary) 88%, black)}}.pin-btn-active:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{border-color:color-mix(in oklab, var(--color-primary) 88%, black)}}.transcript{max-width:calc(719px + 1.5rem)}.day-sep{align-items:center;gap:.75rem;margin:1.25rem 0 .75rem;display:flex}.day-sep:before,.day-sep:after{content:"";background:var(--color-neutral);flex:1;height:1px}@supports (color:color-mix(in lab, red, red)){.day-sep:before,.day-sep:after{background:color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.day-sep span{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);flex-shrink:0;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.day-sep span{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.sys-event{text-align:center;font-family:var(--font-mono);color:var(--color-base-content);margin:.5rem 0;padding:.15rem 0;font-size:12px;font-style:italic}@supports (color:color-mix(in lab, red, red)){.sys-event{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.msg-row,.sys-event{content-visibility:auto;contain-intrinsic-size:auto 2.2rem}.msg-row.target,.sys-event.target,.msg-row:target,.sys-event:target{content-visibility:visible}.msg-row{border-left:2px solid #0000;border-radius:0 6px 6px 0;grid-template-columns:76px 3px minmax(0,640px);align-items:start;column-gap:.75rem;padding:.2rem .5rem .2rem 0;display:grid}.msg-row-grouped{padding-top:.05rem}.msg-time{white-space:nowrap;color:var(--color-base-content);grid-column:1;justify-self:end;padding-top:.12rem;font-size:11px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.msg-time{color:color-mix(in oklab, var(--color-base-content) 32%, transparent)}}.msg-rail{border-radius:2px;grid-column:2;align-self:stretch;width:3px;min-height:1.1rem}.msg-rail.rail-me{background:var(--color-primary)}.msg-body{grid-column:3;min-width:0}.msg-sender{color:var(--color-base-content);font-size:12.5px;font-weight:600;line-height:1.3}@supports (color:color-mix(in lab, red, red)){.msg-sender{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.msg-sender-me{color:var(--color-secondary)}[data-theme=slate-light] .msg-sender-me{color:var(--color-primary)}.msg-text{color:var(--color-base-content);font-size:14px;line-height:1.55}.msg-row-me{border-left-color:var(--color-primary);background:#6f93d60d}[data-theme=slate-light] .msg-row-me{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .msg-row-me{background:color-mix(in oklab, var(--color-primary) 7%, transparent)}}.msg-attachments,.msg-links{flex-wrap:wrap;gap:.5rem;margin-top:.4rem;display:flex}.msg-thumb{border-radius:.5rem;display:inline-flex;overflow:hidden}.msg-thumb .thumb{border-radius:.5rem}.attach-chip{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:6px;align-items:center;gap:.35rem;max-width:100%;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.attach-chip{background:color-mix(in oklab, var(--color-base-content) 3%, transparent)}}.attach-chip{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.attach-chip{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}@media (prefers-reduced-motion:no-preference){.attach-chip{transition:border-color .12s,color .12s}}.attach-chip:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.attach-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.attach-chip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.link-pill{border:1px solid var(--color-primary);border-radius:6px;align-items:center;gap:.35rem;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-pill{border:1px solid color-mix(in oklab, var(--color-primary) 35%, transparent)}}.link-pill{color:var(--color-primary);background:var(--color-primary);font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-pill{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}@media (prefers-reduced-motion:no-preference){.link-pill{transition:background-color .12s,border-color .12s}}.link-pill:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{background:color-mix(in oklab, var(--color-primary) 12%, transparent)}}.link-pill:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, transparent)}}.msg-reactions{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.reaction-badge{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:999px;align-items:center;gap:.2rem;padding:.1rem .45rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.reaction-badge{background:color-mix(in oklab, var(--color-base-content) 4%, transparent)}}.reaction-badge{cursor:default;font-size:12px;line-height:1.4}.reaction-emoji{font-size:13px}.reaction-count{color:var(--color-base-content);font-size:11px}@supports (color:color-mix(in lab, red, red)){.reaction-count{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.screen-col{width:100%;max-width:780px;margin-inline:auto}.notice-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;padding:.95rem 1rem;display:block}.lightbox-close{color:#fff}.lightbox-caption{color:#fffc}.eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.eyebrow{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.screen-h1{letter-spacing:-.02em;color:var(--color-base-content);font-size:21px;font-weight:700;line-height:1.15}@media (min-width:1024px){.screen-h1{font-size:24px}}.screen-sub{color:var(--color-base-content);margin-top:.25rem;font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.screen-sub{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.home-hero-title{letter-spacing:-.025em;color:var(--color-base-content);font-size:38px;font-weight:700;line-height:1.05}.home-hero-tagline{color:var(--color-base-content);margin-top:.6rem;font-size:15px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.home-hero-tagline{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-strip{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;grid-template-columns:repeat(3,minmax(0,1fr));display:grid;overflow:hidden}.stat-cell{padding:1rem 1.1rem}.stat-cell+.stat-cell{border-left:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-left:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.stat-cell-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.stat-cell-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.stat-cell-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.4rem;font-size:28px;font-weight:700;line-height:1.1}.stat-cell-value-sm{font-size:14.5px;font-weight:600}@media (max-width:640px){.stat-strip{grid-template-columns:1fr}.stat-cell+.stat-cell{border-left:0;border-top:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-top:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}}.link-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;align-items:flex-start;gap:.75rem;padding:.95rem 1rem;display:flex}@media (prefers-reduced-motion:no-preference){.link-card{transition:background-color .12s,border-color .12s}}.link-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{background:color-mix(in oklab, var(--color-primary) 6%, var(--color-base-200))}}.link-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.link-card-icon{width:34px;height:34px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.link-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.link-card-icon{font-size:16px}.link-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.link-card-sub{color:var(--color-base-content);margin-top:.15rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-card-sub{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.search-field{border:1px solid var(--color-neutral);background:var(--color-base-200);height:48px;color:var(--color-base-content);border-radius:.75rem;align-items:center;gap:.6rem;padding:0 .9rem;display:flex}.search-field:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.search-field:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.search-field .search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:18px}@supports (color:color-mix(in lab, red, red)){.search-field .search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.search-field input{min-width:0;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:1;font-size:16px}.search-field input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.search-field input::placeholder{color:color-mix(in oklab, var(--color-base-content) 38%, transparent)}}.filter-row{flex-wrap:wrap;align-items:flex-end;gap:.6rem;display:flex}.filter-control{flex-direction:column;gap:.2rem;display:flex}.filter-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.filter-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.filter-input{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;padding:0 .55rem;font-size:13px}.filter-input:focus{border-color:var(--color-primary);outline:none}@supports (color:color-mix(in lab, red, red)){.filter-input:focus{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toggle-chip{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;align-items:center;gap:.35rem;padding:0 .7rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toggle-chip{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.toggle-chip{cursor:pointer;-webkit-user-select:none;user-select:none;font-size:13px}@media (prefers-reduced-motion:no-preference){.toggle-chip{transition:background-color .12s,color .12s,border-color .12s}}.toggle-chip:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toggle-chip input{appearance:none;border:1px solid;border-radius:3px;flex-shrink:0;width:13px;height:13px;position:relative}.toggle-chip input:checked{background:currentColor}.toggle-chip:has(input:checked){color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.toggle-chip:has(input:checked){background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.btn-search{background:var(--color-primary);height:34px;color:var(--color-primary-content);cursor:pointer;border:0;border-radius:.5rem;padding:0 1.1rem;font-size:13px;font-weight:600}@media (prefers-reduced-motion:no-preference){.btn-search{transition:filter .12s}}.btn-search:hover{filter:brightness(1.08)}.results-meta{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.results-meta{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.results-empty{color:var(--color-base-content);font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.results-empty{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.result-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.8rem .9rem;display:block}@media (prefers-reduced-motion:no-preference){.result-card{transition:background-color .12s,border-color .12s}}.result-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{background:color-mix(in oklab, var(--color-primary) 5%, var(--color-base-200))}}.result-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.result-card-top{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card-top{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.result-head{flex-wrap:wrap;align-items:center;gap:.4rem .5rem;display:flex}.result-conv{color:var(--color-base-content);font-size:13px;font-weight:600}.result-sender{color:var(--color-base-content);font-size:12.5px}@supports (color:color-mix(in lab, red, red)){.result-sender{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.result-ts{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:11.5px}@supports (color:color-mix(in lab, red, red)){.result-ts{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.result-spacer{flex:1}.result-glyph{color:var(--color-base-content);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.result-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.avatar-mono.avatar-sm{border-radius:6px;width:26px;height:26px;font-size:10px}.result-snippet{color:var(--color-base-content);margin-top:.4rem;font-size:13.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.result-snippet{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.result-snippet{word-break:break-word}.result-snippet mark,.search-mark mark{color:#f0d28a;background:#e8b84b47;border-radius:3px;padding:0 .12rem}[data-theme=slate-light] .result-snippet mark,[data-theme=slate-light] .search-mark mark{color:var(--color-warning)}.media-tabs{border-bottom:1px solid var(--color-neutral);align-items:center;gap:.25rem;display:flex}.media-tab{color:var(--color-base-content);border-bottom:2px solid #0000;align-items:center;gap:.4rem;margin-bottom:-1px;padding:.5rem .75rem;font-size:13.5px;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.media-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@media (prefers-reduced-motion:no-preference){.media-tab{transition:color .12s,border-color .12s}}.media-tab:hover{color:var(--color-base-content)}.media-tab-active,.media-tab-active:hover{color:var(--color-base-content);border-bottom-color:var(--color-primary)}.media-tab-badge{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.media-tab-badge{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.media-tab-active .media-tab-badge{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-tab-active .media-tab-badge{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.media-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem;display:grid}@media (min-width:640px){.media-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.media-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.media-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.media-tile{aspect-ratio:1;border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:9px;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.media-tile{transition:opacity .12s}}.media-tile:hover{opacity:.88}.media-tile img{object-fit:cover;width:100%;height:100%}.media-tile-scrim{pointer-events:none;background:linear-gradient(#0000,#000000b8);padding:1.4rem .5rem .4rem;position:absolute;inset:auto 0 0}.media-tile-name{font-family:var(--font-mono);color:#ffffffd9;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;display:block;overflow:hidden}.media-tile-placeholder{text-align:center;color:var(--color-base-content);flex-direction:column;justify-content:center;align-items:center;gap:.3rem;padding:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.media-tile-placeholder{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#1a1f26 0 9px,#161a20 9px 18px)}[data-theme=slate-light] .media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#e2e8f1 0 9px,#eef2f8 9px 18px)}.media-tile-placeholder .ph-name{font-family:var(--font-mono);word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:10px;line-height:1.2;display:-webkit-box;overflow:hidden}.media-tile-placeholder .ph-tag{border:1px solid var(--color-neutral);border-radius:5px;padding:0 .35rem;font-size:9.5px}.media-list{flex-direction:column;gap:.5rem;display:flex}.media-list-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.7rem .85rem}@media (prefers-reduced-motion:no-preference){.media-list-card{transition:border-color .12s}}.media-list-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-list-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.media-file-name{color:var(--color-base-content);align-items:center;gap:.4rem;font-size:13.5px;font-weight:500;display:inline-flex}.media-file-name:hover{color:var(--color-primary)}.media-card-meta{color:var(--color-base-content);margin-top:.25rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.media-card-meta{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.media-card-meta a{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.media-card-meta a{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.media-card-meta a:hover{color:var(--color-primary)}.media-link-url{color:var(--color-primary);word-break:break-all;font-size:13px;display:block}.media-link-url:hover{text-decoration:underline}.link-group-head{align-items:center;gap:.5rem;margin-bottom:.4rem;display:flex}.link-group-domain{color:var(--color-base-content);font-size:13.5px;font-weight:600}.link-group-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.link-group-count{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.settings-subnav{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-subnav{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.settings-tab{height:26px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .7rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.settings-tab{white-space:nowrap;text-decoration:none}.settings-tab:hover{color:var(--color-base-content)}.settings-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.settings-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.status-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;padding:1.1rem 1.2rem}.status-card-title{color:var(--color-base-content);margin-bottom:.85rem;font-size:14px;font-weight:600}.status-note{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.status-note{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.status-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem 1.1rem;display:grid}@media (min-width:640px){.status-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.status-metric-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-metric-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-metric-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.2rem;font-size:14px}.status-table{border-collapse:collapse;width:100%;font-size:13px}.status-table th{text-align:left;letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);padding:.45rem .6rem;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-table th{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-table th{border-bottom:1px solid var(--color-neutral)}.status-table td{border-bottom:1px solid var(--color-neutral);padding:.5rem .6rem}@supports (color:color-mix(in lab, red, red)){.status-table td{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 55%, transparent)}}.status-table td{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.status-table td{color:color-mix(in oklab, var(--color-base-content) 80%, transparent)}}.status-table tr:last-child td{border-bottom:0}.status-table .mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tier-pill{border:1px solid #0000;border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;display:inline-flex}.tier-pill.tier-daily{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-daily{border-color:color-mix(in oklab, var(--color-info) 35%, transparent)}}.tier-pill.tier-monthly{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{color:color-mix(in oklab, var(--color-success) 80%, white)}}.tier-pill.tier-monthly{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .tier-pill.tier-monthly{color:var(--color-success)}.tier-pill.tier-quarterly,.tier-pill.tier-yearly{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-quarterly,.tier-pill.tier-yearly{border-color:color-mix(in oklab, var(--color-warning) 35%, transparent)}}.tier-pill.tier-never{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-never{border-color:color-mix(in oklab, var(--color-error) 35%, transparent)}}.copy-block{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:.5rem;position:relative}.copy-pre{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem 3rem .65rem .85rem;font-size:12.5px;line-height:1.6;overflow-x:auto}@supports (color:color-mix(in lab, red, red)){.copy-pre{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.copy-btn{border:1px solid var(--color-neutral);background:var(--color-base-200);width:1.9rem;height:1.9rem;color:var(--color-base-content);border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:.4rem;right:.4rem}@supports (color:color-mix(in lab, red, red)){.copy-btn{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.copy-btn{cursor:pointer}@media (prefers-reduced-motion:no-preference){.copy-btn{transition:background-color .12s,color .12s}}.copy-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.copy-btn:hover{background:color-mix(in oklab, var(--color-primary) 10%, var(--color-base-200))}}.copy-btn:hover{color:var(--color-base-content)}.copy-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.copy-btn .icon-check,.copy-btn.copied .icon-copy{display:none}.copy-btn.copied .icon-check{color:var(--color-success);display:inline-flex}.qr-panel{flex-wrap:wrap;align-items:flex-start;gap:1.1rem;display:flex}.qr-img{border:1px solid var(--color-neutral);image-rendering:pixelated;border-radius:.5rem;flex-shrink:0}.qr-panel-text{flex:16rem}.setup-cards{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.setup-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;align-items:flex-start;gap:.85rem;padding:1rem 1.1rem;display:flex}.setup-card-not-detected{opacity:.72}.setup-card-icon{width:38px;height:38px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.setup-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.setup-card-icon.src-signal{color:var(--color-info);background:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.setup-card-icon.src-signal{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{border-color:color-mix(in oklab, var(--color-info) 25%, transparent)}}.setup-card-icon.src-imessage{color:var(--color-success);background:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{background:color-mix(in oklab, var(--color-success) 10%, transparent)}}.setup-card-icon.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{border-color:color-mix(in oklab, var(--color-success) 25%, transparent)}}.setup-card-icon.src-whatsapp{color:var(--color-whatsapp);background:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{background:color-mix(in oklab, var(--color-whatsapp) 10%, transparent)}}.setup-card-icon.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 25%, transparent)}}.setup-card-body{flex:1}.setup-card-head{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.setup-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.setup-card-detail{color:var(--color-base-content);margin-top:.25rem;font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-card-detail{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-card-actions{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;margin-top:.7rem;display:flex}.setup-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-badge-enabled{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{color:color-mix(in oklab, var(--color-success) 80%, white)}}.setup-badge-enabled{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{border-color:color-mix(in oklab, var(--color-success) 35%, transparent)}}[data-theme=slate-light] .setup-badge-enabled{color:var(--color-success)}.setup-badge-ready{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-badge-ready{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.setup-badge-needs-permission{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.setup-badge-needs-permission{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.setup-badge-not-detected{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-badge-not-detected{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-badge-not-detected{border-color:var(--color-neutral)}.setup-badge-synced{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-badge-synced{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.sync-badge{border:1px solid var(--color-neutral);white-space:nowrap;color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.sync-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.sync-badge-ok{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.sync-badge-ok{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.sync-badge-warn{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.sync-badge-warn{border-color:color-mix(in oklab, var(--color-warning) 45%, var(--color-neutral))}}.sync-badge-err{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.sync-badge-err{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.sync-badge-info{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sync-badge-info{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.setup-btn{border:1px solid var(--color-primary);background:var(--color-primary);height:32px;color:var(--color-primary-content);cursor:pointer;border-radius:.5rem;padding:0 .95rem;font-size:12.5px;font-weight:600}@media (prefers-reduced-motion:no-preference){.setup-btn{transition:filter .12s}}.setup-btn:hover:not(:disabled){filter:brightness(1.08)}.setup-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-btn:disabled{cursor:not-allowed;opacity:.55;color:var(--color-base-content);background:0 0}@supports (color:color-mix(in lab, red, red)){.setup-btn:disabled{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-btn:disabled{border-color:var(--color-neutral)}.setup-note{color:var(--color-base-content);align-items:center;gap:.3rem;font-size:12px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-note{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-note-ok{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-note-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-note-ok{color:var(--color-success)}.setup-note-warn{color:var(--color-warning)}.setup-footnote{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-footnote{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}@supports (color:color-mix(in lab, red, red)){}.setup-progress{margin-top:.55rem}.setup-progress:empty{display:none}.setup-progress-state{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;display:flex}.setup-progress-line{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-progress-line{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.setup-progress-line{margin:0}.setup-progress-ok{color:var(--color-success);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-progress-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-progress-ok{color:var(--color-success)}.setup-progress-err{color:var(--color-error)}.setup-progress-warn{color:var(--color-warning)}.setup-progress-unavailable{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.setup-progress-unavailable{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-progress-spin{border:2px solid var(--color-primary);border-radius:50%;width:14px;height:14px}@supports (color:color-mix(in lab, red, red)){.setup-progress-spin{border:2px solid color-mix(in oklab, var(--color-primary) 30%, transparent)}}.setup-progress-spin{border-top-color:var(--color-primary);flex:none}@media (prefers-reduced-motion:no-preference){.setup-progress-spin{animation:.7s linear infinite setup-progress-spin}}@keyframes setup-progress-spin{to{transform:rotate(360deg)}}.setup-btn-ghost{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0;align-items:center;gap:.3rem;display:inline-flex}.setup-btn-ghost:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-btn-ghost:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-btn-danger{border-color:var(--color-error);background:var(--color-error);color:var(--color-error-content,#fff)}.setup-btn-danger:focus-visible{outline-color:var(--color-error)}.setup-iconbtn{border:1px solid var(--color-neutral);width:26px;height:26px;color:var(--color-base-content);background:0 0;border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.setup-iconbtn{cursor:pointer;flex:none}.setup-iconbtn:hover:not(:disabled){background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-iconbtn:hover:not(:disabled){color:var(--color-base-content)}.setup-iconbtn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-iconbtn:disabled{cursor:not-allowed;opacity:.45}.setup-guide{z-index:60;justify-content:center;align-items:center;padding:1.25rem;display:flex;position:fixed;inset:0}.setup-guide[hidden]{display:none}.setup-guide-backdrop{background:var(--color-base-300);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.setup-guide-backdrop{background:color-mix(in oklab, var(--color-base-300) 78%, black)}}.setup-guide-backdrop{opacity:.7}.setup-guide-panel{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.9rem;width:min(30rem,100%);max-height:calc(100vh - 2.5rem);padding:1.15rem 1.25rem 1.25rem;position:relative;overflow-y:auto;box-shadow:0 18px 48px -12px oklab(0% none none/.55)}.setup-guide-head{justify-content:space-between;align-items:flex-start;gap:.75rem;display:flex}.setup-guide-title{color:var(--color-base-content);margin:0;font-size:15px;font-weight:600}.setup-guide-close{width:30px;height:30px;color:var(--color-base-content);background:0 0;border:1px solid #0000;border-radius:.5rem;flex:none;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-guide-close{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-guide-close{cursor:pointer}.setup-guide-close:hover{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-close:hover{background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-close:hover{color:var(--color-base-content)}.setup-guide-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-guide-summary{color:var(--color-base-content);margin-top:.5rem;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.setup-guide-summary{color:color-mix(in oklab, var(--color-base-content) 68%, transparent)}}.setup-guide-steps{color:var(--color-base-content);flex-direction:column;gap:.4rem;margin:.85rem 0 0;padding-left:1.25rem;font-size:12.5px;line-height:1.5;list-style:decimal;display:flex}.setup-guide-actions{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;margin-top:1.1rem;display:flex}.setup-guide-settings{align-items:center;gap:.35rem;text-decoration:none;display:inline-flex}.setup-guide-recheck{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0}.setup-guide-recheck:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-recheck:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-result{color:var(--color-warning);margin:.7rem 0 0;font-size:12px;line-height:1.5}.setup-guide-result:empty{display:none}.log-entry-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.log-entry-title{color:var(--color-base-content);font-size:15px;font-weight:600}.log-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:.4rem;padding:.1rem .5rem;font-size:11px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.log-badge{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.log-badge{white-space:nowrap}.log-badge-failed{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.log-badge-failed{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.log-badge-done{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.log-badge-done{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.log-badge-active{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.log-badge-active{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.log-status-line{color:var(--color-base-content);margin:.55rem 0 0;font-size:13px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.log-status-line{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.log-meta{gap:.4rem;margin-top:.7rem;display:grid}.log-meta-row{grid-template-columns:7.5rem 1fr;gap:.5rem;font-size:12.5px;line-height:1.5;display:grid}.log-meta-label{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-label{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.log-meta-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-value{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.log-meta-value{overflow-wrap:anywhere}.log-output{max-height:16rem;font-family:var(--font-mono);white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem .85rem;font-size:12px;line-height:1.55;overflow:auto}@supports (color:color-mix(in lab, red, red)){.log-output{color:color-mix(in oklab, var(--color-base-content) 85%, transparent)}}.log-empty{color:var(--color-base-content);font-size:13px}@supports (color:color-mix(in lab, red, red)){.log-empty{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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-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} +/* Manual mirror of internal/web/tailwind/input.css Providers-grid changes + (the tailwind CLI is unavailable offline; `make css` regenerates this). */ +.setup-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))} +@media (max-width:640px){.setup-cards{grid-template-columns:minmax(0,1fr)}} +.setup-card-coming-soon{opacity:.72} +.setup-card-icon.src-telegram{color:var(--color-info);background:color-mix(in oklab, var(--color-info) 10%, transparent);border-color:color-mix(in oklab, var(--color-info) 25%, transparent)} +.setup-badge-coming-soon{color:color-mix(in oklab, var(--color-base-content) 50%, transparent);border-color:var(--color-neutral)} diff --git a/internal/web/tailwind/input.css b/internal/web/tailwind/input.css index f71a254..302cabe 100644 --- a/internal/web/tailwind/input.css +++ b/internal/web/tailwind/input.css @@ -1853,13 +1853,19 @@ a.meta-chip:hover { * (never color alone — SPEC-0013 §Accessibility) whose accent rides the slate * semantic tokens so slate-light restyles automatically (ADR-0012). */ .setup-cards { - display: flex; - flex-direction: column; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.75rem; list-style: none; margin: 0; padding: 0; } +/* A 2×2 grid needs the width; collapse to one column on narrow viewports. */ +@media (max-width: 640px) { + .setup-cards { + grid-template-columns: minmax(0, 1fr); + } +} .setup-card { display: flex; align-items: flex-start; @@ -1874,6 +1880,11 @@ a.meta-chip:hover { .setup-card-not-detected { opacity: 0.72; } +/* Coming-soon cards (Telegram): dimmed like not-detected and non-interactive; + the "Coming soon" badge carries the state as text, not color alone. */ +.setup-card-coming-soon { + opacity: 0.72; +} /* Source-tinted icon disc (matches .link-card-icon geometry). The base uses the accent; the .src-* modifier repaints per source. */ .setup-card-icon { @@ -1904,6 +1915,12 @@ a.meta-chip:hover { background: color-mix(in oklab, var(--color-whatsapp) 10%, transparent); border-color: color-mix(in oklab, var(--color-whatsapp) 25%, transparent); } +/* Telegram tint for the coming-soon card — its brand cyan/blue. */ +.setup-card-icon.src-telegram { + color: var(--color-info); + background: color-mix(in oklab, var(--color-info) 10%, transparent); + border-color: color-mix(in oklab, var(--color-info) 25%, transparent); +} .setup-card-body { flex: 1; } @@ -1963,6 +1980,11 @@ a.meta-chip:hover { color: color-mix(in oklab, var(--color-base-content) 50%, transparent); border-color: var(--color-neutral); } +/* Coming-soon badge (Telegram): same muted treatment as not-detected. */ +.setup-badge-coming-soon { + color: color-mix(in oklab, var(--color-base-content) 50%, transparent); + border-color: var(--color-neutral); +} /* Synced-replica card badge (#158; SPEC-0014 importer/replica roles): the archive syncs in from a paired peer, so the card is informational — no local Enable/Refresh. State is still conveyed by the badge text + detail @@ -2056,24 +2078,6 @@ a.meta-chip:hover { color: color-mix(in oklab, var(--color-base-content) 48%, transparent); } -/* All-sources Refresh control (SPEC-0013 REQ "Refresh"): a single button that - fans a refresh out across every Enabled source, with its own aria-live summary - region beside it. Rendered only when at least one source is Enabled. */ -.setup-refresh-all { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.65rem; -} -.setup-refresh-all-result { - font-size: 12.5px; - line-height: 1.5; - color: color-mix(in oklab, var(--color-base-content) 62%, transparent); -} -.setup-refresh-all-result:empty { - display: none; -} - /* Live Enable job progress (SPEC-0013 REQ "One-click enable and import"): a per-source aria-live region the Enable POST fills and the status poller swaps. State is carried as TEXT (the message line + phase color), never spinner-only diff --git a/internal/web/templates/icons.html b/internal/web/templates/icons.html index 5ae12dc..731143c 100644 --- a/internal/web/templates/icons.html +++ b/internal/web/templates/icons.html @@ -21,6 +21,7 @@ {{define "icon-chat-bubble"}}{{end}} {{define "icon-chat-solid"}}{{end}} {{define "icon-chat-dots"}}{{end}} +{{define "icon-send"}}{{end}} {{define "icon-lock"}}{{end}} {{define "icon-x"}}{{end}} {{define "icon-refresh"}}{{end}} diff --git a/internal/web/templates/llm_settings.html b/internal/web/templates/llm_settings.html index 606052f..9c8c3f1 100644 --- a/internal/web/templates/llm_settings.html +++ b/internal/web/templates/llm_settings.html @@ -4,11 +4,12 @@ *_content pattern): keeps history entries titled; the define owns <main id="main-content"> so partial responses carry no shell. - The Settings → LLM tab (issue #191): exactly three fields — Base URL, - Embed model, Facts model (llm.chat_model) — and deliberately NO API-key - field: keys come from the MSGBROWSE_LLM_API_KEY environment variable only - (internal/config posture), so a key never lands in a form, a page, or the - config file. The form is boosted (hx-boost on the form itself), so a save + The Settings → LLM tab (issue #191): Base URL, Embed model, Facts model + (llm.chat_model), and an API key. The key is a write-only secret field — + its value is never rendered back (the form shows only whether one is set), + a blank submission keeps the current key, and it is persisted to the 0600 + config file (MSGBROWSE_LLM_API_KEY still overrides at boot). The form is + boosted (hx-boost on the form itself), so a save swaps only #main-content; without JS it degrades to a plain same-origin form POST through the identical handler. All feedback states are fixed-enum banners; the echoed field values pass through html/template @@ -103,12 +104,29 @@ <h2 id="settings-llm-heading" class="status-card-title">AI endpoint</h2> the journal digest later); stored as <code class="font-mono">llm.chat_model</code>.</p> </div> + <div class="space-y-1"> + <label class="eyebrow block" for="llm-api-key">API key</label> + {{/* Secret field: type=password, autocomplete off, and the value is + NEVER rendered back (only whether one is set). A blank submission + keeps the current key; type a new one to replace it. */}} + <input id="llm-api-key" name="api_key" type="password" class="filter-input w-full font-mono" + value="" autocomplete="off" spellcheck="false" + placeholder="{{if .HasAPIKey}}•••••••• (a key is set — leave blank to keep it){{else}}none set — a local proxy needs none{{end}}" + {{if .ErrAPIKey}}aria-invalid="true" aria-describedby="llm-api-key-error"{{else}}aria-describedby="llm-api-key-hint"{{end}}> + {{- if .ErrAPIKey}} + <p id="llm-api-key-error" class="setup-note setup-note-warn"> + {{- if eq .ErrAPIKey "toolong"}}That API key is too long. + {{- else}}That API key contains characters that are not allowed.{{end}}</p> + {{- end}} + <p id="llm-api-key-hint" class="status-note">Only needed if your endpoint requires one. Stored in + this app's config file (<code class="font-mono">llm.api_key</code>, mode 0600); leave blank to + keep the current key. The <code class="font-mono">MSGBROWSE_LLM_API_KEY</code> environment + variable, if set, still overrides it at startup.</p> + </div> + <button type="submit" class="setup-btn">Save and apply</button> </form> - <p class="status-note">There is no API-key field on purpose: an endpoint that requires a key reads - it from the <code class="font-mono">MSGBROWSE_LLM_API_KEY</code> environment variable — keys are - never stored in this app's config file.</p> <p class="status-note">msgbrowse's only network egress goes to this URL; the default points at a local proxy, and routing message content to a hosted provider is a deliberate choice (ADR-0010).</p> </section> diff --git a/internal/web/templates/settings.html b/internal/web/templates/settings.html index a2a4ed4..5a96ddd 100644 --- a/internal/web/templates/settings.html +++ b/internal/web/templates/settings.html @@ -101,7 +101,11 @@ <h2 id="settings-mcp-heading" class="status-card-title">MCP server</h2> manual code carry this node's PUBLIC Syncthing device ID + folder introduction — never a secret. Pairing is symmetric explicit-accept: each node pastes/scans the OTHER node's code, and no archive data - flows until both have (SPEC-0014 §Trust Model). */}} + flows until both have (SPEC-0014 §Trust Model). + + The whole section is gated on DeviceSyncFeature — the `devicesync` build + tag. Release builds omit the feature, so nothing here renders. */}} + {{- if .DeviceSyncFeature}} <section class="status-card space-y-4" aria-labelledby="settings-pairing-heading"> <h2 id="settings-pairing-heading" class="status-card-title">Device sync</h2> {{- if .UnpairResult}} @@ -307,6 +311,7 @@ <h2 id="settings-pairing-heading" class="status-card-title">Device sync</h2> </div> {{- end}} </section> + {{- end}} </div> </main> {{end}} diff --git a/internal/web/templates/setup.html b/internal/web/templates/setup.html index d4ce0e9..e96429f 100644 --- a/internal/web/templates/setup.html +++ b/internal/web/templates/setup.html @@ -46,48 +46,25 @@ <h1 class="screen-h1">Settings</h1> <p class="screen-sub">msgbrowse looks for Signal, iMessage, and WhatsApp on this Mac. Enable a detected source to import its history — everything stays on this machine.</p> - {{/* One card per source (SPEC-0013 "one card per source"), as a labelled list - so assistive tech enumerates the sources. Each card renders via the shared - setup_card define so /setup/recheck can re-render a single card fragment. */}} + {{/* One card per source (SPEC-0013 "one card per source") laid out as a 2×2 + grid, plus a "coming soon" card for sources not yet importable (Telegram). + Still a labelled list so assistive tech enumerates the sources; each real + card renders via the shared setup_card define so /setup/recheck can + re-render a single card fragment. */}} <ul class="setup-cards" aria-label="Message sources"> {{- range .Cards}} {{- template "setup_card" .}} {{- end}} + {{- template "setup_coming_soon_card" "Telegram"}} </ul> - {{/* All-sources Refresh (SPEC-0013 REQ "Refresh"): one control that refreshes - every Enabled source. Rendered only when at least one source is Enabled. - It POSTs /setup/refresh-all (same-origin + token gate, identical to the - per-source POSTs); the Runner's per-source job model starts one job per - distinct Enabled source, so it can never spawn two concurrent jobs for the - same source. Each source's own aria-live region reports its live state; - the summary lands in this control's own aria-live region. */}} - {{- if .AnyEnabled}} - <div class="setup-refresh-all"> - {{- if .EnableAvailable}} - <button type="button" class="setup-btn" - hx-post="/setup/refresh-all" - hx-headers='{"X-Setup-Token": "{{.Token}}"}' - hx-target="#setup-refresh-all-result" - hx-swap="innerHTML" - hx-disabled-elt="this">Refresh all sources</button> - {{- else}} - <button type="button" class="setup-btn" disabled aria-disabled="true" - title="Refreshing needs the desktop app with its bundled exporters, or a configured exporter path">Refresh all sources</button> - {{- end}} - <p id="setup-refresh-all-result" class="setup-refresh-all-result" role="status" aria-live="polite"></p> - </div> - {{- end}} - - {{/* Footer copy keyed on the page's real state (issue #162: the old - two-way condition showed "No sources are ready to enable" while every - card read Enabled): actionable → nudge; everything-enabled → status; - only when nothing is actionable AND nothing is enabled → the true - empty state. */}} + {{/* Footer copy keyed on the page's real state. Enabled sources now + auto-refresh on a schedule (providers.refresh_interval), so the copy + says so instead of pointing at the retired "Refresh all sources" + button; the per-source Refresh icon stays for an on-demand import. */}} <p class="setup-footnote"> {{- if .AnyActionable}}Detected sources can be enabled from here — enabling runs the bundled exporter and imports the result. Providers stays reachable from Settings at any time. - {{- else if .AnyEnabled}}All detected sources are enabled. Refresh a source to import what's new. Providers stays reachable from Settings at any time. - {{- else}}No sources are ready to enable on this machine yet. Providers stays reachable from Settings at any time.{{end}} + {{- else}}Enabled sources refresh automatically to import what's new; use a source's Refresh icon for an on-demand import. Providers stays reachable from Settings at any time.{{end}} </p> </div> </main> @@ -131,6 +108,9 @@ <h1 class="screen-h1">Settings</h1> {{- if .HasCounts}} <span class="setup-note setup-note-ok">{{template "icon-check" $}} {{num .Conversations}} conversation{{if ne .Conversations 1}}s{{end}} · {{num .Messages}} message{{if ne .Messages 1}}s{{end}}</span> {{- end}} + {{- if .HasLastSynced}} + <span class="setup-note">Last synced {{.LastSynced}}</span> + {{- end}} <span class="setup-note">Synced from {{.SyncedFrom}}. Enable and Refresh run on that device; to make this machine the importer, unpair it in Settings first.</span> {{- else if .ConfirmDisable}} {{/* Inline two-step Disable confirmation (issue #162): step 1 swapped @@ -162,6 +142,12 @@ <h1 class="screen-h1">Settings</h1> {{- else}} <span class="setup-note setup-note-ok">{{template "icon-check" $}} Imported</span> {{- end}} + {{- if .HasLastSynced}} + {{/* Auto-refresh + manual Refresh both record an ingest run; this is + the most recent one, so the user can see how current the archive + is. Server-formatted, never request-derived. */}} + <span class="setup-note">Last synced {{.LastSynced}}</span> + {{- end}} {{/* Disable (issue #162): privileged POST behind the same gate as Enable; the first click swaps in the inline confirm above. */}} {{template "setup-disable-button" .}} @@ -353,19 +339,22 @@ <h2 id="setup-guide-title-{{.Source}}" class="setup-guide-title">{{.Guidance.Tit {{- end}} {{end}} -{{/* setup_refresh_all_result is the summary fragment the all-sources Refresh POST - swaps into its aria-live region. It reports how many sources it kicked off — - the per-source live state is announced by each card's own progress region, so - this stays a short count-only summary. All values are server-computed counts, - so html/template escaping is the only encoding needed. */}} -{{define "setup_refresh_all_result"}} - {{- if .Unavailable}} - <span class="setup-progress-unavailable">Refreshing needs the desktop app (bundled exporters) or a configured exporter path.</span> - {{- else if .None}} - <span>No enabled sources to refresh.</span> - {{- else}} - <span>Refreshing {{.Started}} source{{if ne .Started 1}}s{{end}} - {{- if .AlreadyRunning}} · {{.AlreadyRunning}} already in progress{{end}} - {{- if .Failed}} · {{.Failed}} could not start{{end}} — see each source below for progress.</span> - {{- end}} +{{/* setup_coming_soon_card is a non-interactive placeholder card for a source + msgbrowse does not import yet (Telegram). It has no state badge actions, no + Enable/Refresh, and is not wired into internal/source — it only advertises + that support is planned so the 2×2 grid reads as complete. The argument is + the source's display name (a fixed template literal, never request-derived). + Marked aria-disabled and dimmed, with the state carried as the "Coming soon" + badge text (not color alone — SPEC-0013 §Accessibility). */}} +{{define "setup_coming_soon_card"}} + <li class="setup-card setup-card-coming-soon" aria-label="{{.}}: coming soon" aria-disabled="true"> + <span class="setup-card-icon src-telegram" aria-hidden="true">{{template "icon-send" .}}</span> + <div class="setup-card-body min-w-0"> + <div class="setup-card-head"> + <span class="setup-card-title">{{.}}</span> + <span class="setup-badge setup-badge-coming-soon">Coming soon</span> + </div> + <p class="setup-card-detail">{{.}} import is on the way — this source can't be enabled yet.</p> + </div> + </li> {{end}} diff --git a/internal/web/templates/status.html b/internal/web/templates/status.html index bd8548f..03494c0 100644 --- a/internal/web/templates/status.html +++ b/internal/web/templates/status.html @@ -54,7 +54,11 @@ <h1 class="screen-h1">Settings</h1> engine state, per-peer connection, and per-folder health/completion — Syncthing's state surfaced HERE so the user never opens its GUI. Disabled (the default) renders one neutral line; enabled-but- - unreadable renders a pointer to Logs instead of fake numbers. */}} + unreadable renders a pointer to Logs instead of fake numbers. + + Gated on DeviceSyncFeature (the `devicesync` build tag): a release build + omits the feature, so this whole block is absent. */}} + {{- if .DeviceSyncFeature}} {{if not .DeviceSyncEnabled}} <p class="status-note">Device sync is off (the default). Pair devices from Settings after enabling <code class="font-mono">device_sync</code> in your config.</p> @@ -118,6 +122,7 @@ <h1 class="screen-h1">Settings</h1> {{end}} </div> {{end}} + {{- end}} {{/* The snapshots card renders only where a snapshot pipeline exists (issue #164): recorded snapshots, or a .snapshots dir in the signal From 380c3eebfcdc2626b42e56b271e0fe032c876945 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Sat, 11 Jul 2026 07:48:11 +0000 Subject: [PATCH 2/3] Rebuild app.css with the real Tailwind CLI (replaces hand-mirrored rules) The css-fresh CI check diffs a scratch 'make css' run against the committed stylesheet, so the hand-appended setup-card rules failed it. Rebuilt with the pinned Tailwind v4.3.1 + daisyUI 5.6.3 toolchain. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YWWaS4f9mr6Yp43S4GXHE7 --- internal/web/static/app.css | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 82ce9b8..d964f75 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -1,9 +1,2 @@ /*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-500:oklch(58.5% .233 277.117);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-500:oklch(64.5% .246 16.439);--color-black:#000;--spacing:.25rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:"<percentage>";inherits:true;initial-value:0%}@property --aura-angle{syntax:"<angle>";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}:where(:root),:root:has(input.theme-controller[value=slate]:checked),[data-theme=slate]{color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=slate-light]:checked),[data-theme=slate-light]{color-scheme:light;--color-base-100:#f7f9fc;--color-base-200:#eef2f8;--color-base-300:#e2e8f1;--color-base-content:#1a2330;--color-primary:#3f63ad;--color-primary-content:#f7f9fc;--color-secondary:#5b7cc0;--color-secondary-content:#f7f9fc;--color-accent:#3f63ad;--color-accent-content:#f7f9fc;--color-neutral:#cdd6e3;--color-neutral-content:#1a2330;--color-info:#2563eb;--color-info-content:#f7f9fc;--color-success:#15803d;--color-success-content:#f7f9fc;--color-warning:#b7791f;--color-warning-content:#f7f9fc;--color-error:#be123c;--color-error-content:#f7f9fc;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}@layer components;@layer utilities{@layer daisyui.l1.l2{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;align-items:normal;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:hover .diff-item-2:after{height:2.4rem}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.drawer-open>.drawer-side{overflow-y:auto}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-inset,50% auto);inset-block:auto var(--tt-off)}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-tail-inset,50% auto);inset-block:auto var(--tt-tail)}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-hover-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:var(--btn-hover-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-hover-border,var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:var(--btn-hover-border,color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)))}}.btn:hover{--btn-border-style:solid;--btn-inset:var(--btn-hover-inset,0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%)));--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000))}}}.btn:active:not(.btn-active){translate:0 var(--btn-active-translate,.5px);--btn-bg:var(--btn-active-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:var(--btn-active-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%))}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-active-border,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:var(--btn-active-border,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:var(--btn-active-inset,0 0 0 0 oklch(0% 0 0/0));--btn-shadow:var(--btn-active-shadow,0 0 0 0 oklch(0% 0 0/0))}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}:where(.navbar){position:relative}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E")}@media (prefers-reduced-motion:no-preference){.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}}@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete, visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:oklch(0% 0 0/.4);place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}@supports (color:color-mix(in lab, red, red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){will-change:auto;transform:none}:where(:root:has(.drawer-toggle:checked)){--page-scroll-lock: }.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dock{z-index:1;background-color:var(--color-base-100);color:currentColor;border-top:.5px solid var(--color-base-content);flex-direction:row;justify-content:space-around;align-items:center;width:100%;padding:.5rem;display:flex;position:fixed;bottom:0;left:0;right:0}@supports (color:color-mix(in lab, red, red)){.dock{border-top:.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)}}.dock{height:4rem;height:calc(4rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom)}.dock>*{cursor:pointer;border-radius:var(--radius-box);background-color:#0000;flex-direction:column;flex-shrink:1;flex-basis:100%;justify-content:center;align-items:center;gap:1px;max-width:8rem;height:100%;margin-bottom:.5rem;transition:opacity .2s ease-out;display:flex;position:relative}@media (hover:hover){.dock>:hover{opacity:.8}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{opacity:1}.dock>* .dock-label{font-size:.6875rem}.dock>:after{content:"";background-color:#0000;border-top:3px solid #0000;border-radius:3.40282e38px;width:1.5rem;height:.25rem;transition:background-color .1s ease-out,text-color .1s ease-out,width .1s ease-out;position:absolute;bottom:.2rem}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:"00\a 01\a 02\a 03\a 04\a 05\a 06\a 07\a 08\a 09\a 10\a 11\a 12\a 13\a 14\a 15\a 16\a 17\a 18\a 19\a 20\a 21\a 22\a 23\a 24\a 25\a 26\a 27\a 28\a 29\a 30\a 31\a 32\a 33\a 34\a 35\a 36\a 37\a 38\a 39\a 40\a 41\a 42\a 43\a 44\a 45\a 46\a 47\a 48\a 49\a 50\a 51\a 52\a 53\a 54\a 55\a 56\a 57\a 58\a 59\a 60\a 61\a 62\a 63\a 64\a 65\a 66\a 67\a 68\a 69\a 70\a 71\a 72\a 73\a 74\a 75\a 76\a 77\a 78\a 79\a 80\a 81\a 82\a 83\a 84\a 85\a 86\a 87\a 88\a 89\a 90\a 91\a 92\a 93\a 94\a 95\a 96\a 97\a 98\a 99\a ";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s;height:auto;overflow:revert-layer}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input input::-webkit-inner-spin-button{margin-inline-end:-.15em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{direction:ltr}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-inline-end:-.75rem;margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.chat-bubble{border-radius:var(--radius-field);background-color:var(--color-base-300);width:fit-content;color:var(--color-base-content);grid-row-end:3;min-width:2.5rem;max-width:90%;min-height:2rem;padding-block:.5rem;padding-inline:1rem;display:block;position:relative}.chat-bubble:before{background-color:inherit;content:"";width:.75rem;height:.75rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-chat);-webkit-mask-image:var(--mask-chat);mask-image:var(--mask-chat);position:absolute;bottom:0;-webkit-mask-position:0 -1px;mask-position:0 -1px;-webkit-mask-size:.8125rem;mask-size:.8125rem}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0, 1fr)) auto var(--timeline-row-end,minmax(0, 1fr));grid-template-columns:var(--timeline-col-start,minmax(0, 1fr)) auto var(--timeline-col-end,minmax(0, 1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem) * 10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>:not(script,style,template){place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>:not(script,style,template){place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border) dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)}}.stat:not(:last-child){border-block-end:none}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}}@layer daisyui.l1{.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset):not([type=checkbox])) :not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.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}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\[\"\+\"54px\]{top:"+"54px}.right-4{right:calc(var(--spacing) * 4)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;--join-v:0;--join-h:1;align-items:stretch;display:inline-flex}@scope(.join){:scope>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){:scope>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}:scope :where(:scope>:first-child){--join-ss:var(--radius-field);--join-se:calc(var(--radius-field) * var(--join-v));--join-es:calc(var(--radius-field) * var(--join-h));--join-ee:0}:scope :where(:scope>:last-child){--join-ss:0;--join-se:calc(var(--radius-field) * var(--join-h));--join-es:calc(var(--radius-field) * var(--join-v));--join-ee:var(--radius-field)}:scope :where(:scope>:only-child){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.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}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.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-8{margin-bottom:calc(var(--spacing) * 8)}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-\[1\.15em\]{width:1.15em;height:1.15em}.h-full{height:100%}.min-h-0{min-height:0}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-base-300{border-color:var(--color-base-300)}.border-neutral{border-color:var(--color-neutral)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-base-100,.bg-base-100\/90{background-color:var(--color-base-100)}@supports (color:color-mix(in lab, red, red)){.bg-base-100\/90{background-color:color-mix(in oklab, var(--color-base-100) 90%, transparent)}}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.p-3{padding:calc(var(--spacing) * 3)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-base-content{color:var(--color-base-content)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.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,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:48rem){@layer daisyui.l1.l2.l3{.md\:drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.md\:drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}}@layer daisyui.l1.l2{.md\:drawer-open>.drawer-side{overflow-y:auto}.md\:drawer-open>.drawer-toggle{display:none}.md\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.md\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.md\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}}@layer daisyui.l1{.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}}.md\:hidden{display:none}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media (min-width:64rem){.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)}}}:root{--color-whatsapp:#25d366}[data-theme=slate-light]{--color-whatsapp:#128c7e}:root{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, monospace}html{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tabular-nums{font-variant-numeric:tabular-nums}.thumb{max-width:220px;max-height:220px}.lightbox{display:none}.lightbox:target{z-index:50;background:oklab(0% none none/.85);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:1.5rem;display:flex;position:fixed;inset:0}.lightbox img{border-radius:.5rem;max-width:92vw;max-height:80vh}.msg-quote{border-left:3px solid}@supports (color:color-mix(in lab, red, red)){.msg-quote{border-left:3px solid color-mix(in oklab, currentColor 35%, transparent)}}.msg-quote{opacity:.75;margin:.25rem 0;padding:.1rem 0 .1rem .6rem;font-size:.95em}@keyframes target-flash{0%{background-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}to{background-color:#0000}}.target.msg-row,.target.sys-event{animation:2.5s ease-out target-flash}.theme-switching *{transition:none!important}body{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-shell{flex:1 1 0;grid-template-rows:minmax(0,1fr);min-height:0}.app-shell>.drawer-content{flex-direction:column;min-height:0;display:flex;overflow:hidden}#main-content{flex:1 1 0;min-height:0;overflow-y:auto}#main-content:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}@media (min-width:48rem){.app-shell>.drawer-side{height:100%;overflow-y:hidden}}.app-toolbar{background:var(--color-base-300);flex-shrink:0;grid-template-columns:minmax(0,1fr) auto 1fr;align-items:center;column-gap:.5rem;height:52px;min-height:52px;display:grid}@supports (color:color-mix(in lab, red, red)){.app-toolbar{background:color-mix(in oklab, var(--color-base-300) 80%, transparent)}}.app-toolbar{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);border-bottom:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.app-toolbar{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 85%, transparent)}}.app-toolbar{--wails-draggable:drag}.app-toolbar a,.app-toolbar button,.app-toolbar label,.app-toolbar form,.app-toolbar input,.app-toolbar nav{--wails-draggable:no-drag}.toolbar-cluster{align-items:center;gap:.5rem;display:flex}.toolbar-cluster-left{min-width:0}.toolbar-cluster-right{justify-content:flex-end}@media (min-width:48rem){.desktop-chrome .app-toolbar{padding-left:80px}}.toolbar-title{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em;min-width:0;color:var(--color-base-content);padding:0 .25rem;font-size:15px;font-weight:700;overflow:hidden}@media (prefers-reduced-motion:no-preference){.toolbar-title{transition:color .12s}}.toolbar-title:hover{color:var(--color-primary)}.header-tabs{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tabs{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.header-tab{height:28px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .8rem;font-size:13px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.header-tab{white-space:nowrap;text-decoration:none}.header-tab:hover{color:var(--color-base-content)}.header-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.header-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.toolbar-icon-btn{width:34px;height:34px;color:var(--color-base-content);border:1px solid #0000;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.toolbar-icon-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.toolbar-icon-btn{transition:background-color .12s,color .12s,border-color .12s}}.toolbar-icon-btn:hover{color:var(--color-base-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.toolbar-icon-btn:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toolbar-icon-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (min-width:48rem){.app-toolbar label[for=nav-drawer]{display:none}}@media (min-width:40rem){.toolbar-search-link{display:none}}@media (max-width:39.9375rem){.app-toolbar{column-gap:.25rem;padding-inline:.5rem}.toolbar-cluster{gap:.25rem}.header-tab{padding:0 .55rem}}.toolbar-search{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:9999px;flex:0 auto;align-items:center;gap:.4rem;min-width:0;height:34px;padding:0 .6rem}@supports (color:color-mix(in lab, red, red)){.toolbar-search{background:color-mix(in oklab, var(--color-base-100) 70%, transparent)}}.toolbar-search{color:var(--color-base-content)}.toolbar-search:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-search:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toolbar-search:focus-within{background:var(--color-base-100)}.toolbar-search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:15px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.toolbar-search-input{width:auto;min-width:3rem;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:12rem;font-size:13px}.toolbar-search-input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.toolbar-search-input::placeholder{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.sidebar-filter{border:1px solid var(--color-neutral);background:var(--color-base-100);height:36px;color:var(--color-base-content);border-radius:.5rem;padding:0 .625rem}.sidebar-filter:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sidebar-filter:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.sidebar-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.sidebar-section-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-item{content-visibility:auto;contain-intrinsic-size:auto 52px}.conv-row{border-left:3px solid #0000;border-radius:.5rem;align-items:center;gap:.75rem;padding:.5rem .625rem;display:flex;position:relative}@media (prefers-reduced-motion:no-preference){.conv-row{transition:background-color .12s}}.conv-row:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.conv-row:hover{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}.conv-row-selected,.conv-row-selected:hover{border-left-color:var(--color-primary);background:#1b2330}[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:color-mix(in oklab, var(--color-primary) 12%, var(--color-base-300))}}.conv-name{color:var(--color-base-content);font-size:14px;font-weight:600}.conv-count{color:var(--color-base-content);flex-shrink:0;font-size:11px}@supports (color:color-mix(in lab, red, red)){.conv-count{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-preview{color:var(--color-base-content);font-size:12.5px;display:block}@supports (color:color-mix(in lab, red, red)){.conv-preview{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.conv-preview-sender{color:var(--color-base-content);font-weight:600}@supports (color:color-mix(in lab, red, red)){.conv-preview-sender{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.avatar-mono{color:#fff;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:12px;font-weight:600;line-height:1;display:inline-flex;position:relative}.presence-dot{border:2px solid var(--color-base-300);box-sizing:border-box;border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-1px}.presence-dot.src-signal{background:var(--color-info)}.presence-dot.src-imessage{background:var(--color-success)}.presence-dot.src-whatsapp{background:var(--color-whatsapp)}.presence-dot.src-unknown{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.presence-dot.src-unknown{background:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.source-pill{background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:.25rem;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}.source-pill.src-signal{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-signal{border-color:color-mix(in oklab, var(--color-primary) 35%, transparent)}}.source-pill.src-imessage{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{color:color-mix(in oklab, var(--color-success) 80%, white)}}.source-pill.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-imessage{color:var(--color-success)}.source-pill.src-whatsapp{color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{color:color-mix(in oklab, var(--color-whatsapp) 80%, white)}}.source-pill.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-whatsapp{color:var(--color-whatsapp)}.source-pill.src-unknown{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-unknown{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.source-pill.src-unknown{border-color:var(--color-neutral)}.conv-header-top{align-items:center;gap:.75rem;display:flex}.conv-header .avatar-mono{width:44px;height:44px;font-size:15px}.conv-header .presence-dot{border-color:var(--color-base-100)}.conv-title{letter-spacing:-.02em;color:var(--color-base-content);text-overflow:ellipsis;white-space:nowrap;font-size:22px;font-weight:700;line-height:1.15;overflow:hidden}@media (min-width:1024px){.conv-title{font-size:25px}}.conv-ids{flex-wrap:wrap;align-items:center;gap:.375rem;margin-top:.25rem;display:flex}.id-chip{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;gap:.3rem;padding:1px .5rem;font-size:11.5px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.id-chip{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.id-chip{background:0 0}.conv-meta{color:var(--color-base-content);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.625rem;font-size:12.5px;display:flex}@supports (color:color-mix(in lab, red, red)){.conv-meta{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.conv-meta-sep{opacity:.6}.meta-chip{color:var(--color-base-content);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.meta-chip{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.meta-chip:first-of-type{margin-left:.25rem}a.meta-chip:hover{color:var(--color-base-content)}.pin-btn{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:8px;align-items:center;gap:.35rem;padding:.25rem .625rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.pin-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.pin-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.pin-btn{transition:background .12s,color .12s,border-color .12s}}.pin-btn:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.pin-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.pin-btn-active{color:var(--color-primary-content);background:var(--color-primary);border-color:var(--color-primary)}.pin-btn-active:hover{color:var(--color-primary-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{background:color-mix(in oklab, var(--color-primary) 88%, black)}}.pin-btn-active:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{border-color:color-mix(in oklab, var(--color-primary) 88%, black)}}.transcript{max-width:calc(719px + 1.5rem)}.day-sep{align-items:center;gap:.75rem;margin:1.25rem 0 .75rem;display:flex}.day-sep:before,.day-sep:after{content:"";background:var(--color-neutral);flex:1;height:1px}@supports (color:color-mix(in lab, red, red)){.day-sep:before,.day-sep:after{background:color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.day-sep span{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);flex-shrink:0;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.day-sep span{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.sys-event{text-align:center;font-family:var(--font-mono);color:var(--color-base-content);margin:.5rem 0;padding:.15rem 0;font-size:12px;font-style:italic}@supports (color:color-mix(in lab, red, red)){.sys-event{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.msg-row,.sys-event{content-visibility:auto;contain-intrinsic-size:auto 2.2rem}.msg-row.target,.sys-event.target,.msg-row:target,.sys-event:target{content-visibility:visible}.msg-row{border-left:2px solid #0000;border-radius:0 6px 6px 0;grid-template-columns:76px 3px minmax(0,640px);align-items:start;column-gap:.75rem;padding:.2rem .5rem .2rem 0;display:grid}.msg-row-grouped{padding-top:.05rem}.msg-time{white-space:nowrap;color:var(--color-base-content);grid-column:1;justify-self:end;padding-top:.12rem;font-size:11px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.msg-time{color:color-mix(in oklab, var(--color-base-content) 32%, transparent)}}.msg-rail{border-radius:2px;grid-column:2;align-self:stretch;width:3px;min-height:1.1rem}.msg-rail.rail-me{background:var(--color-primary)}.msg-body{grid-column:3;min-width:0}.msg-sender{color:var(--color-base-content);font-size:12.5px;font-weight:600;line-height:1.3}@supports (color:color-mix(in lab, red, red)){.msg-sender{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.msg-sender-me{color:var(--color-secondary)}[data-theme=slate-light] .msg-sender-me{color:var(--color-primary)}.msg-text{color:var(--color-base-content);font-size:14px;line-height:1.55}.msg-row-me{border-left-color:var(--color-primary);background:#6f93d60d}[data-theme=slate-light] .msg-row-me{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .msg-row-me{background:color-mix(in oklab, var(--color-primary) 7%, transparent)}}.msg-attachments,.msg-links{flex-wrap:wrap;gap:.5rem;margin-top:.4rem;display:flex}.msg-thumb{border-radius:.5rem;display:inline-flex;overflow:hidden}.msg-thumb .thumb{border-radius:.5rem}.attach-chip{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:6px;align-items:center;gap:.35rem;max-width:100%;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.attach-chip{background:color-mix(in oklab, var(--color-base-content) 3%, transparent)}}.attach-chip{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.attach-chip{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}@media (prefers-reduced-motion:no-preference){.attach-chip{transition:border-color .12s,color .12s}}.attach-chip:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.attach-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.attach-chip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.link-pill{border:1px solid var(--color-primary);border-radius:6px;align-items:center;gap:.35rem;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-pill{border:1px solid color-mix(in oklab, var(--color-primary) 35%, transparent)}}.link-pill{color:var(--color-primary);background:var(--color-primary);font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-pill{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}@media (prefers-reduced-motion:no-preference){.link-pill{transition:background-color .12s,border-color .12s}}.link-pill:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{background:color-mix(in oklab, var(--color-primary) 12%, transparent)}}.link-pill:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, transparent)}}.msg-reactions{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.reaction-badge{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:999px;align-items:center;gap:.2rem;padding:.1rem .45rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.reaction-badge{background:color-mix(in oklab, var(--color-base-content) 4%, transparent)}}.reaction-badge{cursor:default;font-size:12px;line-height:1.4}.reaction-emoji{font-size:13px}.reaction-count{color:var(--color-base-content);font-size:11px}@supports (color:color-mix(in lab, red, red)){.reaction-count{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.screen-col{width:100%;max-width:780px;margin-inline:auto}.notice-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;padding:.95rem 1rem;display:block}.lightbox-close{color:#fff}.lightbox-caption{color:#fffc}.eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.eyebrow{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.screen-h1{letter-spacing:-.02em;color:var(--color-base-content);font-size:21px;font-weight:700;line-height:1.15}@media (min-width:1024px){.screen-h1{font-size:24px}}.screen-sub{color:var(--color-base-content);margin-top:.25rem;font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.screen-sub{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.home-hero-title{letter-spacing:-.025em;color:var(--color-base-content);font-size:38px;font-weight:700;line-height:1.05}.home-hero-tagline{color:var(--color-base-content);margin-top:.6rem;font-size:15px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.home-hero-tagline{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-strip{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;grid-template-columns:repeat(3,minmax(0,1fr));display:grid;overflow:hidden}.stat-cell{padding:1rem 1.1rem}.stat-cell+.stat-cell{border-left:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-left:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.stat-cell-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.stat-cell-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.stat-cell-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.4rem;font-size:28px;font-weight:700;line-height:1.1}.stat-cell-value-sm{font-size:14.5px;font-weight:600}@media (max-width:640px){.stat-strip{grid-template-columns:1fr}.stat-cell+.stat-cell{border-left:0;border-top:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-top:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}}.link-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;align-items:flex-start;gap:.75rem;padding:.95rem 1rem;display:flex}@media (prefers-reduced-motion:no-preference){.link-card{transition:background-color .12s,border-color .12s}}.link-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{background:color-mix(in oklab, var(--color-primary) 6%, var(--color-base-200))}}.link-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.link-card-icon{width:34px;height:34px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.link-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.link-card-icon{font-size:16px}.link-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.link-card-sub{color:var(--color-base-content);margin-top:.15rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-card-sub{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.search-field{border:1px solid var(--color-neutral);background:var(--color-base-200);height:48px;color:var(--color-base-content);border-radius:.75rem;align-items:center;gap:.6rem;padding:0 .9rem;display:flex}.search-field:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.search-field:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.search-field .search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:18px}@supports (color:color-mix(in lab, red, red)){.search-field .search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.search-field input{min-width:0;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:1;font-size:16px}.search-field input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.search-field input::placeholder{color:color-mix(in oklab, var(--color-base-content) 38%, transparent)}}.filter-row{flex-wrap:wrap;align-items:flex-end;gap:.6rem;display:flex}.filter-control{flex-direction:column;gap:.2rem;display:flex}.filter-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.filter-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.filter-input{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;padding:0 .55rem;font-size:13px}.filter-input:focus{border-color:var(--color-primary);outline:none}@supports (color:color-mix(in lab, red, red)){.filter-input:focus{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toggle-chip{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;align-items:center;gap:.35rem;padding:0 .7rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toggle-chip{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.toggle-chip{cursor:pointer;-webkit-user-select:none;user-select:none;font-size:13px}@media (prefers-reduced-motion:no-preference){.toggle-chip{transition:background-color .12s,color .12s,border-color .12s}}.toggle-chip:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toggle-chip input{appearance:none;border:1px solid;border-radius:3px;flex-shrink:0;width:13px;height:13px;position:relative}.toggle-chip input:checked{background:currentColor}.toggle-chip:has(input:checked){color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.toggle-chip:has(input:checked){background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.btn-search{background:var(--color-primary);height:34px;color:var(--color-primary-content);cursor:pointer;border:0;border-radius:.5rem;padding:0 1.1rem;font-size:13px;font-weight:600}@media (prefers-reduced-motion:no-preference){.btn-search{transition:filter .12s}}.btn-search:hover{filter:brightness(1.08)}.results-meta{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.results-meta{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.results-empty{color:var(--color-base-content);font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.results-empty{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.result-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.8rem .9rem;display:block}@media (prefers-reduced-motion:no-preference){.result-card{transition:background-color .12s,border-color .12s}}.result-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{background:color-mix(in oklab, var(--color-primary) 5%, var(--color-base-200))}}.result-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.result-card-top{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card-top{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.result-head{flex-wrap:wrap;align-items:center;gap:.4rem .5rem;display:flex}.result-conv{color:var(--color-base-content);font-size:13px;font-weight:600}.result-sender{color:var(--color-base-content);font-size:12.5px}@supports (color:color-mix(in lab, red, red)){.result-sender{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.result-ts{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:11.5px}@supports (color:color-mix(in lab, red, red)){.result-ts{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.result-spacer{flex:1}.result-glyph{color:var(--color-base-content);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.result-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.avatar-mono.avatar-sm{border-radius:6px;width:26px;height:26px;font-size:10px}.result-snippet{color:var(--color-base-content);margin-top:.4rem;font-size:13.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.result-snippet{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.result-snippet{word-break:break-word}.result-snippet mark,.search-mark mark{color:#f0d28a;background:#e8b84b47;border-radius:3px;padding:0 .12rem}[data-theme=slate-light] .result-snippet mark,[data-theme=slate-light] .search-mark mark{color:var(--color-warning)}.media-tabs{border-bottom:1px solid var(--color-neutral);align-items:center;gap:.25rem;display:flex}.media-tab{color:var(--color-base-content);border-bottom:2px solid #0000;align-items:center;gap:.4rem;margin-bottom:-1px;padding:.5rem .75rem;font-size:13.5px;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.media-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@media (prefers-reduced-motion:no-preference){.media-tab{transition:color .12s,border-color .12s}}.media-tab:hover{color:var(--color-base-content)}.media-tab-active,.media-tab-active:hover{color:var(--color-base-content);border-bottom-color:var(--color-primary)}.media-tab-badge{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.media-tab-badge{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.media-tab-active .media-tab-badge{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-tab-active .media-tab-badge{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.media-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem;display:grid}@media (min-width:640px){.media-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.media-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.media-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.media-tile{aspect-ratio:1;border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:9px;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.media-tile{transition:opacity .12s}}.media-tile:hover{opacity:.88}.media-tile img{object-fit:cover;width:100%;height:100%}.media-tile-scrim{pointer-events:none;background:linear-gradient(#0000,#000000b8);padding:1.4rem .5rem .4rem;position:absolute;inset:auto 0 0}.media-tile-name{font-family:var(--font-mono);color:#ffffffd9;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;display:block;overflow:hidden}.media-tile-placeholder{text-align:center;color:var(--color-base-content);flex-direction:column;justify-content:center;align-items:center;gap:.3rem;padding:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.media-tile-placeholder{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#1a1f26 0 9px,#161a20 9px 18px)}[data-theme=slate-light] .media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#e2e8f1 0 9px,#eef2f8 9px 18px)}.media-tile-placeholder .ph-name{font-family:var(--font-mono);word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:10px;line-height:1.2;display:-webkit-box;overflow:hidden}.media-tile-placeholder .ph-tag{border:1px solid var(--color-neutral);border-radius:5px;padding:0 .35rem;font-size:9.5px}.media-list{flex-direction:column;gap:.5rem;display:flex}.media-list-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.7rem .85rem}@media (prefers-reduced-motion:no-preference){.media-list-card{transition:border-color .12s}}.media-list-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-list-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.media-file-name{color:var(--color-base-content);align-items:center;gap:.4rem;font-size:13.5px;font-weight:500;display:inline-flex}.media-file-name:hover{color:var(--color-primary)}.media-card-meta{color:var(--color-base-content);margin-top:.25rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.media-card-meta{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.media-card-meta a{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.media-card-meta a{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.media-card-meta a:hover{color:var(--color-primary)}.media-link-url{color:var(--color-primary);word-break:break-all;font-size:13px;display:block}.media-link-url:hover{text-decoration:underline}.link-group-head{align-items:center;gap:.5rem;margin-bottom:.4rem;display:flex}.link-group-domain{color:var(--color-base-content);font-size:13.5px;font-weight:600}.link-group-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.link-group-count{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.settings-subnav{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-subnav{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.settings-tab{height:26px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .7rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.settings-tab{white-space:nowrap;text-decoration:none}.settings-tab:hover{color:var(--color-base-content)}.settings-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.settings-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.status-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;padding:1.1rem 1.2rem}.status-card-title{color:var(--color-base-content);margin-bottom:.85rem;font-size:14px;font-weight:600}.status-note{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.status-note{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.status-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem 1.1rem;display:grid}@media (min-width:640px){.status-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.status-metric-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-metric-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-metric-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.2rem;font-size:14px}.status-table{border-collapse:collapse;width:100%;font-size:13px}.status-table th{text-align:left;letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);padding:.45rem .6rem;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-table th{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-table th{border-bottom:1px solid var(--color-neutral)}.status-table td{border-bottom:1px solid var(--color-neutral);padding:.5rem .6rem}@supports (color:color-mix(in lab, red, red)){.status-table td{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 55%, transparent)}}.status-table td{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.status-table td{color:color-mix(in oklab, var(--color-base-content) 80%, transparent)}}.status-table tr:last-child td{border-bottom:0}.status-table .mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tier-pill{border:1px solid #0000;border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;display:inline-flex}.tier-pill.tier-daily{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-daily{border-color:color-mix(in oklab, var(--color-info) 35%, transparent)}}.tier-pill.tier-monthly{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{color:color-mix(in oklab, var(--color-success) 80%, white)}}.tier-pill.tier-monthly{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .tier-pill.tier-monthly{color:var(--color-success)}.tier-pill.tier-quarterly,.tier-pill.tier-yearly{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-quarterly,.tier-pill.tier-yearly{border-color:color-mix(in oklab, var(--color-warning) 35%, transparent)}}.tier-pill.tier-never{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-never{border-color:color-mix(in oklab, var(--color-error) 35%, transparent)}}.copy-block{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:.5rem;position:relative}.copy-pre{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem 3rem .65rem .85rem;font-size:12.5px;line-height:1.6;overflow-x:auto}@supports (color:color-mix(in lab, red, red)){.copy-pre{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.copy-btn{border:1px solid var(--color-neutral);background:var(--color-base-200);width:1.9rem;height:1.9rem;color:var(--color-base-content);border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:.4rem;right:.4rem}@supports (color:color-mix(in lab, red, red)){.copy-btn{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.copy-btn{cursor:pointer}@media (prefers-reduced-motion:no-preference){.copy-btn{transition:background-color .12s,color .12s}}.copy-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.copy-btn:hover{background:color-mix(in oklab, var(--color-primary) 10%, var(--color-base-200))}}.copy-btn:hover{color:var(--color-base-content)}.copy-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.copy-btn .icon-check,.copy-btn.copied .icon-copy{display:none}.copy-btn.copied .icon-check{color:var(--color-success);display:inline-flex}.qr-panel{flex-wrap:wrap;align-items:flex-start;gap:1.1rem;display:flex}.qr-img{border:1px solid var(--color-neutral);image-rendering:pixelated;border-radius:.5rem;flex-shrink:0}.qr-panel-text{flex:16rem}.setup-cards{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.setup-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;align-items:flex-start;gap:.85rem;padding:1rem 1.1rem;display:flex}.setup-card-not-detected{opacity:.72}.setup-card-icon{width:38px;height:38px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.setup-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.setup-card-icon.src-signal{color:var(--color-info);background:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.setup-card-icon.src-signal{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{border-color:color-mix(in oklab, var(--color-info) 25%, transparent)}}.setup-card-icon.src-imessage{color:var(--color-success);background:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{background:color-mix(in oklab, var(--color-success) 10%, transparent)}}.setup-card-icon.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{border-color:color-mix(in oklab, var(--color-success) 25%, transparent)}}.setup-card-icon.src-whatsapp{color:var(--color-whatsapp);background:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{background:color-mix(in oklab, var(--color-whatsapp) 10%, transparent)}}.setup-card-icon.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 25%, transparent)}}.setup-card-body{flex:1}.setup-card-head{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.setup-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.setup-card-detail{color:var(--color-base-content);margin-top:.25rem;font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-card-detail{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-card-actions{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;margin-top:.7rem;display:flex}.setup-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-badge-enabled{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{color:color-mix(in oklab, var(--color-success) 80%, white)}}.setup-badge-enabled{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{border-color:color-mix(in oklab, var(--color-success) 35%, transparent)}}[data-theme=slate-light] .setup-badge-enabled{color:var(--color-success)}.setup-badge-ready{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-badge-ready{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.setup-badge-needs-permission{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.setup-badge-needs-permission{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.setup-badge-not-detected{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-badge-not-detected{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-badge-not-detected{border-color:var(--color-neutral)}.setup-badge-synced{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-badge-synced{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.sync-badge{border:1px solid var(--color-neutral);white-space:nowrap;color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.sync-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.sync-badge-ok{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.sync-badge-ok{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.sync-badge-warn{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.sync-badge-warn{border-color:color-mix(in oklab, var(--color-warning) 45%, var(--color-neutral))}}.sync-badge-err{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.sync-badge-err{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.sync-badge-info{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sync-badge-info{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.setup-btn{border:1px solid var(--color-primary);background:var(--color-primary);height:32px;color:var(--color-primary-content);cursor:pointer;border-radius:.5rem;padding:0 .95rem;font-size:12.5px;font-weight:600}@media (prefers-reduced-motion:no-preference){.setup-btn{transition:filter .12s}}.setup-btn:hover:not(:disabled){filter:brightness(1.08)}.setup-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-btn:disabled{cursor:not-allowed;opacity:.55;color:var(--color-base-content);background:0 0}@supports (color:color-mix(in lab, red, red)){.setup-btn:disabled{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-btn:disabled{border-color:var(--color-neutral)}.setup-note{color:var(--color-base-content);align-items:center;gap:.3rem;font-size:12px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-note{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-note-ok{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-note-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-note-ok{color:var(--color-success)}.setup-note-warn{color:var(--color-warning)}.setup-footnote{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-footnote{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}@supports (color:color-mix(in lab, red, red)){}.setup-progress{margin-top:.55rem}.setup-progress:empty{display:none}.setup-progress-state{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;display:flex}.setup-progress-line{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-progress-line{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.setup-progress-line{margin:0}.setup-progress-ok{color:var(--color-success);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-progress-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-progress-ok{color:var(--color-success)}.setup-progress-err{color:var(--color-error)}.setup-progress-warn{color:var(--color-warning)}.setup-progress-unavailable{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.setup-progress-unavailable{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-progress-spin{border:2px solid var(--color-primary);border-radius:50%;width:14px;height:14px}@supports (color:color-mix(in lab, red, red)){.setup-progress-spin{border:2px solid color-mix(in oklab, var(--color-primary) 30%, transparent)}}.setup-progress-spin{border-top-color:var(--color-primary);flex:none}@media (prefers-reduced-motion:no-preference){.setup-progress-spin{animation:.7s linear infinite setup-progress-spin}}@keyframes setup-progress-spin{to{transform:rotate(360deg)}}.setup-btn-ghost{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0;align-items:center;gap:.3rem;display:inline-flex}.setup-btn-ghost:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-btn-ghost:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-btn-danger{border-color:var(--color-error);background:var(--color-error);color:var(--color-error-content,#fff)}.setup-btn-danger:focus-visible{outline-color:var(--color-error)}.setup-iconbtn{border:1px solid var(--color-neutral);width:26px;height:26px;color:var(--color-base-content);background:0 0;border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.setup-iconbtn{cursor:pointer;flex:none}.setup-iconbtn:hover:not(:disabled){background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-iconbtn:hover:not(:disabled){color:var(--color-base-content)}.setup-iconbtn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-iconbtn:disabled{cursor:not-allowed;opacity:.45}.setup-guide{z-index:60;justify-content:center;align-items:center;padding:1.25rem;display:flex;position:fixed;inset:0}.setup-guide[hidden]{display:none}.setup-guide-backdrop{background:var(--color-base-300);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.setup-guide-backdrop{background:color-mix(in oklab, var(--color-base-300) 78%, black)}}.setup-guide-backdrop{opacity:.7}.setup-guide-panel{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.9rem;width:min(30rem,100%);max-height:calc(100vh - 2.5rem);padding:1.15rem 1.25rem 1.25rem;position:relative;overflow-y:auto;box-shadow:0 18px 48px -12px oklab(0% none none/.55)}.setup-guide-head{justify-content:space-between;align-items:flex-start;gap:.75rem;display:flex}.setup-guide-title{color:var(--color-base-content);margin:0;font-size:15px;font-weight:600}.setup-guide-close{width:30px;height:30px;color:var(--color-base-content);background:0 0;border:1px solid #0000;border-radius:.5rem;flex:none;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-guide-close{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-guide-close{cursor:pointer}.setup-guide-close:hover{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-close:hover{background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-close:hover{color:var(--color-base-content)}.setup-guide-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-guide-summary{color:var(--color-base-content);margin-top:.5rem;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.setup-guide-summary{color:color-mix(in oklab, var(--color-base-content) 68%, transparent)}}.setup-guide-steps{color:var(--color-base-content);flex-direction:column;gap:.4rem;margin:.85rem 0 0;padding-left:1.25rem;font-size:12.5px;line-height:1.5;list-style:decimal;display:flex}.setup-guide-actions{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;margin-top:1.1rem;display:flex}.setup-guide-settings{align-items:center;gap:.35rem;text-decoration:none;display:inline-flex}.setup-guide-recheck{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0}.setup-guide-recheck:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-recheck:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-result{color:var(--color-warning);margin:.7rem 0 0;font-size:12px;line-height:1.5}.setup-guide-result:empty{display:none}.log-entry-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.log-entry-title{color:var(--color-base-content);font-size:15px;font-weight:600}.log-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:.4rem;padding:.1rem .5rem;font-size:11px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.log-badge{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.log-badge{white-space:nowrap}.log-badge-failed{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.log-badge-failed{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.log-badge-done{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.log-badge-done{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.log-badge-active{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.log-badge-active{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.log-status-line{color:var(--color-base-content);margin:.55rem 0 0;font-size:13px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.log-status-line{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.log-meta{gap:.4rem;margin-top:.7rem;display:grid}.log-meta-row{grid-template-columns:7.5rem 1fr;gap:.5rem;font-size:12.5px;line-height:1.5;display:grid}.log-meta-label{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-label{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.log-meta-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-value{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.log-meta-value{overflow-wrap:anywhere}.log-output{max-height:16rem;font-family:var(--font-mono);white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem .85rem;font-size:12px;line-height:1.55;overflow:auto}@supports (color:color-mix(in lab, red, red)){.log-output{color:color-mix(in oklab, var(--color-base-content) 85%, transparent)}}.log-empty{color:var(--color-base-content);font-size:13px}@supports (color:color-mix(in lab, red, red)){.log-empty{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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:"<percentage>";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:"<percentage>";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:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";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} -/* Manual mirror of internal/web/tailwind/input.css Providers-grid changes - (the tailwind CLI is unavailable offline; `make css` regenerates this). */ -.setup-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))} -@media (max-width:640px){.setup-cards{grid-template-columns:minmax(0,1fr)}} -.setup-card-coming-soon{opacity:.72} -.setup-card-icon.src-telegram{color:var(--color-info);background:color-mix(in oklab, var(--color-info) 10%, transparent);border-color:color-mix(in oklab, var(--color-info) 25%, transparent)} -.setup-badge-coming-soon{color:color-mix(in oklab, var(--color-base-content) 50%, transparent);border-color:var(--color-neutral)} +@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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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-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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-500:oklch(58.5% .233 277.117);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-500:oklch(64.5% .246 16.439);--color-black:#000;--spacing:.25rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:"<percentage>";inherits:true;initial-value:0%}@property --aura-angle{syntax:"<angle>";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}:where(:root),:root:has(input.theme-controller[value=slate]:checked),[data-theme=slate]{color-scheme:dark;--color-base-100:#0f1216;--color-base-200:#13171c;--color-base-300:#161a20;--color-base-content:#dbe2ea;--color-primary:#6f93d6;--color-primary-content:#0f1216;--color-secondary:#9bb6e6;--color-secondary-content:#0f1216;--color-accent:#6f93d6;--color-accent-content:#0f1216;--color-neutral:#232a33;--color-neutral-content:#dbe2ea;--color-info:#3b82f6;--color-info-content:#0f1216;--color-success:#34c759;--color-success-content:#0f1216;--color-warning:#e8b84b;--color-warning-content:#0f1216;--color-error:#f43f5e;--color-error-content:#0f1216;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}:root:has(input.theme-controller[value=slate-light]:checked),[data-theme=slate-light]{color-scheme:light;--color-base-100:#f7f9fc;--color-base-200:#eef2f8;--color-base-300:#e2e8f1;--color-base-content:#1a2330;--color-primary:#3f63ad;--color-primary-content:#f7f9fc;--color-secondary:#5b7cc0;--color-secondary-content:#f7f9fc;--color-accent:#3f63ad;--color-accent-content:#f7f9fc;--color-neutral:#cdd6e3;--color-neutral-content:#1a2330;--color-info:#2563eb;--color-info-content:#f7f9fc;--color-success:#15803d;--color-success-content:#f7f9fc;--color-warning:#b7791f;--color-warning-content:#f7f9fc;--color-error:#be123c;--color-error-content:#f7f9fc;--radius-selector:.5rem;--radius-field:.625rem;--radius-box:.875rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:0;--noise:0}}@layer components;@layer utilities{@layer daisyui.l1.l2{.diff{webkit-user-select:none;-webkit-user-select:none;user-select:none;direction:ltr;grid-template-rows:1fr 1.8rem 1fr;grid-template-columns:auto 1fr;align-items:normal;width:100%;display:grid;position:relative;overflow:hidden;container-type:inline-size}.diff:focus-visible,.diff:has(.diff-item-1:focus-visible),.diff:focus-visible{outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px;outline-color:var(--color-base-content)}.diff:focus-visible .diff-resizer{min-width:95cqi;max-width:95cqi}.diff:has(.diff-item-1:focus-visible){outline-style:var(--tw-outline-style);outline-offset:1px;outline-width:2px}.diff:has(.diff-item-1:focus-visible) .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:hover .diff-item-2:after{height:2.4rem}@supports (-webkit-overflow-scrolling:touch) and (overflow:-webkit-paged-x){.diff:focus .diff-resizer{min-width:5cqi;max-width:5cqi}.diff:has(.diff-item-1:focus) .diff-resizer{min-width:95cqi;max-width:95cqi}}.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.drawer-open>.drawer-side{overflow-y:auto}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-inset,50% auto);inset-block:auto var(--tt-off)}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset-inline:var(--tt-tail-inset,50% auto);inset-block:auto var(--tt-tail)}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-hover-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:var(--btn-hover-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-hover-border,var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:var(--btn-hover-border,color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)))}}.btn:hover{--btn-border-style:solid;--btn-inset:var(--btn-hover-inset,0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%)));--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:var(--btn-hover-shadow,0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000))}}}.btn:active:not(.btn-active){translate:0 var(--btn-active-translate,.5px);--btn-bg:var(--btn-active-bg,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:var(--btn-active-bg,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%))}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-active-border,var(--btn-color,var(--color-base-200)))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:var(--btn-active-border,color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%))}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:var(--btn-active-inset,0 0 0 0 oklch(0% 0 0/0));--btn-shadow:var(--btn-active-shadow,0 0 0 0 oklch(0% 0 0/0))}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}:where(.navbar){position:relative}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Ccircle cx='20' cy='12' r='3'/%3E%3C/svg%3E")}@media (prefers-reduced-motion:no-preference){.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.link-hover{text-decoration-line:none}@media (hover:hover){.link-hover:hover{text-decoration-line:underline}}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}}@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete, visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:oklch(0% 0 0/.4);place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}@supports (color:color-mix(in lab, red, red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){will-change:auto;transform:none}:where(:root:has(.drawer-toggle:checked)){--page-scroll-lock: }.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dock{z-index:1;background-color:var(--color-base-100);color:currentColor;border-top:.5px solid var(--color-base-content);flex-direction:row;justify-content:space-around;align-items:center;width:100%;padding:.5rem;display:flex;position:fixed;bottom:0;left:0;right:0}@supports (color:color-mix(in lab, red, red)){.dock{border-top:.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)}}.dock{height:4rem;height:calc(4rem + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom)}.dock>*{cursor:pointer;border-radius:var(--radius-box);background-color:#0000;flex-direction:column;flex-shrink:1;flex-basis:100%;justify-content:center;align-items:center;gap:1px;max-width:8rem;height:100%;margin-bottom:.5rem;transition:opacity .2s ease-out;display:flex;position:relative}@media (hover:hover){.dock>:hover{opacity:.8}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.dock>[aria-disabled=true],.dock>[disabled]),:is(.dock>[aria-disabled=true],.dock>[disabled]):hover{opacity:1}.dock>* .dock-label{font-size:.6875rem}.dock>:after{content:"";background-color:#0000;border-top:3px solid #0000;border-radius:3.40282e38px;width:1.5rem;height:.25rem;transition:background-color .1s ease-out,text-color .1s ease-out,width .1s ease-out;position:absolute;bottom:.2rem}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:"00\a 01\a 02\a 03\a 04\a 05\a 06\a 07\a 08\a 09\a 10\a 11\a 12\a 13\a 14\a 15\a 16\a 17\a 18\a 19\a 20\a 21\a 22\a 23\a 24\a 25\a 26\a 27\a 28\a 29\a 30\a 31\a 32\a 33\a 34\a 35\a 36\a 37\a 38\a 39\a 40\a 41\a 42\a 43\a 44\a 45\a 46\a 47\a 48\a 49\a 50\a 51\a 52\a 53\a 54\a 55\a 56\a 57\a 58\a 59\a 60\a 61\a 62\a 63\a 64\a 65\a 66\a 67\a 68\a 69\a 70\a 71\a 72\a 73\a 74\a 75\a 76\a 77\a 78\a 79\a 80\a 81\a 82\a 83\a 84\a 85\a 86\a 87\a 88\a 89\a 90\a 91\a 92\a 93\a 94\a 95\a 96\a 97\a 98\a 99\a ";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s;height:auto;overflow:revert-layer}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.validator:user-valid{--input-color:var(--color-success)}.validator:user-valid:focus{--input-color:var(--color-success)}.validator:user-valid:checked{--input-color:var(--color-success)}.validator:user-valid[aria-checked=true]{--input-color:var(--color-success)}.validator:user-valid:focus-within{--input-color:var(--color-success)}.validator:has(:user-valid){--input-color:var(--color-success)}.validator:has(:user-valid):focus{--input-color:var(--color-success)}.validator:has(:user-valid):checked{--input-color:var(--color-success)}.validator:has(:user-valid)[aria-checked=true]{--input-color:var(--color-success)}.validator:has(:user-valid):focus-within{--input-color:var(--color-success)}.validator:user-invalid{--input-color:var(--color-error)}.validator:user-invalid:focus{--input-color:var(--color-error)}.validator:user-invalid:checked{--input-color:var(--color-error)}.validator:user-invalid[aria-checked=true]{--input-color:var(--color-error)}.validator:user-invalid:focus-within{--input-color:var(--color-error)}.validator:user-invalid~.validator-hint{visibility:visible;color:var(--color-error)}.validator:has(:user-invalid){--input-color:var(--color-error)}.validator:has(:user-invalid):focus{--input-color:var(--color-error)}.validator:has(:user-invalid):checked{--input-color:var(--color-error)}.validator:has(:user-invalid)[aria-checked=true]{--input-color:var(--color-error)}.validator:has(:user-invalid):focus-within{--input-color:var(--color-error)}.validator:has(:user-invalid)~.validator-hint{visibility:visible;color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))),:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):checked,:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))[aria-checked=true],:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false]))):focus-within{--input-color:var(--color-error)}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{visibility:visible;color:var(--color-error)}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input input::-webkit-inner-spin-button{margin-inline-end:-.15em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{direction:ltr}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-inline-end:-.75rem;margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.chat-bubble{border-radius:var(--radius-field);background-color:var(--color-base-300);width:fit-content;color:var(--color-base-content);grid-row-end:3;min-width:2.5rem;max-width:90%;min-height:2rem;padding-block:.5rem;padding-inline:1rem;display:block;position:relative}.chat-bubble:before{background-color:inherit;content:"";width:.75rem;height:.75rem;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-chat);-webkit-mask-image:var(--mask-chat);mask-image:var(--mask-chat);position:absolute;bottom:0;-webkit-mask-position:0 -1px;mask-position:0 -1px;-webkit-mask-size:.8125rem;mask-size:.8125rem}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0, 1fr)) auto var(--timeline-row-end,minmax(0, 1fr));grid-template-columns:var(--timeline-col-start,minmax(0, 1fr)) auto var(--timeline-col-end,minmax(0, 1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.hero{background-position:50%;background-size:cover;place-items:center;width:100%;display:grid}.hero>*{grid-row-start:1;grid-column-start:1}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem) * 10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>:not(script,style,template){place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>:not(script,style,template){place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border) dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)}}.stat:not(:last-child){border-block-end:none}.chat{--mask-chat:url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");grid-auto-rows:min-content;column-gap:.75rem;padding-block:.25rem;display:grid}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}}@layer daisyui.l1{.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset):not([type=checkbox])) :not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.validator:user-invalid~.validator-hint{display:revert-layer}.validator:has(:user-invalid)~.validator-hint{display:revert-layer}:is(.validator[aria-invalid]:not([aria-invalid=false]),.validator:has([aria-invalid]:not([aria-invalid=false])))~.validator-hint{display:revert-layer}.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}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\[\"\+\"54px\]{top:"+"54px}.right-4{right:calc(var(--spacing) * 4)}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;--join-v:0;--join-h:1;align-items:stretch;display:inline-flex}@scope(.join){:scope>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){:scope>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}:scope :where(:scope>:first-child){--join-ss:var(--radius-field);--join-se:calc(var(--radius-field) * var(--join-v));--join-es:calc(var(--radius-field) * var(--join-h));--join-ee:0}:scope :where(:scope>:last-child){--join-ss:0;--join-se:calc(var(--radius-field) * var(--join-h));--join-es:calc(var(--radius-field) * var(--join-v));--join-ee:var(--radius-field)}:scope :where(:scope>:only-child){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.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}}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mb-1{margin-bottom:var(--spacing)}.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-8{margin-bottom:calc(var(--spacing) * 8)}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-\[1\.15em\]{width:1.15em;height:1.15em}.h-full{height:100%}.min-h-0{min-height:0}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-base-300{border-color:var(--color-base-300)}.border-neutral{border-color:var(--color-neutral)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-base-100,.bg-base-100\/90{background-color:var(--color-base-100)}@supports (color:color-mix(in lab, red, red)){.bg-base-100\/90{background-color:color-mix(in oklab, var(--color-base-100) 90%, transparent)}}.bg-base-200{background-color:var(--color-base-200)}.bg-base-300{background-color:var(--color-base-300)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.p-3{padding:calc(var(--spacing) * 3)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-base-content{color:var(--color-base-content)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.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,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.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)}.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,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-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))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:opacity-100:hover{opacity:1}}@media (min-width:40rem){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:48rem){@layer daisyui.l1.l2.l3{.md\:drawer-open>.drawer-toggle:checked~.drawer-side{scrollbar-color:revert-layer}:root:has(.md\:drawer-open>.drawer-toggle:checked){--page-scroll-lock:revert-layer}}@layer daisyui.l1.l2{.md\:drawer-open>.drawer-side{overflow-y:auto}.md\:drawer-open>.drawer-toggle{display:none}.md\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;overscroll-behavior:auto;opacity:1;width:auto;display:block;position:sticky}.md\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:#0000}.md\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}}@layer daisyui.l1{.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay),[dir=rtl] :is(.md\:drawer-open>.drawer-toggle~.drawer-side>:not(.drawer-overlay)){translate:0%}}.md\:hidden{display:none}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}}@media (min-width:64rem){.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)}}}:root{--color-whatsapp:#25d366}[data-theme=slate-light]{--color-whatsapp:#128c7e}:root{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, monospace}html{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tabular-nums{font-variant-numeric:tabular-nums}.thumb{max-width:220px;max-height:220px}.lightbox{display:none}.lightbox:target{z-index:50;background:oklab(0% none none/.85);flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:1.5rem;display:flex;position:fixed;inset:0}.lightbox img{border-radius:.5rem;max-width:92vw;max-height:80vh}.msg-quote{border-left:3px solid}@supports (color:color-mix(in lab, red, red)){.msg-quote{border-left:3px solid color-mix(in oklab, currentColor 35%, transparent)}}.msg-quote{opacity:.75;margin:.25rem 0;padding:.1rem 0 .1rem .6rem;font-size:.95em}@keyframes target-flash{0%{background-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}to{background-color:#0000}}.target.msg-row,.target.sys-event{animation:2.5s ease-out target-flash}.theme-switching *{transition:none!important}body{flex-direction:column;height:100dvh;display:flex;overflow:hidden}.app-shell{flex:1 1 0;grid-template-rows:minmax(0,1fr);min-height:0}.app-shell>.drawer-content{flex-direction:column;min-height:0;display:flex;overflow:hidden}#main-content{flex:1 1 0;min-height:0;overflow-y:auto}#main-content:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}@media (min-width:48rem){.app-shell>.drawer-side{height:100%;overflow-y:hidden}}.app-toolbar{background:var(--color-base-300);flex-shrink:0;grid-template-columns:minmax(0,1fr) auto 1fr;align-items:center;column-gap:.5rem;height:52px;min-height:52px;display:grid}@supports (color:color-mix(in lab, red, red)){.app-toolbar{background:color-mix(in oklab, var(--color-base-300) 80%, transparent)}}.app-toolbar{-webkit-backdrop-filter:saturate(180%)blur(20px);backdrop-filter:saturate(180%)blur(20px);border-bottom:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.app-toolbar{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 85%, transparent)}}.app-toolbar{--wails-draggable:drag}.app-toolbar a,.app-toolbar button,.app-toolbar label,.app-toolbar form,.app-toolbar input,.app-toolbar nav{--wails-draggable:no-drag}.toolbar-cluster{align-items:center;gap:.5rem;display:flex}.toolbar-cluster-left{min-width:0}.toolbar-cluster-right{justify-content:flex-end}@media (min-width:48rem){.desktop-chrome .app-toolbar{padding-left:80px}}.toolbar-title{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em;min-width:0;color:var(--color-base-content);padding:0 .25rem;font-size:15px;font-weight:700;overflow:hidden}@media (prefers-reduced-motion:no-preference){.toolbar-title{transition:color .12s}}.toolbar-title:hover{color:var(--color-primary)}.header-tabs{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tabs{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.header-tab{height:28px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .8rem;font-size:13px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.header-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.header-tab{white-space:nowrap;text-decoration:none}.header-tab:hover{color:var(--color-base-content)}.header-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.header-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.toolbar-icon-btn{width:34px;height:34px;color:var(--color-base-content);border:1px solid #0000;border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.toolbar-icon-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.toolbar-icon-btn{transition:background-color .12s,color .12s,border-color .12s}}.toolbar-icon-btn:hover{color:var(--color-base-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.toolbar-icon-btn:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-icon-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toolbar-icon-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (min-width:48rem){.app-toolbar label[for=nav-drawer]{display:none}}@media (min-width:40rem){.toolbar-search-link{display:none}}@media (max-width:39.9375rem){.app-toolbar{column-gap:.25rem;padding-inline:.5rem}.toolbar-cluster{gap:.25rem}.header-tab{padding:0 .55rem}}.toolbar-search{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:9999px;flex:0 auto;align-items:center;gap:.4rem;min-width:0;height:34px;padding:0 .6rem}@supports (color:color-mix(in lab, red, red)){.toolbar-search{background:color-mix(in oklab, var(--color-base-100) 70%, transparent)}}.toolbar-search{color:var(--color-base-content)}.toolbar-search:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toolbar-search:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toolbar-search:focus-within{background:var(--color-base-100)}.toolbar-search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:15px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toolbar-search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.toolbar-search-input{width:auto;min-width:3rem;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:12rem;font-size:13px}.toolbar-search-input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.toolbar-search-input::placeholder{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.sidebar-filter{border:1px solid var(--color-neutral);background:var(--color-base-100);height:36px;color:var(--color-base-content);border-radius:.5rem;padding:0 .625rem}.sidebar-filter:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sidebar-filter:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.sidebar-section-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.sidebar-section-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-item{content-visibility:auto;contain-intrinsic-size:auto 52px}.conv-row{border-left:3px solid #0000;border-radius:.5rem;align-items:center;gap:.75rem;padding:.5rem .625rem;display:flex;position:relative}@media (prefers-reduced-motion:no-preference){.conv-row{transition:background-color .12s}}.conv-row:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.conv-row:hover{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}.conv-row-selected,.conv-row-selected:hover{border-left-color:var(--color-primary);background:#1b2330}[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .conv-row-selected,[data-theme=slate-light] .conv-row-selected:hover{background:color-mix(in oklab, var(--color-primary) 12%, var(--color-base-300))}}.conv-name{color:var(--color-base-content);font-size:14px;font-weight:600}.conv-count{color:var(--color-base-content);flex-shrink:0;font-size:11px}@supports (color:color-mix(in lab, red, red)){.conv-count{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.conv-preview{color:var(--color-base-content);font-size:12.5px;display:block}@supports (color:color-mix(in lab, red, red)){.conv-preview{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.conv-preview-sender{color:var(--color-base-content);font-weight:600}@supports (color:color-mix(in lab, red, red)){.conv-preview-sender{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.avatar-mono{color:#fff;-webkit-user-select:none;user-select:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;font-size:12px;font-weight:600;line-height:1;display:inline-flex;position:relative}.presence-dot{border:2px solid var(--color-base-300);box-sizing:border-box;border-radius:50%;width:11px;height:11px;position:absolute;bottom:-1px;right:-1px}.presence-dot.src-signal{background:var(--color-info)}.presence-dot.src-imessage{background:var(--color-success)}.presence-dot.src-whatsapp{background:var(--color-whatsapp)}.presence-dot.src-unknown{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.presence-dot.src-unknown{background:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.source-pill{background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:.25rem;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}.source-pill.src-signal{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-signal{border-color:color-mix(in oklab, var(--color-primary) 35%, transparent)}}.source-pill.src-imessage{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{color:color-mix(in oklab, var(--color-success) 80%, white)}}.source-pill.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-imessage{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-imessage{color:var(--color-success)}.source-pill.src-whatsapp{color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{color:color-mix(in oklab, var(--color-whatsapp) 80%, white)}}.source-pill.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 30%, transparent)}}[data-theme=slate-light] .source-pill.src-whatsapp{color:var(--color-whatsapp)}.source-pill.src-unknown{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.source-pill.src-unknown{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.source-pill.src-unknown{border-color:var(--color-neutral)}.conv-header-top{align-items:center;gap:.75rem;display:flex}.conv-header .avatar-mono{width:44px;height:44px;font-size:15px}.conv-header .presence-dot{border-color:var(--color-base-100)}.conv-title{letter-spacing:-.02em;color:var(--color-base-content);text-overflow:ellipsis;white-space:nowrap;font-size:22px;font-weight:700;line-height:1.15;overflow:hidden}@media (min-width:1024px){.conv-title{font-size:25px}}.conv-ids{flex-wrap:wrap;align-items:center;gap:.375rem;margin-top:.25rem;display:flex}.id-chip{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;gap:.3rem;padding:1px .5rem;font-size:11.5px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.id-chip{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.id-chip{background:0 0}.conv-meta{color:var(--color-base-content);flex-wrap:wrap;align-items:center;gap:.5rem;margin-top:.625rem;font-size:12.5px;display:flex}@supports (color:color-mix(in lab, red, red)){.conv-meta{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.conv-meta-sep{opacity:.6}.meta-chip{color:var(--color-base-content);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.meta-chip{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.meta-chip:first-of-type{margin-left:.25rem}a.meta-chip:hover{color:var(--color-base-content)}.pin-btn{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:8px;align-items:center;gap:.35rem;padding:.25rem .625rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.pin-btn{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.pin-btn{cursor:pointer;background:0 0}@media (prefers-reduced-motion:no-preference){.pin-btn{transition:background .12s,color .12s,border-color .12s}}.pin-btn:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.pin-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn:hover{background:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.pin-btn-active{color:var(--color-primary-content);background:var(--color-primary);border-color:var(--color-primary)}.pin-btn-active:hover{color:var(--color-primary-content);background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{background:color-mix(in oklab, var(--color-primary) 88%, black)}}.pin-btn-active:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.pin-btn-active:hover{border-color:color-mix(in oklab, var(--color-primary) 88%, black)}}.transcript{max-width:calc(719px + 1.5rem)}.day-sep{align-items:center;gap:.75rem;margin:1.25rem 0 .75rem;display:flex}.day-sep:before,.day-sep:after{content:"";background:var(--color-neutral);flex:1;height:1px}@supports (color:color-mix(in lab, red, red)){.day-sep:before,.day-sep:after{background:color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.day-sep span{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);flex-shrink:0;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.day-sep span{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.sys-event{text-align:center;font-family:var(--font-mono);color:var(--color-base-content);margin:.5rem 0;padding:.15rem 0;font-size:12px;font-style:italic}@supports (color:color-mix(in lab, red, red)){.sys-event{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.msg-row,.sys-event{content-visibility:auto;contain-intrinsic-size:auto 2.2rem}.msg-row.target,.sys-event.target,.msg-row:target,.sys-event:target{content-visibility:visible}.msg-row{border-left:2px solid #0000;border-radius:0 6px 6px 0;grid-template-columns:76px 3px minmax(0,640px);align-items:start;column-gap:.75rem;padding:.2rem .5rem .2rem 0;display:grid}.msg-row-grouped{padding-top:.05rem}.msg-time{white-space:nowrap;color:var(--color-base-content);grid-column:1;justify-self:end;padding-top:.12rem;font-size:11px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.msg-time{color:color-mix(in oklab, var(--color-base-content) 32%, transparent)}}.msg-rail{border-radius:2px;grid-column:2;align-self:stretch;width:3px;min-height:1.1rem}.msg-rail.rail-me{background:var(--color-primary)}.msg-body{grid-column:3;min-width:0}.msg-sender{color:var(--color-base-content);font-size:12.5px;font-weight:600;line-height:1.3}@supports (color:color-mix(in lab, red, red)){.msg-sender{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.msg-sender-me{color:var(--color-secondary)}[data-theme=slate-light] .msg-sender-me{color:var(--color-primary)}.msg-text{color:var(--color-base-content);font-size:14px;line-height:1.55}.msg-row-me{border-left-color:var(--color-primary);background:#6f93d60d}[data-theme=slate-light] .msg-row-me{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){[data-theme=slate-light] .msg-row-me{background:color-mix(in oklab, var(--color-primary) 7%, transparent)}}.msg-attachments,.msg-links{flex-wrap:wrap;gap:.5rem;margin-top:.4rem;display:flex}.msg-thumb{border-radius:.5rem;display:inline-flex;overflow:hidden}.msg-thumb .thumb{border-radius:.5rem}.attach-chip{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:6px;align-items:center;gap:.35rem;max-width:100%;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.attach-chip{background:color-mix(in oklab, var(--color-base-content) 3%, transparent)}}.attach-chip{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.attach-chip{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}@media (prefers-reduced-motion:no-preference){.attach-chip{transition:border-color .12s,color .12s}}.attach-chip:hover{color:var(--color-base-content);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.attach-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.attach-chip span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.link-pill{border:1px solid var(--color-primary);border-radius:6px;align-items:center;gap:.35rem;padding:.2rem .55rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-pill{border:1px solid color-mix(in oklab, var(--color-primary) 35%, transparent)}}.link-pill{color:var(--color-primary);background:var(--color-primary);font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-pill{background:color-mix(in oklab, var(--color-primary) 6%, transparent)}}@media (prefers-reduced-motion:no-preference){.link-pill{transition:background-color .12s,border-color .12s}}.link-pill:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{background:color-mix(in oklab, var(--color-primary) 12%, transparent)}}.link-pill:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-pill:hover{border-color:color-mix(in oklab, var(--color-primary) 55%, transparent)}}.msg-reactions{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.reaction-badge{border:1px solid var(--color-neutral);background:var(--color-base-content);border-radius:999px;align-items:center;gap:.2rem;padding:.1rem .45rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.reaction-badge{background:color-mix(in oklab, var(--color-base-content) 4%, transparent)}}.reaction-badge{cursor:default;font-size:12px;line-height:1.4}.reaction-emoji{font-size:13px}.reaction-count{color:var(--color-base-content);font-size:11px}@supports (color:color-mix(in lab, red, red)){.reaction-count{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.screen-col{width:100%;max-width:780px;margin-inline:auto}.notice-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;padding:.95rem 1rem;display:block}.lightbox-close{color:#fff}.lightbox-caption{color:#fffc}.eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.eyebrow{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.screen-h1{letter-spacing:-.02em;color:var(--color-base-content);font-size:21px;font-weight:700;line-height:1.15}@media (min-width:1024px){.screen-h1{font-size:24px}}.screen-sub{color:var(--color-base-content);margin-top:.25rem;font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.screen-sub{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.home-hero-title{letter-spacing:-.025em;color:var(--color-base-content);font-size:38px;font-weight:700;line-height:1.05}.home-hero-tagline{color:var(--color-base-content);margin-top:.6rem;font-size:15px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.home-hero-tagline{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-strip{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;grid-template-columns:repeat(3,minmax(0,1fr));display:grid;overflow:hidden}.stat-cell{padding:1rem 1.1rem}.stat-cell+.stat-cell{border-left:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-left:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}.stat-cell-label{letter-spacing:.08em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.stat-cell-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.stat-cell-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.4rem;font-size:28px;font-weight:700;line-height:1.1}.stat-cell-value-sm{font-size:14.5px;font-weight:600}@media (max-width:640px){.stat-strip{grid-template-columns:1fr}.stat-cell+.stat-cell{border-left:0;border-top:1px solid var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.stat-cell+.stat-cell{border-top:1px solid color-mix(in oklab, var(--color-neutral) 70%, transparent)}}}.link-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.75rem;align-items:flex-start;gap:.75rem;padding:.95rem 1rem;display:flex}@media (prefers-reduced-motion:no-preference){.link-card{transition:background-color .12s,border-color .12s}}.link-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{background:color-mix(in oklab, var(--color-primary) 6%, var(--color-base-200))}}.link-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.link-card-icon{width:34px;height:34px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.link-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.link-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.link-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.link-card-icon{font-size:16px}.link-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.link-card-sub{color:var(--color-base-content);margin-top:.15rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.link-card-sub{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.search-field{border:1px solid var(--color-neutral);background:var(--color-base-200);height:48px;color:var(--color-base-content);border-radius:.75rem;align-items:center;gap:.6rem;padding:0 .9rem;display:flex}.search-field:focus-within{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.search-field:focus-within{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.search-field .search-glyph{color:var(--color-base-content);flex-shrink:0;font-size:18px}@supports (color:color-mix(in lab, red, red)){.search-field .search-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.search-field input{min-width:0;color:var(--color-base-content);background:0 0;border:0;outline:none;flex:1;font-size:16px}.search-field input::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.search-field input::placeholder{color:color-mix(in oklab, var(--color-base-content) 38%, transparent)}}.filter-row{flex-wrap:wrap;align-items:flex-end;gap:.6rem;display:flex}.filter-control{flex-direction:column;gap:.2rem;display:flex}.filter-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.filter-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.filter-input{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;padding:0 .55rem;font-size:13px}.filter-input:focus{border-color:var(--color-primary);outline:none}@supports (color:color-mix(in lab, red, red)){.filter-input:focus{border-color:color-mix(in oklab, var(--color-primary) 55%, var(--color-neutral))}}.toggle-chip{border:1px solid var(--color-neutral);background:var(--color-base-100);height:34px;color:var(--color-base-content);border-radius:.5rem;align-items:center;gap:.35rem;padding:0 .7rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.toggle-chip{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.toggle-chip{cursor:pointer;-webkit-user-select:none;user-select:none;font-size:13px}@media (prefers-reduced-motion:no-preference){.toggle-chip{transition:background-color .12s,color .12s,border-color .12s}}.toggle-chip:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, var(--color-neutral))}}.toggle-chip input{appearance:none;border:1px solid;border-radius:3px;flex-shrink:0;width:13px;height:13px;position:relative}.toggle-chip input:checked{background:currentColor}.toggle-chip:has(input:checked){color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.toggle-chip:has(input:checked){background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.toggle-chip:has(input:checked){background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.btn-search{background:var(--color-primary);height:34px;color:var(--color-primary-content);cursor:pointer;border:0;border-radius:.5rem;padding:0 1.1rem;font-size:13px;font-weight:600}@media (prefers-reduced-motion:no-preference){.btn-search{transition:filter .12s}}.btn-search:hover{filter:brightness(1.08)}.results-meta{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.results-meta{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.results-empty{color:var(--color-base-content);font-size:13.5px}@supports (color:color-mix(in lab, red, red)){.results-empty{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.result-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.8rem .9rem;display:block}@media (prefers-reduced-motion:no-preference){.result-card{transition:background-color .12s,border-color .12s}}.result-card:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{background:color-mix(in oklab, var(--color-primary) 5%, var(--color-base-200))}}.result-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.result-card-top{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.result-card-top{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.result-head{flex-wrap:wrap;align-items:center;gap:.4rem .5rem;display:flex}.result-conv{color:var(--color-base-content);font-size:13px;font-weight:600}.result-sender{color:var(--color-base-content);font-size:12.5px}@supports (color:color-mix(in lab, red, red)){.result-sender{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.result-ts{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);font-size:11.5px}@supports (color:color-mix(in lab, red, red)){.result-ts{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.result-spacer{flex:1}.result-glyph{color:var(--color-base-content);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.result-glyph{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.avatar-mono.avatar-sm{border-radius:6px;width:26px;height:26px;font-size:10px}.result-snippet{color:var(--color-base-content);margin-top:.4rem;font-size:13.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.result-snippet{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.result-snippet{word-break:break-word}.result-snippet mark,.search-mark mark{color:#f0d28a;background:#e8b84b47;border-radius:3px;padding:0 .12rem}[data-theme=slate-light] .result-snippet mark,[data-theme=slate-light] .search-mark mark{color:var(--color-warning)}.media-tabs{border-bottom:1px solid var(--color-neutral);align-items:center;gap:.25rem;display:flex}.media-tab{color:var(--color-base-content);border-bottom:2px solid #0000;align-items:center;gap:.4rem;margin-bottom:-1px;padding:.5rem .75rem;font-size:13.5px;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.media-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@media (prefers-reduced-motion:no-preference){.media-tab{transition:color .12s,border-color .12s}}.media-tab:hover{color:var(--color-base-content)}.media-tab-active,.media-tab-active:hover{color:var(--color-base-content);border-bottom-color:var(--color-primary)}.media-tab-badge{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.media-tab-badge{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.media-tab-active .media-tab-badge{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-tab-active .media-tab-badge{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.media-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem;display:grid}@media (min-width:640px){.media-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.media-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.media-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.media-tile{aspect-ratio:1;border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:9px;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.media-tile{transition:opacity .12s}}.media-tile:hover{opacity:.88}.media-tile img{object-fit:cover;width:100%;height:100%}.media-tile-scrim{pointer-events:none;background:linear-gradient(#0000,#000000b8);padding:1.4rem .5rem .4rem;position:absolute;inset:auto 0 0}.media-tile-name{font-family:var(--font-mono);color:#ffffffd9;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.25;display:block;overflow:hidden}.media-tile-placeholder{text-align:center;color:var(--color-base-content);flex-direction:column;justify-content:center;align-items:center;gap:.3rem;padding:.5rem;display:flex}@supports (color:color-mix(in lab, red, red)){.media-tile-placeholder{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#1a1f26 0 9px,#161a20 9px 18px)}[data-theme=slate-light] .media-tile-placeholder{background-image:repeating-linear-gradient(135deg,#e2e8f1 0 9px,#eef2f8 9px 18px)}.media-tile-placeholder .ph-name{font-family:var(--font-mono);word-break:break-all;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:10px;line-height:1.2;display:-webkit-box;overflow:hidden}.media-tile-placeholder .ph-tag{border:1px solid var(--color-neutral);border-radius:5px;padding:0 .35rem;font-size:9.5px}.media-list{flex-direction:column;gap:.5rem;display:flex}.media-list-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.625rem;padding:.7rem .85rem}@media (prefers-reduced-motion:no-preference){.media-list-card{transition:border-color .12s}}.media-list-card:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.media-list-card:hover{border-color:color-mix(in oklab, var(--color-primary) 35%, var(--color-neutral))}}.media-file-name{color:var(--color-base-content);align-items:center;gap:.4rem;font-size:13.5px;font-weight:500;display:inline-flex}.media-file-name:hover{color:var(--color-primary)}.media-card-meta{color:var(--color-base-content);margin-top:.25rem;font-size:12px}@supports (color:color-mix(in lab, red, red)){.media-card-meta{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.media-card-meta a{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.media-card-meta a{color:color-mix(in oklab, var(--color-base-content) 62%, transparent)}}.media-card-meta a:hover{color:var(--color-primary)}.media-link-url{color:var(--color-primary);word-break:break-all;font-size:13px;display:block}.media-link-url:hover{text-decoration:underline}.link-group-head{align-items:center;gap:.5rem;margin-bottom:.4rem;display:flex}.link-group-domain{color:var(--color-base-content);font-size:13.5px;font-weight:600}.link-group-count{font-family:var(--font-mono);font-variant-numeric:tabular-nums;border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:5px;padding:0 .35rem;font-size:11px}@supports (color:color-mix(in lab, red, red)){.link-group-count{color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.settings-subnav{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.6rem;align-items:center;gap:2px;padding:2px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-subnav{background:color-mix(in oklab, var(--color-base-200) 60%, transparent)}}.settings-tab{height:26px;color:var(--color-base-content);border-radius:.45rem;align-items:center;padding:0 .7rem;font-size:12.5px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.settings-tab{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.settings-tab{white-space:nowrap;text-decoration:none}.settings-tab:hover{color:var(--color-base-content)}.settings-tab:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.settings-tab-active{background:var(--color-base-100);color:var(--color-base-content);border:1px solid var(--color-neutral)}.status-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;padding:1.1rem 1.2rem}.status-card-title{color:var(--color-base-content);margin-bottom:.85rem;font-size:14px;font-weight:600}.status-note{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.status-note{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.status-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem 1.1rem;display:grid}@media (min-width:640px){.status-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.status-metric-label{letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-metric-label{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-metric-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content);margin-top:.2rem;font-size:14px}.status-table{border-collapse:collapse;width:100%;font-size:13px}.status-table th{text-align:left;letter-spacing:.06em;text-transform:uppercase;color:var(--color-base-content);padding:.45rem .6rem;font-size:10.5px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.status-table th{color:color-mix(in oklab, var(--color-base-content) 42%, transparent)}}.status-table th{border-bottom:1px solid var(--color-neutral)}.status-table td{border-bottom:1px solid var(--color-neutral);padding:.5rem .6rem}@supports (color:color-mix(in lab, red, red)){.status-table td{border-bottom:1px solid color-mix(in oklab, var(--color-neutral) 55%, transparent)}}.status-table td{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.status-table td{color:color-mix(in oklab, var(--color-base-content) 80%, transparent)}}.status-table tr:last-child td{border-bottom:0}.status-table .mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}.tier-pill{border:1px solid #0000;border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;display:inline-flex}.tier-pill.tier-daily{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-daily{border-color:color-mix(in oklab, var(--color-info) 35%, transparent)}}.tier-pill.tier-monthly{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{color:color-mix(in oklab, var(--color-success) 80%, white)}}.tier-pill.tier-monthly{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-monthly{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}[data-theme=slate-light] .tier-pill.tier-monthly{color:var(--color-success)}.tier-pill.tier-quarterly,.tier-pill.tier-yearly{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-quarterly,.tier-pill.tier-yearly{border-color:color-mix(in oklab, var(--color-warning) 35%, transparent)}}.tier-pill.tier-never{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.tier-pill.tier-never{border-color:color-mix(in oklab, var(--color-error) 35%, transparent)}}.copy-block{border:1px solid var(--color-neutral);background:var(--color-base-100);border-radius:.5rem;position:relative}.copy-pre{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem 3rem .65rem .85rem;font-size:12.5px;line-height:1.6;overflow-x:auto}@supports (color:color-mix(in lab, red, red)){.copy-pre{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.copy-btn{border:1px solid var(--color-neutral);background:var(--color-base-200);width:1.9rem;height:1.9rem;color:var(--color-base-content);border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:.4rem;right:.4rem}@supports (color:color-mix(in lab, red, red)){.copy-btn{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.copy-btn{cursor:pointer}@media (prefers-reduced-motion:no-preference){.copy-btn{transition:background-color .12s,color .12s}}.copy-btn:hover{background:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.copy-btn:hover{background:color-mix(in oklab, var(--color-primary) 10%, var(--color-base-200))}}.copy-btn:hover{color:var(--color-base-content)}.copy-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.copy-btn .icon-check,.copy-btn.copied .icon-copy{display:none}.copy-btn.copied .icon-check{color:var(--color-success);display:inline-flex}.qr-panel{flex-wrap:wrap;align-items:flex-start;gap:1.1rem;display:flex}.qr-img{border:1px solid var(--color-neutral);image-rendering:pixelated;border-radius:.5rem;flex-shrink:0}.qr-panel-text{flex:16rem}.setup-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;margin:0;padding:0;list-style:none;display:grid}@media (max-width:640px){.setup-cards{grid-template-columns:minmax(0,1fr)}}.setup-card{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.875rem;align-items:flex-start;gap:.85rem;padding:1rem 1.1rem;display:flex}.setup-card-not-detected,.setup-card-coming-soon{opacity:.72}.setup-card-icon{width:38px;height:38px;color:var(--color-primary);background:var(--color-primary);border-radius:.5rem;flex-shrink:0;justify-content:center;align-items:center;font-size:18px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{background:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.setup-card-icon{border:1px solid var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon{border:1px solid color-mix(in oklab, var(--color-primary) 25%, transparent)}}.setup-card-icon.src-signal{color:var(--color-info);background:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.setup-card-icon.src-signal{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-signal{border-color:color-mix(in oklab, var(--color-info) 25%, transparent)}}.setup-card-icon.src-imessage{color:var(--color-success);background:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{background:color-mix(in oklab, var(--color-success) 10%, transparent)}}.setup-card-icon.src-imessage{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-imessage{border-color:color-mix(in oklab, var(--color-success) 25%, transparent)}}.setup-card-icon.src-whatsapp{color:var(--color-whatsapp);background:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{background:color-mix(in oklab, var(--color-whatsapp) 10%, transparent)}}.setup-card-icon.src-whatsapp{border-color:var(--color-whatsapp)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-whatsapp{border-color:color-mix(in oklab, var(--color-whatsapp) 25%, transparent)}}.setup-card-icon.src-telegram{color:var(--color-info);background:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-telegram{background:color-mix(in oklab, var(--color-info) 10%, transparent)}}.setup-card-icon.src-telegram{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-card-icon.src-telegram{border-color:color-mix(in oklab, var(--color-info) 25%, transparent)}}.setup-card-body{flex:1}.setup-card-head{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.setup-card-title{color:var(--color-base-content);font-size:14px;font-weight:600}.setup-card-detail{color:var(--color-base-content);margin-top:.25rem;font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-card-detail{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-card-actions{flex-wrap:wrap;align-items:center;gap:.5rem .75rem;margin-top:.7rem;display:flex}.setup-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-badge-enabled{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{color:color-mix(in oklab, var(--color-success) 80%, white)}}.setup-badge-enabled{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-badge-enabled{border-color:color-mix(in oklab, var(--color-success) 35%, transparent)}}[data-theme=slate-light] .setup-badge-enabled{color:var(--color-success)}.setup-badge-ready{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.setup-badge-ready{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.setup-badge-needs-permission{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.setup-badge-needs-permission{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.setup-badge-not-detected{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-badge-not-detected{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-badge-not-detected{border-color:var(--color-neutral)}.setup-badge-coming-soon{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-badge-coming-soon{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-badge-coming-soon{border-color:var(--color-neutral)}.setup-badge-synced{color:var(--color-info);border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.setup-badge-synced{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.sync-badge{border:1px solid var(--color-neutral);white-space:nowrap;color:var(--color-base-content);border-radius:6px;align-items:center;padding:1px .5rem;font-size:11px;font-weight:600;line-height:1.4;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.sync-badge{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.sync-badge-ok{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.sync-badge-ok{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.sync-badge-warn{color:var(--color-warning);border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.sync-badge-warn{border-color:color-mix(in oklab, var(--color-warning) 45%, var(--color-neutral))}}.sync-badge-err{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.sync-badge-err{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.sync-badge-info{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.sync-badge-info{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.setup-btn{border:1px solid var(--color-primary);background:var(--color-primary);height:32px;color:var(--color-primary-content);cursor:pointer;border-radius:.5rem;padding:0 .95rem;font-size:12.5px;font-weight:600}@media (prefers-reduced-motion:no-preference){.setup-btn{transition:filter .12s}}.setup-btn:hover:not(:disabled){filter:brightness(1.08)}.setup-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-btn:disabled{cursor:not-allowed;opacity:.55;color:var(--color-base-content);background:0 0}@supports (color:color-mix(in lab, red, red)){.setup-btn:disabled{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.setup-btn:disabled{border-color:var(--color-neutral)}.setup-note{color:var(--color-base-content);align-items:center;gap:.3rem;font-size:12px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-note{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-note-ok{color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.setup-note-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-note-ok{color:var(--color-success)}.setup-note-warn{color:var(--color-warning)}.setup-footnote{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-footnote{color:color-mix(in oklab, var(--color-base-content) 48%, transparent)}}.setup-progress{margin-top:.55rem}.setup-progress:empty{display:none}.setup-progress-state{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;display:flex}.setup-progress-line{color:var(--color-base-content);font-size:12.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.setup-progress-line{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.setup-progress-line{margin:0}.setup-progress-ok{color:var(--color-success);align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-progress-ok{color:color-mix(in oklab, var(--color-success) 80%, white)}}[data-theme=slate-light] .setup-progress-ok{color:var(--color-success)}.setup-progress-err{color:var(--color-error)}.setup-progress-warn{color:var(--color-warning)}.setup-progress-unavailable{color:var(--color-base-content);font-size:12px}@supports (color:color-mix(in lab, red, red)){.setup-progress-unavailable{color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.setup-progress-spin{border:2px solid var(--color-primary);border-radius:50%;width:14px;height:14px}@supports (color:color-mix(in lab, red, red)){.setup-progress-spin{border:2px solid color-mix(in oklab, var(--color-primary) 30%, transparent)}}.setup-progress-spin{border-top-color:var(--color-primary);flex:none}@media (prefers-reduced-motion:no-preference){.setup-progress-spin{animation:.7s linear infinite setup-progress-spin}}@keyframes setup-progress-spin{to{transform:rotate(360deg)}}.setup-btn-ghost{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0;align-items:center;gap:.3rem;display:inline-flex}.setup-btn-ghost:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-btn-ghost:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-btn-danger{border-color:var(--color-error);background:var(--color-error);color:var(--color-error-content,#fff)}.setup-btn-danger:focus-visible{outline-color:var(--color-error)}.setup-iconbtn{border:1px solid var(--color-neutral);width:26px;height:26px;color:var(--color-base-content);background:0 0;border-radius:.45rem;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn{color:color-mix(in oklab, var(--color-base-content) 72%, transparent)}}.setup-iconbtn{cursor:pointer;flex:none}.setup-iconbtn:hover:not(:disabled){background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-iconbtn:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-iconbtn:hover:not(:disabled){color:var(--color-base-content)}.setup-iconbtn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-iconbtn:disabled{cursor:not-allowed;opacity:.45}.setup-guide{z-index:60;justify-content:center;align-items:center;padding:1.25rem;display:flex;position:fixed;inset:0}.setup-guide[hidden]{display:none}.setup-guide-backdrop{background:var(--color-base-300);position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){.setup-guide-backdrop{background:color-mix(in oklab, var(--color-base-300) 78%, black)}}.setup-guide-backdrop{opacity:.7}.setup-guide-panel{border:1px solid var(--color-neutral);background:var(--color-base-200);border-radius:.9rem;width:min(30rem,100%);max-height:calc(100vh - 2.5rem);padding:1.15rem 1.25rem 1.25rem;position:relative;overflow-y:auto;box-shadow:0 18px 48px -12px oklab(0% none none/.55)}.setup-guide-head{justify-content:space-between;align-items:flex-start;gap:.75rem;display:flex}.setup-guide-title{color:var(--color-base-content);margin:0;font-size:15px;font-weight:600}.setup-guide-close{width:30px;height:30px;color:var(--color-base-content);background:0 0;border:1px solid #0000;border-radius:.5rem;flex:none;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.setup-guide-close{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.setup-guide-close{cursor:pointer}.setup-guide-close:hover{background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-close:hover{background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-close:hover{color:var(--color-base-content)}.setup-guide-close:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.setup-guide-summary{color:var(--color-base-content);margin-top:.5rem;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.setup-guide-summary{color:color-mix(in oklab, var(--color-base-content) 68%, transparent)}}.setup-guide-steps{color:var(--color-base-content);flex-direction:column;gap:.4rem;margin:.85rem 0 0;padding-left:1.25rem;font-size:12.5px;line-height:1.5;list-style:decimal;display:flex}.setup-guide-actions{flex-wrap:wrap;align-items:center;gap:.5rem .65rem;margin-top:1.1rem;display:flex}.setup-guide-settings{align-items:center;gap:.35rem;text-decoration:none;display:inline-flex}.setup-guide-recheck{color:var(--color-base-content);border-color:var(--color-neutral);background:0 0}.setup-guide-recheck:hover:not(:disabled){filter:none;background:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.setup-guide-recheck:hover:not(:disabled){background:color-mix(in oklab, var(--color-base-content) 8%, transparent)}}.setup-guide-result{color:var(--color-warning);margin:.7rem 0 0;font-size:12px;line-height:1.5}.setup-guide-result:empty{display:none}.log-entry-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.log-entry-title{color:var(--color-base-content);font-size:15px;font-weight:600}.log-badge{border:1px solid var(--color-neutral);color:var(--color-base-content);border-radius:.4rem;padding:.1rem .5rem;font-size:11px;font-weight:600}@supports (color:color-mix(in lab, red, red)){.log-badge{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.log-badge{white-space:nowrap}.log-badge-failed{color:var(--color-error);border-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.log-badge-failed{border-color:color-mix(in oklab, var(--color-error) 45%, var(--color-neutral))}}.log-badge-done{color:var(--color-success);border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.log-badge-done{border-color:color-mix(in oklab, var(--color-success) 45%, var(--color-neutral))}}.log-badge-active{color:var(--color-primary);border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.log-badge-active{border-color:color-mix(in oklab, var(--color-primary) 45%, var(--color-neutral))}}.log-status-line{color:var(--color-base-content);margin:.55rem 0 0;font-size:13px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.log-status-line{color:color-mix(in oklab, var(--color-base-content) 82%, transparent)}}.log-meta{gap:.4rem;margin-top:.7rem;display:grid}.log-meta-row{grid-template-columns:7.5rem 1fr;gap:.5rem;font-size:12.5px;line-height:1.5;display:grid}.log-meta-label{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-label{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.log-meta-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.log-meta-value{color:color-mix(in oklab, var(--color-base-content) 88%, transparent)}}.log-meta-value{overflow-wrap:anywhere}.log-output{max-height:16rem;font-family:var(--font-mono);white-space:pre;color:var(--color-base-content);margin:0;padding:.65rem .85rem;font-size:12px;line-height:1.55;overflow:auto}@supports (color:color-mix(in lab, red, red)){.log-output{color:color-mix(in oklab, var(--color-base-content) 85%, transparent)}}.log-empty{color:var(--color-base-content);font-size:13px}@supports (color:color-mix(in lab, red, red)){.log-empty{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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:"<percentage>";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:"<percentage>";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:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";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} \ No newline at end of file From e2dfe44a497577ea49b8f87ebd1c24e5e9001700 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Sat, 11 Jul 2026 08:00:00 +0000 Subject: [PATCH 3/3] Docs: align SECURITY.md/README/config docs with the Settings-tab API key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review follow-up: the threat-model docs still claimed the LLM API key is env-only and never expected in a file, which this PR's Settings → LLM persistence made false. State the real posture: env always wins at startup, the Settings tab persists to the 0600 config file, and that file must never be committed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YWWaS4f9mr6Yp43S4GXHE7 --- README.md | 2 +- SECURITY.md | 6 ++++-- internal/config/config.go | 7 ++++--- node_modules | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) create mode 120000 node_modules diff --git a/README.md b/README.md index e94706f..f93297c 100644 --- a/README.md +++ b/README.md @@ -366,7 +366,7 @@ flags. See [`config.example.yaml`](config.example.yaml) and the | `data_dir` | `MSGBROWSE_DATA_DIR` | `./data` | writable DB/embeddings dir | | `listen_addr` | `MSGBROWSE_LISTEN_ADDR` | `127.0.0.1:8787` | loopback by default | | `llm.base_url` | `MSGBROWSE_LLM_BASE_URL` | `http://127.0.0.1:4000/v1` | the only internet egress | -| `llm.api_key` | `MSGBROWSE_LLM_API_KEY` | — | env/secret only; never commit | +| `llm.api_key` | `MSGBROWSE_LLM_API_KEY` | — | env wins; settable in Settings → LLM (0600 config file); never commit | | `llm.chat_model` | `MSGBROWSE_LLM_CHAT_MODEL` | `local-chat` | RAG + digests | | `llm.embed_model` | `MSGBROWSE_LLM_EMBED_MODEL` | `local-embed` | embeddings | | `vector_backend` | `MSGBROWSE_VECTOR_BACKEND` | `sqlite-vec` | brute-force today (ADR-0002) | diff --git a/SECURITY.md b/SECURITY.md index 9911f32..a820a94 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -48,8 +48,10 @@ sends raw media off-device. The default local route keeps it on the machine. **never** sent to any LLM, for any feature. - Keep the default local LiteLLM route. Routing to a hosted provider must be a deliberate edit to `litellm.config.yaml` and is documented as off-device. -- The API key is read from `MSGBROWSE_LLM_API_KEY` (env/secret) only and is never - baked into the image or expected in a committed file. +- The API key is never baked into the image. It comes from `MSGBROWSE_LLM_API_KEY` + (env/secret, which always wins at startup) or from the Settings → LLM tab, which + persists it to the local `0600` config file. That file lives outside version + control — never commit it. ## Archive integrity diff --git a/internal/config/config.go b/internal/config/config.go index e094b08..6557730 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -2,9 +2,10 @@ // that loads it from (in increasing order of precedence) built-in defaults, a // YAML config file, MSGBROWSE_* environment variables, and command-line flags. // -// Secrets (notably the LLM API key) are never read from the config file in a way -// that would encourage committing them; prefer the MSGBROWSE_LLM_API_KEY -// environment variable. See SECURITY.md for the egress and secret-handling model. +// Secrets (notably the LLM API key) may be persisted to the 0600 config file by +// the Settings → LLM tab (SaveLLM); the MSGBROWSE_LLM_API_KEY environment +// variable always takes precedence at startup. The config file must never be +// committed. See SECURITY.md for the egress and secret-handling model. package config import ( diff --git a/node_modules b/node_modules new file mode 120000 index 0000000..d1d4fa9 --- /dev/null +++ b/node_modules @@ -0,0 +1 @@ +/tmp/claude-0/-home-user-msgbrowse/d0967623-e874-5d81-9c5a-ef60246daa9c/scratchpad/twcli/node_modules \ No newline at end of file